ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWIzNTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC0wLDAgKzEsMzYwIEBACisjCisjIE11bHRpbWVkaWEgVmlkZW8gZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiVmlkZW8gRm9yIExpbnV4IgorCWRlcGVuZHMgb24gVklERU9fREVWCisKK2NvbW1lbnQgIlZpZGVvIEFkYXB0ZXJzIgorCitjb25maWcgVklERU9fQlQ4NDgKKwl0cmlzdGF0ZSAiQlQ4NDggVmlkZW8gRm9yIExpbnV4IgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIFBDSSAmJiBJMkMKKwlzZWxlY3QgSTJDX0FMR09CSVQKKwlzZWxlY3QgRldfTE9BREVSCisJc2VsZWN0IFZJREVPX0JUQ1gKKwlzZWxlY3QgVklERU9fQlVGCisJc2VsZWN0IFZJREVPX0lSCisJc2VsZWN0IFZJREVPX1RVTkVSCisJc2VsZWN0IFZJREVPX1RWRUVQUk9NCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgQlQ4NDggYmFzZWQgZnJhbWUgZ3JhYmJlci9vdmVybGF5IGJvYXJkcy4gVGhpcyBpbmNsdWRlcworCSAgdGhlIE1pcm8sIEhhdXBwYXVnZSBhbmQgU1RCIGJvYXJkcy4gUGxlYXNlIHJlYWQgdGhlIG1hdGVyaWFsIGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCSAgSWYgeW91IHNheSBZIG9yIE0gaGVyZSwgeW91IG5lZWQgdG8gc2F5IFkgb3IgTSB0byAiSTJDIHN1cHBvcnQiIGFuZAorCSAgIkkyQyBiaXQtYmFuZ2luZyBpbnRlcmZhY2VzIiBpbiB0aGUgZGV2aWNlIGRyaXZlcnMgc2VjdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYnR0di4KKworY29uZmlnIFZJREVPX1BNUworCXRyaXN0YXRlICJNZWRpYXZpc2lvbiBQcm8gTW92aWUgU3R1ZGlvIFZpZGVvIEZvciBMaW51eCIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJU0EKKwloZWxwCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBzdWNoIGEgdGhpbmcuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBtcy4KKworY29uZmlnIFZJREVPX1BMQU5CCisJdHJpc3RhdGUgIlBsYW5CIFZpZGVvLUluIG9uIFBvd2VyTWFjIgorCWRlcGVuZHMgb24gUFBDX1BNQUMgJiYgVklERU9fREVWICYmIEJST0tFTgorCWhlbHAKKwkgIFBsYW5CIGlzIHRoZSBWNEwgZHJpdmVyIGZvciB0aGUgUG93ZXJNYWMgN3gwMC84eDAwIHNlcmllcyB2aWRlbworCSAgaW5wdXQgaGFyZHdhcmUuIElmIHlvdSB3YW50IHRvIGV4cGVyaW1lbnQgd2l0aCB0aGlzLCBzYXkgWS4KKwkgIE90aGVyd2lzZSwgb3IgaWYgeW91IGRvbid0IHVuZGVyc3RhbmQgYSB3b3JkLCBzYXkgTi4gU2VlCisJICA8aHR0cDovL3d3dy5jcHUubHUvfm1sYW4vbGludXgvZGV2L3BsYW5iLmh0bWw+IGZvciBtb3JlIGluZm8uCisKKwkgIFNheWluZyBNIHdpbGwgY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSAocGxhbmIpLgorCitjb25maWcgVklERU9fQldRQ0FNCisJdHJpc3RhdGUgIlF1aWNrY2FtIEJXIFZpZGVvIEZvciBMaW51eCIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBQQVJQT1JUCisJaGVscAorCSAgU2F5IFkgaGF2ZSBpZiB5b3UgdGhlIGJsYWNrIGFuZCB3aGl0ZSB2ZXJzaW9uIG9mIHRoZSBRdWlja0NhbQorCSAgY2FtZXJhLiBTZWUgdGhlIG5leHQgb3B0aW9uIGZvciB0aGUgY29sb3IgdmVyc2lvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYnctcWNhbS4KKworY29uZmlnIFZJREVPX0NRQ0FNCisJdHJpc3RhdGUgIlF1aWNrQ2FtIENvbG91ciBWaWRlbyBGb3IgTGludXggKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgVklERU9fREVWICYmIFBBUlBPUlQKKwloZWxwCisJICBUaGlzIGlzIHRoZSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIHRoZSBjb2xvdXIgdmVyc2lvbiBvZiB0aGUKKwkgIENvbm5lY3RpeCBRdWlja0NhbS4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBjYW1lcmFzLCBzYXkgWSBoZXJlLAorCSAgb3RoZXJ3aXNlIHNheSBOLiAgVGhpcyBkcml2ZXIgZG9lcyBub3Qgd29yayB3aXRoIHRoZSBvcmlnaW5hbAorCSAgbW9ub2Nocm9tZSBRdWlja0NhbSwgUXVpY2tDYW0gVkMgb3IgUXVpY2tDbGlwLiAgSXQgaXMgYWxzbyBhdmFpbGFibGUKKwkgIGFzIGEgbW9kdWxlIChjLXFjYW0pLgorCSAgUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NRY2FtLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK2NvbmZpZyBWSURFT19XOTk2NgorCXRyaXN0YXRlICJXOTk2NkNGIFdlYmNhbSAoRmx5Q2FtIFN1cHJhIGFuZCBvdGhlcnMpIFZpZGVvIEZvciBMaW51eCIKKwlkZXBlbmRzIG9uIFBBUlBPUlRfMTI4NCAmJiBWSURFT19ERVYgJiYgUEFSUE9SVAorCWhlbHAKKwkgIFZpZGVvNGxpbnV4IGRyaXZlciBmb3IgV2luYm9uZCdzIHc5OTY2IGJhc2VkIFdlYmNhbXMuCisJICBDdXJyZW50bHkgdGVzdGVkIHdpdGggdGhlIExpZmVWaWV3IEZseUNhbSBTdXByYS4KKwkgIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBjYW1lcmFzLCBzYXkgWSBoZXJlCisJICBvdGhlcndpc2Ugc2F5IE4uCisJICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAodzk5NjYpLgorCisJICBDaGVjayBvdXQgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC93OTk2Ni50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworY29uZmlnIFZJREVPX0NQSUEKKwl0cmlzdGF0ZSAiQ1BpQSBWaWRlbyBGb3IgTGludXgiCisJZGVwZW5kcyBvbiBWSURFT19ERVYKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIGNhbWVyYXMgYmFzZWQgb24gVmlzaW9uJ3MgQ1BpQQorCSAgKENvbG91ciBQcm9jZXNzb3IgSW50ZXJmYWNlIEFTSUMpLCBzdWNoIGFzIHRoZSBDcmVhdGl2ZSBMYWJzIFZpZGVvCisJICBCbGFzdGVyIFdlYmNhbSBJSS4gSWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIGNhbWVyYXMsIHNheSBZIGhlcmUKKwkgIGFuZCBzZWxlY3QgcGFyYWxsZWwgcG9ydCBhbmQvb3IgVVNCIGxvd2xldmVsIHN1cHBvcnQgYmVsb3csCisJICBvdGhlcndpc2Ugc2F5IE4uIFRoaXMgd2lsbCBub3Qgd29yayB3aXRoIHRoZSBDcmVhdGl2ZSBXZWJjYW0gSUlJLgorCisJICBQbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1JFQURNRS5jcGlhPiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlIChjcGlhKS4KKworY29uZmlnIFZJREVPX0NQSUFfUFAKKwl0cmlzdGF0ZSAiQ1BpQSBQYXJhbGxlbCBQb3J0IExvd2xldmVsIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQVJQT1JUXzEyODQgJiYgVklERU9fQ1BJQSAmJiBQQVJQT1JUCisJaGVscAorCSAgVGhpcyBpcyB0aGUgbG93bGV2ZWwgcGFyYWxsZWwgcG9ydCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uCisJICBWaXNpb24ncyBDUGlBIChDb2xvdXIgUHJvY2Vzc29yIEludGVyZmFjZSBBU0lDKSwgc3VjaCBhcyB0aGUKKwkgIENyZWF0aXZlIFdlYmNhbSBJSS4gSWYgeW91IGhhdmUgdGhlIHBhcmFsbGVsIHBvcnQgdmVyc2lvbiBvZiBvbmUKKwkgIG9mIHRoZXNlIGNhbWVyYXMsIHNheSBZIGhlcmUsIG90aGVyd2lzZSBzYXkgTi4gSXQgaXMgYWxzbyBhdmFpbGFibGUKKwkgIGFzIGEgbW9kdWxlIChjcGlhX3BwKS4KKworY29uZmlnIFZJREVPX0NQSUFfVVNCCisJdHJpc3RhdGUgIkNQaUEgVVNCIExvd2xldmVsIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSURFT19DUElBICYmIFVTQgorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGxvd2xldmVsIFVTQiBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIFZpc2lvbidzIENQaUEKKwkgIChDb2xvdXIgUHJvY2Vzc29yIEludGVyZmFjZSBBU0lDKSwgc3VjaCBhcyB0aGUgQ3JlYXRpdmUgV2ViY2FtIElJLgorCSAgSWYgeW91IGhhdmUgdGhlIFVTQiB2ZXJzaW9uIG9mIG9uZSBvZiB0aGVzZSBjYW1lcmFzLCBzYXkgWSBoZXJlLAorCSAgb3RoZXJ3aXNlIHNheSBOLiBUaGlzIHdpbGwgbm90IHdvcmsgd2l0aCB0aGUgQ3JlYXRpdmUgV2ViY2FtIElJSS4KKwkgIEl0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlIChjcGlhX3VzYikuCisKK2NvbmZpZyBWSURFT19TQUE1MjQ2QQorCXRyaXN0YXRlICJTQUE1MjQ2QSwgU0FBNTI4MSBUZWxldGV4dCBwcm9jZXNzb3IiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgSTJDCisJaGVscAorCSAgU3VwcG9ydCBmb3IgSTJDIGJ1cyBiYXNlZCB0ZWxldGV4dCB1c2luZyB0aGUgU0FBNTI0NkEgb3IgU0FBNTI4MQorCSAgY2hpcC4gVXNlZnVsIG9ubHkgaWYgeW91IGxpdmUgaW4gRXVyb3BlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYWE1MjQ2YS4KKworY29uZmlnIFZJREVPX1NBQTUyNDkKKwl0cmlzdGF0ZSAiU0FBNTI0OSBUZWxldGV4dCBwcm9jZXNzb3IiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgSTJDCisJaGVscAorCSAgU3VwcG9ydCBmb3IgSTJDIGJ1cyBiYXNlZCB0ZWxldGV4dCB1c2luZyB0aGUgU0FBNTI0OSBjaGlwLiBBdCB0aGUKKwkgIG1vbWVudCB0aGlzIGlzIG9ubHkgdXNlZnVsIG9uIHNvbWUgRXVyb3BlYW4gV2luVFYgY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhYTUyNDkuCisKK2NvbmZpZyBUVU5FUl8zMDM2CisJdHJpc3RhdGUgIlNBQjMwMzYgdHVuZXIiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgSTJDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIFBoaWxpcHMgU0FCMzAzNiBjb21wYXRpYmxlIHR1bmVycy4KKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFZJREVPX1ZJTk8KKwl0cmlzdGF0ZSAiU0dJIFZpbm8gVmlkZW8gRm9yIExpbnV4IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIEkyQyAmJiBTR0lfSVAyMiAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX0FMR09fU0dJCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBidWlsZCBpbiBzdXBwb3J0IGZvciB0aGUgVmlubyB2aWRlbyBpbnB1dCBzeXN0ZW0gZm91bmQKKwkgIG9uIFNHSSBJbmR5IG1hY2hpbmVzLgorCitjb25maWcgVklERU9fU1RSQURJUworCXRyaXN0YXRlICJTdHJhZGlzIDQ6MjoyIE1QRUctMiB2aWRlbyBkcml2ZXIgIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFZJREVPX0RFViAmJiBQQ0kKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgU3RyYWRpcyA0OjI6MiBNUEVHLTIgdmlkZW8KKwkgIGRyaXZlciBmb3IgUENJLiAgVGhlcmUgaXMgYSBwcm9kdWN0IHBhZ2UgYXQKKwkgIDxodHRwOi8vd3d3LnN0cmFkaXMuY29tL2RlY29kZXIuaHRtbD4uCisKK2NvbmZpZyBWSURFT19aT1JBTgorCXRyaXN0YXRlICJab3JhbiBaUjM2MDU3LzM2MDY3IFZpZGVvIEZvciBMaW51eCIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBQQ0kgJiYgSTJDX0FMR09CSVQKKwloZWxwCisJICBTYXkgWSBmb3Igc3VwcG9ydCBmb3IgTUpQRUcgY2FwdHVyZSBjYXJkcyBiYXNlZCBvbiB0aGUgWm9yYW4KKwkgIDM2MDU3LzM2MDY3IFBDSSBjb250cm9sbGVyIGNoaXBzZXQuIFRoaXMgaW5jbHVkZXMgdGhlIElvbWVnYQorCSAgQnV6LCBQaW5uYWNsZSBEQzEwKyBhbmQgdGhlIExpbnV4IE1lZGlhIExhYnMgTE1MMzMuIFRoZXJlIGlzCisJICBhIGRyaXZlciBob21lcGFnZSBhdCA8aHR0cDovL21qcGVnLnNmLm5ldC9kcml2ZXItem9yYW4vPi4gRm9yCisJICBtb3JlIGluZm9ybWF0aW9uLCBjaGVjayA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1pvcmFuPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgenIzNjA2Ny4KKyAKK2NvbmZpZyBWSURFT19aT1JBTl9CVVoKKwl0cmlzdGF0ZSAiSW9tZWdhIEJ1eiBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fWk9SQU4KKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgSW9tZWdhIEJ1eiBNSlBFRyBjYXB0dXJlL3BsYXliYWNrIGNhcmQuCisKK2NvbmZpZyBWSURFT19aT1JBTl9EQzEwCisJdHJpc3RhdGUgIlBpbm5hY2xlL01pcm8gREMxMCgrKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fWk9SQU4KKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgUGlubmFjbGUvTWlybyBEQzEwKCspIE1KUEVHIGNhcHR1cmUvcGxheWJhY2sKKwkgIGNhcmQuCisKK2NvbmZpZyBWSURFT19aT1JBTl9EQzMwCisJdHJpc3RhdGUgIlBpbm5hY2xlL01pcm8gREMzMCgrKSBzdXBwb3J0IgorIAlkZXBlbmRzIG9uIFZJREVPX1pPUkFOCisgCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBQaW5uYWNsZS9NaXJvIERDMzAoKykgTUpQRUcgY2FwdHVyZS9wbGF5YmFjaworCSAgY2FyZC4gVGhpcyBhbHNvIHN1cHBvcnRzIHJlYWxseSBvbGQgREMxMCBjYXJkcyBiYXNlZCBvbiB0aGUKKwkgIHpyMzYwNTAgTUpQRUcgY29kZWMgYW5kIHpyMzYwMTYgVkZFLgorCitjb25maWcgVklERU9fWk9SQU5fTE1MMzMKKwl0cmlzdGF0ZSAiTGludXggTWVkaWEgTGFicyBMTUwzMyBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fWk9SQU4KKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgTGludXggTWVkaWEgTGFicyBMTUwzMyBNSlBFRyBjYXB0dXJlL3BsYXliYWNrCisJICBjYXJkLgorCitjb25maWcgVklERU9fWk9SQU5fTE1MMzNSMTAKKwl0cmlzdGF0ZSAiTGludXggTWVkaWEgTGFicyBMTUwzM1IxMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fWk9SQU4KKwloZWxwCisJICBzdXBwb3J0IGZvciB0aGUgTGludXggTWVkaWEgTGFicyBMTUwzM1IxMCBNSlBFRyBjYXB0dXJlL3BsYXliYWNrCisJICBjYXJkLgorCitjb25maWcgVklERU9fWlIzNjEyMAorCXRyaXN0YXRlICJab3JhbiBaUjM2MTIwLzM2MTI1IFZpZGVvIEZvciBMaW51eCIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBQQ0kgJiYgSTJDICYmIEJST0tFTgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFpSMzYxMjAvWlIzNjEyNSBiYXNlZCBmcmFtZSBncmFiYmVyL292ZXJsYXkgYm9hcmRzLgorCSAgVGhpcyBpbmNsdWRlcyB0aGUgVmljdG9yIElJLCBXYXZlV2F0Y2hlciwgVmlkZW8gV29uZGVyLCBNYXhpLVRWLAorCSAgYW5kIEJ1c3RlciBib2FyZHMuIFBsZWFzZSByZWFkIHRoZSBtYXRlcmlhbCBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC96cjM2MTIwLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHpyMzYxMjAuCisKK2NvbmZpZyBWSURFT19NRVlFCisJdHJpc3RhdGUgIlNvbnkgVmFpbyBQaWN0dXJlYm9vayBNb3Rpb24gRXllIFZpZGVvIEZvciBMaW51eCIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBQQ0kgJiYgU09OWVBJCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgdmlkZW80bGludXggZHJpdmVyIGZvciB0aGUgTW90aW9uIEV5ZSBjYW1lcmEgZm91bmQKKwkgIGluIHRoZSBWYWlvIFBpY3R1cmVib29rIGxhcHRvcHMuIFBsZWFzZSByZWFkIHRoZSBtYXRlcmlhbCBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9tZXllLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwkgIElmIHlvdSBzYXkgWSBvciBNIGhlcmUsIHlvdSBuZWVkIHRvIHNheSBZIG9yIE0gdG8gIlNvbnkgUHJvZ3JhbW1hYmxlCisJICBJL08gQ29udHJvbCBEZXZpY2UiIGluIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIHNlY3Rpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1leWUuCisKK2NvbmZpZyBWSURFT19TQUE3MTM0CisJdHJpc3RhdGUgIlBoaWxpcHMgU0FBNzEzNCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIFBDSSAmJiBJMkMKKwlzZWxlY3QgVklERU9fQlVGCisJc2VsZWN0IFZJREVPX0lSCisJc2VsZWN0IFZJREVPX1RVTkVSCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIHZpZGVvNGxpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyBTQUE3MTMwLzcxMzQgYmFzZWQKKwkgIFRWIGNhcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYWE3MTM0LgorCitjb25maWcgVklERU9fU0FBNzEzNF9EVkIKKwl0cmlzdGF0ZSAiRFZCIFN1cHBvcnQgZm9yIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMiCisJZGVwZW5kcyBvbiBWSURFT19TQUE3MTM0ICYmIERWQl9DT1JFCisJc2VsZWN0IFZJREVPX0JVRl9EVkIKKwlzZWxlY3QgRFZCX01UMzUyCisJLS0taGVscC0tLQorCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIERWQiBjYXJkcyBiYXNlZCBvbiB0aGUKKwkgIFBoaWxpcHMgc2FhNzEzNCBjaGlwLgorCitjb25maWcgVklERU9fTVhCCisJdHJpc3RhdGUgIlNpZW1lbnMtTml4ZG9yZiAnTXVsdGltZWRpYSBlWHRlbnNpb24gQm9hcmQnIgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIFBDSQorCXNlbGVjdCBWSURFT19TQUE3MTQ2X1ZWCisJc2VsZWN0IFZJREVPX1RVTkVSCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIHZpZGVvNGxpbnV4IGRyaXZlciBmb3IgdGhlICdNdWx0aW1lZGlhIGVYdGVuc2lvbiBCb2FyZCcKKwkgIFRWIGNhcmQgYnkgU2llbWVucy1OaXhkb3JmLgorCSAgCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBteGIuCisKK2NvbmZpZyBWSURFT19EUEMKKwl0cmlzdGF0ZSAiUGhpbGlwcy1TZW1pY29uZHVjdG9ycyAnZHBjNzE0NiBkZW1vbnN0cmF0aW9uIGJvYXJkJyIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBQQ0kKKwlzZWxlY3QgVklERU9fU0FBNzE0Nl9WVgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIHRoZSAnZHBjNzE0NiBkZW1vbnN0cmF0aW9uCisJICBib2FyZCcgYnkgUGhpbGlwcy1TZW1pY29uZHVjdG9ycy4gSXQncyB0aGUgcmVmZXJlbmNlIGRlc2lnbgorCSAgZm9yIFNBQTcxNDYgYmFzZXMgYm9hcmRzLCBzbyBpZiB5b3UgaGF2ZSBzb21lIHVuc3VwcG9ydGVkCisJICBzYWE3MTQ2IGJhc2VkLCBhbmFsb2cgdmlkZW8gY2FyZCwgY2hhbmNlcyBhcmUgZ29vZCB0aGF0IGl0CisJICB3aWxsIHdvcmsgd2l0aCB0aGlzIHNrZWxldG9uIGRyaXZlci4KKwkgIAorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHBjNzE0Ni4KKworY29uZmlnIFZJREVPX0hFWElVTV9PUklPTgorCXRyaXN0YXRlICJIZXhpdW0gSFYtUENJNiBhbmQgT3Jpb24gZnJhbWUgZ3JhYmJlciIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBQQ0kKKwlzZWxlY3QgVklERU9fU0FBNzE0Nl9WVgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIHRoZSBIZXhpdW0gSFYtUENJNiBhbmQKKwkgIE9yaW9uIGZyYW1lIGdyYWJiZXIgY2FyZHMgYnkgSGV4aXVtLgorCSAgCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBoZXhpdW1fb3Jpb24uCisKK2NvbmZpZyBWSURFT19IRVhJVU1fR0VNSU5JCisJdHJpc3RhdGUgIkhleGl1bSBHZW1pbmkgZnJhbWUgZ3JhYmJlciIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBQQ0kKKwlzZWxlY3QgVklERU9fU0FBNzE0Nl9WVgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIHRoZSBIZXhpdW0gR2VtaW5pIGZyYW1lCisJICBncmFiYmVyIGNhcmQgYnkgSGV4aXVtLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBHZW1pbmkgRHVhbAorCSAgY2FyZCBpcyAqbm90KiBmdWxseSBzdXBwb3J0ZWQuCisJICAKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGhleGl1bV9nZW1pbmkuCisKK2NvbmZpZyBWSURFT19DWDg4CisJdHJpc3RhdGUgIkNvbmV4YW50IDIzODh4IChidDg3OCBzdWNjZXNzb3IpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgUENJICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX0FMR09CSVQKKwlzZWxlY3QgRldfTE9BREVSCisJc2VsZWN0IFZJREVPX0JUQ1gKKwlzZWxlY3QgVklERU9fQlVGCisJc2VsZWN0IFZJREVPX1RVTkVSCisJc2VsZWN0IFZJREVPX1RWRUVQUk9NCisJc2VsZWN0IFZJREVPX0lSCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIHZpZGVvNGxpbnV4IGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQKKwkgIFRWIGNhcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjeDg4MDAKKworY29uZmlnIFZJREVPX0NYODhfRFZCCisJdHJpc3RhdGUgIkRWQiBTdXBwb3J0IGZvciBjeDIzODh4IGJhc2VkIFRWIGNhcmRzIgorCWRlcGVuZHMgb24gVklERU9fQ1g4OCAmJiBEVkJfQ09SRQorCXNlbGVjdCBWSURFT19CVUZfRFZCCisJc2VsZWN0IERWQl9NVDM1MgorCXNlbGVjdCBEVkJfT1I1MTEzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBEVkIvQVRTQyBjYXJkcyBiYXNlZCBvbiB0aGUKKwkgIENvbm5leGFudCAyMzg4eCBjaGlwLgorCitjb25maWcgVklERU9fT1ZDQU1DSElQCisJdHJpc3RhdGUgIk9tbmlWaXNpb24gQ2FtZXJhIENoaXAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJMkMKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgT21uaVZpc2lvbiBPVjZ4eHggYW5kIE9WN3h4eCBzZXJpZXMgb2YgY2FtZXJhIGNoaXBzLgorCSAgVGhpcyBkcml2ZXIgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHRoZSBvdjUxMSBhbmQgdzk5NjhjZiBVU0IKKwkgIGNhbWVyYSBkcml2ZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvdmNhbWNoaXAKKworY29uZmlnIFZJREVPX00zMlJfQVIKKwl0cmlzdGF0ZSAiQVIgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIE0zMlIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgdmlkZW80bGludXggZHJpdmVyIGZvciB0aGUgUmVuZXNhcyBBUiAoQXJ0aWZpY2lhbCBSZXRpbmEpCisJICBjYW1lcmEgbW9kdWxlLgorCitjb25maWcgVklERU9fTTMyUl9BUl9NNjQyNzgKKwl0cmlzdGF0ZSAiVXNlIENvbG91ciBBUiBtb2R1bGUgTTY0Mjc4KFZHQSkiCisJZGVwZW5kcyBvbiBWSURFT19NMzJSX0FSCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byB1c2UgdGhlIFJlbmVzYXMgTTY0Mjc4RS04MDAgY2FtZXJhIG1vZHVsZSwKKwkgIHdoaWNoIHN1cHBvcnRzIFZHQSg2NDB4NDgwIHBpeGNlbHMpIHNpemUgb2YgaW1hZ2VzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGM5MDZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQpAQCAtMCwwICsxLDU2IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgdmlkZW8gY2FwdHVyZS9wbGF5YmFjayBkZXZpY2UgZHJpdmVycy4KKyMKKworYnR0di1vYmpzCTo9CWJ0dHYtZHJpdmVyLm8gYnR0di1jYXJkcy5vIGJ0dHYtaWYubyBcCisJCQlidHR2LXJpc2MubyBidHR2LXZiaS5vIGJ0dHYtaTJjLm8gYnR0di1ncGlvLm8KK3pvcmFuLW9ianMgICAgICA6PQl6cjM2MTIwLm8genIzNjEyMF9pMmMubyB6cjM2MTIwX21lbS5vCit6cjM2MDY3LW9ianMJOj0Jem9yYW5fcHJvY2ZzLm8gem9yYW5fZGV2aWNlLm8gXAorCQkJem9yYW5fZHJpdmVyLm8gem9yYW5fY2FyZC5vCit0dW5lci1vYmpzCTo9CXR1bmVyLWNvcmUubyB0dW5lci1zaW1wbGUubyBtdDIweHgubyB0ZGE4MjkwLm8KKworb2JqLSQoQ09ORklHX1ZJREVPX0RFVikgKz0gdmlkZW9kZXYubyB2NGwyLWNvbW1vbi5vIHY0bDEtY29tcGF0Lm8KKworb2JqLSQoQ09ORklHX1ZJREVPX0JUODQ4KSArPSBidHR2Lm8gbXNwMzQwMC5vIHR2YXVkaW8ubyBcCisJdGRhNzQzMi5vIHRkYTk4NzUubyBpci1rYmQtaTJjLm8gaXIta2JkLWdwaW8ubworb2JqLSQoQ09ORklHX1NPVU5EX1RWTUlYRVIpICs9IHR2bWl4ZXIubworCitvYmotJChDT05GSUdfVklERU9fWlIzNjEyMCkgKz0gem9yYW4ubworb2JqLSQoQ09ORklHX1ZJREVPX1NBQTUyNDZBKSArPSBzYWE1MjQ2YS5vCitvYmotJChDT05GSUdfVklERU9fU0FBNTI0OSkgKz0gc2FhNTI0OS5vCitvYmotJChDT05GSUdfVklERU9fQ1FDQU0pICs9IGMtcWNhbS5vCitvYmotJChDT05GSUdfVklERU9fQldRQ0FNKSArPSBidy1xY2FtLm8KK29iai0kKENPTkZJR19WSURFT19XOTk2NikgKz0gdzk5NjYubworb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOX0JVWikgKz0gc2FhNzExMS5vIHNhYTcxODUubyB6cjM2MDYwLm8KK29iai0kKENPTkZJR19WSURFT19aT1JBTl9EQzEwKSArPSBzYWE3MTEwLm8gYWR2NzE3NS5vIHpyMzYwNjAubworb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOX0RDMzApICs9IGFkdjcxNzUubyB2cHgzMjIwLm8genIzNjA1MC5vIFwKKwl6cjM2MDE2Lm8KK29iai0kKENPTkZJR19WSURFT19aT1JBTl9MTUwzMykgKz0gYnQ4MTkubyBidDg1Ni5vIHpyMzYwNjAubworb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOX0xNTDMzUjEwKSArPSBzYWE3MTE0Lm8gYWR2NzE3MC5vIHpyMzYwNjAubworb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOKSArPSB6cjM2MDY3Lm8gdmlkZW9jb2RlYy5vCitvYmotJChDT05GSUdfVklERU9fUE1TKSArPSBwbXMubworb2JqLSQoQ09ORklHX1ZJREVPX1BMQU5CKSArPSBwbGFuYi5vCitvYmotJChDT05GSUdfVklERU9fVklOTykgKz0gdmluby5vCitvYmotJChDT05GSUdfVklERU9fU1RSQURJUykgKz0gc3RyYWRpcy5vCitvYmotJChDT05GSUdfVklERU9fQ1BJQSkgKz0gY3BpYS5vCitvYmotJChDT05GSUdfVklERU9fQ1BJQV9QUCkgKz0gY3BpYV9wcC5vCitvYmotJChDT05GSUdfVklERU9fQ1BJQV9VU0IpICs9IGNwaWFfdXNiLm8KK29iai0kKENPTkZJR19WSURFT19NRVlFKSArPSBtZXllLm8KK29iai0kKENPTkZJR19WSURFT19TQUE3MTM0KSArPSBzYWE3MTM0Lworb2JqLSQoQ09ORklHX1ZJREVPX0NYODgpICs9IGN4ODgvCitvYmotJChDT05GSUdfVklERU9fT1ZDQU1DSElQKSArPSBvdmNhbWNoaXAvCitvYmotJChDT05GSUdfVklERU9fTVhCKSArPSBzYWE3MTExLm8gdHVuZXIubyB0ZGE5ODQwLm8gdGVhNjQxNWMubyB0ZWE2NDIwLm8gbXhiLm8KK29iai0kKENPTkZJR19WSURFT19IRVhJVU1fT1JJT04pICs9IGhleGl1bV9vcmlvbi5vCitvYmotJChDT05GSUdfVklERU9fSEVYSVVNX0dFTUlOSSkgKz0gaGV4aXVtX2dlbWluaS5vCitvYmotJChDT05GSUdfVklERU9fRFBDKSArPSBzYWE3MTExLm8gZHBjNzE0Ni5vCitvYmotJChDT05GSUdfVFVORVJfMzAzNikgKz0gdHVuZXItMzAzNi5vCisKK29iai0kKENPTkZJR19WSURFT19UVU5FUikgKz0gdHVuZXIubyB0ZGE5ODg3Lm8KK29iai0kKENPTkZJR19WSURFT19CVUYpICAgKz0gdmlkZW8tYnVmLm8KK29iai0kKENPTkZJR19WSURFT19CVUZfRFZCKSArPSB2aWRlby1idWYtZHZiLm8KK29iai0kKENPTkZJR19WSURFT19CVENYKSAgKz0gYnRjeC1yaXNjLm8KK29iai0kKENPTkZJR19WSURFT19UVkVFUFJPTSkgKz0gdHZlZXByb20ubworCitvYmotJChDT05GSUdfVklERU9fTTMyUl9BUl9NNjQyNzgpICs9IGFydi5vCisKK0VYVFJBX0NGTEFHUyArPSAtSSQoc3JjdHJlZSkvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyNTRjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3MC5jCkBAIC0wLDAgKzEsNTM1IEBACisvKiAKKyAqIGFkdjcxNzAgLSBhZHY3MTcwLCBhZHY3MTcxIHZpZGVvIGVuY29kZXIgZHJpdmVyIHZlcnNpb24gMC4wLjEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gWWV2dHl1c2hraW4gPG1heEBsaW51eG1lZGlhbGFicy5jb20+CisgKgorICogQmFzZWQgb24gYWR2NzE3NiBkcml2ZXIgYnk6ICAgIAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZlIFBlcmtzIDxkcGVya3NAaWJtLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBXb2xmZ2FuZyBTY2hlcnIgPHNjaGVyckBuZXQ0eW91Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKyAqICAgIC0gc29tZSBjb3JyZWN0aW9ucyBmb3IgUGlubmFjbGUgU3lzdGVtcyBJbmMuIERDMTBwbHVzIGNhcmQuCisgKgorICogQ2hhbmdlcyBieSBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAtIG1vdmVkIG92ZXIgdG8gbGludXg+PTIuNC54IGkyYyBwcm90b2NvbCAoMS8xLzIwMDMpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRFY3MTcwIHZpZGVvIGVuY29kZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYXhpbSBZZXZ0eXVzaGtpbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWRldi5oPgorCisjZGVmaW5lIEkyQ19OQU1FKHgpICh4KS0+bmFtZQorCisjaW5jbHVkZSA8bGludXgvdmlkZW9fZW5jb2Rlci5oPgorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC0xKSIpOworCisjZGVmaW5lIGRwcmludGsobnVtLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGRlYnVnID49IG51bSkgXAorCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBhZHY3MTcwIHsKKwl1bnNpZ25lZCBjaGFyIHJlZ1sxMjhdOworCisJaW50IG5vcm07CisJaW50IGlucHV0OworCWludCBlbmFibGU7CisJaW50IGJyaWdodDsKKwlpbnQgY29udHJhc3Q7CisJaW50IGh1ZTsKKwlpbnQgc2F0OworfTsKKworI2RlZmluZSAgIEkyQ19BRFY3MTcwICAgICAgICAweGQ0CisjZGVmaW5lICAgSTJDX0FEVjcxNzEgICAgICAgIDB4NTQKKworc3RhdGljIGNoYXIgYWR2NzE3MF9uYW1lW10gPSAiYWR2NzE3MCI7CitzdGF0aWMgY2hhciBhZHY3MTcxX25hbWVbXSA9ICJhZHY3MTcxIjsKKworc3RhdGljIGNoYXIgKmlucHV0c1tdID0geyAicGFzc190aHJvdWdoIiwgInBsYXlfYmFjayIgfTsKK3N0YXRpYyBjaGFyICpub3Jtc1tdID0geyAiUEFMIiwgIk5UU0MiIH07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgaW50CithZHY3MTcwX3dyaXRlIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCSAgICAgICB1OCAgICAgICAgICAgICAgICAgcmVnLAorCSAgICAgICB1OCAgICAgICAgICAgICAgICAgdmFsdWUpCit7CisJc3RydWN0IGFkdjcxNzAgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWVuY29kZXItPnJlZ1tyZWddID0gdmFsdWU7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FkdjcxNzBfcmVhZCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkgICAgICB1OCAgICAgICAgICAgICAgICAgcmVnKQoreworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCitzdGF0aWMgaW50CithZHY3MTcwX3dyaXRlX2Jsb2NrIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgICAgIGNvbnN0IHU4ICAgICAgICAgICpkYXRhLAorCQkgICAgIHVuc2lnbmVkIGludCAgICAgICBsZW4pCit7CisJaW50IHJldCA9IC0xOworCXU4IHJlZzsKKworCS8qIHRoZSBhZHY3MTcwIGhhcyBhbiBhdXRvaW5jcmVtZW50IGZ1bmN0aW9uLCB1c2UgaXQgaWYKKwkgKiB0aGUgYWRhcHRlciB1bmRlcnN0YW5kcyByYXcgSTJDICovCisJaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgeworCQkvKiBkbyByYXcgSTJDLCBub3Qgc21idXMgY29tcGF0aWJsZSAqLworCQlzdHJ1Y3QgYWR2NzE3MCAqZW5jb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCQlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJCXU4IGJsb2NrX2RhdGFbMzJdOworCisJCW1zZy5hZGRyID0gY2xpZW50LT5hZGRyOworCQltc2cuZmxhZ3MgPSAwOworCQl3aGlsZSAobGVuID49IDIpIHsKKwkJCW1zZy5idWYgPSAoY2hhciAqKSBibG9ja19kYXRhOworCQkJbXNnLmxlbiA9IDA7CisJCQlibG9ja19kYXRhW21zZy5sZW4rK10gPSByZWcgPSBkYXRhWzBdOworCQkJZG8geworCQkJCWJsb2NrX2RhdGFbbXNnLmxlbisrXSA9CisJCQkJICAgIGVuY29kZXItPnJlZ1tyZWcrK10gPSBkYXRhWzFdOworCQkJCWxlbiAtPSAyOworCQkJCWRhdGEgKz0gMjsKKwkJCX0gd2hpbGUgKGxlbiA+PSAyICYmIGRhdGFbMF0gPT0gcmVnICYmCisJCQkJIG1zZy5sZW4gPCAzMik7CisJCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsCisJCQkJCQkmbXNnLCAxKSkgPCAwKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZG8gc29tZSBzbG93IEkyQyBlbXVsYXRpb24ga2luZCBvZiB0aGluZyAqLworCQl3aGlsZSAobGVuID49IDIpIHsKKwkJCXJlZyA9ICpkYXRhKys7CisJCQlpZiAoKHJldCA9IGFkdjcxNzBfd3JpdGUoY2xpZW50LCByZWcsCisJCQkJCQkgKmRhdGErKykpIDwgMCkKKwkJCQlicmVhazsKKwkJCWxlbiAtPSAyOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIE91dHB1dCBmaWx0ZXI6ICBTLVZpZGVvICBDb21wb3NpdGUKKworI2RlZmluZSBNUjA1MCAgICAgICAweDExCS8vMHgwOQorI2RlZmluZSBNUjA2MCAgICAgICAweDE0CS8vMHgwYworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFRSME1PREUgICAgIDB4NGMKKyNkZWZpbmUgVFIwUlNUCSAgICAweDgwCisKKyNkZWZpbmUgVFIxQ0FQVAkgICAgMHgwMAorI2RlZmluZSBUUjFQTEFZCSAgICAweDAwCisKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdF9OVFNDW10gPSB7CisJMHgwMCwgMHgxMCwJCS8vIE1SMAorCTB4MDEsIDB4MjAsCQkvLyBNUjEKKwkweDAyLCAweDBlLAkJLy8gTVIyIFJUQyBjb250cm9sOiBiaXRzIDIgYW5kIDEgCisJMHgwMywgMHg4MCwJCS8vIE1SMworCTB4MDQsIDB4MzAsCQkvLyBNUjQKKwkweDA1LCAweDAwLAkJLy8gUmVzZXJ2ZWQKKwkweDA2LCAweDAwLAkJLy8gUmVzZXJ2ZWQKKwkweDA3LCBUUjBNT0RFLAkJLy8gVE0wCisJMHgwOCwgVFIxQ0FQVCwJCS8vIFRNMQorCTB4MDksIDB4MTYsCQkvLyBGc2MwCisJMHgwYSwgMHg3YywJCS8vIEZzYzEKKwkweDBiLCAweGYwLAkJLy8gRnNjMgorCTB4MGMsIDB4MjEsCQkvLyBGc2MzCisJMHgwZCwgMHgwMCwJCS8vIFN1YmNhcnJpZXIgUGhhc2UKKwkweDBlLCAweDAwLAkJLy8gQ2xvc2VkIENhcHQuIEV4dCAwCisJMHgwZiwgMHgwMCwJCS8vIENsb3NlZCBDYXB0LiBFeHQgMQorCTB4MTAsIDB4MDAsCQkvLyBDbG9zZWQgQ2FwdC4gMAorCTB4MTEsIDB4MDAsCQkvLyBDbG9zZWQgQ2FwdC4gMQorCTB4MTIsIDB4MDAsCQkvLyBQZWRlc3RhbCBDdGwgMAorCTB4MTMsIDB4MDAsCQkvLyBQZWRlc3RhbCBDdGwgMQorCTB4MTQsIDB4MDAsCQkvLyBQZWRlc3RhbCBDdGwgMgorCTB4MTUsIDB4MDAsCQkvLyBQZWRlc3RhbCBDdGwgMworCTB4MTYsIDB4MDAsCQkvLyBDR01TX1dTU18wCisJMHgxNywgMHgwMCwJCS8vIENHTVNfV1NTXzEKKwkweDE4LCAweDAwLAkJLy8gQ0dNU19XU1NfMgorCTB4MTksIDB4MDAsCQkvLyBUZWxldGV4dCBDdGwgCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0X1BBTFtdID0geworCTB4MDAsIDB4NzEsCQkvLyBNUjAKKwkweDAxLCAweDIwLAkJLy8gTVIxCisJMHgwMiwgMHgwZSwJCS8vIE1SMiBSVEMgY29udHJvbDogYml0cyAyIGFuZCAxCisJMHgwMywgMHg4MCwJCS8vIE1SMworCTB4MDQsIDB4MzAsCQkvLyBNUjQKKwkweDA1LCAweDAwLAkJLy8gUmVzZXJ2ZWQKKwkweDA2LCAweDAwLAkJLy8gUmVzZXJ2ZWQKKwkweDA3LCBUUjBNT0RFLAkJLy8gVE0wCisJMHgwOCwgVFIxQ0FQVCwJCS8vIFRNMQorCTB4MDksIDB4Y2IsCQkvLyBGc2MwCisJMHgwYSwgMHg4YSwJCS8vIEZzYzEKKwkweDBiLCAweDA5LAkJLy8gRnNjMgorCTB4MGMsIDB4MmEsCQkvLyBGc2MzCisJMHgwZCwgMHgwMCwJCS8vIFN1YmNhcnJpZXIgUGhhc2UKKwkweDBlLCAweDAwLAkJLy8gQ2xvc2VkIENhcHQuIEV4dCAwCisJMHgwZiwgMHgwMCwJCS8vIENsb3NlZCBDYXB0LiBFeHQgMQorCTB4MTAsIDB4MDAsCQkvLyBDbG9zZWQgQ2FwdC4gMAorCTB4MTEsIDB4MDAsCQkvLyBDbG9zZWQgQ2FwdC4gMQorCTB4MTIsIDB4MDAsCQkvLyBQZWRlc3RhbCBDdGwgMAorCTB4MTMsIDB4MDAsCQkvLyBQZWRlc3RhbCBDdGwgMQorCTB4MTQsIDB4MDAsCQkvLyBQZWRlc3RhbCBDdGwgMgorCTB4MTUsIDB4MDAsCQkvLyBQZWRlc3RhbCBDdGwgMworCTB4MTYsIDB4MDAsCQkvLyBDR01TX1dTU18wCisJMHgxNywgMHgwMCwJCS8vIENHTVNfV1NTXzEKKwkweDE4LCAweDAwLAkJLy8gQ0dNU19XU1NfMgorCTB4MTksIDB4MDAsCQkvLyBUZWxldGV4dCBDdGwKK307CisKKworc3RhdGljIGludAorYWR2NzE3MF9jb21tYW5kIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgdW5zaWduZWQgaW50ICAgICAgIGNtZCwKKwkJIHZvaWQgKiAgICAgICAgICAgICBhcmcpCit7CisJc3RydWN0IGFkdjcxNzAgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIDA6CisjaWYgMAorCQkvKiBUaGlzIGlzIGp1c3QgZm9yIHRlc3RpbmchISEgKi8KKwkJYWR2NzE3MF93cml0ZV9ibG9jayhjbGllbnQsIGluaXRfY29tbW9uLAorCQkJCSAgICBzaXplb2YoaW5pdF9jb21tb24pKTsKKwkJYWR2NzE3MF93cml0ZShjbGllbnQsIDB4MDcsIFRSME1PREUgfCBUUjBSU1QpOworCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSk7CisjZW5kaWYKKwkJYnJlYWs7CisKKwljYXNlIEVOQ09ERVJfR0VUX0NBUEFCSUxJVElFUzoKKwl7CisJCXN0cnVjdCB2aWRlb19lbmNvZGVyX2NhcGFiaWxpdHkgKmNhcCA9IGFyZzsKKworCQljYXAtPmZsYWdzID0gVklERU9fRU5DT0RFUl9QQUwgfAorCQkJICAgICBWSURFT19FTkNPREVSX05UU0M7CisJCWNhcC0+aW5wdXRzID0gMjsKKwkJY2FwLT5vdXRwdXRzID0gMTsKKwl9CisJCWJyZWFrOworCisJY2FzZSBFTkNPREVSX1NFVF9OT1JNOgorCXsKKwkJaW50IGlhcmcgPSAqKGludCAqKSBhcmc7CisKKwkJZHByaW50aygxLCBLRVJOX0RFQlVHICIlc19jb21tYW5kOiBzZXQgbm9ybSAlZCIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBpYXJnKTsKKworCQlzd2l0Y2ggKGlhcmcpIHsKKworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCWFkdjcxNzBfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0X05UU0MsCisJCQkJCSAgICBzaXplb2YoaW5pdF9OVFNDKSk7CisJCQlpZiAoZW5jb2Rlci0+aW5wdXQgPT0gMCkKKwkJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwMiwgMHgwZSk7CS8vIEVuYWJsZSBnZW5sb2NrCisJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSB8IFRSMFJTVCk7CisJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSk7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfUEFMOgorCQkJYWR2NzE3MF93cml0ZV9ibG9jayhjbGllbnQsIGluaXRfUEFMLAorCQkJCQkgICAgc2l6ZW9mKGluaXRfUEFMKSk7CisJCQlpZiAoZW5jb2Rlci0+aW5wdXQgPT0gMCkKKwkJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwMiwgMHgwZSk7CS8vIEVuYWJsZSBnZW5sb2NrCisJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSB8IFRSMFJTVCk7CisJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZHByaW50aygxLCBLRVJOX0VSUiAiJXM6IGlsbGVnYWwgbm9ybTogJWRcbiIsCisJCQkgICAgICAgSTJDX05BTUUoY2xpZW50KSwgaWFyZyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9CisJCWRwcmludGsoMSwgS0VSTl9ERUJVRyAiJXM6IHN3aXRjaGVkIHRvICVzXG4iLCBJMkNfTkFNRShjbGllbnQpLAorCQkJbm9ybXNbaWFyZ10pOworCQllbmNvZGVyLT5ub3JtID0gaWFyZzsKKwl9CisJCWJyZWFrOworCisJY2FzZSBFTkNPREVSX1NFVF9JTlBVVDoKKwl7CisJCWludCBpYXJnID0gKihpbnQgKikgYXJnOworCisJCS8qIFJKOiAqaWFyZyA9IDA6IGlucHV0IGlzIGZyb20gZGVjb2RlcgorCQkgKmlhcmcgPSAxOiBpbnB1dCBpcyBmcm9tIFpSMzYwNjAKKwkJICppYXJnID0gMjogY29sb3IgYmFyICovCisKKwkJZHByaW50aygxLCBLRVJOX0RFQlVHICIlc19jb21tYW5kOiBzZXQgaW5wdXQgZnJvbSAlc1xuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksCisJCQlpYXJnID09IDAgPyAiZGVjb2RlciIgOiAiWlIzNjA2MCIpOworCisJCXN3aXRjaCAoaWFyZykgeworCisJCWNhc2UgMDoKKwkJCWFkdjcxNzBfd3JpdGUoY2xpZW50LCAweDAxLCAweDIwKTsKKwkJCWFkdjcxNzBfd3JpdGUoY2xpZW50LCAweDA4LCBUUjFDQVBUKTsJLyogVFIxICovCisJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwMiwgMHgwZSk7CS8vIEVuYWJsZSBnZW5sb2NrCisJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSB8IFRSMFJTVCk7CisJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSk7CisJCQkvL3VkZWxheSgxMCk7CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwMSwgMHgwMCk7CisJCQlhZHY3MTcwX3dyaXRlKGNsaWVudCwgMHgwOCwgVFIxUExBWSk7CS8qIFRSMSAqLworCQkJYWR2NzE3MF93cml0ZShjbGllbnQsIDB4MDIsIDB4MDgpOworCQkJYWR2NzE3MF93cml0ZShjbGllbnQsIDB4MDcsIFRSME1PREUgfCBUUjBSU1QpOworCQkJYWR2NzE3MF93cml0ZShjbGllbnQsIDB4MDcsIFRSME1PREUpOworCQkJLy91ZGVsYXkoMTApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzOiBpbGxlZ2FsIGlucHV0OiAlZFxuIiwKKwkJCQlJMkNfTkFNRShjbGllbnQpLCBpYXJnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCisJCX0KKwkJZHByaW50aygxLCBLRVJOX0RFQlVHICIlczogc3dpdGNoZWQgdG8gJXNcbiIsIEkyQ19OQU1FKGNsaWVudCksCisJCQlpbnB1dHNbaWFyZ10pOworCQllbmNvZGVyLT5pbnB1dCA9IGlhcmc7CisJfQorCQlicmVhazsKKworCWNhc2UgRU5DT0RFUl9TRVRfT1VUUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCS8qIG5vdCBtdWNoIGNob2ljZSBvZiBvdXRwdXRzICovCisJCWlmICgqaWFyZyAhPSAwKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwkJYnJlYWs7CisKKwljYXNlIEVOQ09ERVJfRU5BQkxFX09VVFBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQllbmNvZGVyLT5lbmFibGUgPSAhISppYXJnOworCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEdlbmVyaWMgaTJjIHByb2JlCisgKiBjb25jZXJuaW5nIHRoZSBhZGRyZXNzZXM6IGkyYyB3YW50cyA3IGJpdCAod2l0aG91dCB0aGUgci93IGJpdCksIHNvICc+PjEnCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPQorICAgIHsgSTJDX0FEVjcxNzAgPj4gMSwgKEkyQ19BRFY3MTcwID4+IDEpICsgMSwKKwlJMkNfQURWNzE3MSA+PiAxLCAoSTJDX0FEVjcxNzEgPj4gMSkgKyAxLAorCUkyQ19DTElFTlRfRU5ECit9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb2JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZV9yYW5nZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmVfcmFuZ2VbMl0gPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlWzJdID0geyBJMkNfQ0xJRU5UX0VORCAsIEkyQ19DTElFTlRfRU5EIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKKwkubm9ybWFsX2kyY19yYW5nZQk9IG5vcm1hbF9pMmNfcmFuZ2UsCisJLnByb2JlCQkJPSBwcm9iZSwKKwkucHJvYmVfcmFuZ2UJCT0gcHJvYmVfcmFuZ2UsCisJLmlnbm9yZQkJCT0gaWdub3JlLAorCS5pZ25vcmVfcmFuZ2UJCT0gaWdub3JlX3JhbmdlLAorCS5mb3JjZQkJCT0gZm9yY2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX2FkdjcxNzA7CisKK3N0YXRpYyBpbnQKK2FkdjcxNzBfZGV0ZWN0X2NsaWVudCAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICBhZGRyZXNzLAorCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICBraW5kKQoreworCWludCBpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGFkdjcxNzAgKmVuY29kZXI7CisJY2hhciAqZG5hbWU7CisKKwlkcHJpbnRrKDEsCisJCUtFUk5fSU5GTworCQkiYWR2NzE3MC5jOiBkZXRlY3RpbmcgYWR2NzE3MCBjbGllbnQgb24gYWRkcmVzcyAweCV4XG4iLAorCQlhZGRyZXNzIDw8IDEpOworCisJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcyAqLworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJcmV0dXJuIDA7CisKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmIChjbGllbnQgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGNsaWVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfYWR2NzE3MDsKKwljbGllbnQtPmZsYWdzID0gSTJDX0NMSUVOVF9BTExPV19VU0U7CisJaWYgKChjbGllbnQtPmFkZHIgPT0gSTJDX0FEVjcxNzAgPj4gMSkgfHwKKwkgICAgKGNsaWVudC0+YWRkciA9PSAoSTJDX0FEVjcxNzAgPj4gMSkgKyAxKSkgeworCQlkbmFtZSA9IGFkdjcxNzBfbmFtZTsKKwl9IGVsc2UgaWYgKChjbGllbnQtPmFkZHIgPT0gSTJDX0FEVjcxNzEgPj4gMSkgfHwKKwkJICAgKGNsaWVudC0+YWRkciA9PSAoSTJDX0FEVjcxNzEgPj4gMSkgKyAxKSkgeworCQlkbmFtZSA9IGFkdjcxNzFfbmFtZTsKKwl9IGVsc2UgeworCQkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUhISEgKi8KKwkJa2ZyZWUoY2xpZW50KTsKKwkJcmV0dXJuIDA7CisJfQorCXN0cmxjcHkoSTJDX05BTUUoY2xpZW50KSwgZG5hbWUsIHNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CisKKwllbmNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkdjcxNzApLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW5jb2RlciA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZW5jb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCBhZHY3MTcwKSk7CisJZW5jb2Rlci0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKKwllbmNvZGVyLT5pbnB1dCA9IDA7CisJZW5jb2Rlci0+ZW5hYmxlID0gMTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBlbmNvZGVyKTsKKworCWkgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChpKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCWtmcmVlKGVuY29kZXIpOworCQlyZXR1cm4gaTsKKwl9CisKKwlpID0gYWR2NzE3MF93cml0ZV9ibG9jayhjbGllbnQsIGluaXRfTlRTQywgc2l6ZW9mKGluaXRfTlRTQykpOworCWlmIChpID49IDApIHsKKwkJaSA9IGFkdjcxNzBfd3JpdGUoY2xpZW50LCAweDA3LCBUUjBNT0RFIHwgVFIwUlNUKTsKKwkJaSA9IGFkdjcxNzBfd3JpdGUoY2xpZW50LCAweDA3LCBUUjBNT0RFKTsKKwkJaSA9IGFkdjcxNzBfcmVhZChjbGllbnQsIDB4MTIpOworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXNfYXR0YWNoOiByZXYuICVkIGF0IDB4JTAyeFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIGkgJiAxLCBjbGllbnQtPmFkZHIgPDwgMSk7CisJfQorCWlmIChpIDwgMCkgeworCQlkcHJpbnRrKDEsIEtFUk5fRVJSICIlc19hdHRhY2g6IGluaXQgZXJyb3IgMHgleFxuIiwKKwkJICAgICAgIEkyQ19OQU1FKGNsaWVudCksIGkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithZHY3MTcwX2F0dGFjaF9hZGFwdGVyIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJZHByaW50aygxLAorCQlLRVJOX0lORk8KKwkJImFkdjcxNzAuYzogc3RhcnRpbmcgcHJvYmUgZm9yIGFkYXB0ZXIgJXMgKDB4JXgpXG4iLAorCQlJMkNfTkFNRShhZGFwdGVyKSwgYWRhcHRlci0+aWQpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgJmFkdjcxNzBfZGV0ZWN0X2NsaWVudCk7Cit9CisKK3N0YXRpYyBpbnQKK2FkdjcxNzBfZGV0YWNoX2NsaWVudCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWR2NzE3MCAqZW5jb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBlcnI7CisKKwllcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShlbmNvZGVyKTsKKwlrZnJlZShjbGllbnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX2FkdjcxNzAgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAiYWR2NzE3MCIsCS8qIG5hbWUgKi8KKworCS5pZCA9IEkyQ19EUklWRVJJRF9BRFY3MTcwLAorCS5mbGFncyA9IEkyQ19ERl9OT1RJRlksCisKKwkuYXR0YWNoX2FkYXB0ZXIgPSBhZHY3MTcwX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50ID0gYWR2NzE3MF9kZXRhY2hfY2xpZW50LAorCS5jb21tYW5kID0gYWR2NzE3MF9jb21tYW5kLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2FkdjcxNzBfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmkyY19kcml2ZXJfYWR2NzE3MCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorYWR2NzE3MF9leGl0ICh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZpMmNfZHJpdmVyX2FkdjcxNzApOworfQorCittb2R1bGVfaW5pdChhZHY3MTcwX2luaXQpOworbW9kdWxlX2V4aXQoYWR2NzE3MF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3NS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTc1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkMDk3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3NS5jCkBAIC0wLDAgKzEsNTg1IEBACisvKiAKKyAqICBhZHY3MTc1IC0gYWR2NzE3NWEgdmlkZW8gZW5jb2RlciBkcml2ZXIgdmVyc2lvbiAwLjAuMworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZlIFBlcmtzIDxkcGVya3NAaWJtLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBXb2xmZ2FuZyBTY2hlcnIgPHNjaGVyckBuZXQ0eW91Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKyAqICAgIC0gc29tZSBjb3JyZWN0aW9ucyBmb3IgUGlubmFjbGUgU3lzdGVtcyBJbmMuIERDMTBwbHVzIGNhcmQuCisgKgorICogQ2hhbmdlcyBieSBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAtIG1vdmVkIG92ZXIgdG8gbGludXg+PTIuNC54IGkyYyBwcm90b2NvbCAoOS85LzIwMDIpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRFY3MTc1IHZpZGVvIGVuY29kZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJEYXZlIFBlcmtzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtZGV2Lmg+CisKKyNkZWZpbmUgSTJDX05BTUUocykgKHMpLT5uYW1lCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb19lbmNvZGVyLmg+CisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTEpIik7CisKKyNkZWZpbmUgZHByaW50ayhudW0sIGZvcm1hdCwgYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoZGVidWcgPj0gbnVtKSBcCisJCQlwcmludGsoZm9ybWF0LCAjI2FyZ3MpOyBcCisJfSB3aGlsZSAoMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGFkdjcxNzUgeworCXVuc2lnbmVkIGNoYXIgcmVnWzEyOF07CisKKwlpbnQgbm9ybTsKKwlpbnQgaW5wdXQ7CisJaW50IGVuYWJsZTsKKwlpbnQgYnJpZ2h0OworCWludCBjb250cmFzdDsKKwlpbnQgaHVlOworCWludCBzYXQ7Cit9OworCisjZGVmaW5lICAgSTJDX0FEVjcxNzUgICAgICAgIDB4ZDQKKyNkZWZpbmUgICBJMkNfQURWNzE3NiAgICAgICAgMHg1NAorCitzdGF0aWMgY2hhciBhZHY3MTc1X25hbWVbXSA9ICJhZHY3MTc1IjsKK3N0YXRpYyBjaGFyIGFkdjcxNzZfbmFtZVtdID0gImFkdjcxNzYiOworCitzdGF0aWMgY2hhciAqaW5wdXRzW10gPSB7ICJwYXNzX3Rocm91Z2giLCAicGxheV9iYWNrIiwgImNvbG9yX2JhciIgfTsKK3N0YXRpYyBjaGFyICpub3Jtc1tdID0geyAiUEFMIiwgIk5UU0MiLCAiU0VDQU0tPlBBTCAobWF5IG5vdCB3b3JrISkiIH07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgaW50CithZHY3MTc1X3dyaXRlIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCSAgICAgICB1OCAgICAgICAgICAgICAgICAgcmVnLAorCSAgICAgICB1OCAgICAgICAgICAgICAgICAgdmFsdWUpCit7CisJc3RydWN0IGFkdjcxNzUgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWVuY29kZXItPnJlZ1tyZWddID0gdmFsdWU7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FkdjcxNzVfcmVhZCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkgICAgICB1OCAgICAgICAgICAgICAgICAgcmVnKQoreworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCitzdGF0aWMgaW50CithZHY3MTc1X3dyaXRlX2Jsb2NrIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgICAgIGNvbnN0IHU4ICAgICAgICAgICpkYXRhLAorCQkgICAgIHVuc2lnbmVkIGludCAgICAgICBsZW4pCit7CisJaW50IHJldCA9IC0xOworCXU4IHJlZzsKKworCS8qIHRoZSBhZHY3MTc1IGhhcyBhbiBhdXRvaW5jcmVtZW50IGZ1bmN0aW9uLCB1c2UgaXQgaWYKKwkgKiB0aGUgYWRhcHRlciB1bmRlcnN0YW5kcyByYXcgSTJDICovCisJaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgeworCQkvKiBkbyByYXcgSTJDLCBub3Qgc21idXMgY29tcGF0aWJsZSAqLworCQlzdHJ1Y3QgYWR2NzE3NSAqZW5jb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCQlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJCXU4IGJsb2NrX2RhdGFbMzJdOworCisJCW1zZy5hZGRyID0gY2xpZW50LT5hZGRyOworCQltc2cuZmxhZ3MgPSAwOworCQl3aGlsZSAobGVuID49IDIpIHsKKwkJCW1zZy5idWYgPSAoY2hhciAqKSBibG9ja19kYXRhOworCQkJbXNnLmxlbiA9IDA7CisJCQlibG9ja19kYXRhW21zZy5sZW4rK10gPSByZWcgPSBkYXRhWzBdOworCQkJZG8geworCQkJCWJsb2NrX2RhdGFbbXNnLmxlbisrXSA9CisJCQkJICAgIGVuY29kZXItPnJlZ1tyZWcrK10gPSBkYXRhWzFdOworCQkJCWxlbiAtPSAyOworCQkJCWRhdGEgKz0gMjsKKwkJCX0gd2hpbGUgKGxlbiA+PSAyICYmIGRhdGFbMF0gPT0gcmVnICYmCisJCQkJIG1zZy5sZW4gPCAzMik7CisJCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsCisJCQkJCQkmbXNnLCAxKSkgPCAwKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZG8gc29tZSBzbG93IEkyQyBlbXVsYXRpb24ga2luZCBvZiB0aGluZyAqLworCQl3aGlsZSAobGVuID49IDIpIHsKKwkJCXJlZyA9ICpkYXRhKys7CisJCQlpZiAoKHJldCA9IGFkdjcxNzVfd3JpdGUoY2xpZW50LCByZWcsCisJCQkJCQkgKmRhdGErKykpIDwgMCkKKwkJCQlicmVhazsKKwkJCWxlbiAtPSAyOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3NldF9zdWJjYXJyaWVyX2ZyZXEgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCSAgICAgaW50ICAgICAgICAgICAgICAgIHBhc3NfdGhyb3VnaCkKK3sKKwkvKiBmb3Igc29tZSByZWFzb24gcGFzc190aHJvdWdoIE5UU0MgbmVlZHMKKwkgKiBhIGRpZmZlcmVudCBzdWItY2FycmllciBmcmVxIHRvIHJlbWFpbiBzdGFibGUuICovCisJaWYocGFzc190aHJvdWdoKQorCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwMiwgMHgwMCk7CisJZWxzZQorCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwMiwgMHg1NSk7CisKKwlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwMywgMHg1NSk7CisJYWR2NzE3NV93cml0ZShjbGllbnQsIDB4MDQsIDB4NTUpOworCWFkdjcxNzVfd3JpdGUoY2xpZW50LCAweDA1LCAweDI1KTsKK30KKworI2lmZGVmIEVOQ09ERVJfRFVNUAorc3RhdGljIHZvaWQKK2R1bXAgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkdjcxNzUgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaSwgajsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWdpc3RyeSBkdW1wXG4iLCBJMkNfTkFNRShjbGllbnQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTgyIC8gODsgaSsrKSB7CisJCXByaW50aygiJXM6IDB4JTAyeCAtIiwgSTJDX05BTUUoY2xpZW50KSwgaSAqIDgpOworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQlwcmludGsoIiAweCUwMngiLCBlbmNvZGVyLT5yZWdbaSAqIDggKyBqXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gT3V0cHV0IGZpbHRlcjogIFMtVmlkZW8gIENvbXBvc2l0ZQorCisjZGVmaW5lIE1SMDUwICAgICAgIDB4MTEJLy8weDA5CisjZGVmaW5lIE1SMDYwICAgICAgIDB4MTQJLy8weDBjCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgVFIwTU9ERSAgICAgMHg0NgorI2RlZmluZSBUUjBSU1QJICAgIDB4ODAKKworI2RlZmluZSBUUjFDQVBUCSAgICAweDgwCisjZGVmaW5lIFRSMVBMQVkJICAgIDB4MDAKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdF9jb21tb25bXSA9IHsKKworCTB4MDAsIE1SMDUwLAkJLyogTVIwLCBQQUwgZW5hYmxlZCAqLworCTB4MDEsIDB4MDAsCQkvKiBNUjEgKi8KKwkweDAyLCAweDBjLAkJLyogc3ViYy4gZnJlcS4gKi8KKwkweDAzLCAweDhjLAkJLyogc3ViYy4gZnJlcS4gKi8KKwkweDA0LCAweDc5LAkJLyogc3ViYy4gZnJlcS4gKi8KKwkweDA1LCAweDI2LAkJLyogc3ViYy4gZnJlcS4gKi8KKwkweDA2LCAweDQwLAkJLyogc3ViYy4gcGhhc2UgKi8KKworCTB4MDcsIFRSME1PREUsCQkvKiBUUjAsIDE2Yml0ICovCisJMHgwOCwgMHgyMSwJCS8qICAqLworCTB4MDksIDB4MDAsCQkvKiAgKi8KKwkweDBhLCAweDAwLAkJLyogICovCisJMHgwYiwgMHgwMCwJCS8qICAqLworCTB4MGMsIFRSMUNBUFQsCQkvKiBUUjEgKi8KKwkweDBkLCAweDRmLAkJLyogTVIyICovCisJMHgwZSwgMHgwMCwJCS8qICAqLworCTB4MGYsIDB4MDAsCQkvKiAgKi8KKwkweDEwLCAweDAwLAkJLyogICovCisJMHgxMSwgMHgwMCwJCS8qICAqLworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdF9wYWxbXSA9IHsKKwkweDAwLCBNUjA1MCwJCS8qIE1SMCwgUEFMIGVuYWJsZWQgKi8KKwkweDAxLCAweDAwLAkJLyogTVIxICovCisJMHgwMiwgMHgwYywJCS8qIHN1YmMuIGZyZXEuICovCisJMHgwMywgMHg4YywJCS8qIHN1YmMuIGZyZXEuICovCisJMHgwNCwgMHg3OSwJCS8qIHN1YmMuIGZyZXEuICovCisJMHgwNSwgMHgyNiwJCS8qIHN1YmMuIGZyZXEuICovCisJMHgwNiwgMHg0MCwJCS8qIHN1YmMuIHBoYXNlICovCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0X250c2NbXSA9IHsKKwkweDAwLCBNUjA2MCwJCS8qIE1SMCwgTlRTQyBlbmFibGVkICovCisJMHgwMSwgMHgwMCwJCS8qIE1SMSAqLworCTB4MDIsIDB4NTUsCQkvKiBzdWJjLiBmcmVxLiAqLworCTB4MDMsIDB4NTUsCQkvKiBzdWJjLiBmcmVxLiAqLworCTB4MDQsIDB4NTUsCQkvKiBzdWJjLiBmcmVxLiAqLworCTB4MDUsIDB4MjUsCQkvKiBzdWJjLiBmcmVxLiAqLworCTB4MDYsIDB4MWEsCQkvKiBzdWJjLiBwaGFzZSAqLworfTsKKworc3RhdGljIGludAorYWR2NzE3NV9jb21tYW5kIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgdW5zaWduZWQgaW50ICAgICAgIGNtZCwKKwkJIHZvaWQgICAgICAgICAgICAgICphcmcpCit7CisJc3RydWN0IGFkdjcxNzUgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIDA6CisJCS8qIFRoaXMgaXMganVzdCBmb3IgdGVzdGluZyEhISAqLworCQlhZHY3MTc1X3dyaXRlX2Jsb2NrKGNsaWVudCwgaW5pdF9jb21tb24sCisJCQkJICAgIHNpemVvZihpbml0X2NvbW1vbikpOworCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSB8IFRSMFJTVCk7CisJCWFkdjcxNzVfd3JpdGUoY2xpZW50LCAweDA3LCBUUjBNT0RFKTsKKwkgICAgICAgIGJyZWFrOworCisJY2FzZSBFTkNPREVSX0dFVF9DQVBBQklMSVRJRVM6CisJeworCQlzdHJ1Y3QgdmlkZW9fZW5jb2Rlcl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJY2FwLT5mbGFncyA9IFZJREVPX0VOQ09ERVJfUEFMIHwKKwkJCSAgICAgVklERU9fRU5DT0RFUl9OVFNDIHwKKwkJCSAgICAgVklERU9fRU5DT0RFUl9TRUNBTTsgLyogd2VsbCwgaGFja3kgKi8KKwkJY2FwLT5pbnB1dHMgPSAyOworCQljYXAtPm91dHB1dHMgPSAxOworCX0KKwkJYnJlYWs7CisKKwljYXNlIEVOQ09ERVJfU0VUX05PUk06CisJeworCQlpbnQgaWFyZyA9ICooaW50ICopIGFyZzsKKworCQlzd2l0Y2ggKGlhcmcpIHsKKworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCWFkdjcxNzVfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0X250c2MsCisJCQkJCSAgICBzaXplb2YoaW5pdF9udHNjKSk7CisJCQlpZiAoZW5jb2Rlci0+aW5wdXQgPT0gMCkKKwkJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwZCwgMHg0Zik7CS8vIEVuYWJsZSBnZW5sb2NrCisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSB8IFRSMFJTVCk7CisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSk7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfUEFMOgorCQkJYWR2NzE3NV93cml0ZV9ibG9jayhjbGllbnQsIGluaXRfcGFsLAorCQkJCQkgICAgc2l6ZW9mKGluaXRfcGFsKSk7CisJCQlpZiAoZW5jb2Rlci0+aW5wdXQgPT0gMCkKKwkJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwZCwgMHg0Zik7CS8vIEVuYWJsZSBnZW5sb2NrCisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSB8IFRSMFJTVCk7CisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSk7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfU0VDQU06CS8vIFdBUk5JTkchIEFEVjcxNzYgZG9lcyBub3Qgc3VwcG9ydCBTRUNBTS4KKwkJCS8qIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBjb252ZXJ0CisJCQkgKiBTRUNBTS0+UEFMICh0eXBpY2FsbHkgaXQgZG9lcyBub3Qgd29yaworCQkJICogZHVlIHRvIGdlbmxvY2s6IHdoZW4gZGVjb2RlciBpcyBpbiBTRUNBTQorCQkJICogYW5kIGVuY29kZXIgaW4gaW4gUEFMIHRoZSBzdWJjYXJyaWVyIGNhbgorCQkJICogbm90IGJlIHN5bmNyb25pemVkIHdpdGggaG9yaXpvbnRhbAorCQkJICogcXVlbmN5KSAqLworCQkJYWR2NzE3NV93cml0ZV9ibG9jayhjbGllbnQsIGluaXRfcGFsLAorCQkJCQkgICAgc2l6ZW9mKGluaXRfcGFsKSk7CisJCQlpZiAoZW5jb2Rlci0+aW5wdXQgPT0gMCkKKwkJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwZCwgMHg0OSk7CS8vIERpc2FibGUgZ2VubG9jaworCQkJYWR2NzE3NV93cml0ZShjbGllbnQsIDB4MDcsIFRSME1PREUgfCBUUjBSU1QpOworCQkJYWR2NzE3NV93cml0ZShjbGllbnQsIDB4MDcsIFRSME1PREUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKDEsIEtFUk5fRVJSICIlczogaWxsZWdhbCBub3JtOiAlZFxuIiwKKwkJCQlJMkNfTkFNRShjbGllbnQpLCBpYXJnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCisJCX0KKwkJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiBzd2l0Y2hlZCB0byAlc1xuIiwgSTJDX05BTUUoY2xpZW50KSwKKwkJCW5vcm1zW2lhcmddKTsKKwkJZW5jb2Rlci0+bm9ybSA9IGlhcmc7CisJfQorCQlicmVhazsKKworCWNhc2UgRU5DT0RFUl9TRVRfSU5QVVQ6CisJeworCQlpbnQgaWFyZyA9ICooaW50ICopIGFyZzsKKworCQkvKiBSSjogKmlhcmcgPSAwOiBpbnB1dCBpcyBmcm9tIFNBQTcxMTAKKwkJICppYXJnID0gMTogaW5wdXQgaXMgZnJvbSBaUjM2MDYwCisJCSAqaWFyZyA9IDI6IGNvbG9yIGJhciAqLworCisJCXN3aXRjaCAoaWFyZykgeworCisJCWNhc2UgMDoKKwkJCWFkdjcxNzVfd3JpdGUoY2xpZW50LCAweDAxLCAweDAwKTsKKworCQkJaWYgKGVuY29kZXItPm5vcm0gPT0gVklERU9fTU9ERV9OVFNDKQorCQkJCXNldF9zdWJjYXJyaWVyX2ZyZXEoY2xpZW50LCAxKTsKKworCQkJYWR2NzE3NV93cml0ZShjbGllbnQsIDB4MGMsIFRSMUNBUFQpOwkvKiBUUjEgKi8KKwkJCWlmIChlbmNvZGVyLT5ub3JtID09IFZJREVPX01PREVfU0VDQU0pCisJCQkJYWR2NzE3NV93cml0ZShjbGllbnQsIDB4MGQsIDB4NDkpOwkvLyBEaXNhYmxlIGdlbmxvY2sKKwkJCWVsc2UKKwkJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwZCwgMHg0Zik7CS8vIEVuYWJsZSBnZW5sb2NrCisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSB8IFRSMFJTVCk7CisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSk7CisJCQkvL3VkZWxheSgxMCk7CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwMSwgMHgwMCk7CisKKwkJCWlmIChlbmNvZGVyLT5ub3JtID09IFZJREVPX01PREVfTlRTQykKKwkJCQlzZXRfc3ViY2Fycmllcl9mcmVxKGNsaWVudCwgMCk7CisKKwkJCWFkdjcxNzVfd3JpdGUoY2xpZW50LCAweDBjLCBUUjFQTEFZKTsJLyogVFIxICovCisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwZCwgMHg0OSk7CisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSB8IFRSMFJTVCk7CisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwNywgVFIwTU9ERSk7CisJCQkvL3VkZWxheSgxMCk7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlhZHY3MTc1X3dyaXRlKGNsaWVudCwgMHgwMSwgMHg4MCk7CisKKwkJCWlmIChlbmNvZGVyLT5ub3JtID09IFZJREVPX01PREVfTlRTQykKKwkJCQlzZXRfc3ViY2Fycmllcl9mcmVxKGNsaWVudCwgMCk7CisKKwkJCWFkdjcxNzVfd3JpdGUoY2xpZW50LCAweDBkLCAweDQ5KTsKKwkJCWFkdjcxNzVfd3JpdGUoY2xpZW50LCAweDA3LCBUUjBNT0RFIHwgVFIwUlNUKTsKKwkJCWFkdjcxNzVfd3JpdGUoY2xpZW50LCAweDA3LCBUUjBNT0RFKTsKKwkJCS8vdWRlbGF5KDEwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKDEsIEtFUk5fRVJSICIlczogaWxsZWdhbCBpbnB1dDogJWRcbiIsCisJCQkJSTJDX05BTUUoY2xpZW50KSwgaWFyZyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9CisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogc3dpdGNoZWQgdG8gJXNcbiIsIEkyQ19OQU1FKGNsaWVudCksCisJCQlpbnB1dHNbaWFyZ10pOworCQllbmNvZGVyLT5pbnB1dCA9IGlhcmc7CisJfQorCQlicmVhazsKKworCWNhc2UgRU5DT0RFUl9TRVRfT1VUUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCS8qIG5vdCBtdWNoIGNob2ljZSBvZiBvdXRwdXRzICovCisJCWlmICgqaWFyZyAhPSAwKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwkJYnJlYWs7CisKKwljYXNlIEVOQ09ERVJfRU5BQkxFX09VVFBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQllbmNvZGVyLT5lbmFibGUgPSAhISppYXJnOworCX0KKwkJYnJlYWs7CisKKyNpZmRlZiBFTkNPREVSX0RVTVAKKwljYXNlIEVOQ09ERVJfRFVNUDoKKwl7CisJCWR1bXAoY2xpZW50KTsKKwl9CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEdlbmVyaWMgaTJjIHByb2JlCisgKiBjb25jZXJuaW5nIHRoZSBhZGRyZXNzZXM6IGkyYyB3YW50cyA3IGJpdCAod2l0aG91dCB0aGUgci93IGJpdCksIHNvICc+PjEnCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPQorICAgIHsgSTJDX0FEVjcxNzUgPj4gMSwgKEkyQ19BRFY3MTc1ID4+IDEpICsgMSwKKwlJMkNfQURWNzE3NiA+PiAxLCAoSTJDX0FEVjcxNzYgPj4gMSkgKyAxLAorCUkyQ19DTElFTlRfRU5ECit9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb2JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZV9yYW5nZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmVfcmFuZ2VbMl0gPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlWzJdID0geyBJMkNfQ0xJRU5UX0VORCAsIEkyQ19DTElFTlRfRU5EIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKKwkubm9ybWFsX2kyY19yYW5nZQk9IG5vcm1hbF9pMmNfcmFuZ2UsCisJLnByb2JlCQkJPSBwcm9iZSwKKwkucHJvYmVfcmFuZ2UJCT0gcHJvYmVfcmFuZ2UsCisJLmlnbm9yZQkJCT0gaWdub3JlLAorCS5pZ25vcmVfcmFuZ2UJCT0gaWdub3JlX3JhbmdlLAorCS5mb3JjZQkJCT0gZm9yY2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX2FkdjcxNzU7CisKK3N0YXRpYyBpbnQKK2FkdjcxNzVfZGV0ZWN0X2NsaWVudCAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICBhZGRyZXNzLAorCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICBraW5kKQoreworCWludCBpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGFkdjcxNzUgKmVuY29kZXI7CisJY2hhciAqZG5hbWU7CisKKwlkcHJpbnRrKDEsCisJCUtFUk5fSU5GTworCQkiYWR2NzE3NS5jOiBkZXRlY3RpbmcgYWR2NzE3NSBjbGllbnQgb24gYWRkcmVzcyAweCV4XG4iLAorCQlhZGRyZXNzIDw8IDEpOworCisJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcyAqLworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJcmV0dXJuIDA7CisKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmIChjbGllbnQgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGNsaWVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfYWR2NzE3NTsKKwljbGllbnQtPmZsYWdzID0gSTJDX0NMSUVOVF9BTExPV19VU0U7CisJaWYgKChjbGllbnQtPmFkZHIgPT0gSTJDX0FEVjcxNzUgPj4gMSkgfHwKKwkgICAgKGNsaWVudC0+YWRkciA9PSAoSTJDX0FEVjcxNzUgPj4gMSkgKyAxKSkgeworCQlkbmFtZSA9IGFkdjcxNzVfbmFtZTsKKwl9IGVsc2UgaWYgKChjbGllbnQtPmFkZHIgPT0gSTJDX0FEVjcxNzYgPj4gMSkgfHwKKwkJICAgKGNsaWVudC0+YWRkciA9PSAoSTJDX0FEVjcxNzYgPj4gMSkgKyAxKSkgeworCQlkbmFtZSA9IGFkdjcxNzZfbmFtZTsKKwl9IGVsc2UgeworCQkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUhISEgKi8KKwkJa2ZyZWUoY2xpZW50KTsKKwkJcmV0dXJuIDA7CisJfQorCXN0cmxjcHkoSTJDX05BTUUoY2xpZW50KSwgZG5hbWUsIHNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CisKKwllbmNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkdjcxNzUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW5jb2RlciA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZW5jb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCBhZHY3MTc1KSk7CisJZW5jb2Rlci0+bm9ybSA9IFZJREVPX01PREVfUEFMOworCWVuY29kZXItPmlucHV0ID0gMDsKKwllbmNvZGVyLT5lbmFibGUgPSAxOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGVuY29kZXIpOworCisJaSA9IGkyY19hdHRhY2hfY2xpZW50KGNsaWVudCk7CisJaWYgKGkpIHsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZW5jb2Rlcik7CisJCXJldHVybiBpOworCX0KKworCWkgPSBhZHY3MTc1X3dyaXRlX2Jsb2NrKGNsaWVudCwgaW5pdF9jb21tb24sIHNpemVvZihpbml0X2NvbW1vbikpOworCWlmIChpID49IDApIHsKKwkJaSA9IGFkdjcxNzVfd3JpdGUoY2xpZW50LCAweDA3LCBUUjBNT0RFIHwgVFIwUlNUKTsKKwkJaSA9IGFkdjcxNzVfd3JpdGUoY2xpZW50LCAweDA3LCBUUjBNT0RFKTsKKwkJaSA9IGFkdjcxNzVfcmVhZChjbGllbnQsIDB4MTIpOworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXNfYXR0YWNoOiByZXYuICVkIGF0IDB4JXhcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBpICYgMSwgY2xpZW50LT5hZGRyIDw8IDEpOworCX0KKwlpZiAoaSA8IDApIHsKKwkJZHByaW50aygxLCBLRVJOX0VSUiAiJXNfYXR0YWNoOiBpbml0IGVycm9yIDB4JXhcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWR2NzE3NV9hdHRhY2hfYWRhcHRlciAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWRwcmludGsoMSwKKwkJS0VSTl9JTkZPCisJCSJhZHY3MTc1LmM6IHN0YXJ0aW5nIHByb2JlIGZvciBhZGFwdGVyICVzICgweCV4KVxuIiwKKwkJSTJDX05BTUUoYWRhcHRlciksIGFkYXB0ZXItPmlkKTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsICZhZHY3MTc1X2RldGVjdF9jbGllbnQpOworfQorCitzdGF0aWMgaW50CithZHY3MTc1X2RldGFjaF9jbGllbnQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkdjcxNzUgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoZW5jb2Rlcik7CisJa2ZyZWUoY2xpZW50KTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9hZHY3MTc1ID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gImFkdjcxNzUiLAkvKiBuYW1lICovCisKKwkuaWQgPSBJMkNfRFJJVkVSSURfQURWNzE3NSwKKwkuZmxhZ3MgPSBJMkNfREZfTk9USUZZLAorCisJLmF0dGFjaF9hZGFwdGVyID0gYWR2NzE3NV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCA9IGFkdjcxNzVfZGV0YWNoX2NsaWVudCwKKwkuY29tbWFuZCA9IGFkdjcxNzVfY29tbWFuZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CithZHY3MTc1X2luaXQgKHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX2FkdjcxNzUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2FkdjcxNzVfZXhpdCAodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmaTJjX2RyaXZlcl9hZHY3MTc1KTsKK30KKworbW9kdWxlX2luaXQoYWR2NzE3NV9pbml0KTsKK21vZHVsZV9leGl0KGFkdjcxNzVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZkM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYwpAQCAtMCwwICsxLDkxNiBAQAorLyoKKyAqIENvbG91ciBBUiBNNjQyNzgoVkdBKSBkcml2ZXIgZm9yIFZpZGVvNExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzCVRha2VvIFRha2FoYXNoaSA8dGFrYWhhc2hpLnRha2VvQHJlbmVzYXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogU29tZSBjb2RlIGlzIHRha2VuIGZyb20gQVIgZHJpdmVyIHNhbXBsZSBwcm9ncmFtIGZvciBNM1QtTTMyNzAwVVQuCisgKgorICogQVIgZHJpdmVyIHNhbXBsZSAoTTMyUiBTREspOgorICogICAgIENvcHlyaWdodCAoYykgMjAwMyBSRU5FU0FTIFRFQ0hOT1JPR1kgQ09SUE9SQVRJT04KKyAqICAgICBBTkQgUkVORVNBUyBTT0xVVElPTlMgQ09SUE9SQVRJT04KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIDIwMDMtMDktMDE6CVN1cHBvcnQgdzNjYW0gYnkgVGFrZW8gVGFrYWhhc2hpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKworI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9tMzJyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgcHJpbnRrKGFyZ3MpCisjZGVmaW5lIENIRUNLX0xPU1QJMQorI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNkZWZpbmUgQ0hFQ0tfTE9TVAkwCisjZW5kaWYKKworLyoKKyAqIFVTRV9JTlQgaXMgYWx3YXlzIDAsIGludGVycnVwdCBtb2RlIGlzIG5vdCBhdmFpbGFibGUKKyAqIG9uIGxpbnV4IGR1ZSB0byBsYWNrIG9mIHNwZWVkCisgKi8KKyNkZWZpbmUgVVNFX0lOVAkJMAkvKiBEb24ndCBtb2RpZnkgKi8KKworI2RlZmluZSBWRVJTSU9OCSIwLjAzIgorCisjZGVmaW5lIGFyX2lubChhZGRyKSAJCWlubCgodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIGFyX291dGwodmFsLCBhZGRyKQlvdXRsKCh1bnNpZ25lZCBsb25nKSh2YWwpLCh1bnNpZ25lZCBsb25nKShhZGRyKSkKKworZXh0ZXJuIHN0cnVjdCBjcHVpbmZvX20zMnIJYm9vdF9jcHVfZGF0YTsKKworLyoKKyAqIENDRCBwaXhlbCBzaXplCisgKglOb3RlIHRoYXQgTTMyNzAwVVQgZG9lcyBub3Qgc3VwcG9ydCBDSUYgbW9kZSwgYnV0IFFWR0EgaXMKKyAqCXN1cHBvcnRlZCBieSBNMzI3MDBVVCBoYXJkd2FyZSB1c2luZyBWR0EgbW9kZSBvZiBBUiBMU0kuCisgKgorICogCVN1cHBvcnRlZDogVkdBICAoTm9ybWFsIG1vZGUsIEludGVybGFjZSBtb2RlKQorICoJCSAgIFFWR0EgKEFsd2F5cyBJbnRlcmxhY2UgbW9kZSBvZiBWR0EpCisgKgorICovCisjZGVmaW5lIEFSX1dJRFRIX1ZHQQkJNjQwCisjZGVmaW5lIEFSX0hFSUdIVF9WR0EJCTQ4MAorI2RlZmluZSBBUl9XSURUSF9RVkdBCQkzMjAKKyNkZWZpbmUgQVJfSEVJR0hUX1FWR0EJCTI0MAorI2RlZmluZSBNSU5fQVJfV0lEVEgJCUFSX1dJRFRIX1FWR0EKKyNkZWZpbmUgTUlOX0FSX0hFSUdIVAkJQVJfSEVJR0hUX1FWR0EKKyNkZWZpbmUgTUFYX0FSX1dJRFRICQlBUl9XSURUSF9WR0EKKyNkZWZpbmUgTUFYX0FSX0hFSUdIVAkJQVJfSEVJR0hUX1ZHQQorCisvKiBiaXRzICYgYnl0ZXMgcGVyIHBpeGVsICovCisjZGVmaW5lIEFSX0JJVFNfUEVSX1BJWEVMCTE2CisjZGVmaW5lIEFSX0JZVEVTX1BFUl9QSVhFTAkoQVJfQklUU19QRVJfUElYRUwvOCkKKworLyogbGluZSBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBBUl9MSU5FX0JZVEVTX1ZHQQkoQVJfV0lEVEhfVkdBICogQVJfQllURVNfUEVSX1BJWEVMKQorI2RlZmluZSBBUl9MSU5FX0JZVEVTX1FWR0EJKEFSX1dJRFRIX1FWR0EgKiBBUl9CWVRFU19QRVJfUElYRUwpCisjZGVmaW5lIE1BWF9BUl9MSU5FX0JZVEVTCUFSX0xJTkVfQllURVNfVkdBCisKKy8qIGZyYW1lIHNpemUgJiB0eXBlICovCisjZGVmaW5lIEFSX0ZSQU1FX0JZVEVTX1ZHQSBcCisJKEFSX1dJRFRIX1ZHQSAqIEFSX0hFSUdIVF9WR0EgKiBBUl9CWVRFU19QRVJfUElYRUwpCisjZGVmaW5lIEFSX0ZSQU1FX0JZVEVTX1FWR0EgXAorCShBUl9XSURUSF9RVkdBICogQVJfSEVJR0hUX1FWR0EgKiBBUl9CWVRFU19QRVJfUElYRUwpCisjZGVmaW5lIE1BWF9BUl9GUkFNRV9CWVRFUyBcCisJKE1BWF9BUl9XSURUSCAqIE1BWF9BUl9IRUlHSFQgKiBBUl9CWVRFU19QRVJfUElYRUwpCisKKyNkZWZpbmUgQVJfTUFYX0ZSQU1FCQkxNQorCisvKiBjYXB0dXJlIHNpemUgKi8KKyNkZWZpbmUgQVJfU0laRV9WR0EJCTAKKyNkZWZpbmUgQVJfU0laRV9RVkdBCQkxCisKKy8qIGNhcHR1cmUgbW9kZSAqLworI2RlZmluZSBBUl9NT0RFX0lOVEVSTEFDRQkwCisjZGVmaW5lIEFSX01PREVfTk9STUFMCQkxCisKK3N0cnVjdCBhcl9kZXZpY2UgeworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXY7CisJdW5zaWduZWQgaW50IHN0YXJ0X2NhcHR1cmU7CS8qIGR1YXJpbmcgY2FwdHVyZSBpbiBJTlQuIG1vZGUuICovCisjaWYgVVNFX0lOVAorCXVuc2lnbmVkIGNoYXIgKmxpbmVfYnVmZjsJLyogRE1BIGxpbmUgYnVmZmVyICovCisjZW5kaWYKKwl1bnNpZ25lZCBjaGFyICpmcmFtZVtNQVhfQVJfSEVJR0hUXTsJLyogZnJhbWUgZGF0YSAqLworCXNob3J0IHNpemU7CQkJLyogY2FwdHVyZSBzaXplICovCisJc2hvcnQgbW9kZTsJCQkvKiBjYXB0dXJlIG1vZGUgKi8KKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlpbnQgZnJhbWVfYnl0ZXMsIGxpbmVfYnl0ZXM7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7Cit9OworCitzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CS8qIHZpZGVvIGRldmljZSBudW1iZXIgKGZpcnN0IGZyZWUpICovCitzdGF0aWMgdW5zaWduZWQgY2hhcgl5dXZbTUFYX0FSX0ZSQU1FX0JZVEVTXTsKKworLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KKy8qIGRlZmF1bHQgZnJlcXVlbmN5ICovCisjZGVmaW5lIERFRkFVTFRfRlJFUQk1MAkvKiA1MCBvciA3NSAoTUh6KSBpcyBhdmFpbGFibGUgYXMgQkNMSyAqLworc3RhdGljIGludCBmcmVxID0gREVGQVVMVF9GUkVROwkvKiBCQ0xLOiBhdmFpbGFibGUgNTAgb3IgNzAgKE1IeikgKi8KK3N0YXRpYyBpbnQgdmdhID0gMDsJCS8qIGRlZmF1bHQgbW9kZSgwOlFWR0EgbW9kZSwgb3RoZXI6VkdBIG1vZGUpICovCitzdGF0aWMgaW50IHZnYV9pbnRlcmxhY2UgPSAwOwkvKiAwIGlzIG5vcm1hbCBtb2RlIGZvciwgZWxzZSBpbnRlcmxhY2UgbW9kZSAqLworTU9EVUxFX1BBUk0oZnJlcSwgImkiKTsKK01PRFVMRV9QQVJNKHZnYSwgImkiKTsKK01PRFVMRV9QQVJNKHZnYV9pbnRlcmxhY2UsICJpIik7CisKK3N0YXRpYyBpbnQgYXJfaW5pdGlhbGl6ZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF9mb3JfdnN5bmModm9pZCkKK3sKKwl3aGlsZSAoYXJfaW5sKEFSVkNSMCkgJiBBUlZDUjBfVkRTKQkvKiB3YWl0IGZvciBWU1lOQyAqLworCQljcHVfcmVsYXgoKTsKKwl3aGlsZSAoIShhcl9pbmwoQVJWQ1IwKSAmIEFSVkNSMF9WRFMpKQkvKiB3YWl0IGZvciBWU1lOQyAqLworCQljcHVfcmVsYXgoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfYWNrbm93bGVkZ2Uodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisJCWNwdV9yZWxheCgpOworCXdoaWxlIChhcl9pbmwoUExESTJDU1RTKSAmIFBMREkyQ1NUU19OT0FDSykKKwkJY3B1X3JlbGF4KCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJMkMgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWljKGludCBuLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZGF0YTEsIHVuc2lnbmVkIGxvbmcgZGF0YTIsCisJIHVuc2lnbmVkIGxvbmcgZGF0YTMpCit7CisJaW50IGk7CisKKyAgCS8qIFNsYXZlIEFkZHJlc3MgKi8KKyAgCWFyX291dGwoYWRkciwgUExESTJDREFUQSk7CisJd2FpdF9mb3JfdnN5bmMoKTsKKworICAJLyogU3RhcnQgKi8KKyAgCWFyX291dGwoMSwgUExESTJDQ05EKTsKKwl3YWl0X2Fja25vd2xlZGdlKCk7CisKKwkvKiBUcmFuc2ZlciBkYXRhIDEgKi8KKyAgCWFyX291dGwoZGF0YTEsIFBMREkyQ0RBVEEpOworCXdhaXRfZm9yX3ZzeW5jKCk7CisgIAlhcl9vdXRsKFBMREkyQ1NURU5fU1RFTiwgUExESTJDU1RFTik7CisJd2FpdF9hY2tub3dsZWRnZSgpOworCisJLyogVHJhbnNmZXIgZGF0YSAyICovCisgIAlhcl9vdXRsKGRhdGEyLCBQTERJMkNEQVRBKTsKKwl3YWl0X2Zvcl92c3luYygpOworICAJYXJfb3V0bChQTERJMkNTVEVOX1NURU4sIFBMREkyQ1NURU4pOworCXdhaXRfYWNrbm93bGVkZ2UoKTsKKworCWlmIChuID09IDMpIHsKKwkJLyogVHJhbnNmZXIgZGF0YSAzICovCisJICAJYXJfb3V0bChkYXRhMywgUExESTJDREFUQSk7CisJCXdhaXRfZm9yX3ZzeW5jKCk7CisJICAJYXJfb3V0bChQTERJMkNTVEVOX1NURU4sIFBMREkyQ1NURU4pOworCQl3YWl0X2Fja25vd2xlZGdlKCk7CisgIAl9CisKKyAgCS8qIFN0b3AgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisJCWNwdV9yZWxheCgpOworICAJYXJfb3V0bCgyLCBQTERJMkNDTkQpOworICAJYXJfb3V0bCgyLCBQTERJMkNDTkQpOworCisJd2hpbGUgKGFyX2lubChQTERJMkNTVFMpICYgUExESTJDU1RTX0JCKQorCQljcHVfcmVsYXgoKTsKK30KKworCit2b2lkIGluaXRfaWljKHZvaWQpCit7CisJREVCVUcoMSwgImluaXRfaWljOlxuIik7CisKKyAgCS8qCisJICogSUNVIFNldHRpbmcgKGlpYykKKwkgKi8KKyAgCS8qIEkyQyBTZXR0aW5nICovCisgIAlhcl9vdXRsKDB4MCwgUExESTJDQ1IpOyAgICAgIAkvKiBJMkNDUiBEaXNhYmxlICAgICAgICAgICAgICAgICAgICovCisgIAlhcl9vdXRsKDB4MDMwMCwgUExESTJDTU9EKTsgCS8qIEkyQ01PRCBBQ0svOGItZGF0YS83Yi1hZGRyL2F1dG8gKi8KKyAgCWFyX291dGwoMHgxLCBQTERJMkNBQ0spOwkvKiBJMkNBQ0sgQUNLICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAJLyogSTJDIENMSyAqLworICAgCS8qIDUwTUgtMTAwayAqLworCWlmIChmcmVxID09IDc1KSB7CisgIAkJYXJfb3V0bCgzNjksIFBMREkyQ0ZSRVEpOwkvKiBCQ0xLID0gNzVNSHogKi8KKwl9IGVsc2UgaWYgKGZyZXEgPT0gNTApIHsKKwkJYXJfb3V0bCgyNDQsIFBMREkyQ0ZSRVEpOwkvKiBCQ0xLID0gNTBNSHogKi8KKwl9IGVsc2UgeworCQlhcl9vdXRsKDI0NCwgUExESTJDRlJFUSk7CS8qIGRlZmF1bHQ6IEJDTEsgPSA1ME1IeiAqLworCX0KKyAgCWFyX291dGwoMHgxLCBQTERJMkNDUik7IAkvKiBJMkNDUiBFbmFibGUgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVmlkZW80TGludXggSW50ZXJmYWNlIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfZG1hKHZvaWQpCit7CisJYXJfb3V0bCgweDgwMDAsIE0zMlJfRE1BRU5fUE9SVEwpOwkvKiBkaXNhYmxlIERNQTAgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9kbWEodm9pZCkKK3sKKwlhcl9vdXRsKDB4ODA4MCwgTTMyUl9ETUFFTl9QT1JUTCk7CS8qIGVuYWJsZSBETUEwICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9kbWFfc3RhdHVzKHZvaWQpCit7CisJYXJfb3V0bCgweDgwMDAsIE0zMlJfRE1BRURFVF9QT1JUTCk7CS8qIGNsZWFyIHN0YXR1cyAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF9mb3JfdmVydGljYWxfc3luYyhpbnQgZXhwX2xpbmUpCit7CisjaWYgQ0hFQ0tfTE9TVAorCWludCB0bW91dCA9IDEwMDAwOwkvKiBGSVhNRSAqLworCWludCBsOworCisJLyoKKwkgKiBjaGVjayBIQ09VTlQgYmVjYXVzZSB3ZSBjYW5ub3QgY2hlY2sgdmVydGljYWwgc3luYy4KKyAJICovCisJZm9yICg7IHRtb3V0ID49IDA7IHRtb3V0LS0pIHsKKwkJbCA9IGFyX2lubChBUlZIQ09VTlQpOworCQlpZiAobCA9PSBleHBfbGluZSkKKwkJCWJyZWFrOworCX0KKwlpZiAodG1vdXQgPCAwKQorCQlwcmludGsoImFydjogbG9zdCAlZCAtPiAlZFxuIiwgZXhwX2xpbmUsIGwpOworI2Vsc2UKKwl3aGlsZSAoYXJfaW5sKEFSVkhDT1VOVCkgIT0gZXhwX2xpbmUpCisJCWNwdV9yZWxheCgpOworI2VuZGlmCit9CisKK3N0YXRpYyBzc2l6ZV90IGFyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IGFyX2RldmljZSAqYXIgPSB2LT5wcml2OworCWxvbmcgcmV0ID0gYXItPmZyYW1lX2J5dGVzOwkJLyogcmV0dXJuIHJlYWQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIGFydmNyMSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBoLCB3OworCXVuc2lnbmVkIGNoYXIgKnB5LCAqcHUsICpwdjsKKyNpZiAhIFVTRV9JTlQKKwlpbnQgbDsKKyNlbmRpZgorCisJREVCVUcoMSwgImFyX3JlYWQoKVxuIik7CisKKwlpZiAoYXItPnNpemUgPT0gQVJfU0laRV9RVkdBKQorCQlhcnZjcjEgfD0gQVJWQ1IxX1FWR0E7CisJaWYgKGFyLT5tb2RlID09IEFSX01PREVfTk9STUFMKQorCQlhcnZjcjEgfD0gQVJWQ1IxX05PUk1BTDsKKworCWRvd24oJmFyLT5sb2NrKTsKKworI2lmIFVTRV9JTlQKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZGlzYWJsZV9kbWEoKTsKKwlhcl9vdXRsKDB4YTE4NzEzMDAsIE0zMlJfRE1BMENSMF9QT1JUTCk7CisJYXJfb3V0bCgweDAxMDAwMDAwLCBNMzJSX0RNQTBDUjFfUE9SVEwpOworCisJLyogc2V0IEFSIEZJRk8gYWRkcmVzcyBhcyBzb3VyY2UoQlNFTDUpICovCisJYXJfb3V0bChBUkRBVEEzMiwgTTMyUl9ETUEwQ1NBX1BPUlRMKTsKKwlhcl9vdXRsKEFSREFUQTMyLCBNMzJSX0RNQTBSU0FfUE9SVEwpOworCWFyX291dGwoYXItPmxpbmVfYnVmZiwgTTMyUl9ETUEwQ0RBX1BPUlRMKTsJLyogZGVzdGluYXRpb24gYWRkci4gKi8KKwlhcl9vdXRsKGFyLT5saW5lX2J1ZmYsIE0zMlJfRE1BMFJEQV9QT1JUTCk7IAkvKiByZWxvYWQgYWRkcmVzcyAqLworCWFyX291dGwoYXItPmxpbmVfYnl0ZXMsIE0zMlJfRE1BMENCQ1VUX1BPUlRMKTsgCS8qIGJ5dGUgY291bnQgKGJ5dGVzKSAqLworCWFyX291dGwoYXItPmxpbmVfYnl0ZXMsIE0zMlJfRE1BMFJCQ1VUX1BPUlRMKTsgCS8qIHJlbG9hZCBjb3VudCAoYnl0ZXMpICovCisKKwkvKgorCSAqIE9rZXkgLCBraWNrcyBBUiBMU0kgdG8gaW52b2tlIGFuIGludGVycnVwdAorCSAqLworCWFyLT5zdGFydF9jYXB0dXJlID0gMDsKKwlhcl9vdXRsKGFydmNyMSB8IEFSVkNSMV9ISUVOLCBBUlZDUjEpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkvKiAuLi4uIEFSIGludGVycnVwdHMgLi4uLiAqLworCWludGVycnVwdGlibGVfc2xlZXBfb24oJmFyLT53YWl0KTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcHJpbnRrKCJhcnY6IGludGVycnVwdGVkIHdoaWxlIGdldCBmcmFtZSBkYXRhLlxuIik7CisJCXJldCA9IC1FSU5UUjsKKwkJZ290byBvdXRfdXA7CisJfQorI2Vsc2UJLyogISBVU0VfSU5UICovCisJLyogcG9sbGluZyAqLworCWFyX291dGwoYXJ2Y3IxLCBBUlZDUjEpOworCWRpc2FibGVfZG1hKCk7CisJYXJfb3V0bCgweDgwMDAsIE0zMlJfRE1BRURFVF9QT1JUTCk7CisJYXJfb3V0bCgweGEwODYxMzAwLCBNMzJSX0RNQTBDUjBfUE9SVEwpOworCWFyX291dGwoMHgwMTAwMDAwMCwgTTMyUl9ETUEwQ1IxX1BPUlRMKTsKKwlhcl9vdXRsKEFSREFUQTMyLCBNMzJSX0RNQTBDU0FfUE9SVEwpOworCWFyX291dGwoQVJEQVRBMzIsIE0zMlJfRE1BMFJTQV9QT1JUTCk7CisJYXJfb3V0bChhci0+bGluZV9ieXRlcywgTTMyUl9ETUEwQ0JDVVRfUE9SVEwpOworCWFyX291dGwoYXItPmxpbmVfYnl0ZXMsIE0zMlJfRE1BMFJCQ1VUX1BPUlRMKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl3aGlsZSAoYXJfaW5sKEFSVkhDT1VOVCkgIT0gMCkJCS8qIHdhaXQgZm9yIDAgKi8KKwkJY3B1X3JlbGF4KCk7CisJaWYgKGFyLT5tb2RlID09IEFSX01PREVfSU5URVJMQUNFICYmIGFyLT5zaXplID09IEFSX1NJWkVfVkdBKSB7CisJCWZvciAoaCA9IDA7IGggPCBhci0+aGVpZ2h0OyBoKyspIHsKKwkJCXdhaXRfZm9yX3ZlcnRpY2FsX3N5bmMoaCk7CisJCQlpZiAoaCA8IChBUl9IRUlHSFRfVkdBLzIpKQorCQkJCWwgPSBoIDw8IDE7CisJCQllbHNlCisJCQkJbCA9ICgoKGggLSAoQVJfSEVJR0hUX1ZHQS8yKSkgPDwgMSkgKyAxKTsKKwkJCWFyX291dGwodmlydF90b19waHlzKGFyLT5mcmFtZVtsXSksIE0zMlJfRE1BMENEQV9QT1JUTCk7CisJCQllbmFibGVfZG1hKCk7CisJCQl3aGlsZSAoIShhcl9pbmwoTTMyUl9ETUFFREVUX1BPUlRMKSAmIDB4ODAwMCkpCisJCQkJY3B1X3JlbGF4KCk7CisJCQlkaXNhYmxlX2RtYSgpOworCQkJY2xlYXJfZG1hX3N0YXR1cygpOworCQkJYXJfb3V0bCgweGEwODYxMzAwLCBNMzJSX0RNQTBDUjBfUE9SVEwpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChoID0gMDsgaCA8IGFyLT5oZWlnaHQ7IGgrKykgeworCQkJd2FpdF9mb3JfdmVydGljYWxfc3luYyhoKTsKKwkJCWFyX291dGwodmlydF90b19waHlzKGFyLT5mcmFtZVtoXSksIE0zMlJfRE1BMENEQV9QT1JUTCk7CisJCQllbmFibGVfZG1hKCk7CisJCQl3aGlsZSAoIShhcl9pbmwoTTMyUl9ETUFFREVUX1BPUlRMKSAmIDB4ODAwMCkpCisJCQkJY3B1X3JlbGF4KCk7CisJCQlkaXNhYmxlX2RtYSgpOworCQkJY2xlYXJfZG1hX3N0YXR1cygpOworCQkJYXJfb3V0bCgweGEwODYxMzAwLCBNMzJSX0RNQTBDUjBfUE9SVEwpOworCQl9CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNlbmRpZgkvKiAhIFVTRV9JTlQgKi8KKworCS8qCisJICogY29udmVydCBZVVY0MjIgdG8gWVVWNDIyUAorCSAqIAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICoJfCAgWTAsWTEsLi4uCSAgICAgfAorCSAqCXwgIC4uLi4uLi4uLi4uLi4uWW4gIHwKKwkgKgkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICoJfCAgVTAsVTEsLi4uLi4uLi5VbiAgfAorCSAqCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKgl8ICBWMCxWMSwuLi4uLi4uLlZuICB8CisJICoJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqLworCXB5ID0geXV2OworCXB1ID0gcHkgKyAoYXItPmZyYW1lX2J5dGVzIC8gMik7CisJcHYgPSBwdSArIChhci0+ZnJhbWVfYnl0ZXMgLyA0KTsKKwlmb3IgKGggPSAwOyBoIDwgYXItPmhlaWdodDsgaCsrKSB7CisJCXAgPSBhci0+ZnJhbWVbaF07CisJCWZvciAodyA9IDA7IHcgPCBhci0+bGluZV9ieXRlczsgdyArPSA0KSB7CisJCQkqcHkrKyA9ICpwKys7CisJCQkqcHUrKyA9ICpwKys7CisJCQkqcHkrKyA9ICpwKys7CisJCQkqcHYrKyA9ICpwKys7CisJCX0KKwl9CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHl1diwgYXItPmZyYW1lX2J5dGVzKSkgeworCQlwcmludGsoImFydjogZmFpbGVkIHdoaWxlIGNvcHlfdG9fdXNlciB5dXYuXG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdXA7CisJfQorCURFQlVHKDEsICJyZXQgPSAlZFxuIiwgcmV0KTsKK291dF91cDoKKwl1cCgmYXItPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXJfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgYXJfZGV2aWNlICphciA9IGRldi0+cHJpdjsKKworCURFQlVHKDEsICJhcl9pb2N0bCgpXG4iKTsKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBWSURJT0NHQ0FQOgorCXsKKwkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmIgPSBhcmc7CisJCURFQlVHKDEsICJWSURJT0NHQ0FQOlxuIik7CisJCXN0cmNweShiLT5uYW1lLCBhci0+dmRldi0+bmFtZSk7CisJCWItPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFOworCQliLT5jaGFubmVscyA9IDA7CisJCWItPmF1ZGlvcyA9IDA7CisJCWItPm1heHdpZHRoID0gTUFYX0FSX1dJRFRIOworCQliLT5tYXhoZWlnaHQgPSBNQVhfQVJfSEVJR0hUOworCQliLT5taW53aWR0aCA9IE1JTl9BUl9XSURUSDsKKwkJYi0+bWluaGVpZ2h0ID0gTUlOX0FSX0hFSUdIVDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DR0NIQU46CisJCURFQlVHKDEsICJWSURJT0NHQ0hBTjpcbiIpOworCQlyZXR1cm4gMDsKKwljYXNlIFZJRElPQ1NDSEFOOgorCQlERUJVRygxLCAiVklESU9DU0NIQU46XG4iKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWSURJT0NHVFVORVI6CisJCURFQlVHKDEsICJWSURJT0NHVFVORVI6XG4iKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWSURJT0NTVFVORVI6CisJCURFQlVHKDEsICJWSURJT0NTVFVORVI6XG4iKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWSURJT0NHUElDVDoKKwkJREVCVUcoMSwgIlZJRElPQ0dQSUNUOlxuIik7CisJCXJldHVybiAwOworCWNhc2UgVklESU9DU1BJQ1Q6CisJCURFQlVHKDEsICJWSURJT0NTUElDVDpcbiIpOworCQlyZXR1cm4gMDsKKwljYXNlIFZJRElPQ0NBUFRVUkU6CisJCURFQlVHKDEsICJWSURJT0NDQVBUVVJFOlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgVklESU9DR1dJTjoKKwl7CisJCXN0cnVjdCB2aWRlb193aW5kb3cgKncgPSBhcmc7CisJCURFQlVHKDEsICJWSURJT0NHV0lOOlxuIik7CisJCW1lbXNldCh3LCAwLCBzaXplb2YodykpOworCQl3LT53aWR0aCA9IGFyLT53aWR0aDsKKwkJdy0+aGVpZ2h0ID0gYXItPmhlaWdodDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU1dJTjoKKwl7CisJCXN0cnVjdCB2aWRlb193aW5kb3cgKncgPSBhcmc7CisJCURFQlVHKDEsICJWSURJT0NTV0lOOlxuIik7CisJCWlmICgody0+d2lkdGggIT0gQVJfV0lEVEhfVkdBIHx8IHctPmhlaWdodCAhPSBBUl9IRUlHSFRfVkdBKSAmJgorCQkgICAgKHctPndpZHRoICE9IEFSX1dJRFRIX1FWR0EgfHwgdy0+aGVpZ2h0ICE9IEFSX0hFSUdIVF9RVkdBKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkb3duKCZhci0+bG9jayk7CisJCWFyLT53aWR0aCA9IHctPndpZHRoOworCQlhci0+aGVpZ2h0ID0gdy0+aGVpZ2h0OworCQlpZiAoYXItPndpZHRoID09IEFSX1dJRFRIX1ZHQSkgeworCQkJYXItPnNpemUgPSBBUl9TSVpFX1ZHQTsKKwkJCWFyLT5mcmFtZV9ieXRlcyA9IEFSX0ZSQU1FX0JZVEVTX1ZHQTsKKwkJCWFyLT5saW5lX2J5dGVzID0gQVJfTElORV9CWVRFU19WR0E7CisJCQlpZiAodmdhX2ludGVybGFjZSkKKwkJCQlhci0+bW9kZSA9IEFSX01PREVfSU5URVJMQUNFOworCQkJZWxzZQorCQkJCWFyLT5tb2RlID0gQVJfTU9ERV9OT1JNQUw7CisJCX0gZWxzZSB7CisJCQlhci0+c2l6ZSA9IEFSX1NJWkVfUVZHQTsKKwkJCWFyLT5mcmFtZV9ieXRlcyA9IEFSX0ZSQU1FX0JZVEVTX1FWR0E7CisJCQlhci0+bGluZV9ieXRlcyA9IEFSX0xJTkVfQllURVNfUVZHQTsKKwkJCWFyLT5tb2RlID0gQVJfTU9ERV9JTlRFUkxBQ0U7CisJCX0KKwkJdXAoJmFyLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DR0ZCVUY6CisJCURFQlVHKDEsICJWSURJT0NHRkJVRjpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFZJRElPQ1NGQlVGOgorCQlERUJVRygxLCAiVklESU9DU0ZCVUY6XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBWSURJT0NLRVk6CisJCURFQlVHKDEsICJWSURJT0NLRVk6XG4iKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWSURJT0NHRlJFUToKKwkJREVCVUcoMSwgIlZJRElPQ0dGUkVROlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgVklESU9DU0ZSRVE6CisJCURFQlVHKDEsICJWSURJT0NTRlJFUTpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFZJRElPQ0dBVURJTzoKKwkJREVCVUcoMSwgIlZJRElPQ0dBVURJTzpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFZJRElPQ1NBVURJTzoKKwkJREVCVUcoMSwgIlZJRElPQ1NBVURJTzpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFZJRElPQ1NZTkM6CisJCURFQlVHKDEsICJWSURJT0NTWU5DOlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgVklESU9DTUNBUFRVUkU6CisJCURFQlVHKDEsICJWSURJT0NNQ0FQVFVSRTpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFZJRElPQ0dNQlVGOgorCQlERUJVRygxLCAiVklESU9DR01CVUY6XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBWSURJT0NHVU5JVDoKKwkJREVCVUcoMSwgIlZJRElPQ0dVTklUOlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgVklESU9DR0NBUFRVUkU6CisJCURFQlVHKDEsICJWSURJT0NHQ0FQVFVSRTpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFZJRElPQ1NDQVBUVVJFOgorCQlERUJVRygxLCAiVklESU9DU0NBUFRVUkU6XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBWSURJT0NTUExBWU1PREU6CisJCURFQlVHKDEsICJWSURJT0NTUExBWU1PREU6XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBWSURJT0NTV1JJVEVNT0RFOgorCQlERUJVRygxLCAiVklESU9DU1dSSVRFTU9ERTpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFZJRElPQ0dQTEFZSU5GTzoKKwkJREVCVUcoMSwgIlZJRElPQ0dQTEFZSU5GTzpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFZJRElPQ1NNSUNST0NPREU6CisJCURFQlVHKDEsICJWSURJT0NTTUlDUk9DT0RFOlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgVklESU9DR1ZCSUZNVDoKKwkJREVCVUcoMSwgIlZJRElPQ0dWQklGTVQ6XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBWSURJT0NTVkJJRk1UOgorCQlERUJVRygxLCAiVklESU9DU1ZCSUZNVDpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwlkZWZhdWx0OgorCQlERUJVRygxLCAiVW5rbm93biBpb2N0bCgweCUwOHgpXG4iLCBjbWQpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGFyX2RvX2lvY3RsKTsKK30KKworI2lmIFVTRV9JTlQKKy8qCisgKiBJbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZCBhcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYXJfZGV2aWNlICphciA9IGRldjsKKwl1bnNpZ25lZCBpbnQgbGluZV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgbGluZV9udW1iZXI7CisJdW5zaWduZWQgaW50IGFydmNyMTsKKworCWxpbmVfY291bnQgPSBhcl9pbmwoQVJWSENPVU5UKTsJCQkvKiBsaW5lIG51bWJlciAqLworCWlmIChhci0+bW9kZSA9PSBBUl9NT0RFX0lOVEVSTEFDRSAmJiBhci0+c2l6ZSA9PSBBUl9TSVpFX1ZHQSkgeworCQkvKiBvcGVyYXRpb25zIGZvciBpbnRlcmxhY2UgbW9kZSAqLworCQlpZiAoIGxpbmVfY291bnQgPCAoQVJfSEVJR0hUX1ZHQS8yKSApIAkvKiBldmVuIGxpbmUgKi8KKwkJCWxpbmVfbnVtYmVyID0gKGxpbmVfY291bnQgPDwgMSk7CisJCWVsc2UgCQkgIAkJCS8qIG9kZCBsaW5lICovCisgCQkJbGluZV9udW1iZXIgPQorCQkJKCgobGluZV9jb3VudCAtIChBUl9IRUlHSFRfVkdBLzIpKSA8PCAxKSArIDEpOworCX0gZWxzZSB7CisJCWxpbmVfbnVtYmVyID0gbGluZV9jb3VudDsKKwl9CisKKwlpZiAobGluZV9udW1iZXIgPT0gMCkgeworCQkvKgorCQkgKiBJdCBpcyBhbiBpbnRlcnJ1cHQgZm9yIGxpbmUgMC4KKwkJICogd2UgaGF2ZSB0byBzdGFydCBjYXB0dXJlLgorCQkgKi8KKwkJZGlzYWJsZV9kbWEoKTsKKyNpZiAwCisJCWFyX291dGwoYXItPmxpbmVfYnVmZiwgTTMyUl9ETUEwQ0RBX1BPUlRMKTsJLyogbmVlZGxlc3M/ICovCisjZW5kaWYKKwkJbWVtY3B5KGFyLT5mcmFtZVswXSwgYXItPmxpbmVfYnVmZiwgYXItPmxpbmVfYnl0ZXMpOworI2lmIDAKKwkJYXJfb3V0bCgweGExODYxMzAwLCBNMzJSX0RNQTBDUjBfUE9SVEwpOworI2VuZGlmCisJCWVuYWJsZV9kbWEoKTsKKwkJYXItPnN0YXJ0X2NhcHR1cmUgPSAxOwkJCS8qIGR1cmluZyBjYXB0dXJlICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoYXItPnN0YXJ0X2NhcHR1cmUgPT0gMSAmJiBsaW5lX251bWJlciA8PSAoYXItPmhlaWdodCAtIDEpKSB7CisJCWRpc2FibGVfZG1hKCk7CisJCW1lbWNweShhci0+ZnJhbWVbbGluZV9udW1iZXJdLCBhci0+bGluZV9idWZmLCBhci0+bGluZV9ieXRlcyk7CisKKwkJLyoKKwkJICogaWYgY2FwdHVyZWQgYWxsIGxpbmUgb2YgYSBmcmFtZSwgZGlzYWJsZSBBUiBpbnRlcnJ1cHQKKwkJICogYW5kIHdha2UgYSBwcm9jZXNzIHVwLgorCQkgKi8KKwkJaWYgKGxpbmVfbnVtYmVyID09IChhci0+aGVpZ2h0IC0gMSkpIHsgCS8qIGVuZCAgb2YgbGluZSAqLworCisJCQlhci0+c3RhcnRfY2FwdHVyZSA9IDA7CisKKwkJCS8qIGRpc2FibGUgQVIgaW50ZXJydXB0IHJlcXVlc3QgKi8KKwkJCWFydmNyMSA9IGFyX2lubChBUlZDUjEpOworCQkJYXJ2Y3IxICY9IH5BUlZDUjFfSElFTjsJCS8qIGNsZWFyIGludC4gZmxhZyAqLworCQkJYXJfb3V0bChhcnZjcjEsIEFSVkNSMSk7CS8qIGRpc2FibGUgKi8KKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXItPndhaXQpOworCQl9IGVsc2UgeworI2lmIDAKKwkJCWFyX291dGwoYXItPmxpbmVfYnVmZiwgTTMyUl9ETUEwQ0RBX1BPUlRMKTsKKwkJCWFyX291dGwoMHhhMTg2MTMwMCwgTTMyUl9ETUEwQ1IwX1BPUlRMKTsKKyNlbmRpZgorCQkJZW5hYmxlX2RtYSgpOworCQl9CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBhcl9pbml0aWFsaXplKCkKKyAqIAlhcl9pbml0aWFsaXplKCkgaXMgY2FsbGVkIGJ5IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgpIGFuZAorICoJaW5pdGlhbGl6ZXMgQVIgTFNJIGFuZCBwZXJpcGhlcmFscy4KKyAqCisgKgktMSBpcyByZXR1cm5lZCBpbiBhbGwgZmFpbHVyZXMuCisgKgkwIGlzIHJldHVybmVkIGluIHN1Y2Nlc3MuCisgKgorICovCitzdGF0aWMgaW50IGFyX2luaXRpYWxpemUoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcl9kZXZpY2UgKmFyID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgY3IgPSAwOworCWludCBpLGZvdW5kPTA7CisKKwlERUJVRygxLCAiYXJfaW5pdGlhbGl6ZTpcbiIpOworCisJLyoKKwkgKiBpbml0aWFsaXplIEFSIExTSQorCSAqLworCWFyX291dGwoMCwgQVJWQ1IwKTsJCS8qIGFzc2VydCByZXNldCBvZiBBUiBMU0kgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMHgxODsgaSsrKQkvKiB3YWl0IGZvciBvdmVyIDEwIGN5Y2xlcyBAIDI3TUh6ICovCisJCWNwdV9yZWxheCgpOworCWFyX291dGwoQVJWQ1IwX1JTVCwgQVJWQ1IwKTsJLyogbmVnYXRlIHJlc2V0IG9mIEFSIExTSSAoZW5hYmxlKSAqLworCWZvciAoaSA9IDA7IGkgPCAweDQwZDsgaSsrKQkvKiB3YWl0IGZvciBvdmVyIDQyMCBjeWNsZXMgQCAyN01IeiAqLworCQljcHVfcmVsYXgoKTsKKworCS8qIEFSIHVzZXMgSU5UMyBvZiBDUFUgYXMgaW50ZXJydXB0IHBpbi4gKi8KKwlhcl9vdXRsKEFSSU5UU0VMX0lOVDMsIEFSSU5UU0VMKTsKKworCWlmIChhci0+c2l6ZSA9PSBBUl9TSVpFX1FWR0EpCisJCWNyIHw9IEFSVkNSMV9RVkdBOworCWlmIChhci0+bW9kZSA9PSBBUl9NT0RFX05PUk1BTCkKKwkJY3IgfD0gQVJWQ1IxX05PUk1BTDsKKwlhcl9vdXRsKGNyLCBBUlZDUjEpOworCisgIAkvKgorCSAqIEluaXRpYWxpemUgSUlDIHNvIHRoYXQgQ1BVIGNhbiBjb21tdW5pY2F0ZSB3aXRoIEFSIExTSSwKKwkgKiBhbmQgc2VuZCBib290IGNvbW1hbmRzIHRvIEFSIExTSS4KKwkgKi8KKwlpbml0X2lpYygpOworCisJZm9yIChpID0gMDsgaSA8IDB4MTAwMDAwOyBpKyspIHsJLyogPiAweGExZDEwLCAgNTZtcyAqLworCQlpZiAoKGFyX2lubChBUlZDUjApICYgQVJWQ1IwX1ZEUykpIHsJLyogVlNZTkMgKi8KKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZvdW5kID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJcHJpbnRrKCJhcnY6IEluaXRpYWxpemluZyAiKTsKKworCWlpYygyLDB4NzgsMHgxMSwweDAxLDB4MDApOwkvKiBzdGFydCAqLworCWlpYygzLDB4NzgsMHgxMiwweDAwLDB4MDYpOworCWlpYygzLDB4NzgsMHgxMiwweDEyLDB4MzApOworCWlpYygzLDB4NzgsMHgxMiwweDE1LDB4NTgpOworCWlpYygzLDB4NzgsMHgxMiwweDE3LDB4MzApOworCXByaW50aygiLiIpOworCWlpYygzLDB4NzgsMHgxMiwweDFhLDB4OTcpOworCWlpYygzLDB4NzgsMHgxMiwweDFiLDB4ZmYpOworCWlpYygzLDB4NzgsMHgxMiwweDFjLDB4ZmYpOworCWlpYygzLDB4NzgsMHgxMiwweDI2LDB4MTApOworCWlpYygzLDB4NzgsMHgxMiwweDI3LDB4MDApOworCXByaW50aygiLiIpOworCWlpYygyLDB4NzgsMHgzNCwweDAyLDB4MDApOworCWlpYygyLDB4NzgsMHg3YSwweDEwLDB4MDApOworCWlpYygyLDB4NzgsMHg4MCwweDM5LDB4MDApOworCWlpYygyLDB4NzgsMHg4MSwweGU2LDB4MDApOworCWlpYygyLDB4NzgsMHg4ZCwweDAwLDB4MDApOworCXByaW50aygiLiIpOworCWlpYygyLDB4NzgsMHg4ZSwweDBjLDB4MDApOworCWlpYygyLDB4NzgsMHg4ZiwweDAwLDB4MDApOworI2lmIDAKKwlpaWMoMiwweDc4LDB4OTAsMHgwMCwweDAwKTsJLyogQVdCIG9uPTEgb2ZmPTAgKi8KKyNlbmRpZgorCWlpYygyLDB4NzgsMHg5MywweDAxLDB4MDApOworCWlpYygyLDB4NzgsMHg5NCwweGNkLDB4MDApOworCWlpYygyLDB4NzgsMHg5NSwweDAwLDB4MDApOworCXByaW50aygiLiIpOworCWlpYygyLDB4NzgsMHg5NiwweGEwLDB4MDApOworCWlpYygyLDB4NzgsMHg5NywweDAwLDB4MDApOworCWlpYygyLDB4NzgsMHg5OCwweDYwLDB4MDApOworCWlpYygyLDB4NzgsMHg5OSwweDAxLDB4MDApOworCWlpYygyLDB4NzgsMHg5YSwweDE5LDB4MDApOworCXByaW50aygiLiIpOworCWlpYygyLDB4NzgsMHg5YiwweDAyLDB4MDApOworCWlpYygyLDB4NzgsMHg5YywweGU4LDB4MDApOworCWlpYygyLDB4NzgsMHg5ZCwweDAyLDB4MDApOworCWlpYygyLDB4NzgsMHg5ZSwweDJlLDB4MDApOworCWlpYygyLDB4NzgsMHhiOCwweDc4LDB4MDApOworCWlpYygyLDB4NzgsMHhiYSwweDA1LDB4MDApOworI2lmIDAKKwlpaWMoMiwweDc4LDB4ODMsMHg4YywweDAwKTsJLyogYnJpZ2h0bmVzcyAqLworI2VuZGlmCisJcHJpbnRrKCIuIik7CisKKwkvKiBjb2xvciBjb3JyZWN0aW9uICovCisJaWljKDMsMHg3OCwweDQ5LDB4MDAsMHg5NSk7CS8qIGEJCSovCisJaWljKDMsMHg3OCwweDQ5LDB4MDEsMHg5Nik7CS8qIGIJCSovCisJaWljKDMsMHg3OCwweDQ5LDB4MDMsMHg4NSk7CS8qIGMJCSovCisJaWljKDMsMHg3OCwweDQ5LDB4MDQsMHg5Nyk7CS8qIGQJCSovCisJaWljKDMsMHg3OCwweDQ5LDB4MDIsMHg3ZSk7CS8qIGUoTG8pCSovCisJaWljKDMsMHg3OCwweDQ5LDB4MDUsMHhhNCk7CS8qIGYoTG8pCSovCisJaWljKDMsMHg3OCwweDQ5LDB4MDYsMHgwNCk7CS8qIGUoSGkpCSovCisJaWljKDMsMHg3OCwweDQ5LDB4MDcsMHgwNCk7CS8qIGUoSGkpCSovCisJaWljKDIsMHg3OCwweDQ4LDB4MDEsMHgwMCk7CS8qIG9uPTEgb2ZmPTAJKi8KKworCXByaW50aygiLiIpOworCWlpYygyLDB4NzgsMHgxMSwweDAwLDB4MDApOwkvKiBlbmQgKi8KKwlwcmludGsoIiBkb25lXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGFyX3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKQoreworCXN0cnVjdCBhcl9kZXZpY2UgKmFyID0gdmZkLT5wcml2OworCWRvd24oJmFyLT5sb2NrKTsKKwl2aWRlb19kZXZpY2VfcmVsZWFzZSh2ZmQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFZpZGVvNExpbnV4IE1vZHVsZSBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAorCS5yZWxlYXNlCT0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCisJLnJlYWQJCT0gYXJfcmVhZCwKKwkuaW9jdGwJCT0gYXJfaW9jdGwsCisJLmxsc2VlawkJPSBub19sbHNlZWssCit9OworCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBhcl90ZW1wbGF0ZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIkNvbG91ciBBUiBWR0EiLAorCS50eXBlCQk9IFZJRF9UWVBFX0NBUFRVUkUsCisJLmhhcmR3YXJlCT0gVklEX0hBUkRXQVJFX0FSViwKKwkuZm9wcwkJPSAmYXJfZm9wcywKKwkucmVsZWFzZQk9IGFyX3JlbGVhc2UsCisJLm1pbm9yCQk9IC0xLAorfTsKKworI2RlZmluZSBBTElHTjQoeCkJKCgoKGludCkoeCkpICYgMHgzKSA9PSAwKQorc3RhdGljIHN0cnVjdCBhcl9kZXZpY2UgYXJkZXY7CisKK3N0YXRpYyBpbnQgX19pbml0IGFyX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgYXJfZGV2aWNlICphcjsKKwlpbnQgcmV0OworCWludCBpOworCisJREVCVUcoMSwgImFyX2luaXQ6XG4iKTsKKwlyZXQgPSAtRUlPOworCXByaW50ayhLRVJOX0lORk8gImFydjogQ29sb3VyIEFSIFZHQSBkcml2ZXIgJXNcbiIsIFZFUlNJT04pOworCisJYXIgPSAmYXJkZXY7CisJbWVtc2V0KGFyLCAwLCBzaXplb2Yoc3RydWN0IGFyX2RldmljZSkpOworCisjaWYgVVNFX0lOVAorCS8qIGFsbG9jYXRlIGEgRE1BIGJ1ZmZlciBmb3IgMSBsaW5lLiAgKi8KKwlhci0+bGluZV9idWZmID0ga21hbGxvYyhNQVhfQVJfTElORV9CWVRFUywgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmIChhci0+bGluZV9idWZmID09IE5VTEwgfHwgISBBTElHTjQoYXItPmxpbmVfYnVmZikpIHsKKwkJcHJpbnRrKCJhcnY6IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgRE1BLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VuZDsKKwl9CisjZW5kaWYKKwkvKiBhbGxvY2F0ZSBidWZmZXJzIGZvciBhIGZyYW1lICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9BUl9IRUlHSFQ7IGkrKykgeworCQlhci0+ZnJhbWVbaV0gPSBrbWFsbG9jKE1BWF9BUl9MSU5FX0JZVEVTLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGFyLT5mcmFtZVtpXSA9PSBOVUxMIHx8ICEgQUxJR040KGFyLT5mcmFtZVtpXSkpIHsKKwkJCXByaW50aygiYXJ2OiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIGZyYW1lLlxuIik7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXRfbGluZV9idWZmOworCQl9CisJfQorCisJYXItPnZkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoIWFyLT52ZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXJ2OiB2aWRlb19kZXZpY2VfYWxsb2MoKSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtY3B5KGFyLT52ZGV2LCAmYXJfdGVtcGxhdGUsIHNpemVvZihhcl90ZW1wbGF0ZSkpOworCWFyLT52ZGV2LT5wcml2ID0gYXI7CisKKwlpZiAodmdhKSB7CisJCWFyLT53aWR0aCAJPSBBUl9XSURUSF9WR0E7CisJCWFyLT5oZWlnaHQgCT0gQVJfSEVJR0hUX1ZHQTsKKwkJYXItPnNpemUgCT0gQVJfU0laRV9WR0E7CisJCWFyLT5mcmFtZV9ieXRlcyA9IEFSX0ZSQU1FX0JZVEVTX1ZHQTsKKwkJYXItPmxpbmVfYnl0ZXMJPSBBUl9MSU5FX0JZVEVTX1ZHQTsKKwkJaWYgKHZnYV9pbnRlcmxhY2UpCisJCQlhci0+bW9kZSA9IEFSX01PREVfSU5URVJMQUNFOworCQllbHNlCisJCQlhci0+bW9kZSA9IEFSX01PREVfTk9STUFMOworCX0gZWxzZSB7CisJCWFyLT53aWR0aCAJPSBBUl9XSURUSF9RVkdBOworCQlhci0+aGVpZ2h0IAk9IEFSX0hFSUdIVF9RVkdBOworCQlhci0+c2l6ZSAJPSBBUl9TSVpFX1FWR0E7CisJCWFyLT5mcmFtZV9ieXRlcyA9IEFSX0ZSQU1FX0JZVEVTX1FWR0E7CisJCWFyLT5saW5lX2J5dGVzCT0gQVJfTElORV9CWVRFU19RVkdBOworCQlhci0+bW9kZQk9IEFSX01PREVfSU5URVJMQUNFOworCX0KKwlpbml0X01VVEVYKCZhci0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXItPndhaXQpOworCisjaWYgVVNFX0lOVAorCWlmIChyZXF1ZXN0X2lycShNMzJSX0lSUV9JTlQzLCBhcl9pbnRlcnJ1cHQsIDAsICJhcnYiLCBhcikpIHsKKwkJcHJpbnRrKCJhcnY6IHJlcXVlc3RfaXJxKCVkKSBmYWlsZWQuXG4iLCBNMzJSX0lSUV9JTlQzKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfaXJxOworCX0KKyNlbmRpZgorCisJaWYgKGFyX2luaXRpYWxpemUoYXItPnZkZXYpICE9IDApIHsKKwkJcHJpbnRrKCJhcnY6IE02NDI3OCBub3QgZm91bmQuXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZGV2OworCX0KKworCS8qCisJICogb2ssIHdlIGNhbiBpbml0aWFsaXplIGgvdyBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycywKKwkgKiBzbyByZWdpc3RlciB2aWRlbyBkZXZpY2UgYXMgYSBmcmFtZSBncmFiYmVyIHR5cGUuCisJICogZGV2aWNlIGlzIG5hbWVkICJ2aWRlb1swLTY0XSIuCisJICogdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCkgaW5pdGlhbGl6ZXMgaC93IHVzaW5nIGFyX2luaXRpYWxpemUoKS4KKyAJICovCisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShhci0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpICE9IDApIHsKKwkJLyogcmV0dXJuIC0xLCAtRU5GSUxFKGZ1bGwpIG9yIG90aGVycyAqLworCQlwcmludGsoImFydjogcmVnaXN0ZXIgdmlkZW8gKENvbG91ciBBUikgZmFpbGVkLlxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2RldjsKKwl9CisKKwlwcmludGsoInZpZGVvJWQ6IEZvdW5kIE02NDI3OCBWR0EgKElSUSAlZCwgRnJlcSAlZE1IeikuXG4iLAorCQlhci0+dmRldi0+bWlub3IsIE0zMlJfSVJRX0lOVDMsIGZyZXEpOworCisJcmV0dXJuIDA7CisKK291dF9kZXY6CisjaWYgVVNFX0lOVAorCWZyZWVfaXJxKE0zMlJfSVJRX0lOVDMsIGFyKTsKKworb3V0X2lycToKKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBNQVhfQVJfSEVJR0hUOyBpKyspIHsKKwkJaWYgKGFyLT5mcmFtZVtpXSkKKwkJCWtmcmVlKGFyLT5mcmFtZVtpXSk7CisJfQorCitvdXRfbGluZV9idWZmOgorI2lmIFVTRV9JTlQKKwlrZnJlZShhci0+bGluZV9idWZmKTsKKworb3V0X2VuZDoKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgYXJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlmcmVxID0gKGJvb3RfY3B1X2RhdGEuYnVzX2Nsb2NrIC8gMTAwMDAwMCk7CisJcHJpbnRrKCJhcnY6IEJ1cyBjbG9jayAlZFxuIiwgZnJlcSk7CisJaWYgKGZyZXEgIT0gNTAgJiYgZnJlcSAhPSA3NSkKKwkJZnJlcSA9IERFRkFVTFRfRlJFUTsKKwlyZXR1cm4gYXJfaW5pdCgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgYXJfZGV2aWNlICphcjsKKwlpbnQgaTsKKworCWFyID0gJmFyZGV2OworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGFyLT52ZGV2KTsKKyNpZiBVU0VfSU5UCisJZnJlZV9pcnEoTTMyUl9JUlFfSU5UMywgYXIpOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IE1BWF9BUl9IRUlHSFQ7IGkrKykgeworCQlpZiAoYXItPmZyYW1lW2ldKQorCQkJa2ZyZWUoYXItPmZyYW1lW2ldKTsKKwl9CisjaWYgVVNFX0lOVAorCWtmcmVlKGFyLT5saW5lX2J1ZmYpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0KGFyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFyX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiVGFrZW8gVGFrYWhhc2hpIDx0YWthaGFzaGkudGFrZW9AcmVuZXNhcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbG91ciBBUiBNNjQyNzgoVkdBKSBmb3IgVmlkZW80TGludXgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MTkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MTkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjBkYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgxOS5jCkBAIC0wLDAgKzEsNjYwIEBACisvKiAKKyAqICBidDgxOSAtIEJUODE5QSBWaWRlb1N0cmVhbSBEZWNvZGVyIChSb2Nrd2VsbCBQYXJ0KQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBNaWtlIEJlcm5zb24gPG1pa2VAbWxiLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZlIFBlcmtzIDxkcGVya3NAaWJtLm5ldD4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBMTUwzMy9EQzEwcGx1cyB1bmlmaWVkIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAwIFNlcmd1ZWkgTWlyaWRvbm92IDxtaXJzZXZAY2ljZXNlLm14PgorICogIAorICogQ2hhbmdlcyBieSBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAtIG1vdmVkIG92ZXIgdG8gbGludXg+PTIuNC54IGkyYyBwcm90b2NvbCAoOS85LzIwMDIpCisgKgorICogVGhpcyBjb2RlIHdhcyBtb2RpZnkvcG9ydGVkIGZyb20gdGhlIHNhYTcxMTEgZHJpdmVyIHdyaXR0ZW4KKyAqIGJ5IERhdmUgUGVya3MuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9va3RyZWUtODE5IHZpZGVvIGRlY29kZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNaWtlIEJlcm5zb24gJiBEYXZlIFBlcmtzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtZGV2Lmg+CisKKyNkZWZpbmUgSTJDX05BTUUocykgKHMpLT5uYW1lCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTEpIik7CisKKyNkZWZpbmUgZHByaW50ayhudW0sIGZvcm1hdCwgYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoZGVidWcgPj0gbnVtKSBcCisJCQlwcmludGsoZm9ybWF0LCAjI2FyZ3MpOyBcCisJfSB3aGlsZSAoMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGJ0ODE5IHsKKwl1bnNpZ25lZCBjaGFyIHJlZ1szMl07CisKKwlpbnQgaW5pdGlhbGl6ZWQ7CisJaW50IG5vcm07CisJaW50IGlucHV0OworCWludCBlbmFibGU7CisJaW50IGJyaWdodDsKKwlpbnQgY29udHJhc3Q7CisJaW50IGh1ZTsKKwlpbnQgc2F0OworfTsKKworc3RydWN0IHRpbWluZyB7CisJaW50IGhhY3RpdmU7CisJaW50IGhkZWxheTsKKwlpbnQgdmFjdGl2ZTsKKwlpbnQgdmRlbGF5OworCWludCBoc2NhbGU7CisJaW50IHZzY2FsZTsKK307CisKKy8qIGZvciB2YWx1ZXMsIHNlZSB0aGUgYnQ4MTkgZGF0YXNoZWV0ICovCitzdGF0aWMgc3RydWN0IHRpbWluZyB0aW1pbmdfZGF0YVtdID0geworCXs4NjQgLSAyNCwgMjAsIDYyNSAtIDIsIDEsIDB4MDUwNCwgMHgwMDAwfSwKKwl7ODU4IC0gMjQsIDIwLCA1MjUgLSAyLCAxLCAweDAwZjgsIDB4MDAwMH0sCit9OworCisjZGVmaW5lICAgSTJDX0JUODE5ICAgICAgICAweDhhCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitidDgxOV93cml0ZSAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkgICAgIHU4ICAgICAgICAgICAgICAgICByZWcsCisJICAgICB1OCAgICAgICAgICAgICAgICAgdmFsdWUpCit7CisJc3RydWN0IGJ0ODE5ICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkZWNvZGVyLT5yZWdbcmVnXSA9IHZhbHVlOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitidDgxOV9zZXRiaXQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJICAgICAgdTggICAgICAgICAgICAgICAgIHJlZywKKwkgICAgICB1OCAgICAgICAgICAgICAgICAgYml0LAorCSAgICAgIHU4ICAgICAgICAgICAgICAgICB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYnQ4MTkgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJldHVybiBidDgxOV93cml0ZShjbGllbnQsIHJlZywKKwkJCSAgIChkZWNvZGVyLT4KKwkJCSAgICByZWdbcmVnXSAmIH4oMSA8PCBiaXQpKSB8CisJCQkgICAgKHZhbHVlID8gKDEgPDwgYml0KSA6IDApKTsKK30KKworc3RhdGljIGludAorYnQ4MTlfd3JpdGVfYmxvY2sgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCSAgIGNvbnN0IHU4ICAgICAgICAgICpkYXRhLAorCQkgICB1bnNpZ25lZCBpbnQgICAgICAgbGVuKQoreworCWludCByZXQgPSAtMTsKKwl1OCByZWc7CisKKwkvKiB0aGUgYnQ4MTkgaGFzIGFuIGF1dG9pbmNyZW1lbnQgZnVuY3Rpb24sIHVzZSBpdCBpZgorCSAqIHRoZSBhZGFwdGVyIHVuZGVyc3RhbmRzIHJhdyBJMkMgKi8KKwlpZiAoaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7CisJCS8qIGRvIHJhdyBJMkMsIG5vdCBzbWJ1cyBjb21wYXRpYmxlICovCisJCXN0cnVjdCBidDgxOSAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCQlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJCXU4IGJsb2NrX2RhdGFbMzJdOworCisJCW1zZy5hZGRyID0gY2xpZW50LT5hZGRyOworCQltc2cuZmxhZ3MgPSAwOworCQl3aGlsZSAobGVuID49IDIpIHsKKwkJCW1zZy5idWYgPSAoY2hhciAqKSBibG9ja19kYXRhOworCQkJbXNnLmxlbiA9IDA7CisJCQlibG9ja19kYXRhW21zZy5sZW4rK10gPSByZWcgPSBkYXRhWzBdOworCQkJZG8geworCQkJCWJsb2NrX2RhdGFbbXNnLmxlbisrXSA9CisJCQkJICAgIGRlY29kZXItPnJlZ1tyZWcrK10gPSBkYXRhWzFdOworCQkJCWxlbiAtPSAyOworCQkJCWRhdGEgKz0gMjsKKwkJCX0gd2hpbGUgKGxlbiA+PSAyICYmIGRhdGFbMF0gPT0gcmVnICYmCisJCQkJIG1zZy5sZW4gPCAzMik7CisJCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsCisJCQkJCQkmbXNnLCAxKSkgPCAwKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZG8gc29tZSBzbG93IEkyQyBlbXVsYXRpb24ga2luZCBvZiB0aGluZyAqLworCQl3aGlsZSAobGVuID49IDIpIHsKKwkJCXJlZyA9ICpkYXRhKys7CisJCQlpZiAoKHJldCA9IGJ0ODE5X3dyaXRlKGNsaWVudCwgcmVnLCAqZGF0YSsrKSkgPCAwKQorCQkJCWJyZWFrOworCQkJbGVuIC09IDI7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludAorYnQ4MTlfcmVhZCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkgICAgdTggICAgICAgICAgICAgICAgIHJlZykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKK30KKworc3RhdGljIGludAorYnQ4MTlfaW5pdCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYnQ4MTkgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGluaXRbXSA9IHsKKwkJLy8weDFmLCAweDAwLCAgICAgLyogUmVzZXQgKi8KKwkJMHgwMSwgMHg1OSwJLyogMHgwMSBpbnB1dCBmb3JtYXQgKi8KKwkJMHgwMiwgMHgwMCwJLyogMHgwMiB0ZW1wb3JhbCBkZWNpbWF0aW9uICovCisJCTB4MDMsIDB4MTIsCS8qIDB4MDMgQ3JvcHBpbmcgbXNiICovCisJCTB4MDQsIDB4MTYsCS8qIDB4MDQgVmVydGljYWwgRGVsYXksIGxzYiAqLworCQkweDA1LCAweGUwLAkvKiAweDA1IFZlcnRpY2FsIEFjdGl2ZSBsc2IgKi8KKwkJMHgwNiwgMHg4MCwJLyogMHgwNiBIb3Jpem9udGFsIERlbGF5IGxzYiAqLworCQkweDA3LCAweGQwLAkvKiAweDA3IEhvcml6b250YWwgQWN0aXZlIGxzYiAqLworCQkweDA4LCAweDAwLAkvKiAweDA4IEhvcml6b250YWwgU2NhbGluZyBtc2IgKi8KKwkJMHgwOSwgMHhmOCwJLyogMHgwOSBIb3Jpem9udGFsIFNjYWxpbmcgbHNiICovCisJCTB4MGEsIDB4MDAsCS8qIDB4MGEgQnJpZ2h0bmVzcyBjb250cm9sICovCisJCTB4MGIsIDB4MzAsCS8qIDB4MGIgTWlzY2VsbGFuZW91cyBjb250cm9sICovCisJCTB4MGMsIDB4ZDgsCS8qIDB4MGMgTHVtYSBHYWluIGxzYiAqLworCQkweDBkLCAweGZlLAkvKiAweDBkIENocm9tYSBHYWluIChVKSBsc2IgKi8KKwkJMHgwZSwgMHhiNCwJLyogMHgwZSBDaHJvbWEgR2FpbiAoVikgbXNiICovCisJCTB4MGYsIDB4MDAsCS8qIDB4MGYgSHVlIGNvbnRyb2wgKi8KKwkJMHgxMiwgMHgwNCwJLyogMHgxMiBPdXRwdXQgRm9ybWF0ICovCisJCTB4MTMsIDB4MjAsCS8qIDB4MTMgVmVydGlhbCBTY2FsaW5nIG1zYiAweDAwCisJCQkJCSAgIGNocm9tYSBjb21iIE9GRiwgbGluZSBkcm9wIHNjYWxpbmcsIGludGVybGFjZSBzY2FsaW5nCisJCQkJCSAgIEJVRz8gV2h5IGRvZXMgdHVybmluZyB0aGUgY2hyb21hIGNvbWIgb24gZnVjayB1cCBjb2xvcj8KKwkJCQkJICAgQnVnIGluIHRoZSBidDgxOSBzdGVwcGluZyBvbiBteSBib2FyZD8KKwkJCQkJKi8KKwkJMHgxNCwgMHgwMCwJLyogMHgxNCBWZXJ0aWFsIFNjYWxpbmcgbHNiICovCisJCTB4MTYsIDB4MDcsCS8qIDB4MTYgVmlkZW8gVGltaW5nIFBvbGFyaXR5IAorCQkJCQkgICBBQ1RJVkU9YWN0aXZlIGxvdworCQkJCQkgICBGSUVMRDogaGlnaD1vZGQsIAorCQkJCQkgICB2cmVzZXQ9YWN0aXZlIGhpZ2gsCisJCQkJCSAgIGhyZXNldD1hY3RpdmUgaGlnaCAqLworCQkweDE4LCAweDY4LAkvKiAweDE4IEFHQyBEZWxheSAqLworCQkweDE5LCAweDVkLAkvKiAweDE5IEJ1cnN0IEdhdGUgRGVsYXkgKi8KKwkJMHgxYSwgMHg4MCwJLyogMHgxYSBBREMgSW50ZXJmYWNlICovCisJfTsKKworCXN0cnVjdCB0aW1pbmcgKnRpbWluZyA9ICZ0aW1pbmdfZGF0YVtkZWNvZGVyLT5ub3JtXTsKKworCWluaXRbMHgwMyAqIDIgLSAxXSA9CisJICAgICgoKHRpbWluZy0+dmRlbGF5ID4+IDgpICYgMHgwMykgPDwgNikgfCAoKCh0aW1pbmctPgorCQkJCQkJICAgICAgIHZhY3RpdmUgPj4gOCkgJgorCQkJCQkJICAgICAgMHgwMykgPDwgNCkgfAorCSAgICAoKCh0aW1pbmctPmhkZWxheSA+PiA4KSAmIDB4MDMpIDw8IDIpIHwgKCh0aW1pbmctPgorCQkJCQkJICAgICAgaGFjdGl2ZSA+PiA4KSAmCisJCQkJCQkgICAgIDB4MDMpOworCWluaXRbMHgwNCAqIDIgLSAxXSA9IHRpbWluZy0+dmRlbGF5ICYgMHhmZjsKKwlpbml0WzB4MDUgKiAyIC0gMV0gPSB0aW1pbmctPnZhY3RpdmUgJiAweGZmOworCWluaXRbMHgwNiAqIDIgLSAxXSA9IHRpbWluZy0+aGRlbGF5ICYgMHhmZjsKKwlpbml0WzB4MDcgKiAyIC0gMV0gPSB0aW1pbmctPmhhY3RpdmUgJiAweGZmOworCWluaXRbMHgwOCAqIDIgLSAxXSA9IHRpbWluZy0+aHNjYWxlID4+IDg7CisJaW5pdFsweDA5ICogMiAtIDFdID0gdGltaW5nLT5oc2NhbGUgJiAweGZmOworCS8qIDB4MTUgaW4gYXJyYXkgaXMgYWRkcmVzcyAweDE5ICovCisJaW5pdFsweDE1ICogMiAtIDFdID0gKGRlY29kZXItPm5vcm0gPT0gMCkgPyAxMTUgOiA5MzsJLyogQ2hyb21hIGJ1cnN0IGRlbGF5ICovCisJLyogcmVzZXQgKi8KKwlidDgxOV93cml0ZShjbGllbnQsIDB4MWYsIDB4MDApOworCW1kZWxheSgxKTsKKworCS8qIGluaXQgKi8KKwlyZXR1cm4gYnQ4MTlfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0LCBzaXplb2YoaW5pdCkpOworCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQKK2J0ODE5X2NvbW1hbmQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJICAgICAgIHVuc2lnbmVkIGludCAgICAgICBjbWQsCisJICAgICAgIHZvaWQgICAgICAgICAgICAgICphcmcpCit7CisJaW50IHRlbXA7CisKKwlzdHJ1Y3QgYnQ4MTkgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmICghZGVjb2Rlci0+aW5pdGlhbGl6ZWQpIHsJLy8gRmlyc3QgY2FsbCB0byBidDgxOV9pbml0IGNvdWxkIGJlCisJCWJ0ODE5X2luaXQoY2xpZW50KTsJLy8gd2l0aG91dCAjRlJTVCA9IDAKKwkJZGVjb2Rlci0+aW5pdGlhbGl6ZWQgPSAxOworCX0KKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIDA6CisJCS8qIFRoaXMgaXMganVzdCBmb3IgdGVzdGluZyEhISAqLworCQlidDgxOV9pbml0KGNsaWVudCk7CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX0dFVF9DQVBBQklMSVRJRVM6CisJeworCQlzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJY2FwLT5mbGFncyA9IFZJREVPX0RFQ09ERVJfUEFMIHwKKwkJCSAgICAgVklERU9fREVDT0RFUl9OVFNDIHwKKwkJCSAgICAgVklERU9fREVDT0RFUl9BVVRPIHwKKwkJCSAgICAgVklERU9fREVDT0RFUl9DQ0lSOworCQljYXAtPmlucHV0cyA9IDg7CisJCWNhcC0+b3V0cHV0cyA9IDE7CisJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9HRVRfU1RBVFVTOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCQlpbnQgc3RhdHVzOworCQlpbnQgcmVzOworCisJCXN0YXR1cyA9IGJ0ODE5X3JlYWQoY2xpZW50LCAweDAwKTsKKwkJcmVzID0gMDsKKwkJaWYgKChzdGF0dXMgJiAweDgwKSkgeworCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX0dPT0Q7CisJCX0KKwkJc3dpdGNoIChkZWNvZGVyLT5ub3JtKSB7CisJCWNhc2UgVklERU9fTU9ERV9OVFNDOgorCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX05UU0M7CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19QQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBWSURFT19NT0RFX0FVVE86CisJCQlpZiAoKHN0YXR1cyAmIDB4MTApKSB7CisJCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX1BBTDsKKwkJCX0gZWxzZSB7CisJCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX05UU0M7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfQ09MT1I7CisJCSppYXJnID0gcmVzOworCisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogZ2V0IHN0YXR1cyAleFxuIiwgSTJDX05BTUUoY2xpZW50KSwKKwkJCSppYXJnKTsKKwl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX1NFVF9OT1JNOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCQlzdHJ1Y3QgdGltaW5nICp0aW1pbmcgPSBOVUxMOworCisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogc2V0IG5vcm0gJXhcbiIsIEkyQ19OQU1FKGNsaWVudCksCisJCQkqaWFyZyk7CisKKwkJc3dpdGNoICgqaWFyZykgeworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCWJ0ODE5X3NldGJpdChjbGllbnQsIDB4MDEsIDAsIDEpOworCQkJYnQ4MTlfc2V0Yml0KGNsaWVudCwgMHgwMSwgMSwgMCk7CisJCQlidDgxOV9zZXRiaXQoY2xpZW50LCAweDAxLCA1LCAwKTsKKwkJCWJ0ODE5X3dyaXRlKGNsaWVudCwgMHgxOCwgMHg2OCk7CisJCQlidDgxOV93cml0ZShjbGllbnQsIDB4MTksIDB4NWQpOworCQkJLy9idDgxOV9zZXRiaXQoY2xpZW50LCAweDFhLCAgNSwgMSk7CisJCQl0aW1pbmcgPSAmdGltaW5nX2RhdGFbVklERU9fTU9ERV9OVFNDXTsKKwkJCWJyZWFrOworCQljYXNlIFZJREVPX01PREVfUEFMOgorCQkJYnQ4MTlfc2V0Yml0KGNsaWVudCwgMHgwMSwgMCwgMSk7CisJCQlidDgxOV9zZXRiaXQoY2xpZW50LCAweDAxLCAxLCAxKTsKKwkJCWJ0ODE5X3NldGJpdChjbGllbnQsIDB4MDEsIDUsIDEpOworCQkJYnQ4MTlfd3JpdGUoY2xpZW50LCAweDE4LCAweDdmKTsKKwkJCWJ0ODE5X3dyaXRlKGNsaWVudCwgMHgxOSwgMHg3Mik7CisJCQkvL2J0ODE5X3NldGJpdChjbGllbnQsIDB4MWEsICA1LCAwKTsKKwkJCXRpbWluZyA9ICZ0aW1pbmdfZGF0YVtWSURFT19NT0RFX1BBTF07CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19NT0RFX0FVVE86CisJCQlidDgxOV9zZXRiaXQoY2xpZW50LCAweDAxLCAwLCAwKTsKKwkJCWJ0ODE5X3NldGJpdChjbGllbnQsIDB4MDEsIDEsIDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IHVuc3VwcG9ydGVkIG5vcm0gJWRcbiIsCisJCQkJSTJDX05BTUUoY2xpZW50KSwgKmlhcmcpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAodGltaW5nKSB7CisJCQlidDgxOV93cml0ZShjbGllbnQsIDB4MDMsCisJCQkJICAgICgoKHRpbWluZy0+dmRlbGF5ID4+IDgpICYgMHgwMykgPDwgNikgfAorCQkJCSAgICAoKCh0aW1pbmctPnZhY3RpdmUgPj4gOCkgJiAweDAzKSA8PCA0KSB8CisJCQkJICAgICgoKHRpbWluZy0+aGRlbGF5ID4+IDgpICYgMHgwMykgPDwgMikgfAorCQkJCSAgICAgKCh0aW1pbmctPmhhY3RpdmUgPj4gOCkgJiAweDAzKSApOworCQkJYnQ4MTlfd3JpdGUoY2xpZW50LCAweDA0LCB0aW1pbmctPnZkZWxheSAmIDB4ZmYpOworCQkJYnQ4MTlfd3JpdGUoY2xpZW50LCAweDA1LCB0aW1pbmctPnZhY3RpdmUgJiAweGZmKTsKKwkJCWJ0ODE5X3dyaXRlKGNsaWVudCwgMHgwNiwgdGltaW5nLT5oZGVsYXkgJiAweGZmKTsKKwkJCWJ0ODE5X3dyaXRlKGNsaWVudCwgMHgwNywgdGltaW5nLT5oYWN0aXZlICYgMHhmZik7CisJCQlidDgxOV93cml0ZShjbGllbnQsIDB4MDgsICh0aW1pbmctPmhzY2FsZSA+PiA4KSAmIDB4ZmYpOworCQkJYnQ4MTlfd3JpdGUoY2xpZW50LCAweDA5LCB0aW1pbmctPmhzY2FsZSAmIDB4ZmYpOworCQl9CisKKwkJZGVjb2Rlci0+bm9ybSA9ICppYXJnOworCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfU0VUX0lOUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogc2V0IGlucHV0ICV4XG4iLCBJMkNfTkFNRShjbGllbnQpLAorCQkJKmlhcmcpOworCisJCWlmICgqaWFyZyA8IDAgfHwgKmlhcmcgPiA3KSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChkZWNvZGVyLT5pbnB1dCAhPSAqaWFyZykgeworCQkJZGVjb2Rlci0+aW5wdXQgPSAqaWFyZzsKKwkJCS8qIHNlbGVjdCBtb2RlICovCisJCQlpZiAoZGVjb2Rlci0+aW5wdXQgPT0gMCkgeworCQkJCWJ0ODE5X3NldGJpdChjbGllbnQsIDB4MGIsIDYsIDApOworCQkJCWJ0ODE5X3NldGJpdChjbGllbnQsIDB4MWEsIDEsIDEpOworCQkJfSBlbHNlIHsKKwkJCQlidDgxOV9zZXRiaXQoY2xpZW50LCAweDBiLCA2LCAxKTsKKwkJCQlidDgxOV9zZXRiaXQoY2xpZW50LCAweDFhLCAxLCAwKTsKKwkJCX0KKwkJfQorCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfU0VUX09VVFBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHNldCBvdXRwdXQgJXhcbiIsIEkyQ19OQU1FKGNsaWVudCksCisJCQkqaWFyZyk7CisKKwkJLyogbm90IG11Y2ggY2hvaWNlIG9mIG91dHB1dHMgKi8KKwkJaWYgKCppYXJnICE9IDApIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9FTkFCTEVfT1VUUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCQlpbnQgZW5hYmxlID0gKCppYXJnICE9IDApOworCisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogZW5hYmxlIG91dHB1dCAleFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksICppYXJnKTsKKworCQlpZiAoZGVjb2Rlci0+ZW5hYmxlICE9IGVuYWJsZSkgeworCQkJZGVjb2Rlci0+ZW5hYmxlID0gZW5hYmxlOworCisJCQlpZiAoZGVjb2Rlci0+ZW5hYmxlKSB7CisJCQkJYnQ4MTlfc2V0Yml0KGNsaWVudCwgMHgxNiwgNywgMCk7CisJCQl9IGVsc2UgeworCQkJCWJ0ODE5X3NldGJpdChjbGllbnQsIDB4MTYsIDcsIDEpOworCQkJfQorCQl9CisJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfUElDVFVSRToKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwaWMgPSBhcmc7CisKKwkJZHByaW50aygxLAorCQkJS0VSTl9JTkZPCisJCQkiJXM6IHNldCBwaWN0dXJlIGJyaWdodG5lc3MgJWQgY29udHJhc3QgJWQgY29sb3VyICVkXG4iLAorCQkJSTJDX05BTUUoY2xpZW50KSwgcGljLT5icmlnaHRuZXNzLCBwaWMtPmNvbnRyYXN0LAorCQkJcGljLT5jb2xvdXIpOworCisKKwkJaWYgKGRlY29kZXItPmJyaWdodCAhPSBwaWMtPmJyaWdodG5lc3MpIHsKKwkJCS8qIFdlIHdhbnQgLTEyOCB0byAxMjcgd2UgZ2V0IDAtNjU1MzUgKi8KKwkJCWRlY29kZXItPmJyaWdodCA9IHBpYy0+YnJpZ2h0bmVzczsKKwkJCWJ0ODE5X3dyaXRlKGNsaWVudCwgMHgwYSwKKwkJCQkgICAgKGRlY29kZXItPmJyaWdodCA+PiA4KSAtIDEyOCk7CisJCX0KKworCQlpZiAoZGVjb2Rlci0+Y29udHJhc3QgIT0gcGljLT5jb250cmFzdCkgeworCQkJLyogV2Ugd2FudCAwIHRvIDUxMSB3ZSBnZXQgMC02NTUzNSAqLworCQkJZGVjb2Rlci0+Y29udHJhc3QgPSBwaWMtPmNvbnRyYXN0OworCQkJYnQ4MTlfd3JpdGUoY2xpZW50LCAweDBjLAorCQkJCSAgICAoZGVjb2Rlci0+Y29udHJhc3QgPj4gNykgJiAweGZmKTsKKwkJCWJ0ODE5X3NldGJpdChjbGllbnQsIDB4MGIsIDIsCisJCQkJICAgICAoKGRlY29kZXItPmNvbnRyYXN0ID4+IDE1KSAmIDB4MDEpKTsKKwkJfQorCisJCWlmIChkZWNvZGVyLT5zYXQgIT0gcGljLT5jb2xvdXIpIHsKKwkJCS8qIFdlIHdhbnQgMCB0byA1MTEgd2UgZ2V0IDAtNjU1MzUgKi8KKwkJCWRlY29kZXItPnNhdCA9IHBpYy0+Y29sb3VyOworCQkJYnQ4MTlfd3JpdGUoY2xpZW50LCAweDBkLAorCQkJCSAgICAoZGVjb2Rlci0+c2F0ID4+IDcpICYgMHhmZik7CisJCQlidDgxOV9zZXRiaXQoY2xpZW50LCAweDBiLCAxLAorCQkJCSAgICAgKChkZWNvZGVyLT5zYXQgPj4gMTUpICYgMHgwMSkpOworCisJCQl0ZW1wID0gKGRlY29kZXItPnNhdCAqIDIwMSkgLyAyMzc7CisJCQlidDgxOV93cml0ZShjbGllbnQsIDB4MGUsICh0ZW1wID4+IDcpICYgMHhmZik7CisJCQlidDgxOV9zZXRiaXQoY2xpZW50LCAweDBiLCAwLCAodGVtcCA+PiAxNSkgJiAweDAxKTsKKwkJfQorCisJCWlmIChkZWNvZGVyLT5odWUgIT0gcGljLT5odWUpIHsKKwkJCS8qIFdlIHdhbnQgLTEyOCB0byAxMjcgd2UgZ2V0IDAtNjU1MzUgKi8KKwkJCWRlY29kZXItPmh1ZSA9IHBpYy0+aHVlOworCQkJYnQ4MTlfd3JpdGUoY2xpZW50LCAweDBmLAorCQkJCSAgICAxMjggLSAoZGVjb2Rlci0+aHVlID4+IDgpKTsKKwkJfQorCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEdlbmVyaWMgaTJjIHByb2JlCisgKiBjb25jZXJuaW5nIHRoZSBhZGRyZXNzZXM6IGkyYyB3YW50cyA3IGJpdCAod2l0aG91dCB0aGUgci93IGJpdCksIHNvICc+PjEnCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7CisJSTJDX0JUODE5ID4+IDEsCisJSTJDX0NMSUVOVF9FTkQsCit9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb2JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZV9yYW5nZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmVfcmFuZ2VbMl0gPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlWzJdID0geyBJMkNfQ0xJRU5UX0VORCAsIEkyQ19DTElFTlRfRU5EIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKKwkubm9ybWFsX2kyY19yYW5nZQk9IG5vcm1hbF9pMmNfcmFuZ2UsCisJLnByb2JlCQkJPSBwcm9iZSwKKwkucHJvYmVfcmFuZ2UJCT0gcHJvYmVfcmFuZ2UsCisJLmlnbm9yZQkJCT0gaWdub3JlLAorCS5pZ25vcmVfcmFuZ2UJCT0gaWdub3JlX3JhbmdlLAorCS5mb3JjZQkJCT0gZm9yY2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX2J0ODE5OworCitzdGF0aWMgaW50CitidDgxOV9kZXRlY3RfY2xpZW50IChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCSAgICAgaW50ICAgICAgICAgICAgICAgICBhZGRyZXNzLAorCQkgICAgIGludCAgICAgICAgICAgICAgICAga2luZCkKK3sKKwlpbnQgaSwgaWQ7CisJc3RydWN0IGJ0ODE5ICpkZWNvZGVyOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisKKwlkcHJpbnRrKDEsCisJCUtFUk5fSU5GTworCQkic2FhNzExMS5jOiBkZXRlY3RpbmcgYnQ4MTkgY2xpZW50IG9uIGFkZHJlc3MgMHgleFxuIiwKKwkJYWRkcmVzcyA8PCAxKTsKKworCS8qIENoZWNrIGlmIHRoZSBhZGFwdGVyIHN1cHBvcnRzIHRoZSBuZWVkZWQgZmVhdHVyZXMgKi8KKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCXJldHVybiAwOworCisJY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2xpZW50ID09IDApCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX2J0ODE5OworCWNsaWVudC0+ZmxhZ3MgPSBJMkNfQ0xJRU5UX0FMTE9XX1VTRTsKKworCWRlY29kZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnQ4MTkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGVjb2RlciA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChkZWNvZGVyLCAwLCBzaXplb2Yoc3RydWN0IGJ0ODE5KSk7CisJZGVjb2Rlci0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKKwlkZWNvZGVyLT5pbnB1dCA9IDA7CisJZGVjb2Rlci0+ZW5hYmxlID0gMTsKKwlkZWNvZGVyLT5icmlnaHQgPSAzMjc2ODsKKwlkZWNvZGVyLT5jb250cmFzdCA9IDMyNzY4OworCWRlY29kZXItPmh1ZSA9IDMyNzY4OworCWRlY29kZXItPnNhdCA9IDMyNzY4OworCWRlY29kZXItPmluaXRpYWxpemVkID0gMDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkZWNvZGVyKTsKKworCWlkID0gYnQ4MTlfcmVhZChjbGllbnQsIDB4MTcpOworCXN3aXRjaCAoaWQgJiAweGYwKSB7CisJY2FzZSAweDcwOgorCQlzdHJsY3B5KEkyQ19OQU1FKGNsaWVudCksICJidDgxOWEiLCBzaXplb2YoSTJDX05BTUUoY2xpZW50KSkpOworCQlicmVhazsKKwljYXNlIDB4NjA6CisJCXN0cmxjcHkoSTJDX05BTUUoY2xpZW50KSwgImJ0ODE3YSIsIHNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CisJCWJyZWFrOworCWNhc2UgMHgyMDoKKwkJc3RybGNweShJMkNfTkFNRShjbGllbnQpLCAiYnQ4MTVhIiwgc2l6ZW9mKEkyQ19OQU1FKGNsaWVudCkpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSJidDgxOTogdW5rbm93biBjaGlwIHZlcnNpb24gMHgleCAodmVyIDB4JXgpXG4iLAorCQkJaWQgJiAweGYwLCBpZCAmIDB4MGYpOworCQlrZnJlZShkZWNvZGVyKTsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaSA9IGkyY19hdHRhY2hfY2xpZW50KGNsaWVudCk7CisJaWYgKGkpIHsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZGVjb2Rlcik7CisJCXJldHVybiBpOworCX0KKworCWkgPSBidDgxOV9pbml0KGNsaWVudCk7CisJaWYgKGkgPCAwKSB7CisJCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzX2F0dGFjaDogaW5pdCBzdGF0dXMgJWRcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBpKTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0lORk8KKwkJCSIlc19hdHRhY2g6IGNoaXAgdmVyc2lvbiAweCV4IGF0IGFkZHJlc3MgMHgleFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIGlkICYgMHgwZiwKKwkJCWNsaWVudC0+YWRkciA8PCAxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYnQ4MTlfYXR0YWNoX2FkYXB0ZXIgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsICZidDgxOV9kZXRlY3RfY2xpZW50KTsKK30KKworc3RhdGljIGludAorYnQ4MTlfZGV0YWNoX2NsaWVudCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYnQ4MTkgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoZGVjb2Rlcik7CisJa2ZyZWUoY2xpZW50KTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9idDgxOSA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJidDgxOSIsCisKKwkuaWQgPSBJMkNfRFJJVkVSSURfQlQ4MTksCisJLmZsYWdzID0gSTJDX0RGX05PVElGWSwKKworCS5hdHRhY2hfYWRhcHRlciA9IGJ0ODE5X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50ID0gYnQ4MTlfZGV0YWNoX2NsaWVudCwKKwkuY29tbWFuZCA9IGJ0ODE5X2NvbW1hbmQsCit9OworCitzdGF0aWMgaW50IF9faW5pdAorYnQ4MTlfaW5pdF9tb2R1bGUgKHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX2J0ODE5KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitidDgxOV9leGl0ICh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZpMmNfZHJpdmVyX2J0ODE5KTsKK30KKworbW9kdWxlX2luaXQoYnQ4MTlfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYnQ4MTlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlNjA1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MzIuYwpAQCAtMCwwICsxLDI3MSBAQAorLyogRHJpdmVyIGZvciBCdDgzMiBDTU9TIENhbWVyYSBWaWRlbyBQcm9jZXNzb3IKKyAgICBpMmMtYWRkcmVzc2VzOiAweDg4IG9yIDB4OGEKKworICBUaGUgQlQ4MzIgaW50ZXJmYWNlcyB0byBhIFF1YXJ0enNpZ2h0IERpZ2l0YWwgQ2FtZXJhICgzNTJ4Mjg4LCAyNSBvciAzMCBmcHMpCisgIHZpYSBhIDkgcGluIGNvbm5lY3RvciAoIDQtd2lyZSBTREFUQSwgMi13aXJlIGkyYywgU0NMSywgVkNDLCBHTkQpLgorICBJdCBvdXRwdXRzIGFuIDgtYml0IDQ6MjoyIFlVViBvciBZQ3JDYiB2aWRlbyBzaWduYWwgd2hpY2ggY2FuIGJlIGRpcmVjdGx5CisgIGNvbm5lY3RlZCB0byBidDg0OC9idDg3OCBHUElPIHBpbnMgb24gdGhpcyBwdXJwb3NlLgorICAoc2VlOiBWTFNJIFZpc2lvbiBMdGQuIHd3dy52dmwuY28udWsgZm9yIGNhbWVyYSBkYXRhc2hlZXRzKQorICAKKyAgU3VwcG9ydGVkIENhcmRzOgorICAtICBQaXhlbHZpZXcgUmV2LjRFOiAweDhhCisJCUdQSU8gMHg0MDAwMDAgdG9nZ2xlcyBCdDgzMiBSRVNFVCwgYW5kIHRoZSBjaGlwIGNoYW5nZXMgdG8gaTJjIDB4ODggIQorCisgIChjKSBHdW50aGVyIE1heWVyLCAyMDAyCisKKyAgU1RBVFVTOgorICAtIGRldGVjdCBjaGlwIGFuZCBoZXhkdW1wCisgIC0gcmVzZXQgY2hpcCBhbmQgbGVhdmUgbG93IHBvd2VyIG1vZGUKKyAgLSBkZXRlY3QgY2FtZXJhIHByZXNlbnQKKworICBUT0RPOgorICAtIG1ha2UgaXQgd29yayAoZmluZCBjb3JyZWN0IHNldHVwIGZvciBCdDgzMiBhbmQgQnQ4NzgpCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgImlkLmgiCisjaW5jbHVkZSAiYXVkaW9jaGlwLmgiCisjaW5jbHVkZSAiYnR0di5oIgorI2luY2x1ZGUgImJ0ODMyLmgiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7STJDX0NMSUVOVF9FTkR9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHtJMkNfQlQ4MzJfQUxUMT4+MSxJMkNfQlQ4MzJfQUxUMj4+MSxJMkNfQ0xJRU5UX0VORH07CitJMkNfQ0xJRU5UX0lOU01PRDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIGRwcmludGsgICAgIGlmIChkZWJ1ZykgcHJpbnRrCisKK3N0YXRpYyBpbnQgYnQ4MzJfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXI7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOworCitzdHJ1Y3QgYnQ4MzIgeworICAgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7Cit9OworCitpbnQgYnQ4MzJfaGV4ZHVtcChzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudF9zLCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJaW50IGkscmM7CisJYnVmWzBdPTB4ODA7IC8vIHN0YXJ0IGF0IHJlZ2lzdGVyIDAgd2l0aCBhdXRvLWluY3JlbWVudAorICAgICAgICBpZiAoMSAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoaTJjX2NsaWVudF9zLGJ1ZiwxKSkpCisgICAgICAgICAgICAgICAgcHJpbnRrKCJidDgzMjogaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIixyYyk7CisKKyAgICAgICAgZm9yKGk9MDtpPDY1O2krKykKKyAgICAgICAgICAgICAgICBidWZbaV09MDsKKyAgICAgICAgaWYgKDY1ICE9IChyYz1pMmNfbWFzdGVyX3JlY3YoaTJjX2NsaWVudF9zLGJ1Ziw2NSkpKQorICAgICAgICAgICAgICAgIHByaW50aygiYnQ4MzI6IGkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgNjUpXG4iLHJjKTsKKworICAgICAgICAvLyBOb3RlOiBPbiBSRUFEIHRoZSBmaXJzdCBieXRlIGlzIHRoZSBjdXJyZW50IGluZGV4CisgICAgICAgIC8vICAoZS5nLiAweDgwLCB3aGF0IHdlIGp1c3Qgd3JvdGUpCisKKyAgICAgICAgaWYoMSkgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIHByaW50aygiQlQ4MzIgaGV4ZHVtcDpcbiIpOworICAgICAgICAgICAgICAgIGZvcihpPTE7aTw2NTtpKyspIHsKKwkJCWlmKGkhPTEpIHsKKwkJCSAgaWYoKChpLTEpJTgpPT0wKSBwcmludGsoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChpLTEpJTE2KT09MCkgcHJpbnRrKCJcbiIpOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgJTAyeCIsYnVmW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICB9CisJcmV0dXJuIDA7Cit9CisKKy8vIFJldHVybjogMSAoaXMgYSBidDgzMiksIDAgKE5vIGJ0ODMyIGhlcmUpCitpbnQgYnQ4MzJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudF9zKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgcmM7CisKKwlidWY9a21hbGxvYyg2NSxHRlBfS0VSTkVMKTsKKwlidDgzMl9oZXhkdW1wKGkyY19jbGllbnRfcyxidWYpOworCQorCWlmKGJ1ZlsweDQwXSAhPSAweDMxKSB7CisJCXByaW50aygiYnQ4MzI6IHRoaXMgaTJjIGNoaXAgaXMgbm8gYnQ4MzIgKGlkPSUwMngpLiBEZXRhY2hpbmcuXG4iLGJ1ZlsweDQwXSk7CisJCWtmcmVlKGJ1Zik7CisJCXJldHVybiAwOworCX0KKworICAgICAgICBwcmludGsoIldyaXRlIDAgdHAgVlBTVEFUVVNcbiIpOworICAgICAgICBidWZbMF09QlQ4MzJfVlBfU1RBVFVTOyAvLyBSZWcuNTIKKyAgICAgICAgYnVmWzFdPSAweDAwOworICAgICAgICBpZiAoMiAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoaTJjX2NsaWVudF9zLGJ1ZiwyKSkpCisgICAgICAgICAgICAgICAgcHJpbnRrKCJidDgzMjogaTJjIGkvbyBlcnJvciBWUFM6IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOworCisgICAgICAgIGJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7CisKKworCS8vIExlYXZlIGxvdyBwb3dlciBtb2RlOgorCXByaW50aygiQnQ4MzI6IGxlYXZlIGxvdyBwb3dlciBtb2RlLlxuIik7CisJYnVmWzBdPUJUODMyX0NBTV9TRVRVUDA7IC8vMHgzOSA1NworCWJ1ZlsxXT0weDA4OworCWlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKKyAgICAgICAgICAgICAgICBwcmludGsoImJ0ODMyOiBpMmMgaS9vIGVycm9yIExMUE06IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOworCisgICAgICAgIGJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7CisKKwlwcmludGsoIldyaXRlIDAgdHAgVlBTVEFUVVNcbiIpOworICAgICAgICBidWZbMF09QlQ4MzJfVlBfU1RBVFVTOyAvLyBSZWcuNTIKKyAgICAgICAgYnVmWzFdPSAweDAwOworICAgICAgICBpZiAoMiAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoaTJjX2NsaWVudF9zLGJ1ZiwyKSkpCisgICAgICAgICAgICAgICAgcHJpbnRrKCJidDgzMjogaTJjIGkvbyBlcnJvciBWUFM6IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOworCisgICAgICAgIGJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7CisKKworCS8vIEVuYWJsZSBPdXRwdXQKKwlwcmludGsoIkVuYWJsZSBPdXRwdXRcbiIpOworCWJ1ZlswXT1CVDgzMl9WUF9DT05UUk9MMTsgLy8gUmVnLjQwCisJYnVmWzFdPSAweDI3ICYgKH4weDAxKTsgLy8gRGVmYXVsdCB8ICFza2lwCisJaWYgKDIgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGkyY19jbGllbnRfcyxidWYsMikpKQorICAgICAgICAgICAgICAgIHByaW50aygiYnQ4MzI6IGkyYyBpL28gZXJyb3IgRU86IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOworCQorICAgICAgICBidDgzMl9oZXhkdW1wKGkyY19jbGllbnRfcyxidWYpOworCisjaWYgMAorCS8vIEZ1bGwgMzAvMjUgRnJhbWUgcmF0ZQorCXByaW50aygiRnVsbCAzMC8yNSBGcmFtZSByYXRlXG4iKTsKKwlidWZbMF09QlQ4MzJfVlBfQ09OVFJPTDA7IC8vIFJlZy4zOQorICAgICAgICBidWZbMV09IDB4MDA7CisgICAgICAgIGlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKKyAgICAgICAgICAgICAgICBwcmludGsoImJ0ODMyOiBpMmMgaS9vIGVycm9yIEZGUjogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIixyYyk7CisKKyAgICAgICAgYnQ4MzJfaGV4ZHVtcChpMmNfY2xpZW50X3MsYnVmKTsKKyNlbmRpZgorCisjaWYgMQorCS8vIGZvciB0ZXN0aW5nIChldmVuIHdvcmtzIHdoZW4gbm8gY2FtZXJhIGF0dGFjaGVkKQorCXByaW50aygiYnQ4MzI6ICoqKiBHZW5lcmF0ZSBOVFNDIE0gQmFycyAqKioqKlxuIik7CisJYnVmWzBdPUJUODMyX1ZQX1RFU1RDT05UUk9MMDsgLy8gUmVnLiA0MgorCWJ1ZlsxXT0zOyAvLyBHZW5lcmF0ZSBOVFNDIFN5c3RlbSBNIGJhcnMsIEdlbmVyYXRlIEZyYW1lIHRpbWluZyBpbnRlcm5hbGx5CisgICAgICAgIGlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKKyAgICAgICAgICAgICAgICBwcmludGsoImJ0ODMyOiBpMmMgaS9vIGVycm9yIE1CQVI6IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOworI2VuZGlmCisKKwlwcmludGsoIkJ0ODMyOiBDYW1lcmEgUHJlc2VudDogJXNcbiIsCisJCShidWZbMStCVDgzMl9DQU1fU1RBVFVTXSAmIEJUODMyXzU2X0NBTUVSQV9QUkVTRU5UKSA/ICJ5ZXMiOiJubyIpOworCisgICAgICAgIGJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gMTsKK30KKworCisKK3N0YXRpYyBpbnQgYnQ4MzJfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsCisJCQkgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgYnQ4MzIgKnQ7CisKKwlwcmludGsoImJ0ODMyX2F0dGFjaFxuIik7CisKKyAgICAgICAgY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOworICAgICAgICBjbGllbnRfdGVtcGxhdGUuYWRkciAgICA9IGFkZHI7CisKKyAgICAgICAgcHJpbnRrKCJidDgzMjogY2hpcCBmb3VuZCBAIDB4JXhcbiIsIGFkZHI8PDEpOworCisgICAgICAgIGlmIChOVUxMID09ICh0ID0ga21hbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHQsMCxzaXplb2YoKnQpKTsKKwl0LT5jbGllbnQgPSBjbGllbnRfdGVtcGxhdGU7CisgICAgICAgIHQtPmNsaWVudC5kYXRhID0gdDsKKyAgICAgICAgaTJjX2F0dGFjaF9jbGllbnQoJnQtPmNsaWVudCk7CisKKwlpZighIGJ0ODMyX2luaXQoJnQtPmNsaWVudCkpIHsKKwkJYnQ4MzJfZGV0YWNoKCZ0LT5jbGllbnQpOworCQlyZXR1cm4gLTE7CisJfQorICAgICAgICAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidDgzMl9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBidDgzMl9hdHRhY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0ODMyX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBidDgzMiAqdCA9IChzdHJ1Y3QgYnQ4MzIqKWNsaWVudC0+ZGF0YTsKKworCXByaW50aygiYnQ4MzI6IGRldGFjaC5cbiIpOworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUodCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2J0ODMyX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBidDgzMiAqdCA9IChzdHJ1Y3QgYnQ4MzIqKWNsaWVudC0+ZGF0YTsKKworCXByaW50aygiYnQ4MzI6IGNvbW1hbmQgJXhcbiIsY21kKTsKKworICAgICAgICBzd2l0Y2ggKGNtZCkgeworCQljYXNlIEJUODMyX0hFWERVTVA6IHsKKwkJCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwkJCWJ1Zj1rbWFsbG9jKDY1LEdGUF9LRVJORUwpOworCQkJYnQ4MzJfaGV4ZHVtcCgmdC0+Y2xpZW50LGJ1Zik7CisJCQlrZnJlZShidWYpOworCQl9CisJCWJyZWFrOworCQljYXNlIEJUODMyX1JFQVRUQUNIOgorCQkJcHJpbnRrKCJidDgzMjogcmUtYXR0YWNoXG4iKTsKKwkJCWkyY19kZWxfZHJpdmVyKCZkcml2ZXIpOworCQkJaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImkyYyBidDgzMiBkcml2ZXIiLAorICAgICAgICAuaWQgICAgICAgICAgICAgPSAtMSwgLyogRklYTUUgKi8KKyAgICAgICAgLmZsYWdzICAgICAgICAgID0gSTJDX0RGX05PVElGWSwKKyAgICAgICAgLmF0dGFjaF9hZGFwdGVyID0gYnQ4MzJfcHJvYmUsCisgICAgICAgIC5kZXRhY2hfY2xpZW50ICA9IGJ0ODMyX2RldGFjaCwKKyAgICAgICAgLmNvbW1hbmQgICAgICAgID0gYnQ4MzJfY29tbWFuZCwKK307CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0KK3sKKyAgICAgICAgLm5hbWUgICA9ICJidDgzMiIsCisJLmZsYWdzICA9IEkyQ19DTElFTlRfQUxMT1dfVVNFLAorICAgICAgICAuZHJpdmVyID0gJmRyaXZlciwKK307CisKKworaW50IGJ0ODMyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ0ODMyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGJ0ODMyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGJ0ODMyX2NsZWFudXBfbW9kdWxlKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOThjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODMyLmgKQEAgLTAsMCArMSwzMDUgQEAKKy8qIEJ0ODMyIENNT1MgQ2FtZXJhIFZpZGVvIFByb2Nlc3NvciAoVlApCisKKyBUaGUgQnQ4MzIgQ01PUyBDYW1lcmEgVmlkZW8gUHJvY2Vzc29yIGNoaXAgY29ubmVjdHMgYSBRdWFydHNpZ2h0IENNT1MgCisgIGNvbG9yIGRpZ2l0YWwgY2FtZXJhIGRpcmVjdGx5IHRvIHZpZGVvIGNhcHR1cmUgZGV2aWNlcyB2aWEgYW4gOC1iaXQsCisgIDQ6MjoyIFlVViBvciBZQ3JDYiB2aWRlbyBpbnRlcmZhY2UuCisKKyBpMmMgYWRkcmVzc2VzOiAweDg4IG9yIDB4OGEKKyAqLworCisvKiBUaGUgNjQgcmVnaXN0ZXJzOiAqLworCisvLyBJbnB1dCBQcm9jZXNzb3IKKyNkZWZpbmUgQlQ4MzJfT0ZGU0VUIDAKKyNkZWZpbmUgQlQ4MzJfUkNPTVAJMQorI2RlZmluZSBCVDgzMl9HMUNPTVAJMgorI2RlZmluZSBCVDgzMl9HMkNPTVAJMworI2RlZmluZSBCVDgzMl9CQ09NUAk0CisvLyBFeHBvc3VyZXM6CisjZGVmaW5lIEJUODMyX0ZJTkVICTUKKyNkZWZpbmUgQlQ4MzJfRklORUwJNgorI2RlZmluZSBCVDgzMl9DT0FSU0VICTcKKyNkZWZpbmUgQlQ4MzJfQ09BUlNFTCAgIDgKKyNkZWZpbmUgQlQ4MzJfQ0FNR0FJTgk5CisvLyBNYWluIFByb2Nlc3NvcjoKKyNkZWZpbmUgQlQ4MzJfTTAwCTEwCisjZGVmaW5lIEJUODMyX00wMQkxMQorI2RlZmluZSBCVDgzMl9NMDIJMTIKKyNkZWZpbmUgQlQ4MzJfTTEwCTEzCisjZGVmaW5lIEJUODMyX00xMQkxNAorI2RlZmluZSBCVDgzMl9NMTIJMTUKKyNkZWZpbmUgQlQ4MzJfTTIwCTE2CisjZGVmaW5lIEJUODMyX00yMQkxNworI2RlZmluZSBCVDgzMl9NMjIJMTgKKyNkZWZpbmUgQlQ4MzJfQVBDT1IJMTkKKyNkZWZpbmUgQlQ4MzJfR0FNQ09SCTIwCisvLyBMZXZlbCBBY2N1bXVsYXRvciBJbnB1dHMKKyNkZWZpbmUgQlQ4MzJfVlBDT05UUk9MMgkyMQorI2RlZmluZSBCVDgzMl9aT05FQ09ERTAJMjIKKyNkZWZpbmUgQlQ4MzJfWk9ORUNPREUxCTIzCisjZGVmaW5lIEJUODMyX1pPTkVDT0RFMgkyNAorI2RlZmluZSBCVDgzMl9aT05FQ09ERTMJMjUKKy8vIExldmVsIEFjY3VtdWxhdG9yIE91dHB1dHM6CisjZGVmaW5lIEJUODMyX1JBQ0MJMjYKKyNkZWZpbmUgQlQ4MzJfR0FDQwkyNworI2RlZmluZSBCVDgzMl9CQUNDCTI4CisjZGVmaW5lIEJUODMyX0JMQUNLQUNDCTI5CisjZGVmaW5lIEJUODMyX0VYUF9BR0MJMzAKKyNkZWZpbmUgQlQ4MzJfTEFDQzAJMzEKKyNkZWZpbmUgQlQ4MzJfTEFDQzEJMzIKKyNkZWZpbmUgQlQ4MzJfTEFDQzIJMzMKKyNkZWZpbmUgQlQ4MzJfTEFDQzMJMzQKKyNkZWZpbmUgQlQ4MzJfTEFDQzQJMzUKKyNkZWZpbmUgQlQ4MzJfTEFDQzUJMzYKKyNkZWZpbmUgQlQ4MzJfTEFDQzYJMzcKKyNkZWZpbmUgQlQ4MzJfTEFDQzcJMzgKKy8vIFN5c3RlbToKKyNkZWZpbmUgQlQ4MzJfVlBfQ09OVFJPTDAJMzkKKyNkZWZpbmUgQlQ4MzJfVlBfQ09OVFJPTDEJNDAKKyNkZWZpbmUgQlQ4MzJfVEhSRVNICTQxCisjZGVmaW5lIEJUODMyX1ZQX1RFU1RDT05UUk9MMAk0MgorI2RlZmluZSBCVDgzMl9WUF9ETUNPREUJNDMKKyNkZWZpbmUgQlQ4MzJfQUNCX0NPTkZJRwk0NAorI2RlZmluZSBCVDgzMl9BQ0JfR05CQVNFCTQ1CisjZGVmaW5lIEJUODMyX0FDQl9NVQk0NgorI2RlZmluZSBCVDgzMl9DQU1fVEVTVDAJNDcKKyNkZWZpbmUgQlQ4MzJfQUVDX0NPTkZJRwk0OAorI2RlZmluZSBCVDgzMl9BRUNfVEwJNDkKKyNkZWZpbmUgQlQ4MzJfQUVDX1RDCTUwCisjZGVmaW5lIEJUODMyX0FFQ19USAk1MQorLy8gU3RhdHVzOgorI2RlZmluZSBCVDgzMl9WUF9TVEFUVVMJNTIKKyNkZWZpbmUgQlQ4MzJfVlBfTElORUNPVU5UCTUzCisjZGVmaW5lIEJUODMyX0NBTV9ERVZJQ0VMCTU0IC8vIGUuZy4gMHgxOQorI2RlZmluZSBCVDgzMl9DQU1fREVWSUNFSAk1NSAvLyBlLmcuIDB4NDAgID09IDB4MTk0IE1hc2swLCAweDE5NCA9IDQwNCBkZWNpbWFsIChWVkwtNDA0IGNhbWVyYSkKKyNkZWZpbmUgQlQ4MzJfQ0FNX1NUQVRVUwkJNTYKKyAjZGVmaW5lIEJUODMyXzU2X0NBTUVSQV9QUkVTRU5UIDB4MjAKKy8vQ2FtZXJhIFNldHVwczoKKyNkZWZpbmUgQlQ4MzJfQ0FNX1NFVFVQMAk1NworI2RlZmluZSBCVDgzMl9DQU1fU0VUVVAxCTU4CisjZGVmaW5lIEJUODMyX0NBTV9TRVRVUDIJNTkKKyNkZWZpbmUgQlQ4MzJfQ0FNX1NFVFVQMwk2MAorLy8gU3lzdGVtOgorI2RlZmluZSBCVDgzMl9ERUZDT1IJCTYxCisjZGVmaW5lIEJUODMyX1ZQX1RFU1RDT05UUk9MMQk2MgorI2RlZmluZSBCVDgzMl9ERVZJQ0VfSUQJCTYzCisjIGRlZmluZSBCVDgzMl9ERVZJQ0VfSURfXzMxCQkweDMxIC8vIEJ0ODMyIGhhcyBJRCAweDMxCisKKy8qIFNUTWljcm9lbGVjdHJvbml2Y3MgVlY1NDA0IGNhbWVyYSBtb2R1bGUgCisgICBpMmM6IDB4MjA6IHNlbnNvciBhZGRyZXNzCisgICBpMmM6IDB4YTA6IGVlcHJvbSBmb3IgY2NkIGRlZmVjdCBtYXAKKyAqLworI2RlZmluZSBWVjU0MDRfZGV2aWNlX2gJCTB4MDAgIC8vIDB4MTkKKyNkZWZpbmUgVlY1NDA0X2RldmljZV9sCQkweDAxICAvLyAweDQwCisjZGVmaW5lIFZWNTQwNF9zdGF0dXMwCQkweDAyCisjZGVmaW5lIFZWNTQwNF9saW5lY291bnRjCTB4MDMgLy8gY3VycmVudCBsaW5lIGNvdW50ZXIKKyNkZWZpbmUgVlY1NDA0X2xpbmVjb3VudGwJMHgwNAorI2RlZmluZSBWVjU0MDRfc2V0dXAwCQkweDEwCisjZGVmaW5lIFZWNTQwNF9zZXR1cDEJCTB4MTEKKyNkZWZpbmUgVlY1NDA0X3NldHVwMgkJMHgxMgorI2RlZmluZSBWVjU0MDRfc2V0dXA0CQkweDE0CisjZGVmaW5lIFZWNTQwNF9zZXR1cDUJCTB4MTUKKyNkZWZpbmUgVlY1NDA0X2ZpbmVfaAkJMHgyMCAgLy8gZmluZSBleHBvc3VyZQorI2RlZmluZSBWVjU0MDRfZmluZV9sCQkweDIxCisjZGVmaW5lIFZWNTQwNF9jb2Fyc2VfaAkJMHgyMiAgLy9jb2Fyc2UgZXhwb3N1cmUKKyNkZWZpbmUgVlY1NDA0X2NvYXJzZV9sCQkweDIzCisjZGVmaW5lIFZWNTQwNF9nYWluCQkweDI0IC8vIEFEQyBwcmUtYW1wIGdhaW4gc2V0dGluZworI2RlZmluZSBWVjU0MDRfY2xrX2RpdgkJMHgyNQorI2RlZmluZSBWVjU0MDRfY3IJCTB4NzYgLy8gY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBWVjU0MDRfYXMwCQkweDc3IC8vIEFEQyBzZXR1cCByZWdpc3RlcgorCisKKy8vIElPQ1RMCisjZGVmaW5lIEJUODMyX0hFWERVTVAgICBfSU9SKCdiJywxLGludCkKKyNkZWZpbmUgQlQ4MzJfUkVBVFRBQ0gJX0lPUignYicsMixpbnQpCisKKy8qIGZyb20gQlQ4eDhWWEQvY2FwZHJ2L2RpYWxvZ3MuY3BwICovCisKKy8qCit0eXBlZGVmIGVudW0geyBTVkksIExvZ2l0ZWNoLCBSb2Nrd2VsbCB9IENBTUVSQTsKKworc3RhdGljIENPTUJPQk9YX0VOVFJZIGd3Q2FtZXJhT3B0aW9uc1tdID0KK3sKKyAgIHsgU1ZJLCAgICAgICJTaWxpY29uIFZpc2lvbiA1MTJOIiB9LAorICAgeyBMb2dpdGVjaCwgIkxvZ2l0ZWNoIFZpZGVvTWFuIDEuMyIgIH0sCisgICB7IFJvY2t3ZWxsLCAiUm9ja3dlbGwgUXVhcnR6U2lnaHQgUENJIDEuMCIgICB9Cit9OworCisvLyBTUkFNIHRhYmxlIHZhbHVlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgZW51bSB7IFRHQl9OVFNDNjI0LCBUR0JfTlRTQzc4MCwgVEdCX05UU0M4NTgsIFRHQl9OVFNDMzkyIH0gVGltZUdlbkJ5dGU7CisKK0JZVEUgU1JBTVRhYmxlW11bIDYwIF0gPQoreworICAgLy8gVEdCX05UU0M2MjQKKyAgIHsKKyAgICAgIDB4MzMsIC8vIHNpemUgb2YgdGFibGUgPSA1MQorICAgICAgMHgwRSwgMHhDMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHgwMiwgMHgwMywgMHgxMCwgMHgwMywgMHgwNiwKKyAgICAgIDB4MTAsIDB4MDQsIDB4MTIsIDB4MTIsIDB4MDUsIDB4MDIsIDB4MTMsIDB4MDQsIDB4MTksIDB4MDAsCisgICAgICAweDA0LCAweDM5LCAweDAwLCAweDA2LCAweDU5LCAweDA4LCAweDAzLCAweDg1LCAweDA4LCAweDA3LAorICAgICAgMHgwMywgMHg1MCwgMHgwMCwgMHg5MSwgMHg0MCwgMHgwMCwgMHgxMSwgMHgwMSwgMHgwMSwgMHg0RCwKKyAgICAgIDB4MEQsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDEsIDB4MDUsIDB4MzcsIDB4MDAsIDB4MzcsIDB4MjEsIDB4MDAKKyAgIH0sCisgICAvLyBUR0JfTlRTQzc4MAorICAgeworICAgICAgMHgzMywgLy8gc2l6ZSBvZiB0YWJsZSA9IDUxCisgICAgICAweDBlLCAweGMwLCAweDAwLCAweDAwLCAweDkwLCAweGUyLCAweDAzLCAweDEwLCAweDAzLCAweDA2LAorICAgICAgMHgxMCwgMHgzNCwgMHgxMiwgMHgxMiwgMHg2NSwgMHgwMiwgMHgxMywgMHgyNCwgMHgxOSwgMHgwMCwKKyAgICAgIDB4MjQsIDB4MzksIDB4MDAsIDB4OTYsIDB4NTksIDB4MDgsIDB4OTMsIDB4ODUsIDB4MDgsIDB4OTcsCisgICAgICAweDAzLCAweDUwLCAweDUwLCAweGFmLCAweDQwLCAweDMwLCAweDVmLCAweDAxLCAweGYxLCAweDdmLAorICAgICAgMHgwZCwgMHhmMiwgMHgwMywgMHgxMSwgMHhmMSwgMHgwNSwgMHgzNywgMHgzMCwgMHg4NSwgMHgyMSwgMHg1MAorICAgfSwKKyAgIC8vIFRHQl9OVFNDODU4CisgICB7CisgICAgICAweDMzLCAvLyBzaXplIG9mIHRhYmxlID0gNTEKKyAgICAgIDB4MGMsIDB4YzAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4YzIsIDB4MDMsIDB4MTAsIDB4MDMsIDB4MDYsCisgICAgICAweDEwLCAweDM0LCAweDEyLCAweDEyLCAweDY1LCAweDAyLCAweDEzLCAweDI0LCAweDE5LCAweDAwLAorICAgICAgMHgyNCwgMHgzOSwgMHgwMCwgMHg5NiwgMHg1OSwgMHgwOCwgMHg5MywgMHg4MywgMHgwOCwgMHg5NywKKyAgICAgIDB4MDMsIDB4NTAsIDB4MzAsIDB4YzAsIDB4NDAsIDB4MzAsIDB4ODYsIDB4MDEsIDB4MDEsIDB4YTYsCisgICAgICAweDBkLCAweDYyLCAweDAzLCAweDExLCAweDYxLCAweDA1LCAweDM3LCAweDMwLCAweGFjLCAweDIxLCAweDUwCisgICB9LAorICAgLy8gVEdCX05UU0MzOTIKKyAgIC8vIFRoaXMgdGFibGUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gYmUgdXNlZCBmb3IgRnVzaW9uIFJldiBECisgICB7CisgICAgICAweDJBLCAvLyBzaXplIG9mIHRhYmxlID0gNDIKKyAgICAgIDB4MDYsIDB4MDgsIDB4MDQsIDB4MGEsIDB4YzAsIDB4MDAsIDB4MTgsIDB4MDgsIDB4MDMsIDB4MjQsCisgICAgICAweDA4LCAweDA3LCAweDAyLCAweDkwLCAweDAyLCAweDA4LCAweDEwLCAweDA0LCAweDBjLCAweDEwLAorICAgICAgMHgwNSwgMHgyYywgMHgxMSwgMHgwNCwgMHg1NSwgMHg0OCwgMHgwMCwgMHgwNSwgMHg1MCwgMHgwMCwKKyAgICAgIDB4YmYsIDB4MGMsIDB4MDIsIDB4MmYsIDB4M2QsIDB4MDAsIDB4MmYsIDB4M2YsIDB4MDAsIDB4YzMsCisgICAgICAweDIwLCAweDAwCisgICB9Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjYW1lcmEgc3BlY2lmaWNhdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIHN0cnVjdCB0YWdfY2FtZXJhU3BlYworeworICAgU2lnbmFsRm9ybWF0IHNpZ25hbDsgICAgICAgLy8gd2hpY2ggZGlnaXRhbCBzaWduYWwgZm9ybWF0IHRoZSBjYW1lcmEgaGFzCisgICBWaWRlb0Zvcm1hdCAgdmlkRm9ybWF0OyAgICAvLyB2aWRlbyBzdGFuZGFyZAorICAgU3luY1ZpZGVvUmVmIHN5bmNSZWY7ICAgICAgLy8gd2hpY2ggc3luYyB2aWRlbyByZWZlcmVuY2UgaXMgdXNlZAorICAgU3RhdGUgICAgICAgIHN5bmNPdXRwdXQ7ICAgLy8gZW5hYmxlIHN5bmMgb3V0cHV0IGZvciBzeW5jIHZpZGVvIGlucHV0PworICAgRGVjSW5wdXRDbGsgIGlDbGs7ICAgICAgICAgLy8gd2hpY2ggaW5wdXQgY2xvY2sgaXMgdXNlZAorICAgVGltZUdlbkJ5dGUgIHRnYjsgICAgICAgICAgLy8gd2hpY2ggdGltaW5nIGdlbmVyYXRvciBieXRlIGRvZXMgdGhlIGNhbWVyYSB1c2UKKyAgIGludCAgICAgICAgICBIUmVzZXQ7ICAgICAgIC8vIHNlbGVjdCA2NCwgNDgsIDMyLCBvciAxNiBDTEt4MSBmb3IgSFJlc2V0CisgICBQTExGcmVxICAgICAgcGxsRnJlcTsgICAgICAvLyB3aGF0IHN5bnRoZXNpemVkIGZyZXF1ZW5jeSB0byBzZXQgUExMIHRvCisgICBWU0laRVBBUk1TICAgdlNpemU7ICAgICAgICAvLyB2aWRlbyBzaXplIHRoZSBjYW1lcmEgcHJvZHVjZXMKKyAgIGludCAgICAgICAgICBsaW5lQ291bnQ7ICAgIC8vIGV4cGVjdGVkIHRvdGFsIG51bWJlciBvZiBoYWxmLWxpbmUgcGVyIGZyYW1lIC0gMQorICAgQk9PTCAgICAgICAgIGludGVybGFjZTsgICAgLy8gaW50ZXJsYWNlIHNpZ25hbD8KK30gQ2FtZXJhU3BlYzsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIDxVUERBVEUgUkVRVUlSRUQ+CisvLyBDYW1lcmEgc3BlY2lmaWNhdGlvbnMgZGF0YWJhc2UuIFVwZGF0ZSB0aGlzIHRhYmxlIHdoZW5ldmVyIGNhbWVyYSBzcGVjCisvLyBoYXMgYmVlbiBjaGFuZ2VkIG9yIGFkZGVkL2RlbGV0ZWQgc3VwcG9ydGVkIGNhbWVyYSBtb2RlbHMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitzdGF0aWMgQ2FtZXJhU3BlYyBkYkNhbWVyYVNwZWNbIE5fQ0FNRVJBT1BUSU9OUyBdID0KK3sgIC8vIFNpbGljb24gVmlzaW9uIDUxMk4KKyAgIHsgU2lnbmFsX0NDSVI2NTYsIFZGb3JtYXRfTlRTQywgVlJlZl9hbGlnbmVkQ2IsIE9mZiwgRGVjQ2xrX0dQQ0xLLCBUR0JfTlRTQzYyNCwgNjQsIEtIejE5NjM2LAorICAgICAgLy8gQ2xreDFfSEFDVElWRSwgQ2xreDFfSERFTEFZLCBWQWN0aXZlLCBWRGVsYXksIGxpbmVzUGVyRmllbGQ7IGxpbmVDb3VudCwgSW50ZXJsYWNlCisgICB7ICAgICAgICAgNTEyLCAgICAgICAgICAgMHg2NCwgICAgICAgNDgwLCAgICAweDEzLCAgICAgIDI0MCB9LCAgICAgICAgIDAsICAgICAgIFRSVUUKKyAgIH0sCisgICAvLyBMb2dpdGVjaCBWaWRlb01hbiAxLjMKKyAgIHsgU2lnbmFsX0NDSVI2NTYsIFZGb3JtYXRfTlRTQywgVlJlZl9hbGlnbmVkQ2IsIE9mZiwgRGVjQ2xrX0dQQ0xLLCBUR0JfTlRTQzc4MCwgNjQsIEtIejI0NTQ1LAorICAgICAgLy8gQ2xreDFfSEFDVElWRSwgQ2xreDFfSERFTEFZLCBWQWN0aXZlLCBWRGVsYXksIGxpbmVzUGVyRmllbGQ7IGxpbmVDb3VudCwgSW50ZXJsYWNlCisgICAgICB7ICAgICAgNjQwLCAgICAgICAgICAgMHg4MCwgICAgICAgNDgwLCAgICAweDFBLCAgICAgIDI0MCB9LCAgICAgICAgIDAsICAgICAgIFRSVUUKKyAgIH0sCisgICAvLyBSb2Nrd2VsbCBRdWFydHpTaWdodAorICAgLy8gTm90ZTogRnVzaW9uIFJldiBEIChyZXYgSUQgMHgwMikgYW5kIGxhdGVyIHN1cHBvcnRzIDE2IHBpeGVscyBmb3IgSFJlc2V0IHdoaWNoIGlzIHByZWZlcmFibGUuCisgICAvLyAgICAgICBVc2UgMzIgZm9yIGVhcmxpZXIgdmVyc2lvbiBvZiBoYXJkd2FyZS4gQ2xreDFfSERFTEFZIGFsc28gY2hhbmdlZCBmcm9tIDB4MjcgdG8gMHgyMC4KKyAgIHsgU2lnbmFsX0NDSVI2NTYsIFZGb3JtYXRfTlRTQywgVlJlZl9hbGlnbmVkQ2IsIE9mZiwgRGVjQ2xrX0dQQ0xLLCBUR0JfTlRTQzM5MiwgMTYsIEtIejI4NjM2LAorICAgICAgLy8gQ2xreDFfSEFDVElWRSwgQ2xreDFfSERFTEFZLCBWQWN0aXZlLCBWRGVsYXksIGxpbmVzUGVyRmllbGQ7IGxpbmVDb3VudCwgSW50ZXJsYWNlCisgICAgICB7ICAgICAgMzUyLCAgICAgICAgICAgMHgyMCwgICAgICAgNTc2LCAgICAweDA4LCAgICAgIDI4OCB9LCAgICAgICA2MDcsICAgICAgIEZBTFNFCisgICB9Cit9OworKi8KKworLyoKK1RoZSBjb3JyZXNwb25kaW5nIEFQSXMgcmVxdWlyZWQgdG8gYmUgaW52b2tlZCBhcmU6CitTZXRDb25uZWN0b3IoIENvbkNhbWVyYSwgVFJVRS9GQUxTRSApOworU2V0U2lnbmFsRm9ybWF0KCBzcGVjLnNpZ25hbCApOworU2V0VmlkZW9Gb3JtYXQoIHNwZWMudmlkRm9ybWF0ICk7CitTZXRTeW5jVmlkZW9SZWYoIHNwZWMuc3luY1JlZiApOworU2V0RW5hYmxlU3luY091dHB1dCggc3BlYy5zeW5jT3V0cHV0ICk7CitTZXRUaW1HZW5CeXRlKCBTUkFNVGFibGVbIHNwZWMudGdiIF0sIFNSQU1UYWJsZVNpemVbIHNwZWMudGdiIF0gKTsKK1NldEhSZXNldCggc3BlYy5IUmVzZXQgKTsKK1NldFBMTCggc3BlYy5wbGxGcmVxICk7CitTZXREZWNJbnB1dENsb2NrKCBzcGVjLmlDbGsgKTsKK1NldFZpZGVvSW5mbyggc3BlYy52U2l6ZSApOworU2V0VG90YWxMaW5lQ291bnQoIHNwZWMubGluZUNvdW50ICk7CitTZXRJbnRlcmxhY2VNb2RlKCBzcGVjLmludGVybGFjZSApOworKi8KKworLyogZnJvbSB3ZWI6CisgVmlkZW8gU2FtcGxpbmcKK0RpZ2l0YWwgdmlkZW8gaXMgYSBzYW1wbGVkIGZvcm0gb2YgYW5hbG9nIHZpZGVvLiBUaGUgbW9zdCBjb21tb24gc2FtcGxpbmcgc2NoZW1lcyBpbiB1c2UgdG9kYXkgYXJlOgorICAgICAgICAgICAgICAgICAgUGl4ZWwgQ2xvY2sgICBIb3JpeiAgICBIb3JpeiAgICBWZXJ0CisgICAgICAgICAgICAgICAgICAgUmF0ZSAgICAgICAgIFRvdGFsICAgIEFjdGl2ZQorTlRTQyBzcXVhcmUgcGl4ZWwgIDEyLjI3IE1IeiAgICA3ODAgICAgICA2NDAgICAgICA1MjUKK05UU0MgQ0NJUi02MDEgICAgICAxMy41ICBNSHogICAgODU4ICAgICAgNzIwICAgICAgNTI1CitOVFNDIDRGU2MgICAgICAgICAgMTQuMzIgTUh6ICAgIDkxMCAgICAgIDc2OCAgICAgIDUyNQorUEFMICBzcXVhcmUgcGl4ZWwgIDE0Ljc1IE1IeiAgICA5NDQgICAgICA3NjggICAgICA2MjUKK1BBTCAgQ0NJUi02MDEgICAgICAxMy41ICBNSHogICAgODY0ICAgICAgNzIwICAgICAgNjI1CitQQUwgIDRGU2MgICAgICAgICAgMTcuNzIgTUh6ICAgMTEzNSAgICAgIDk0OCAgICAgIDYyNQorCitGb3IgdGhlIENDSVItNjAxIHN0YW5kYXJkcywgdGhlIHNhbXBsaW5nIGlzIGJhc2VkIG9uIGEgc3RhdGljIG9ydGhvZ29uYWwgc2FtcGxpbmcgZ3JpZC4gVGhlIGx1bWluYW5jZSBjb21wb25lbnQgKFkpIGlzIHNhbXBsZWQgYXQgMTMuNSBNSHosIHdoaWxlIHRoZSB0d28gY29sb3IgZGlmZmVyZW5jZSBzaWduYWxzLCBDciBhbmQgQ2IgYXJlIHNhbXBsZWQgYXQgaGFsZiB0aGF0LCBvciA2Ljc1IE1Iei4gVGhlIENyIGFuZCBDYiBzYW1wbGVzIGFyZSBjb2xvY2F0ZWQgd2l0aCBhbHRlcm5hdGUgWSBzYW1wbGVzLCBhbmQgdGhleSBhcmUgdGFrZW4gYXQgdGhlIHNhbWUgcG9zaXRpb24gb24gZWFjaCBsaW5lLCBzdWNoIHRoYXQgb25lIHNhbXBsZSBpcyBjb2luY2lkZW50IHdpdGggdGhlIDUwJSBwb2ludCBvZiB0aGUgZmFsbGluZyBlZGdlIG9mIGFuYWxvZyBzeW5jLiBUaGUgc2FtcGxlcyBhcmUgY29kZWQgdG8gZWl0aGVyIDggb3IgMTAgYml0cyBwZXIgY29tcG9uZW50LgorKi8KKworLyogZnJvbSBEU2NhbGVyOiovCisvKgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENDSVI2NTYgRGlnaXRhbCBJbnB1dCBTdXBwb3J0OiBUaGUgdGFibGVzIHdlcmUgdGFrZW4gZnJvbSBEU2NhbGVyIHByb3llY3QKKy8vCisvLyAxMyBEZWMgMjAwMCAtIE1pY2hhZWwgRXNraW4sIENvbmV4YW50IFN5c3RlbXMgLSBJbml0aWFsIHZlcnNpb24KKy8vCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUaW1pbmcgZ2VuZXJhdG9yIFNSQU0gdGFibGUgdmFsdWVzIGZvciBDQ0lSNjAxIDcyMHg0ODAgTlRTQworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZvciBOVFNDIENDSVI2NTYgCitCWVRFIEJ0Q2FyZDo6U1JBTVRhYmxlX05UU0NbXSA9Cit7CisgICAgLy8gU1JBTSBUaW1pbmcgVGFibGUgZm9yIE5UU0MKKyAgICAweDBjLCAweGMwLCAweDAwLCAKKyAgICAweDAwLCAweDkwLCAweGMyLCAKKyAgICAweDAzLCAweDEwLCAweDAzLCAKKyAgICAweDA2LCAweDEwLCAweDM0LCAKKyAgICAweDEyLCAweDEyLCAweDY1LCAKKyAgICAweDAyLCAweDEzLCAweDI0LCAKKyAgICAweDE5LCAweDAwLCAweDI0LCAKKyAgICAweDM5LCAweDAwLCAweDk2LCAKKyAgICAweDU5LCAweDA4LCAweDkzLCAKKyAgICAweDgzLCAweDA4LCAweDk3LAorICAgIDB4MDMsIDB4NTAsIDB4MzAsIAorICAgIDB4YzAsIDB4NDAsIDB4MzAsIAorICAgIDB4ODYsIDB4MDEsIDB4MDEsIAorICAgIDB4YTYsIDB4MGQsIDB4NjIsIAorICAgIDB4MDMsIDB4MTEsIDB4NjEsIAorICAgIDB4MDUsIDB4MzcsIDB4MzAsIAorICAgIDB4YWMsIDB4MjEsIDB4NTAKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUaW1pbmcgZ2VuZXJhdG9yIFNSQU0gdGFibGUgdmFsdWVzIGZvciBDQ0lSNjAxIDcyMHg1NzYgTlRTQworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZvciBQQUwgQ0NJUjY1NgorQllURSBCdENhcmQ6OlNSQU1UYWJsZV9QQUxbXSA9Cit7CisgICAgLy8gU1JBTSBUaW1pbmcgVGFibGUgZm9yIFBBTAorICAgIDB4MzYsIDB4MTEsIDB4MDEsCisgICAgMHgwMCwgMHg5MCwgMHgwMiwKKyAgICAweDA1LCAweDEwLCAweDA0LAorICAgIDB4MTYsIDB4MTQsIDB4MDUsCisgICAgMHgxMSwgMHgwMCwgMHgwNCwKKyAgICAweDEyLCAweGMwLCAweDAwLAorICAgIDB4MzEsIDB4MDAsIDB4MDYsCisgICAgMHg1MSwgMHgwOCwgMHgwMywKKyAgICAweDg5LCAweDA4LCAweDA3LAorICAgIDB4YzAsIDB4NDQsIDB4MDAsCisgICAgMHg4MSwgMHgwMSwgMHgwMSwKKyAgICAweGE5LCAweDBkLCAweDAyLAorICAgIDB4MDIsIDB4NTAsIDB4MDMsCisgICAgMHgzNywgMHgzZCwgMHgwMCwKKyAgICAweGFmLCAweDIxLCAweDAwLAorfTsKKyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODQ4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODQ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjZDk1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NDguaApAQCAtMCwwICsxLDM2NiBAQAorLyoKKyAgICBidDg0OC5oIC0gQnQ4NDggcmVnaXN0ZXIgb2Zmc2V0cworCisgICAgQ29weXJpZ2h0IChDKSAxOTk2LDk3LDk4IFJhbHBoIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBfQlQ4NDhfSF8KKyNkZWZpbmUgX0JUODQ4X0hfCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9CUk9PS1RSRUUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9CUk9PS1RSRUUgMHgxMDllCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9CVDg0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JUODQ4ICAgICAweDM1MAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQlQ4NDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9CVDg0OSAgICAgMHgzNTEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0JUODc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQlQ4NzggICAgIDB4MzZlCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9CVDg3OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JUODc5ICAgICAweDM2ZgorI2VuZGlmCisKKworLyogQnJvb2t0cmVlIDg0OCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBCVDg0OF9EU1RBVFVTICAgICAgICAgIDB4MDAwCisjZGVmaW5lIEJUODQ4X0RTVEFUVVNfUFJFUyAgICAgKDE8PDcpCisjZGVmaW5lIEJUODQ4X0RTVEFUVVNfSExPQyAgICAgKDE8PDYpCisjZGVmaW5lIEJUODQ4X0RTVEFUVVNfRklFTEQgICAgKDE8PDUpCisjZGVmaW5lIEJUODQ4X0RTVEFUVVNfTlVNTCAgICAgKDE8PDQpCisjZGVmaW5lIEJUODQ4X0RTVEFUVVNfQ1NFTCAgICAgKDE8PDMpCisjZGVmaW5lIEJUODQ4X0RTVEFUVVNfUExPQ0sgICAgKDE8PDIpCisjZGVmaW5lIEJUODQ4X0RTVEFUVVNfTE9GICAgICAgKDE8PDEpCisjZGVmaW5lIEJUODQ4X0RTVEFUVVNfQ09GICAgICAgKDE8PDApCisKKyNkZWZpbmUgQlQ4NDhfSUZPUk0gICAgICAgICAgICAweDAwNAorI2RlZmluZSBCVDg0OF9JRk9STV9IQUNUSVZFICAgICgxPDw3KQorI2RlZmluZSBCVDg0OF9JRk9STV9NVVhTRUwgICAgICgzPDw1KQorI2RlZmluZSBCVDg0OF9JRk9STV9NVVgwICAgICAgICgyPDw1KQorI2RlZmluZSBCVDg0OF9JRk9STV9NVVgxICAgICAgICgzPDw1KQorI2RlZmluZSBCVDg0OF9JRk9STV9NVVgyICAgICAgICgxPDw1KQorI2RlZmluZSBCVDg0OF9JRk9STV9YVFNFTCAgICAgICgzPDwzKQorI2RlZmluZSBCVDg0OF9JRk9STV9YVDAgICAgICAgICgxPDwzKQorI2RlZmluZSBCVDg0OF9JRk9STV9YVDEgICAgICAgICgyPDwzKQorI2RlZmluZSBCVDg0OF9JRk9STV9YVEFVVE8gICAgICgzPDwzKQorI2RlZmluZSBCVDg0OF9JRk9STV9YVEJPVEggICAgICgzPDwzKQorI2RlZmluZSBCVDg0OF9JRk9STV9OVFNDICAgICAgIDEKKyNkZWZpbmUgQlQ4NDhfSUZPUk1fTlRTQ19KICAgICAyCisjZGVmaW5lIEJUODQ4X0lGT1JNX1BBTF9CREdISSAgMworI2RlZmluZSBCVDg0OF9JRk9STV9QQUxfTSAgICAgIDQKKyNkZWZpbmUgQlQ4NDhfSUZPUk1fUEFMX04gICAgICA1CisjZGVmaW5lIEJUODQ4X0lGT1JNX1NFQ0FNICAgICAgNgorI2RlZmluZSBCVDg0OF9JRk9STV9QQUxfTkMgICAgIDcKKyNkZWZpbmUgQlQ4NDhfSUZPUk1fQVVUTyAgICAgICAwCisjZGVmaW5lIEJUODQ4X0lGT1JNX05PUk0gICAgICAgNworCisjZGVmaW5lIEJUODQ4X1RERUMgICAgICAgICAgICAgMHgwMDgKKyNkZWZpbmUgQlQ4NDhfVERFQ19ERUNfRklFTEQgICAoMTw8NykKKyNkZWZpbmUgQlQ4NDhfVERFQ19GTERBTElHTiAgICAoMTw8NikKKyNkZWZpbmUgQlQ4NDhfVERFQ19ERUNfUkFUICAgICAoMHgxZikKKworI2RlZmluZSBCVDg0OF9FX0NST1AgICAgICAgICAgIDB4MDBDCisjZGVmaW5lIEJUODQ4X09fQ1JPUCAgICAgICAgICAgMHgwOEMKKworI2RlZmluZSBCVDg0OF9FX1ZERUxBWV9MTyAgICAgIDB4MDEwCisjZGVmaW5lIEJUODQ4X09fVkRFTEFZX0xPICAgICAgMHgwOTAKKworI2RlZmluZSBCVDg0OF9FX1ZBQ1RJVkVfTE8gICAgIDB4MDE0CisjZGVmaW5lIEJUODQ4X09fVkFDVElWRV9MTyAgICAgMHgwOTQKKworI2RlZmluZSBCVDg0OF9FX0hERUxBWV9MTyAgICAgIDB4MDE4CisjZGVmaW5lIEJUODQ4X09fSERFTEFZX0xPICAgICAgMHgwOTgKKworI2RlZmluZSBCVDg0OF9FX0hBQ1RJVkVfTE8gICAgIDB4MDFDCisjZGVmaW5lIEJUODQ4X09fSEFDVElWRV9MTyAgICAgMHgwOUMKKworI2RlZmluZSBCVDg0OF9FX0hTQ0FMRV9ISSAgICAgIDB4MDIwCisjZGVmaW5lIEJUODQ4X09fSFNDQUxFX0hJICAgICAgMHgwQTAKKworI2RlZmluZSBCVDg0OF9FX0hTQ0FMRV9MTyAgICAgIDB4MDI0CisjZGVmaW5lIEJUODQ4X09fSFNDQUxFX0xPICAgICAgMHgwQTQKKworI2RlZmluZSBCVDg0OF9CUklHSFQgICAgICAgICAgIDB4MDI4CisKKyNkZWZpbmUgQlQ4NDhfRV9DT05UUk9MICAgICAgICAweDAyQworI2RlZmluZSBCVDg0OF9PX0NPTlRST0wgICAgICAgIDB4MEFDCisjZGVmaW5lIEJUODQ4X0NPTlRST0xfTE5PVENIICAgICgxPDw3KQorI2RlZmluZSBCVDg0OF9DT05UUk9MX0NPTVAgICAgICAoMTw8NikKKyNkZWZpbmUgQlQ4NDhfQ09OVFJPTF9MREVDICAgICAgKDE8PDUpCisjZGVmaW5lIEJUODQ4X0NPTlRST0xfQ0JTRU5TRSAgICgxPDw0KQorI2RlZmluZSBCVDg0OF9DT05UUk9MX0NPTl9NU0IgICAoMTw8MikKKyNkZWZpbmUgQlQ4NDhfQ09OVFJPTF9TQVRfVV9NU0IgKDE8PDEpCisjZGVmaW5lIEJUODQ4X0NPTlRST0xfU0FUX1ZfTVNCICgxPDwwKQorCisjZGVmaW5lIEJUODQ4X0NPTlRSQVNUX0xPICAgICAgMHgwMzAKKyNkZWZpbmUgQlQ4NDhfU0FUX1VfTE8gICAgICAgICAweDAzNAorI2RlZmluZSBCVDg0OF9TQVRfVl9MTyAgICAgICAgIDB4MDM4CisjZGVmaW5lIEJUODQ4X0hVRSAgICAgICAgICAgICAgMHgwM0MKKworI2RlZmluZSBCVDg0OF9FX1NDTE9PUCAgICAgICAgIDB4MDQwCisjZGVmaW5lIEJUODQ4X09fU0NMT09QICAgICAgICAgMHgwQzAKKyNkZWZpbmUgQlQ4NDhfU0NMT09QX0NBR0MgICAgICAgKDE8PDYpCisjZGVmaW5lIEJUODQ4X1NDTE9PUF9DS0lMTCAgICAgICgxPDw1KQorI2RlZmluZSBCVDg0OF9TQ0xPT1BfSEZJTFRfQVVUTyAoMDw8MykKKyNkZWZpbmUgQlQ4NDhfU0NMT09QX0hGSUxUX0NJRiAgKDE8PDMpCisjZGVmaW5lIEJUODQ4X1NDTE9PUF9IRklMVF9RQ0lGICgyPDwzKQorI2RlZmluZSBCVDg0OF9TQ0xPT1BfSEZJTFRfSUNPTiAoMzw8MykKKworI2RlZmluZSBCVDg0OF9TQ0xPT1BfUEVBSyAgICAgICAoMTw8NykKKyNkZWZpbmUgQlQ4NDhfU0NMT09QX0hGSUxUX01JTlAgKDE8PDMpCisjZGVmaW5lIEJUODQ4X1NDTE9PUF9IRklMVF9NRURQICgyPDwzKQorI2RlZmluZSBCVDg0OF9TQ0xPT1BfSEZJTFRfTUFYUCAoMzw8MykKKworCisjZGVmaW5lIEJUODQ4X09GT1JNICAgICAgICAgICAgMHgwNDgKKyNkZWZpbmUgQlQ4NDhfT0ZPUk1fUkFOR0UgICAgICAoMTw8NykKKyNkZWZpbmUgQlQ4NDhfT0ZPUk1fQ09SRTAgICAgICAoMDw8NSkKKyNkZWZpbmUgQlQ4NDhfT0ZPUk1fQ09SRTggICAgICAoMTw8NSkKKyNkZWZpbmUgQlQ4NDhfT0ZPUk1fQ09SRTE2ICAgICAoMjw8NSkKKyNkZWZpbmUgQlQ4NDhfT0ZPUk1fQ09SRTMyICAgICAoMzw8NSkKKworI2RlZmluZSBCVDg0OF9FX1ZTQ0FMRV9ISSAgICAgIDB4MDRDCisjZGVmaW5lIEJUODQ4X09fVlNDQUxFX0hJICAgICAgMHgwQ0MKKyNkZWZpbmUgQlQ4NDhfVlNDQUxFX1lDT01CICAgICAoMTw8NykKKyNkZWZpbmUgQlQ4NDhfVlNDQUxFX0NPTUIgICAgICAoMTw8NikKKyNkZWZpbmUgQlQ4NDhfVlNDQUxFX0lOVCAgICAgICAoMTw8NSkKKyNkZWZpbmUgQlQ4NDhfVlNDQUxFX0hJICAgICAgICAxNQorCisjZGVmaW5lIEJUODQ4X0VfVlNDQUxFX0xPICAgICAgMHgwNTAKKyNkZWZpbmUgQlQ4NDhfT19WU0NBTEVfTE8gICAgICAweDBEMAorI2RlZmluZSBCVDg0OF9URVNUICAgICAgICAgICAgIDB4MDU0CisjZGVmaW5lIEJUODQ4X0FERUxBWSAgICAgICAgICAgMHgwNjAKKyNkZWZpbmUgQlQ4NDhfQkRFTEFZICAgICAgICAgICAweDA2NAorCisjZGVmaW5lIEJUODQ4X0FEQyAgICAgICAgICAgICAgMHgwNjgKKyNkZWZpbmUgQlQ4NDhfQURDX1JFU0VSVkVEICAgICAoMjw8NikKKyNkZWZpbmUgQlQ4NDhfQURDX1NZTkNfVCAgICAgICAoMTw8NSkKKyNkZWZpbmUgQlQ4NDhfQURDX0FHQ19FTiAgICAgICAoMTw8NCkKKyNkZWZpbmUgQlQ4NDhfQURDX0NMS19TTEVFUCAgICAoMTw8MykKKyNkZWZpbmUgQlQ4NDhfQURDX1lfU0xFRVAgICAgICAoMTw8MikKKyNkZWZpbmUgQlQ4NDhfQURDX0NfU0xFRVAgICAgICAoMTw8MSkKKyNkZWZpbmUgQlQ4NDhfQURDX0NSVVNIICAgICAgICAoMTw8MCkKKworI2RlZmluZSBCVDg0OF9XQ19VUCAgICAgICAgICAgIDB4MDQ0CisjZGVmaW5lIEJUODQ4X1dDX0RPV04gICAgICAgICAgMHgwNzgKKworI2RlZmluZSBCVDg0OF9FX1ZUQyAgICAgICAgICAgIDB4MDZDCisjZGVmaW5lIEJUODQ4X09fVlRDICAgICAgICAgICAgMHgwRUMKKyNkZWZpbmUgQlQ4NDhfVlRDX0hTRk1UICAgICAgICAoMTw8NykKKyNkZWZpbmUgQlQ4NDhfVlRDX1ZGSUxUXzJUQVAgICAwCisjZGVmaW5lIEJUODQ4X1ZUQ19WRklMVF8zVEFQICAgMQorI2RlZmluZSBCVDg0OF9WVENfVkZJTFRfNFRBUCAgIDIKKyNkZWZpbmUgQlQ4NDhfVlRDX1ZGSUxUXzVUQVAgICAzCisKKyNkZWZpbmUgQlQ4NDhfU1JFU0VUICAgICAgICAgICAweDA3QworCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVCAgICAgICAgICAgICAweDBENAorI2RlZmluZSBCVDg0OF9DT0xPUl9GTVRfT19SR0IzMiAgICAgKDA8PDQpCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9PX1JHQjI0ICAgICAoMTw8NCkKKyNkZWZpbmUgQlQ4NDhfQ09MT1JfRk1UX09fUkdCMTYgICAgICgyPDw0KQorI2RlZmluZSBCVDg0OF9DT0xPUl9GTVRfT19SR0IxNSAgICAgKDM8PDQpCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9PX1lVWTIgICAgICAoNDw8NCkKKyNkZWZpbmUgQlQ4NDhfQ09MT1JfRk1UX09fQnRZVVYgICAgICg1PDw0KQorI2RlZmluZSBCVDg0OF9DT0xPUl9GTVRfT19ZOCAgICAgICAgKDY8PDQpCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9PX1JHQjggICAgICAoNzw8NCkKKyNkZWZpbmUgQlQ4NDhfQ09MT1JfRk1UX09fWUNyQ2I0MjIgICg4PDw0KQorI2RlZmluZSBCVDg0OF9DT0xPUl9GTVRfT19ZQ3JDYjQxMSAgKDk8PDQpCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9PX1JBVyAgICAgICAoMTQ8PDQpCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX1JHQjMyICAgICAwCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX1JHQjI0ICAgICAxCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX1JHQjE2ICAgICAyCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX1JHQjE1ICAgICAzCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX1lVWTIgICAgICA0CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX0J0WVVWICAgICA1CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX1k4ICAgICAgICA2CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX1JHQjggICAgICA3CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX1lDckNiNDIyICA4CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX1lDckNiNDExICA5CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9FX1JBVyAgICAgICAxNAorCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9SR0IzMiAgICAgICAweDAwCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9SR0IyNCAgICAgICAweDExCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9SR0IxNiAgICAgICAweDIyCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9SR0IxNSAgICAgICAweDMzCisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9ZVVkyICAgICAgICAweDQ0CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9CdFlVViAgICAgICAweDU1CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9ZOCAgICAgICAgICAweDY2CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9SR0I4ICAgICAgICAweDc3CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9ZQ3JDYjQyMiAgICAweDg4CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9ZQ3JDYjQxMSAgICAweDk5CisjZGVmaW5lIEJUODQ4X0NPTE9SX0ZNVF9SQVcgICAgICAgICAweGVlCisKKyNkZWZpbmUgQlQ4NDhfVlRPVEFMX0xPICAgICAgICAgICAgIDB4QjAKKyNkZWZpbmUgQlQ4NDhfVlRPVEFMX0hJICAgICAgICAgICAgIDB4QjQKKworI2RlZmluZSBCVDg0OF9DT0xPUl9DVEwgICAgICAgICAgICAgICAgMHgwRDgKKyNkZWZpbmUgQlQ4NDhfQ09MT1JfQ1RMX0VYVF9GUk1SQVRFICAgICgxPDw3KQorI2RlZmluZSBCVDg0OF9DT0xPUl9DVExfQ09MT1JfQkFSUyAgICAgKDE8PDYpCisjZGVmaW5lIEJUODQ4X0NPTE9SX0NUTF9SR0JfREVEICAgICAgICAoMTw8NSkKKyNkZWZpbmUgQlQ4NDhfQ09MT1JfQ1RMX0dBTU1BICAgICAgICAgICgxPDw0KQorI2RlZmluZSBCVDg0OF9DT0xPUl9DVExfV1NXQVBfT0REICAgICAgKDE8PDMpCisjZGVmaW5lIEJUODQ4X0NPTE9SX0NUTF9XU1dBUF9FVkVOICAgICAoMTw8MikKKyNkZWZpbmUgQlQ4NDhfQ09MT1JfQ1RMX0JTV0FQX09ERCAgICAgICgxPDwxKQorI2RlZmluZSBCVDg0OF9DT0xPUl9DVExfQlNXQVBfRVZFTiAgICAgKDE8PDApCisKKyNkZWZpbmUgQlQ4NDhfQ0FQX0NUTCAgICAgICAgICAgICAgICAgIDB4MERDCisjZGVmaW5lIEJUODQ4X0NBUF9DVExfRElUSF9GUkFNRSAgICAgICAoMTw8NCkKKyNkZWZpbmUgQlQ4NDhfQ0FQX0NUTF9DQVBUVVJFX1ZCSV9PREQgICgxPDwzKQorI2RlZmluZSBCVDg0OF9DQVBfQ1RMX0NBUFRVUkVfVkJJX0VWRU4gKDE8PDIpCisjZGVmaW5lIEJUODQ4X0NBUF9DVExfQ0FQVFVSRV9PREQgICAgICAoMTw8MSkKKyNkZWZpbmUgQlQ4NDhfQ0FQX0NUTF9DQVBUVVJFX0VWRU4gICAgICgxPDwwKQorCisjZGVmaW5lIEJUODQ4X1ZCSV9QQUNLX1NJWkUgICAgMHgwRTAKKworI2RlZmluZSBCVDg0OF9WQklfUEFDS19ERUwgICAgIDB4MEU0CisjZGVmaW5lIEJUODQ4X1ZCSV9QQUNLX0RFTF9WQklfSERFTEFZIDB4ZmMKKyNkZWZpbmUgQlQ4NDhfVkJJX1BBQ0tfREVMX0VYVF9GUkFNRSAgMgorI2RlZmluZSBCVDg0OF9WQklfUEFDS19ERUxfVkJJX1BLVF9ISSAxCisKKworI2RlZmluZSBCVDg0OF9JTlRfU1RBVCAgICAgICAgIDB4MTAwCisjZGVmaW5lIEJUODQ4X0lOVF9NQVNLICAgICAgICAgMHgxMDQKKworI2RlZmluZSBCVDg0OF9JTlRfRVRCRiAgICAgICAgICgxPDwyMykKKworI2RlZmluZSBCVDg0OF9JTlRfUklTQ1MgICAoMHhmPDwyOCkKKyNkZWZpbmUgQlQ4NDhfSU5UX1JJU0NfRU4gKDE8PDI3KQorI2RlZmluZSBCVDg0OF9JTlRfUkFDSyAgICAoMTw8MjUpCisjZGVmaW5lIEJUODQ4X0lOVF9GSUVMRCAgICgxPDwyNCkKKyNkZWZpbmUgQlQ4NDhfSU5UX1NDRVJSICAgKDE8PDE5KQorI2RlZmluZSBCVDg0OF9JTlRfT0NFUlIgICAoMTw8MTgpCisjZGVmaW5lIEJUODQ4X0lOVF9QQUJPUlQgICgxPDwxNykKKyNkZWZpbmUgQlQ4NDhfSU5UX1JJUEVSUiAgKDE8PDE2KQorI2RlZmluZSBCVDg0OF9JTlRfUFBFUlIgICAoMTw8MTUpCisjZGVmaW5lIEJUODQ4X0lOVF9GRFNSICAgICgxPDwxNCkKKyNkZWZpbmUgQlQ4NDhfSU5UX0ZUUkdUICAgKDE8PDEzKQorI2RlZmluZSBCVDg0OF9JTlRfRkJVUyAgICAoMTw8MTIpCisjZGVmaW5lIEJUODQ4X0lOVF9SSVNDSSAgICgxPDwxMSkKKyNkZWZpbmUgQlQ4NDhfSU5UX0dQSU5UICAgKDE8PDkpCisjZGVmaW5lIEJUODQ4X0lOVF9JMkNET05FICgxPDw4KQorI2RlZmluZSBCVDg0OF9JTlRfVlBSRVMgICAoMTw8NSkKKyNkZWZpbmUgQlQ4NDhfSU5UX0hMT0NLICAgKDE8PDQpCisjZGVmaW5lIEJUODQ4X0lOVF9PRkxPVyAgICgxPDwzKQorI2RlZmluZSBCVDg0OF9JTlRfSFNZTkMgICAoMTw8MikKKyNkZWZpbmUgQlQ4NDhfSU5UX1ZTWU5DICAgKDE8PDEpCisjZGVmaW5lIEJUODQ4X0lOVF9GTVRDSEcgICgxPDwwKQorCisKKyNkZWZpbmUgQlQ4NDhfR1BJT19ETUFfQ1RMICAgICAgICAgICAgIDB4MTBDCisjZGVmaW5lIEJUODQ4X0dQSU9fRE1BX0NUTF9HUElOVEMgICAgICAoMTw8MTUpCisjZGVmaW5lIEJUODQ4X0dQSU9fRE1BX0NUTF9HUElOVEkgICAgICAoMTw8MTQpCisjZGVmaW5lIEJUODQ4X0dQSU9fRE1BX0NUTF9HUFdFQyAgICAgICAoMTw8MTMpCisjZGVmaW5lIEJUODQ4X0dQSU9fRE1BX0NUTF9HUElPTU9ERSAgICAoMzw8MTEpCisjZGVmaW5lIEJUODQ4X0dQSU9fRE1BX0NUTF9HUENMS01PREUgICAoMTw8MTApCisjZGVmaW5lIEJUODQ4X0dQSU9fRE1BX0NUTF9QTFRQMjNfNCAgICAoMDw8NikKKyNkZWZpbmUgQlQ4NDhfR1BJT19ETUFfQ1RMX1BMVFAyM184ICAgICgxPDw2KQorI2RlZmluZSBCVDg0OF9HUElPX0RNQV9DVExfUExUUDIzXzE2ICAgKDI8PDYpCisjZGVmaW5lIEJUODQ4X0dQSU9fRE1BX0NUTF9QTFRQMjNfMzIgICAoMzw8NikKKyNkZWZpbmUgQlQ4NDhfR1BJT19ETUFfQ1RMX1BMVFAxXzQgICAgICgwPDw0KQorI2RlZmluZSBCVDg0OF9HUElPX0RNQV9DVExfUExUUDFfOCAgICAgKDE8PDQpCisjZGVmaW5lIEJUODQ4X0dQSU9fRE1BX0NUTF9QTFRQMV8xNiAgICAoMjw8NCkKKyNkZWZpbmUgQlQ4NDhfR1BJT19ETUFfQ1RMX1BMVFAxXzMyICAgICgzPDw0KQorI2RlZmluZSBCVDg0OF9HUElPX0RNQV9DVExfUEtUUF80ICAgICAgKDA8PDIpCisjZGVmaW5lIEJUODQ4X0dQSU9fRE1BX0NUTF9QS1RQXzggICAgICAoMTw8MikKKyNkZWZpbmUgQlQ4NDhfR1BJT19ETUFfQ1RMX1BLVFBfMTYgICAgICgyPDwyKQorI2RlZmluZSBCVDg0OF9HUElPX0RNQV9DVExfUEtUUF8zMiAgICAgKDM8PDIpCisjZGVmaW5lIEJUODQ4X0dQSU9fRE1BX0NUTF9SSVNDX0VOQUJMRSAoMTw8MSkKKyNkZWZpbmUgQlQ4NDhfR1BJT19ETUFfQ1RMX0ZJRk9fRU5BQkxFICgxPDwwKQorCisjZGVmaW5lIEJUODQ4X0kyQyAgICAgICAgICAgICAgMHgxMTAKKyNkZWZpbmUgQlQ4NzhfSTJDX01PREUgICAgICAgICAoMTw8NykKKyNkZWZpbmUgQlQ4NzhfSTJDX1JBVEUgICAgICAgICAoMTw8NikKKyNkZWZpbmUgQlQ4NzhfSTJDX05PU1RPUCAgICAgICAoMTw8NSkKKyNkZWZpbmUgQlQ4NzhfSTJDX05PU1RBUlQgICAgICAoMTw8NCkKKyNkZWZpbmUgQlQ4NDhfSTJDX0RJViAgICAgICAgICAoMHhmPDw0KQorI2RlZmluZSBCVDg0OF9JMkNfU1lOQyAgICAgICAgICgxPDwzKQorI2RlZmluZSBCVDg0OF9JMkNfVzNCCSAgICAgICAoMTw8MikKKyNkZWZpbmUgQlQ4NDhfSTJDX1NDTCAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgQlQ4NDhfSTJDX1NEQSAgICAgICAgICAoMTw8MCkKKworI2RlZmluZSBCVDg0OF9SSVNDX1NUUlRfQUREICAgIDB4MTE0CisjZGVmaW5lIEJUODQ4X0dQSU9fT1VUX0VOICAgICAgMHgxMTgKKyNkZWZpbmUgQlQ4NDhfR1BJT19SRUdfSU5QICAgICAweDExQworI2RlZmluZSBCVDg0OF9SSVNDX0NPVU5UICAgICAgIDB4MTIwCisjZGVmaW5lIEJUODQ4X0dQSU9fREFUQSAgICAgICAgMHgyMDAKKworCisvKiBCdDg0OCBSSVNDIGNvbW1hbmRzICovCisKKy8qIG9ubHkgZm9yIHRoZSBTWU5DIFJJU0MgY29tbWFuZCAqLworI2RlZmluZSBCVDg0OF9GSUZPX1NUQVRVU19GTTEgIDB4MDYKKyNkZWZpbmUgQlQ4NDhfRklGT19TVEFUVVNfRk0zICAweDBlCisjZGVmaW5lIEJUODQ4X0ZJRk9fU1RBVFVTX1NPTCAgMHgwMgorI2RlZmluZSBCVDg0OF9GSUZPX1NUQVRVU19FT0w0IDB4MDEKKyNkZWZpbmUgQlQ4NDhfRklGT19TVEFUVVNfRU9MMyAweDBkCisjZGVmaW5lIEJUODQ4X0ZJRk9fU1RBVFVTX0VPTDIgMHgwOQorI2RlZmluZSBCVDg0OF9GSUZPX1NUQVRVU19FT0wxIDB4MDUKKyNkZWZpbmUgQlQ4NDhfRklGT19TVEFUVVNfVlJFICAweDA0CisjZGVmaW5lIEJUODQ4X0ZJRk9fU1RBVFVTX1ZSTyAgMHgwYworI2RlZmluZSBCVDg0OF9GSUZPX1NUQVRVU19QWFYgIDB4MDAKKworI2RlZmluZSBCVDg0OF9SSVNDX1JFU1lOQyAgICAgICgxPDwxNSkKKworLyogV1JJVEUgYW5kIFNLSVAgKi8KKy8qIGRpc2FibGUgd2hpY2ggYnl0ZXMgb2YgZWFjaCBEV09SRCAqLworI2RlZmluZSBCVDg0OF9SSVNDX0JZVEUwICAgICAgICgxVTw8MTIpCisjZGVmaW5lIEJUODQ4X1JJU0NfQllURTEgICAgICAgKDFVPDwxMykKKyNkZWZpbmUgQlQ4NDhfUklTQ19CWVRFMiAgICAgICAoMVU8PDE0KQorI2RlZmluZSBCVDg0OF9SSVNDX0JZVEUzICAgICAgICgxVTw8MTUpCisjZGVmaW5lIEJUODQ4X1JJU0NfQllURV9BTEwgICAgKDB4MGZVPDwxMikKKyNkZWZpbmUgQlQ4NDhfUklTQ19CWVRFX05PTkUgICAwCisvKiBjYXVzZSBSSVNDSSAqLworI2RlZmluZSBCVDg0OF9SSVNDX0lSUSAgICAgICAgICgxVTw8MjQpCisvKiBSSVNDIGNvbW1hbmQgaXMgbGFzdCBvbmUgaW4gdGhpcyBsaW5lICovCisjZGVmaW5lIEJUODQ4X1JJU0NfRU9MICAgICAgICAgKDFVPDwyNikKKy8qIFJJU0MgY29tbWFuZCBpcyBmaXJzdCBvbmUgaW4gdGhpcyBsaW5lICovCisjZGVmaW5lIEJUODQ4X1JJU0NfU09MICAgICAgICAgKDFVPDwyNykKKworI2RlZmluZSBCVDg0OF9SSVNDX1dSSVRFICAgICAgICgweDAxVTw8MjgpCisjZGVmaW5lIEJUODQ4X1JJU0NfU0tJUCAgICAgICAgKDB4MDJVPDwyOCkKKyNkZWZpbmUgQlQ4NDhfUklTQ19XUklURUMgICAgICAoMHgwNVU8PDI4KQorI2RlZmluZSBCVDg0OF9SSVNDX0pVTVAgICAgICAgICgweDA3VTw8MjgpCisjZGVmaW5lIEJUODQ4X1JJU0NfU1lOQyAgICAgICAgKDB4MDhVPDwyOCkKKworI2RlZmluZSBCVDg0OF9SSVNDX1dSSVRFMTIzICAgICgweDA5VTw8MjgpCisjZGVmaW5lIEJUODQ4X1JJU0NfU0tJUDEyMyAgICAgKDB4MGFVPDwyOCkKKyNkZWZpbmUgQlQ4NDhfUklTQ19XUklURTFTMjMgICAoMHgwYlU8PDI4KQorCisKKy8qIEJ0ODQ4QSBhbmQgaGlnaGVyIG9ubHkgISEgKi8KKyNkZWZpbmUgQlQ4NDhfVEdMQiAgICAgICAgICAgICAweDA4MAorI2RlZmluZSBCVDg0OF9UR0NUUkwgICAgICAgICAgIDB4MDg0CisjZGVmaW5lIEJUODQ4X0ZDQVAgICAgICAgICAgICAgMHgwRTgKKyNkZWZpbmUgQlQ4NDhfUExMX0ZfTE8gICAgICAgICAweDBGMAorI2RlZmluZSBCVDg0OF9QTExfRl9ISSAgICAgICAgIDB4MEY0CisKKyNkZWZpbmUgQlQ4NDhfUExMX1hDSSAgICAgICAgICAweDBGOAorI2RlZmluZSBCVDg0OF9QTExfWCAgICAgICAgICAgICgxPDw3KQorI2RlZmluZSBCVDg0OF9QTExfQyAgICAgICAgICAgICgxPDw2KQorCisjZGVmaW5lIEJUODQ4X0RWU0lGICAgICAgICAgICAgMHgwRkMKKworLyogQnQ4NzggcmVnaXN0ZXIgKi8KKworI2RlZmluZSBCVDg3OF9ERVZDVFJMIDB4NDAKKyNkZWZpbmUgQlQ4NzhfRU5fVEJGWCAweDAyCisjZGVmaW5lIEJUODc4X0VOX1ZTRlggMHgwNAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NTYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmM3ZWIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDg1Ni5jCkBAIC0wLDAgKzEsNDQyIEBACisvKiAKKyAqIGJ0ODU2IC0gQlQ4NTZBIERpZ2l0YWwgVmlkZW8gRW5jb2RlciAoUm9ja3dlbGwgUGFydCkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTWlrZSBCZXJuc29uIDxtaWtlQG1sYi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTggRGF2ZSBQZXJrcyA8ZHBlcmtzQGlibS5uZXQ+CisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgTE1MMzMvREMxMHBsdXMgdW5pZmllZCBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKyAqCisgKiBUaGlzIGNvZGUgd2FzIG1vZGlmeS9wb3J0ZWQgZnJvbSB0aGUgc2FhNzExMSBkcml2ZXIgd3JpdHRlbgorICogYnkgRGF2ZSBQZXJrcy4KKyAqCisgKiBDaGFuZ2VzIGJ5IFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgLSBtb3ZlZCBvdmVyIHRvIGxpbnV4Pj0yLjQueCBpMmMgcHJvdG9jb2wgKDkvOS8yMDAyKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK01PRFVMRV9ERVNDUklQVElPTigiQnJvb2t0cmVlLTg1NkEgdmlkZW8gZW5jb2RlciBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1pa2UgQmVybnNvbiAmIERhdmUgUGVya3MiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4KKworI2RlZmluZSBJMkNfTkFNRShzKSAocyktPm5hbWUKKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2VuY29kZXIuaD4KKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtMSkiKTsKKworI2RlZmluZSBkcHJpbnRrKG51bSwgZm9ybWF0LCBhcmdzLi4uKSBcCisJZG8geyBcCisJCWlmIChkZWJ1ZyA+PSBudW0pIFwKKwkJCXByaW50ayhmb3JtYXQsICMjYXJncyk7IFwKKwl9IHdoaWxlICgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJFR19PRkZTRVQgIDB4Q0UKKworc3RydWN0IGJ0ODU2IHsKKwl1bnNpZ25lZCBjaGFyIHJlZ1szMl07CisKKwlpbnQgbm9ybTsKKwlpbnQgZW5hYmxlOworCWludCBicmlnaHQ7CisJaW50IGNvbnRyYXN0OworCWludCBodWU7CisJaW50IHNhdDsKK307CisKKyNkZWZpbmUgICBJMkNfQlQ4NTYgICAgICAgIDB4ODgKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSBpbnQKK2J0ODU2X3dyaXRlIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCSAgICAgdTggICAgICAgICAgICAgICAgIHJlZywKKwkgICAgIHU4ICAgICAgICAgICAgICAgICB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYnQ4NTYgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWVuY29kZXItPnJlZ1tyZWcgLSBSRUdfT0ZGU0VUXSA9IHZhbHVlOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitidDg1Nl9zZXRiaXQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJICAgICAgdTggICAgICAgICAgICAgICAgIHJlZywKKwkgICAgICB1OCAgICAgICAgICAgICAgICAgYml0LAorCSAgICAgIHU4ICAgICAgICAgICAgICAgICB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYnQ4NTYgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJldHVybiBidDg1Nl93cml0ZShjbGllbnQsIHJlZywKKwkJCSAgIChlbmNvZGVyLT4KKwkJCSAgICByZWdbcmVnIC0gUkVHX09GRlNFVF0gJiB+KDEgPDwgYml0KSkgfAorCQkJICAgICh2YWx1ZSA/ICgxIDw8IGJpdCkgOiAwKSk7Cit9CisKK3N0YXRpYyB2b2lkCitidDg1Nl9kdW1wIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBpOworCXN0cnVjdCBidDg1NiAqZW5jb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlZ2lzdGVyIGR1bXA6IiwgSTJDX05BTUUoY2xpZW50KSk7CisJZm9yIChpID0gMHhkNjsgaSA8PSAweGRlOyBpICs9IDIpCisJCXByaW50aygiICUwMngiLCBlbmNvZGVyLT5yZWdbaSAtIFJFR19PRkZTRVRdKTsKKwlwcmludGsoIlxuIik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQKK2J0ODU2X2NvbW1hbmQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJICAgICAgIHVuc2lnbmVkIGludCAgICAgICBjbWQsCisJICAgICAgIHZvaWQgICAgICAgICAgICAgICphcmcpCit7CisJc3RydWN0IGJ0ODU2ICplbmNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSAwOgorCQkvKiBUaGlzIGlzIGp1c3QgZm9yIHRlc3RpbmchISEgKi8KKwkJZHByaW50aygxLCBLRVJOX0lORk8gImJ0ODU2OiBpbml0XG4iKTsKKwkJYnQ4NTZfd3JpdGUoY2xpZW50LCAweGRjLCAweDE4KTsKKwkJYnQ4NTZfd3JpdGUoY2xpZW50LCAweGRhLCAwKTsKKwkJYnQ4NTZfd3JpdGUoY2xpZW50LCAweGRlLCAwKTsKKworCQlidDg1Nl9zZXRiaXQoY2xpZW50LCAweGRjLCAzLCAxKTsKKwkJLy9idDg1Nl9zZXRiaXQoY2xpZW50LCAweGRjLCA2LCAwKTsKKwkJYnQ4NTZfc2V0Yml0KGNsaWVudCwgMHhkYywgNCwgMSk7CisKKwkJc3dpdGNoIChlbmNvZGVyLT5ub3JtKSB7CisKKwkJY2FzZSBWSURFT19NT0RFX05UU0M6CisJCQlidDg1Nl9zZXRiaXQoY2xpZW50LCAweGRjLCAyLCAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVklERU9fTU9ERV9QQUw6CisJCQlidDg1Nl9zZXRiaXQoY2xpZW50LCAweGRjLCAyLCAxKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYnQ4NTZfc2V0Yml0KGNsaWVudCwgMHhkYywgMSwgMSk7CisJCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGUsIDQsIDApOworCQlidDg1Nl9zZXRiaXQoY2xpZW50LCAweGRlLCAzLCAxKTsKKwkJaWYgKGRlYnVnICE9IDApCisJCQlidDg1Nl9kdW1wKGNsaWVudCk7CisJCWJyZWFrOworCisJY2FzZSBFTkNPREVSX0dFVF9DQVBBQklMSVRJRVM6CisJeworCQlzdHJ1Y3QgdmlkZW9fZW5jb2Rlcl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiBnZXQgY2FwYWJpbGl0aWVzXG4iLAorCQkJSTJDX05BTUUoY2xpZW50KSk7CisKKwkJY2FwLT5mbGFncyA9IFZJREVPX0VOQ09ERVJfUEFMIHwKKwkJCSAgICAgVklERU9fRU5DT0RFUl9OVFNDIHwKKwkJCSAgICAgVklERU9fRU5DT0RFUl9DQ0lSOworCQljYXAtPmlucHV0cyA9IDI7CisJCWNhcC0+b3V0cHV0cyA9IDE7CisJfQorCQlicmVhazsKKworCWNhc2UgRU5DT0RFUl9TRVRfTk9STToKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHNldCBub3JtICVkXG4iLCBJMkNfTkFNRShjbGllbnQpLAorCQkJKmlhcmcpOworCisJCXN3aXRjaCAoKmlhcmcpIHsKKworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGMsIDIsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGMsIDIsIDEpOworCQkJYnQ4NTZfc2V0Yml0KGNsaWVudCwgMHhkYSwgMCwgMCk7CisJCQkvL2J0ODU2X3NldGJpdChjbGllbnQsIDB4ZGEsIDAsIDEpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCisJCX0KKwkJZW5jb2Rlci0+bm9ybSA9ICppYXJnOworCQlpZiAoZGVidWcgIT0gMCkKKwkJCWJ0ODU2X2R1bXAoY2xpZW50KTsKKwl9CisJCWJyZWFrOworCisJY2FzZSBFTkNPREVSX1NFVF9JTlBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHNldCBpbnB1dCAlZFxuIiwgSTJDX05BTUUoY2xpZW50KSwKKwkJCSppYXJnKTsKKworCQkvKiBXZSBvbmx5IGhhdmUgdmlkZW8gYnVzLgorCQkgKiBpYXJnID0gMDogaW5wdXQgaXMgZnJvbSBidDgxOQorCQkgKiBpYXJnID0gMTogaW5wdXQgaXMgZnJvbSBaUjM2MDYwICovCisKKwkJc3dpdGNoICgqaWFyZykgeworCisJCWNhc2UgMDoKKwkJCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGUsIDQsIDApOworCQkJYnQ4NTZfc2V0Yml0KGNsaWVudCwgMHhkZSwgMywgMSk7CisJCQlidDg1Nl9zZXRiaXQoY2xpZW50LCAweGRjLCAzLCAxKTsKKwkJCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGMsIDYsIDApOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGUsIDQsIDApOworCQkJYnQ4NTZfc2V0Yml0KGNsaWVudCwgMHhkZSwgMywgMSk7CisJCQlidDg1Nl9zZXRiaXQoY2xpZW50LCAweGRjLCAzLCAxKTsKKwkJCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGMsIDYsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgMjoJLy8gQ29sb3IgYmFyCisJCQlidDg1Nl9zZXRiaXQoY2xpZW50LCAweGRjLCAzLCAwKTsKKwkJCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGUsIDQsIDEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9CisKKwkJaWYgKGRlYnVnICE9IDApCisJCQlidDg1Nl9kdW1wKGNsaWVudCk7CisJfQorCQlicmVhazsKKworCWNhc2UgRU5DT0RFUl9TRVRfT1VUUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogc2V0IG91dHB1dCAlZFxuIiwgSTJDX05BTUUoY2xpZW50KSwKKwkJCSppYXJnKTsKKworCQkvKiBub3QgbXVjaCBjaG9pY2Ugb2Ygb3V0cHV0cyAqLworCQlpZiAoKmlhcmcgIT0gMCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJCWJyZWFrOworCisJY2FzZSBFTkNPREVSX0VOQUJMRV9PVVRQVVQ6CisJeworCQlpbnQgKmlhcmcgPSBhcmc7CisKKwkJZW5jb2Rlci0+ZW5hYmxlID0gISEqaWFyZzsKKworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IGVuYWJsZSBvdXRwdXQgJWRcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBlbmNvZGVyLT5lbmFibGUpOworCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEdlbmVyaWMgaTJjIHByb2JlCisgKiBjb25jZXJuaW5nIHRoZSBhZGRyZXNzZXM6IGkyYyB3YW50cyA3IGJpdCAod2l0aG91dCB0aGUgci93IGJpdCksIHNvICc+PjEnCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19CVDg1NiA+PiAxLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb2JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZV9yYW5nZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmVfcmFuZ2VbMl0gPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlWzJdID0geyBJMkNfQ0xJRU5UX0VORCAsIEkyQ19DTElFTlRfRU5EIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKKwkubm9ybWFsX2kyY19yYW5nZQk9IG5vcm1hbF9pMmNfcmFuZ2UsCisJLnByb2JlCQkJPSBwcm9iZSwKKwkucHJvYmVfcmFuZ2UJCT0gcHJvYmVfcmFuZ2UsCisJLmlnbm9yZQkJCT0gaWdub3JlLAorCS5pZ25vcmVfcmFuZ2UJCT0gaWdub3JlX3JhbmdlLAorCS5mb3JjZQkJCT0gZm9yY2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX2J0ODU2OworCitzdGF0aWMgaW50CitidDg1Nl9kZXRlY3RfY2xpZW50IChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCSAgICAgaW50ICAgICAgICAgICAgICAgICBhZGRyZXNzLAorCQkgICAgIGludCAgICAgICAgICAgICAgICAga2luZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBidDg1NiAqZW5jb2RlcjsKKworCWRwcmludGsoMSwKKwkJS0VSTl9JTkZPCisJCSJidDg1Ni5jOiBkZXRlY3RpbmcgYnQ4NTYgY2xpZW50IG9uIGFkZHJlc3MgMHgleFxuIiwKKwkJYWRkcmVzcyA8PCAxKTsKKworCS8qIENoZWNrIGlmIHRoZSBhZGFwdGVyIHN1cHBvcnRzIHRoZSBuZWVkZWQgZmVhdHVyZXMgKi8KKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCXJldHVybiAwOworCisJY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2xpZW50ID09IDApCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX2J0ODU2OworCWNsaWVudC0+ZmxhZ3MgPSBJMkNfQ0xJRU5UX0FMTE9XX1VTRTsKKwlzdHJsY3B5KEkyQ19OQU1FKGNsaWVudCksICJidDg1NiIsIHNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CisKKwllbmNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJ0ODU2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGVuY29kZXIgPT0gTlVMTCkgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGVuY29kZXIsIDAsIHNpemVvZihzdHJ1Y3QgYnQ4NTYpKTsKKwllbmNvZGVyLT5ub3JtID0gVklERU9fTU9ERV9OVFNDOworCWVuY29kZXItPmVuYWJsZSA9IDE7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZW5jb2Rlcik7CisKKwlpID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoaSkgeworCQlrZnJlZShjbGllbnQpOworCQlrZnJlZShlbmNvZGVyKTsKKwkJcmV0dXJuIGk7CisJfQorCisJYnQ4NTZfd3JpdGUoY2xpZW50LCAweGRjLCAweDE4KTsKKwlidDg1Nl93cml0ZShjbGllbnQsIDB4ZGEsIDApOworCWJ0ODU2X3dyaXRlKGNsaWVudCwgMHhkZSwgMCk7CisKKwlidDg1Nl9zZXRiaXQoY2xpZW50LCAweGRjLCAzLCAxKTsKKwkvL2J0ODU2X3NldGJpdChjbGllbnQsIDB4ZGMsIDYsIDApOworCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGMsIDQsIDEpOworCisJc3dpdGNoIChlbmNvZGVyLT5ub3JtKSB7CisKKwljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJYnQ4NTZfc2V0Yml0KGNsaWVudCwgMHhkYywgMiwgMCk7CisJCWJyZWFrOworCisJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJYnQ4NTZfc2V0Yml0KGNsaWVudCwgMHhkYywgMiwgMSk7CisJCWJyZWFrOworCX0KKworCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGMsIDEsIDEpOworCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGUsIDQsIDApOworCWJ0ODU2X3NldGJpdChjbGllbnQsIDB4ZGUsIDMsIDEpOworCisJaWYgKGRlYnVnICE9IDApCisJCWJ0ODU2X2R1bXAoY2xpZW50KTsKKworCWRwcmludGsoMSwgS0VSTl9JTkZPICIlc19hdHRhY2g6IGF0IGFkZHJlc3MgMHgleFxuIiwgSTJDX05BTUUoY2xpZW50KSwKKwkJY2xpZW50LT5hZGRyIDw8IDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2J0ODU2X2F0dGFjaF9hZGFwdGVyIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJZHByaW50aygxLAorCQlLRVJOX0lORk8KKwkJImJ0ODU2LmM6IHN0YXJ0aW5nIHByb2JlIGZvciBhZGFwdGVyICVzICgweCV4KVxuIiwKKwkJSTJDX05BTUUoYWRhcHRlciksIGFkYXB0ZXItPmlkKTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsICZidDg1Nl9kZXRlY3RfY2xpZW50KTsKK30KKworc3RhdGljIGludAorYnQ4NTZfZGV0YWNoX2NsaWVudCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYnQ4NTYgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoZW5jb2Rlcik7CisJa2ZyZWUoY2xpZW50KTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9idDg1NiA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJidDg1NiIsCisKKwkuaWQgPSBJMkNfRFJJVkVSSURfQlQ4NTYsCisJLmZsYWdzID0gSTJDX0RGX05PVElGWSwKKworCS5hdHRhY2hfYWRhcHRlciA9IGJ0ODU2X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50ID0gYnQ4NTZfZGV0YWNoX2NsaWVudCwKKwkuY29tbWFuZCA9IGJ0ODU2X2NvbW1hbmQsCit9OworCitzdGF0aWMgaW50IF9faW5pdAorYnQ4NTZfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmkyY19kcml2ZXJfYnQ4NTYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2J0ODU2X2V4aXQgKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfYnQ4NTYpOworfQorCittb2R1bGVfaW5pdChidDg1Nl9pbml0KTsKK21vZHVsZV9leGl0KGJ0ODU2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idGN4LXJpc2MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyZDUxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgICAgJElkOiBidGN4LXJpc2MuYyx2IDEuNiAyMDA1LzAyLzIxIDEzOjU3OjU5IGtyYXhlbCBFeHAgJAorCisgICAgYnRjeC1yaXNjLmMKKworICAgIGJ0ODQ4L2J0ODc4L2N4MjM4OHggcmlzYyBjb2RlIGdlbmVyYXRvci4KKworICAgIChjKSAyMDAwLTAzIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaW5jbHVkZSAiYnRjeC1yaXNjLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigic29tZSBjb2RlIHNoYXJlZCBieSBidHR2IGFuZCBjeDg4eHggZHJpdmVycyIpOworTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsImRlYnVnIG1lc3NhZ2VzLCBkZWZhdWx0IGlzIDAgKG5vKSIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBhbGxvY2F0ZS9mcmVlIHJpc2MgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBpbnQgbWVtY250OworCit2b2lkIGJ0Y3hfcmlzY21lbV9mcmVlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCSAgICAgICBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjKQoreworCWlmIChOVUxMID09IHJpc2MtPmNwdSkKKwkJcmV0dXJuOworCWlmIChkZWJ1ZykgeworCQltZW1jbnQtLTsKKwkJcHJpbnRrKCJidGN4OiByaXNjbWVtIGZyZWUgWyVkXSBkbWE9JWx4XG4iLAorCQkgICAgICAgbWVtY250LCAodW5zaWduZWQgbG9uZylyaXNjLT5kbWEpOworCX0KKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaSwgcmlzYy0+c2l6ZSwgcmlzYy0+Y3B1LCByaXNjLT5kbWEpOworCW1lbXNldChyaXNjLDAsc2l6ZW9mKCpyaXNjKSk7Cit9CisKK2ludCBidGN4X3Jpc2NtZW1fYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJICAgICAgIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1MzIgKmNwdTsKKwlkbWFfYWRkcl90IGRtYTsKKworCWlmIChOVUxMICE9IHJpc2MtPmNwdSAmJiByaXNjLT5zaXplIDwgc2l6ZSkKKwkJYnRjeF9yaXNjbWVtX2ZyZWUocGNpLHJpc2MpOworCWlmIChOVUxMID09IHJpc2MtPmNwdSkgeworCQljcHUgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2ksIHNpemUsICZkbWEpOworCQlpZiAoTlVMTCA9PSBjcHUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmlzYy0+Y3B1ICA9IGNwdTsKKwkJcmlzYy0+ZG1hICA9IGRtYTsKKwkJcmlzYy0+c2l6ZSA9IHNpemU7CisJCWlmIChkZWJ1ZykgeworCQkJbWVtY250Kys7CisJCQlwcmludGsoImJ0Y3g6IHJpc2NtZW0gYWxsb2MgWyVkXSBkbWE9JWx4IGNwdT0lcCBzaXplPSVkXG4iLAorCQkJICAgICAgIG1lbWNudCwgKHVuc2lnbmVkIGxvbmcpZG1hLCBjcHUsIHNpemUpOworCQl9CisJfQorCW1lbXNldChyaXNjLT5jcHUsMCxyaXNjLT5zaXplKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc2NyZWVuIG92ZXJsYXkgaGVscGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQKK2J0Y3hfc2NyZWVuX2NsaXBzKGludCBzd2lkdGgsIGludCBzaGVpZ2h0LCBzdHJ1Y3QgdjRsMl9yZWN0ICp3aW4sCisJCSAgc3RydWN0IHY0bDJfY2xpcCAqY2xpcHMsIHVuc2lnbmVkIGludCBuKQoreworCWlmICh3aW4tPmxlZnQgPCAwKSB7CisJCS8qIGxlZnQgKi8KKwkJY2xpcHNbbl0uYy5sZWZ0ID0gMDsKKwkJY2xpcHNbbl0uYy50b3AgPSAwOworCQljbGlwc1tuXS5jLndpZHRoICA9IC13aW4tPmxlZnQ7CisJCWNsaXBzW25dLmMuaGVpZ2h0ID0gd2luLT5oZWlnaHQ7CisJCW4rKzsKKwl9CisJaWYgKHdpbi0+bGVmdCArIHdpbi0+d2lkdGggPiBzd2lkdGgpIHsKKwkJLyogcmlnaHQgKi8KKwkJY2xpcHNbbl0uYy5sZWZ0ICAgPSBzd2lkdGggLSB3aW4tPmxlZnQ7CisJCWNsaXBzW25dLmMudG9wICAgID0gMDsKKwkJY2xpcHNbbl0uYy53aWR0aCAgPSB3aW4tPndpZHRoIC0gY2xpcHNbbl0uYy5sZWZ0OworCQljbGlwc1tuXS5jLmhlaWdodCA9IHdpbi0+aGVpZ2h0OworCQluKys7CisJfQorCWlmICh3aW4tPnRvcCA8IDApIHsKKwkJLyogdG9wICovCisJCWNsaXBzW25dLmMubGVmdCA9IDA7CisJCWNsaXBzW25dLmMudG9wID0gMDsKKwkJY2xpcHNbbl0uYy53aWR0aCAgPSB3aW4tPndpZHRoOworCQljbGlwc1tuXS5jLmhlaWdodCA9IC13aW4tPnRvcDsKKwkJbisrOworCX0KKwlpZiAod2luLT50b3AgKyB3aW4tPmhlaWdodCA+IHNoZWlnaHQpIHsKKwkJLyogYm90dG9tICovCisJCWNsaXBzW25dLmMubGVmdCA9IDA7CisJCWNsaXBzW25dLmMudG9wID0gc2hlaWdodCAtIHdpbi0+dG9wOworCQljbGlwc1tuXS5jLndpZHRoICA9IHdpbi0+d2lkdGg7CisJCWNsaXBzW25dLmMuaGVpZ2h0ID0gd2luLT5oZWlnaHQgLSBjbGlwc1tuXS5jLnRvcDsKKwkJbisrOworCX0KKwlyZXR1cm4gbjsKK30KKworaW50CitidGN4X2FsaWduKHN0cnVjdCB2NGwyX3JlY3QgKndpbiwgc3RydWN0IHY0bDJfY2xpcCAqY2xpcHMsIHVuc2lnbmVkIGludCBuLCBpbnQgbWFzaykKK3sKKwlzMzIgbngsbncsZHg7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBmaXh1cCB3aW5kb3cgKi8KKwlueCA9ICh3aW4tPmxlZnQgKyBtYXNrKSAmIH5tYXNrOworCW53ID0gKHdpbi0+d2lkdGgpICYgfm1hc2s7CisJaWYgKG54ICsgbncgPiB3aW4tPmxlZnQgKyB3aW4tPndpZHRoKQorCQludyAtPSBtYXNrKzE7CisJZHggPSBueCAtIHdpbi0+bGVmdDsKKwl3aW4tPmxlZnQgID0gbng7CisJd2luLT53aWR0aCA9IG53OworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJ0Y3g6IHdpbmRvdyBhbGlnbiAlZHglZCslZCslZCBbZHg9JWRdXG4iLAorCQkgICAgICAgd2luLT53aWR0aCwgd2luLT5oZWlnaHQsIHdpbi0+bGVmdCwgd2luLT50b3AsIGR4KTsKKworCS8qIGZpeHVwIGNsaXBzICovCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlueCA9IChjbGlwc1tpXS5jLmxlZnQtZHgpICYgfm1hc2s7CisJCW53ID0gKGNsaXBzW2ldLmMud2lkdGgpICYgfm1hc2s7CisJCWlmIChueCArIG53IDwgY2xpcHNbaV0uYy5sZWZ0LWR4ICsgY2xpcHNbaV0uYy53aWR0aCkKKwkJCW53ICs9IG1hc2srMTsKKwkJY2xpcHNbaV0uYy5sZWZ0ICA9IG54OworCQljbGlwc1tpXS5jLndpZHRoID0gbnc7CisJCWlmIChkZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICJidGN4OiAgIGNsaXAgYWxpZ24gJWR4JWQrJWQrJWRcbiIsCisJCQkgICAgICAgY2xpcHNbaV0uYy53aWR0aCwgY2xpcHNbaV0uYy5oZWlnaHQsCisJCQkgICAgICAgY2xpcHNbaV0uYy5sZWZ0LCBjbGlwc1tpXS5jLnRvcCk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkCitidGN4X3NvcnRfY2xpcHMoc3RydWN0IHY0bDJfY2xpcCAqY2xpcHMsIHVuc2lnbmVkIGludCBuY2xpcHMpCit7CisJc3RydWN0IHY0bDJfY2xpcCBzd2FwOworCWludCBpLGosbjsKKworCWlmIChuY2xpcHMgPCAyKQorCQlyZXR1cm47CisJZm9yIChpID0gbmNsaXBzLTI7IGkgPj0gMDsgaS0tKSB7CisJCWZvciAobiA9IDAsIGogPSAwOyBqIDw9IGk7IGorKykgeworCQkJaWYgKGNsaXBzW2pdLmMubGVmdCA+IGNsaXBzW2orMV0uYy5sZWZ0KSB7CisJCQkJc3dhcCA9IGNsaXBzW2pdOworCQkJCWNsaXBzW2pdID0gY2xpcHNbaisxXTsKKwkJCQljbGlwc1tqKzFdID0gc3dhcDsKKwkJCQluKys7CisJCQl9CisJCX0KKwkJaWYgKDAgPT0gbikKKwkJCWJyZWFrOworCX0KK30KKwordm9pZAorYnRjeF9jYWxjX3NraXBzKGludCBsaW5lLCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCAqbWF4eSwKKwkJc3RydWN0IGJ0Y3hfc2tpcGxpc3QgKnNraXBzLCB1bnNpZ25lZCBpbnQgKm5za2lwcywKKwkJY29uc3Qgc3RydWN0IHY0bDJfY2xpcCAqY2xpcHMsIHVuc2lnbmVkIGludCBuY2xpcHMpCit7CisJdW5zaWduZWQgaW50IGNsaXAsc2tpcDsKKwlpbnQgZW5kLG1heGxpbmU7CisKKwlza2lwPTA7CisJbWF4bGluZSA9IDk5OTk7CisJZm9yIChjbGlwID0gMDsgY2xpcCA8IG5jbGlwczsgY2xpcCsrKSB7CisKKwkJLyogc2FuaXR5IGNoZWNrcyAqLworCQlpZiAoY2xpcHNbY2xpcF0uYy5sZWZ0ICsgY2xpcHNbY2xpcF0uYy53aWR0aCA8PSAwKQorCQkJY29udGludWU7CisJCWlmIChjbGlwc1tjbGlwXS5jLmxlZnQgPiAoc2lnbmVkKXdpZHRoKQorCQkJYnJlYWs7CisKKwkJLyogdmVydGljYWwgcmFuZ2UgKi8KKwkJaWYgKGxpbmUgPiBjbGlwc1tjbGlwXS5jLnRvcCtjbGlwc1tjbGlwXS5jLmhlaWdodC0xKQorCQkJY29udGludWU7CisJCWlmIChsaW5lIDwgY2xpcHNbY2xpcF0uYy50b3ApIHsKKwkJCWlmIChtYXhsaW5lID4gY2xpcHNbY2xpcF0uYy50b3AtMSkKKwkJCQltYXhsaW5lID0gY2xpcHNbY2xpcF0uYy50b3AtMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYXhsaW5lID4gY2xpcHNbY2xpcF0uYy50b3ArY2xpcHNbY2xpcF0uYy5oZWlnaHQtMSkKKwkJCW1heGxpbmUgPSBjbGlwc1tjbGlwXS5jLnRvcCtjbGlwc1tjbGlwXS5jLmhlaWdodC0xOworCisJCS8qIGhvcml6b250YWwgcmFuZ2UgKi8KKwkJaWYgKDAgPT0gc2tpcCB8fCBjbGlwc1tjbGlwXS5jLmxlZnQgPiBza2lwc1tza2lwLTFdLmVuZCkgeworCQkJLyogbmV3IG9uZSAqLworCQkJc2tpcHNbc2tpcF0uc3RhcnQgPSBjbGlwc1tjbGlwXS5jLmxlZnQ7CisJCQlpZiAoc2tpcHNbc2tpcF0uc3RhcnQgPCAwKQorCQkJCXNraXBzW3NraXBdLnN0YXJ0ID0gMDsKKwkJCXNraXBzW3NraXBdLmVuZCA9IGNsaXBzW2NsaXBdLmMubGVmdCArIGNsaXBzW2NsaXBdLmMud2lkdGg7CisJCQlpZiAoc2tpcHNbc2tpcF0uZW5kID4gd2lkdGgpCisJCQkJc2tpcHNbc2tpcF0uZW5kID0gd2lkdGg7CisJCQlza2lwKys7CisJCX0gZWxzZSB7CisJCQkvKiBvdmVybGFwcyAtLSBleHBhbmQgbGFzdCBvbmUgKi8KKwkJCWVuZCA9IGNsaXBzW2NsaXBdLmMubGVmdCArIGNsaXBzW2NsaXBdLmMud2lkdGg7CisJCQlpZiAoc2tpcHNbc2tpcC0xXS5lbmQgPCBlbmQpCisJCQkJc2tpcHNbc2tpcC0xXS5lbmQgPSBlbmQ7CisJCQlpZiAoc2tpcHNbc2tpcC0xXS5lbmQgPiB3aWR0aCkKKwkJCQlza2lwc1tza2lwLTFdLmVuZCA9IHdpZHRoOworCQl9CisJfQorCSpuc2tpcHMgPSBza2lwOworCSptYXh5ID0gbWF4bGluZTsKKworCWlmIChkZWJ1ZykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiYnRjeDogc2tpcHMgbGluZSAlZC0lZDoiLGxpbmUsbWF4bGluZSk7CisJCWZvciAoc2tpcCA9IDA7IHNraXAgPCAqbnNraXBzOyBza2lwKyspIHsKKwkJCXByaW50aygiICVkLSVkIixza2lwc1tza2lwXS5zdGFydCxza2lwc1tza2lwXS5lbmQpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworRVhQT1JUX1NZTUJPTChidGN4X3Jpc2NtZW1fYWxsb2MpOworRVhQT1JUX1NZTUJPTChidGN4X3Jpc2NtZW1fZnJlZSk7CisKK0VYUE9SVF9TWU1CT0woYnRjeF9zY3JlZW5fY2xpcHMpOworRVhQT1JUX1NZTUJPTChidGN4X2FsaWduKTsKK0VYUE9SVF9TWU1CT0woYnRjeF9zb3J0X2NsaXBzKTsKK0VYUE9SVF9TWU1CT0woYnRjeF9jYWxjX3NraXBzKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0Y3gtcmlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjYwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0Y3gtcmlzYy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiAkSWQ6IGJ0Y3gtcmlzYy5oLHYgMS4yIDIwMDQvMDkvMTUgMTY6MTU6MjQga3JheGVsIEV4cCAkCisgKi8KK3N0cnVjdCBidGN4X3Jpc2NtZW0geworCXVuc2lnbmVkIGludCAgIHNpemU7CisJdTMyICAgICAgICAgICAgKmNwdTsKKwl1MzIgICAgICAgICAgICAqam1wOworCWRtYV9hZGRyX3QgICAgIGRtYTsKK307CisKK3N0cnVjdCBidGN4X3NraXBsaXN0IHsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKK307CisKK2ludCAgYnRjeF9yaXNjbWVtX2FsbG9jKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQlzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkJdW5zaWduZWQgaW50IHNpemUpOwordm9pZCBidGN4X3Jpc2NtZW1fZnJlZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkgICAgICAgc3RydWN0IGJ0Y3hfcmlzY21lbSAqcmlzYyk7CisKK2ludCBidGN4X3NjcmVlbl9jbGlwcyhpbnQgc3dpZHRoLCBpbnQgc2hlaWdodCwgc3RydWN0IHY0bDJfcmVjdCAqd2luLAorCQkgICAgICBzdHJ1Y3QgdjRsMl9jbGlwICpjbGlwcywgdW5zaWduZWQgaW50IG4pOworaW50IGJ0Y3hfYWxpZ24oc3RydWN0IHY0bDJfcmVjdCAqd2luLCBzdHJ1Y3QgdjRsMl9jbGlwICpjbGlwcywKKwkgICAgICAgdW5zaWduZWQgaW50IG4sIGludCBtYXNrKTsKK3ZvaWQgYnRjeF9zb3J0X2NsaXBzKHN0cnVjdCB2NGwyX2NsaXAgKmNsaXBzLCB1bnNpZ25lZCBpbnQgbmNsaXBzKTsKK3ZvaWQgYnRjeF9jYWxjX3NraXBzKGludCBsaW5lLCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCAqbWF4eSwKKwkJICAgICBzdHJ1Y3QgYnRjeF9za2lwbGlzdCAqc2tpcHMsIHVuc2lnbmVkIGludCAqbnNraXBzLAorCQkgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NsaXAgKmNsaXBzLCB1bnNpZ25lZCBpbnQgbmNsaXBzKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjZTg3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jCkBAIC0wLDAgKzEsNDM1MCBAQAorLyoKKyAgICAkSWQ6IGJ0dHYtY2FyZHMuYyx2IDEuNDcgMjAwNS8wMi8yMiAxNDowNjozMiBrcmF4ZWwgRXhwICQKKworICAgIGJ0dHYtY2FyZHMuYworCisgICAgdGhpcyBmaWxlIGhhcyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9ucyAtIGNhcmQtc3BlY2lmaWMgc3R1ZmYKKyAgICBsaWtlIHRoZSBiaWcgdHZjYXJkcyBhcnJheSBmb3IgdGhlIG1vc3QgcGFydAorCisgICAgQ29weXJpZ2h0IChDKSAxOTk2LDk3LDk4IFJhbHBoICBNZXR6bGVyIChyamttQHRocC51bmkta29lbG4uZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIChtb2NtQHRocC51bmkta29lbG4uZGUpCisgICAgKGMpIDE5OTktMjAwMSBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiYnR0dnAuaCIKKyNpZiAwIC8qIG5vdCB3b3JraW5nIHlldCAqLworI2luY2x1ZGUgImJ0ODMyLmgiCisjZW5kaWYKKworLyogZndkIGRlY2wgKi8KK3N0YXRpYyB2b2lkIGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKTsKK3N0YXRpYyB2b2lkIGJvb3RfYnQ4MzIoc3RydWN0IGJ0dHYgKmJ0dik7CitzdGF0aWMgdm9pZCBoYXVwcGF1Z2VfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOworc3RhdGljIHZvaWQgYXZlcm1lZGlhX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKK3N0YXRpYyB2b2lkIG9zcHJleV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dik7CitzdGF0aWMgdm9pZCBtb2R0ZWNfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOworc3RhdGljIHZvaWQgaW5pdF9QWEMyMDAoc3RydWN0IGJ0dHYgKmJ0dik7CisKK3N0YXRpYyB2b2lkIHdpbnZpZXdfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKK3N0YXRpYyB2b2lkIGx0OTQxNV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOworc3RhdGljIHZvaWQgYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LAorCQkJCSAgICBpbnQgc2V0KTsKK3N0YXRpYyB2b2lkIGF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LAorCQkJCSAgICAgIGludCBzZXQpOworc3RhdGljIHZvaWQgdGVycmF0dl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOworc3RhdGljIHZvaWQgZ3ZiY3R2M3BjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOworc3RhdGljIHZvaWQgZ3ZiY3R2NXBjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOworc3RhdGljIHZvaWQgd2luZmFzdDIwMDBfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKK3N0YXRpYyB2b2lkIHB2YnQ4NzhwOWJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKK3N0YXRpYyB2b2lkIGZ2MjAwMHNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKK3N0YXRpYyB2b2lkIHdpbmR2cl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOworc3RhdGljIHZvaWQgYWR0dms1MDNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKK3N0YXRpYyB2b2lkIHJ2NjA1X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOworc3RhdGljIHZvaWQgZWFnbGVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CitzdGF0aWMgdm9pZCB4Z3VhcmRfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CitzdGF0aWMgdm9pZCBpdmMxMjBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CitzdGF0aWMgdm9pZCBndmMxMTAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOworCitzdGF0aWMgdm9pZCBQWEMyMDBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CisKK3N0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKK3N0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9pbml0KHN0cnVjdCBidHR2ICpidHYpOworCitzdGF0aWMgdm9pZCB0aWJldENTMTZfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CitzdGF0aWMgdm9pZCB0aWJldENTMTZfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KTsKKworc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOworc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX2luaXQoc3RydWN0IGJ0dHYgKmJ0dik7CisKK3N0YXRpYyB2b2lkIHNpZ21hU0xDX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOworc3RhdGljIHZvaWQgc2lnbWFTUV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKKworc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KTsKK3N0YXRpYyBpbnQgdGVhNTc1N19yZWFkKHN0cnVjdCBidHR2ICpidHYpOworc3RhdGljIGludCB0ZWE1NzU3X3dyaXRlKHN0cnVjdCBidHR2ICpidHYsIGludCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBpZGVudGlmeV9ieV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0diwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGVlcHJvbV9kYXRhWzI1Nl0pOworc3RhdGljIGludCBfX2RldmluaXQgcHZyX2Jvb3Qoc3RydWN0IGJ0dHYgKmJ0dik7CisKKy8qIGNvbmZpZyB2YXJpYWJsZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHJpdG9uMT0wOworc3RhdGljIHVuc2lnbmVkIGludCB2c2Z4PTA7CitzdGF0aWMgdW5zaWduZWQgaW50IGxhdGVuY3kgPSBVTlNFVDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9fb3ZlcmxheT0tMTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjYXJkW0JUVFZfTUFYXSAgID0geyBbIDAgLi4uIChCVFRWX01BWC0xKSBdID0gVU5TRVQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGxsW0JUVFZfTUFYXSAgICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CitzdGF0aWMgdW5zaWduZWQgaW50IHR1bmVyW0JUVFZfTUFYXSAgPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBzdmhzW0JUVFZfTUFYXSAgID0geyBbIDAgLi4uIChCVFRWX01BWC0xKSBdID0gVU5TRVQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVtb3RlW0JUVFZfTUFYXSA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CitzdGF0aWMgc3RydWN0IGJ0dHYgICptYXN0ZXJbQlRUVl9NQVhdID0geyBbIDAgLi4uIChCVFRWX01BWC0xKSBdID0gTlVMTCB9OworI2lmZGVmIE1PRFVMRQorc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDE7CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDA7CisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ3Bpb21hc2sgPSBVTlNFVDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXVkaW9hbGwgPSBVTlNFVDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXVkaW9tdXhbNV0gPSB7IFsgMCAuLi4gNCBdID0gVU5TRVQgfTsKKworLyogaW5zbW9kIG9wdGlvbnMgKi8KK21vZHVsZV9wYXJhbSh0cml0b24xLCAgICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHZzZngsICAgICAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0obm9fb3ZlcmxheSwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShsYXRlbmN5LCAgICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGdwaW9tYXNrLCAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oYXVkaW9hbGwsICAgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShhdXRvbG9hZCwgICBpbnQsIDA0NDQpOworCittb2R1bGVfcGFyYW1fYXJyYXkoY2FyZCwgICAgIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocGxsLCAgICAgIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkodHVuZXIsICAgIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoc3ZocywgICAgIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocmVtb3RlLCAgIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYXVkaW9tdXgsIGludCwgTlVMTCwgMDQ0NCk7CisKK01PRFVMRV9QQVJNX0RFU0ModHJpdG9uMSwic2V0IEVUQkYgcGNpIGNvbmZpZyBiaXQgIgorCQkgIltlbmFibGUgYnVnIGNvbXBhdGliaWxpdHkgZm9yIHRyaXRvbjEgKyBvdGhlcnNdIik7CitNT0RVTEVfUEFSTV9ERVNDKHZzZngsInNldCBWU0ZYIHBjaSBjb25maWcgYml0ICIKKwkJICJbeWV0IGFub3RoZXIgY2hpcHNldCBmbGF3IHdvcmthcm91bmRdIik7CitNT0RVTEVfUEFSTV9ERVNDKGxhdGVuY3ksInBjaSBsYXRlbmN5IHRpbWVyIik7CitNT0RVTEVfUEFSTV9ERVNDKGNhcmQsInNwZWNpZnkgVFYvZ3JhYmJlciBjYXJkIG1vZGVsLCBzZWUgQ0FSRExJU1QgZmlsZSBmb3IgYSBsaXN0Iik7CitNT0RVTEVfUEFSTV9ERVNDKHBsbCwic3BlY2lmeSBpbnN0YWxsZWQgY3J5c3RhbCAoMD1ub25lLCAyOD0yOCBNSHosIDM1PTM1IE1IeikiKTsKK01PRFVMRV9QQVJNX0RFU0ModHVuZXIsInNwZWNpZnkgaW5zdGFsbGVkIHR1bmVyIHR5cGUiKTsKK01PRFVMRV9QQVJNX0RFU0MoYXV0b2xvYWQsImF1dG9tYXRpY2FsbHkgbG9hZCBpMmMgbW9kdWxlcyBsaWtlIHR1bmVyLm8sIGRlZmF1bHQgaXMgMSAoeWVzKSIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogbGlzdCBvZiBjYXJkIElEcyBmb3IgYnQ4NzgrIGNhcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIHN0cnVjdCBDQVJEIHsKKwl1bnNpZ25lZCBpZDsKKwlpbnQgY2FyZG5yOworCWNoYXIgKm5hbWU7Cit9IGNhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IDB4MTNlYjAwNzAsIEJUVFZfSEFVUFBBVUdFODc4LCAgIkhhdXBwYXVnZSBXaW5UViIgfSwKKwl7IDB4MzkwMDAwNzAsIEJUVFZfSEFVUFBBVUdFODc4LCAgIkhhdXBwYXVnZSBXaW5UVi1EIiB9LAorCXsgMHg0NTAwMDA3MCwgQlRUVl9IQVVQUEFVR0VQVlIsICAiSGF1cHBhdWdlIFdpblRWL1BWUiIgfSwKKwl7IDB4ZmYwMDAwNzAsIEJUVFZfT1NQUkVZMXgwLCAgICAgIk9zcHJleS0xMDAiIH0sCisJeyAweGZmMDEwMDcwLCBCVFRWX09TUFJFWTJ4MF9TVklELCJPc3ByZXktMjAwIiB9LAorCXsgMHhmZjAyMDA3MCwgQlRUVl9PU1BSRVk1MDAsICAgICAiT3NwcmV5LTUwMCIgfSwKKwl7IDB4ZmYwMzAwNzAsIEJUVFZfT1NQUkVZMjAwMCwgICAgIk9zcHJleS0yMDAwIiB9LAorCXsgMHhmZjA0MDA3MCwgQlRUVl9PU1BSRVk1NDAsICAgICAiT3NwcmV5LTU0MCIgfSwKKworCXsgMHgwMDAxMTAwMiwgQlRUVl9BVElfVFZXT05ERVIsICAiQVRJIFRWIFdvbmRlciIgfSwKKwl7IDB4MDAwMzEwMDIsIEJUVFZfQVRJX1RWV09OREVSVkUsIkFUSSBUViBXb25kZXIvVkUiIH0sCisKKwl7IDB4NjYwNjEwN2QsIEJUVFZfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAorCXsgMHg2NjA3MTA3ZCwgQlRUVl9XSU5GQVNUVkMxMDAsICAiTGVhZHRlayBXaW5GYXN0IFZDIDEwMCIgfSwKKwl7IDB4NjYwOTEwN2QsIEJUVFZfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgVFYgMjAwMCBYUCIgfSwKKwl7IDB4MjYzNjEwYjQsIEJUVFZfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCisJeyAweDI2NDUxMGI0LCBCVFRWX1NUQjIsICAgICAgICAgICJTVEIgVFYgUENJIEZNLCBHYXRld2F5IFAvTiA2MDAwNzA0IiB9LAorIAl7IDB4NDAyMDEwZmMsIEJUVFZfR1ZCQ1RWM1BDSSwgICAgIkktTyBEYXRhIENvLiBHVi1CQ1RWMy9QQ0kiIH0sCisJeyAweDQwNTAxMGZjLCBCVFRWX0dWQkNUVjRQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjQvUENJIiB9LAorCXsgMHg0MDcwMTBmYywgQlRUVl9HVkJDVFY1UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY1L1BDSSIgfSwKKyAJeyAweGQwMTgxMGZjLCBCVFRWX0dWQkNUVjVQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjUvUENJIiB9LAorCisJeyAweDAwMTIxMWJkLCBCVFRWX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIiB9LAorCS8vIHNvbWUgY2FyZHMgc2hpcCB3aXRoIGJ5dGVzd2FwcGVkIElEcyAuLi4KKwl7IDB4MTIwMGJkMTEsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKKwl7IDB4ZmYwMGJkMTEsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKKwkvLyB0aGlzIHNlZW1zIHRvIGhhcHBlbiBhcyB3ZWxsIC4uLgorCXsgMHhmZjEyMTFiZCwgQlRUVl9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViIgfSwKKworCXsgMHgzMDAwMTIxYSwgQlRUVl9WT09ET09UVl9GTSwgICAiM0RmeCBWb29kb29UViBGTS8gVm9vZG9vVFYgMjAwIiB9LAorCXsgMHgyNjM3MTBiNCwgQlRUVl9WT09ET09UVl9GTSwgICAiM0RmeCBWb29kb29UViBGTS8gVm9vZG9vVFYgMjAwIiB9LAorCXsgMHgzMDYwMTIxYSwgQlRUVl9TVEIyLAkgICIzRGZ4IFZvb2Rvb1RWIDEwMC8gU1RCIE9FTSIgfSwKKworCXsgMHgzMDAwMTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYzLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNngiIH0sCisJeyAweGEwMDUxNDRmLCBCVFRWX01BR0lDVFZJRVcwNjMsICJDUEgwNlggVFZpZXc5OS1DYXJkIiB9LAorCXsgMHgzMDAyMTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYxLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNXgiIH0sCisJeyAweDMwMDUxNDRmLCBCVFRWX01BR0lDVFZJRVcwNjEsICIoQXNrZXkgTWFnaWMvb3RoZXJzKSBUVmlldzk5IENQSDA2MS8wNkwgKFQxL0xDKSIgfSwKKwl7IDB4NTAwMDE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MSwgIkFza2V5IENQSDA1MCIgfSwKKwl7IDB4MzAwMDE0ZmYsIEJUVFZfTUFHSUNUVklFVzA2MSwgIlRWaWV3IDk5IChDUEgwNjEpIiB9LAorCXsgMHgzMDAyMTRmZiwgQlRUVl9QSE9FQkVfVFZNQVMsICAiUGhvZWJlIFRWIE1hc3RlciAoQ1BIMDYwKSIgfSwKKworCXsgMHgwMDAxMTQ2MSwgQlRUVl9BVlBIT05FOTgsICAgICAiQVZlck1lZGlhIFRWUGhvbmU5OCIgfSwKKwl7IDB4MDAwMjE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIkFWZXJtZWRpYSBUVkNhcHR1cmUgOTgiIH0sCisJeyAweDAwMDMxNDYxLCBCVFRWX0FWUEhPTkU5OCwgICAgICJBVmVyTWVkaWEgVFZQaG9uZTk4IiB9LAorCXsgMHgwMDA0MTQ2MSwgQlRUVl9BVkVSTUVESUE5OCwgICAiQVZlck1lZGlhIFRWQ2FwdHVyZSA5OCIgfSwKKwl7IDB4MDMwMDE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIlZET01BVEUgVFYgVFVORVIgQ0FSRCIgfSwKKworCXsgMHgxMTE3MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChQaGlsaXBzIFBBTCBCL0cpIiB9LAorCXsgMHgxMTE4MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgQi9HKSIgfSwKKwl7IDB4MTExOTE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoUGhpbGlwcyBQQUwgSSkiIH0sCisJeyAweDExMWExNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKFRlbWljIFBBTCBJKSIgfSwKKworCXsgMHgxMTIzMTUzYiwgQlRUVl9URVJSQVRWUkFESU8sICAiVGVycmF0ZWMgVFYgUmFkaW8rIiB9LAorCXsgMHgxMTI3MTUzYiwgQlRUVl9URVJSQVRWLCAgICAgICAiVGVycmF0ZWMgVFYrIChWMS4wNSkiICAgIH0sCisJLy8gY2xhc2hlcyB3aXRoIEZseVZpZGVvCisJLy97IDB4MTg1MjE4NTIsIEJUVFZfVEVSUkFUViwgICAgICJUZXJyYXRlYyBUVisgKFYxLjEwKSIgICAgfSwKKwl7IDB4MTEzNDE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoTFIxMDIpIiB9LAorCXsgMHgxMTM1MTUzYiwgQlRUVl9URVJSQVRWQUxVRVIsICAiVGVycmF0ZWMgVFZhbHVlIFJhZGlvIiB9LCAvLyBMUjEwMgorCXsgMHg1MDE4MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIiB9LCAgICAgICAvLyA/PworCXsgMHhmZjNiMTUzYiwgQlRUVl9URVJSQVRWQUxVRVIsICAiVGVycmF0ZWMgVFZhbHVlIFJhZGlvIiB9LCAvLyA/PworCisJeyAweDQwMDAxNWIwLCBCVFRWX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIiB9LAorCXsgMHg0MDBhMTViMCwgQlRUVl9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViIgfSwKKwl7IDB4NDAwZDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKKwl7IDB4NDAxMDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKKwl7IDB4NDAxNjE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKKworCXsgMHgxNDMwYWEwMCwgQlRUVl9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNBIiB9LAorCXsgMHgxNDMxYWEwMCwgQlRUVl9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNCIiB9LAorCXsgMHgxNDMyYWEwMCwgQlRUVl9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNDIiB9LAorCXsgMHgxNDMzYWEwMCwgQlRUVl9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNEIiB9LAorCXsgMHgxNDMzYWEwMywgQlRUVl9QVjE0MywgICAgICAgICAiU2VjdXJpdHkgRXllcyIgfSwKKworCXsgMHgxNDYwYWEwMCwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTEiIH0sCisJeyAweDE0NjFhYTAxLCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtMiIgfSwKKwl7IDB4MTQ2MmFhMDIsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS0zIiB9LAorCXsgMHgxNDYzYWEwMywgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTQiIH0sCisKKwl7IDB4MTQ2NGFhMDQsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi0xIiB9LAorCXsgMHgxNDY1YWEwNSwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTIiIH0sCisJeyAweDE0NjZhYTA2LCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItMyIgfSwKKwl7IDB4MTQ2N2FhMDcsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi00IiB9LAorCisJeyAweGExMzJmZjAwLCBCVFRWX0lWQzEwMCwgICAgICAgICJJVkMtMTAwIiAgfSwKKwl7IDB4YTE1NTAwMDAsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAorCXsgMHhhMTU1MDAwMSwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCisJeyAweGExNTUwMDAyLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKKwl7IDB4YTE1NTAwMDMsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAorCXsgMHhhMTU1MDEwMCwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCisJeyAweGExNTUwMTAxLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKKwl7IDB4YTE1NTAxMDIsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAorCXsgMHhhMTU1MDEwMywgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCisJeyAweGExODJmZjAwLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKKwl7IDB4YTE4MmZmMDEsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAorCXsgMHhhMTgyZmYwMiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCisJeyAweGExODJmZjAzLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKKwl7IDB4YTE4MmZmMDQsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAorCXsgMHhhMTgyZmYwNSwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCisJeyAweGExODJmZjA2LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKKwl7IDB4YTE4MmZmMDcsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAorCXsgMHhhMTgyZmYwOCwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCisJeyAweGExODJmZjA5LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKKwl7IDB4YTE4MmZmMGEsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAorCXsgMHhhMTgyZmYwYiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCisJeyAweGExODJmZjBjLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKKwl7IDB4YTE4MmZmMGQsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAorCXsgMHhhMTgyZmYwZSwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCisJeyAweGExODJmZjBmLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKKworCXsgMHg0MTQyNDM0NCwgQlRUVl9HUkFORFRFQywgICAgICAiR3JhbmRUZWMgTXVsdGkgQ2FwdHVyZSIgfSwKKwl7IDB4MDEwMjAzMDQsIEJUVFZfWEdVQVJELCAgICAgICAgIkdyYW5kdGVjIEdyYW5kIFgtR3VhcmQiIH0sCisKKwl7IDB4MTg1MDE4NTEsIEJUVFZfQ0hST05PU19WUzIsICAgIkZseVZpZGVvIDk4IChMUjUwKS8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiB9LAorCXsgMHhhMDUwMTg1MSwgQlRUVl9DSFJPTk9TX1ZTMiwgICAiRmx5VmlkZW8gOTggKExSNTApLyBDaHJvbm9zIFZpZGVvIFNodXR0bGUgSUkiIH0sCisJeyAweDE4NTExODUxLCBCVFRWX0ZMWVZJREVPOThFWiwgICJGbHlWaWRlbyA5OEVaIChMUjUxKS8gQ3liZXJNYWlsIEFWIiB9LAorCXsgMHgxODUyMTg1MiwgQlRUVl9UWVBIT09OX1RWSUVXLCAiRmx5VmlkZW8gOThGTSAoTFI1MCkvIFR5cGhvb24gVFZpZXcgVFYvRk0gVHVuZXIiIH0sCisJeyAweDQxYTBhMDUxLCBCVFRWX0ZMWVZJREVPXzk4Rk0sICJMaWZldmlldyBGbHlWaWRlbyA5OCBMUjUwIFJldiBRIiB9LAorCXsgMHgxODUwMWY3ZiwgQlRUVl9GTFlWSURFT185OCwgICAiTGlmZXZpZXcgRmx5dmlkZW8gOTgiIH0sCisKKyAgICAJeyAweDAxMDExNWNiLCBCVFRWX0dNVjEsICAgICAgICAgICJBRyBHTVYxIiB9LAorCXsgMHgwMTAxMTRjNywgQlRUVl9NT0RURUNfMjA1LCAgICAiTW9kdWxhciBUZWNobm9sb2d5IE1NMjAxL01NMjAyL01NMjA1L01NMjEwL01NMjE1IFBDVFYiIH0sCisKKwl7IDB4MTBiNDI2MzYsIEJUVFZfSEFVUFBBVUdFODc4LCAgIlNUQiA/Pz8iIH0sCisJeyAweDIxN2Q2NjA2LCBCVFRWX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFdpbkZhc3QgVFYgMjAwMCIgfSwKKwl7IDB4ZmZmNmY2ZmYsIEJUVFZfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAorCXsgMHgwMzExNjAwMCwgQlRUVl9TRU5TT1JBWTMxMSwgICAiU2Vuc29yYXkgMzExIiB9LAorCXsgMHgwMDc5MGUxMSwgQlRUVl9XSU5EVlIsICAgICAgICAiQ2Fub3B1cyBXaW5EVlIgUENJIiB9LAorCXsgMHhhMGZjYTFhMCwgQlRUVl9aT0xUUklYLCAgICAgICAiRmFjZSB0byBGYWNlIFR2bWF4IiB9LAorCXsgMHgyMDAwNzA2MywgQlRUVl9QQ19IRFRWLCAgICAgICAicGNIRFRWIEhELTIwMDAgVFYifSwKKwl7IDB4ODJiMmFhNmEsIEJUVFZfU0lNVVNfR1ZDMTEwMCwgIlNJTVVTIEdWQzExMDAiIH0sCisJeyAweDE0NmNhYTBjLCBCVFRWX1BWOTUxLCAgICAgICAgICJpdHVuZXIgc3BlY3RyYTgiIH0sCisgCXsgMHgyMDBhMTI5NSwgQlRUVl9QWEMyMDAsICAgICAgICAiSW1hZ2VOYXRpb24gUFhDMjAwQSIgfSwKKworCXsgMHg0MDExMTU1NCwgQlRUVl9QVl9CVDg3OFBfOUIsICAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQiIH0sCisJeyAweDE3ZGUwYTAxLCBCVFRWX0tXT1JMRCwgICAgICAgICJNZWNlciBUVi9GTS9WaWRlbyBUdW5lciIgfSwKKworCXsgMHgwMTA1MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMxIiB9LAorCXsgMHgwMTA2MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMyIiB9LAorCXsgMHgwMTA3MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMzIiB9LAorCXsgMHgwMTA4MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICM0IiB9LAorCisJLy8gbGlrZWx5IGJyb2tlbiwgdmVuZG9yIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIG90aGVyIG1hZ2ljIHZpZXdzIC4uLgorCS8veyAweGEwZmNhMDRmLCBCVFRWX01BR0lDVFZJRVcwNjMsICJHdWlsbGVtb3QgTWF4aSBUViBWaWRlbyAzIiB9LAorCisJLy8gRFZCIGNhcmRzICh1c2luZyBwY2kgZnVuY3Rpb24gLjEgZm9yIG1wZWcgZGF0YSB4ZmVyKQorCXsgMHgwMTAxMDA3MSwgQlRUVl9ORUJVTEFfRElHSVRWLCAiTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViIgfSwKKwl7IDB4MDc2MTE0NjEsIEJUVFZfQVZEVkJUXzc2MSwgICAgIkF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxIiB9LAorCXsgMHgwMDFjMTFiZCwgQlRUVl9QSU5OQUNMRVNBVCwgICAiUGlubmFjbGUgUENUViBTYXQiIH0sCisJeyAweDAwMjYxMWJkLCBCVFRWX1RXSU5IQU5fRFNULCAgICJQaW5uYWNsZSBQQ1RWIFNBVCBDSSIgfSwKKwl7IDB4MDAwMTE4MjIsIEJUVFZfVFdJTkhBTl9EU1QsICAgIlR3aW5oYW4gVmlzaW9uUGx1cyBEVkIiIH0sCisJeyAweGZjMDAyNzBmLCBCVFRWX1RXSU5IQU5fRFNULCAgICJDaGFpblRlY2ggZGlnaXRvcCBEU1QtMTAwMCBEVkItUyIgfSwKKwl7IDB4MDc3MTE0NjEsIEJUVFZfQVZEVkJUXzc3MSwgICAgIkFWZXJtZWRpYSBBdmVyVFYgRFZCLVQgNzcxIiB9LAorCXsgMHhkYjEwMThhYywgQlRUVl9EVklDT19EVkJUX0xJVEUsICAgICJEVklDTyBGdXNpb25IRFRWIERWQi1UIExpdGUiIH0sCisKKwl7IDAsIC0xLCBOVUxMIH0KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBhcnJheSB3aXRoIGRlc2NyaXB0aW9uIGZvciBidDg0OCAvIGJ0ODc4IHR2L2dyYWJiZXIgY2FyZHMgICAgICAgICAgICAgICAqLworCitzdHJ1Y3QgdHZjYXJkIGJ0dHZfdHZjYXJkc1tdID0geworeworLyogLS0tLSBjYXJkIDB4MDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5uYW1lCQk9ICIgKioqIFVOS05PV04vR0VORVJJQyAqKiogIiwKKwkudmlkZW9faW5wdXRzCT0gNCwKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKKwkudHVuZXJfdHlwZQk9IC0xLAorfSx7CisJLm5hbWUJCT0gIk1JUk8gUENUViIsCisJLnZpZGVvX2lucHV0cwk9IDQsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAxNSwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAyLCAwLCAwLCAwLCAxMH0sCisJLm5lZWRzX3R2YXVkaW8JPSAxLAorCS50dW5lcl90eXBlCT0gLTEsCit9LHsKKwkubmFtZQkJPSAiSGF1cHBhdWdlIChidDg0OCkiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gNywKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCS5uYW1lCQk9ICJTVEIsIEdhdGV3YXkgUC9OIDYwMDA2OTkgKGJ0ODQ4KSIsCisJLnZpZGVvX2lucHV0cwk9IDMsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSA3LAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDQsIDAsIDIsIDMsIDF9LAorCS5ub19tc3AzNHh4CT0gMSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkuaGFzX3JhZGlvICAgICAgPSAxLAorfSx7CisKKy8qIC0tLS0gY2FyZCAweDA0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkubmFtZQkJPSAiSW50ZWwgQ3JlYXRlIGFuZCBTaGFyZSBQQ0kvIFNtYXJ0IFZpZGVvIFJlY29yZGVyIElJSSIsCisJLnZpZGVvX2lucHV0cwk9IDQsCisJLmF1ZGlvX2lucHV0cwk9IDAsCisJLnR1bmVyCQk9IC0xLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAwIH0sCisJLm5lZWRzX3R2YXVkaW8JPSAwLAorCS50dW5lcl90eXBlCT0gNCwKK30seworCS5uYW1lCQk9ICJEaWFtb25kIERUVjIwMDAiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMywKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCisJLmF1ZGlvbXV4CT0geyAwLCAxLCAwLCAxLCAzfSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZQaG9uZSIsCisJLnZpZGVvX2lucHV0cwk9IDMsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMywKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmdwaW9tYXNrCT0gMHgwZiwKKwkuYXVkaW9tdXgJPSB7IDB4MGMsIDB4MDQsIDB4MDgsIDB4MDQsIDB9LAorCS8qICAgICAgICAgICAgICAgIDB4MDQgZm9yIHNvbWUgY2FyZHMgPz8gKi8KKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnR1bmVyX3R5cGUJPSAtMSwKKwkuYXVkaW9faG9vawk9IGF2ZXJtZWRpYV90dnBob25lX2F1ZGlvLAorCS5oYXNfcmVtb3RlICAgICA9IDEsCit9LHsKKwkubmFtZQkJPSAiTUFUUklYLVZpc2lvbiBNVi1EZWx0YSIsCisJLnZpZGVvX2lucHV0cwk9IDUsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IC0xLAorCS5zdmhzCQk9IDMsCisJLmdwaW9tYXNrCT0gMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCwgMH0sCisJLmF1ZGlvbXV4CT0gezAgfSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCisvKiAtLS0tIGNhcmQgMHgwOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIElJIChCdDg0OCkgTFIyNiAvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjI2IiwKKwkudmlkZW9faW5wdXRzCT0gNCwKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDB4YzAwLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDAsIDB4YzAwLCAweDgwMCwgMHg0MDAsIDB4YzAwLCAwfSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCS5uYW1lCQk9ICJJTVMvSVhtaWNybyBUdXJib1RWIiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDMsCisJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eAk9IHsgMSwgMSwgMiwgMywgMH0sCisJLm5lZWRzX3R2YXVkaW8JPSAwLAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfUEFMLAorfSx7CisJLm5hbWUJCT0gIkhhdXBwYXVnZSAoYnQ4NzgpIiwKKwkudmlkZW9faW5wdXRzCT0gNCwKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDB4MGYsIC8qIG9sZDogNyAqLworCS5tdXhzZWwJCT0geyAyLCAwLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDAsIDEsIDIsIDMsIDR9LAorCS5uZWVkc190dmF1ZGlvCT0gMSwKKwkucGxsCQk9IFBMTF8yOCwKKwkudHVuZXJfdHlwZQk9IC0xLAorfSx7CisJLm5hbWUJCT0gIk1JUk8gUENUViBwcm8iLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMHgzMDE0ZiwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAweDIwMDAxLDB4MTAwMDEsIDAsIDAsMTB9LAorCS5uZWVkc190dmF1ZGlvCT0gMSwKKwkudHVuZXJfdHlwZQk9IC0xLAorfSx7CisKKy8qIC0tLS0gY2FyZCAweDBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkubmFtZQkJPSAiQURTIFRlY2hub2xvZ2llcyBDaGFubmVsIFN1cmZlciBUViAoYnQ4NDgpIiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDE1LAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDEzLCAxNCwgMTEsIDcsIDAsIDB9LAorCS5uZWVkc190dmF1ZGlvCT0gMSwKKwkudHVuZXJfdHlwZQk9IC0xLAorfSx7CisJLm5hbWUJCT0gIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSA0LAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMTUsCisJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eAk9IHsgMTMsIDE0LCAxMSwgNywgMCwgMH0sCisJLm5lZWRzX3R2YXVkaW8JPSAxLAorCS5tc3AzNHh4X2FsdCAgICA9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkuYXVkaW9faG9vayAgICAgPSBhdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvLAorfSx7CisJLm5hbWUJCT0gIkFpbXNsYWIgVmlkZW8gSGlnaHdheSBYdHJlbWUgKFZIWCkiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gNywKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAwLCAyLCAxLCAzLCA0fSwgLyogb2xkOiB7IDAsIDEsIDIsIDMsIDR9ICovCisJLm5lZWRzX3R2YXVkaW8JPSAxLAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gLTEsCit9LHsKKwkubmFtZQkJPSAiWm9sdHJpeCBUVi1NYXgiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMTUsCisJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eAk9IHswICwgMCwgMSAsIDAsIDEwfSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCisvKiAtLS0tIGNhcmQgMHgxMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWx2aWV3IFBsYXlUViAoYnQ4NzgpIiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDB4MDFmZTAwLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKyNpZiAwCisJLy8gb2xkCisJLmF1ZGlvbXV4CT0geyAweDAxYzAwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAorI2Vsc2UKKwkvLyAyMDAzLTEwLTIwIGJ5ICJBbnRvbiBBLiBBcmFwb3YiIDxhcmFwb3ZAbWFpbC5ydT4KKwkuYXVkaW9tdXggICAgICAgPSB7IDB4MDAxZTAwLCAwLCAweDAxODAwMCwgMHgwMTQwMDAsIDB4MDAyMDAwLCAwIH0sCisjZW5kaWYKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCS5uYW1lCQk9ICJMZWFkdGVrIFdpblZpZXcgNjAxIiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDB4ODMwMGY4LAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLDB9LAorCS5hdWRpb211eAk9IHsgMHg0ZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDd9LAorCS5uZWVkc190dmF1ZGlvCT0gMSwKKwkudHVuZXJfdHlwZQk9IC0xLAorCS5hdWRpb19ob29rCT0gd2ludmlld19hdWRpbywKKwkuaGFzX3JhZGlvCT0gMSwKK30seworCS5uYW1lCQk9ICJBVkVDIEludGVyY2FwdHVyZSIsCisJLnZpZGVvX2lucHV0cwk9IDMsCisJLmF1ZGlvX2lucHV0cwk9IDIsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAwLAorCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAorCS5hdWRpb211eAk9IHsxLCAwLCAwLCAwLCAwfSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyBJSSBFWiAvRmx5S2l0IExSMzggQnQ4NDggKGNhcHR1cmUgb25seSkiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAtMSwKKwkuc3ZocwkJPSAtMSwKKwkuZ3Bpb21hc2sJPSAweDhkZmYwMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAwIH0sCisJLm5vX21zcDM0eHgJPSAxLAorCS50dW5lcl90eXBlCT0gLTEsCit9LHsKKworLyogLS0tLSBjYXJkIDB4MTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5uYW1lCQk9ICJDRUkgUmFmZmxlcyBDYXJkIiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMywKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAorCS50dW5lcl90eXBlCT0gLTEsCit9LHsKKwkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIEx1Y2t5IFN0YXIgSW1hZ2UgV29ybGQgQ29uZmVyZW5jZVRWIExSNTAiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAyLCAgLy8gdHVuZXIsIGxpbmUgaW4KKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDB4MTgwMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMH0sCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAorfSx7CisJLm5hbWUJCT0gIkFza2V5IENQSDA1MC8gUGhvZWJlIFR2IE1hc3RlciArIEZNIiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDB4YzAwLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7MCwgMSwgMHg4MDAsIDB4NDAwLCAweGMwMCwgMH0sCisJLm5lZWRzX3R2YXVkaW8JPSAxLAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gLTEsCit9LHsKKwkubmFtZQkJPSAiTW9kdWxhciBUZWNobm9sb2d5IE1NMjAxL01NMjAyL01NMjA1L01NMjEwL01NMjE1IFBDVFYsIGJ0ODc4IiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAtMSwKKwkuZ3Bpb21hc2sJPSA3LAorCS5tdXhzZWwJCT0geyAyLCAzLCAtMSB9LAorICAgICAgICAuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAorCS5hdWRpb211eAk9IHsgMCwgMCwgMCwgMCwgMCB9LAorCS5ub19tc3AzNHh4CT0gMSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUxQU19UU0JCNV9QQUxfSSwKK30seworCisvKiAtLS0tIGNhcmQgMHgxOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLm5hbWUJCT0gIkFza2V5IENQSDA1WC8wNlggKGJ0ODc4KSBbbWFueSB2ZW5kb3JzXSIsCisJLnZpZGVvX2lucHV0cwk9IDMsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAweGUwMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0gezB4NDAwLCAweDQwMCwgMHg0MDAsIDB4NDAwLCAweGMwMH0sCisJLm5lZWRzX3R2YXVkaW8JPSAxLAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gLTEsCisJLmhhc19yZW1vdGUgICAgID0gMSwKK30seworCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWKyBWZXJzaW9uIDEuMCAoQnQ4NDgpLyBUZXJyYSBUVmFsdWUgVmVyc2lvbiAxLjAvIFZvYmlzIFRWLUJvb3N0YXIiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMHgxZjBmZmYsCisJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eCAgICAgICA9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMCwgMHg0MDAwMH0sCisJLm5lZWRzX3R2YXVkaW8JPSAwLAorCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJLmF1ZGlvX2hvb2sgICAgID0gdGVycmF0dl9hdWRpbywKK30seworCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luQ2FtIG5ld2VyIChidDg3OCkiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDMsCisJLmdwaW9tYXNrCT0gNywKKwkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OC8gTUFYSSBUViBWaWRlbyBQQ0kyIExSNTAiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAyLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMHgxODAwLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1NFQ0FNLAorfSx7CisKKy8qIC0tLS0gY2FyZCAweDFjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVisgVmVyc2lvbiAxLjEgKGJ0ODc4KSIsCisJLnZpZGVvX2lucHV0cwk9IDMsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAweDFmMGZmZiwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAweDAwMDAwLCAweDQwMDAwfSwKKwkubmVlZHNfdHZhdWRpbwk9IDAsCisJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkuYXVkaW9faG9vawk9IHRlcnJhdHZfYXVkaW8sCisJLyogR1BJTyB3aXJpbmc6CisgICAgICAgICAgICAgICBFeHRlcm5hbCAyMCBwaW4gY29ubmVjdG9yIChmb3IgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgYm9hcmQpCisgICAgICAgICAgICAgICBncGlvMDA6IGkyYy1zZGEKKyAgICAgICAgICAgICAgIGdwaW8wMTogaTJjLXNjbAorICAgICAgICAgICAgICAgZ3BpbzAyOiBvbTU2MTAtZGF0YQorICAgICAgICAgICAgICAgZ3BpbzAzOiBvbTU2MTAtY2xrCisgICAgICAgICAgICAgICBncGlvMDQ6IG9tNTYxMC13cmUKKyAgICAgICAgICAgICAgIGdwaW8wNTogb201NjEwLXN0ZXJlbworICAgICAgICAgICAgICAgZ3BpbzA2OiByZHM2NTg4LWRhdm4KKyAgICAgICAgICAgICAgIGdwaW8wNzogUGluIDcgbi5jLgorICAgICAgICAgICAgICAgZ3BpbzA4OiBuSU9XCisgICAgICAgICAgICAgICBncGlvMDkrMTA6IG5JT1IsIG5TRUwgPz8gKGJ0ODc4KQorICAgICAgICAgICAgICAgIGdwaW8wOTogbklPUiAoYnQ4NDgpCisgICAgICAgICAgICAgICAgZ3BpbzEwOiBuU0VMIChidDg0OCkKKyAgICAgICAgICAgICAgU291bmQgUm91dGluZzoKKyAgICAgICAgICAgICAgIGdwaW8xNjogdTItQTAgKDFzdCA0MDUyYnQpCisgICAgICAgICAgICAgICBncGlvMTc6IHUyLUExCisgICAgICAgICAgICAgICBncGlvMTg6IHUyLW5FTgorICAgICAgICAgICAgICAgZ3BpbzE5OiB1NC1BMCAoMm5kIDQwNTIpCisgICAgICAgICAgICAgICBncGlvMjA6IHU0LUExCisgICAgICAgICAgICAgICAgICAgICAgIHU0LW5FTiAtIEdORAorCSAgICBCdHNweToKKwkgIAkwMDAwMCA6IENkcm9tIChpbnRlcm5hbCBhdWRpbyBpbnB1dCkKKwkJMTAwMDAgOiBleHQuIFZpZGVvIGF1ZGlvIGlucHV0CisJCTIwMDAwIDogVFYgTW9ubworCQlhMDAwMCA6IFRWIE1vbm8vMgorCSAgICAgICAxYTAwMDAgOiBUViBTdGVyZW8KKwkJMzAwMDAgOiBSYWRpbworCQk0MDAwMCA6IE11dGUKKyAgICAgICAqLworCit9LHsKKwkvKiBKYW5uaWsgRnJpdHNjaCA8amFubmlrQHRlY2hmYWsudW5pLWJpZWxlZmVsZC5kZT4gKi8KKwkubmFtZQkJPSAiSW1hZ2VuYXRpb24gUFhDMjAwIiwKKwkudmlkZW9faW5wdXRzCT0gNSwKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gLTEsCisJLnN2aHMJCT0gMSwgLyogd2FzOiA0ICovCisJLmdwaW9tYXNrCT0gMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCwgMH0sCisJLmF1ZGlvbXV4CT0geyAwIH0sCisJLm5lZWRzX3R2YXVkaW8JPSAxLAorCS50dW5lcl90eXBlCT0gLTEsCisJLm11eHNlbF9ob29rICAgID0gUFhDMjAwX211eHNlbCwKKworfSx7CisJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4IExSNTAiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMHgxODAwLCAgLy8weDhkZmUwMAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDAsIDB4MDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZQk9IC0xLAorfSx7CisJLm5hbWUJCT0gIkZvcm1hYyBpUHJvVFYsIEZvcm1hYyBQcm9UViBJIChidDg0OCkiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDMsCisJLmdwaW9tYXNrCT0gMSwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAxLCAwLCAwLCAwLCAwIH0sCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCit9LHsKKworLyogLS0tLSBjYXJkIDB4MjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5uYW1lCQk9ICJJbnRlbCBDcmVhdGUgYW5kIFNoYXJlIFBDSS8gU21hcnQgVmlkZW8gUmVjb3JkZXIgSUlJIiwKKwkudmlkZW9faW5wdXRzCT0gNCwKKwkuYXVkaW9faW5wdXRzCT0gMCwKKwkudHVuZXIJCT0gLTEsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAwLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDAgfSwKKwkubmVlZHNfdHZhdWRpbwk9IDAsCisJLnR1bmVyX3R5cGUJPSA0LAorfSx7CisJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIFRlcnJhVFZhbHVlIFZlcnNpb24gQnQ4NzgiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMHhmZmZmMDAsCisJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eAk9IHsgMHg1MDAsIDAsIDB4MzAwLCAweDkwMCwgMHg5MDB9LAorCS5uZWVkc190dmF1ZGlvCT0gMSwKKwkucGxsCQk9IFBMTF8yOCwKKwkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAorfSx7CisJLm5hbWUJCT0gIkxlYWR0ZWsgV2luRmFzdCAyMDAwLyBXaW5GYXN0IDIwMDAgWFAiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEsIDB9LCAvLyBUViwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yCisjaWYgMAorCS5ncGlvbWFzawk9IDB4YzMzMDAwLAorCS5hdWRpb211eAk9IHsgMHg0MjIwMDAsMHgxMDAwLDB4MDAwMCwweDYyMDAwMCwweDgwMDAwMCB9LAorI2Vsc2UKKwkvKiBBbGV4YW5kZXIgVmFyYWtpbiA8YXZhcmFraW5AaG90bWFpbC5jb20+IFtzdGVyZW8gdmVyc2lvbl0gKi8KKwkuZ3Bpb21hc2sJPSAweGIzMzAwMCwKKwkuYXVkaW9tdXgJPSB7IDB4MTIyMDAwLDB4MTAwMCwweDAwMDAsMHg2MjAwMDAsMHg4MDAwMDAgfSwKKyNlbmRpZgorCS8qIEF1ZGlvIFJvdXRpbmcgZm9yICJXaW5GYXN0IDIwMDAgWFAiIChubyB0diBzdGVyZW8gISkKKwkJZ3BpbzIzIC0tIGhlZjQwNTI6bkVuYWJsZSAoMHg4MDAwMDApCisJCWdwaW8xMiAtLSBoZWY0MDUyOkExCisJICAgICAgICBncGlvMTMgLS0gaGVmNDA1MjpBMAorCSAgICAweDAwMDA6IGV4dGVybmFsIGF1ZGlvCisJICAgIDB4MTAwMDogRk0KKwkgICAgMHgyMDAwOiBUVgorCSAgICAweDMwMDA6IG4uYy4KKyAgICAgICAgICBOb3RlOiBUaGVyZSBleGlzdHMgYW5vdGhlciB2YXJpYW50ICJXaW5mYXN0IDIwMDAiIHdpdGggdHYgc3RlcmVvICE/CisJICBOb3RlOiBlZXByb20gb25seSBjb250YWlucyBGRiBhbmQgcGNpIHN1YnN5c3RlbSBpZCAxMDdkOjY2MDYKKwkgKi8KKwkubmVlZHNfdHZhdWRpbwk9IDAsCisJLnBsbAkJPSBQTExfMjgsCisJLmhhc19yYWRpbwk9IDEsCisJLnR1bmVyX3R5cGUJPSA1LCAvLyBkZWZhdWx0IGZvciBub3csIGdwaW8gcmVhZHMgQkZGRjA2IGZvciBQYWwgYmcrZGsKKwkuYXVkaW9faG9vawk9IHdpbmZhc3QyMDAwX2F1ZGlvLAorCS5oYXNfcmVtb3RlICAgICA9IDEsCit9LHsKKwkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCAvIENocm9ub3MgVmlkZW8gU2h1dHRsZSBJSSIsCisJLnZpZGVvX2lucHV0cwk9IDQsCisJLmF1ZGlvX2lucHV0cwk9IDMsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAweDE4MDAsCisJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gLTEsCit9LHsKKworLyogLS0tLSBjYXJkIDB4MjQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAgLyBUeXBob29uIFRWaWV3IFRWL0ZNIFR1bmVyIiwKKwkudmlkZW9faW5wdXRzCT0gNCwKKwkuYXVkaW9faW5wdXRzCT0gMywKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDB4MTgwMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gLTEsCisJLmhhc19yYWRpbwk9IDEsCit9LHsKKwkubmFtZQkJPSAiUHJvbGluayBQaXhlbFZpZXcgUGxheVRWIHBybyIsCisJLnZpZGVvX2lucHV0cwk9IDMsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAweGZmLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJLmF1ZGlvbXV4CT0geyAweDIxLCAweDIwLCAweDI0LCAweDJjLCAweDI5LCAweDI5IH0sCisJLm5vX21zcDM0eHgJPSAxLAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gLTEsCit9LHsKKwkubmFtZQkJPSAiQXNrZXkgQ1BIMDZYIFRWaWV3OTkiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMHg1NTFlMDAsCisJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDB9LAorCS5hdWRpb211eAk9IHsgMHg1NTE0MDAsIDB4NTUxMjAwLCAwLCAwLCAweDU1MWMwMCwgMHg1NTEyMDAgfSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSAxLAorCS5oYXNfcmVtb3RlICAgICA9IDEsCit9LHsKKwkubmFtZQkJPSAiUGlubmFjbGUgUENUViBTdHVkaW8vUmF2ZSIsCisJLnZpZGVvX2lucHV0cwk9IDMsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAweDAzMDAwRiwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAyLCAweGQwMDAxLCAwLCAwLCAxfSwKKwkubmVlZHNfdHZhdWRpbwk9IDAsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCisvKiAtLS0tIGNhcmQgMHgyOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLm5hbWUJCT0gIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQgKGJ0ODc4KSwgM0RmeCBWb29kb29UViAxMDAiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gNywKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyA0LCAwLCAyLCAzLCAxfSwKKwkubm9fbXNwMzR4eAk9IDEsCisJLm5lZWRzX3R2YXVkaW8JPSAxLAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLmhhc19yYWRpbyAgICAgID0gMSwKK30seworCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZQaG9uZSA5OCIsCisJLnZpZGVvX2lucHV0cwk9IDMsCisJLmF1ZGlvX2lucHV0cwk9IDQsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAxNSwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAxMywgNCwgMTEsIDcsIDAsIDB9LAorCS5uZWVkc190dmF1ZGlvCT0gMSwKKwkucGxsCQk9IFBMTF8yOCwKKwkudHVuZXJfdHlwZQk9IC0xLAorCS5oYXNfcmFkaW8JPSAxLAorCS5hdWRpb19ob29rCT0gYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8sCit9LHsKKwkubmFtZQkJPSAiUHJvVmlkZW8gUFY5NTEiLCAvKiBwaWMxNmM1NCAqLworCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAwLCAwLCAwLCAwLCAwfSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLm5vX21zcDM0eHgJPSAxLAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gMSwKK30seworCS5uYW1lCQk9ICJMaXR0bGUgT25BaXIgVFYiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMHhlMDBiLAorCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAorCS5hdWRpb211eAk9IHsweGZmOWZmNiwgMHhmZjlmZjYsIDB4ZmYxZmY3LCAwLCAweGZmM2ZmY30sCisJLm5vX21zcDM0eHgJPSAxLAorCS50dW5lcl90eXBlCT0gLTEsCit9LHsKKworLyogLS0tLSBjYXJkIDB4MmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5uYW1lCQk9ICJTaWdtYSBUVklJLUZNIiwKKwkudmlkZW9faW5wdXRzCT0gMiwKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAtMSwKKwkuZ3Bpb21hc2sJPSAzLAorCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAorCS5hdWRpb211eAk9IHsxLCAxLCAwLCAyLCAzfSwKKwkubm9fbXNwMzR4eAk9IDEsCisJLnBsbAkJPSBQTExfTk9ORSwKKwkudHVuZXJfdHlwZQk9IC0xLAorfSx7CisJLm5hbWUJCT0gIk1BVFJJWC1WaXNpb24gTVYtRGVsdGEgMiIsCisJLnZpZGVvX2lucHV0cwk9IDUsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IC0xLAorCS5zdmhzCQk9IDMsCisJLmdwaW9tYXNrCT0gMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCwgMH0sCisJLmF1ZGlvbXV4CT0gezAgfSwKKwkubm9fbXNwMzR4eAk9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCS5uYW1lCQk9ICJab2x0cml4IEdlbmllIFRWL0ZNIiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDB4YmNmMDNmLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDB4YmM4MDNmLCAweGJjOTAzZiwgMHhiY2IwM2YsIDAsIDB4YmNiMDNmfSwKKwkubm9fbXNwMzR4eAk9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSAyMSwKK30seworCS5uYW1lCQk9ICJUZXJyYXRlYyBUVi9SYWRpbysiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMHg3MDAwMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4CT0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwLCAweDIwMDAwIH0sCisJLm5lZWRzX3R2YXVkaW8JPSAxLAorCS5ub19tc3AzNHh4CT0gMSwKKwkucGxsCQk9IFBMTF8zNSwKKwkudHVuZXJfdHlwZQk9IDEsCisJLmhhc19yYWRpbwk9IDEsCit9LHsKKworLyogLS0tLSBjYXJkIDB4MzAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5uYW1lCQk9ICJBc2tleSBDUEgwM3gvIER5bmFsaW5rIE1hZ2ljIFRWaWV3IiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDE1LAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7MiwwLDAsMCwxfSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSAtMSwKK30seworCS5uYW1lCQk9ICJJT0RBVEEgR1YtQkNUVjMvUENJIiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDB4MDEwZjAwLAorCS5tdXhzZWwJCT0gezIsIDMsIDAsIDB9LAorCS5hdWRpb211eAk9IHsweDEwMDAwLCAwLCAweDEwMDAwLCAwLCAwLCAwfSwKKwkubm9fbXNwMzR4eAk9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSBUVU5FUl9BTFBTX1RTSEM2X05UU0MsCisJLmF1ZGlvX2hvb2sJPSBndmJjdHYzcGNpX2F1ZGlvLAorfSx7CisJLm5hbWUJCT0gIlByb2xpbmsgUFYtQlQ4NzhQKzRFIC8gUGl4ZWxWaWV3IFBsYXlUViBQQUsgLyBMZW5jbyBNWFRWLTk1NzggQ1AiLAorCS52aWRlb19pbnB1dHMJPSA1LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDMsCisJLmdwaW9tYXNrCT0gMHhBQTAwMDAsCisJLm11eHNlbAkJPSB7IDIsMywxLDEsLTEgfSwKKwkuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAorCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMCwgMHg4MDAwMCwgMHg4MDAwMCwgMHhhODAwMCwgMHg0NjAwMCAgfSwKKwkubm9fbXNwMzR4eAk9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAorCS5oYXNfcmVtb3RlCT0gMSwKKwkvKiBHUElPIHdpcmluZzogKGRpZmZlcmVudCBmcm9tIFJldi40QyAhKQorCQlHUElPMTc6IFU0LkEwIChmaXJzdCBoZWY0MDUyYnQpCisJCUdQSU8xOTogVTQuQTEKKwkJR1BJTzIwOiBVNS5BMSAoc2Vjb25kIGhlZjQwNTJidCkKKwkJR1BJTzIxOiBVNC5uRU4KKwkJR1BJTzIyOiBCVDgzMiBSZXNldCBMaW5lCisJCUdQSU8yMzogQTUsQTAsIFU1LG5FTgorCSAgIE5vdGU6IEF0IGkyYz0weDhhIGlzIGEgQnQ4MzIgY2hpcCwgd2hpY2ggY2hhbmdlcyB0byAweDg4IGFmdGVyIGJlaW5nIHJlc2V0IHZpYSBHUElPMjIKKwkgKi8KK30seworCS5uYW1lICAgICAgICAgICA9ICJFYWdsZSBXaXJlbGVzcyBDYXByaWNvcm4yIChidDg3OEEpIiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5ncGlvbWFzayAgICAgICA9IDcsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSAvKiBUVU5FUl9BTFBTX1RNREgyX05UU0MgKi8sCit9LHsKKworLyogLS0tLSBjYXJkIDB4MzQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIERhdmlkIEjkcmRlbWFuIDxkYXZpZEAyZ2VuLmNvbT4gKi8KKwkubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViBTdHVkaW8gUHJvIiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAzLAorCS5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDEsIDB4ZDAwMDEsIDAsIDAsIDEwfSwKKwkJCS8qIHNvdW5kIHBhdGggKDUgc291cmNlcyk6CisJCQkgICBNVVgxIChtYXNrIDB4MDMpLCBFbmFibGUgUGluIDB4MDggKDA9ZW5hYmxlLCAxPWRpc2FibGUpCisJCQkJMD0gZXh0LiBBdWRpbyBJTgorCQkJCTE9IGZyb20gTVVYMgorCQkJCTI9IE1vbm8gVFYgc291bmQgZnJvbSBUdW5lcgorCQkJCTM9IG5vdCBjb25uZWN0ZWQKKwkJCSAgIE1VWDIgKG1hc2sgMHgzMDAwMCk6CisJCQkJMCwyLDM9IGZyb20gTVNQMzR4eAorCQkJCTE9IEZNIHN0ZXJlbyBSYWRpbyBmcm9tIFR1bmVyICovCisJLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCit9LHsKKwkvKiBDbGFhcyBMYW5nYmVobiA8Y2xhYXNAYmlnZm9vdC5jb20+LAorCSAgIFN2ZW4gR3JvdGhrbGFncyA8c3ZlbkB1cGIuZGU+ICovCisJLm5hbWUJCT0gIlR5cGhvb24gVFZpZXcgUkRTICsgRk0gU3RlcmVvIC8gS05DMSBUViBTdGF0aW9uIFJEUyIsCisJLnZpZGVvX2lucHV0cwk9IDQsCisJLmF1ZGlvX2lucHV0cwk9IDMsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAweDFjLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDAsIDAsIDB4MTAsIDgsIDQgfSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkuaGFzX3JhZGlvCT0gMSwKK30seworCS8qIFRpbSBS9nN0ZXJtdW5kdCA8cm9zdGVybUB1bmktbXVlbnN0ZXIuZGU+CisJICAgaW4gZGUuY29tcC5vcy51bml4LmxpbnV4LmhhcmR3YXJlOgorCQlvcHRpb25zIGJ0dHYgY2FyZD0wIHBsbD0xIHJhZGlvPTEgZ3Bpb21hc2s9MHgxOGUwCisJCWF1ZGlvbXV4PTB4NDRjNzFmLDB4NDRkNzFmLDAsMHg0NGQ3MWYsMHg0NGRmZmYKKwkJb3B0aW9ucyB0dW5lciB0eXBlPTUgKi8KKwkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gMjAwMCAvRmx5VmlkZW8gQTIvIExpZmV0ZWMgTFQgOTQxNSBUViBbTFI5MF0iLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMHgxOGUwLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDB4MDAwMCwweDA4MDAsMHgxMDAwLDB4MTAwMCwweDE4ZTAgfSwKKwkJICAgICAgIC8qIEZvciBjYXJkcyB3aXRoIHRkYTk4MjAvdGRhOTgyMToKKwkJCSAgMHgwMDAwOiBUdW5lciBub3JtYWwgc3RlcmVvCisJCQkgIDB4MDA4MDogVHVuZXIgQTIgU0FQIChzZWNvbmQgYXVkaW8gcHJvZ3JhbSA9IFp3ZWlrYW5hbHRvbikKKwkJCSAgMHgwODgwOiBUdW5lciBBMiBzdGVyZW8gKi8KKwkucGxsCQk9IFBMTF8yOCwKKwkudHVuZXJfdHlwZQk9IC0xLAorfSx7CisJLyogTWlndWVsIEFuZ2VsIEFsdmFyZXogPG1hYWNydXpAbmF2ZWdhbGlhLmNvbT4KKwkgICBvbGQgRWFzeSBUViBCVDg0OCB2ZXJzaW9uIChtb2RlbCBDUEgwMzEpICovCisJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDAzMS8gQkVTVEJVWSBFYXN5IFRWIiwKKwkudmlkZW9faW5wdXRzCT0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkuZ3Bpb21hc2sgICAgICAgPSAweEYsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwfSwKKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfUEFMLAorfSx7CisKKy8qIC0tLS0gY2FyZCAweDM4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBHb3Jkb24gSGV5ZG9uIDxnamhleWRvbkBiaWdmb290LmNvbSAoJzk4KSAqLworCS5uYW1lICAgICAgICAgICA9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAiLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMywKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMHgxODAwLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSA1LAorfSx7CisJLyogVGhpcyBpcyB0aGUgdWx0aW1hdGUgY2hlYXBvIGNhcHR1cmUgY2FyZAorCSAqIGp1c3QgYSBCVDg0OEEgb24gYSBzbWFsbCBQQ0IhCisJICogU3RldmUgSG9zZ29vZCA8c3RldmVAZXF1aWluZXQuY29tPiAqLworCS5uYW1lICAgICAgICAgICA9ICJHcmFuZFRlYyAnR3JhbmQgVmlkZW8gQ2FwdHVyZScgKEJ0ODQ4KSIsCisJLnZpZGVvX2lucHV0cyAgID0gMiwKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS5zdmhzICAgICAgICAgICA9IDEsCisJLmdwaW9tYXNrICAgICAgID0gMCwKKwkubXV4c2VsICAgICAgICAgPSB7IDMsIDEgfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAorCS50dW5lcl90eXBlICAgICA9IC0xLAorfSx7CisgICAgICAgIC8qIERhbmllbCBIZXJyaW5ndG9uIDxkYW5pZWwuaGVycmluZ3RvbkBob21lLmNvbT4gKi8KKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MC8gUGhvZWJlIFRWIE1hc3RlciBPbmx5IChObyBGTSkiLAorICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAorICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAorICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAorICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAorICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGUwMCwKKyAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKKyAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAweDQwMCwgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHg4MDAsIDB4NDAwIH0sCisgICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCisgICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfNDAzNkZZNV9OVFNDLAorfSx7CisJLyogTWF0dGkgTW90dHVzIDxtb3R0dXNAcGh5c2ljLnV0LmVlPiAqLworCS5uYW1lCQk9ICJBc2tleSBDUEgwM3ggVFYgQ2FwdHVyZXIiLAorCS52aWRlb19pbnB1dHMJPSA0LAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisgICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKKyAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAyLDAsMCwwLDEgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSAwLAorfSx7CisKKy8qIC0tLS0gY2FyZCAweDNjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+ICovCisJLm5hbWUgICAgICAgICAgID0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTEwMFBDVFYiLAorCS52aWRlb19pbnB1dHMgICA9IDIsCisJLmF1ZGlvX2lucHV0cyAgID0gMiwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAtMSwKKwkuZ3Bpb21hc2sgICAgICAgPSAxMSwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMSwgOH0sCisJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKKworfSx7CisJLyogQWRyaWFuIENveCA8YWRyaWFuQGh1bWJvbGR0LmNvLnVrICovCisJLm5hbWUJICAgICAgICA9ICJBRyBFbGVjdHJvbmljcyBHTVYxIiwKKwkudmlkZW9faW5wdXRzICAgPSAyLAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyCSAgICAgICAgPSAtMSwKKwkuc3ZocwkgICAgICAgID0gMSwKKwkuZ3Bpb21hc2sgICAgICAgPSAweEYsCisJLm11eHNlbAkgICAgICAgID0geyAyLCAyfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IH0sCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS5wbGwJICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKK30seworCS8qIE1pZ3VlbCBBbmdlbCBBbHZhcmV6IDxtYWFjcnV6QG5hdmVnYWxpYS5jb20+CisJICAgbmV3IEVhc3kgVFYgQlQ4NzggdmVyc2lvbiAobW9kZWwgQ1BIMDYxKQorCSAgIHNwZWNpYWwgdGhhbmtzIHRvIEluZm9ybWF0aWNhIE1pZXJlcyBmb3IgcHJvdmlkaW5nIHRoZSBjYXJkICovCisJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MS8gQkVTVEJVWSBFYXN5IFRWIChidDg3OCkiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMgICA9IDIsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5ncGlvbWFzayAgICAgICA9IDB4RkYsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDEsIDAsIDQsIDQsIDl9LAorCS5uZWVkc190dmF1ZGlvICA9IDAsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKK30seworCS8qIEx1a2FzIEdlYmF1ZXIgPGdlYnlAdm9sbnkuY3o+ICovCisJLm5hbWUJCT0gIkFUSSBUVi1Xb25kZXIiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMHhmMDNmLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwIH0sCisJLmF1ZGlvbXV4CT0geyAweGJmZmUsIDAsIDB4YmZmZiwgMCwgMHhiZmZlfSwKKwkucGxsCQk9IFBMTF8yOCwKKwkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAorfSx7CisKKy8qIC0tLS0gY2FyZCAweDQwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBMdWthcyBHZWJhdWVyIDxnZWJ5QHZvbG55LmN6PiAqLworCS5uYW1lCQk9ICJBVEkgVFYtV29uZGVyIFZFIiwKKwkudmlkZW9faW5wdXRzCT0gMiwKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAtMSwKKwkuZ3Bpb21hc2sJPSAxLAorCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDAsIDAsIDEsIDAsIDB9LAorCS5ub19tc3AzNHh4CT0gMSwKKwkucGxsCQk9IFBMTF8yOCwKKwkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAorfSx7CisJLyogRGVlSmF5IDxkZWVqYXlAd2VzdGVsOTAwLm5ldCAoMjAwMFMpICovCisJLm5hbWUgICAgICAgICAgID0gIkxpZmV2aWV3IEZseVZpZGVvIDIwMDBTIExSOTAiLAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLmF1ZGlvX2lucHV0cyAgID0gMywKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrCT0gMHgxOGUwLAorCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKKwkJCS8qIFJhZGlvIGNoYW5nZWQgZnJvbSAxZTgwIHRvIDB4ODAwIHRvIG1ha2UKKwkJCSAgIEZseVZpZGVvMjAwMFMgaW4gLmh1IGhhcHB5IChnbSkqLworCQkJLyogLWRrLT8/Pzogc2V0IG11dGU9MHgxODAwIGZvciB0ZGE5ODc0aCBkYXVnaHRlcmJvYXJkICovCisJLmF1ZGlvbXV4CT0geyAweDAwMDAsMHgwODAwLDB4MTAwMCwweDEwMDAsMHgxODAwLCAweDEwODAgfSwKKwkuYXVkaW9faG9vawk9IGZ2MjAwMHNfYXVkaW8sCisJLm5vX21zcDM0eHgJPSAxLAorCS5ub190ZGE5ODc1CT0gMSwKKwkubmVlZHNfdHZhdWRpbyAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSA1LAorfSx7CisJLm5hbWUJCT0gIlRlcnJhdGVjIFRWYWx1ZVJhZGlvIiwKKwkudmlkZW9faW5wdXRzCT0gMywKKwkuYXVkaW9faW5wdXRzCT0gMSwKKwkudHVuZXIJCT0gMCwKKwkuc3ZocwkJPSAyLAorCS5ncGlvbWFzawk9IDB4ZmZmZjAwLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXgJPSB7IDB4NTAwLCAweDUwMCwgMHgzMDAsIDB4OTAwLCAweDkwMH0sCisJLm5lZWRzX3R2YXVkaW8JPSAxLAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJLmhhc19yYWRpbwk9IDEsCit9LHsKKwkvKiBUQU5BS0EgS2VpIDxwZWcwMDYyNUBuaWZ0eS5jb20+ICovCisJLm5hbWUgICAgICAgICAgID0gIklPREFUQSBHVi1CQ1RWNC9QQ0kiLAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMHgwMTBmMDAsCisJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDAsIDB9LAorCS5hdWRpb211eCAgICAgICA9IHsweDEwMDAwLCAwLCAweDEwMDAwLCAwLCAwLCAwfSwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9TSEFSUF8yVTVKRjU1NDBfTlRTQywKKwkuYXVkaW9faG9vayAgICAgPSBndmJjdHYzcGNpX2F1ZGlvLAorfSx7CisKKy8qIC0tLS0gY2FyZCAweDQ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gIjNEZnggVm9vZG9vVFYgRk0gKEV1cm8pLCBWb29kb29UViAyMDAgKFVTQSkiLAorCS8vIHRyeSAiaW5zbW9kIG1zcDM0MDAgc2ltcGxlPTAiIGlmIHlvdSBoYXZlCisJLy8gc291bmQgcHJvYmxlbXMgd2l0aCB0aGlzIGNhcmQuCisgICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCisgICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCisgICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCisgICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAorICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDRmOGEwMCwKKwkvLyAweDEwMDAwMDogMT1NU1AgZW5hYmxlZCAoMD1kaXNhYmxlIGFnYWluKQorCS8vIDB4MDEwMDAwOiBDb25uZWN0ZWQgdG8gIlMwIiBvbiB0ZGE5ODgwICgwPVBhbC9CRywgMT1OVFNDKQorICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7MHg5NDdmZmYsIDB4OTg3ZmZmLDB4OTQ3ZmZmLDB4OTQ3ZmZmLCAweDk0N2ZmZn0sCisJLy8gdHZ0dW5lciwgcmFkaW8sICAgZXh0ZXJuYWwsaW50ZXJuYWwsIG11dGUsICBzdGVyZW8KKwkvKiB0dW5lciwgQ29tcG9zaXQsIFNWaWQsIENvbXBvc2l0LW9uLVN2aWQtYWRhcHRlciovCisgICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMyAsMCAsMX0sCisgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKKwkucGxsCQk9IFBMTF8yOCwKKwkuaGFzX3JhZGlvCT0gMSwKK30seworCS8qIFBoaWxpcCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+ICovCisJLm5hbWUgICAgICAgICAgID0gIkFjdGl2ZSBJbWFnaW5nIEFJTU1TIiwKKwkudmlkZW9faW5wdXRzICAgPSAxLAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS5tdXhzZWwgICAgICAgICA9IHsgMiB9LAorCS5ncGlvbWFzayAgICAgICA9IDAKK30seworICAgICAgICAvKiBUb21hc3ogUHlyYSA8aGVsbGZpcmVAc2VkZXouaXEucGw+ICovCisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVDg3OFArIChSZXYuNEMsOEUpIiwKKyAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKKyAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gNCwKKyAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKKyAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKKyAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMTUsCisgICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCisgICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMTEsIDcsIDEzLCAwfSwgLy8gVFYgYW5kIFJhZGlvIHdpdGggc2FtZSBHUElPICEKKyAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKKyAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAyNSwKKwkuaGFzX3JlbW90ZSAgICAgPSAxLAorCS8qIEdQSU8gd2lyaW5nOgorCQlHUElPMDogVTQuQTAgKGhlZjQwNTJidCkKKwkJR1BJTzE6IFU0LkExCisJCUdQSU8yOiBVNC5BMSAoc2Vjb25kIGhlZjQwNTJidCkKKwkJR1BJTzM6IFU0Lm5FTiwgVTUuQTAsIEE1Lm5FTgorCQlHUElPOC0xNTogdnJkODY2YiA/CisJICovCit9LHsKKwkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThFWiAoY2FwdHVyZSBvbmx5KSBMUjUxIiwKKwkudmlkZW9faW5wdXRzCT0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lcgkJPSAtMSwKKwkuc3ZocwkJPSAyLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwgLy8gQVYxLCBBVjIsIFNWSFMsIENWaWQgYWRhcHRlciBvbiBTVkhTCisJLnBsbAkJPSBQTExfMjgsCisJLm5vX21zcDM0eHgJPSAxLAorfSx7CisKKy8qIC0tLS0gY2FyZCAweDQ4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBEYXJpdXN6IEtvd2FsZXdza2kgPGRhcmVra0BhdXRvbWV4LnBsPiAqLworCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVDg3OFArOUIgKFBsYXlUViBQcm8gcmV2LjlCIEZNK05JQ0FNKSIsCisJLnZpZGVvX2lucHV0cwk9IDQsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAweDNmLAorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJLmF1ZGlvbXV4CT0geyAweDAxLCAweDAwLCAweDAzLCAweDAzLCAweDA5LCAweDAyIH0sCisJLm5lZWRzX3R2YXVkaW8gID0gMSwKKwkubm9fbXNwMzR4eAk9IDEsCisJLm5vX3RkYTk4NzUJPSAxLAorCS5wbGwJCT0gUExMXzI4LAorCS50dW5lcl90eXBlCT0gNSwKKwkuYXVkaW9faG9vawk9IHB2YnQ4NzhwOWJfYXVkaW8sIC8vIE5vdGU6IG5vdCBhbGwgY2FyZHMgaGF2ZSBzdGVyZW8KKwkuaGFzX3JhZGlvCT0gMSwgIC8vIE5vdGU6IG5vdCBhbGwgY2FyZHMgaGF2ZSByYWRpbworCS5oYXNfcmVtb3RlICAgICA9IDEsCisJLyogR1BJTyB3aXJpbmc6CisJCUdQSU8wOiBBMCBoZWY0MDUyCisJCUdQSU8xOiBBMSBoZWY0MDUyCisJCUdQSU8zOiBuRU4gaGVmNDA1MgorCQlHUElPOC0xNTogdnJkODY2YgorCQlHUElPMjAsMjIsMjM6IFIzMCxSMjksUjI4CisJICovCit9LHsKKwkvKiBDbGF5IEt1bnogPGNrdW56QG1haWwuYXJjLm5hc2EuZ292PiAqLworCS8qIHlvdSBtdXN0IGp1bXBlciBKUDUgZm9yIHRoZSBjYXJkIHRvIHdvcmsgKi8KKwkubmFtZSAgICAgICAgICAgPSAiU2Vuc29yYXkgMzExIiwKKwkudmlkZW9faW5wdXRzICAgPSA1LAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gNCwKKwkuZ3Bpb21hc2sgICAgICAgPSAwLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCwgMH0sCisJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCisJLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKK30seworCS8qIE1pZ3VlbCBGcmVpdGFzIDxtaWd1ZWxAY2V0dWMucHVjLXJpby5icj4gKi8KKwkubmFtZSAgICAgICAgICAgPSAiUmVtb3RlVmlzaW9uIE1YIChSVjYwNSkiLAorCS52aWRlb19pbnB1dHMgICA9IDE2LAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gLTEsCisJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKKwkuZ3Bpb21hc2syICAgICAgPSAweDA3ZmYsCisJLm11eHNlbCAgICAgICAgID0geyAweDMzLCAweDEzLCAweDIzLCAweDQzLCAweGYzLCAweDczLCAweGUzLCAweDAzLAorCQkJICAweGQzLCAweGIzLCAweGMzLCAweDYzLCAweDkzLCAweDUzLCAweDgzLCAweGEzIH0sCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS5tdXhzZWxfaG9vayAgICA9IHJ2NjA1X211eHNlbCwKK30seworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiUG93ZXJjb2xvciBNVFY4NzgvIE1UVjg3OFIvIE1UVjg3OEYiLAorICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAorICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAyLAorCS50dW5lcgkJPSAwLAorICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAorICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDFDODAwRiwgIC8vIEJpdDAtMjogQXVkaW8gc2VsZWN0LCA4LTEyOnJlbW90ZSBjb250cm9sIDE0OnJlbW90ZSB2YWxpZCAxNTpyZW1vdGUgcmVzZXQKKyAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAxLCAxLCB9LAorICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDIsIDQgfSwKKyAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJLnBsbAkJPSBQTExfMjgsCisJLmhhc19yYWRpbwk9IDEsCit9LHsKKworLyogLS0tLSBjYXJkIDB4NGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAvKiBNYXNha2kgU3V6dWtpIDxtYXNha2lAYnRyZWUub3JnPiAqLworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQ2Fub3B1cyBXaW5EVlIgUENJIChDT01QQVEgUHJlc2FyaW8gMzUyNEpQLCA1MTEySlApIiwKKyAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKKyAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKKyAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKKyAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKKyAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgxNDAwMDcsCisgICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAorICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDQsIDAgfSwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAorICAgICAgICAuYXVkaW9faG9vayAgICAgPSB3aW5kdnJfYXVkaW8sCit9LHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkdyYW5kVGVjIE11bHRpIENhcHR1cmUgQ2FyZCAoQnQ4NzgpIiwKKyAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKKyAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKKyAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCisgICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAorICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAwLAorICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKKyAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCisgICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCit9LHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkpldHdheSBUVi9DYXB0dXJlIEpXLVRWODc4LUZCSywgS3dvcmxkIEtXLVRWODc4UkYiLAorICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAorICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAzLAorICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAorICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAorICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSA3LAorICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwgICAvLyBUdW5lciwgU1ZpZCwgU1ZIUywgU1ZpZCB0byBTVkhTIGNvbm5lY3RvcgorICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAgLDAgLDQsIDQsNCw0fSwvLyBZZXMsIHRoaXMgdHVuZXIgdXNlcyB0aGUgc2FtZSBhdWRpbyBvdXRwdXQgZm9yIFRWIGFuZCBGTSByYWRpbyEKKwkJCQkJICAvLyBUaGlzIGNhcmQgbGFja3MgZXh0ZXJuYWwgQXVkaW8gSW4sIHNvIHdlIG11dGUgaXQgb24gRXh0LiAmIEludC4KKwkJCQkJICAvLyBUaGUgUENCIGNhbiB0YWtlIGEgc2J4MTYzNy9zYngxNjczLCB3aXJpbmcgdW5rbm93bi4KKwkJCQkJICAvLyBUaGlzIGNhcmQgbGFja3MgUENJIHN1YnN5c3RlbSBJRCwgc2lnaC4KKwkJCQkJICAvLyBhdWRpb211eD0xOiBsb3dlciB2b2x1bWUsIDIrMzogbXV0ZQorCQkJCQkgIC8vIGJ0d2luY2FwIHVzZXMgMHg4MDAwMC8weDgwMDAzCisgICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNSwgLy8gU2Ftc3VuZyBUQ1BBOTA5NVBDMjdBIChCRytESyksIHBoaWxpcHMgY29tcGF0aWJsZSwgdy9GTSwgc3RlcmVvIGFuZAorCQkJICAgLy8gcmFkaW8gc2lnbmFsIHN0cmVuZ3RoIGluZGljYXRvcnMgd29yayBmaW5lLgorCS5oYXNfcmFkaW8JCT0gMSwKKwkvKiBHUElPIEluZm86CisJCUdQSU8wLDE6ICAgSEVGNDA1MiBBMCxBMQorCQlHUElPMjogICAgIEhFRjQwNTIgbkVOQUJMRQorCQlHUElPMy03OiAgIG4uYy4KKwkJR1BJTzgtMTM6ICBJUkRDMzU3IGRhdGEwLTUgKGRhdGE2IG4uYy4gPykgW2NoaXAgbm90IHByZXNlbnQgb24gbXkgY2FyZF0KKwkJR1BJTzE0LDE1OiA/PworCQlHUElPMTYtMjE6IG4uYy4KKwkJR1BJTzIyLDIzOiA/PworCQk/PyAgICAgICA6IG10dThiNTZlcCBtaWNyb2NvbnRyb2xsZXIgZm9yIElSIChHUElPIHdpcmluZyB1bmtub3duKSovCit9LHsKKyAgICAgICAgLyogQXJ0aHVyIFRldHpsYWZmLURlYXMsIERTUCBEZXNpZ24gTHRkIDxzb2Z0d2FyZUBkc3BkZXNpZ24uY29tPiAqLworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiRFNQIERlc2lnbiBUQ1ZJREVPIiwKKyAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKKyAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCisgICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCisgICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCit9LHsKKworICAgICAgICAvKiAtLS0tIGNhcmQgMHg1MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLm5hbWUgICAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBQVlIiLAorICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAorICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAorICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAorICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAorICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDAsIDEsIDF9LAorICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAorICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCisgICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAorCisJLmdwaW9tYXNrICAgICAgID0gNywKKwkuYXVkaW9tdXggICAgICAgPSB7N30sCit9LHsKKwkubmFtZSAgICAgICAgICAgPSAiSU9EQVRBIEdWLUJDVFY1L1BDSSIsCisJLnZpZGVvX2lucHV0cyAgID0gMywKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkuZ3Bpb21hc2sgICAgICAgPSAweDBmMGY4MCwKKwkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMH0sCisJLmF1ZGlvbXV4ICAgICAgID0gezB4MDMwMDAwLCAweDAxMDAwMCwgMCwgMCwgMHgwMjAwMDAsIDB9LAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorCS5hdWRpb19ob29rICAgICA9IGd2YmN0djVwY2lfYXVkaW8sCisJLmhhc19yYWRpbyAgICAgID0gMSwKK30seworCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAwLzE1MCAoODc4KSIsIC8qIDB4MSgyfDMpLTQ1QzYtQzEgKi8KKwkudmlkZW9faW5wdXRzICAgPSA0LCAgICAgICAgICAgICAgICAgIC8qIGlkLWlucHV0cy1jbG9jayAqLworCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gMywKKwkubXV4c2VsICAgICAgICAgPSB7IDMsIDIsIDAsIDEgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCit9LHsKKwkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMC8xNTAgKDg0OCkiLCAvKiAweDA0LTU0QzAtQzEgJiBvbGRlciBib2FyZHMgKi8KKwkudmlkZW9faW5wdXRzICAgPSAzLAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCit9LHsKKworCS8qIC0tLS0gY2FyZCAweDU0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMSAoODQ4KSIsIC8qIDB4MDUtNDBDMC1DMSAqLworCS52aWRlb19pbnB1dHMgICA9IDIsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAxLAorCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSB9LAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKKyAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKKyAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKKyAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKK30seworCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxLzE1MSIsICAgICAgIC8qIDB4MSg0fDUpLTAwMDQtQzQgKi8KKwkudmlkZW9faW5wdXRzICAgPSAxLAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gLTEsCisJLm11eHNlbCAgICAgICAgID0geyAwIH0sCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IC0xLAorICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAorICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAorICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAorfSx7CisJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEvMTUxIHcvIHN2aWQiLCAgLyogMHgoMTZ8MTd8MjApLTAwQzQtQzEgKi8KKwkudmlkZW9faW5wdXRzICAgPSAyLAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gMSwKKwkubXV4c2VsICAgICAgICAgPSB7IDAsIDEgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCit9LHsKKwkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMC8yMDEvMjUwLzI1MSIsICAvKiAweDEoOHw5fEV8RiktMDAwNC1DNCAqLworCS52aWRlb19pbnB1dHMgICA9IDEsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAtMSwKKwkubXV4c2VsICAgICAgICAgPSB7IDAgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCit9LHsKKworCS8qIC0tLS0gY2FyZCAweDU4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMC8yNTAiLCAgIC8qIDB4MShBfEIpLTAwQzQtQzEgKi8KKwkudmlkZW9faW5wdXRzICAgPSAyLAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gMSwKKwkubXV4c2VsICAgICAgICAgPSB7IDAsIDEgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCit9LHsKKwkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIxMC8yMjAiLCAgIC8qIDB4MShBfEIpLTA0QzAtQzEgKi8KKwkudmlkZW9faW5wdXRzICAgPSAyLAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gMSwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCit9LHsKKwkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDUwMCIsICAgLyogNTAwICovCisJLnZpZGVvX2lucHV0cyAgID0gMiwKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS5zdmhzICAgICAgICAgICA9IDEsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IC0xLAorICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAorICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAorICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAorfSx7CisgICAgICAgLm5hbWUgICAgICAgICAgID0gIk9zcHJleSA1NDAiLCAgIC8qIDU0MCAqLworICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCisgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKKyAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKKyNpZiAwIC8qIFRPRE8gLi4uICovCisgICAgICAgLnN2aHMgICAgICAgICAgID0gT1NQUkVZNTQwX1NWSURfQU5BTE9HLAorICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgICAgICAgW09TUFJFWTU0MF9DT01QX0FOQUxPR10gPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtPU1BSRVk1NDBfU1ZJRF9BTkFMT0ddID0gMywgfSwKKyNlbmRpZgorICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKyAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKKyAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAorICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCisgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKyNpZiAwIC8qIFRPRE8gLi4uICovCisgICAgICAgLm11eHNlbF9ob29rICAgID0gb3NwcmV5XzU0MF9tdXhzZWwsCisgICAgICAgLnBpY3R1cmVfaG9vayAgID0gb3NwcmV5XzU0MF9zZXRfcGljdHVyZSwKKyNlbmRpZgorfSx7CisKKwkvKiAtLS0tIGNhcmQgMHg1QyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMDAwIiwgIC8qIDIwMDAgKi8KKwkudmlkZW9faW5wdXRzICAgPSAyLAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gMSwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsICAgICAgLyogbXVzdCBhdm9pZCwgY29uZmxpY3RzIHdpdGggdGhlIGJ0ODYwICovCit9LHsKKwkvKiBNIEcgQmVyYmVyaWNoIDxiZXJiZXJpY0Bmb3J3aXNzLnVuaS1wYXNzYXUuZGU+ICovCisJLm5hbWUgICAgICAgICAgID0gIklEUyBFYWdsZSIsCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS5ncGlvbWFzayAgICAgICA9IDAsCisJLm11eHNlbCAgICAgICAgID0geyAwLCAxLCAyLCAzIH0sCisJLm11eHNlbF9ob29rICAgID0gZWFnbGVfbXV4c2VsLAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCit9LHsKKwkubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViBTYXQiLAorCS52aWRlb19pbnB1dHMgICA9IDIsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAorCS5ncGlvbWFzayAgICAgICA9IDB4MDEsCisJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAxIH0sCisJLm11eHNlbCAgICAgICAgID0geyAzLCAwLCAxLCAyfSwKKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkubm9fZ3Bpb2lycSAgICAgPSAxLAorCS5oYXNfZHZiICAgICAgICA9IDEsCit9LHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkZvcm1hYyBQcm9UViBJSSAoYnQ4NzgpIiwKKyAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKKyAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKKyAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKKyAgICAgICAgLnN2aHMgICAgICAgICAgID0gMywKKyAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMiwKKwkvLyBUViwgQ29tcDEsIENvbXBvc2l0ZSBvdmVyIFNWSUQgY29uLCBTVklECisgICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCisgICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMiwgMiwgMCwgMCwgMCB9LAorICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLmhhc19yYWRpbyAgICAgID0gMSwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisgICAgICAvKiBzb3VuZCByb3V0aW5nOgorICAgICAgICAgICBHUElPPTB4MDAsMHgwMSwweDAzOiBtdXRlICg/KQorICAgICAgICAgICAgICAweDAyOiBib3RoIFRWIGFuZCByYWRpbyAodHVuZXI6IEZNMTIxNi9JKQorICAgICAgICAgVGhlIGNhcmQgaGFzIG9uYm9hcmQgYXVkaW8gY29ubmVjdG9ycyBsYWJlbGVkICJjZHJvbSIgYW5kICJib2FyZCIsCisJIG5vdCBzb2xkZXJlZCBoZXJlLCB0aG91Z2ggdW5rbm93biB3aXJpbmcuCisgICAgICAgICBDYXJkIGxhY2tzOiBleHRlcm5hbCBhdWRpbyBpbiwgcGNpIHN1YnN5c3RlbSBpZC4KKyAgICAgICAqLworfSx7CisKKwkvKiAtLS0tIGNhcmQgMHg2MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLm5hbWUgICAgICAgICAgID0gIk1hY2hUViIsCisgICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCisgICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCisgICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCisgICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAorICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSA3LAorICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAorICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAorICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAorICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA1LAorCS5wbGwgICAgICAgICAgICA9IDEsCit9LHsKKwkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8iLAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5ncGlvbWFzayAgICAgICA9IDAsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCit9LHsKKwkvKiBMdWMgVmFuIEhvZXlsYW5kdCA8bHVjQGUtbWFnaWMuYmU+ICovCisJLm5hbWUgICAgICAgICAgID0gIlByb1ZpZGVvIFBWMTUwIiwgLyogMHg0ZiAqLworCS52aWRlb19pbnB1dHMgICA9IDIsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAtMSwKKwkuZ3Bpb21hc2sgICAgICAgPSAwLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAorCS5hdWRpb211eCAgICAgICA9IHsgMCB9LAorCS5uZWVkc190dmF1ZGlvICA9IDAsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCit9LHsKKwkvKiBIaXJvc2hpIFRha2VrYXdhIDxzaWFuQGJpZy5vci5qcD4gKi8KKwkvKiBUaGlzIGNhcmQgbGFja3Mgc3Vic3lzdGVtIElEICovCisJLm5hbWUgICAgICAgICAgID0gIkFELVRWSzUwMyIsIC8qIDB4NjMgKi8KKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5ncGlvbWFzayAgICAgICA9IDB4MDAxZTgwMDcsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCisJLyogICAgICAgICAgICAgICAgICBUdW5lciwgUmFkaW8sIGV4dGVybmFsLCBpbnRlcm5hbCwgb2ZmLCAgb24gKi8KKwkuYXVkaW9tdXggICAgICAgPSB7IDB4MDgsICAweDBmLCAgMHgwYSwgICAgIDB4MDgsICAgICAweDBmLCAweDA4IH0sCisJLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSAyLAorCS5hdWRpb19ob29rCT0gYWR0dms1MDNfYXVkaW8sCit9LHsKKworCS8qIC0tLS0gY2FyZCAweDY0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkhlcmN1bGVzIFNtYXJ0IFRWIFN0ZXJlbyIsCisgICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCisgICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCisgICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCisgICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCisgICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MDAsCisgICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAorICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAorICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAorICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCisgICAgICAgIC50dW5lcl90eXBlICAgICA9IDUsCisJLyogTm90ZXM6CisJICAgLSBjYXJkIGxhY2tzIHN1YnN5c3RlbSBJRAorCSAgIC0gc3RlcmVvIHZhcmlhbnQgdy8gZGF1Z2h0ZXIgYm9hcmQgd2l0aCB0ZGE5ODc0YSBAMHhiMAorCSAgIC0gQXVkaW8gUm91dGluZzoKKwkJYWx3YXlzIGZyb20gdGRhOTg3NCBpbmRlcGVuZGVudCBvZiBHUElPICg/KQorCQlleHRlcm5hbCBsaW5lIGluOiB1bmtub3duCisJICAgLSBPdGhlciBjaGlwczogZW03OHAxNTZlbHAgQCAweDk2IChwcm9iYWJseSBJUiByZW1vdGUgY29udHJvbCkKKwkgICAgICAgICAgICAgIGhlZjQwNTMgKGluc3RlYWQgNDA1MikgZm9yIHVua25vd24gZnVuY3Rpb24KKwkqLworfSx7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQYWNlIFRWICYgUmFkaW8gQ2FyZCIsCisgICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCisgICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCisgICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCisgICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCisgICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sIC8vIFR1bmVyLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IKKyAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMCwKKyAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKKyAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gMSwKKyAgICAgICAgLmhhc19yYWRpbyAgICAgID0gMSwKKyAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorICAgICAgICAvKiBCdDg3OCwgQnQ4MzIsIEZJMTI0NiB0dW5lcjsgbm8gcGNpIHN1YnN5c3RlbSBpZAorICAgICAgICAgICBvbmx5IGludGVybmFsIGxpbmUgb3V0OiAoNHBpbiBoZWFkZXIpIFJHR0wKKyAgICAgICAgICAgUmFkaW8gbXVzdCBiZSBkZWNvZGVkIGJ5IG1zcDM0MTBkIChub3Qgcm91dGVkIHRocm91Z2gpKi8KKyAgICAgICAgLy8gICAgICAgICAuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLCAvLyB0b2RvIQorfSx7CisgICAgICAgIC8qIENocmlzIFdpbGxpbmcgPGNocmlzQHZpc2xhYi51c3lkLmVkdS5hdT4gKi8KKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gIklWQy0yMDAiLAorICAgICAgICAudmlkZW9faW5wdXRzICAgPSAxLAorICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAorICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCisgICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAorICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGRmLAorICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIgfSwKKyAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorfSx7CisJLm5hbWUgICAgICAgICAgID0gIkdyYW5kIFgtR3VhcmQgLyBUcnVzdCA4MTRQQ0kiLAorCS52aWRlb19pbnB1dHMgICA9IDE2LAorICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAorICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKKyAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCisJLnR1bmVyX3R5cGUgICAgID0gNCwKKyAgICAgICAgLmdwaW9tYXNrMiAgICAgID0gMHhmZiwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsMiwyLDIsIDMsMywzLDMsIDEsMSwxLDEsIDAsMCwwLDAgfSwKKwkubXV4c2VsX2hvb2sgICAgPSB4Z3VhcmRfbXV4c2VsLAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKyAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCit9LHsKKworCS8qIC0tLS0gY2FyZCAweDY4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkubmFtZSAgICAgICAgICAgPSAiTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViIsCisJLnZpZGVvX2lucHV0cyAgID0gMSwKKyAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gLTEsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLmhhc19kdmIgICAgICAgID0gMSwKKwkubm9fZ3Bpb2lycSAgICAgPSAxLAorfSx7CisJLyogSm9yZ2UgQm9uY29tcHRlIC0gRFRJMiA8am9yZ2VAZHRpMi5uZXQ+ICovCisJLm5hbWUgICAgICAgICAgID0gIlByb1ZpZGVvIFBWMTQzIiwKKyAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKKyAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKKyAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCisgICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAorICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAwLAorICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKKyAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCisgICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCit9LHsKKwkvKiBNLktsYWhyQHBoeXRlYy5kZSAqLworCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5LVgxIE1pbmlESU4gKGJ0ODc4KSIsCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLworCS5zdmhzICAgICAgICAgICA9IDMsCisJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAorCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLworCS5uZWVkc190dmF1ZGlvICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IC0xLAorfSx7CisJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgQ29tYmkgKGJ0ODc4KSIsCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLworCS5zdmhzICAgICAgICAgICA9IDMsCisJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLworCS5uZWVkc190dmF1ZGlvICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IC0xLAorfSx7CisKKwkvKiAtLS0tIGNhcmQgMHg2YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDkgTWluaURJTiAoYnQ4NzgpIiwKKwkudmlkZW9faW5wdXRzICAgPSAxMCwKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLworCS5zdmhzICAgICAgICAgICA9IDksCisJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKKwkuZ3Bpb21hc2syICAgICAgPSAweDAzLCAvKiBncGlvbWFzazIgZGVmaW5lcyB0aGUgYml0cyB1c2VkIHRvIHN3aXRjaCBhdWRpbworCQkJCSAgIHZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKKwkJCQkgICB4dGVybmFsIHZpZGVvLW11eCAqLworCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHgwMywgMHgxMywgMHgyMywgMHgzMywgMHgwMSwgMHgwMCB9LAorCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLworCS5uZWVkc190dmF1ZGlvICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IC0xLAorfSx7CisJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDkgQ29tYmkgKGJ0ODc4KSIsCisJLnZpZGVvX2lucHV0cyAgID0gMTAsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KKwkuc3ZocyAgICAgICAgICAgPSA5LAorCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCisJLmdwaW9tYXNrMiAgICAgID0gMHgwMywgLyogZ3Bpb21hc2syIGRlZmluZXMgdGhlIGJpdHMgdXNlZCB0byBzd2l0Y2ggYXVkaW8KKwkJCQkgICB2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCisJCQkJICAgeHRlcm5hbCB2aWRlby1tdXggKi8KKwkubXV4c2VsICAgICAgICAgPSB7IDB4MDIsIDB4MTIsIDB4MjIsIDB4MzIsIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4MDEsIDB4MDEgfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KKwkubmVlZHNfdHZhdWRpbyAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKK30seworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiSVZDLTEwMCIsCisgICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCisgICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCisgICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAorICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKKyAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCisgICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4ZGYsCisgICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAorICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCit9LHsKKwkvKiBJVkMtMTIwRyAtIEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT4gKi8KKwkubmFtZSAgICAgICAgICAgPSAiSVZDLTEyMEciLAorCS52aWRlb19pbnB1dHMgICA9IDE2LAorCS5hdWRpb19pbnB1dHMgICA9IDAsICAgIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCisJLnR1bmVyICAgICAgICAgID0gLTEsICAgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyBzdmhzICovCisJLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKKwkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAorCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKKwkJCSAgICAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwIH0sCisJLm11eHNlbF9ob29rICAgID0gaXZjMTIwX211eHNlbCwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCit9LHsKKworCS8qIC0tLS0gY2FyZCAweDcwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkubmFtZSAgICAgICAgICAgPSAicGNIRFRWIEhELTIwMDAgVFYiLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKKwkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0FUU0MsCisJLmhhc19kdmIgICAgICAgID0gMSwKK30seworCS5uYW1lICAgICAgICAgICA9ICJUd2luaGFuIERTVCArIGNsb25lcyIsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCS5ub192aWRlbyAgICAgICA9IDEsCisJLmhhc19kdmIgICAgICAgID0gMSwKK30seworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiV2luZmFzdCBWQzEwMCIsCisJLnZpZGVvX2lucHV0cyAgID0gMywKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gLTEsIC8vIG5vIHR1bmVyCisJLm11eHNlbCAgICAgICAgID0geyAzLCAxLCAxLCAzfSwgLy8gVmlkIEluLCBTVmlkIEluLCBWaWQgb3ZlciBTVmlkIGluIGNvbm5lY3RvcgorICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAorICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAorICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAorICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCisgICAgICAgIC5ub192aWRlbyAgICAgICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorfSx7CisJLm5hbWUgICAgICAgICAgID0gIlRlcHBybyBURVYtNTYwL0ludGVyVmlzaW9uIElWLTU2MCIsCisJLnZpZGVvX2lucHV0cyAgID0gMywKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkuZ3Bpb21hc2sgICAgICAgPSAzLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4ICAgICAgID0geyAxLCAxLCAxLCAxLCAwfSwKKwkubmVlZHNfdHZhdWRpbyAgPSAxLAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKK30seworCisJLyogLS0tLSBjYXJkIDB4NzQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiU0lNVVMgR1ZDMTEwMCIsCisgICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCisgICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCisgICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAorICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCisgICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKyAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAyLCAyLCAyfSwKKyAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgzRiwKKwkubXV4c2VsX2hvb2sgICAgPSBndmMxMTAwX211eHNlbCwKK30seworICAgICAgICAvKiBDYXJsb3MgU2lsdmEgcjNwZWtAcjNwZWsuaG9tZWxpbnV4Lm9yZyB8fCBjYXJkIDB4NzUgKi8KKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gIk5HUyBOR1NUVisiLAorICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAorICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAorICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAorICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKKyAgICAgICAgLm11eHNlbCAgICAgICAgID0gezIsIDMsIDAsIDB9LAorICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7MCwgMCwgMCwgMCwgMHgwMDAwMDMsIDB9LAorICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCisgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorICAgICAgICAuaGFzX3JlbW90ZSAgICAgPSAxLAorfSx7CisgICAgICAgIC8qIGh0dHA6Ly9saW51eG1lZGlhbGFicy5jb20gKi8KKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkxNTEJUNCIsCisgICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsIC8qIElOMSxJTjIsSU4zLElONCAqLworICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAorICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKKyAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCisgICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAorICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAorICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAorICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAorICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAwLAorfSx7CisJLyogSGVsbXJvb3MgSGFycmkgPGhhcnJpLmhlbG1yb29zQHBwLmluZXQuZmk+ICovCisJLm5hbWUgICAgICAgICAgID0gIlRla3JhbSBNMjA1IFBSTyIsCisJLnZpZGVvX2lucHV0cyAgID0gMywKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS5ncGlvbWFzayAgICAgICA9IDB4NjgsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDB4NjgsIDB4NjgsIDB4NjEsIDB4NjEsIDB4MDAgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCit9LHsKKworCS8qIC0tLS0gY2FyZCAweDc4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBKYXZpZXIgQ2VuZGFuIEFyZXMgPGpjZW5kYW5AbHljb3MuZXM+ICovCisJLyogYnQ4NzggVFYgKyBGTSB3aXRob3V0IHN1YnN5c3RlbSBJRCAqLworCS5uYW1lICAgICAgICAgICA9ICJDb25jZXB0cm9uaWMgQ09OVFZGTWkiLAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCisJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAyLCAzIH0sCisJLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJLmhhc19yZW1vdGUgICAgID0gMSwKKwkuaGFzX3JhZGlvICAgICAgPSAxLAorfSx7CisJLypFcmljIERFQklFRiA8ZGViaWVmQHRlbGVtc2EuY29tPiovCisJLypFVVJFU1lTIFBpY29sbyBUZXRyYSA6IDQgQ29uZXhhbnQgRnVzaW9uIDg3OEEsIG5vIGF1ZGlvLCB2aWRlbyBpbnB1dCBzZXQgd2l0aCBhbmFsb2cgbXVsdGlwbGV4ZXJzIEdQSU8gY29udHJvbGVkKi8KKwkvKiBhZGRzIHBpY29sb190ZXRyYV9tdXhzZWwoKSwgcGljb2xvX3RldHJhX2luaXQoKSwgdGhlIGZvbG93aW5nIGRlY2xhcmF0aW9uIHN0cnVjdXJlLCBhbmQgI2RlZmluZSBCVFRWX1BJQ09MT19URVRSQV9DSElQKi8KKwkvKjB4NzkgaW4gYnR0di5oKi8KKwkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8gVGV0cmEiLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAtMSwKKwkuZ3Bpb21hc2sgICAgICAgPSAwLAorCS5ncGlvbWFzazIgICAgICA9IDB4M0M8PDE2LC8qU2V0IHRoZSBHUElPWzE4XS0+R1BJT1syMV0gYXMgb3V0cHV0IHBpbi49PT4gZHJpdmUgdGhlIHZpZGVvIGlucHV0cyB0aHJvdWdoIGFuYWxvZyBtdWx0aXBsZXhlcnMqLworCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAorCS5tdXhzZWwgICAgICAgICA9IHsyLDIsMiwyfSwvKjg3OEEgaW5wdXQgaXMgYWx3YXlzIE1VWDAsIHNlZSBhYm92ZS4qLworCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLworCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS5tdXhzZWxfaG9vayAgICA9IHBpY29sb190ZXRyYV9tdXhzZWwsLypSZXF1aXJlZCBhcyBpdCBkb2Vzbid0IGZvbGxvdyB0aGUgY2xhc3NpYyBpbnB1dCBzZWxlY3Rpb24gcG9saWN5Ki8KK30seworCS8qIFNwaXJpdCBUViBUdW5lciBmcm9tIGh0dHA6Ly9zcGlyaXRtb2RlbXMuY29tLmF1ICovCisJLyogU3RhZmZvcmQgR29vZHNlbGwgPHN1cmdlQGdvbGlhdGguaG9tZXVuaXgub3JnPiAqLworCS5uYW1lICAgICAgICAgICA9ICJTcGlyaXQgVFYgVHVuZXIiLAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMHgwMDAwMDAwZiwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDEsIDEgfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCit9LHsKKwkvKiBXb2xmcmFtIEpvb3N0IDx3b2pvQGZyb2thc2Nod2VpLmRlPiAqLworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQVZlck1lZGlhIEFWZXJUViBEVkItVCA3NzEiLAorICAgICAgICAudmlkZW9faW5wdXRzICAgPSAyLAorICAgICAgICAuc3ZocyAgICAgICAgICAgPSAxLAorICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKKyAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDMgLCAzIH0sCisgICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCisgICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCisgICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKyAgICAgICAgLmhhc19kdmIgICAgICAgID0gMSwKKyAgICAgICAgLm5vX2dwaW9pcnEgICAgID0gMSwKKyAgICAgICAgLmhhc19yZW1vdGUgICAgID0gMSwKK30seworCS8qIC0tLS0gY2FyZCAweDdjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBNYXR0IEplc3NvbiA8ZHZiQGplc3Nvbi5lY2xpcHNlLmNvLnVrPiAqLworCS8qIEJhc2VkIG9uIHRoZSBOZWJ1bGEgY2FyZCBkYXRhIC0gYWRkZWQgcmVtb3RlIGFuZCBuZXcgY2FyZCBudW1iZXIgLSBCVFRWX0FWRFZCVF83NjEsIHNlZSBhbHNvIGlyLWtiZC1ncGlvLmMgKi8KKwkubmFtZSAgICAgICAgICAgPSAiQXZlck1lZGlhIEF2ZXJUViBEVkItVCA3NjEiLAorCS52aWRlb19pbnB1dHMgICA9IDIsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gMSwKKwkubXV4c2VsICAgICAgICAgPSB7IDMsIDEsIDIsIDB9LCAvKiBDb21wMCwgUy1WaWRlbywgPywgPyAqLworCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkuaGFzX2R2YiAgICAgICAgPSAxLAorCS5ub19ncGlvaXJxICAgICA9IDEsCisJLmhhc19yZW1vdGUgICAgID0gMSwKK30seworCS8qIGFuZHJlLnNjaHdhcnpAbWF0cml4LXZpc2lvbi5kZSAqLworCS5uYW1lICAgICAgICAgICAgID0gIk1BVFJJWCBWaXNpb24gU2lnbWEtU1EiLAorCS52aWRlb19pbnB1dHMgICAgID0gMTYsCisJLmF1ZGlvX2lucHV0cyAgICAgPSAwLAorCS50dW5lciAgICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgICAgPSAtMSwKKwkuZ3Bpb21hc2sgICAgICAgICA9IDB4MCwKKwkubXV4c2VsICAgICAgICAgICA9IHsgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKwkJCSAgICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKKwkubXV4c2VsX2hvb2sgICAgICA9IHNpZ21hU1FfbXV4c2VsLAorCS5hdWRpb211eCAgICAgICAgID0geyAwIH0sCisJLm5vX21zcDM0eHggICAgICAgPSAxLAorCS5wbGwgICAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICAgID0gLTEsCit9LHsKKwkvKiBhbmRyZS5zY2h3YXJ6QG1hdHJpeC12aXNpb24uZGUgKi8KKwkubmFtZSAgICAgICAgICAgICA9ICJNQVRSSVggVmlzaW9uIFNpZ21hLVNMQyIsCisJLnZpZGVvX2lucHV0cyAgICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICAgID0gMCwKKwkudHVuZXIgICAgICAgICAgICA9IC0xLAorCS5zdmhzICAgICAgICAgICAgID0gLTEsCisJLmdwaW9tYXNrICAgICAgICAgPSAweDAsCisJLm11eHNlbCAgICAgICAgICAgPSB7IDIsIDIsIDIsIDIgfSwKKwkubXV4c2VsX2hvb2sgICAgICA9IHNpZ21hU0xDX211eHNlbCwKKwkuYXVkaW9tdXggICAgICAgICA9IHsgMCB9LAorCS5ub19tc3AzNHh4ICAgICAgID0gMSwKKwkucGxsICAgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgICA9IC0xLAorfSx7CisJLyogQlRUVl9BUEFDX1ZJRVdDT01QICovCisJLyogQXR0aWxhIEtvbmRvcm9zIDxhdHRpbGEua29uZG9yb3NAY2hlbGxvLmh1PiAqLworCS8qIGJ0ODc4IFRWICsgRk0gMHgwMDAwMDAwMCBzdWJzeXN0ZW0gSUQgKi8KKwkubmFtZSAgICAgICAgICAgPSAiQVBBQyBWaWV3Y29tcCA4NzgoQU1BWCkiLAorCS52aWRlb19pbnB1dHMgICA9IDIsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS5ncGlvbWFzayAgICAgICA9IDB4RkYsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwfSwKKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkuaGFzX3JlbW90ZSAgICAgPSAxLCAgIC8qIG1pbmlyZW1vdGUgd29ya3MsIHNlZSBpci1rYmQtZ3Bpby5jICovCisJLmhhc19yYWRpbyAgICAgID0gMSwgICAvKiBub3QgZXZlcnkgY2FyZCBoYXMgcmFkaW8gKi8KK30seworCisJLyogLS0tLSBjYXJkIDB4ODAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+ICovCisJLm5hbWUgICAgICAgICAgID0gIkRWSUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS5ub192aWRlbyAgICAgICA9IDEsCisJLmhhc19kdmIgICAgICAgID0gMSwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKK30seworCS8qIFN0ZXZlbiA8cGhvdG9uMzhAcGNob21lLmNvbS50dz4gKi8KKwkubmFtZSAgICAgICAgICAgPSAiVi1HZWFyIE15VkNEIiwKKwkudmlkZW9faW5wdXRzICAgPSAzLAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5ncGlvbWFzayAgICAgICA9IDB4M2YsCisJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDEsIDB9LAorCS5hdWRpb211eCAgICAgICA9IHsweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxfSwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKwkuaGFzX3JhZGlvICAgICAgPSAwLAorCS8vIC5oYXNfcmVtb3RlICAgICA9IDEsCit9LHsKKwkvKiBSaWNrIEMgPGNyeXB0ZHJhZ29vbkBnbWFpbC5jb20+ICovCisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJTdXBlciBUViBUdW5lciIsCisgICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCisgICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCisgICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCisgICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCisgICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCisgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKKyAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCisgICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMHgwMDAwMDEsMCwwLCAwfSwKKyAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKKyAgICAgICAgLmhhc19yYWRpbyAgICAgID0gMSwKK30seworCQkvKiBDaHJpcyBGYW5uaW5nIDx2aWRlbzRsaW51eEBoYXlkb24ubmV0PiAqLworCQkubmFtZSAgICAgICAgICAgPSAiVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2IiwKKwkJLnZpZGVvX2lucHV0cyAgID0gMTYsCisJCS5hdWRpb19pbnB1dHMgICA9IDAsCisJCS50dW5lciAgICAgICAgICA9IC0xLAorCQkuc3ZocyAgICAgICAgICAgPSAtMSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCisJCS5wbGwJCT0gUExMXzI4LAorCQkubm9fbXNwMzR4eCAgICAgPSAxLAorCQkubm9fdGRhOTg3NSAgICAgPSAxLAorCQkubm9fdGRhNzQzMgk9IDEsCisJCS50dW5lcl90eXBlICAgICA9IC0xLAorCQkubXV4c2VsX2hvb2sgICAgPSB0aWJldENTMTZfbXV4c2VsLAorfSwKK3sKKwkvKiBCaWxsIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4gKi8KKwkvKgorCSAqIE5vdGUgdGhhdCwgYmVjYXVzZSBvZiB0aGUgY2FyZCdzIHdpcmluZywgdGhlICJtYXN0ZXIiCisJICogQlQ4NzhBIGNoaXAgKGkuZS4gdGhlIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaAorCSAqIGFuZCBtdXN0IHVzZSB0aGlzIGNhcmQgdHlwZSkgaXMgdGhlIDJuZCBvbmUgZGV0ZWN0ZWQuICBUaGUKKwkgKiBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgY2FyZCB0eXBlIDB4ODUsIHdob3NlIGRlc2NyaXB0aW9uCisJICogZm9sbG93cyB0aGlzIG9uZS4gIFRoZXJlIGlzIGEgRUVQUk9NIG9uIHRoZSBjYXJkICh3aGljaCBpcworCSAqIGNvbm5lY3RlZCB0byB0aGUgSTJDIG9mIG9uZSBvZiB0aG9zZSBvdGhlciBjaGlwcyksIGJ1dCBpcworCSAqIG5vdCBjdXJyZW50bHkgaGFuZGxlZC4gIFRoZXJlIGlzIGFsc28gYSBmYWNpbGl0eSBmb3IgYQorCSAqICJtb25pdG9yIiwgd2hpY2ggaXMgYWxzbyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgorCSAqLworCS5uYW1lCQk9ICJLb2RpY29tIDQ0MDBSIChtYXN0ZXIpIiwKKwkudmlkZW9faW5wdXRzCT0gMTYsCisJLmF1ZGlvX2lucHV0cwk9IDAsCisJLnR1bmVyCQk9IC0xLAorCS50dW5lcl90eXBlCT0gLTEsCisJLnN2aHMJCT0gLTEsCisJLyogR1BJTyBiaXRzIDAtOSB1c2VkIGZvciBhbmFsb2cgc3dpdGNoOgorCSAqICAgMDAgLSAwMzoJY2FtZXJhIHNlbGVjdG9yCisJICogICAwNCAtIDA2OgljaGFubmVsIChjb250cm9sbGVyKSBzZWxlY3RvcgorCSAqICAgMDc6CWRhdGEgKDEtPm9uLCAwLT5vZmYpCisJICogICAwODoJc3Ryb2JlCisJICogICAwOToJcmVzZXQKKwkgKiBiaXQgMTYgaXMgaW5wdXQgZnJvbSBzeW5jIHNlcGFyYXRvciBmb3IgdGhlIGNoYW5uZWwKKwkgKi8KKwkuZ3Bpb21hc2sJPSAweDAwMDNmZiwKKwkubm9fZ3Bpb2lycSAgICAgPSAxLAorCS5tdXhzZWwJCT0geyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCisJLnBsbAkJPSBQTExfMjgsCisJLm5vX21zcDM0eHgJPSAxLAorCS5ub190ZGE3NDMyCT0gMSwKKwkubm9fdGRhOTg3NQk9IDEsCisJLm11eHNlbF9ob29rCT0ga29kaWNvbTQ0MDByX211eHNlbCwKK30sCit7CisJLyogQmlsbCBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+ICovCisJLyogTm90ZSB0aGF0LCBmb3IgcmVhc29ucyB1bmtub3duLCB0aGUgIm1hc3RlciIgQlQ4NzhBIGNoaXAgKGkuZS4gdGhlCisJICogb25lIHdoaWNoIGNvbnRyb2xzIHRoZSBhbmFsb2cgc3dpdGNoLCBhbmQgbXVzdCB1c2UgdGhlIGNhcmQgdHlwZSkKKwkgKiBpcyB0aGUgMm5kIG9uZSBkZXRlY3RlZC4gIFRoZSBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgdGhpcyBjYXJkCisJICogdHlwZQorCSAqLworCS5uYW1lCQk9ICJLb2RpY29tIDQ0MDBSIChzbGF2ZSkiLAorCS52aWRlb19pbnB1dHMJPSAxNiwKKwkuYXVkaW9faW5wdXRzCT0gMCwKKwkudHVuZXIJCT0gLTEsCisJLnR1bmVyX3R5cGUJPSAtMSwKKwkuc3ZocwkJPSAtMSwKKwkuZ3Bpb21hc2sJPSAweDAxMDAwMCwKKwkubm9fZ3Bpb2lycSAgICAgPSAxLAorCS5tdXhzZWwJCT0geyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCisJLnBsbAkJPSBQTExfMjgsCisJLm5vX21zcDM0eHgJPSAxLAorCS5ub190ZGE3NDMyCT0gMSwKKwkubm9fdGRhOTg3NQk9IDEsCisJLm11eHNlbF9ob29rCT0ga29kaWNvbTQ0MDByX211eHNlbCwKK319OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGJ0dHZfbnVtX3R2Y2FyZHMgPSBBUlJBWV9TSVpFKGJ0dHZfdHZjYXJkcyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGVlcHJvbV9kYXRhWzI1Nl07CisKKy8qCisgKiBpZGVudGlmeSBjYXJkCisgKi8KK3ZvaWQgX19kZXZpbml0IGJ0dHZfaWRjYXJkKHN0cnVjdCBidHR2ICpidHYpCit7CisJdW5zaWduZWQgaW50IGdwaW9iaXRzOworCWludCBpLHR5cGU7CisJdW5zaWduZWQgc2hvcnQgdG1wOworCisJLyogcmVhZCBQQ0kgc3Vic3lzdGVtIElEICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnR2LT5jLnBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJnRtcCk7CisJYnR2LT5jYXJkaWQgPSB0bXAgPDwgMTY7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnR2LT5jLnBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZ0bXApOworCWJ0di0+Y2FyZGlkIHw9IHRtcDsKKworCWlmICgwICE9IGJ0di0+Y2FyZGlkICYmIDB4ZmZmZmZmZmYgIT0gYnR2LT5jYXJkaWQpIHsKKwkJLyogbG9vayBmb3IgdGhlIGNhcmQgKi8KKwkJZm9yICh0eXBlID0gLTEsIGkgPSAwOyBjYXJkc1tpXS5pZCAhPSAwOyBpKyspCisJCQlpZiAoY2FyZHNbaV0uaWQgID09IGJ0di0+Y2FyZGlkKQorCQkJCXR5cGUgPSBpOworCisJCWlmICh0eXBlICE9IC0xKSB7CisJCQkvKiBmb3VuZCBpdCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBkZXRlY3RlZDogJXMgW2NhcmQ9JWRdLCAiCisJCQkgICAgICAgIlBDSSBzdWJzeXN0ZW0gSUQgaXMgJTA0eDolMDR4XG4iLAorCQkJICAgICAgIGJ0di0+Yy5ucixjYXJkc1t0eXBlXS5uYW1lLGNhcmRzW3R5cGVdLmNhcmRuciwKKwkJCSAgICAgICBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKKwkJCSAgICAgICAoYnR2LT5jYXJkaWQgPj4gMTYpICYgMHhmZmZmKTsKKwkJCWJ0di0+Yy50eXBlID0gY2FyZHNbdHlwZV0uY2FyZG5yOworCQl9IGVsc2UgeworCQkJLyogNDA0ICovCisJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHN1YnN5c3RlbTogJTA0eDolMDR4IChVTktOT1dOKVxuIiwKKwkJCSAgICAgICBidHYtPmMubnIsIGJ0di0+Y2FyZGlkICYgMHhmZmZmLAorCQkJICAgICAgIChidHYtPmNhcmRpZCA+PiAxNikgJiAweGZmZmYpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgInBsZWFzZSBtYWlsIGlkLCBib2FyZCBuYW1lIGFuZCAiCisJCQkgICAgICAgInRoZSBjb3JyZWN0IGNhcmQ9IGluc21vZCBvcHRpb24gdG8ga3JheGVsQGJ5dGVzZXgub3JnXG4iKTsKKwkJfQorCX0KKworCS8qIGxldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgYXV0b2RldGVjdGVkIHR5cGUgKi8KKwlpZiAoY2FyZFtidHYtPmMubnJdIDwgYnR0dl9udW1fdHZjYXJkcykKKwkJYnR2LT5jLnR5cGU9Y2FyZFtidHYtPmMubnJdOworCisJLyogcHJpbnQgd2hpY2ggY2FyZCBjb25maWcgd2UgYXJlIHVzaW5nICovCisJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiB1c2luZzogJXMgW2NhcmQ9JWQsJXNdXG4iLGJ0di0+Yy5uciwKKwkgICAgICAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLCBidHYtPmMudHlwZSwKKwkgICAgICAgY2FyZFtidHYtPmMubnJdIDwgYnR0dl9udW1fdHZjYXJkcworCSAgICAgICA/ICJpbnNtb2Qgb3B0aW9uIiA6ICJhdXRvZGV0ZWN0ZWQiKTsKKworCS8qIG92ZXJ3cml0ZSBncGlvIHN0dWZmID8/ICovCisJaWYgKFVOU0VUID09IGF1ZGlvYWxsICYmIFVOU0VUID09IGF1ZGlvbXV4WzBdKQorCQlyZXR1cm47CisKKwlpZiAoVU5TRVQgIT0gYXVkaW9tdXhbMF0pIHsKKwkJZ3Bpb2JpdHMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2ldID0gYXVkaW9tdXhbaV07CisJCQlncGlvYml0cyB8PSBhdWRpb211eFtpXTsKKwkJfQorCX0gZWxzZSB7CisJCWdwaW9iaXRzID0gYXVkaW9hbGw7CisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbaV0gPSBhdWRpb2FsbDsKKwkJfQorCX0KKwlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrID0gKFVOU0VUICE9IGdwaW9tYXNrKSA/IGdwaW9tYXNrIDogZ3Bpb2JpdHM7CisJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBncGlvIGNvbmZpZyBvdmVycmlkZTogbWFzaz0weCV4LCBtdXg9IiwKKwkgICAgICAgYnR2LT5jLm5yLGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2spOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJcHJpbnRrKCIlczB4JXgiLCBpID8gIiwiIDogIiIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbaV0pOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisgKiAobW9zdCkgYm9hcmQgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb25zIGdvZXMgaGVyZQorICovCisKKy8qIFNvbWUgTW9kdWxhciBUZWNobm9sb2d5IGNhcmRzIGhhdmUgYW4gZWVwcm9tLCBidXQgbm8gc3Vic3lzdGVtIElEICovCit2b2lkIGlkZW50aWZ5X2J5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBjaGFyIGVlcHJvbV9kYXRhWzI1Nl0pCit7CisJaW50IHR5cGUgPSAtMTsKKworCWlmICgwID09IHN0cm5jbXAoZWVwcm9tX2RhdGEsIkdFVCBNTTIweFBDVFYiLDEzKSkKKwkJdHlwZSA9IEJUVFZfTU9EVEVDXzIwNTsKKwllbHNlIGlmICgwID09IHN0cm5jbXAoZWVwcm9tX2RhdGErMjAsIlBpY29sbyIsNykpCisJCXR5cGUgPSBCVFRWX0VVUkVTWVNfUElDT0xPOworCWVsc2UgaWYgKGVlcHJvbV9kYXRhWzBdID09IDB4ODQgJiYgZWVwcm9tX2RhdGFbMl09PSAwKQorICAgICAgICAgICAgICAgIHR5cGUgPSBCVFRWX0hBVVBQQVVHRTsgLyogb2xkIGJ0ODQ4ICovCisKKwlpZiAoLTEgIT0gdHlwZSkgeworCQlidHYtPmMudHlwZSA9IHR5cGU7CisJCXByaW50aygiYnR0diVkOiBkZXRlY3RlZCBieSBlZXByb206ICVzIFtjYXJkPSVkXVxuIiwKKwkJICAgICAgIGJ0di0+Yy5uciwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLCBidHYtPmMudHlwZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmbHl2aWRlb19ncGlvKHN0cnVjdCBidHR2ICpidHYpCit7CisJaW50IGdwaW8saGFzX3JlbW90ZSxoYXNfcmFkaW8saXNfY2FwdHVyZV9vbmx5LGlzX2xyOTAsaGFzX3RkYTk4MjBfdGRhOTgyMTsKKwlpbnQgdHVuZXI9LTEsdHR5cGU7CisKKwlncGlvX2lub3V0KDB4ZmZmZmZmLCAwKTsKKwl1ZGVsYXkoOCk7ICAvLyB3aXRob3V0IHRoaXMgd2Ugd291bGQgc2VlIHRoZSAweDE4MDAgbWFzaworCWdwaW8gPSBncGlvX3JlYWQoKTsKKwkvKiBGSVhNRTogbXVzdCByZXN0b3JlIE9VUl9FTiA/Pz8gKi8KKworCS8vIGFsbCBjYXJkcyBwcm92aWRlIEdQSU8gaW5mbywgc29tZSBoYXZlIGFuIGFkZGl0aW9uYWwgZWVwcm9tCisJLy8gTFI1MDogR1BJTyBjb2RpbmcgY2FuIGJlIGZvdW5kIGxvd2VyIHJpZ2h0IENQMSAuLiBDUDkKKwkvLyAgICAgICBDUDk9R1BJTzIzIC4uIENQMT1HUElPMTU7IHdoZW4gT1BFTiwgdGhlIGNvcnJlc3BvbmRpbmcgR1BJTyByZWFkcyAxLgorCS8vICAgICAgIEdQSU8xNC0xMjogbi5jLgorCS8vIExSOTA6IEdQOT1HUElPMjMgLi4gR1AxPUdQSU8xNSAocmlnaHQgYWJvdmUgdGhlIGJ0ODc4KQorCisJLy8gbG93ZXN0IDMgYnl0ZXMgYXJlIHJlbW90ZSBjb250cm9sIGNvZGVzIChubyBoYW5kc2hha2UgbmVlZGVkKQorICAgICAgICAvLyB4eHhGRkY6IE5vIHJlbW90ZSBjb250cm9sIGNoaXAgc29sZGVyZWQKKyAgICAgICAgLy8geHh4RjAwKExSMjYvTFI1MCksIHh4eEZFMChMUjkwKTogUmVtb3RlIGNvbnRyb2wgY2hpcCAoTFZBMDAxIG9yIENGNDUpIHNvbGRlcmVkCisJLy8gTm90ZTogU29tZSBiaXRzIGFyZSBBdWRpb19NYXNrICEKKworCXR0eXBlPShncGlvJjB4MGYwMDAwKT4+MTY7CisJc3dpdGNoKHR0eXBlKSB7CisJY2FzZSAweDA6IHR1bmVyPTI7IC8vIE5UU0MsIGUuZy4gVFBJOE5TUjExUAorCQlicmVhazsKKyAgICAgICAgY2FzZSAweDI6IHR1bmVyPTM5Oy8vIExHIE5UU0MgKG5ld2VyIFRBUEMgc2VyaWVzKSBUQVBDLUg3MDFQCisJCWJyZWFrOworCWNhc2UgMHg0OiB0dW5lcj01OyAvLyBQaGlsaXBzIFBBTCBUUEk4UFNCMDJQLCBUUEk4UFNCMTJQLCBUUEk4UFNCMTJEIG9yIEZJMTIxNiwgRk0xMjE2CisJCWJyZWFrOworCWNhc2UgMHg2OiB0dW5lcj0zNzsgLy8gTEcgUEFMIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1HNzAyUAorCQlicmVhazsKKwljYXNlIDB4QzogdHVuZXI9MzsgLy8gUGhpbGlwcyBTRUNBTSgrUEFMKSBGUTEyMTZNRSBvciBGSTEyMTZNRgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvX2dwaW86IHVua25vd24gdHVuZXIgdHlwZS5cbiIsIGJ0di0+Yy5ucik7CisJfQorCisJaGFzX3JlbW90ZSAgICAgICAgICA9ICAgZ3BpbyAmIDB4ODAwMDAwOworCWhhc19yYWRpbwkgICAgPSAgIGdwaW8gJiAweDQwMDAwMDsKKwkvLyAgIHVua25vd24gICAgICAgICAgICAgICAgICAgMHgyMDAwMDA7CisJLy8gICB1bmtub3duMiAgICAgICAgICAgICAgICAgIDB4MTAwMDAwOworICAgICAgICBpc19jYXB0dXJlX29ubHkgICAgID0gIShncGlvICYgMHgwMDgwMDApOyAvL0dQSU8xNQorCWhhc190ZGE5ODIwX3RkYTk4MjEgPSAhKGdwaW8gJiAweDAwNDAwMCk7CisJaXNfbHI5MCAgICAgICAgICAgICA9ICEoZ3BpbyAmIDB4MDAyMDAwKTsgLy8gZWxzZSBMUjI2L0xSNTAgKExSMzgvTFI1MSBmLiBjYXB0dXJlIG9ubHkpCisgICAgICAgIC8vCQkgICAgICAgIGdwaW8gJiAweDAwMTAwMCAvLyBvdXRwdXQgYml0IGZvciBhdWRpbyByb3V0aW5nCisKKwlpZihpc19jYXB0dXJlX29ubHkpCisJCXR1bmVyPTQ7IC8vIE5vIHR1bmVyIHByZXNlbnQKKworCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW8gUmFkaW89JXMgUmVtb3RlQ29udHJvbD0lcyBUdW5lcj0lZCBncGlvPTB4JTA2eFxuIiwKKwkgICAgICAgYnR2LT5jLm5yLCBoYXNfcmFkaW8/ICJ5ZXMiOiJubyAiLCBoYXNfcmVtb3RlPyAieWVzIjoibm8gIiwgdHVuZXIsIGdwaW8pOworCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW8gIExSOTA9JXMgdGRhOTgyMS90ZGE5ODIwPSVzIGNhcHR1cmVfb25seT0lc1xuIiwKKwkJYnR2LT5jLm5yLCBpc19scjkwPyJ5ZXMiOiJubyAiLCBoYXNfdGRhOTgyMF90ZGE5ODIxPyJ5ZXMiOiJubyAiLAorCQlpc19jYXB0dXJlX29ubHk/InllcyI6Im5vICIpOworCisJaWYodHVuZXIhPSAtMSkgLy8gb25seSBzZXQgaWYga25vd24gdHVuZXIgYXV0b2RldGVjdGVkLCBlbHNlIGxldCBpbnNtb2Qgb3B0aW9uIHRocm91Z2gKKwkJYnR2LT50dW5lcl90eXBlID0gdHVuZXI7CisJYnR2LT5oYXNfcmFkaW8gPSBoYXNfcmFkaW87CisKKwkvLyBMUjkwIEF1ZGlvIFJvdXRpbmcgaXMgZG9uZSBieSAyIGhlZjQwNTIsIHNvIEF1ZGlvX01hc2sgaGFzIDQgYml0czogMHgwMDFjODAKKyAgICAgICAgLy8gTFIyNi9MUjUwIG9ubHkgaGFzIDEgaGVmNDA1MiwgQXVkaW9fTWFzayAweDAwMGMwMAorCS8vIEF1ZGlvIG9wdGlvbnM6IGZyb20gdHVuZXIsIGZyb20gdGRhOTgyMS90ZGE5ODIxKG1vbm8sc3RlcmVvLHNhcCksIGZyb20gdGRhOTg3NCwgZXh0LiwgbXV0ZQorCWlmKGhhc190ZGE5ODIwX3RkYTk4MjEpIGJ0di0+YXVkaW9faG9vayA9IGx0OTQxNV9hdWRpbzsKKwkvL3RvZG86IGlmKGhhc190ZGE5ODc0KSBidHYtPmF1ZGlvX2hvb2sgPSBmdjIwMDBzX2F1ZGlvOworfQorCitzdGF0aWMgaW50IG1pcm9fdHVuZXJtYXBbXSA9IHsgMCw2LDIsMywgICA0LDUsNiwwLCAgMywwLDQsNSwgIDUsMiwxNiwxLAorCQkJICAgICAgIDE0LDIsMTcsMSwgNCwxLDQsMywgIDEsMiwxNiwxLCA0LDQsNCw0IH07CitzdGF0aWMgaW50IG1pcm9fZm10dW5lcltdICA9IHsgMCwwLDAsMCwgICAwLDAsMCwwLCAgMCwwLDAsMCwgIDAsMCwwLDEsCisJCQkgICAgICAgMSwxLDEsMSwgICAxLDEsMSwwLCAgMCwwLDAsMCwgIDAsMSwwLDAgfTsKKworc3RhdGljIHZvaWQgbWlyb19waW5uYWNsZV9ncGlvKHN0cnVjdCBidHR2ICpidHYpCit7CisJaW50IGlkLG1zcCxncGlvOworCWNoYXIgKmluZm87CisKKwlncGlvX2lub3V0KDB4ZmZmZmZmLCAwKTsKKyAgICAgICAgZ3BpbyA9IGdwaW9fcmVhZCgpOworCWlkICAgPSAoKGdwaW8+PjEwKSAmIDYzKSAtMTsKKwltc3AgID0gYnR0dl9JMkNSZWFkKGJ0diwgSTJDX01TUDM0MDAsICJNU1AzNHh4Iik7CisJaWYgKGlkIDwgMzIpIHsKKwkJYnR2LT50dW5lcl90eXBlID0gbWlyb190dW5lcm1hcFtpZF07CisJCWlmICgwID09IChncGlvICYgMHgyMCkpIHsKKwkJCWJ0di0+aGFzX3JhZGlvID0gMTsKKwkJCWlmICghbWlyb19mbXR1bmVyW2lkXSkgeworCQkJCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKKwkJCQlidHYtPm1ib3hfd2UgICAgPSAoMTw8Nik7CisJCQkJYnR2LT5tYm94X21vc3QgID0gKDE8PDcpOworCQkJCWJ0di0+bWJveF9jbGsgICA9ICgxPDw4KTsKKwkJCQlidHYtPm1ib3hfZGF0YSAgPSAoMTw8OSk7CisJCQkJYnR2LT5tYm94X21hc2sgID0gKDE8PDYpfCgxPDw3KXwoMTw8OCl8KDE8PDkpOworCQkJfQorCQl9IGVsc2UgeworCQkJYnR2LT5oYXNfcmFkaW8gPSAwOworCQl9CisJCWlmICgtMSAhPSBtc3ApIHsKKwkJCWlmIChidHYtPmMudHlwZSA9PSBCVFRWX01JUk8pCisJCQkJYnR2LT5jLnR5cGUgPSBCVFRWX01JUk9QUk87CisJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9QSU5OQUNMRSkKKwkJCQlidHYtPmMudHlwZSA9IEJUVFZfUElOTkFDTEVQUk87CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgImJ0dHYlZDogbWlybzogaWQ9JWQgdHVuZXI9JWQgcmFkaW89JXMgc3RlcmVvPSVzXG4iLAorCQkgICAgICAgYnR2LT5jLm5yLCBpZCsxLCBidHYtPnR1bmVyX3R5cGUsCisJCSAgICAgICAhYnR2LT5oYXNfcmFkaW8gPyAibm8iIDoKKwkJICAgICAgIChidHYtPmhhc19tYXRjaGJveCA/ICJtYXRjaGJveCIgOiAiZm10dW5lciIpLAorCQkgICAgICAgKC0xID09IG1zcCkgPyAibm8iIDogInllcyIpOworCX0gZWxzZSB7CisJCS8qIG5ldyBjYXJkcyB3aXRoIG1pY3JvdHVuZSB0dW5lciAqLworCQlpZCA9IDYzIC0gaWQ7CisJCWJ0di0+aGFzX3JhZGlvID0gMDsKKwkJc3dpdGNoIChpZCkgeworCQljYXNlIDE6CisJCQlpbmZvID0gIlBBTCAvIG1vbm8iOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gc3RlcmVvIjsKKwkJCWJ0di0+aGFzX3JhZGlvID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlpbmZvID0gIk5UU0MgLyBzdGVyZW8iOworCQkJYnR2LT5oYXNfcmFkaW8gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gbW9ubyI7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJaW5mbyA9ICJOVFNDIC8gbW9ubyI7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJaW5mbyA9ICJOVFNDIC8gc3RlcmVvIjsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQlpbmZvID0gIlBBTCAvIHN0ZXJlbyI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWluZm8gPSAib29wczogdW5rbm93biBjYXJkIjsKKwkJCWJyZWFrOworCQl9CisJCWlmICgtMSAhPSBtc3ApCisJCQlidHYtPmMudHlwZSA9IEJUVFZfUElOTkFDTEVQUk87CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJidHR2JWQ6IHBpbm5hY2xlL210OiBpZD0lZCBpbmZvPVwiJXNcIiByYWRpbz0lc1xuIiwKKwkJICAgICAgIGJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKKwkJYnR2LT50dW5lcl90eXBlICA9IDMzOworCQlidHYtPnBpbm5hY2xlX2lkID0gaWQ7CisJfQorfQorCisvKiBHUElPMjEgICBMOiBCdWZmZXIgYWt0aXYsIEg6IEJ1ZmZlciBpbmFrdGl2ICovCisjZGVmaW5lIExNMTg4Ml9TWU5DX0RSSVZFICAgICAweDIwMDAwMEwKKworc3RhdGljIHZvaWQgaW5pdF9pZHNfZWFnbGUoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwlncGlvX2lub3V0KDB4ZmZmZmZmLDB4RkZGRjM3KTsKKwlncGlvX3dyaXRlKDB4MjAwMDIwKTsKKworCS8qIGZsYXNoIHN0cm9iZSBpbnZlcnRlciA/ISAqLworCWdwaW9fd3JpdGUoMHgyMDAwMjQpOworCisJLyogc3dpdGNoIHN5bmMgZHJpdmUgb2ZmICovCisJZ3Bpb19iaXRzKExNMTg4Ml9TWU5DX0RSSVZFLExNMTg4Ml9TWU5DX0RSSVZFKTsKKworCS8qIHNldCBCVDg0OCBtdXhlbCB0byAyICovCisJYnRhb3IoKDIpPDw1LCB+KDI8PDUpLCBCVDg0OF9JRk9STSk7Cit9CisKKy8qIE11eHNlbCBoZWxwZXIgZm9yIHRoZSBJRFMgRWFnbGUuCisgKiB0aGUgZWFnbGVzIGRvZXMgbm90IHVzZSB0aGUgc3RhbmRhcmQgbXV4c2VsLWJpdHMgYnV0CisgKiBoYXMgaXRzIG93biBtdWx0aXBsZXhlciAqLworc3RhdGljIHZvaWQgZWFnbGVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKK3sKKwlidGFvcigoMik8PDUsIH4oMzw8NSksIEJUODQ4X0lGT1JNKTsKKwlncGlvX2JpdHMoMyxidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm11eHNlbFtpbnB1dCY3XSk7CisKKyNpZiAwCisgICAgICAgLyogc3ZocyAqLworICAgICAgIC8qIHdha2UgY2hyb21hIEFEQyAqLworICAgICAgIGJ0YW5kKH5CVDg0OF9BRENfQ19TTEVFUCwgQlQ4NDhfQURDKTsKKyAgICAgICAvKiBzZXQgdG8gWUMgdmlkZW8gKi8KKyAgICAgICBidG9yKEJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfRV9DT05UUk9MKTsKKyAgICAgICBidG9yKEJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfT19DT05UUk9MKTsKKyNlbHNlCisgICAgICAgLyogY29tcG9zaXRlICovCisgICAgICAgLyogc2V0IGNocm9tYSBBREMgdG8gc2xlZXAgKi8KKyAgICAgICBidG9yKEJUODQ4X0FEQ19DX1NMRUVQLCBCVDg0OF9BREMpOworICAgICAgIC8qIHNldCB0byBjb21wb3NpdGUgdmlkZW8gKi8KKyAgICAgICBidGFuZCh+QlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9FX0NPTlRST0wpOworICAgICAgIGJ0YW5kKH5CVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X09fQ09OVFJPTCk7CisjZW5kaWYKKworICAgICAgIC8qIHN3aXRjaCBzeW5jIGRyaXZlIG9mZiAqLworICAgICAgIGdwaW9fYml0cyhMTTE4ODJfU1lOQ19EUklWRSxMTTE4ODJfU1lOQ19EUklWRSk7Cit9CisKK3N0YXRpYyB2b2lkIGd2YzExMDBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKK3sKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXNrc1tdID0gezB4MzAsIDB4MDEsIDB4MTIsIDB4MjN9OworCWdwaW9fd3JpdGUobWFza3NbaW5wdXQlNF0pOworfQorCisvKiBMTUxCVDR4IGluaXRpYWxpemF0aW9uIC0gdG8gYWxsb3cgYWNjZXNzIHRvIEdQSU8gYml0cyBmb3Igc2Vuc29ycyBpbnB1dCBhbmQKKyAgIGFsYXJtcyBvdXRwdXQKKworICAgR1BJT2JpdCAgICB8IDEwIHwgOSB8IDggfCA3IHwgNiB8IDUgfCA0IHwgMyB8IDIgfCAxIHwgMCB8CisgICBhc3NpZ25tZW50IHwgVEkgfCBPM3xJTnh8IE8yfCBPMXxJTjR8SU4zfElOMnxJTjF8ICAgfCAgIHwKKworICAgSU4gLSBzZW5zb3IgaW5wdXRzLCBJTnggLSBzZW5zb3IgaW5wdXRzIGFuZCBUSSBYT1JlZCB0b2dldGhlcgorICAgTzEsTzIsTzMgLSBhbGFybSBvdXRwdXRzIChyZWxheXMpCisKKyAgIE9VVCBFTkFCTEUgICAxICAgIDEgICAwICAuIDEgIDEgICAwICAgMCAuIDAgICAwICAgMCAgICAwICAgPSAweDZDMAorCisqLworCitzdGF0aWMgdm9pZCBpbml0X2xtbGJ0NHgoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiTE1MQlQ0eCBpbml0XG4iKTsKKwlidHdyaXRlKDB4MDAwMDAwLCBCVDg0OF9HUElPX1JFR19JTlApOworCWdwaW9faW5vdXQoMHhmZmZmZmYsIDB4MDAwNkMwKTsKKwlncGlvX3dyaXRlKDB4MDAwMDAwKTsKK30KKworc3RhdGljIHZvaWQgc2lnbWFTUV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQoreworCXVuc2lnbmVkIGludCBpbm11eCA9IGlucHV0ICUgODsKKwlncGlvX2lub3V0KCAweGYsIDB4ZiApOworCWdwaW9fYml0cyggMHhmLCBpbm11eCApOworfQorCitzdGF0aWMgdm9pZCBzaWdtYVNMQ19tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQoreworCXVuc2lnbmVkIGludCBpbm11eCA9IGlucHV0ICUgNDsKKwlncGlvX2lub3V0KCAzPDw5LCAzPDw5ICk7CisJZ3Bpb19iaXRzKCAzPDw5LCBpbm11eDw8OSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBidHR2X3Jlc2V0X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYpCit7CisJLyoKKwkgKiBCVDg3OEEgaGFzIGEgYXVkaW8tcmVzZXQgcmVnaXN0ZXIuCisJICogMS4gVGhpcyByZWdpc3RlciBpcyBhbiBhdWRpbyByZXNldCBmdW5jdGlvbiBidXQgaXQgaXMgaW4KKwkgKiAgICBmdW5jdGlvbi0wICh2aWRlbyBjYXB0dXJlKSBhZGRyZXNzIHNwYWNlLgorCSAqIDIuIEl0IGlzIGVub3VnaCB0byBkbyB0aGlzIG9uY2UgcGVyIHBvd2VyLXVwIG9mIHRoZSBjYXJkLgorCSAqIDMuIFRoZXJlIGlzIGEgdHlwbyBpbiB0aGUgQ29uZXhhbnQgZG9jIC0tIGl0IGlzIG5vdCBhdAorCSAqICAgIDB4NUIsIGJ1dCBhdCAweDA1OC4gKEIgaXMgYW4gb2RkLW51bWJlciwgb2J2aW91c2x5IGEgdHlwbyEpLgorCSAqIC0tLy9TaHJpa3VtYXIgMDMwNjA5CisJICovCisJaWYgKGJ0di0+aWQgIT0gODc4KQorCQlyZXR1cm47CisKKwlpZiAoYnR0dl9kZWJ1ZykKKwkJcHJpbnRrKCJidHR2JWQ6IEJUODc4QSBBUkVTRVRcbiIsYnR2LT5jLm5yKTsKKwlidHdyaXRlKCgxPDw3KSwgMHgwNTgpOworCXVkZWxheSgxMCk7CisJYnR3cml0ZSggICAgIDAsIDB4MDU4KTsKK30KKworLyogaW5pdGlhbGl6YXRpb24gcGFydCBvbmUgLS0gYmVmb3JlIHJlZ2lzdGVyaW5nIGkyYyBidXMgKi8KK3ZvaWQgX19kZXZpbml0IGJ0dHZfaW5pdF9jYXJkMShzdHJ1Y3QgYnR0diAqYnR2KQoreworCXN3aXRjaCAoYnR2LT5jLnR5cGUpIHsKKwljYXNlIEJUVFZfSEFVUFBBVUdFOgorCWNhc2UgQlRUVl9IQVVQUEFVR0U4Nzg6CisgICAgICAgICAgICAgICAgYm9vdF9tc3AzNHh4KGJ0diw1KTsKKwkJYnJlYWs7CisJY2FzZSBCVFRWX1ZPT0RPT1RWX0ZNOgorICAgICAgICAgICAgICAgIGJvb3RfbXNwMzR4eChidHYsMjApOworCQlicmVhazsKKwljYXNlIEJUVFZfQVZFUk1FRElBOTg6CisJCWJvb3RfbXNwMzR4eChidHYsMTEpOworCQlicmVhazsKKwljYXNlIEJUVFZfSEFVUFBBVUdFUFZSOgorCQlwdnJfYm9vdChidHYpOworCQlicmVhazsKKwljYXNlIEJUVFZfVFdJTkhBTl9EU1Q6CisJY2FzZSBCVFRWX0FWRFZCVF83NzE6CisJCWJ0di0+dXNlX2kyY19odyA9IDE7CisJCWJyZWFrOworCX0KKwlpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKKwkJYnR0dl9yZXNldF9hdWRpbyhidHYpOworfQorCisvKiBpbml0aWFsaXphdGlvbiBwYXJ0IHR3byAtLSBhZnRlciByZWdpc3RlcmluZyBpMmMgYnVzICovCit2b2lkIF9fZGV2aW5pdCBidHR2X2luaXRfY2FyZDIoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwlpbnQgdGRhOTg4NzsKKyAgICAgICAgYnR2LT50dW5lcl90eXBlID0gLTE7CisKKwlpZiAoQlRUVl9VTktOT1dOID09IGJ0di0+Yy50eXBlKSB7CisJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKKwkJaWRlbnRpZnlfYnlfZWVwcm9tKGJ0dixlZXByb21fZGF0YSk7CisJfQorCisJc3dpdGNoIChidHYtPmMudHlwZSkgeworCWNhc2UgQlRUVl9NSVJPOgorCWNhc2UgQlRUVl9NSVJPUFJPOgorCWNhc2UgQlRUVl9QSU5OQUNMRToKKwljYXNlIEJUVFZfUElOTkFDTEVQUk86CisJCS8qIG1pcm8vcGlubmFjbGUgKi8KKwkJbWlyb19waW5uYWNsZV9ncGlvKGJ0dik7CisJCWJyZWFrOworCWNhc2UgQlRUVl9GTFlWSURFT185ODoKKwljYXNlIEJUVFZfTUFYSToKKwljYXNlIEJUVFZfTElGRV9GTFlLSVQ6CisJY2FzZSBCVFRWX0ZMWVZJREVPOgorCWNhc2UgQlRUVl9UWVBIT09OX1RWSUVXOgorCWNhc2UgQlRUVl9DSFJPTk9TX1ZTMjoKKwljYXNlIEJUVFZfRkxZVklERU9fOThGTToKKwljYXNlIEJUVFZfRkxZVklERU8yMDAwOgorCWNhc2UgQlRUVl9GTFlWSURFTzk4RVo6CisJY2FzZSBCVFRWX0NPTkZFUkVOQ0VUVjoKKwljYXNlIEJUVFZfTElGRVRFQ185NDE1OgorCQlmbHl2aWRlb19ncGlvKGJ0dik7CisJCWJyZWFrOworCWNhc2UgQlRUVl9IQVVQUEFVR0U6CisJY2FzZSBCVFRWX0hBVVBQQVVHRTg3ODoKKwljYXNlIEJUVFZfSEFVUFBBVUdFUFZSOgorCQkvKiBwaWNrIHVwIHNvbWUgY29uZmlnIGluZm9zIGZyb20gdGhlIGVlcHJvbSAqLworCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CisgICAgICAgICAgICAgICAgaGF1cHBhdWdlX2VlcHJvbShidHYpOworCQlicmVhazsKKwljYXNlIEJUVFZfQVZFUk1FRElBOTg6CisJY2FzZSBCVFRWX0FWUEhPTkU5ODoKKwkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOworCQlhdmVybWVkaWFfZWVwcm9tKGJ0dik7CisJCWJyZWFrOworCWNhc2UgQlRUVl9QWEMyMDA6CisJCWluaXRfUFhDMjAwKGJ0dik7CisJCWJyZWFrOworCWNhc2UgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUDoKKwkJcGljb2xvX3RldHJhX2luaXQoYnR2KTsKKwkJYnJlYWs7CisJY2FzZSBCVFRWX1ZIWDoKKwkJYnR2LT5oYXNfcmFkaW8gICAgPSAxOworCQlidHYtPmhhc19tYXRjaGJveCA9IDE7CisJCWJ0di0+bWJveF93ZSAgICAgID0gMHgyMDsKKwkJYnR2LT5tYm94X21vc3QgICAgPSAwOworCQlidHYtPm1ib3hfY2xrICAgICA9IDB4MDg7CisJCWJ0di0+bWJveF9kYXRhICAgID0gMHgxMDsKKwkJYnR2LT5tYm94X21hc2sgICAgPSAweDM4OworCQlicmVhazsKKwljYXNlIEJUVFZfVk9CSVNfQk9PU1RBUjoKKwljYXNlIEJUVFZfVEVSUkFUVjoKKwkJdGVycmF0ZWNfYWN0aXZlX3JhZGlvX3VwZ3JhZGUoYnR2KTsKKwkJYnJlYWs7CisJY2FzZSBCVFRWX01BR0lDVFZJRVcwNjE6CisJCWlmIChidHYtPmNhcmRpZCA9PSAweDMwMDIxNDRmKSB7CisJCQlidHYtPmhhc19yYWRpbz0xOworCQkJcHJpbnRrKCJidHR2JWQ6IHJhZGlvIGRldGVjdGVkIGJ5IHN1YnN5c3RlbSBpZCAoQ1BIMDV4KVxuIixidHYtPmMubnIpOworCQl9CisJCWJyZWFrOworICAgICAgIGNhc2UgQlRUVl9TVEIyOgorICAgICAgICAgICAgICAgIGlmIChidHYtPmNhcmRpZCA9PSAweDMwNjAxMjFhKSB7CisJCQkvKiBGaXggdXAgZW50cnkgZm9yIDNERlggVm9vZG9vVFYgMTAwLAorCQkJICAgd2hpY2ggaXMgYW4gT0VNIFNUQiBjYXJkIHZhcmlhbnQuICovCisJCQlidHYtPmhhc19yYWRpbz0wOworCQkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDX05UU0M7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCVFRWX09TUFJFWTF4MDoKKwljYXNlIEJUVFZfT1NQUkVZMXgwXzg0ODoKKwljYXNlIEJUVFZfT1NQUkVZMTAxXzg0ODoKKwljYXNlIEJUVFZfT1NQUkVZMXgxOgorCWNhc2UgQlRUVl9PU1BSRVkxeDFfU1ZJRDoKKwljYXNlIEJUVFZfT1NQUkVZMnh4OgorCWNhc2UgQlRUVl9PU1BSRVkyeDBfU1ZJRDoKKwljYXNlIEJUVFZfT1NQUkVZMngwOgorCWNhc2UgQlRUVl9PU1BSRVk1MDA6CisJY2FzZSBCVFRWX09TUFJFWTU0MDoKKwljYXNlIEJUVFZfT1NQUkVZMjAwMDoKKwkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOworICAgICAgICAgICAgICAgIG9zcHJleV9lZXByb20oYnR2KTsKKwkJYnJlYWs7CisJY2FzZSBCVFRWX0lEU19FQUdMRToKKwkJaW5pdF9pZHNfZWFnbGUoYnR2KTsKKwkJYnJlYWs7CisJY2FzZSBCVFRWX01PRFRFQ18yMDU6CisJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKKwkJbW9kdGVjX2VlcHJvbShidHYpOworCQlicmVhazsKKwljYXNlIEJUVFZfTE1MQlQ0OgorCQlpbml0X2xtbGJ0NHgoYnR2KTsKKwkJYnJlYWs7CisJY2FzZSBCVFRWX1RJQkVUX0NTMTY6CisJCXRpYmV0Q1MxNl9pbml0KGJ0dik7CisJCWJyZWFrOworCWNhc2UgQlRUVl9LT0RJQ09NXzQ0MDBSOgorCQlrb2RpY29tNDQwMHJfaW5pdChidHYpOworCQlicmVhazsKKwl9CisKKwkvKiBwbGwgY29uZmlndXJhdGlvbiAqLworICAgICAgICBpZiAoIShidHYtPmlkPT04NDggJiYgYnR2LT5yZXZpc2lvbj09MHgxMSkpIHsKKwkJLyogZGVmYXVsdHMgZnJvbSBjYXJkIGxpc3QgKi8KKwkJaWYgKFBMTF8yOCA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnBsbCkgeworCQkJYnR2LT5wbGwucGxsX2lmcmVxPTI4NjM2MzYzOworCQkJYnR2LT5wbGwucGxsX2NyeXN0YWw9QlQ4NDhfSUZPUk1fWFQwOworCQl9CisJCWlmIChQTExfMzUgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKKwkJCWJ0di0+cGxsLnBsbF9pZnJlcT0zNTQ2ODk1MDsKKwkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsPUJUODQ4X0lGT1JNX1hUMTsKKwkJfQorCQkvKiBpbnNtb2Qgb3B0aW9ucyBjYW4gb3ZlcnJpZGUgKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsbFtidHYtPmMubnJdKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBub25lICovCisJCQlidHYtPnBsbC5wbGxfY3J5c3RhbCA9IDA7CisJCQlidHYtPnBsbC5wbGxfaWZyZXEgICA9IDA7CisJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IC8qIDI4IE1IeiAqLworCQljYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5wbGwucGxsX2lmcmVxICAgPSAyODYzNjM2MzsKKwkJCWJ0di0+cGxsLnBsbF9vZnJlcSAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9jcnlzdGFsID0gQlQ4NDhfSUZPUk1fWFQwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiAvKiAzNSBNSHogKi8KKwkJY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9pZnJlcSAgID0gMzU0Njg5NTA7CisJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfY3J5c3RhbCA9IEJUODQ4X0lGT1JNX1hUMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWJ0di0+cGxsLnBsbF9jdXJyZW50ID0gLTE7CisKKwlidHR2X3Jlc2V0X2F1ZGlvKGJ0dik7CisKKwkvKiB0dW5lciBjb25maWd1cmF0aW9uIChmcm9tIGNhcmQgbGlzdCAvIGF1dG9kZXRlY3QgLyBpbnNtb2Qgb3B0aW9uKSAqLworIAlpZiAoVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlKQorCQlpZihVTlNFVCA9PSBidHYtPnR1bmVyX3R5cGUpCisgICAgICAgICAgICAgICAgCWJ0di0+dHVuZXJfdHlwZSA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfdHlwZTsKKwlpZiAoVU5TRVQgIT0gdHVuZXJbYnR2LT5jLm5yXSkKKwkJYnR2LT50dW5lcl90eXBlID0gdHVuZXJbYnR2LT5jLm5yXTsKKwlwcmludGsoImJ0dHYlZDogdXNpbmcgdHVuZXI9JWRcbiIsYnR2LT5jLm5yLGJ0di0+dHVuZXJfdHlwZSk7CisJaWYgKGJ0di0+cGlubmFjbGVfaWQgIT0gVU5TRVQpCisJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsQVVEQ19DT05GSUdfUElOTkFDTEUsCisJCQkJICAgICAgJmJ0di0+cGlubmFjbGVfaWQpOworCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpCisJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsVFVORVJfU0VUX1RZUEUsJmJ0di0+dHVuZXJfdHlwZSk7CisJYnR2LT5zdmhzID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5zdmhzOworCWlmIChzdmhzW2J0di0+Yy5ucl0gIT0gVU5TRVQpCisJCWJ0di0+c3ZocyA9IHN2aHNbYnR2LT5jLm5yXTsKKwlpZiAocmVtb3RlW2J0di0+Yy5ucl0gIT0gVU5TRVQpCisJCWJ0di0+aGFzX3JlbW90ZSA9IHJlbW90ZVtidHYtPmMubnJdOworCisJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX3JhZGlvKQorCQlidHYtPmhhc19yYWRpbz0xOworCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19yZW1vdGUpCisJCWJ0di0+aGFzX3JlbW90ZT0xOworCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX2dwaW9pcnEpCisJCWJ0di0+Z3Bpb2lycT0wOworCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvX2hvb2spCisJCWJ0di0+YXVkaW9faG9vaz1idHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvX2hvb2s7CisKKwlpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5kaWdpdGFsX21vZGUgPT0gRElHSVRBTF9NT0RFX0NBTUVSQSkgeworCQkvKiBkZXRlY3QgQnQ4MzIgY2hpcCBmb3IgcXVhcnR6c2lnaHQgZGlnaXRhbCBjYW1lcmEgKi8KKwkJaWYgKChidHR2X0kyQ1JlYWQoYnR2LCBJMkNfQlQ4MzJfQUxUMSwgIkJ0ODMyIikgPj0wKSB8fAorCQkgICAgKGJ0dHZfSTJDUmVhZChidHYsIEkyQ19CVDgzMl9BTFQyLCAiQnQ4MzIiKSA+PTApKQorCQkJYm9vdF9idDgzMihidHYpOworCX0KKworCWlmICghYXV0b2xvYWQpCisJCXJldHVybjsKKworCS8qIHRyeSB0byBkZXRlY3QgYXVkaW8vZmFkZXIgY2hpcHMgKi8KKwlpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fbXNwMzR4eCAmJgorCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfTVNQMzQwMCwgIk1TUDM0eHgiKSA+PTApCisJCXJlcXVlc3RfbW9kdWxlKCJtc3AzNDAwIik7CisKKwlpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tc3AzNHh4X2FsdCAmJgorCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfTVNQMzQwMF9BTFQsICJNU1AzNHh4IChhbHRlcm5hdGUgYWRkcmVzcykiKSA+PTApCisJCXJlcXVlc3RfbW9kdWxlKCJtc3AzNDAwIik7CisKKwlpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdGRhOTg3NSAmJgorCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfVERBOTg3NSwgIlREQTk4NzUiKSA+PTApCisJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE5ODc1Iik7CisKKwlpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdGRhNzQzMiAmJgorCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfVERBNzQzMiwgIlREQTc0MzIiKSA+PTApCisJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE3NDMyIik7CisKKwlpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uZWVkc190dmF1ZGlvKQorCQlyZXF1ZXN0X21vZHVsZSgidHZhdWRpbyIpOworCisJLyogdHVuZXIgbW9kdWxlcyAqLworCXRkYTk4ODcgPSAwOworCWlmIChidHYtPnBpbm5hY2xlX2lkICE9IFVOU0VUKQorCQl0ZGE5ODg3ID0gMTsKKwlpZiAoMCA9PSB0ZGE5ODg3ICYmIDAgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfZHZiICYmCisJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19UREE5ODg3LCAiVERBOTg4NyIpID49MCkKKwkJdGRhOTg4NyA9IDE7CisJaWYoKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMykgfHwKKwkgICAoYnR2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMykgfHwKKwkgICAoYnR2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMykgfHwKKwkgICAgdGRhOTg4NykKKwkJcmVxdWVzdF9tb2R1bGUoInRkYTk4ODciKTsKKwlpZiAoYnR2LT50dW5lcl90eXBlICE9IFVOU0VUKQorCQlyZXF1ZXN0X21vZHVsZSgidHVuZXIiKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBtb2R0ZWNfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCit7CisJaWYoIHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIlRlbWljIDQwNjYgRlk1IiwxNCkgPT0wKSB7CisJCWJ0di0+dHVuZXJfdHlwZT1UVU5FUl9URU1JQ180MDY2Rlk1X1BBTF9JOworCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKKwkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOworCX0gZWxzZSBpZiAoc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiQWxwcyBUU0JCNSIsMTApID09MCkgeworCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfQUxQU19UU0JCNV9QQUxfSTsKKwkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIlBoaWxpcHMgRk0xMjQ2IiwxNCkgPT0wKSB7CisgICAgICAgICAgICAgICAgYnR2LT50dW5lcl90eXBlPVRVTkVSX1BISUxJUFNfTlRTQzsKKyAgICAgICAgICAgICAgICBwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVW5rbm93biBUdW5lclN0cmluZzogJXNcbiIsCisJCSAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBoYXVwcGF1Z2VfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCit7CisJc3RydWN0IHR2ZWVwcm9tIHR2OworCisJdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmdHYsIGVlcHJvbV9kYXRhKTsKKwlidHYtPnR1bmVyX3R5cGUgPSB0di50dW5lcl90eXBlOworCWJ0di0+aGFzX3JhZGlvICA9IHR2Lmhhc19yYWRpbzsKK30KKworc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KQoreworCWludCBmcmVxOworCisJYnR2LT5oYXNfcmFkaW8gICAgPSAxOworCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKKwlidHYtPm1ib3hfd2UgICAgICA9IDB4MTA7CisJYnR2LT5tYm94X21vc3QgICAgPSAweDIwOworCWJ0di0+bWJveF9jbGsgICAgID0gMHgwODsKKwlidHYtPm1ib3hfZGF0YSAgICA9IDB4MDQ7CisJYnR2LT5tYm94X21hc2sgICAgPSAweDNjOworCisJYnR2LT5tYm94X2lvdyAgICAgPSAxIDw8ICA4OworCWJ0di0+bWJveF9pb3IgICAgID0gMSA8PCAgOTsKKwlidHYtPm1ib3hfY3NlbCAgICA9IDEgPDwgMTA7CisKKwlmcmVxPTg4MDAwLzYyLjU7CisJdGVhNTc1N193cml0ZShidHYsIDUgKiBmcmVxICsgMHgzNTgpOyAvLyB3cml0ZSAweDFlZDgKKwlpZiAoMHgxZWQ4ID09IHRlYTU3NTdfcmVhZChidHYpKSB7CisJCXByaW50aygiYnR0diVkOiBUZXJyYXRlYyBBY3RpdmUgUmFkaW8gVXBncmFkZSBmb3VuZC5cbiIsCisJCSAgICAgICBidHYtPmMubnIpOworCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CisJCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKKwl9IGVsc2UgeworCQlidHYtPmhhc19yYWRpbyAgICA9IDA7CisJCWJ0di0+aGFzX21hdGNoYm94ID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1pbmltYWwgYm9vdHN0cmFwIGZvciB0aGUgV2luVFYvUFZSIC0tIHVwbG9hZCBhbHRlcmEgZmlybXdhcmUuCisgKgorICogVGhlIGhjd2FtYy5yYmYgZmlybXdhcmUgZmlsZSBpcyBvbiB0aGUgSGF1cHBhdWdlIGRyaXZlciBDRC4gIEhhdmUKKyAqIGEgbG9vayBhdCBQdnIvcHZyNDV4eHguRVhFIChzZWxmLWV4dHJhY3RpbmcgemlwIGFyY2hpdmUsIGNhbiBiZQorICogdW5wYWNrZWQgd2l0aCB1bnppcCkuCisgKi8KKyNkZWZpbmUgUFZSX0dQSU9fREVMQVkJCTEwCisKKyNkZWZpbmUgQlRUVl9BTFRfREFUQQkJMHgwMDAwMDEKKyNkZWZpbmUgQlRUVl9BTFRfRENMSwkJMHgxMDAwMDAKKyNkZWZpbmUgQlRUVl9BTFRfTkNPTkZJRwkweDgwMDAwMAorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwdnJfYWx0ZXJhX2xvYWQoc3RydWN0IGJ0dHYgKmJ0diwgdTggKm1pY3JvLCB1MzIgbWljcm9sZW4pCit7CisJdTMyIG47CisgIAl1OCBiaXRzOworCWludCBpOworCisJZ3Bpb19pbm91dCgweGZmZmZmZixCVFRWX0FMVF9EQVRBfEJUVFZfQUxUX0RDTEt8QlRUVl9BTFRfTkNPTkZJRyk7CisJZ3Bpb193cml0ZSgwKTsKKwl1ZGVsYXkoUFZSX0dQSU9fREVMQVkpOworCisJZ3Bpb193cml0ZShCVFRWX0FMVF9OQ09ORklHKTsKKwl1ZGVsYXkoUFZSX0dQSU9fREVMQVkpOworCisJZm9yIChuID0gMDsgbiA8IG1pY3JvbGVuOyBuKyspIHsKKwkJYml0cyA9IG1pY3JvW25dOworCQlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrICkgeworCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CisJCQlpZiAoYml0cyAmIDB4MDEpCisJCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RBVEEsQlRUVl9BTFRfREFUQSk7CisJCQllbHNlCisJCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RBVEEsMCk7CisJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSyxCVFRWX0FMVF9EQ0xLKTsKKwkJCWJpdHMgPj49IDE7CisJCX0KKwl9CisJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CisJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKKworCS8qIGJlZ2luIEFsdGVyYSBpbml0IGxvb3AgKE5vdCBuZWNlc3NhcnksYnV0IGRvZXNuJ3QgaHVydCkgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IDMwIDsgaSsrKSB7CisJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOworCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSyxCVFRWX0FMVF9EQ0xLKTsKKwl9CisJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9ib290KHN0cnVjdCBidHR2ICpidHYpCit7CisgICAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7CisJaW50IHJjOworCisJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgImhjd2FtYy5yYmYiLCAmYnR2LT5jLnBjaS0+ZGV2KTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG5vIGFsdGVyYSBmaXJtd2FyZSBbdmlhIGhvdHBsdWddXG4iLAorCQkgICAgICAgYnR2LT5jLm5yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKwlyYyA9IHB2cl9hbHRlcmFfbG9hZChidHYsIGZ3X2VudHJ5LT5kYXRhLCBmd19lbnRyeS0+c2l6ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBhbHRlcmEgZmlybXdhcmUgdXBsb2FkICVzXG4iLAorCSAgICAgICBidHYtPmMubnIsIChyYyA8IDApID8gImZhaWxlZCIgOiAib2siKTsKKyAgICAgICAgcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJcmV0dXJuIHJjOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc29tZSBvc3ByZXkgc3BlY2lmaWMgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IG9zcHJleV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKK3sKKyAgICAgICBpbnQgaSA9IDA7CisgICAgICAgdW5zaWduZWQgY2hhciAqZWUgPSBlZXByb21fZGF0YTsKKyAgICAgICB1bnNpZ25lZCBsb25nIHNlcmlhbCA9IDA7CisKKyAgICAgICBpZiAoYnR2LT5jLnR5cGUgPT0gMCkgeworICAgICAgICAgICAgICAgLyogdGhpcyBtaWdodCBiZSBhbiBhbnRpcXVlLi4uIGNoZWNrIGZvciBNTUFDIGxhYmVsIGluIGVlcHJvbSAqLworICAgICAgICAgICAgICAgaWYgKChlZVswXT09J00nKSAmJiAoZWVbMV09PSdNJykgJiYgKGVlWzJdPT0nQScpICYmIChlZVszXT09J0MnKSkgeworICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNoZWNrc3VtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0wOyBpPDIxOyBpKyspCisJCQkgICAgICAgY2hlY2tzdW0gKz0gZWVbaV07CisgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja3N1bSAhPSBlZVsyMV0pCisJCQkgICAgICAgcmV0dXJuOworCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MF84NDg7CisJCSAgICAgICBmb3IgKGkgPSAxMjsgaSA8IDIxOyBpKyspCisJCQkgICAgICAgc2VyaWFsICo9IDEwLCBzZXJpYWwgKz0gZWVbaV0gLSAnMCc7CisgICAgICAgICAgICAgICB9CisgICAgICAgfSBlbHNlIHsKKwkgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZTsKKyAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSA0KjE2OworCisgICAgICAgICAgICAgICBmb3IoOyBvZmZzZXQgPCA4KjE2OyBvZmZzZXQgKz0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY2hlY2tzdW0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJpZnkgdGhlIGNoZWNrc3VtICovCisgICAgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaTwxNDsgaSsrKSBjaGVja3N1bSArPSBlZVtpK29mZnNldF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0gPSB+Y2hlY2tzdW07ICAvKiBubyBpZGVhIHdoeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKChjaGVja3N1bT4+OCkmMHgwRkYpID09IGVlW29mZnNldCsxNF0pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hlY2tzdW0gJiAweDBGRikgPT0gZWVbb2Zmc2V0KzE1XSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IDgqMTYpCisJCSAgICAgICByZXR1cm47CisKKwkgICAgICAgLyogZm91bmQgYSB2YWxpZCBkZXNjcmlwdG9yICovCisJICAgICAgIHR5cGUgPSAoZWVbb2Zmc2V0KzRdPDw4KSB8IChlZVtvZmZzZXQrNV0pOworCisJICAgICAgIHN3aXRjaCh0eXBlKSB7CisKKwkgICAgICAgLyogODQ4IGJhc2VkICovCisJICAgICAgIGNhc2UgMHgwMDA0OgorCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MF84NDg7CisJCSAgICAgICBicmVhazsKKwkgICAgICAgY2FzZSAweDAwMDU6CisJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMTAxXzg0ODsKKwkJICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAvKiA4NzggYmFzZWQgKi8KKwkgICAgICAgY2FzZSAweDAwMTI6CisJICAgICAgIGNhc2UgMHgwMDEzOgorCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MDsKKwkJICAgICAgIGJyZWFrOworCSAgICAgICBjYXNlIDB4MDAxNDoKKwkgICAgICAgY2FzZSAweDAwMTU6CisJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMXgxOworCQkgICAgICAgYnJlYWs7CisJICAgICAgIGNhc2UgMHgwMDE2OgorCSAgICAgICBjYXNlIDB4MDAxNzoKKwkgICAgICAgY2FzZSAweDAwMjA6CisJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMXgxX1NWSUQ7CisJCSAgICAgICBicmVhazsKKwkgICAgICAgY2FzZSAweDAwMTg6CisJICAgICAgIGNhc2UgMHgwMDE5OgorCSAgICAgICBjYXNlIDB4MDAxRToKKwkgICAgICAgY2FzZSAweDAwMUY6CisJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMnh4OworCQkgICAgICAgYnJlYWs7CisJICAgICAgIGNhc2UgMHgwMDFBOgorCSAgICAgICBjYXNlIDB4MDAxQjoKKwkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkyeDBfU1ZJRDsKKwkJICAgICAgIGJyZWFrOworCSAgICAgICBjYXNlIDB4MDA0MDoKKwkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVk1MDA7CisJCSAgICAgICBicmVhazsKKwkgICAgICAgY2FzZSAweDAwNTA6CisJICAgICAgIGNhc2UgMHgwMDU2OgorCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTU0MDsKKwkJICAgICAgIC8qIGJ0dHZfb3NwcmV5XzU0MF9pbml0KGJ0dik7ICovCisJCSAgICAgICBicmVhazsKKwkgICAgICAgY2FzZSAweDAwNjA6CisJICAgICAgIGNhc2UgMHgwMDcwOgorCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTJ4MDsKKwkJICAgICAgIC8vZW5hYmxlIG91dHB1dCBvbiBzZWxlY3QgY29udHJvbCBsaW5lcworCQkgICAgICAgZ3Bpb19pbm91dCgweGZmZmZmZiwweDAwMDMwMyk7CisJCSAgICAgICBicmVhazsKKwkgICAgICAgZGVmYXVsdDoKKwkJICAgICAgIC8qIHVua25vd24uLi5sZWF2ZSBnZW5lcmljLCBidXQgZ2V0IHNlcmlhbCAjICovCisJCSAgICAgICBicmVhazsKKwkgICAgICAgfQorCSAgICAgICBzZXJpYWwgPSAgKGVlW29mZnNldCs2XSA8PCAyNCkKKwkJICAgICAgIHwgKGVlW29mZnNldCs3XSA8PCAxNikKKwkJICAgICAgIHwgKGVlW29mZnNldCs4XSA8PCAgOCkKKwkJICAgICAgIHwgKGVlW29mZnNldCs5XSk7CisgICAgICAgfQorCisgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBvc3ByZXkgZWVwcm9tOiBjYXJkPSVkIG5hbWU9JXMgc2VyaWFsPSVsZFxuIiwKKwkgICAgICBidHYtPmMubnIsIGJ0di0+Yy50eXBlLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsc2VyaWFsKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEFWZXJtZWRpYSBzcGVjaWZpYyBzdHVmZiwgZnJvbSAgYmt0cl9jYXJkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBpbnQgdHVuZXJfMF90YWJsZVtdID0geworICAgICAgICBUVU5FUl9QSElMSVBTX05UU0MsICBUVU5FUl9QSElMSVBTX1BBTCAvKiBQQUwtQkcqLywKKyAgICAgICAgVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwgLyogUEFMLUkqLywKKyAgICAgICAgVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwsCisgICAgICAgIFRVTkVSX1BISUxJUFNfU0VDQU0sIFRVTkVSX1BISUxJUFNfU0VDQU0sCisgICAgICAgIFRVTkVSX1BISUxJUFNfU0VDQU0sIFRVTkVSX1BISUxJUFNfUEFMLAorCVRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszIH07CisjaWYgMAoraW50IHR1bmVyXzBfZm1fdGFibGVbXSA9IHsKKyAgICAgICAgUEhJTElQU19GUjEyMzZfTlRTQywgIFBISUxJUFNfRlIxMjE2X1BBTCwKKyAgICAgICAgUEhJTElQU19GUjEyMTZfUEFMLCAgIFBISUxJUFNfRlIxMjE2X1BBTCwKKyAgICAgICAgUEhJTElQU19GUjEyMTZfUEFMLCAgIFBISUxJUFNfRlIxMjE2X1BBTCwKKyAgICAgICAgUEhJTElQU19GUjEyMzZfU0VDQU0sIFBISUxJUFNfRlIxMjM2X1NFQ0FNLAorICAgICAgICBQSElMSVBTX0ZSMTIzNl9TRUNBTSwgUEhJTElQU19GUjEyMTZfUEFMfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHR1bmVyXzFfdGFibGVbXSA9IHsKKyAgICAgICAgVFVORVJfVEVNSUNfTlRTQywgIFRVTkVSX1RFTUlDX1BBTCwKKwlUVU5FUl9URU1JQ19QQUwsICAgVFVORVJfVEVNSUNfUEFMLAorCVRVTkVSX1RFTUlDX1BBTCwgICBUVU5FUl9URU1JQ19QQUwsCisgICAgICAgIFRVTkVSX1RFTUlDXzQwMTJGWTUsIFRVTkVSX1RFTUlDXzQwMTJGWTUsIC8vVFVORVJfVEVNSUNfU0VDQU0KKyAgICAgICAgVFVORVJfVEVNSUNfNDAxMkZZNSwgVFVORVJfVEVNSUNfUEFMfTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IGF2ZXJtZWRpYV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKK3sKKyAgICAgICAgaW50IHR1bmVyX21ha2UsdHVuZXJfdHZfZm0sdHVuZXJfZm9ybWF0LHR1bmVyPTA7CisKKwl0dW5lcl9tYWtlICAgICAgPSAoZWVwcm9tX2RhdGFbMHg0MV0gJiAweDcpOworICAgICAgICB0dW5lcl90dl9mbSAgICAgPSAoZWVwcm9tX2RhdGFbMHg0MV0gJiAweDE4KSA+PiAzOworICAgICAgICB0dW5lcl9mb3JtYXQgICAgPSAoZWVwcm9tX2RhdGFbMHg0Ml0gJiAweGYwKSA+PiA0OworCWJ0di0+aGFzX3JlbW90ZSA9IChlZXByb21fZGF0YVsweDQyXSAmIDB4MDEpOworCisJaWYgKHR1bmVyX21ha2UgPT0gMCB8fCB0dW5lcl9tYWtlID09IDIpCisJCWlmKHR1bmVyX2Zvcm1hdCA8PTB4MGEpCisJCQl0dW5lciA9IHR1bmVyXzBfdGFibGVbdHVuZXJfZm9ybWF0XTsKKwlpZiAodHVuZXJfbWFrZSA9PSAxKQorCQlpZih0dW5lcl9mb3JtYXQgPD05KQorCQkJdHVuZXIgPSB0dW5lcl8xX3RhYmxlW3R1bmVyX2Zvcm1hdF07CisKKwlpZiAodHVuZXJfbWFrZSA9PSA0KQorCQlpZih0dW5lcl9mb3JtYXQgPT0gMHgwOSkKKwkJCXR1bmVyID0gVFVORVJfTEdfTlRTQ19ORVdfVEFQQzsgLy8gVEFQQy1HNzAyUAorCisJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBBdmVybWVkaWEgZWVwcm9tWzB4JTAyeCUwMnhdOiB0dW5lcj0iLAorCQlidHYtPmMubnIsZWVwcm9tX2RhdGFbMHg0MV0sZWVwcm9tX2RhdGFbMHg0Ml0pOworCWlmKHR1bmVyKSB7CisJCWJ0di0+dHVuZXJfdHlwZT10dW5lcjsKKwkJcHJpbnRrKCIlZCIsdHVuZXIpOworCX0gZWxzZQorCQlwcmludGsoIlVua25vd24gdHlwZSIpOworCXByaW50aygiIHJhZGlvOiVzIHJlbW90ZSBjb250cm9sOiVzXG4iLAorCSAgICAgICB0dW5lcl90dl9mbSAgICAgPyAieWVzIiA6ICJubyIsCisJICAgICAgIGJ0di0+aGFzX3JlbW90ZSA/ICJ5ZXMiIDogIm5vIik7Cit9CisKKy8qIHVzZWQgb24gVm9vZG9vIFRWL0ZNIChWb29kb28gMjAwKSwgUzAgd2lyZWQgdG8gMHgxMDAwMCAqLwordm9pZCBidHR2X3RkYTk4ODBfc2V0bm9ybShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgbm9ybSkKK3sKKwkvLyBmaXggdXAgb3VyIGNhcmQgZW50cnkKKwlpZihub3JtPT1WSURFT19NT0RFX05UU0MpIHsKKwkJYnR0dl90dmNhcmRzW0JUVFZfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzBdPTB4OTU3ZmZmOworCQlidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbNF09MHg5NTdmZmY7CisJCWRwcmludGsoImJ0dHZfdGRhOTg4MF9zZXRub3JtIHRvIE5UU0NcbiIpOworCX0KKwllbHNlIHsKKwkgICAgICAgIGJ0dHZfdHZjYXJkc1tCVFRWX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFswXT0weDk0N2ZmZjsKKyAgICAgICAgICAgICAgICBidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbNF09MHg5NDdmZmY7CisJCWRwcmludGsoImJ0dHZfdGRhOTg4MF9zZXRub3JtIHRvIFBBTFxuIik7CisJfQorCS8vIHNldCBHUElPIGFjY29yZGluZworCWdwaW9fYml0cyhidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrLAorCQkgIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbYnR2LT5hdWRpb10pOworfQorCisKKy8qCisgKiByZXNldC9lbmFibGUgdGhlIE1TUCBvbiBzb21lIEhhdXBwYXVnZSBjYXJkcworICogVGhhbmtzIHRvIEt59nN0aSBN5Gxra2kgKGttYWxra2lAY2MuaHV0LmZpKSEKKyAqCisgKiBIYXVwcGF1Z2U6ICBwaW4gIDUKKyAqIFZvb2RvbzogICAgIHBpbiAyMAorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYm9vdF9tc3AzNHh4KHN0cnVjdCBidHR2ICpidHYsIGludCBwaW4pCit7CisJaW50IG1hc2sgPSAoMSA8PCBwaW4pOworCisJZ3Bpb19pbm91dChtYXNrLG1hc2spOworCWdwaW9fYml0cyhtYXNrLDApOworICAgICAgICB1ZGVsYXkoMjUwMCk7CisJZ3Bpb19iaXRzKG1hc2ssbWFzayk7CisKKwlpZiAoYnR0dl9ncGlvKQorCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJtc3AzNHh4Iik7CisJaWYgKGJ0dHZfdmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBIYXVwcGF1Z2UvVm9vZG9vIG1zcDM0eHg6IHJlc2V0IGxpbmUgIgorCQkgICAgICAgImluaXQgWyVkXVxuIiwgYnR2LT5jLm5yLCBwaW4pOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYm9vdF9idDgzMihzdHJ1Y3QgYnR0diAqYnR2KQoreworI2lmIDAgLyogbm90IHdvcmtpbmcgeWV0ICovCisJaW50IHJlc2V0Yml0PTA7CisKKwlzd2l0Y2ggKGJ0di0+Yy50eXBlKSB7CisJY2FzZSBCVFRWX1BYRUxWV1BMVFZQQUs6CisJCXJlc2V0Yml0ID0gMHg0MDAwMDA7CisJCWJyZWFrOworCWNhc2UgQlRUVl9NT0RURUNfMjA1OgorCQlyZXNldGJpdCA9IDE8PDk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCXJlcXVlc3RfbW9kdWxlKCJidDgzMiIpOworCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIEJUODMyX0hFWERVTVAsIE5VTEwpOworCisJcHJpbnRrKCJidHR2JWQ6IFJlc2V0IEJ0ODMyIFtsaW5lPTB4JXhdXG4iLGJ0di0+Yy5ucixyZXNldGJpdCk7CisJZ3Bpb193cml0ZSgwKTsKKwlncGlvX2lub3V0KHJlc2V0Yml0LCByZXNldGJpdCk7CisJdWRlbGF5KDUpOworCWdwaW9fYml0cyhyZXNldGJpdCwgcmVzZXRiaXQpOworCXVkZWxheSg1KTsKKwlncGlvX2JpdHMocmVzZXRiaXQsIDApOworCXVkZWxheSg1KTsKKworCS8vIGJ0ODMyIG9uIHBpeGVsdmlldyBjaGFuZ2VzIGZyb20gaTJjIDB4OGEgdG8gMHg4OCBhZnRlcgorCS8vIGJlaW5nIHJlc2V0IGFzIGFib3ZlLiBTbyB3ZSBtdXN0IGZvbGxvdyBieSB0aGlzOgorCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIEJUODMyX1JFQVRUQUNILCBOVUxMKTsKKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEltYWdlbmF0aW9uIEwtTW9kZWwgUFhDMjAwIEZyYW1lZ3JhYmJlciAqLworLyogIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIHByb2NlZHVyZSBhcworICogIHVzZWQgYnkgQWxlc3NhbmRybyBSdWJpbmkgaW4gaGlzIHB4YzIwMAorICogIGRyaXZlciwgYnV0IHVzaW5nIEJUVFYgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X1BYQzIwMChzdHJ1Y3QgYnR0diAqYnR2KQoreworCXN0YXRpYyBpbnQgdmFsc1tdIF9fZGV2aW5pdGRhdGEgPSB7IDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGQsIDB4MGQsCisJCQkJCSAgICAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAorCQkJCQkgICAgMHgwMCB9OworCXVuc2lnbmVkIGludCBpOworCWludCB0bXA7CisJdTMyIHZhbDsKKworCS8qIEluaXRpYWxpc2UgR1BJTy1jb25uZXZ0ZWQgc3R1ZmYgKi8KKwlncGlvX2lub3V0KDB4ZmZmZmZmLCAoMTw8MTMpKTsKKwlncGlvX3dyaXRlKDApOworCXVkZWxheSgzKTsKKwlncGlvX3dyaXRlKDE8PDEzKTsKKwkvKiBHUElPIGlucHV0cyBhcmUgcHVsbGVkIHVwLCBzbyBubyBuZWVkIHRvIGRyaXZlCisJICogcmVzZXQgcGluIGFueSBsb25nZXIgKi8KKwlncGlvX2JpdHMoMHhmZmZmZmYsIDApOworCWlmIChidHR2X2dwaW8pCisJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInB4YzIwMCIpOworCisJLyogIHdlIGNvdWxkL3Nob3VsZCB0cnkgYW5kIHJlc2V0L2NvbnRyb2wgdGhlIEFEIHBvdHM/IGJ1dAorCSAgICByaWdodCBub3cgIHdlIHNpbXBseSAgdHVybmVkIG9mZiB0aGUgY3J1c2hpbmcuICBXaXRob3V0CisJICAgIHRoaXMgdGhlIEFHQyBkcmlmdHMgZHJpZnRzCisJICAgIHJlbWVtYmVyIHRoZSBFTiBpcyByZXZlcnNlIGxvZ2ljIC0tPgorCSAgICBzZXR0aW5nIEJUODQ4X0FEQ19BR0NfRU4gZGlzYWJsZSB0aGUgQUdDCisJICAgIHRib3VsdEBlZWNzLmxlaGlnaC5lZHUKKwkqLworCisJYnR3cml0ZShCVDg0OF9BRENfUkVTRVJWRUR8QlQ4NDhfQURDX0FHQ19FTiwgQlQ4NDhfQURDKTsKKworCS8qCUluaXRpYWxpc2UgTUFYNTE3IERBQyAqLworCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgREFDIHJlZmVyZW5jZSB2b2x0YWdlIGxldmVsIC4uLlxuIik7CisJYnR0dl9JMkNXcml0ZShidHYsMHg1RSwwLDB4ODAsMSk7CisKKwkvKglJbml0aWFsaXNlIDEyQzUwOCBQSUMgKi8KKwkvKglUaGUgSTJDV3JpdGUgYW5kIEkyQ1JlYWQgY29tbW1hbmRzIGFyZSBhY3R1YWxseSB0byB0aGUKKwkgKglzYW1lIGNoaXBzIC0gYnV0IHRoZSBSL1cgYml0IGlzIGluY2x1ZGVkIGluIHRoZSBhZGRyZXNzCisJICoJYXJndW1lbnQgc28gdGhlIG51bWJlcnMgYXJlIGRpZmZlcmVudCAqLworCisKKwlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXNpbmcgMTJDNTA4IFBJQyBjaGlwIC4uLlxuIik7CisKKwkvKiBGaXJzdCBvZiBhbGwsIGVuYWJsZSB0aGUgY2xvY2sgbGluZS4gVGhpcyBpcyB1c2VkIGluIHRoZSBQWEMyMDAtRiAqLworCXZhbCA9IGJ0cmVhZChCVDg0OF9HUElPX0RNQV9DVEwpOworCXZhbCB8PSBCVDg0OF9HUElPX0RNQV9DVExfR1BDTEtNT0RFOworCWJ0d3JpdGUodmFsLCBCVDg0OF9HUElPX0RNQV9DVEwpOworCisJLyogVGhlbiwgcHVzaCB0byAwIHRoZSByZXNldCBwaW4gbG9uZyBlbm91Z2ggdG8gcmVzZXQgdGhlICoKKwkgKiBkZXZpY2Ugc2FtZSBhcyBhYm92ZSBmb3IgdGhlIHJlc2V0IGxpbmUsIGJ1dCBub3QgdGhlIHNhbWUKKwkgKiB2YWx1ZSBzZW50IHRvIHRoZSBHUElPLWNvbm5lY3RlZCBzdHVmZgorCSAqIHdoaWNoIG9uZSBpcyB0aGUgZ29vZCBvbmU/ICovCisJZ3Bpb19pbm91dCgweGZmZmZmZiwoMTw8MikpOworCWdwaW9fd3JpdGUoMCk7CisJdWRlbGF5KDEwKTsKKwlncGlvX3dyaXRlKDE8PDIpOworCisgICAgICAgCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhbHMpOyBpKyspIHsKKwkJdG1wPWJ0dHZfSTJDV3JpdGUoYnR2LDB4MUUsMCx2YWxzW2ldLDEpOworCQlpZiAodG1wICE9IC0xKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIkkyQyBXcml0ZSglMi4yeCkgPSAlaVxuSTJDIFJlYWQgKCkgPSAlMi4yeFxuXG4iLAorCQkJICAgICAgIHZhbHNbaV0sdG1wLGJ0dHZfSTJDUmVhZChidHYsMHgxRixOVUxMKSk7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJQWEMyMDAgSW5pdGlhbGlzZWQuXG4iKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogTWlybyBQcm8gcmFkaW8gc3R1ZmYgLS0gdGhlIHRlYTU3NTcgaXMgY29ubmVjdGVkIHRvIHNvbWUgR1BJTyBwb3J0cyAgICAgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgQ3NhYmEgSGFsYXN6IDxxZ2VoYWxpQHVuaS1taXNrb2xjLmh1PgorICogVGhpcyBjb2RlIGlzIHBsYWNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgorICogQnJ1dGFsbHkgaGFja2VkIGJ5IERhbiBTaGVyaWRhbiA8ZGFuLnNoZXJpZGFuQGNvbnRhY3Qub3JnLnVrPiBkanM1MiA4LzMvMDAKKyAqLworCitzdGF0aWMgdm9pZCBidXNfbG93KHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCit7CisJaWYgKGJ0di0+bWJveF9pb3IpIHsKKwkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCisJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOworCQl1ZGVsYXkoNSk7CisJfQorCisJZ3Bpb19iaXRzKGJpdCwwKTsKKwl1ZGVsYXkoNSk7CisKKwlpZiAoYnR2LT5tYm94X2lvcikgeworCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLCAwKTsKKwkJdWRlbGF5KDUpOworCX0KK30KKworc3RhdGljIHZvaWQgYnVzX2hpZ2goc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKK3sKKwlpZiAoYnR2LT5tYm94X2lvcikgeworCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKKwkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CisJCXVkZWxheSg1KTsKKwl9CisKKwlncGlvX2JpdHMoYml0LGJpdCk7CisJdWRlbGF5KDUpOworCisJaWYgKGJ0di0+bWJveF9pb3IpIHsKKwkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CisJCXVkZWxheSg1KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYnVzX2luKHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCit7CisJaWYgKGJ0di0+bWJveF9pb3IpIHsKKwkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCisJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOworCQl1ZGVsYXkoNSk7CisKKwkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CisJCXVkZWxheSg1KTsKKwl9CisJcmV0dXJuIGdwaW9fcmVhZCgpICYgKGJpdCk7Cit9CisKKy8qIFRFQTU3NTcgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBURUFfRlJFUQkJMDoxNAorI2RlZmluZSBURUFfQlVGRkVSCQkxNToxNQorCisjZGVmaW5lIFRFQV9TSUdOQUxfU1RSRU5HVEgJMTY6MTcKKworI2RlZmluZSBURUFfUE9SVDEJCTE4OjE4CisjZGVmaW5lIFRFQV9QT1JUMAkJMTk6MTkKKworI2RlZmluZSBURUFfQkFORAkJMjA6MjEKKyNkZWZpbmUgVEVBX0JBTkRfRk0JCTAKKyNkZWZpbmUgVEVBX0JBTkRfTVcJCTEKKyNkZWZpbmUgVEVBX0JBTkRfTFcJCTIKKyNkZWZpbmUgVEVBX0JBTkRfU1cJCTMKKworI2RlZmluZSBURUFfTU9OTwkJMjI6MjIKKyNkZWZpbmUgVEVBX0FMTE9XX1NURVJFTwkwCisjZGVmaW5lIFRFQV9GT1JDRV9NT05PCQkxCisKKyNkZWZpbmUgVEVBX1NFQVJDSF9ESVJFQ1RJT04JMjM6MjMKKyNkZWZpbmUgVEVBX1NFQVJDSF9ET1dOCQkwCisjZGVmaW5lIFRFQV9TRUFSQ0hfVVAJCTEKKworI2RlZmluZSBURUFfU1RBVFVTCQkyNDoyNAorI2RlZmluZSBURUFfU1RBVFVTX1RVTkVECTAKKyNkZWZpbmUgVEVBX1NUQVRVU19TRUFSQ0hJTkcJMQorCisvKiBMb3ctbGV2ZWwgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgdGVhNTc1N19yZWFkKHN0cnVjdCBidHR2ICpidHYpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCB2YWx1ZSA9IDA7CisJaW50IGk7CisKKwkvKiBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5ICovCisJZ3Bpb19pbm91dChidHYtPm1ib3hfbWFzaywgYnR2LT5tYm94X2NsayB8IGJ0di0+bWJveF93ZSk7CisKKwlpZiAoYnR2LT5tYm94X2lvcikgeworCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKKwkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CisJCXVkZWxheSg1KTsKKwl9CisKKwlpZiAoYnR0dl9ncGlvKQorCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZWE1NzU3IHJlYWQiKTsKKworCWJ1c19sb3coYnR2LGJ0di0+bWJveF93ZSk7CisJYnVzX2xvdyhidHYsYnR2LT5tYm94X2Nsayk7CisKKwl1ZGVsYXkoMTApOworCXRpbWVvdXQ9IGppZmZpZXMgKyBIWjsKKworCS8vIHdhaXQgZm9yIERBVEEgbGluZSB0byBnbyBsb3c7IGVycm9yIGlmIGl0IGRvZXNuJ3QKKwl3aGlsZSAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCXNjaGVkdWxlKCk7CisJaWYgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogdGVhNTc1NzogcmVhZCB0aW1lb3V0XG4iLGJ0di0+Yy5ucik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkcHJpbnRrKCJidHR2JWQ6IHRlYTU3NTc6IixidHYtPmMubnIpOworCWZvcihpID0gMDsgaSA8IDI0OyBpKyspCisJeworCQl1ZGVsYXkoNSk7CisJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKKwkJdWRlbGF5KDUpOworCQlkcHJpbnRrKCIlYyIsKGJ1c19pbihidHYsYnR2LT5tYm94X21vc3QpID09IDApPydUJzonLScpOworCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKKwkJdmFsdWUgPDw9IDE7CisJCXZhbHVlIHw9IChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSA9PSAwKT8wOjE7ICAvKiBNU0IgZmlyc3QgKi8KKwkJZHByaW50aygiJWMiLCAoYnVzX2luKGJ0dixidHYtPm1ib3hfbW9zdCkgPT0gMCk/J1MnOidNJyk7CisJfQorCWRwcmludGsoIlxuYnR0diVkOiB0ZWE1NzU3OiByZWFkIDB4JVhcbiIsIGJ0di0+Yy5uciwgdmFsdWUpOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCB0ZWE1NzU3X3dyaXRlKHN0cnVjdCBidHR2ICpidHYsIGludCB2YWx1ZSkKK3sKKwlpbnQgaTsKKwlpbnQgcmVnID0gdmFsdWU7CisKKwlncGlvX2lub3V0KGJ0di0+bWJveF9tYXNrLCBidHYtPm1ib3hfY2xrIHwgYnR2LT5tYm94X3dlIHwgYnR2LT5tYm94X2RhdGEpOworCisJaWYgKGJ0di0+bWJveF9pb3IpIHsKKwkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCisJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOworCQl1ZGVsYXkoNSk7CisJfQorCWlmIChidHR2X2dwaW8pCisJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInRlYTU3NTcgd3JpdGUiKTsKKworCWRwcmludGsoImJ0dHYlZDogdGVhNTc1Nzogd3JpdGUgMHglWFxuIiwgYnR2LT5jLm5yLCB2YWx1ZSk7CisJYnVzX2xvdyhidHYsYnR2LT5tYm94X2Nsayk7CisJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF93ZSk7CisJZm9yKGkgPSAwOyBpIDwgMjU7IGkrKykKKwl7CisJCWlmIChyZWcgJiAweDEwMDAwMDApCisJCQlidXNfaGlnaChidHYsYnR2LT5tYm94X2RhdGEpOworCQllbHNlCisJCQlidXNfbG93KGJ0dixidHYtPm1ib3hfZGF0YSk7CisJCXJlZyA8PD0gMTsKKwkJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF9jbGspOworCQl1ZGVsYXkoMTApOworCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKKwkJdWRlbGF5KDEwKTsKKwl9CisJYnVzX2xvdyhidHYsYnR2LT5tYm94X3dlKTsgIC8qIHVubXV0ZSAhISEgKi8KKwlyZXR1cm4gMDsKK30KKwordm9pZCB0ZWE1NzU3X3NldF9mcmVxKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIHNob3J0IGZyZXEpCit7CisJZHByaW50aygidGVhNTc1N19zZXRfZnJlcSAlZFxuIixmcmVxKTsKKwl0ZWE1NzU3X3dyaXRlKGJ0diwgNSAqIGZyZXEgKyAweDM1OCk7IC8qIGFkZCAxMC43TUh6IChzZWUgZG9jcykgKi8KKyNpZiAwCisJLyogYnJlYWtzIE1pcm8gUENUViAqLworCXZhbHVlID0gdGVhNTc1N19yZWFkKGJ0dik7CisJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3IHJlYWRiYWNrPTB4JXhcbiIsYnR2LT5jLm5yLHZhbHVlKTsKKyNlbmRpZgorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB3aW52aWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit2b2lkIHdpbnZpZXdfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQoreworCS8qIFBUMjI1NEEgcHJvZ3JhbW1pbmcgSm9uIFRvbWJzLCBqb25AZ3RlLmVzaS51cy5lcyAqLworCWludCBiaXRzX291dCwgbG9vcHMsIHZvbCwgZGF0YTsKKworCWlmICghc2V0KSB7CisJCS8qIEZpeGVkIGJ5IExlYW5kcm8gTHVjYXJlbGxhIDxsdWNhQGxpbnV4bWVuZG96YS5vcmcuYXIgKDA3LzMxLzAxKSAqLworCQl2LT5mbGFncyB8PSBWSURFT19BVURJT19WT0xVTUU7CisJCXJldHVybjsKKwl9CisKKwkvKiAzMiBsZXZlbHMgbG9nYXJpdGhtaWMgKi8KKwl2b2wgPSAzMiAtICgodi0+dm9sdW1lPj4xMSkpOworCS8qIHVuaXRzICovCisJYml0c19vdXQgPSAoUFQyMjU0X0RCU19JTl8yPj4odm9sJTUpKTsKKwkvKiB0ZW5zICovCisJYml0c19vdXQgfD0gKFBUMjI1NF9EQlNfSU5fMTA+Pih2b2wvNSkpOworCWJpdHNfb3V0IHw9IFBUMjI1NF9MX0NIQU5ORUwgfCBQVDIyNTRfUl9DSEFOTkVMOworCWRhdGEgPSBncGlvX3JlYWQoKTsKKwlkYXRhICY9IH4oV0lOVklFV19QVDIyNTRfQ0xLfCBXSU5WSUVXX1BUMjI1NF9EQVRBfAorCQkgIFdJTlZJRVdfUFQyMjU0X1NUUk9CRSk7CisJZm9yIChsb29wcyA9IDE3OyBsb29wcyA+PSAwIDsgbG9vcHMtLSkgeworCQlpZiAoYml0c19vdXQgJiAoMTw8bG9vcHMpKQorCQkJZGF0YSB8PSAgV0lOVklFV19QVDIyNTRfREFUQTsKKwkJZWxzZQorCQkJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfREFUQTsKKwkJZ3Bpb193cml0ZShkYXRhKTsKKwkJdWRlbGF5KDUpOworCQlkYXRhIHw9IFdJTlZJRVdfUFQyMjU0X0NMSzsKKwkJZ3Bpb193cml0ZShkYXRhKTsKKwkJdWRlbGF5KDUpOworCQlkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9DTEs7CisJCWdwaW9fd3JpdGUoZGF0YSk7CisJfQorCWRhdGEgfD0gIFdJTlZJRVdfUFQyMjU0X1NUUk9CRTsKKwlkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9EQVRBOworCWdwaW9fd3JpdGUoZGF0YSk7CisJdWRlbGF5KDEwKTsKKwlkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9TVFJPQkU7CisJZ3Bpb193cml0ZShkYXRhKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIG1vbm8vc3RlcmVvIGNvbnRyb2wgZm9yIHZhcmlvdXMgY2FyZHMgKHdoaWNoIGRvbid0IHVzZSBpMmMgY2hpcHMgYnV0ICAgICovCisvKiBjb25uZWN0IHNvbWV0aGluZyB0byB0aGUgR1BJTyBwaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgdm9pZAorZ3ZiY3R2M3BjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCit7CisJdW5zaWduZWQgaW50IGNvbiA9IDA7CisKKwlpZiAoc2V0KSB7CisJCWdwaW9faW5vdXQoMHgzMDAsIDB4MzAwKTsKKwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKKwkJCWNvbiA9IDB4MDAwOworCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQorCQkJY29uID0gMHgzMDA7CisJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQorCQkJY29uID0gMHgyMDA7CisvLwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQorLy8JCQljb24gPSAweDEwMDsKKwkJZ3Bpb19iaXRzKDB4MzAwLCBjb24pOworCX0gZWxzZSB7CisJCXYtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU8gfAorCQkJICBWSURFT19TT1VORF9MQU5HMSAgfCBWSURFT19TT1VORF9MQU5HMjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitndmJjdHY1cGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsLCBjb247CisKKyNpZiBCVFRWX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDAsOCwwKQorCWlmIChidHYtPnJhZGlvX3VzZXIpCisJCXJldHVybjsKKyNlbHNlCisJaWYgKGJ0di0+cmFkaW8pCisJCXJldHVybjsKKyNlbmRpZgorCisJdmFsID0gZ3Bpb19yZWFkKCk7CisJaWYgKHNldCkgeworCQljb24gPSAweDAwMDsKKwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgeworCQkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkgeworCQkJCS8qIExBTkcxICsgTEFORzIgKi8KKwkJCQljb24gPSAweDEwMDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qIExBTkcyICovCisJCQkJY29uID0gMHgzMDA7CisJCQl9CisJCX0KKwkJaWYgKGNvbiAhPSAodmFsICYgMHgzMDApKSB7CisJCQlncGlvX2JpdHMoMHgzMDAsIGNvbik7CisJCQlpZiAoYnR0dl9ncGlvKQorCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImd2YmN0djVwY2kiKTsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAodmFsICYgMHg3MCkgeworCQkgIGNhc2UgMHgxMDoKKwkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOworCQkJYnJlYWs7CisJCSAgY2FzZSAweDMwOgorCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX0xBTkcyOworCQkJYnJlYWs7CisJCSAgY2FzZSAweDUwOgorCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX0xBTkcxOworCQkJYnJlYWs7CisJCSAgY2FzZSAweDYwOgorCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX1NURVJFTzsKKwkJCWJyZWFrOworCQkgIGNhc2UgMHg3MDoKKwkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05POworCQkJYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKKwkJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CisJCX0KKwl9Cit9CisKKy8qCisgKiBNYXJpbyBNZWRpbmEgTnVzc2JhdW0gPG1lZGlzb2Z0QGFsb2hhYmJzLm9yZy5teD4KKyAqICBJIGRpc2NvdmVyIHRoYXQgb24gQlQ4NDhfR1BJT19EQVRBIGFkZHJlc3MgYSBieXRlIDB4Y2NlIGVuYWJsZSBzdGVyZW8sCisgKiAgMHhkZGUgZW5hYmxlcyBtb25vIGFuZCAweGNjZCBlbmFibGVzIHNhcAorICoKKyAqIFBldHIgVmFuZHJvdmVjIDxWQU5EUk9WRUB2Yy5jdnV0LmN6PgorICogIFAuUy46IEF0IGxlYXN0IG1hc2sgaW4gbGluZSBhYm92ZSBpcyB3cm9uZyAtIEdQSU8gcGlucyAzLDIgc2VsZWN0CisgKiAgaW5wdXQvb3V0cHV0IHNvdW5kIGNvbm5lY3Rpb24sIHNvIGJvdGggbXVzdCBiZSBzZXQgZm9yIG91dHB1dCBtb2RlLgorICoKKyAqIExvb2tzIGxpa2UgaXQncyBuZWVkZWQgb25seSBmb3IgdGhlICJ0dnBob25lIiwgdGhlICJ0dnBob25lIDk4IgorICogaGFuZGxlcyB0aGlzIHdpdGggYSB0ZGE5ODQwCisgKgorICovCitzdGF0aWMgdm9pZAorYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQoreworCWludCB2YWwgPSAwOworCisJaWYgKHNldCkgeworCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSAgIC8qIFNBUCAqLworCQkJdmFsID0gMHgwMjsKKwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCisJCQl2YWwgPSAweDAxOworCQlpZiAodmFsKSB7CisJCQlncGlvX2JpdHMoMHgwMyx2YWwpOworCQkJaWYgKGJ0dHZfZ3BpbykKKwkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJhdmVybWVkaWEiKTsKKwkJfQorCX0gZWxzZSB7CisJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKKwkJCVZJREVPX1NPVU5EX0xBTkcxOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZAorYXZlcm1lZGlhX3R2X3N0ZXJlb19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCit7CisJaW50IHZhbCA9IDA7CisKKwlpZiAoc2V0KSB7CisJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpICAgLyogU0FQICovCisJCQl2YWwgPSAweDAxOworCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykgIC8qIFNURVJFTyAqLworCQkJdmFsID0gMHgwMjsKKwkJYnRhb3IodmFsLCB+MHgwMywgQlQ4NDhfR1BJT19EQVRBKTsKKwkJaWYgKGJ0dHZfZ3BpbykKKwkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImF2ZXJtZWRpYSIpOworCX0gZWxzZSB7CisJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKKwkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CisJCXJldHVybjsKKwl9Cit9CisKKy8qIExpZmV0ZWMgOTQxNSBoYW5kbGluZyAqLworc3RhdGljIHZvaWQKK2x0OTQxNV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCit7CisgICAgICAgIGludCB2YWwgPSAwOworCisgICAgICAgIGlmIChncGlvX3JlYWQoKSAmIDB4NDAwMCkgeworCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKKwkJcmV0dXJuOworCX0KKworICAgICAgICBpZiAoc2V0KSB7CisgICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgIC8qIEEyIFNBUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMHgwMDgwOworCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykgLyogQTIgc3RlcmVvICovCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDA4ODA7CisgICAgICAgICAgICAgICAgaWYgKCh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpIHx8CisJCSAgICAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pKQorCQkJdmFsID0gMDsKKwkJZ3Bpb19iaXRzKDB4MDg4MCwgdmFsKTsKKyAgICAgICAgICAgICAgICBpZiAoYnR0dl9ncGlvKQorICAgICAgICAgICAgICAgICAgICAgICAgYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwibHQ5NDE1Iik7CisgICAgICAgIH0gZWxzZSB7CisJCS8qIGF1dG9kZXRlY3QgZG9lc24ndCB3b3JrIHdpdGggdGhpcyBjYXJkIDotKCAqLworICAgICAgICAgICAgICAgIHYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKKwkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cit9CisKKy8vIFREQTk4MjEgb24gVGVycmFUVisgQnQ4NDgsIEJ0ODc4CitzdGF0aWMgdm9pZAordGVycmF0dl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCit7CisJdW5zaWduZWQgaW50IGNvbiA9IDA7CisKKwlpZiAoc2V0KSB7CisJCWdwaW9faW5vdXQoMHgxODAwMDAsMHgxODAwMDApOworCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQorCQkJY29uID0gMHgwODAwMDA7CisJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQorCQkJY29uID0gMHgxODAwMDA7CisJCWdwaW9fYml0cygweDE4MDAwMCwgY29uKTsKKwkJaWYgKGJ0dHZfZ3BpbykKKwkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInRlcnJhdHYiKTsKKwl9IGVsc2UgeworCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CisJCQlWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOworCX0KK30KKworc3RhdGljIHZvaWQKK3dpbmZhc3QyMDAwX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CisKKwlpZiAoc2V0KSB7CisJCS8qYnRvciAoMHhjMzIwMDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsqLworCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCQkvKiBNb25vICovCisJCQl2YWwgPSAweDQyMDAwMDsKKwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkJLyogTW9ubyAqLworCQkJdmFsID0gMHg0MjAwMDA7CisJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCS8qIFNBUCAqLworCQkJdmFsID0gMHg0MTAwMDA7CisJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQkvKiBTdGVyZW8gKi8KKwkJCXZhbCA9IDB4MDIwMDAwOworCQlpZiAodmFsKSB7CisJCQlncGlvX2JpdHMoMHg0MzAwMDAsIHZhbCk7CisJCQlpZiAoYnR0dl9ncGlvKQorCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIndpbmZhc3QyMDAwIik7CisJCX0KKwl9IGVsc2UgeworCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CisJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CisJfQorfQorCisvKgorICogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4KKyAqIHNvdW5kIGNvbnRyb2wgZm9yIFByb2xpbmsgUFYtQlQ4NzhQKzlCIChQaXhlbFZpZXcgUGxheVRWIFBybyBGTStOSUNBTQorICogcmV2aXNpb24gOUIgaGFzIG9uLWJvYXJkIFREQTk4NzRBIHNvdW5kIGRlY29kZXIpLgorICoKKyAqIE5vdGU6IFRoZXJlIGFyZSBjYXJkIHZhcmlhbnRzIHdpdGhvdXQgdGRhOTg3NGEuIEZvcmNpbmcgdGhlICJzdGVyZW8gc291bmQgcm91dGUiCisgKiAgICAgICB3aWxsIG11dGUgdGhpcyBjYXJkcy4KKyAqLworc3RhdGljIHZvaWQKK3B2YnQ4NzhwOWJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQoreworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisjaWYgQlRUVl9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigwLDgsMCkKKwlpZiAoYnR2LT5yYWRpb191c2VyKQorCQlyZXR1cm47CisjZWxzZQorCWlmIChidHYtPnJhZGlvKQorCQlyZXR1cm47CisjZW5kaWYKKworCWlmIChzZXQpIHsKKwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQl7CisJCQl2YWwgPSAweDAxOworCQl9CisJCWlmICgodi0+bW9kZSAmIChWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyKSkKKwkJICAgIHx8ICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSkgeworCQkJdmFsID0gMHgwMjsKKwkJfQorCQlpZiAodmFsKSB7CisJCQlncGlvX2JpdHMoMHgwMyx2YWwpOworCQkJaWYgKGJ0dHZfZ3BpbykKKwkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJwdmJ0ODc4cDliIik7CisJCX0KKwl9IGVsc2UgeworCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CisJCQlWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOworCX0KK30KKworLyoKKyAqIERhcml1c3ogS293YWxld3NraSA8ZGFyZWtrQGF1dG9tZXgucGw+CisgKiBzb3VuZCBjb250cm9sIGZvciBGbHlWaWRlbyAyMDAwUyAod2l0aCB0ZGE5ODc0IGRlY29kZXIpCisgKiBiYXNlZCBvbiBwdmJ0ODc4cDliX2F1ZGlvKCkgLSB0aGlzIGlzIG5vdCB0ZXN0ZWQsIHBsZWFzZSBmaXghISEKKyAqLworc3RhdGljIHZvaWQKK2Z2MjAwMHNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQoreworCXVuc2lnbmVkIGludCB2YWwgPSAweGZmZmY7CisKKyNpZiBCVFRWX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDAsOCwwKQorCWlmIChidHYtPnJhZGlvX3VzZXIpCisJCXJldHVybjsKKyNlbHNlCisJaWYgKGJ0di0+cmFkaW8pCisJCXJldHVybjsKKyNlbmRpZgorCWlmIChzZXQpIHsKKwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQl7CisJCQl2YWwgPSAweDAwMDA7CisJCX0KKwkJaWYgKCh2LT5tb2RlICYgKFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzIpKQorCQkgICAgfHwgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pKSB7CisJCQl2YWwgPSAweDEwODA7IC8vLWRrLT8/PzogMHgwODgwLCAweDAwODAsIDB4MTgwMCAuLi4KKwkJfQorCQlpZiAodmFsICE9IDB4ZmZmZikgeworCQkJZ3Bpb19iaXRzKDB4MTgwMCwgdmFsKTsKKwkJCWlmIChidHR2X2dwaW8pCisJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwiZnYyMDAwcyIpOworCQl9CisJfSBlbHNlIHsKKwkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAorCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKKwl9Cit9CisKKy8qCisgKiBzb3VuZCBjb250cm9sIGZvciBDYW5vcHVzIFdpbkRWUiBQQ0kKKyAqIE1hc2FraSBTdXp1a2kgPG1hc2FraUBidHJlZS5vcmc+CisgKi8KK3N0YXRpYyB2b2lkCit3aW5kdnJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQoreworICAgICAgICB1bnNpZ25lZCBsb25nIHZhbCA9IDA7CisKKyAgICAgICAgaWYgKHNldCkgeworICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDB4MDQwMDAwOworICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDEwMDAwMDsKKyAgICAgICAgICAgICAgICBpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHZhbCkgeworCQkJZ3Bpb19iaXRzKDB4MTQwMDAwLCB2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ0dHZfZ3BpbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwid2luZHZyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKKyAgICAgICAgfQorfQorCisvKgorICogc291bmQgY29udHJvbCBmb3IgQUQtVFZLNTAzCisgKiBIaXJvc2hpIFRha2VrYXdhIDxzaWFuQGJpZy5vci5qcD4KKyAqLworc3RhdGljIHZvaWQKK2FkdHZrNTAzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKK3sKKwl1bnNpZ25lZCBpbnQgY29uID0gMHhmZmZmZmY7CisKKwkvL2J0YW9yKDB4MWUwMDAwLCB+MHgxZTAwMDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsKKworCWlmIChzZXQpIHsKKwkJLy9idG9yKCoqKiwgQlQ4NDhfR1BJT19PVVRfRU4pOworCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQorCQkJY29uID0gMHgwMDAwMDAwMDsKKwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKKwkJCWNvbiA9IDB4MDAxODAwMDA7CisJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQorCQkJY29uID0gMHgwMDAwMDAwMDsKKwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQorCQkJY29uID0gMHgwMDA2MDAwMDsKKwkJaWYgKGNvbiAhPSAweGZmZmZmZikgeworCQkJZ3Bpb19iaXRzKDB4MWUwMDAwLGNvbik7CisJCQlpZiAoYnR0dl9ncGlvKQorCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsICJhZHR2azUwMyIpOworCQl9CisJfSBlbHNlIHsKKwkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAorCQkJICBWSURFT19TT1VORF9MQU5HMSAgfCBWSURFT19TT1VORF9MQU5HMjsKKwl9Cit9CisKKy8qIFJlbW90ZVZpc2lvbiBNWCAocnY2MDUpIG11eHNlbCBoZWxwZXIgW01pZ3VlbCBGcmVpdGFzXQorICoKKyAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcnY2MDUgZG9uJ3QgdXNlIGEgbm9ybWFsIG11bHRpcGxleCwgYnV0IGEgY3Jvc3Nwb2ludAorICogc3dpdGNoIGluc3RlYWQgKENEMjJNMzQ5NEUpLiBUaGlzIElDIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBjb25uZWN0aW9ucworICogYmV0d2VlbiBYbiAoaW5wdXQpIGFuZCBZbiAob3V0cHV0KSBwaW5zLiBXZSBuZWVkIHRvIGNsZWFyIGFueSBleGlzdGluZworICogY29ubmVjdGlvbiBwcmlvciB0byBlc3RhYmxpc2ggYSBuZXcgb25lLCBwdWxzaW5nIHRoZSBTVFJPQkUgcGluLgorICoKKyAqIFRoZSBib2FyZCBoYXJkd2lyZSBZMCAoeHBvaW50KSB0byBNVVgxIGFuZCBNVVhPVVQgdG8gWWluLgorICogR1BJTyBwaW5zIGFyZSB3aXJlZCBhczoKKyAqICBHUElPWzA6M10gLSBBWFswOjNdICh4cG9pbnQpIC0gUDFbMDozXSAobWljcm9jb250cm9sZXIpCisgKiAgR1BJT1s0OjZdIC0gQVlbMDoyXSAoeHBvaW50KSAtIFAxWzQ6Nl0gKG1pY3JvY29udHJvbGVyKQorICogIEdQSU9bN10gICAtIERBVEEgKHhwb2ludCkgICAgLSBQMVs3XSAobWljcm9jb250cm9sZXIpCisgKiAgR1BJT1s4XSAgIC0gICAgICAgICAgICAgICAgICAtIFAzWzVdIChtaWNyb2NvbnRyb2xlcikKKyAqICBHUElPWzldICAgLSBSRVNFVCAoeHBvaW50KSAgIC0gUDNbNl0gKG1pY3JvY29udHJvbGVyKQorICogIEdQSU9bMTBdICAtIFNUUk9CRSAoeHBvaW50KSAgLSBQM1s3XSAobWljcm9jb250cm9sZXIpCisgKiAgR1BJTlRSICAgIC0gICAgICAgICAgICAgICAgICAtIFAzWzRdIChtaWNyb2NvbnRyb2xlcikKKyAqCisgKiBUaGUgbWljcm9jb250cm9sZXIgaXMgYSA4MEMzMiBsaWtlLiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gY2hhbmdlIHhwb2ludAorICogY29uZmlndXJhdGlvbiBlaXRoZXIgZGlyZWN0bHkgKGFzIHdlIGFyZSBkb2luZykgb3IgdXNpbmcgdGhlIG1pY3JvY29udHJvbGVyCisgKiB3aGljaCBpcyBhbHNvIHdpcmVkIHRvIEkyQyBpbnRlcmZhY2UuIEkgaGF2ZSBubyBmdXJ0aGVyIGluZm8gb24gdGhlCisgKiBtaWNyb2NvbnRyb2xlciBmZWF0dXJlcywgb25lIHdvdWxkIG5lZWQgdG8gZGlzYXNzZW1ibHkgdGhlIGZpcm13YXJlLgorICogbm90ZTogdGhlIHZlbmRvciByZWZ1c2VkIHRvIGdpdmUgYW55IGluZm9ybWF0aW9uIG9uIHRoaXMgcHJvZHVjdCwgYWxsCisgKiAgICAgICB0aGF0IHN0dWZmIHdhcyBmb3VuZCB1c2luZyBhIG11bHRpbWV0ZXIhIDopCisgKi8KK3N0YXRpYyB2b2lkIHJ2NjA1X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCit7CisJLyogcmVzZXQgYWxsIGNvbmVjdGlvbnMgKi8KKwlncGlvX2JpdHMoMHgyMDAsMHgyMDApOworCW1kZWxheSgxKTsKKwlncGlvX2JpdHMoMHgyMDAsMHgwMDApOworCW1kZWxheSgxKTsKKworCS8qIGNyZWF0ZSBhIG5ldyBjb25lY3Rpb24gKi8KKwlncGlvX2JpdHMoMHg0ODAsMHgwODApOworCWdwaW9fYml0cygweDQ4MCwweDQ4MCk7CisJbWRlbGF5KDEpOworCWdwaW9fYml0cygweDQ4MCwweDA4MCk7CisJbWRlbGF5KDEpOworfQorCisvKiBUaWJldCBTeXN0ZW1zICdQcm9ncmVzcyBEVlInIENTMTYgbXV4c2VsIGhlbHBlciBbQ2hyaXMgRmFubmluZ10KKyAqCisgKiBUaGUgQ1MxNiAoYXZhaWxhYmxlIG9uIGVCYXkgY2hlYXApIGlzIGEgUENJIGJvYXJkIHdpdGggZm91ciBGdXNpb24KKyAqIDg3OEEgY2hpcHMsIGEgUENJIGJyaWRnZSwgYW4gQXRtZWwgbWljcm9jb250cm9sbGVyLCBmb3VyIHN5bmMgc2VwZXJhdG9yCisgKiBjaGlwcywgdGVuIGVpZ2h0IGlucHV0IGFuYWxvZyBtdWx0aXBsZXhvcnMsIGEgbm90IGNoaXAgYW5kIGEgZmV3CisgKiBvdGhlciBjb21wb25lbnRzLgorICoKKyAqIDE2IGlucHV0cyBvbiBhIHNlY29uZGFyeSBicmFja2V0IGFyZSBwcm92aWRlZCBhbmQgY2FuIGJlIHNlbGVjdGVkCisgKiBmcm9tIGVhY2ggb2YgdGhlIGZvdXIgY2FwdHVyZSBjaGlwcy4gIFR3byBvZiB0aGUgZWlnaHQgaW5wdXQKKyAqIG11bHRpcGxleG9ycyBhcmUgdXNlZCB0byBzZWxlY3QgZnJvbSBhbnkgb2YgdGhlIDE2IGlucHV0IHNpZ25hbHMuCisgKgorICogVW5zdXBwb3J0ZWQgaGFyZHdhcmUgY2FwYWJpbGl0aWVzOgorICogIC4gQSB2aWRlbyBvdXRwdXQgbW9uaXRvciBvbiB0aGUgc2Vjb25kYXJ5IGJyYWNrZXQgY2FuIGJlIHNlbGVjdGVkIGZyb20KKyAqICAgIG9uZSBvZiB0aGUgODc4QSBjaGlwcy4KKyAqICAuIEFub3RoZXIgcGFzc3Rocm91Z2ggYnV0IEkgaGF2ZW4ndCBzcGVudCBhbnkgdGltZSBpbnZlc3RpZ2F0aW5nIGl0LgorICogIC4gRGlnaXRhbCBJL08gKGxvZ2ljIGxldmVsIGNvbm5lY3RlZCB0byBHUElPKSBpcyBhdmFpbGFibGUgZnJvbSBhbgorICogICAgb25ib2FyZCBoZWFkZXIuCisgKgorICogVGhlIG9uIGNoaXAgaW5wdXQgbXV4IHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIDIuCisgKiBHUElPWzE2OjE5XSAtIFZpZGVvIGlucHV0IHNlbGVjdGlvbgorICogR1BJT1swOjNdICAgLSBWaWRlbyBvdXRwdXQgbW9uaXRvciBzZWxlY3QgKG9ubHkgYXZhaWxhYmxlIGZyb20gb25lIDg3OEEpCisgKiBHUElPWz86P10gICAtIERpZ2l0YWwgSS9PLgorICoKKyAqIFRoZXJlIGlzIGFuIEFUTUVMIG1pY3JvY29udHJvbGxlciB3aXRoIGFuIDgwMzEgY29yZSBvbiBib2FyZC4gIEkgaGF2ZSBub3QKKyAqIGRldGVybWluZWQgd2hhdCBmdW5jdGlvbiAoaWYgYW55KSBpdCBwcm92aWRlcy4gIFdpdGggdGhlIG1pY3JvY29udHJvbGxlcgorICogYW5kIHN5bmMgc2VwZXJhdG9yIGNoaXBzIGEgZ3Vlc3MgaXMgdGhhdCBpdCBtaWdodCBoYXZlIHRvIGRvIHdpdGggdmlkZW8KKyAqIHN3aXRjaGluZyBhbmQgbWF5YmUgc29tZSBkaWdpdGFsIEkvTy4KKyAqLworc3RhdGljIHZvaWQgdGliZXRDUzE2X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCit7CisJLyogdmlkZW8gbXV4ICovCisJZ3Bpb19iaXRzKDB4MGYwMDAwLCBpbnB1dCA8PCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIHRpYmV0Q1MxNl9pbml0KHN0cnVjdCBidHR2ICpidHYpCit7CisJLyogZW5hYmxlIGdwaW8gYml0cywgbWFzayBvYnRhaW5lZCB2aWEgYnRTcHkgKi8KKwlncGlvX2lub3V0KDB4ZmZmZmZmLCAweDBmN2ZmZik7CisJZ3Bpb193cml0ZSgweDBmN2ZmZik7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGZvciB0aGUgS29kaWNvbS00NDAwciBnZXQgYSBsaXR0bGUgbWluZC10d2lzdGluZy4KKyAqIFRoZXJlIGlzIGEgIm1hc3RlciIgY29udHJvbGxlciBhbmQgdGhyZWUgInNsYXZlIiBjb250cm9sbGVycywgdG9nZXRoZXIKKyAqIGFuIGFuYWxvZyBzd2l0Y2ggd2hpY2ggY29ubmVjdHMgYW55IG9mIDE2IGNhbWVyYXMgdG8gYW55IG9mIHRoZSBCVDg3QSdzLgorICogVGhlIGFuYWxvZyBzd2l0Y2ggaXMgY29udHJvbGxlZCBieSB0aGUgIm1hc3RlciIsIGJ1dCB0aGUgZGV0ZWN0aW9uIG9yZGVyCisgKiBvZiB0aGUgZm91ciBCVDg3OEEgY2hpcHMgaXMgaW4gYW4gb3JkZXIgd2hpY2ggSSBqdXN0IGRvbid0IHVuZGVyc3RhbmQuCisgKiBUaGUgIm1hc3RlciIgaXMgYWN0dWFsbHkgdGhlIHNlY29uZCBjb250cm9sbGVyIHRvIGJlIGRldGVjdGVkLiAgVGhlCisgKiBsb2dpYyBvbiB0aGUgYm9hcmQgdXNlcyBsb2dpY2FsIG51bWJlcnMgZm9yIHRoZSA0IGNvbnRyb2xlcnMsIGJ1dAorICogdGhvc2UgbnVtYmVycyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGRldGVjdGlvbiBzZXF1ZW5jZS4gIFdoZW4gd29ya2luZworICogd2l0aCB0aGUgYW5hbG9nIHN3aXRjaCwgd2UgbmVlZCB0byAibWFwIiBmcm9tIHRoZSBkZXRlY3Rpb24gc2VxdWVuY2UKKyAqIG92ZXIgdG8gdGhlIGJvYXJkJ3MgbG9naWNhbCBjb250cm9sbGVyIG51bWJlci4gIFRoaXMgbWFwcGluZyBzZXF1ZW5jZQorICogaXMgezMsIDAsIDIsIDF9LCBpLmUuIHRoZSBmaXJzdCBjb250cm9sbGVyIHRvIGJlIGRldGVjdGVkIGlzIGxvZ2ljYWwKKyAqIHVuaXQgMywgdGhlIHNlY29uZCAod2hpY2ggaXMgdGhlIG1hc3RlcikgaXMgbG9naWNhbCB1bml0IDAsIGV0Yy4KKyAqIFdlIG5lZWQgdG8gbWFpbnRhaW4gdGhlIHN0YXR1cyBvZiB0aGUgYW5hbG9nIHN3aXRjaCAod2hpY2ggb2YgdGhlIDE2CisgKiBjYW1lcmFzIGlzIGNvbm5lY3RlZCB0byB3aGljaCBvZiB0aGUgNCBjb250cm9sbGVycykuICBSYXRoZXIgdGhhbgorICogYWRkIHRvIHRoZSBidHR2IHN0cnVjdHVyZSBmb3IgdGhpcywgd2UgdXNlIHRoZSBkYXRhIHJlc2VydmVkIGZvcgorICogdGhlIG1ib3ggKHVudXNlZCBmb3IgdGhpcyBjYXJkIHR5cGUpLgorICovCisKKy8qCisgKiBGaXJzdCBhIHJvdXRpbmUgdG8gc2V0IHRoZSBhbmFsb2cgc3dpdGNoLCB3aGljaCBjb250cm9scyB3aGljaCBjYW1lcmEKKyAqIGlzIHJvdXRlZCB0byB3aGljaCBjb250cm9sbGVyLiAgVGhlIHN3aXRjaCBjb21wcmlzZXMgYW4gWC1hZGRyZXNzCisgKiAoZ3BpbyBiaXRzIDAtMywgcmVwcmVzZW50aW5nIHRoZSBjYW1lcmEsIHJhbmdpbmcgZnJvbSAwLTE1KSwgYW5kIGEKKyAqIFktYWRkcmVzcyAoZ3BpbyBiaXRzIDQtNiwgcmVwcmVzZW50aW5nIHRoZSBjb250cm9sbGVyLCByYW5naW5nIGZyb20gMC0zKS4KKyAqIEEgZGF0YSB2YWx1ZSAoZ3BpbyBiaXQgNykgb2YgJzEnIGVuYWJsZXMgdGhlIHN3aXRjaCwgYW5kICcwJyBkaXNhYmxlcworICogdGhlIHN3aXRjaC4gIEEgU1RST0JFIGJpdCAoZ3BpbyBiaXQgOCkgbGF0Y2hlcyB0aGUgZGF0YSB2YWx1ZSBpbnRvIHRoZQorICogc3BlY2lmaWVkIGFkZHJlc3MuICBUaGUgaWRlYSBpcyB0byBzZXQgdGhlIGFkZHJlc3MgYW5kIGRhdGEsIHRoZW4gYnJpbmcKKyAqIFNUUk9CRSBoaWdoLCBhbmQgZmluYWxseSBicmluZyBTVFJPQkUgYmFjayB0byBsb3cuCisgKi8KK3N0YXRpYyB2b2lkIGtvZGljb200NDAwcl93cml0ZShzdHJ1Y3QgYnR0diAqYnR2LAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgeGFkZHIsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciB5YWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGRhdGEpIHsKKwl1bnNpZ25lZCBpbnQgdWRhdGE7CisKKwl1ZGF0YSA9IChkYXRhIDw8IDcpIHwgKCh5YWRkciYzKSA8PCA0KSB8ICh4YWRkciYweGYpOworCWdwaW9fYml0cygweDFmZiwgdWRhdGEpOwkJLyogd3JpdGUgQUREUiBhbmQgREFUICovCisJZ3Bpb19iaXRzKDB4MWZmLCB1ZGF0YSB8ICgxIDw8IDgpKTsJLyogc3Ryb2JlIGhpZ2ggKi8KKwlncGlvX2JpdHMoMHgxZmYsIHVkYXRhKTsJCS8qIHN0cm9iZSBsb3cgKi8KK30KKworLyoKKyAqIE5leHQgdGhlIG11eCBzZWxlY3QuICBCb3RoIHRoZSAibWFzdGVyIiBhbmQgInNsYXZlIiAnY2FyZHMnIChjb250cm9sbGVycykKKyAqIHVzZSB0aGlzIHJvdXRpbmUuICBUaGUgcm91dGluZSBmaW5kcyB0aGUgIm1hc3RlciIgZm9yIHRoZSBjYXJkLCBtYXBzCisgKiB0aGUgY29udHJvbGxlciBudW1iZXIgZnJvbSB0aGUgZGV0ZWN0ZWQgcG9zaXRpb24gb3ZlciB0byB0aGUgbG9naWNhbAorICogbnVtYmVyLCB3cml0ZXMgdGhlIGFwcHJvcHJpYXRlIGRhdGEgdG8gdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBob3VzZWtlZXBzCisgKiB0aGUgbG9jYWwgY29weSBvZiB0aGUgc3dpdGNoIGluZm9ybWF0aW9uLiAgVGhlIHBhcmFtZXRlciAnaW5wdXQnIGlzIHRoZQorICogcmVxdWVzdGVkIGNhbWVyYSBudW1iZXIgKDAgLSAxNSkuCisgKi8KK3N0YXRpYyB2b2lkIGtvZGljb200NDAwcl9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQoreworCWNoYXIgKnN3X3N0YXR1czsKKwlpbnQgeGFkZHIsIHlhZGRyOworCXN0cnVjdCBidHR2ICptY3RscjsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBtYXBbNF0gPSB7MywgMCwgMiwgMX07CisKKwltY3RsciA9IG1hc3RlcltidHYtPmMubnJdOworCWlmIChtY3RsciA9PSBOVUxMKSB7CS8qIGlnbm9yZSBpZiBtYXN0ZXIgbm90IHlldCBkZXRlY3RlZCAqLworCQlyZXR1cm47CisJfQorCXlhZGRyID0gKGJ0di0+Yy5uciAtIG1jdGxyLT5jLm5yICsgMSkgJiAzOyAvKiB0aGUgJyYnIGlzIGZvciBzYWZldHkgKi8KKwl5YWRkciA9IG1hcFt5YWRkcl07CisJc3dfc3RhdHVzID0gKGNoYXIgKikoJm1jdGxyLT5tYm94X3dlKTsKKwl4YWRkciA9IGlucHV0ICYgMHhmOworCS8qIENoZWNrIGlmIHRoZSBjb250cm9sbGVyL2NhbWVyYSBwYWlyIGhhcyBjaGFuZ2VkLCBlbHNlIGlnbm9yZSAqLworCWlmIChzd19zdGF0dXNbeWFkZHJdICE9IHhhZGRyKQorCXsKKwkJLyogIm9wZW4iIHRoZSBvbGQgc3dpdGNoLCAiY2xvc2UiIHRoZSBuZXcgb25lLCBzYXZlIHRoZSBuZXcgKi8KKwkJa29kaWNvbTQ0MDByX3dyaXRlKG1jdGxyLCBzd19zdGF0dXNbeWFkZHJdLCB5YWRkciwgMCk7CisJCXN3X3N0YXR1c1t5YWRkcl0gPSB4YWRkcjsKKwkJa29kaWNvbTQ0MDByX3dyaXRlKG1jdGxyLCB4YWRkciwgeWFkZHIsIDEpOworCX0KK30KKworLyoKKyAqIER1cmluZyBpbml0aWFsaXNhdGlvbiwgd2UgbmVlZCB0byByZXNldCB0aGUgYW5hbG9nIHN3aXRjaC4gIFdlCisgKiBhbHNvIHByZXNldCB0aGUgc3dpdGNoIHRvIG1hcCB0aGUgNCBjb25uZWN0b3JzIG9uIHRoZSBjYXJkIHRvIHRoZQorICogKnVzZXIncyogKHNlZSBhYm92ZSBkZXNjcmlwdGlvbiBvZiBrb2RpY29tNDQwMHJfbXV4c2VsKSBjaGFubmVscworICogMCB0aHJvdWdoIDMKKyAqLworc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX2luaXQoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwljaGFyICpzd19zdGF0dXMgPSAoY2hhciAqKSgmYnR2LT5tYm94X3dlKTsKKwlpbnQgaXg7CisKKwlncGlvX2lub3V0KDB4MDAwM2ZmLCAweDAwMDNmZik7CisJZ3Bpb193cml0ZSgxIDw8IDkpOwkvKiByZXNldCBNVVggKi8KKwlncGlvX3dyaXRlKDApOworCS8qIFByZXNldCBjYW1lcmEgMCB0byB0aGUgNCBjb250cm9sbGVycyAqLworCWZvciAoaXg9MDsgaXg8NDsgaXgrKykgeworCQlzd19zdGF0dXNbaXhdID0gaXg7CisJCWtvZGljb200NDAwcl93cml0ZShidHYsIGl4LCBpeCwgMSk7CisJfQorCS8qCisJICogU2luY2UgdGhpcyBpcyB0aGUgIm1hc3RlciIsIHdlIG5lZWQgdG8gc2V0IHVwIHRoZQorCSAqIG90aGVyIHRocmVlIGNvbnRyb2xsZXIgY2hpcHMnIHBvaW50ZXJzIHRvIHRoaXMgc3RydWN0dXJlCisJICogZm9yIGxhdGVyIHVzZSBpbiB0aGUgbXV4c2VsIHJvdXRpbmUuCisJICovCisJaWYgKChidHYtPmMubnI8MSkgfHwgKGJ0di0+Yy5ucj5CVFRWX01BWC0zKSkKKwkgICAgcmV0dXJuOworCW1hc3RlcltidHYtPmMubnItMV0gPSBidHY7CisJbWFzdGVyW2J0di0+Yy5ucl0gICA9IGJ0djsKKwltYXN0ZXJbYnR2LT5jLm5yKzFdID0gYnR2OworCW1hc3RlcltidHYtPmMubnIrMl0gPSBidHY7Cit9CisKKy8vIFRoZSBHcmFuZHRlYyBYLUd1YXJkIGZyYW1lZ3JhYmJlciBjYXJkIHVzZXMgdHdvIER1YWwgNC1jaGFubmVsCisvLyB2aWRlbyBtdWx0aXBsZXhlcnMgdG8gcHJvdmlkZSB1cCB0byAxNiB2aWRlbyBpbnB1dHMuIFRoZXNlCisvLyBtdWx0aXBsZXhlcnMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIGxvd2VyIDggR1BJTyBwaW5zIG9mIHRoZQorLy8gYnQ4NzguIFRoZSBtdWx0aXBsZXhlcnMgcHJvYmFibHkgUGVyaWNvbSBQSTVWMzMxUSBvciBzaW1pbGFyLgorCisvLyB4eHgwIGlzIHBpbiB4eHggb2YgbXVsdGlwbGV4ZXIgVTUsCisvLyB5eXkxIGlzIHBpbiB5eXkgb2YgbXVsdGlwbGV4ZXIgVTIKKworI2RlZmluZSBFTkEwICAgIDB4MDEKKyNkZWZpbmUgRU5CMCAgICAweDAyCisjZGVmaW5lIEVOQTEgICAgMHgwNAorI2RlZmluZSBFTkIxICAgIDB4MDgKKworI2RlZmluZSBJTjEwICAgIDB4MTAKKyNkZWZpbmUgSU4wMCAgICAweDIwCisjZGVmaW5lIElOMTEgICAgMHg0MAorI2RlZmluZSBJTjAxICAgIDB4ODAKKworc3RhdGljIHZvaWQgeGd1YXJkX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCit7CisJc3RhdGljIGNvbnN0IGludCBtYXNrc1tdID0geworICAgICAgICAgICAgICAgIEVOQjAsIEVOQjB8SU4wMCwgRU5CMHxJTjEwLCBFTkIwfElOMDB8SU4xMCwKKyAgICAgICAgICAgICAgICBFTkEwLCBFTkEwfElOMDAsIEVOQTB8SU4xMCwgRU5BMHxJTjAwfElOMTAsCisgICAgICAgICAgICAgICAgRU5CMSwgRU5CMXxJTjAxLCBFTkIxfElOMTEsIEVOQjF8SU4wMXxJTjExLAorICAgICAgICAgICAgICAgIEVOQTEsIEVOQTF8SU4wMSwgRU5BMXxJTjExLCBFTkExfElOMDF8SU4xMSwKKwl9OworCWdwaW9fd3JpdGUobWFza3NbaW5wdXQlMTZdKTsKK30KK3N0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9pbml0KHN0cnVjdCBidHR2ICpidHYpCit7CisJLypUaGlzIGlzIHRoZSB2aWRlbyBpbnB1dCByZWRpcmVjdGlvbiBmb25jdGlvbmFsaXR5IDogSSBESUQgTk9UIFVTRUQgSVQuICovCisJYnR3cml0ZSAoMHgwODw8MTYsQlQ4NDhfR1BJT19EQVRBKTsvKkdQSU9bMTldIFs9PT4gNDA1MyBCK0NdIHNldCB0byAxICovCisJYnR3cml0ZSAoMHgwNDw8MTYsQlQ4NDhfR1BJT19EQVRBKTsvKkdQSU9bMThdIFs9PT4gNDA1MyBBXSAgc2V0IHRvIDEqLworfQorc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX211eHNlbCAoc3RydWN0IGJ0dHYqIGJ0diwgdW5zaWduZWQgaW50IGlucHV0KQoreworCisJZHByaW50ayAoS0VSTl9ERUJVRyAiYnR0diVkIDogcGljb2xvX3RldHJhX211eHNlbCA9PiAgaW5wdXQgPSAlZFxuIixidHYtPmMubnIsaW5wdXQpOworCS8qSnVzdCBzZXQgdGhlIHJpZ2h0IHBhdGggaW4gdGhlIGFuYWxvZyBtdWx0aXBsZXhlcnMgOiBjaGFubmVsIDEgLT4gNCA9PT4gQW5hbG9nIE11eCA9PT4gTVVYMCovCisJLypHUElPWzIwXSZHUElPWzIxXSB1c2VkIHRvIGNob29zZSB0aGUgcmlnaHQgaW5wdXQqLworCWJ0d3JpdGUgKGlucHV0PDwyMCxCVDg0OF9HUElPX0RBVEEpOworCit9CisKKy8qCisgKiBpdmMxMjBfbXV4c2VsIFtBZGRlZCBieSBBbGFuIEdhcmZpZWxkIDxhbGFuQGZyb21vcmJpdC5jb20+XQorICoKKyAqIFRoZSBJVkMxMjBHIHNlY3VyaXR5IGNhcmQgaGFzIDQgaTJjIGNvbnRyb2xsZWQgVERBODU0MCBtYXRyaXgKKyAqIHN3aWNoZXJzIHRvIHByb3ZpZGUgMTYgY2hhbm5lbHMgdG8gTVVYMC4gVGhlIFREQTg1NDAncyBoYXZlCisgKiA0IGluZGVwZWRhbnQgb3V0cHV0cyBhbmQgYXMgc3VjaCB0aGUgSVZDMTIwRyBhbHNvIGhhcyB0aGUKKyAqIG9wdGlvbmFsICJNb25pdG9yIE91dCIgYnVzLiBUaGlzIGFsbG93cyB0aGUgY2FyZCB0byBiZSBsb29raW5nCisgKiBhdCBvbmUgaW5wdXQgd2hpbGUgdGhlIG1vbml0b3IgaXMgbG9va2luZyBhdCBhbm90aGVyLgorICoKKyAqIFNpbmNlIEkndmUgY291bGRuJ3QgYmUgYm90aGVyZWQgZmlndXJpbmcgb3V0IGhvdyB0byBhZGQgYW4KKyAqIGluZGVwZW5kYW50IG11eHNlbCBmb3IgdGhlIG1vbml0b3IgYnVzLCBJJ3ZlIGp1c3Qgc2V0IGl0IHRvCisgKiB3aGF0ZXZlciB0aGUgY2FyZCBpcyBsb29raW5nIGF0LgorICoKKyAqICBPVVQwIG9mIHRoZSBUREE4NTQwJ3MgaXMgY29ubmVjdGVkIHRvIE1VWDAgICAgICAgICAoMHgwMykKKyAqICBPVVQxIG9mIHRoZSBUREE4NTQwJ3MgaXMgY29ubmVjdGVkIHRvICJNb25pdG9yIE91dCIgICAgICAgICgweDBDKQorICoKKyAqICBUREE4NTQwX0FMVDMgSU4wLTMgPSBDaGFubmVsIDEzIC0gMTYgICAgICAgKDB4MDMpCisgKiAgVERBODU0MF9BTFQ0IElOMC0zID0gQ2hhbm5lbCAxIC0gNCAgICAgICAgICgweDAzKQorICogIFREQTg1NDBfQUxUNSBJTjAtMyA9IENoYW5uZWwgNSAtIDggICAgICAgICAoMHgwMykKKyAqICBUREE4NTQwX0FMVDYgSU4wLTMgPSBDaGFubmVsIDkgLSAxMiAgICAgICAgICAgICAgICAoMHgwMykKKyAqCisgKi8KKworLyogQWxsIDcgcG9zc2libGUgc3ViLWlkcyBmb3IgdGhlIFREQTg1NDAgTWF0cml4IFN3aXRjaGVyICovCisjZGVmaW5lIEkyQ19UREE4NTQwICAgICAgICAweDkwCisjZGVmaW5lIEkyQ19UREE4NTQwX0FMVDEgICAweDkyCisjZGVmaW5lIEkyQ19UREE4NTQwX0FMVDIgICAweDk0CisjZGVmaW5lIEkyQ19UREE4NTQwX0FMVDMgICAweDk2CisjZGVmaW5lIEkyQ19UREE4NTQwX0FMVDQgICAweDk4CisjZGVmaW5lIEkyQ19UREE4NTQwX0FMVDUgICAweDlhCisjZGVmaW5lIEkyQ19UREE4NTQwX0FMVDYgICAweDljCisKK3N0YXRpYyB2b2lkIGl2YzEyMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQoreworCS8vIFNpbXBsZSBtYXRocworCWludCBrZXkgPSBpbnB1dCAlIDQ7CisJaW50IG1hdHJpeCA9IGlucHV0IC8gNDsKKworCWRwcmludGsoImJ0dHYlZDogaXZjMTIwX211eHNlbDogSW5wdXQgLSAlMDJkIHwgVERBIC0gJTAyZCB8IEluIC0gJTAyZFxuIiwKKwkJYnR2LT5jLm5yLCBpbnB1dCwgbWF0cml4LCBrZXkpOworCisJLy8gSGFuZGxlcyB0aGUgaW5wdXQgc2VsZWN0aW9uIG9uIHRoZSBUREE4NTQwJ3MKKwlidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUMywgMHgwMCwKKwkJICAgICAgKChtYXRyaXggPT0gMykgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOworCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ0LCAweDAwLAorCQkgICAgICAoKG1hdHJpeCA9PSAwKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CisJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDUsIDB4MDAsCisJCSAgICAgICgobWF0cml4ID09IDEpID8gKGtleSB8IGtleSA8PCAyKSA6IDB4MDApLCAxKTsKKwlidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNiwgMHgwMCwKKwkJICAgICAgKChtYXRyaXggPT0gMikgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOworCisJLy8gSGFuZGxlcyB0aGUgb3V0cHV0IGVuYWJsZXMgb24gdGhlIFREQTg1NDAncworCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQzLCAweDAyLAorCQkgICAgICAoKG1hdHJpeCA9PSAzKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyAxMyAtIDE2CisJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDQsIDB4MDIsCisJCSAgICAgICgobWF0cml4ID09IDApID8gMHgwMyA6IDB4MDApLCAxKTsgIC8vIDEtNAorCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ1LCAweDAyLAorCQkgICAgICAoKG1hdHJpeCA9PSAxKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyA1LTgKKwlidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNiwgMHgwMiwKKwkJICAgICAgKChtYXRyaXggPT0gMikgPyAweDAzIDogMHgwMCksIDEpOyAgLy8gOS0xMgorCisJLy8gU2VsZWN0cyBNVVgwIGZvciBpbnB1dCBvbiB0aGUgODc4CisJYnRhb3IoKDApPDw1LCB+KDM8PDUpLCBCVDg0OF9JRk9STSk7Cit9CisKKworLyogUFhDMjAwIG11eHNlbCBoZWxwZXIKKyAqIGx1a2VAc3lzZW5nLmFudS5lZHUuYXUKKyAqIGFub3RoZXIgdHJhbnNwbGFudAorICogZnJvbSBBbGVzc2FuZHJvIFJ1YmluaSAocnViaW5pQGxpbnV4Lml0KQorICoKKyAqIFRoZXJlIGFyZSA0IGtpbmRzIG9mIGNhcmRzOgorICogUFhDMjAwTCB3aGljaCBpcyBidDg0OAorICogUFhDMjAwRiB3aGljaCBpcyBidDg0OCB3aXRoIFBJQyBjb250cm9sbGluZyBtdXgKKyAqIFBYQzIwMEFMIHdoaWNoIGlzIGJ0ODc4CisgKiBQWEMyMDBBRiB3aGljaCBpcyBidDg3OCB3aXRoIFBJQyBjb250cm9sbGluZyBtdXgKKyAqLworI2RlZmluZSBQWF9DRkdfUFhDMjAwRiAweDAxCisjZGVmaW5lIFBYX0ZMQUdfUFhDMjAwQSAgMHgwMDAwMTAwMCAvKiBhIHB4YzIwMEEgaXMgYnQtODc4IGJhc2VkICovCisjZGVmaW5lIFBYX0kyQ19QSUMgICAgICAgMHgwZgorI2RlZmluZSBQWF9QWEMyMDBBX0NBUkRJRCAweDIwMGExMjk1CisjZGVmaW5lIFBYX0kyQ19DTURfQ0ZHICAgMHgwMAorCitzdGF0aWMgdm9pZCBQWEMyMDBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKK3sKKyAgICAgICAgaW50IHJjOworCWxvbmcgbXV4OworCWludCBiaXRtYXNrOworICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKworCS8qIFJlYWQgUElDIGNvbmZpZyB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIFBYQzIwMEYgKi8KKwkvKiBQWF9JMkNfQ01EX0NGRyovCisJYnVmWzBdPTA7CisJYnVmWzFdPTA7CisJcmM9YnR0dl9JMkNXcml0ZShidHYsKFBYX0kyQ19QSUM8PDEpLGJ1ZlswXSxidWZbMV0sMSk7CisJaWYgKHJjKSB7CisJICBwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBQWEMyMDBfbXV4c2VsOiBwaWMgY2ZnIHdyaXRlIGZhaWxlZDolZFxuIiwgYnR2LT5jLm5yLHJjKTsKKwkgIC8qIG5vdCBQWEMgPyBkbyBub3RoaW5nICovCisJICByZXR1cm47CisJfQorCisJcmM9YnR0dl9JMkNSZWFkKGJ0diwoUFhfSTJDX1BJQzw8MSksTlVMTCk7CisJaWYgKCEocmMgJiBQWF9DRkdfUFhDMjAwRikpIHsKKwkgIHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IFBYQzIwMF9tdXhzZWw6IG5vdCBQWEMyMDBGIHJjOiVkIFxuIiwgYnR2LT5jLm5yLHJjKTsKKwkgIHJldHVybjsKKwl9CisKKworCS8qIFRoZSBtdWx0aXBsZXhlciBpbiB0aGUgMjAwRiBpcyBoYW5kbGVkIGJ5IHRoZSBHUElPIHBvcnQgKi8KKwkvKiBnZXQgY29ycmVjdCBtYXBwaW5nIGJldHdlZW4gaW5wdXRzICAqLworCS8qICBtdXggPSBidHR2X3R2Y2FyZHNbYnR2LT50eXBlXS5tdXhzZWxbaW5wdXRdICYgMzsgKi8KKwkvKiAqKiBub3QgbmVlZGVkIT8gICAqLworCW11eCA9IGlucHV0OworCisJLyogbWFrZSBzdXJlIG91dHB1dCBwaW5zIGFyZSBlbmFibGVkICovCisJLyogYml0bWFzaz0weDMwZjsgKi8KKwliaXRtYXNrPTB4MzAyOworCS8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIFBYQzIwMEEgKi8KKyAJaWYgKGJ0di0+Y2FyZGlkID09IFBYX1BYQzIwMEFfQ0FSRElEKSAgeworCSAgIGJpdG1hc2sgXj0gMHgxODA7IC8qIHVzZSA3IGFuZCA5LCBub3QgOCBhbmQgOSAqLworCSAgIGJpdG1hc2sgfD0gNzw8NDsgLyogdGhlIERBQyAqLworCX0KKwlidHdyaXRlKGJpdG1hc2ssIEJUODQ4X0dQSU9fT1VUX0VOKTsKKworCWJpdG1hc2sgPSBidHJlYWQoQlQ4NDhfR1BJT19EQVRBKTsKKyAJaWYgKGJ0di0+Y2FyZGlkID09IFBYX1BYQzIwMEFfQ0FSRElEKQorCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MjgwKSB8ICgobXV4ICYgMikgPDwgOCkgfCAoKG11eCAmIDEpIDw8IDcpOworCWVsc2UgLyogb2xkZXIgZGV2aWNlICovCisJICBiaXRtYXNrID0gKGJpdG1hc2sgJiB+MHgzMDApIHwgKChtdXggJiAzKSA8PCA4KTsKKwlidHdyaXRlKGJpdG1hc2ssQlQ4NDhfR1BJT19EQVRBKTsKKworCS8qCisJICogV2FzICJ0byBiZSBzYWZlLCBzZXQgdGhlIGJ0ODQ4IHRvIGlucHV0IDAiCisJICogQWN0dWFsbHksIHNpbmNlIGl0J3Mgb2sgYXQgbG9hZCB0aW1lLCBiZXR0ZXIgbm90IG1lc3NpbmcKKwkgKiB3aXRoIHRoZXNlIGJpdHMgKG9uIFBYQzIwMEFGIHlvdSBuZWVkIHRvIHNldCBtdXggMiBoZXJlKQorCSAqCisJICogbmVlZGVkIGJlY2F1c2UgYnR0di1kcml2ZXIgc2V0cyBtdXggYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorCSAqLworIAlpZiAoYnR2LT5jYXJkaWQgPT0gUFhfUFhDMjAwQV9DQVJESUQpCisJICBidGFvcigyPDw1LCB+QlQ4NDhfSUZPUk1fTVVYU0VMLCBCVDg0OF9JRk9STSk7CisJZWxzZSAvKiBvbGRlciBkZXZpY2UgKi8KKwkgIGJ0YW5kKH5CVDg0OF9JRk9STV9NVVhTRUwsQlQ4NDhfSUZPUk0pOworCisJcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogc2V0dGluZyBpbnB1dCBjaGFubmVsIHRvOiVkXG4iLCBidHYtPmMubnIsKGludCltdXgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogbW90aGVyYm9hcmQgY2hpcHNldCBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordm9pZCBfX2RldmluaXQgYnR0dl9jaGVja19jaGlwc2V0KHZvaWQpCit7CisJaW50IHBjaXBjaV9mYWlsID0gMDsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKworCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX0ZBSUwpCisJCXBjaXBjaV9mYWlsID0gMTsKKwlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIChQQ0lQQ0lfVFJJVE9OfFBDSVBDSV9OQVRPTUF8UENJUENJX1ZJQUVUQkYpKQorCQl0cml0b24xID0gMTsKKwlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9WU0ZYKQorCQl2c2Z4ID0gMTsKKyNpZmRlZiBQQ0lQQ0lfQUxJTUFHSUsKKwlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9BTElNQUdJSykKKwkJbGF0ZW5jeSA9IDB4MEE7CisjZW5kaWYKKworI2lmIDAKKwkvKiBwcmludCB3aGljaCBjaGlwc2V0IHdlIGhhdmUgKi8KKwl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2NsYXNzKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4LGRldikpKQorCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBpcyAlc1xuIixwY2lfbmFtZShkZXYpKTsKKyNlbmRpZgorCisJLyogcHJpbnQgd2FybmluZ3MgYWJvdXQgYW55IHF1aXJrcyBmb3VuZCAqLworCWlmICh0cml0b24xKQorCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBuZWVkcyBFVEJGIGVuYWJsZWQuXG4iKTsKKwlpZiAodnNmeCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2UgbmVlZHMgVlNGWCBlbmFibGVkLlxuIik7CisJaWYgKHBjaXBjaV9mYWlsKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHY6IEJUODQ4IGFuZCB5b3VyIGNoaXBzZXQgbWF5IG5vdCB3b3JrIHRvZ2V0aGVyLlxuIik7CisJCWlmIChVTlNFVCA9PSBub19vdmVybGF5KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2OiBnb2luZyB0byBkaXNhYmxlIG92ZXJsYXkuXG4iKTsKKwkJCW5vX292ZXJsYXkgPSAxOworCQl9CisJfQorCWlmIChVTlNFVCAhPSBsYXRlbmN5KQorCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBwY2kgbGF0ZW5jeSBmaXh1cCBbJWRdXG4iLGxhdGVuY3kpOworCisJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQxLCBkZXYpKSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYjsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDUzLCAmYik7CisJCWlmIChidHR2X2RlYnVnKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2U6IDgyNDQxRlggTmF0b21hLCAiCisJCQkgICAgICAgImJ1ZmNvbj0weCUwMnhcbiIsYik7CisJfQorfQorCitpbnQgX19kZXZpbml0IGJ0dHZfaGFuZGxlX2NoaXBzZXQoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKyAJdW5zaWduZWQgY2hhciBjb21tYW5kOworCisJaWYgKCF0cml0b24xICYmICF2c2Z4ICYmIFVOU0VUID09IGxhdGVuY3kpCisJCXJldHVybiAwOworCisJaWYgKGJ0dHZfdmVyYm9zZSkgeworCQlpZiAodHJpdG9uMSkKKwkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZW5hYmxpbmcgRVRCRiAoNDMwRlgvVlAzIGNvbXBhdGliaWx0eSlcbiIsYnR2LT5jLm5yKTsKKwkJaWYgKHZzZnggJiYgYnR2LT5pZCA+PSA4NzgpCisJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIFZTRlhcbiIsYnR2LT5jLm5yKTsKKwkJaWYgKFVOU0VUICE9IGxhdGVuY3kpCisJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHNldHRpbmcgcGNpIHRpbWVyIHRvICVkXG4iLAorCQkJICAgICAgIGJ0di0+Yy5ucixsYXRlbmN5KTsKKwl9CisKKwlpZiAoYnR2LT5pZCA8IDg3OCkgeworCQkvKiBidDg0OCAobWlzKXVzZXMgYSBiaXQgaW4gdGhlIGlycSBtYXNrIGZvciBldGJmICovCisJCWlmICh0cml0b24xKQorCQkJYnR2LT50cml0b24xID0gQlQ4NDhfSU5UX0VUQkY7CisJfSBlbHNlIHsKKwkJLyogYnQ4NzggaGFzIGEgYml0IGluIHRoZSBwY2kgY29uZmlnIHNwYWNlIGZvciBpdCAqLworICAgICAgICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGJ0di0+Yy5wY2ksIEJUODc4X0RFVkNUUkwsICZjb21tYW5kKTsKKwkJaWYgKHRyaXRvbjEpCisJCQljb21tYW5kIHw9IEJUODc4X0VOX1RCRlg7CisJCWlmICh2c2Z4KQorCQkJY29tbWFuZCB8PSBCVDg3OF9FTl9WU0ZYOworICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShidHYtPmMucGNpLCBCVDg3OF9ERVZDVFJMLCBjb21tYW5kKTsKKyAgICAgICAgfQorCWlmIChVTlNFVCAhPSBsYXRlbmN5KQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnR2LT5jLnBjaSwgUENJX0xBVEVOQ1lfVElNRVIsIGxhdGVuY3kpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzZjIyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1kcml2ZXIuYwpAQCAtMCwwICsxLDQxMTYgQEAKKy8qCisgICAgJElkOiBidHR2LWRyaXZlci5jLHYgMS4zNyAyMDA1LzAyLzIxIDEzOjU3OjU5IGtyYXhlbCBFeHAgJAorCisgICAgYnR0diAtIEJ0ODQ4IGZyYW1lIGdyYWJiZXIgZHJpdmVyCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgPHJqa21AdGhwLnVuaS1rb2Vsbi5kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYgTWFyY3VzIE1ldHpsZXIgPG1vY21AdGhwLnVuaS1rb2Vsbi5kZT4KKyAgICAoYykgMTk5OS0yMDAyIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4KKworICAgIHNvbWUgdjRsMiBjb2RlIGxpbmVzIGFyZSB0YWtlbiBmcm9tIEp1c3RpbidzIGJ0dHYyIGRyaXZlciB3aGljaCBpcworICAgIChjKSAyMDAwIEp1c3RpbiBTY2hvZW1hbiA8anVzdGluQHN1bnRpZ2VyLmVlLnVwLmFjLnphPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgImJ0dHZwLmgiCisKK3Vuc2lnbmVkIGludCBidHR2X251bTsJCQkvKiBudW1iZXIgb2YgQnQ4NDhzIGluIHVzZSAqLworc3RydWN0IGJ0dHYgYnR0dnNbQlRUVl9NQVhdOworCit1bnNpZ25lZCBpbnQgYnR0dl9kZWJ1ZyA9IDA7Cit1bnNpZ25lZCBpbnQgYnR0dl92ZXJib3NlID0gMTsKK3Vuc2lnbmVkIGludCBidHR2X2dwaW8gPSAwOworCisvKiBjb25maWcgdmFyaWFibGVzICovCisjaWZkZWYgX19CSUdfRU5ESUFOCitzdGF0aWMgdW5zaWduZWQgaW50IGJpZ2VuZGlhbj0xOworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmlnZW5kaWFuPTA7CisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmFkaW9bQlRUVl9NQVhdOworc3RhdGljIHVuc2lnbmVkIGludCBpcnFfZGVidWcgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBnYnVmZmVycyA9IDg7CitzdGF0aWMgdW5zaWduZWQgaW50IGdidWZzaXplID0gMHgyMDgwMDA7CisKK3N0YXRpYyBpbnQgdmlkZW9fbnIgPSAtMTsKK3N0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKK3N0YXRpYyBpbnQgdmJpX25yID0gLTE7CitzdGF0aWMgaW50IGRlYnVnX2xhdGVuY3kgPSAwOworCitzdGF0aWMgdW5zaWduZWQgaW50IGZkc3IgPSAwOworCisvKiBvcHRpb25zICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNvbWJmaWx0ZXIgID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbHVtYWZpbHRlciAgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbXV0ZSAgICA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IGNocm9tYV9hZ2MgID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWRjX2NydXNoICAgPSAxOworc3RhdGljIHVuc2lnbmVkIGludCB3aGl0ZWNydXNoX3VwcGVyID0gMHhDRjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2hpdGVjcnVzaF9sb3dlciA9IDB4N0Y7CitzdGF0aWMgdW5zaWduZWQgaW50IHZjcl9oYWNrICAgID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2lzd2l0Y2ggPSAwOworCisvKiBBUEkgZmVhdHVyZXMgKHR1cm4gb24vb2ZmIHN0dWZmIGZvciB0ZXN0aW5nKSAqLworc3RhdGljIHVuc2lnbmVkIGludCB2NGwyICAgICAgICA9IDE7CisKKworLyogaW5zbW9kIGFyZ3MgKi8KK21vZHVsZV9wYXJhbShidHR2X3ZlcmJvc2UsICAgICAgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShidHR2X2dwaW8sICAgICAgICAgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShidHR2X2RlYnVnLCAgICAgICAgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShpcnFfZGVidWcsICAgICAgICAgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShkZWJ1Z19sYXRlbmN5LCAgICAgaW50LCAwNjQ0KTsKKworbW9kdWxlX3BhcmFtKGZkc3IsICAgICAgICAgICAgICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHZpZGVvX25yLCAgICAgICAgICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHJhZGlvX25yLCAgICAgICAgICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHZiaV9uciwgICAgICAgICAgICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGdidWZmZXJzLCAgICAgICAgICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGdidWZzaXplLCAgICAgICAgICBpbnQsIDA0NDQpOworCittb2R1bGVfcGFyYW0odjRsMiwgICAgICAgICAgICAgIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oYmlnZW5kaWFuLCAgICAgICAgIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oaXJxX2lzd2l0Y2gsICAgICAgIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oY29tYmZpbHRlciwgICAgICAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0obHVtYWZpbHRlciwgICAgICAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oYXV0b211dGUsICAgICAgICAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oY2hyb21hX2FnYywgICAgICAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oYWRjX2NydXNoLCAgICAgICAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0od2hpdGVjcnVzaF91cHBlciwgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0od2hpdGVjcnVzaF9sb3dlciwgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0odmNyX2hhY2ssICAgICAgICAgIGludCwgMDQ0NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShyYWRpbywgaW50LCBOVUxMLCAwNDQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhyYWRpbywiVGhlIFRWIGNhcmQgc3VwcG9ydHMgcmFkaW8sIGRlZmF1bHQgaXMgMCAobm8pIik7CitNT0RVTEVfUEFSTV9ERVNDKGJpZ2VuZGlhbiwiYnl0ZSBvcmRlciBvZiB0aGUgZnJhbWVidWZmZXIsIGRlZmF1bHQgaXMgbmF0aXZlIGVuZGlhbiIpOworTU9EVUxFX1BBUk1fREVTQyhidHR2X3ZlcmJvc2UsInZlcmJvc2Ugc3RhcnR1cCBtZXNzYWdlcywgZGVmYXVsdCBpcyAxICh5ZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGJ0dHZfZ3BpbywibG9nIGdwaW8gY2hhbmdlcywgZGVmYXVsdCBpcyAwIChubykiKTsKK01PRFVMRV9QQVJNX0RFU0MoYnR0dl9kZWJ1ZywiZGVidWcgbWVzc2FnZXMsIGRlZmF1bHQgaXMgMCAobm8pIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycV9kZWJ1ZywiaXJxIGhhbmRsZXIgZGVidWcgbWVzc2FnZXMsIGRlZmF1bHQgaXMgMCAobm8pIik7CitNT0RVTEVfUEFSTV9ERVNDKGdidWZmZXJzLCJudW1iZXIgb2YgY2FwdHVyZSBidWZmZXJzLiByYW5nZSAyLTMyLCBkZWZhdWx0IDgiKTsKK01PRFVMRV9QQVJNX0RFU0MoZ2J1ZnNpemUsInNpemUgb2YgdGhlIGNhcHR1cmUgYnVmZmVycywgZGVmYXVsdCBpcyAweDIwODAwMCIpOworTU9EVUxFX1BBUk1fREVTQyhhdXRvbXV0ZSwibXV0ZSBhdWRpbyBvbiBiYWQvbWlzc2luZyB2aWRlbyBzaWduYWwsIGRlZmF1bHQgaXMgMSAoeWVzKSIpOworTU9EVUxFX1BBUk1fREVTQyhjaHJvbWFfYWdjLCJlbmFibGVzIHRoZSBBR0Mgb2YgY2hyb21hIHNpZ25hbCwgZGVmYXVsdCBpcyAwIChubykiKTsKK01PRFVMRV9QQVJNX0RFU0MoYWRjX2NydXNoLCJlbmFibGVzIHRoZSBsdW1pbmFuY2UgQURDIGNydXNoLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKK01PRFVMRV9QQVJNX0RFU0Mod2hpdGVjcnVzaF91cHBlciwic2V0cyB0aGUgd2hpdGUgY3J1c2ggdXBwZXIgdmFsdWUsIGRlZmF1bHQgaXMgMjA3Iik7CitNT0RVTEVfUEFSTV9ERVNDKHdoaXRlY3J1c2hfbG93ZXIsInNldHMgdGhlIHdoaXRlIGNydXNoIGxvd2VyIHZhbHVlLCBkZWZhdWx0IGlzIDEyNyIpOworTU9EVUxFX1BBUk1fREVTQyh2Y3JfaGFjaywiZW5hYmxlcyB0aGUgVkNSIGhhY2sgKGltcHJvdmVzIHN5bmNoIG9uIHBvb3IgVkNSIHRhcGVzKSwgZGVmYXVsdCBpcyAwIChubykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxX2lzd2l0Y2gsInN3aXRjaCBpbnB1dHMgaW4gaXJxIGhhbmRsZXIiKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJidHR2IC0gdjRsL3Y0bDIgZHJpdmVyIG1vZHVsZSBmb3IgYnQ4NDgvODc4IGJhc2VkIGNhcmRzIik7CitNT0RVTEVfQVVUSE9SKCJSYWxwaCBNZXR6bGVyICYgTWFyY3VzIE1ldHpsZXIgJiBHZXJkIEtub3JyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBzeXNmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgc3NpemVfdCBzaG93X2NhcmQoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSB0b192aWRlb19kZXZpY2UoY2QpOworCXN0cnVjdCBidHR2ICpidHYgPSBkZXZfZ2V0X2RydmRhdGEodmZkLT5kZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBidHYgPyBidHYtPmMudHlwZSA6IFVOU0VUKTsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihjYXJkLCBTX0lSVUdPLCBzaG93X2NhcmQsIE5VTEwpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc3RhdGljIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogc3BlY2lhbCB0aW1pbmcgdGFibGVzIGZyb20gY29uZXhhbnQuLi4gKi8KK3N0YXRpYyB1OCBTUkFNX1RhYmxlW11bNjBdID0KK3sKKwkvKiBQQUwgZGlnaXRhbCBpbnB1dCBvdmVyIEdQSU9bNzowXSAqLworCXsKKwkJNDUsIC8vIDQ1IGJ5dGVzIGZvbGxvd2luZworCQkweDM2LDB4MTEsMHgwMSwweDAwLDB4OTAsMHgwMiwweDA1LDB4MTAsMHgwNCwweDE2LAorCQkweDEyLDB4MDUsMHgxMSwweDAwLDB4MDQsMHgxMiwweEMwLDB4MDAsMHgzMSwweDAwLAorCQkweDA2LDB4NTEsMHgwOCwweDAzLDB4ODksMHgwOCwweDA3LDB4QzAsMHg0NCwweDAwLAorCQkweDgxLDB4MDEsMHgwMSwweEE5LDB4MEQsMHgwMiwweDAyLDB4NTAsMHgwMywweDM3LAorCQkweDM3LDB4MDAsMHhBRiwweDIxLDB4MDAKKwl9LAorCS8qIE5UU0MgZGlnaXRhbCBpbnB1dCBvdmVyIEdQSU9bNzowXSAqLworCXsKKwkJNTEsIC8vIDUxIGJ5dGVzIGZvbGxvd2luZworCQkweDBDLDB4QzAsMHgwMCwweDAwLDB4OTAsMHgwMiwweDAzLDB4MTAsMHgwMywweDA2LAorCQkweDEwLDB4MDQsMHgxMiwweDEyLDB4MDUsMHgwMiwweDEzLDB4MDQsMHgxOSwweDAwLAorCQkweDA0LDB4MzksMHgwMCwweDA2LDB4NTksMHgwOCwweDAzLDB4ODMsMHgwOCwweDA3LAorCQkweDAzLDB4NTAsMHgwMCwweEMwLDB4NDAsMHgwMCwweDg2LDB4MDEsMHgwMSwweEE2LAorCQkweDBELDB4MDIsMHgwMywweDExLDB4MDEsMHgwNSwweDM3LDB4MDAsMHhBQywweDIxLAorCQkweDAwLAorCX0sCisJLy8gVEdCX05UU0MzOTIgLy8gcXVhcnR6c2lnaHQKKwkvLyBUaGlzIHRhYmxlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGJlIHVzZWQgZm9yIEZ1c2lvbiBSZXYgRAorCXsKKwkJMHgyQSwgLy8gc2l6ZSBvZiB0YWJsZSA9IDQyCisJCTB4MDYsIDB4MDgsIDB4MDQsIDB4MGEsIDB4YzAsIDB4MDAsIDB4MTgsIDB4MDgsIDB4MDMsIDB4MjQsCisJCTB4MDgsIDB4MDcsIDB4MDIsIDB4OTAsIDB4MDIsIDB4MDgsIDB4MTAsIDB4MDQsIDB4MGMsIDB4MTAsCisJCTB4MDUsIDB4MmMsIDB4MTEsIDB4MDQsIDB4NTUsIDB4NDgsIDB4MDAsIDB4MDUsIDB4NTAsIDB4MDAsCisJCTB4YmYsIDB4MGMsIDB4MDIsIDB4MmYsIDB4M2QsIDB4MDAsIDB4MmYsIDB4M2YsIDB4MDAsIDB4YzMsCisJCTB4MjAsIDB4MDAKKwl9Cit9OworCitjb25zdCBzdHJ1Y3QgYnR0dl90dm5vcm0gYnR0dl90dm5vcm1zW10gPSB7CisJLyogUEFMLUJER0hJICovCisgICAgICAgIC8qIG1heC4gYWN0aXZlIHZpZGVvIGlzIGFjdHVhbGx5IDkyMiwgYnV0IDkyNCBpcyBkaXZpc2libGUgYnkgNCBhbmQgMyEgKi8KKyAJLyogYWN0dWFsbHksIG1heCBhY3RpdmUgUEFMIHdpdGggSFNDQUxFPTAgaXMgOTQ4LCBOVFNDIGlzIDc2OCAtIG5pbCAqLworCXsKKwkJLnY0bDJfaWQgICAgICAgID0gVjRMMl9TVERfUEFMLAorCQkubmFtZSAgICAgICAgICAgPSAiUEFMIiwKKwkJLkZzYyAgICAgICAgICAgID0gMzU0Njg5NTAsCisJCS5zd2lkdGggICAgICAgICA9IDkyNCwKKwkJLnNoZWlnaHQgICAgICAgID0gNTc2LAorCQkudG90YWx3aWR0aCAgICAgPSAxMTM1LAorCQkuYWRlbGF5ICAgICAgICAgPSAweDdmLAorCQkuYmRlbGF5ICAgICAgICAgPSAweDcyLAorCQkuaWZvcm0gICAgICAgICAgPSAoQlQ4NDhfSUZPUk1fUEFMX0JER0hJfEJUODQ4X0lGT1JNX1hUMSksCisJCS5zY2FsZWR0d2lkdGggICA9IDExMzUsCisJCS5oZGVsYXl4MSAgICAgICA9IDE4NiwKKwkJLmhhY3RpdmV4MSAgICAgID0gOTI0LAorCQkudmRlbGF5ICAgICAgICAgPSAweDIwLAorCQkudmJpcGFjayAgICAgICAgPSAyNTUsCisJCS5zcmFtICAgICAgICAgICA9IDAsCisJfSx7CisJCS52NGwyX2lkICAgICAgICA9IFY0TDJfU1REX05UU0NfTSwKKwkJLm5hbWUgICAgICAgICAgID0gIk5UU0MiLAorCQkuRnNjICAgICAgICAgICAgPSAyODYzNjM2MywKKwkJLnN3aWR0aCAgICAgICAgID0gNzY4LAorCQkuc2hlaWdodCAgICAgICAgPSA0ODAsCisJCS50b3RhbHdpZHRoICAgICA9IDkxMCwKKwkJLmFkZWxheSAgICAgICAgID0gMHg2OCwKKwkJLmJkZWxheSAgICAgICAgID0gMHg1ZCwKKwkJLmlmb3JtICAgICAgICAgID0gKEJUODQ4X0lGT1JNX05UU0N8QlQ4NDhfSUZPUk1fWFQwKSwKKwkJLnNjYWxlZHR3aWR0aCAgID0gOTEwLAorCQkuaGRlbGF5eDEgICAgICAgPSAxMjgsCisJCS5oYWN0aXZleDEgICAgICA9IDkxMCwKKwkJLnZkZWxheSAgICAgICAgID0gMHgxYSwKKwkJLnZiaXBhY2sgICAgICAgID0gMTQ0LAorCQkuc3JhbSAgICAgICAgICAgPSAxLAorCX0seworCQkudjRsMl9pZCAgICAgICAgPSBWNEwyX1NURF9TRUNBTSwKKwkJLm5hbWUgICAgICAgICAgID0gIlNFQ0FNIiwKKwkJLkZzYyAgICAgICAgICAgID0gMzU0Njg5NTAsCisJCS5zd2lkdGggICAgICAgICA9IDkyNCwKKwkJLnNoZWlnaHQgICAgICAgID0gNTc2LAorCQkudG90YWx3aWR0aCAgICAgPSAxMTM1LAorCQkuYWRlbGF5ICAgICAgICAgPSAweDdmLAorCQkuYmRlbGF5ICAgICAgICAgPSAweGIwLAorCQkuaWZvcm0gICAgICAgICAgPSAoQlQ4NDhfSUZPUk1fU0VDQU18QlQ4NDhfSUZPUk1fWFQxKSwKKwkJLnNjYWxlZHR3aWR0aCAgID0gMTEzNSwKKwkJLmhkZWxheXgxICAgICAgID0gMTg2LAorCQkuaGFjdGl2ZXgxICAgICAgPSA5MjIsCisJCS52ZGVsYXkgICAgICAgICA9IDB4MjAsCisJCS52YmlwYWNrICAgICAgICA9IDI1NSwKKwkJLnNyYW0gICAgICAgICAgID0gMCwgLyogbGlrZSBQQUwsIGNvcnJlY3Q/ICovCisJfSx7CisJCS52NGwyX2lkICAgICAgICA9IFY0TDJfU1REX1BBTF9OYywKKwkJLm5hbWUgICAgICAgICAgID0gIlBBTC1OYyIsCisJCS5Gc2MgICAgICAgICAgICA9IDI4NjM2MzYzLAorCQkuc3dpZHRoICAgICAgICAgPSA2NDAsCisJCS5zaGVpZ2h0ICAgICAgICA9IDU3NiwKKwkJLnRvdGFsd2lkdGggICAgID0gOTEwLAorCQkuYWRlbGF5ICAgICAgICAgPSAweDY4LAorCQkuYmRlbGF5ICAgICAgICAgPSAweDVkLAorCQkuaWZvcm0gICAgICAgICAgPSAoQlQ4NDhfSUZPUk1fUEFMX05DfEJUODQ4X0lGT1JNX1hUMCksCisJCS5zY2FsZWR0d2lkdGggICA9IDc4MCwKKwkJLmhkZWxheXgxICAgICAgID0gMTMwLAorCQkuaGFjdGl2ZXgxICAgICAgPSA3MzQsCisJCS52ZGVsYXkgICAgICAgICA9IDB4MWEsCisJCS52YmlwYWNrICAgICAgICA9IDE0NCwKKwkJLnNyYW0gICAgICAgICAgID0gLTEsCisJfSx7CisJCS52NGwyX2lkICAgICAgICA9IFY0TDJfU1REX1BBTF9NLAorCQkubmFtZSAgICAgICAgICAgPSAiUEFMLU0iLAorCQkuRnNjICAgICAgICAgICAgPSAyODYzNjM2MywKKwkJLnN3aWR0aCAgICAgICAgID0gNjQwLAorCQkuc2hlaWdodCAgICAgICAgPSA0ODAsCisJCS50b3RhbHdpZHRoICAgICA9IDkxMCwKKwkJLmFkZWxheSAgICAgICAgID0gMHg2OCwKKwkJLmJkZWxheSAgICAgICAgID0gMHg1ZCwKKwkJLmlmb3JtICAgICAgICAgID0gKEJUODQ4X0lGT1JNX1BBTF9NfEJUODQ4X0lGT1JNX1hUMCksCisJCS5zY2FsZWR0d2lkdGggICA9IDc4MCwKKwkJLmhkZWxheXgxICAgICAgID0gMTM1LAorCQkuaGFjdGl2ZXgxICAgICAgPSA3NTQsCisJCS52ZGVsYXkgICAgICAgICA9IDB4MWEsCisJCS52YmlwYWNrICAgICAgICA9IDE0NCwKKwkJLnNyYW0gICAgICAgICAgID0gLTEsCisJfSx7CisJCS52NGwyX2lkICAgICAgICA9IFY0TDJfU1REX1BBTF9OLAorCQkubmFtZSAgICAgICAgICAgPSAiUEFMLU4iLAorCQkuRnNjICAgICAgICAgICAgPSAzNTQ2ODk1MCwKKwkJLnN3aWR0aCAgICAgICAgID0gNzY4LAorCQkuc2hlaWdodCAgICAgICAgPSA1NzYsCisJCS50b3RhbHdpZHRoICAgICA9IDExMzUsCisJCS5hZGVsYXkgICAgICAgICA9IDB4N2YsCisJCS5iZGVsYXkgICAgICAgICA9IDB4NzIsCisJCS5pZm9ybSAgICAgICAgICA9IChCVDg0OF9JRk9STV9QQUxfTnxCVDg0OF9JRk9STV9YVDEpLAorCQkuc2NhbGVkdHdpZHRoICAgPSA5NDQsCisJCS5oZGVsYXl4MSAgICAgICA9IDE4NiwKKwkJLmhhY3RpdmV4MSAgICAgID0gOTIyLAorCQkudmRlbGF5ICAgICAgICAgPSAweDIwLAorCQkudmJpcGFjayAgICAgICAgPSAxNDQsCisJCS5zcmFtICAgICAgICAgICA9IC0xLAorCX0seworCQkudjRsMl9pZCAgICAgICAgPSBWNEwyX1NURF9OVFNDX01fSlAsCisJCS5uYW1lICAgICAgICAgICA9ICJOVFNDLUpQIiwKKwkJLkZzYyAgICAgICAgICAgID0gMjg2MzYzNjMsCisJCS5zd2lkdGggICAgICAgICA9IDY0MCwKKwkJLnNoZWlnaHQgICAgICAgID0gNDgwLAorCQkudG90YWx3aWR0aCAgICAgPSA5MTAsCisJCS5hZGVsYXkgICAgICAgICA9IDB4NjgsCisJCS5iZGVsYXkgICAgICAgICA9IDB4NWQsCisJCS5pZm9ybSAgICAgICAgICA9IChCVDg0OF9JRk9STV9OVFNDX0p8QlQ4NDhfSUZPUk1fWFQwKSwKKwkJLnNjYWxlZHR3aWR0aCAgID0gNzgwLAorCQkuaGRlbGF5eDEgICAgICAgPSAxMzUsCisJCS5oYWN0aXZleDEgICAgICA9IDc1NCwKKwkJLnZkZWxheSAgICAgICAgID0gMHgxNiwKKwkJLnZiaXBhY2sgICAgICAgID0gMTQ0LAorCQkuc3JhbSAgICAgICAgICAgPSAtMSwKKwl9LHsKKwkJLyogdGhhdCBvbmUgaG9wZWZ1bGx5IHdvcmtzIHdpdGggdGhlIHN0cmFuZ2UgdGltaW5nCisJCSAqIHdoaWNoIHZpZGVvIHJlY29yZGVycyBwcm9kdWNlIHdoZW4gcGxheWluZyBhIE5UU0MKKwkJICogdGFwZSBvbiBhIFBBTCBUViAuLi4gKi8KKwkJLnY0bDJfaWQgICAgICAgID0gVjRMMl9TVERfUEFMXzYwLAorCQkubmFtZSAgICAgICAgICAgPSAiUEFMLTYwIiwKKwkJLkZzYyAgICAgICAgICAgID0gMzU0Njg5NTAsCisJCS5zd2lkdGggICAgICAgICA9IDkyNCwKKwkJLnNoZWlnaHQgICAgICAgID0gNDgwLAorCQkudG90YWx3aWR0aCAgICAgPSAxMTM1LAorCQkuYWRlbGF5ICAgICAgICAgPSAweDdmLAorCQkuYmRlbGF5ICAgICAgICAgPSAweDcyLAorCQkuaWZvcm0gICAgICAgICAgPSAoQlQ4NDhfSUZPUk1fUEFMX0JER0hJfEJUODQ4X0lGT1JNX1hUMSksCisJCS5zY2FsZWR0d2lkdGggICA9IDExMzUsCisJCS5oZGVsYXl4MSAgICAgICA9IDE4NiwKKwkJLmhhY3RpdmV4MSAgICAgID0gOTI0LAorCQkudmRlbGF5ICAgICAgICAgPSAweDFhLAorCQkudmJpcGFjayAgICAgICAgPSAyNTUsCisJCS52dG90YWwgICAgICAgICA9IDUyNCwKKwkJLnNyYW0gICAgICAgICAgID0gLTEsCisJfQorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgQlRUVl9UVk5PUk1TID0gQVJSQVlfU0laRShidHR2X3R2bm9ybXMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogYnR0diBmb3JtYXQgbGlzdAorICAgcGFja2VkIHBpeGVsIGZvcm1hdHMgbXVzdCBjb21lIGZpcnN0ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0dHZfZm9ybWF0IGJ0dHZfZm9ybWF0c1tdID0geworCXsKKwkJLm5hbWUgICAgID0gIjggYnBwLCBncmF5IiwKKwkJLnBhbGV0dGUgID0gVklERU9fUEFMRVRURV9HUkVZLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfR1JFWSwKKwkJLmJ0Zm9ybWF0ID0gQlQ4NDhfQ09MT1JfRk1UX1k4LAorCQkuZGVwdGggICAgPSA4LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0seworCQkubmFtZSAgICAgPSAiOCBicHAsIGRpdGhlcmVkIGNvbG9yIiwKKwkJLnBhbGV0dGUgID0gVklERU9fUEFMRVRURV9ISTI0MCwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX0hJMjQwLAorCQkuYnRmb3JtYXQgPSBCVDg0OF9DT0xPUl9GTVRfUkdCOCwKKwkJLmRlcHRoICAgID0gOCwKKwkJLmZsYWdzICAgID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCB8IEZPUk1BVF9GTEFHU19ESVRIRVIsCisJfSx7CisJCS5uYW1lICAgICA9ICIxNSBicHAgUkdCLCBsZSIsCisJCS5wYWxldHRlICA9IFZJREVPX1BBTEVUVEVfUkdCNTU1LAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfUkdCNTU1LAorCQkuYnRmb3JtYXQgPSBCVDg0OF9DT0xPUl9GTVRfUkdCMTUsCisJCS5kZXB0aCAgICA9IDE2LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0seworCQkubmFtZSAgICAgPSAiMTUgYnBwIFJHQiwgYmUiLAorCQkucGFsZXR0ZSAgPSAtMSwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1JHQjU1NVgsCisJCS5idGZvcm1hdCA9IEJUODQ4X0NPTE9SX0ZNVF9SR0IxNSwKKwkJLmJ0c3dhcCAgID0gMHgwMywgLyogYnl0ZXN3YXAgKi8KKwkJLmRlcHRoICAgID0gMTYsCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSx7CisJCS5uYW1lICAgICA9ICIxNiBicHAgUkdCLCBsZSIsCisJCS5wYWxldHRlICA9IFZJREVPX1BBTEVUVEVfUkdCNTY1LAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfUkdCNTY1LAorCQkuYnRmb3JtYXQgPSBCVDg0OF9DT0xPUl9GTVRfUkdCMTYsCisJCS5kZXB0aCAgICA9IDE2LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0seworCQkubmFtZSAgICAgPSAiMTYgYnBwIFJHQiwgYmUiLAorCQkucGFsZXR0ZSAgPSAtMSwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1JHQjU2NVgsCisJCS5idGZvcm1hdCA9IEJUODQ4X0NPTE9SX0ZNVF9SR0IxNiwKKwkJLmJ0c3dhcCAgID0gMHgwMywgLyogYnl0ZXN3YXAgKi8KKwkJLmRlcHRoICAgID0gMTYsCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSx7CisJCS5uYW1lICAgICA9ICIyNCBicHAgUkdCLCBsZSIsCisJCS5wYWxldHRlICA9IFZJREVPX1BBTEVUVEVfUkdCMjQsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9CR1IyNCwKKwkJLmJ0Zm9ybWF0ID0gQlQ4NDhfQ09MT1JfRk1UX1JHQjI0LAorCQkuZGVwdGggICAgPSAyNCwKKwkJLmZsYWdzICAgID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKKwl9LHsKKwkJLm5hbWUgICAgID0gIjMyIGJwcCBSR0IsIGxlIiwKKwkJLnBhbGV0dGUgID0gVklERU9fUEFMRVRURV9SR0IzMiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX0JHUjMyLAorCQkuYnRmb3JtYXQgPSBCVDg0OF9DT0xPUl9GTVRfUkdCMzIsCisJCS5kZXB0aCAgICA9IDMyLAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0seworCQkubmFtZSAgICAgPSAiMzIgYnBwIFJHQiwgYmUiLAorCQkucGFsZXR0ZSAgPSAtMSwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1JHQjMyLAorCQkuYnRmb3JtYXQgPSBCVDg0OF9DT0xPUl9GTVRfUkdCMzIsCisJCS5idHN3YXAgICA9IDB4MGYsIC8qIGJ5dGUrd29yZCBzd2FwICovCisJCS5kZXB0aCAgICA9IDMyLAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0seworCQkubmFtZSAgICAgPSAiNDoyOjIsIHBhY2tlZCwgWVVZViIsCisJCS5wYWxldHRlICA9IFZJREVPX1BBTEVUVEVfWVVWNDIyLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfWVVZViwKKwkJLmJ0Zm9ybWF0ID0gQlQ4NDhfQ09MT1JfRk1UX1lVWTIsCisJCS5kZXB0aCAgICA9IDE2LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0seworCQkubmFtZSAgICAgPSAiNDoyOjIsIHBhY2tlZCwgWVVZViIsCisJCS5wYWxldHRlICA9IFZJREVPX1BBTEVUVEVfWVVZViwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1lVWVYsCisJCS5idGZvcm1hdCA9IEJUODQ4X0NPTE9SX0ZNVF9ZVVkyLAorCQkuZGVwdGggICAgPSAxNiwKKwkJLmZsYWdzICAgID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKKwl9LHsKKwkJLm5hbWUgICAgID0gIjQ6MjoyLCBwYWNrZWQsIFVZVlkiLAorCQkucGFsZXR0ZSAgPSBWSURFT19QQUxFVFRFX1VZVlksCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9VWVZZLAorCQkuYnRmb3JtYXQgPSBCVDg0OF9DT0xPUl9GTVRfWVVZMiwKKwkJLmJ0c3dhcCAgID0gMHgwMywgLyogYnl0ZXN3YXAgKi8KKwkJLmRlcHRoICAgID0gMTYsCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSx7CisJCS5uYW1lICAgICA9ICI0OjI6MiwgcGxhbmFyLCBZLUNiLUNyIiwKKwkJLnBhbGV0dGUgID0gVklERU9fUEFMRVRURV9ZVVY0MjJQLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfWVVWNDIyUCwKKwkJLmJ0Zm9ybWF0ID0gQlQ4NDhfQ09MT1JfRk1UX1lDckNiNDIyLAorCQkuZGVwdGggICAgPSAxNiwKKwkJLmZsYWdzICAgID0gRk9STUFUX0ZMQUdTX1BMQU5BUiwKKwkJLmhzaGlmdCAgID0gMSwKKwkJLnZzaGlmdCAgID0gMCwKKwl9LHsKKwkJLm5hbWUgICAgID0gIjQ6MjowLCBwbGFuYXIsIFktQ2ItQ3IiLAorCQkucGFsZXR0ZSAgPSBWSURFT19QQUxFVFRFX1lVVjQyMFAsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9ZVVY0MjAsCisJCS5idGZvcm1hdCA9IEJUODQ4X0NPTE9SX0ZNVF9ZQ3JDYjQyMiwKKwkJLmRlcHRoICAgID0gMTIsCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19QTEFOQVIsCisJCS5oc2hpZnQgICA9IDEsCisJCS52c2hpZnQgICA9IDEsCisJfSx7CisJCS5uYW1lICAgICA9ICI0OjI6MCwgcGxhbmFyLCBZLUNyLUNiIiwKKwkJLnBhbGV0dGUgID0gLTEsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9ZVlU0MjAsCisJCS5idGZvcm1hdCA9IEJUODQ4X0NPTE9SX0ZNVF9ZQ3JDYjQyMiwKKwkJLmRlcHRoICAgID0gMTIsCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19QTEFOQVIgfCBGT1JNQVRfRkxBR1NfQ3JDYiwKKwkJLmhzaGlmdCAgID0gMSwKKwkJLnZzaGlmdCAgID0gMSwKKwl9LHsKKwkJLm5hbWUgICAgID0gIjQ6MToxLCBwbGFuYXIsIFktQ2ItQ3IiLAorCQkucGFsZXR0ZSAgPSBWSURFT19QQUxFVFRFX1lVVjQxMVAsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9ZVVY0MTFQLAorCQkuYnRmb3JtYXQgPSBCVDg0OF9DT0xPUl9GTVRfWUNyQ2I0MTEsCisJCS5kZXB0aCAgICA9IDEyLAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUExBTkFSLAorCQkuaHNoaWZ0ICAgPSAyLAorCQkudnNoaWZ0ICAgPSAwLAorCX0seworCQkubmFtZSAgICAgPSAiNDoxOjAsIHBsYW5hciwgWS1DYi1DciIsCisJCS5wYWxldHRlICA9IFZJREVPX1BBTEVUVEVfWVVWNDEwUCwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1lVVjQxMCwKKwkJLmJ0Zm9ybWF0ID0gQlQ4NDhfQ09MT1JfRk1UX1lDckNiNDExLAorCQkuZGVwdGggICAgPSA5LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUExBTkFSLAorCQkuaHNoaWZ0ICAgPSAyLAorCQkudnNoaWZ0ICAgPSAyLAorCX0seworCQkubmFtZSAgICAgPSAiNDoxOjAsIHBsYW5hciwgWS1Dci1DYiIsCisJCS5wYWxldHRlICA9IC0xLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfWVZVNDEwLAorCQkuYnRmb3JtYXQgPSBCVDg0OF9DT0xPUl9GTVRfWUNyQ2I0MTEsCisJCS5kZXB0aCAgICA9IDksCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19QTEFOQVIgfCBGT1JNQVRfRkxBR1NfQ3JDYiwKKwkJLmhzaGlmdCAgID0gMiwKKwkJLnZzaGlmdCAgID0gMiwKKwl9LHsKKwkJLm5hbWUgICAgID0gInJhdyBzY2FubGluZXMiLAorCQkucGFsZXR0ZSAgPSBWSURFT19QQUxFVFRFX1JBVywKKwkJLmZvdXJjYyAgID0gLTEsCisJCS5idGZvcm1hdCA9IEJUODQ4X0NPTE9SX0ZNVF9SQVcsCisJCS5kZXB0aCAgICA9IDgsCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19SQVcsCisJfQorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgQlRUVl9GT1JNQVRTID0gQVJSQVlfU0laRShidHR2X2Zvcm1hdHMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQ0hST01BX0FHQyAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDApCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQ09NQkZJTFRFUiAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDEpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT01VVEUgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfTFVNQUZJTFRFUiAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQUdDX0NSVVNIICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfVkNSX0hBQ0sgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDUpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfV0hJVEVDUlVTSF9VUFBFUiAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA2KQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1dISVRFQ1JVU0hfTE9XRVIgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNykKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9MQVNUUDEgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgOCkKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBub19jdGwgPSB7CisJLm5hbWUgID0gIjQyIiwKKwkuZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIGJ0dHZfY3Rsc1tdID0geworCS8qIC0tLSB2aWRlbyAtLS0gKi8KKwl7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJLm5hbWUgICAgICAgICAgPSAiQnJpZ2h0bmVzcyIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKKwkJLnN0ZXAgICAgICAgICAgPSAyNTYsCisJCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkJLm5hbWUgICAgICAgICAgPSAiQ29udHJhc3QiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gNjU1MzUsCisJCS5zdGVwICAgICAgICAgID0gMTI4LAorCQkuZGVmYXVsdF92YWx1ZSA9IDMyNzY4LAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKKwkJLm5hbWUgICAgICAgICAgPSAiU2F0dXJhdGlvbiIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKKwkJLnN0ZXAgICAgICAgICAgPSAxMjgsCisJCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9IVUUsCisJCS5uYW1lICAgICAgICAgID0gIkh1ZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKKwkJLnN0ZXAgICAgICAgICAgPSAyNTYsCisJCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LAorCS8qIC0tLSBhdWRpbyAtLS0gKi8KKwl7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKKwkJLm5hbWUgICAgICAgICAgPSAiTXV0ZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAxLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAorCQkubmFtZSAgICAgICAgICA9ICJWb2x1bWUiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gNjU1MzUsCisJCS5zdGVwICAgICAgICAgID0gNjU1MzUvMTAwLAorCQkuZGVmYXVsdF92YWx1ZSA9IDY1NTM1LAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fQkFMQU5DRSwKKwkJLm5hbWUgICAgICAgICAgPSAiQmFsYW5jZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKKwkJLnN0ZXAgICAgICAgICAgPSA2NTUzNS8xMDAsCisJCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19CQVNTLAorCQkubmFtZSAgICAgICAgICA9ICJCYXNzIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDY1NTM1LAorCQkuc3RlcCAgICAgICAgICA9IDY1NTM1LzEwMCwKKwkJLmRlZmF1bHRfdmFsdWUgPSAzMjc2OCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCX0seworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX1RSRUJMRSwKKwkJLm5hbWUgICAgICAgICAgPSAiVHJlYmxlIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDY1NTM1LAorCQkuc3RlcCAgICAgICAgICA9IDY1NTM1LzEwMCwKKwkJLmRlZmF1bHRfdmFsdWUgPSAzMjc2OCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCX0sCisJLyogLS0tIHByaXZhdGUgLS0tICovCisJeworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfQ0hST01BX0FHQywKKwkJLm5hbWUgICAgICAgICAgPSAiY2hyb21hIGFnYyIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAxLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfUFJJVkFURV9DT01CRklMVEVSLAorCQkubmFtZSAgICAgICAgICA9ICJjb21iZmlsdGVyIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0FVVE9NVVRFLAorCQkubmFtZSAgICAgICAgICA9ICJhdXRvbXV0ZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAxLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfUFJJVkFURV9MVU1BRklMVEVSLAorCQkubmFtZSAgICAgICAgICA9ICJsdW1hIGRlY2ltYXRpb24gZmlsdGVyIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0FHQ19DUlVTSCwKKwkJLm5hbWUgICAgICAgICAgPSAiYWdjIGNydXNoIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1ZDUl9IQUNLLAorCQkubmFtZSAgICAgICAgICA9ICJ2Y3IgaGFjayIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAxLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfUFJJVkFURV9XSElURUNSVVNIX1VQUEVSLAorCQkubmFtZSAgICAgICAgICA9ICJ3aGl0ZWNydXNoIHVwcGVyIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDI1NSwKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDB4Q0YsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1dISVRFQ1JVU0hfTE9XRVIsCisJCS5uYW1lICAgICAgICAgID0gIndoaXRlY3J1c2ggbG93ZXIiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gMjU1LAorCQkuc3RlcCAgICAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMHg3RiwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCX0KKworfTsKK3N0YXRpYyBjb25zdCBpbnQgQlRUVl9DVExTID0gQVJSQVlfU0laRShidHR2X2N0bHMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogcmVzb3VyY2UgbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljCitpbnQgY2hlY2tfYWxsb2NfYnRyZXMoc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IGJ0dHZfZmggKmZoLCBpbnQgYml0KQoreworCWlmIChmaC0+cmVzb3VyY2VzICYgYml0KQorCQkvKiBoYXZlIGl0IGFscmVhZHkgYWxsb2NhdGVkICovCisJCXJldHVybiAxOworCisJLyogaXMgaXQgZnJlZT8gKi8KKwlkb3duKCZidHYtPnJlc2xvY2spOworCWlmIChidHYtPnJlc291cmNlcyAmIGJpdCkgeworCQkvKiBubywgc29tZW9uZSBlbHNlIHVzZXMgaXQgKi8KKwkJdXAoJmJ0di0+cmVzbG9jayk7CisJCXJldHVybiAwOworCX0KKwkvKiBpdCdzIGZyZWUsIGdyYWIgaXQgKi8KKwlmaC0+cmVzb3VyY2VzICB8PSBiaXQ7CisJYnR2LT5yZXNvdXJjZXMgfD0gYml0OworCXVwKCZidHYtPnJlc2xvY2spOworCXJldHVybiAxOworfQorCitzdGF0aWMKK2ludCBjaGVja19idHJlcyhzdHJ1Y3QgYnR0dl9maCAqZmgsIGludCBiaXQpCit7CisJcmV0dXJuIChmaC0+cmVzb3VyY2VzICYgYml0KTsKK30KKworc3RhdGljCitpbnQgbG9ja2VkX2J0cmVzKHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCit7CisJcmV0dXJuIChidHYtPnJlc291cmNlcyAmIGJpdCk7Cit9CisKK3N0YXRpYwordm9pZCBmcmVlX2J0cmVzKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCBidHR2X2ZoICpmaCwgaW50IGJpdHMpCit7CisjaWYgMSAvKiBERUJVRyAqLworCWlmICgoZmgtPnJlc291cmNlcyAmIGJpdHMpICE9IGJpdHMpIHsKKwkJLyogdHJ5aW5nIHRvIGZyZWUgcmVzc291cmNlcyBub3QgYWxsb2NhdGVkIGJ5IHVzIC4uLiAqLworCQlwcmludGsoImJ0dHY6IEJVRyEgKGJ0cmVzKVxuIik7CisJfQorI2VuZGlmCisJZG93bigmYnR2LT5yZXNsb2NrKTsKKwlmaC0+cmVzb3VyY2VzICAmPSB+Yml0czsKKwlidHYtPnJlc291cmNlcyAmPSB+Yml0czsKKwl1cCgmYnR2LT5yZXNsb2NrKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIElmIEJ0ODQ4YSBvciBCdDg0OSwgdXNlIFBMTCBmb3IgUEFML1NFQ0FNIGFuZCBjcnlzdGFsIGZvciBOVFNDICAgICAgICAgICovCisKKy8qIEZyZXF1ZW5jeSA9IChGX2lucHV0IC8gUExMX1gpICogUExMX0kuUExMX0YvUExMX0MKKyAgIFBMTF9YID0gUmVmZXJlbmNlIHByZS1kaXZpZGVyICgwPTEsIDE9MikKKyAgIFBMTF9DID0gUG9zdCBkaXZpZGVyICgwPTYsIDE9NCkKKyAgIFBMTF9JID0gSW50ZWdlciBpbnB1dAorICAgUExMX0YgPSBGcmFjdGlvbmFsIGlucHV0CisKKyAgIEZfaW5wdXQgPSAyOC42MzYzNjMgTUh6OgorICAgUEFMIChDTEt4MiA9IDM1LjQ2ODk1IE1Ieik6IFBMTF9YID0gMSwgUExMX0kgPSAweDBFLCBQTExfRiA9IDB4RENGOSwgUExMX0MgPSAwCisqLworCitzdGF0aWMgdm9pZCBzZXRfcGxsX2ZyZXEoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGZpbiwgdW5zaWduZWQgaW50IGZvdXQpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgZmwsIGZoLCBmaTsKKworICAgICAgICAvKiBwcmV2ZW50IG92ZXJmbG93cyAqLworICAgICAgICBmaW4vPTQ7CisgICAgICAgIGZvdXQvPTQ7CisKKyAgICAgICAgZm91dCo9MTI7CisgICAgICAgIGZpPWZvdXQvZmluOworCisgICAgICAgIGZvdXQ9KGZvdXQlZmluKSoyNTY7CisgICAgICAgIGZoPWZvdXQvZmluOworCisgICAgICAgIGZvdXQ9KGZvdXQlZmluKSoyNTY7CisgICAgICAgIGZsPWZvdXQvZmluOworCisgICAgICAgIGJ0d3JpdGUoZmwsIEJUODQ4X1BMTF9GX0xPKTsKKyAgICAgICAgYnR3cml0ZShmaCwgQlQ4NDhfUExMX0ZfSEkpOworICAgICAgICBidHdyaXRlKGZpfEJUODQ4X1BMTF9YLCBCVDg0OF9QTExfWENJKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BsbChzdHJ1Y3QgYnR0diAqYnR2KQoreworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoIWJ0di0+cGxsLnBsbF9jcnlzdGFsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworCWlmIChidHYtPnBsbC5wbGxfb2ZyZXEgPT0gYnR2LT5wbGwucGxsX2N1cnJlbnQpIHsKKwkJZHByaW50aygiYnR0diVkOiBQTEw6IG5vIGNoYW5nZSByZXF1aXJlZFxuIixidHYtPmMubnIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChidHYtPnBsbC5wbGxfaWZyZXEgPT0gYnR2LT5wbGwucGxsX29mcmVxKSB7CisgICAgICAgICAgICAgICAgLyogbm8gUExMIG5lZWRlZCAqLworICAgICAgICAgICAgICAgIGlmIChidHYtPnBsbC5wbGxfY3VycmVudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCQl2cHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBQTEwgY2FuIHNsZWVwLCB1c2luZyBYVEFMICglZCkuXG4iLAorCQkJYnR2LT5jLm5yLGJ0di0+cGxsLnBsbF9pZnJlcSk7CisgICAgICAgICAgICAgICAgYnR3cml0ZSgweDAwLEJUODQ4X1RHQ1RSTCk7CisgICAgICAgICAgICAgICAgYnR3cml0ZSgweDAwLEJUODQ4X1BMTF9YQ0kpOworICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9jdXJyZW50ID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworCXZwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IFBMTDogJWQgPT4gJWQgIixidHYtPmMubnIsCisJCWJ0di0+cGxsLnBsbF9pZnJlcSwgYnR2LT5wbGwucGxsX29mcmVxKTsKKwlzZXRfcGxsX2ZyZXEoYnR2LCBidHYtPnBsbC5wbGxfaWZyZXEsIGJ0di0+cGxsLnBsbF9vZnJlcSk7CisKKyAgICAgICAgZm9yIChpPTA7IGk8MTA7IGkrKykgeworCQkvKiAgTGV0IG90aGVyIHBlb3BsZSBydW4gd2hpbGUgdGhlIFBMTCBzdGFiaWxpemVzICovCisJCXZwcmludGsoIi4iKTsKKwkJbXNsZWVwKDEwKTsKKworICAgICAgICAgICAgICAgIGlmIChidHJlYWQoQlQ4NDhfRFNUQVRVUykgJiBCVDg0OF9EU1RBVFVTX1BMT0NLKSB7CisJCQlidHdyaXRlKDAsQlQ4NDhfRFNUQVRVUyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0d3JpdGUoMHgwOCxCVDg0OF9UR0NUUkwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5wbGwucGxsX2N1cnJlbnQgPSBidHYtPnBsbC5wbGxfb2ZyZXE7CisJCQl2cHJpbnRrKCIgb2tcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBidHYtPnBsbC5wbGxfY3VycmVudCA9IC0xOworCXZwcmludGsoImZhaWxlZFxuIik7CisgICAgICAgIHJldHVybjsKK30KKworLyogdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgYnQ4NDgncyBhbmFsb2cvZGlnaXRhbCB2aWRlbyBjYXB0dXJlIG1vZGVzICovCitzdGF0aWMgdm9pZCBidDg0OEFfc2V0X3RpbWluZyhzdHJ1Y3QgYnR0diAqYnR2KQoreworCWludCBpLCBsZW47CisJaW50IHRhYmxlX2lkeCA9IGJ0dHZfdHZub3Jtc1tidHYtPnR2bm9ybV0uc3JhbTsKKwlpbnQgZnNjICAgICAgID0gYnR0dl90dm5vcm1zW2J0di0+dHZub3JtXS5Gc2M7CisKKwlpZiAoVU5TRVQgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tdXhzZWxbYnR2LT5pbnB1dF0pIHsKKwkJZHByaW50aygiYnR0diVkOiBsb2FkIGRpZ2l0YWwgdGltaW5nIHRhYmxlICh0YWJsZV9pZHg9JWQpXG4iLAorCQkJYnR2LT5jLm5yLHRhYmxlX2lkeCk7CisKKwkJLyogdGltaW5nIGNoYW5nZS4uLnJlc2V0IHRpbWluZyBnZW5lcmF0b3IgYWRkcmVzcyAqLworICAgICAgIAkJYnR3cml0ZSgweDAwLCBCVDg0OF9UR0NUUkwpOworICAgICAgIAkJYnR3cml0ZSgweDAyLCBCVDg0OF9UR0NUUkwpOworICAgICAgIAkJYnR3cml0ZSgweDAwLCBCVDg0OF9UR0NUUkwpOworCisJCWxlbj1TUkFNX1RhYmxlW3RhYmxlX2lkeF1bMF07CisJCWZvcihpID0gMTsgaSA8PSBsZW47IGkrKykKKwkJCWJ0d3JpdGUoU1JBTV9UYWJsZVt0YWJsZV9pZHhdW2ldLEJUODQ4X1RHTEIpOworCQlidHYtPnBsbC5wbGxfb2ZyZXEgPSAyNzAwMDAwMDsKKworCQlzZXRfcGxsKGJ0dik7CisJCWJ0d3JpdGUoMHgxMSwgQlQ4NDhfVEdDVFJMKTsKKwkJYnR3cml0ZSgweDQxLCBCVDg0OF9EVlNJRik7CisJfSBlbHNlIHsKKwkJYnR2LT5wbGwucGxsX29mcmVxID0gZnNjOworCQlzZXRfcGxsKGJ0dik7CisJCWJ0d3JpdGUoMHgwLCBCVDg0OF9EVlNJRik7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBidDg0OF9icmlnaHQoc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJyaWdodCkKK3sKKwlpbnQgdmFsdWU7CisKKwkvLyBwcmludGsoImJ0dHY6IHNldCBicmlnaHQ6ICVkXG4iLGJyaWdodCk7IC8vIERFQlVHCisJYnR2LT5icmlnaHQgPSBicmlnaHQ7CisKKwkvKiBXZSB3YW50IC0xMjggdG8gMTI3IHdlIGdldCAwLTY1NTM1ICovCisJdmFsdWUgPSAoYnJpZ2h0ID4+IDgpIC0gMTI4OworCWJ0d3JpdGUodmFsdWUgJiAweGZmLCBCVDg0OF9CUklHSFQpOworfQorCitzdGF0aWMgdm9pZCBidDg0OF9odWUoc3RydWN0IGJ0dHYgKmJ0diwgaW50IGh1ZSkKK3sKKwlpbnQgdmFsdWU7CisKKwlidHYtPmh1ZSA9IGh1ZTsKKworCS8qIC0xMjggdG8gMTI3ICovCisJdmFsdWUgPSAoaHVlID4+IDgpIC0gMTI4OworICAgICAgICBidHdyaXRlKHZhbHVlICYgMHhmZiwgQlQ4NDhfSFVFKTsKK30KKworc3RhdGljIHZvaWQgYnQ4NDhfY29udHJhc3Qoc3RydWN0IGJ0dHYgKmJ0diwgaW50IGNvbnQpCit7CisJaW50IHZhbHVlLGhpYml0OworCisJYnR2LT5jb250cmFzdCA9IGNvbnQ7CisKKwkvKiAwLTUxMSAqLworCXZhbHVlID0gKGNvbnQgID4+IDcpOworCWhpYml0ID0gKHZhbHVlID4+IDYpICYgNDsKKyAgICAgICAgYnR3cml0ZSh2YWx1ZSAmIDB4ZmYsIEJUODQ4X0NPTlRSQVNUX0xPKTsKKyAgICAgICAgYnRhb3IoaGliaXQsIH40LCBCVDg0OF9FX0NPTlRST0wpOworICAgICAgICBidGFvcihoaWJpdCwgfjQsIEJUODQ4X09fQ09OVFJPTCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ0ODQ4X3NhdChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgY29sb3IpCit7CisJaW50IHZhbF91LHZhbF92LGhpYml0czsKKworCWJ0di0+c2F0dXJhdGlvbiA9IGNvbG9yOworCisJLyogMC01MTEgZm9yIHRoZSBjb2xvciAqLworCXZhbF91ICAgPSBjb2xvciA+PiA3OworCXZhbF92ICAgPSAoKGNvbG9yPj43KSoxODBMKS8yNTQ7CisgICAgICAgIGhpYml0cyAgPSAodmFsX3UgPj4gNykgJiAyOworCWhpYml0cyB8PSAodmFsX3YgPj4gOCkgJiAxOworICAgICAgICBidHdyaXRlKHZhbF91ICYgMHhmZiwgQlQ4NDhfU0FUX1VfTE8pOworICAgICAgICBidHdyaXRlKHZhbF92ICYgMHhmZiwgQlQ4NDhfU0FUX1ZfTE8pOworICAgICAgICBidGFvcihoaWJpdHMsIH4zLCBCVDg0OF9FX0NPTlRST0wpOworICAgICAgICBidGFvcihoaWJpdHMsIH4zLCBCVDg0OF9PX0NPTlRST0wpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50Cit2aWRlb19tdXgoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQoreworCWludCBtdXgsbWFzazI7CisKKwlpZiAoaW5wdXQgPj0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS52aWRlb19pbnB1dHMpCisJCXJldHVybiAtRUlOVkFMOworCisgICAgICAgIC8qIG5lZWRlZCBieSBSZW1vdGVWaWRlbyBNWCAqLworCW1hc2syID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzazI7CisJaWYgKG1hc2syKQorCQlncGlvX2lub3V0KG1hc2syLG1hc2syKTsKKworCWlmIChpbnB1dCA9PSBidHYtPnN2aHMpICB7CisJCWJ0b3IoQlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9FX0NPTlRST0wpOworCQlidG9yKEJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfT19DT05UUk9MKTsKKwl9IGVsc2UgeworCQlidGFuZCh+QlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9FX0NPTlRST0wpOworCQlidGFuZCh+QlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9PX0NPTlRST0wpOworCX0KKwltdXggPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm11eHNlbFtpbnB1dF0gJiAzOworCWJ0YW9yKG11eDw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOworCWRwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiB2aWRlbyBtdXg6IGlucHV0PSVkIG11eD0lZFxuIiwKKwkJYnR2LT5jLm5yLGlucHV0LG11eCk7CisKKwkvKiBjYXJkIHNwZWNpZmljIGhvb2sgKi8KKwlpZihidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm11eHNlbF9ob29rKQorCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm11eHNlbF9ob29rIChidHYsIGlucHV0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKmF1ZGlvX21vZGVzW10gPSB7CisJImF1ZGlvOiB0dW5lciIsICJhdWRpbzogcmFkaW8iLCAiYXVkaW86IGV4dGVybiIsCisJImF1ZGlvOiBpbnRlcm4iLCAiYXVkaW86IG9mZiIKK307CisKK3N0YXRpYyBpbnQKK2F1ZGlvX211eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgbW9kZSkKK3sKKwlpbnQgdmFsLG11eCxpMmNfbXV4LHNpZ25hbDsKKworCWdwaW9faW5vdXQoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzaywKKwkJICAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayk7CisJc2lnbmFsID0gYnRyZWFkKEJUODQ4X0RTVEFUVVMpICYgQlQ4NDhfRFNUQVRVU19ITE9DOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBBVURJT19NVVRFOgorCQlidHYtPmF1ZGlvIHw9IEFVRElPX01VVEU7CisJCWJyZWFrOworCWNhc2UgQVVESU9fVU5NVVRFOgorCQlidHYtPmF1ZGlvICY9IH5BVURJT19NVVRFOworCQlicmVhazsKKwljYXNlIEFVRElPX1RVTkVSOgorCWNhc2UgQVVESU9fUkFESU86CisJY2FzZSBBVURJT19FWFRFUk46CisJY2FzZSBBVURJT19JTlRFUk46CisJCWJ0di0+YXVkaW8gJj0gQVVESU9fTVVURTsKKwkJYnR2LT5hdWRpbyB8PSBtb2RlOworCX0KKwlpMmNfbXV4ID0gbXV4ID0gKGJ0di0+YXVkaW8gJiBBVURJT19NVVRFKSA/IEFVRElPX09GRiA6IGJ0di0+YXVkaW87CisJaWYgKGJ0di0+b3B0X2F1dG9tdXRlICYmICFzaWduYWwgJiYgIWJ0di0+cmFkaW9fdXNlcikKKwkJbXV4ID0gQVVESU9fT0ZGOworI2lmIDAKKwlwcmludGsoImJ0dHYlZDogYW11eDogbW9kZT0lZCBhdWRpbz0lZCBzaWduYWw9JXMgbXV4PSVkLyVkIGlycT0lc1xuIiwKKwkgICAgICAgYnR2LT5jLm5yLCBtb2RlLCBidHYtPmF1ZGlvLCBzaWduYWwgPyAieWVzIiA6ICJubyIsCisJICAgICAgIG11eCwgaTJjX211eCwgaW5faW50ZXJydXB0KCkgPyAieWVzIiA6ICJubyIpOworI2VuZGlmCisKKwl2YWwgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W211eF07CisJZ3Bpb19iaXRzKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2ssdmFsKTsKKwlpZiAoYnR0dl9ncGlvKQorCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LGF1ZGlvX21vZGVzW211eF0pOworCWlmICghaW5faW50ZXJydXB0KCkpCisJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsQVVEQ19TRVRfSU5QVVQsJihpMmNfbXV4KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpMmNfdmlkaW9jc2NoYW4oc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCBjOworCisJbWVtc2V0KCZjLDAsc2l6ZW9mKGMpKTsKKwljLm5vcm0gICAgPSBidHYtPnR2bm9ybTsKKwljLmNoYW5uZWwgPSBidHYtPmlucHV0OworCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsVklESU9DU0NIQU4sJmMpOworCWlmIChidHYtPmMudHlwZSA9PSBCVFRWX1ZPT0RPT1RWX0ZNKQorCQlidHR2X3RkYTk4ODBfc2V0bm9ybShidHYsYy5ub3JtKTsKK30KKworc3RhdGljIGludAorc2V0X3R2bm9ybShzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgbm9ybSkKK3sKKwljb25zdCBzdHJ1Y3QgYnR0dl90dm5vcm0gKnR2bm9ybTsKKworCWlmIChub3JtIDwgMCB8fCBub3JtID49IEJUVFZfVFZOT1JNUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidHYtPnR2bm9ybSA9IG5vcm07CisJdHZub3JtID0gJmJ0dHZfdHZub3Jtc1tub3JtXTsKKworCWJ0d3JpdGUodHZub3JtLT5hZGVsYXksIEJUODQ4X0FERUxBWSk7CisJYnR3cml0ZSh0dm5vcm0tPmJkZWxheSwgQlQ4NDhfQkRFTEFZKTsKKwlidGFvcih0dm5vcm0tPmlmb3JtLH4oQlQ4NDhfSUZPUk1fTk9STXxCVDg0OF9JRk9STV9YVEJPVEgpLAorCSAgICAgIEJUODQ4X0lGT1JNKTsKKwlidHdyaXRlKHR2bm9ybS0+dmJpcGFjaywgQlQ4NDhfVkJJX1BBQ0tfU0laRSk7CisJYnR3cml0ZSgxLCBCVDg0OF9WQklfUEFDS19ERUwpOworCWJ0ODQ4QV9zZXRfdGltaW5nKGJ0dik7CisKKwlzd2l0Y2ggKGJ0di0+Yy50eXBlKSB7CisJY2FzZSBCVFRWX1ZPT0RPT1RWX0ZNOgorCQlidHR2X3RkYTk4ODBfc2V0bm9ybShidHYsbm9ybSk7CisJCWJyZWFrOworI2lmIDAKKwljYXNlIEJUVFZfT1NQUkVZNTQwOgorCQlvc3ByZXlfNTQwX3NldF9ub3JtKGJ0dixub3JtKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfaW5wdXQoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlidHYtPmlucHV0ID0gaW5wdXQ7CisJaWYgKGlycV9pc3dpdGNoKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZidHYtPnNfbG9jayxmbGFncyk7CisJCWlmIChidHYtPmN1cnIuZnJhbWVfaXJxKSB7CisJCQkvKiBhY3RpdmUgY2FwdHVyZSAtPiBkZWxheWVkIGlucHV0IHN3aXRjaCAqLworCQkJYnR2LT5uZXdfaW5wdXQgPSBpbnB1dDsKKwkJfSBlbHNlIHsKKwkJCXZpZGVvX211eChidHYsaW5wdXQpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ0di0+c19sb2NrLGZsYWdzKTsKKwl9IGVsc2UgeworCQl2aWRlb19tdXgoYnR2LGlucHV0KTsKKwl9CisJYXVkaW9fbXV4KGJ0diwoaW5wdXQgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lciA/CisJCSAgICAgICBBVURJT19UVU5FUiA6IEFVRElPX0VYVEVSTikpOworCXNldF90dm5vcm0oYnR2LGJ0di0+dHZub3JtKTsKKwlpMmNfdmlkaW9jc2NoYW4oYnR2KTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9pcnFyZWcoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwkvKiBjbGVhciBzdGF0dXMgKi8KKwlidHdyaXRlKDB4ZmZmZmZVTCwgQlQ4NDhfSU5UX1NUQVQpOworCisJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdmlkZW8pIHsKKwkJLyogaTJjIG9ubHkgKi8KKwkJYnR3cml0ZShCVDg0OF9JTlRfSTJDRE9ORSwKKwkJCUJUODQ4X0lOVF9NQVNLKTsKKwl9IGVsc2UgeworCQkvKiBmdWxsIHZpZGVvICovCisJCWJ0d3JpdGUoKGJ0di0+dHJpdG9uMSkgIHwKKwkJCShidHYtPmdwaW9pcnEgPyBCVDg0OF9JTlRfR1BJTlQgOiAwKSB8CisJCQlCVDg0OF9JTlRfU0NFUlIgfAorCQkJKGZkc3IgPyBCVDg0OF9JTlRfRkRTUiA6IDApIHwKKwkJCUJUODQ4X0lOVF9SSVNDSXxCVDg0OF9JTlRfT0NFUlJ8QlQ4NDhfSU5UX1ZQUkVTfAorCQkJQlQ4NDhfSU5UX0ZNVENIR3xCVDg0OF9JTlRfSExPQ0t8CisJCQlCVDg0OF9JTlRfSTJDRE9ORSwKKwkJCUJUODQ4X0lOVF9NQVNLKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfYnQ4NDgoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwlpbnQgdmFsOworCisJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdmlkZW8pIHsKKwkJLyogdmVyeSBiYXNpYyBpbml0IG9ubHkgKi8KKwkJaW5pdF9pcnFyZWcoYnR2KTsKKwkJcmV0dXJuOworCX0KKworCWJ0d3JpdGUoMHgwMCwgQlQ4NDhfQ0FQX0NUTCk7CisJYnR3cml0ZShCVDg0OF9DT0xPUl9DVExfR0FNTUEsIEJUODQ4X0NPTE9SX0NUTCk7CisJYnR3cml0ZShCVDg0OF9JRk9STV9YVEFVVE8gfCBCVDg0OF9JRk9STV9BVVRPLCBCVDg0OF9JRk9STSk7CisKKyAgICAgICAgLyogc2V0IHBsYW5hciBhbmQgcGFja2VkIG1vZGUgdHJpZ2dlciBwb2ludHMgYW5kICAgICAgICAgKi8KKyAgICAgICAgLyogc2V0IHJpc2luZyBlZGdlIG9mIGludmVydGVkIEdQSU5UUiBwaW4gYXMgaXJxIHRyaWdnZXIgKi8KKyAgICAgICAgYnR3cml0ZShCVDg0OF9HUElPX0RNQV9DVExfUEtUUF8zMnwKKyAgICAgICAgICAgICAgICBCVDg0OF9HUElPX0RNQV9DVExfUExUUDFfMTZ8CisgICAgICAgICAgICAgICAgQlQ4NDhfR1BJT19ETUFfQ1RMX1BMVFAyM18xNnwKKyAgICAgICAgICAgICAgICBCVDg0OF9HUElPX0RNQV9DVExfR1BJTlRDfAorICAgICAgICAgICAgICAgIEJUODQ4X0dQSU9fRE1BX0NUTF9HUElOVEksCisgICAgICAgICAgICAgICAgQlQ4NDhfR1BJT19ETUFfQ1RMKTsKKworCXZhbCA9IGJ0di0+b3B0X2Nocm9tYV9hZ2MgPyBCVDg0OF9TQ0xPT1BfQ0FHQyA6IDA7CisgICAgICAgIGJ0d3JpdGUodmFsLCBCVDg0OF9FX1NDTE9PUCk7CisgICAgICAgIGJ0d3JpdGUodmFsLCBCVDg0OF9PX1NDTE9PUCk7CisKKyAgICAgICAgYnR3cml0ZSgweDIwLCBCVDg0OF9FX1ZTQ0FMRV9ISSk7CisgICAgICAgIGJ0d3JpdGUoMHgyMCwgQlQ4NDhfT19WU0NBTEVfSEkpOworICAgICAgICBidHdyaXRlKEJUODQ4X0FEQ19SRVNFUlZFRCB8IChidHYtPm9wdF9hZGNfY3J1c2ggPyBCVDg0OF9BRENfQ1JVU0ggOiAwKSwKKwkJQlQ4NDhfQURDKTsKKworCWJ0d3JpdGUod2hpdGVjcnVzaF91cHBlciwgQlQ4NDhfV0NfVVApOworCWJ0d3JpdGUod2hpdGVjcnVzaF9sb3dlciwgQlQ4NDhfV0NfRE9XTik7CisKKwlpZiAoYnR2LT5vcHRfbHVtYWZpbHRlcikgeworCQlidHdyaXRlKDAsIEJUODQ4X0VfQ09OVFJPTCk7CisJCWJ0d3JpdGUoMCwgQlQ4NDhfT19DT05UUk9MKTsKKwl9IGVsc2UgeworCQlidHdyaXRlKEJUODQ4X0NPTlRST0xfTERFQywgQlQ4NDhfRV9DT05UUk9MKTsKKwkJYnR3cml0ZShCVDg0OF9DT05UUk9MX0xERUMsIEJUODQ4X09fQ09OVFJPTCk7CisJfQorCisJYnQ4NDhfYnJpZ2h0KGJ0diwgICBidHYtPmJyaWdodCk7CisJYnQ4NDhfaHVlKGJ0diwgICAgICBidHYtPmh1ZSk7CisJYnQ4NDhfY29udHJhc3QoYnR2LCBidHYtPmNvbnRyYXN0KTsKKwlidDg0OF9zYXQoYnR2LCAgICAgIGJ0di0+c2F0dXJhdGlvbik7CisKKyAgICAgICAgLyogaW50ZXJydXB0ICovCisJaW5pdF9pcnFyZWcoYnR2KTsKK30KKworc3RhdGljIHZvaWQgYnR0dl9yZWluaXRfYnQ4NDgoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGJ0dHZfdmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiByZXNldCwgcmVpbml0aWFsaXplXG4iLGJ0di0+Yy5ucik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJ0di0+c19sb2NrLGZsYWdzKTsKKwlidHYtPmVycm9ycz0wOworCWJ0dHZfc2V0X2RtYShidHYsMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOworCisJaW5pdF9idDg0OChidHYpOworICAgICAgICBidHYtPnBsbC5wbGxfY3VycmVudCA9IC0xOworCXNldF9pbnB1dChidHYsYnR2LT5pbnB1dCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvbnRyb2woc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHY0bDJfY29udHJvbCAqYykKK3sKKwlzdHJ1Y3QgdmlkZW9fYXVkaW8gdmE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQlRUVl9DVExTOyBpKyspCisJCWlmIChidHR2X2N0bHNbaV0uaWQgPT0gYy0+aWQpCisJCQlicmVhazsKKwlpZiAoaSA9PSBCVFRWX0NUTFMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpID49IDQgJiYgaSA8PSA4KSB7CisJCW1lbXNldCgmdmEsMCxzaXplb2YodmEpKTsKKwkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgVklESU9DR0FVRElPLCAmdmEpOworCQlpZiAoYnR2LT5hdWRpb19ob29rKQorCQkJYnR2LT5hdWRpb19ob29rKGJ0diwmdmEsMCk7CisJfQorCXN3aXRjaCAoYy0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWMtPnZhbHVlID0gYnR2LT5icmlnaHQ7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQljLT52YWx1ZSA9IGJ0di0+aHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQljLT52YWx1ZSA9IGJ0di0+Y29udHJhc3Q7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJYy0+dmFsdWUgPSBidHYtPnNhdHVyYXRpb247CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQljLT52YWx1ZSA9IChWSURFT19BVURJT19NVVRFICYgdmEuZmxhZ3MpID8gMSA6IDA7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQljLT52YWx1ZSA9IHZhLnZvbHVtZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgorCQljLT52YWx1ZSA9IHZhLmJhbGFuY2U7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKKwkJYy0+dmFsdWUgPSB2YS5iYXNzOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKKwkJYy0+dmFsdWUgPSB2YS50cmVibGU7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NIUk9NQV9BR0M6CisJCWMtPnZhbHVlID0gYnR2LT5vcHRfY2hyb21hX2FnYzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPTUJGSUxURVI6CisJCWMtPnZhbHVlID0gYnR2LT5vcHRfY29tYmZpbHRlcjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0xVTUFGSUxURVI6CisJCWMtPnZhbHVlID0gYnR2LT5vcHRfbHVtYWZpbHRlcjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0FVVE9NVVRFOgorCQljLT52YWx1ZSA9IGJ0di0+b3B0X2F1dG9tdXRlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQUdDX0NSVVNIOgorCQljLT52YWx1ZSA9IGJ0di0+b3B0X2FkY19jcnVzaDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1ZDUl9IQUNLOgorCQljLT52YWx1ZSA9IGJ0di0+b3B0X3Zjcl9oYWNrOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfV0hJVEVDUlVTSF9VUFBFUjoKKwkJYy0+dmFsdWUgPSBidHYtPm9wdF93aGl0ZWNydXNoX3VwcGVyOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfV0hJVEVDUlVTSF9MT1dFUjoKKwkJYy0+dmFsdWUgPSBidHYtPm9wdF93aGl0ZWNydXNoX2xvd2VyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvbnRyb2woc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHY0bDJfY29udHJvbCAqYykKK3sKKwlzdHJ1Y3QgdmlkZW9fYXVkaW8gdmE7CisJaW50IGksdmFsOworCisJZm9yIChpID0gMDsgaSA8IEJUVFZfQ1RMUzsgaSsrKQorCQlpZiAoYnR0dl9jdGxzW2ldLmlkID09IGMtPmlkKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gQlRUVl9DVExTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaSA+PSA0ICYmIGkgPD0gOCkgeworCQltZW1zZXQoJnZhLDAsc2l6ZW9mKHZhKSk7CisJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIFZJRElPQ0dBVURJTywgJnZhKTsKKwkJaWYgKGJ0di0+YXVkaW9faG9vaykKKwkJCWJ0di0+YXVkaW9faG9vayhidHYsJnZhLDApOworCX0KKwlzd2l0Y2ggKGMtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQlidDg0OF9icmlnaHQoYnR2LGMtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCWJ0ODQ4X2h1ZShidHYsYy0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQlidDg0OF9jb250cmFzdChidHYsYy0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCWJ0ODQ4X3NhdChidHYsYy0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWlmIChjLT52YWx1ZSkgeworCQkJdmEuZmxhZ3MgfD0gVklERU9fQVVESU9fTVVURTsKKwkJCWF1ZGlvX211eChidHYsIEFVRElPX01VVEUpOworCQl9IGVsc2UgeworCQkJdmEuZmxhZ3MgJj0gflZJREVPX0FVRElPX01VVEU7CisJCQlhdWRpb19tdXgoYnR2LCBBVURJT19VTk1VVEUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCXZhLnZvbHVtZSA9IGMtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CisJCXZhLmJhbGFuY2UgPSBjLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgorCQl2YS5iYXNzID0gYy0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgorCQl2YS50cmVibGUgPSBjLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQ0hST01BX0FHQzoKKwkJYnR2LT5vcHRfY2hyb21hX2FnYyA9IGMtPnZhbHVlOworCQl2YWwgPSBidHYtPm9wdF9jaHJvbWFfYWdjID8gQlQ4NDhfU0NMT09QX0NBR0MgOiAwOworCQlidHdyaXRlKHZhbCwgQlQ4NDhfRV9TQ0xPT1ApOworCQlidHdyaXRlKHZhbCwgQlQ4NDhfT19TQ0xPT1ApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQ09NQkZJTFRFUjoKKwkJYnR2LT5vcHRfY29tYmZpbHRlciA9IGMtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfTFVNQUZJTFRFUjoKKwkJYnR2LT5vcHRfbHVtYWZpbHRlciA9IGMtPnZhbHVlOworCQlpZiAoYnR2LT5vcHRfbHVtYWZpbHRlcikgeworCQkJYnRhbmQofkJUODQ4X0NPTlRST0xfTERFQywgQlQ4NDhfRV9DT05UUk9MKTsKKwkJCWJ0YW5kKH5CVDg0OF9DT05UUk9MX0xERUMsIEJUODQ4X09fQ09OVFJPTCk7CisJCX0gZWxzZSB7CisJCQlidG9yKEJUODQ4X0NPTlRST0xfTERFQywgQlQ4NDhfRV9DT05UUk9MKTsKKwkJCWJ0b3IoQlQ4NDhfQ09OVFJPTF9MREVDLCBCVDg0OF9PX0NPTlRST0wpOworCQl9CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUFJJVkFURV9BVVRPTVVURToKKwkJYnR2LT5vcHRfYXV0b211dGUgPSBjLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0FHQ19DUlVTSDoKKwkJYnR2LT5vcHRfYWRjX2NydXNoID0gYy0+dmFsdWU7CisJCWJ0d3JpdGUoQlQ4NDhfQURDX1JFU0VSVkVEIHwgKGJ0di0+b3B0X2FkY19jcnVzaCA/IEJUODQ4X0FEQ19DUlVTSCA6IDApLAorCQkJQlQ4NDhfQURDKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1ZDUl9IQUNLOgorCQlidHYtPm9wdF92Y3JfaGFjayA9IGMtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfV0hJVEVDUlVTSF9VUFBFUjoKKwkJYnR2LT5vcHRfd2hpdGVjcnVzaF91cHBlciA9IGMtPnZhbHVlOworCQlidHdyaXRlKGMtPnZhbHVlLCBCVDg0OF9XQ19VUCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUFJJVkFURV9XSElURUNSVVNIX0xPV0VSOgorCQlidHYtPm9wdF93aGl0ZWNydXNoX2xvd2VyID0gYy0+dmFsdWU7CisJCWJ0d3JpdGUoYy0+dmFsdWUsIEJUODQ4X1dDX0RPV04pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGkgPj0gNCAmJiBpIDw9IDgpIHsKKwkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgVklESU9DU0FVRElPLCAmdmEpOworCQlpZiAoYnR2LT5hdWRpb19ob29rKQorCQkJYnR2LT5hdWRpb19ob29rKGJ0diwmdmEsMSk7CisJfQorCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGJ0dHZfZ3Bpb190cmFja2luZyhzdHJ1Y3QgYnR0diAqYnR2LCBjaGFyICpjb21tZW50KQoreworCXVuc2lnbmVkIGludCBvdXRiaXRzLCBkYXRhOworCW91dGJpdHMgPSBidHJlYWQoQlQ4NDhfR1BJT19PVVRfRU4pOworCWRhdGEgICAgPSBidHJlYWQoQlQ4NDhfR1BJT19EQVRBKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBncGlvOiBlbj0lMDh4LCBvdXQ9JTA4eCBpbj0lMDh4IFslc11cbiIsCisJICAgICAgIGJ0di0+Yy5ucixvdXRiaXRzLGRhdGEgJiBvdXRiaXRzLCBkYXRhICYgfm91dGJpdHMsIGNvbW1lbnQpOworfQorCitzdGF0aWMgdm9pZCBidHR2X2ZpZWxkX2NvdW50KHN0cnVjdCBidHR2ICpidHYpCit7CisJaW50IG5lZWRfY291bnQgPSAwOworCisJaWYgKGJ0di0+dXNlcnMpCisJCW5lZWRfY291bnQrKzsKKworCWlmIChuZWVkX2NvdW50KSB7CisJCS8qIHN0YXJ0IGZpZWxkIGNvdW50ZXIgKi8KKwkJYnRvcihCVDg0OF9JTlRfVlNZTkMsQlQ4NDhfSU5UX01BU0spOworCX0gZWxzZSB7CisJCS8qIHN0b3AgZmllbGQgY291bnRlciAqLworCQlidGFuZCh+QlQ4NDhfSU5UX1ZTWU5DLEJUODQ4X0lOVF9NQVNLKTsKKwkJYnR2LT5maWVsZF9jb3VudCA9IDA7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0dHZfZm9ybWF0KgorZm9ybWF0X2J5X3BhbGV0dGUoaW50IHBhbGV0dGUpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQlRUVl9GT1JNQVRTOyBpKyspIHsKKwkJaWYgKC0xID09IGJ0dHZfZm9ybWF0c1tpXS5wYWxldHRlKQorCQkJY29udGludWU7CisJCWlmIChidHR2X2Zvcm1hdHNbaV0ucGFsZXR0ZSA9PSBwYWxldHRlKQorCQkJcmV0dXJuIGJ0dHZfZm9ybWF0cytpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBidHR2X2Zvcm1hdCoKK2Zvcm1hdF9ieV9mb3VyY2MoaW50IGZvdXJjYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCVFRWX0ZPUk1BVFM7IGkrKykgeworCQlpZiAoLTEgPT0gYnR0dl9mb3JtYXRzW2ldLmZvdXJjYykKKwkJCWNvbnRpbnVlOworCQlpZiAoYnR0dl9mb3JtYXRzW2ldLmZvdXJjYyA9PSBmb3VyY2MpCisJCQlyZXR1cm4gYnR0dl9mb3JtYXRzK2k7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogbWlzYyBoZWxwZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGludAorYnR0dl9zd2l0Y2hfb3ZlcmxheShzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgYnR0dl9maCAqZmgsCisJCSAgICBzdHJ1Y3QgYnR0dl9idWZmZXIgKm5ldykKK3sKKwlzdHJ1Y3QgYnR0dl9idWZmZXIgKm9sZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWwgPSAwOworCisJZHByaW50aygic3dpdGNoX292ZXJsYXk6IGVudGVyIFtuZXc9JXBdXG4iLG5ldyk7CisJaWYgKG5ldykKKwkJbmV3LT52Yi5zdGF0ZSA9IFNUQVRFX0RPTkU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJ0di0+c19sb2NrLGZsYWdzKTsKKwlvbGQgPSBidHYtPnNjcmVlbjsKKwlidHYtPnNjcmVlbiA9IG5ldzsKKwlidHYtPmxvb3BfaXJxIHw9IDE7CisJYnR0dl9zZXRfZG1hKGJ0diwgMHgwMyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOworCWlmIChOVUxMID09IG5ldykKKwkJZnJlZV9idHJlcyhidHYsZmgsUkVTT1VSQ0VfT1ZFUkxBWSk7CisJaWYgKE5VTEwgIT0gb2xkKSB7CisJCWRwcmludGsoInN3aXRjaF9vdmVybGF5OiBvbGQ9JXAgc3RhdGUgaXMgJWRcbiIsb2xkLG9sZC0+dmIuc3RhdGUpOworCQlidHR2X2RtYV9mcmVlKGJ0diwgb2xkKTsKKwkJa2ZyZWUob2xkKTsKKwl9CisJZHByaW50aygic3dpdGNoX292ZXJsYXk6IGRvbmVcbiIpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB2aWRlbzRsaW51eCAoMSkgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgaW50IGJ0dHZfcHJlcGFyZV9idWZmZXIoc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IGJ0dHZfYnVmZmVyICpidWYsCisgCQkJICAgICAgIGNvbnN0IHN0cnVjdCBidHR2X2Zvcm1hdCAqZm10LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwKKwkJCSAgICAgICBlbnVtIHY0bDJfZmllbGQgZmllbGQpCit7CisJaW50IHJlZG9fZG1hX3Jpc2MgPSAwOworCWludCByYzsKKworCS8qIGNoZWNrIHNldHRpbmdzICovCisJaWYgKE5VTEwgPT0gZm10KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZm10LT5idGZvcm1hdCA9PSBCVDg0OF9DT0xPUl9GTVRfUkFXKSB7CisJCXdpZHRoICA9IFJBV19CUEw7CisJCWhlaWdodCA9IFJBV19MSU5FUyoyOworCQlpZiAod2lkdGgqaGVpZ2h0ID4gYnVmLT52Yi5ic2l6ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlidWYtPnZiLnNpemUgPSBidWYtPnZiLmJzaXplOworCX0gZWxzZSB7CisJCWlmICh3aWR0aCAgPCA0OCB8fAorCQkgICAgaGVpZ2h0IDwgMzIgfHwKKwkJICAgIHdpZHRoICA+IGJ0dHZfdHZub3Jtc1tidHYtPnR2bm9ybV0uc3dpZHRoIHx8CisJCSAgICBoZWlnaHQgPiBidHR2X3R2bm9ybXNbYnR2LT50dm5vcm1dLnNoZWlnaHQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnVmLT52Yi5zaXplID0gKHdpZHRoICogaGVpZ2h0ICogZm10LT5kZXB0aCkgPj4gMzsKKwkJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBidWYtPnZiLnNpemUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBhbGxvYyArIGZpbGwgc3RydWN0IGJ0dHZfYnVmZmVyIChpZiBjaGFuZ2VkKSAqLworCWlmIChidWYtPnZiLndpZHRoICE9IHdpZHRoIHx8IGJ1Zi0+dmIuaGVpZ2h0ICE9IGhlaWdodCB8fAorCSAgICBidWYtPnZiLmZpZWxkICE9IGZpZWxkIHx8CisJICAgIGJ1Zi0+dHZub3JtICE9IGJ0di0+dHZub3JtIHx8IGJ1Zi0+Zm10ICE9IGZtdCkgeworCQlidWYtPnZiLndpZHRoICA9IHdpZHRoOworCQlidWYtPnZiLmhlaWdodCA9IGhlaWdodDsKKwkJYnVmLT52Yi5maWVsZCAgPSBmaWVsZDsKKwkJYnVmLT50dm5vcm0gICAgPSBidHYtPnR2bm9ybTsKKwkJYnVmLT5mbXQgICAgICAgPSBmbXQ7CisJCXJlZG9fZG1hX3Jpc2MgPSAxOworCX0KKworCS8qIGFsbG9jIHJpc2MgbWVtb3J5ICovCisJaWYgKFNUQVRFX05FRURTX0lOSVQgPT0gYnVmLT52Yi5zdGF0ZSkgeworCQlyZWRvX2RtYV9yaXNjID0gMTsKKwkJaWYgKDAgIT0gKHJjID0gdmlkZW9idWZfaW9sb2NrKGJ0di0+Yy5wY2ksJmJ1Zi0+dmIsJmJ0di0+ZmJ1ZikpKQorCQkJZ290byBmYWlsOworCX0KKworCWlmIChyZWRvX2RtYV9yaXNjKQorCQlpZiAoMCAhPSAocmMgPSBidHR2X2J1ZmZlcl9yaXNjKGJ0dixidWYpKSkKKwkJCWdvdG8gZmFpbDsKKworCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJYnR0dl9kbWFfZnJlZShidHYsYnVmKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2J1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHVuc2lnbmVkIGludCAqY291bnQsIHVuc2lnbmVkIGludCAqc2l6ZSkKK3sKKwlzdHJ1Y3QgYnR0dl9maCAqZmggPSBxLT5wcml2X2RhdGE7CisKKwkqc2l6ZSA9IGZoLT5mbXQtPmRlcHRoKmZoLT53aWR0aCpmaC0+aGVpZ2h0ID4+IDM7CisJaWYgKDAgPT0gKmNvdW50KQorCQkqY291bnQgPSBnYnVmZmVyczsKKwl3aGlsZSAoKnNpemUgKiAqY291bnQgPiBnYnVmZmVycyAqIGdidWZzaXplKQorCQkoKmNvdW50KS0tOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitidWZmZXJfcHJlcGFyZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAorCSAgICAgICBlbnVtIHY0bDJfZmllbGQgZmllbGQpCit7CisJc3RydWN0IGJ0dHZfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsc3RydWN0IGJ0dHZfYnVmZmVyLHZiKTsKKwlzdHJ1Y3QgYnR0dl9maCAqZmggPSBxLT5wcml2X2RhdGE7CisKKwlyZXR1cm4gYnR0dl9wcmVwYXJlX2J1ZmZlcihmaC0+YnR2LCBidWYsIGZoLT5mbXQsCisJCQkJICAgZmgtPndpZHRoLCBmaC0+aGVpZ2h0LCBmaWVsZCk7Cit9CisKK3N0YXRpYyB2b2lkCitidWZmZXJfcXVldWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgYnR0dl9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2YixzdHJ1Y3QgYnR0dl9idWZmZXIsdmIpOworCXN0cnVjdCBidHR2X2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgYnR0diAgICAqYnR2ID0gZmgtPmJ0djsKKworCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9RVUVVRUQ7CisJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwmYnR2LT5jYXB0dXJlKTsKKwlpZiAoIWJ0di0+Y3Vyci5mcmFtZV9pcnEpIHsKKwkJYnR2LT5sb29wX2lycSB8PSAxOworCQlidHR2X3NldF9kbWEoYnR2LCAweDAzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IGJ0dHZfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsc3RydWN0IGJ0dHZfYnVmZmVyLHZiKTsKKwlzdHJ1Y3QgYnR0dl9maCAqZmggPSBxLT5wcml2X2RhdGE7CisKKwlidHR2X2RtYV9mcmVlKGZoLT5idHYsYnVmKTsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgYnR0dl92aWRlb19xb3BzID0geworCS5idWZfc2V0dXAgICAgPSBidWZmZXJfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlICA9IGJ1ZmZlcl9wcmVwYXJlLAorCS5idWZfcXVldWUgICAgPSBidWZmZXJfcXVldWUsCisJLmJ1Zl9yZWxlYXNlICA9IGJ1ZmZlcl9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnY0bDFfaW9jdGxzW10gPSB7CisJIj8iLCAiQ0dBUCIsICJHQ0hBTiIsICJTQ0hBTiIsICJHVFVORVIiLCAiU1RVTkVSIiwgIkdQSUNUIiwgIlNQSUNUIiwKKwkiQ0NBUFRVUkUiLCAiR1dJTiIsICJTV0lOIiwgIkdGQlVGIiwgIlNGQlVGIiwgIktFWSIsICJHRlJFUSIsCisJIlNGUkVRIiwgIkdBVURJTyIsICJTQVVESU8iLCAiU1lOQyIsICJNQ0FQVFVSRSIsICJHTUJVRiIsICJHVU5JVCIsCisJIkdDQVBUVVJFIiwgIlNDQVBUVVJFIiwgIlNQTEFZTU9ERSIsICJTV1JJVEVNT0RFIiwgIkdQTEFZSU5GTyIsCisJIlNNSUNST0NPREUiLCAiR1ZCSUZNVCIsICJTVkJJRk1UIiB9OworI2RlZmluZSBWNEwxX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDFfaW9jdGxzKQorCitzdGF0aWMgaW50IGJ0dHZfY29tbW9uX2lvY3RscyhzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBCVFRWX1ZFUlNJT046CisgICAgICAgICAgICAgICAgcmV0dXJuIEJUVFZfVkVSU0lPTl9DT0RFOworCisJLyogKioqICB2NGwxICAqKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJY2FzZSBWSURJT0NHRlJFUToKKwl7CisJCXVuc2lnbmVkIGxvbmcgKmZyZXEgPSBhcmc7CisJCSpmcmVxID0gYnR2LT5mcmVxOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTRlJFUToKKwl7CisJCXVuc2lnbmVkIGxvbmcgKmZyZXEgPSBhcmc7CisJCWRvd24oJmJ0di0+bG9jayk7CisJCWJ0di0+ZnJlcT0qZnJlcTsKKwkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixWSURJT0NTRlJFUSxmcmVxKTsKKwkJaWYgKGJ0di0+aGFzX21hdGNoYm94ICYmIGJ0di0+cmFkaW9fdXNlcikKKwkJCXRlYTU3NTdfc2V0X2ZyZXEoYnR2LCpmcmVxKTsKKwkJdXAoJmJ0di0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DR1RVTkVSOgorCXsKKwkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOworCisJCWlmIChVTlNFVCA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2LT50dW5lcikgLyogT25seSB0dW5lciAwICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RyY3B5KHYtPm5hbWUsICJUZWxldmlzaW9uIik7CisJCXYtPnJhbmdlbG93ICA9IDA7CisJCXYtPnJhbmdlaGlnaCA9IDB4N0ZGRkZGRkY7CisJCXYtPmZsYWdzICAgICA9IFZJREVPX1RVTkVSX1BBTHxWSURFT19UVU5FUl9OVFNDfFZJREVPX1RVTkVSX1NFQ0FNOworCQl2LT5tb2RlICAgICAgPSBidHYtPnR2bm9ybTsKKwkJdi0+c2lnbmFsICAgID0gKGJ0cmVhZChCVDg0OF9EU1RBVFVTKSZCVDg0OF9EU1RBVFVTX0hMT0MpID8gMHhGRkZGIDogMDsKKwkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixjbWQsdik7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ1NUVU5FUjoKKwl7CisJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKKworCQlpZiAodi0+dHVuZXIpIC8qIE9ubHkgdHVuZXIgMCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2LT5tb2RlID49IEJUVFZfVFZOT1JNUykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRvd24oJmJ0di0+bG9jayk7CisJCXNldF90dm5vcm0oYnR2LHYtPm1vZGUpOworCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LGNtZCx2KTsKKwkJdXAoJmJ0di0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworICAgICAgICBjYXNlIFZJRElPQ0dDSEFOOgorICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisJCXVuc2lnbmVkIGludCBjaGFubmVsID0gdi0+Y2hhbm5lbDsKKworICAgICAgICAgICAgICAgIGlmIChjaGFubmVsID49IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udmlkZW9faW5wdXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgdi0+dHVuZXJzPTA7CisgICAgICAgICAgICAgICAgdi0+ZmxhZ3MgPSBWSURFT19WQ19BVURJTzsKKyAgICAgICAgICAgICAgICB2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisgICAgICAgICAgICAgICAgdi0+bm9ybSA9IGJ0di0+dHZub3JtOworCQlpZiAoY2hhbm5lbCA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyKSAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHYtPm5hbWUsIlRlbGV2aXNpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPmZsYWdzfD1WSURFT19WQ19UVU5FUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPnR5cGU9VklERU9fVFlQRV9UVjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYtPnR1bmVycz0xOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbCA9PSBidHYtPnN2aHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSh2LT5uYW1lLCJTLVZpZGVvIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYodi0+bmFtZSwiQ29tcG9zaXRlJWQiLGNoYW5uZWwpOworCQl9CisJCXJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGNhc2UgVklESU9DU0NIQU46CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKwkJdW5zaWduZWQgaW50IGNoYW5uZWwgPSB2LT5jaGFubmVsOworCisJCWlmIChjaGFubmVsID49IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udmlkZW9faW5wdXRzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2LT5ub3JtID49IEJUVFZfVFZOT1JNUykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRvd24oJmJ0di0+bG9jayk7CisJCWlmIChjaGFubmVsID09IGJ0di0+aW5wdXQgJiYKKwkJICAgIHYtPm5vcm0gPT0gYnR2LT50dm5vcm0pIHsKKwkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwkJCXVwKCZidHYtPmxvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlidHYtPnR2bm9ybSA9IHYtPm5vcm07CisJCXNldF9pbnB1dChidHYsdi0+Y2hhbm5lbCk7CisJCXVwKCZidHYtPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKyAgICAgICAgY2FzZSBWSURJT0NHQVVESU86CisJeworCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CisKKwkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKKwkJc3RyY3B5KHYtPm5hbWUsIlRlbGV2aXNpb24iKTsKKwkJdi0+ZmxhZ3MgfD0gVklERU9fQVVESU9fTVVUQUJMRTsKKwkJdi0+bW9kZSAgPSBWSURFT19TT1VORF9NT05POworCisJCWRvd24oJmJ0di0+bG9jayk7CisJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsY21kLHYpOworCisJCS8qIGNhcmQgc3BlY2lmaWMgaG9va3MgKi8KKwkJaWYgKGJ0di0+YXVkaW9faG9vaykKKwkJCWJ0di0+YXVkaW9faG9vayhidHYsdiwwKTsKKworCQl1cCgmYnR2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU0FVRElPOgorCXsKKwkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOworCQl1bnNpZ25lZCBpbnQgYXVkaW8gPSB2LT5hdWRpbzsKKworCQlpZiAoYXVkaW8gPj0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb19pbnB1dHMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkb3duKCZidHYtPmxvY2spOworCQlhdWRpb19tdXgoYnR2LCAodi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSkgPyBBVURJT19NVVRFIDogQVVESU9fVU5NVVRFKTsKKwkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixjbWQsdik7CisKKwkJLyogY2FyZCBzcGVjaWZpYyBob29rcyAqLworCQlpZiAoYnR2LT5hdWRpb19ob29rKQorCQkJYnR2LT5hdWRpb19ob29rKGJ0dix2LDEpOworCisJCXVwKCZidHYtPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiAqKiogIHY0bDIgICoqKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwljYXNlIFZJRElPQ19FTlVNU1REOgorCXsKKwkJc3RydWN0IHY0bDJfc3RhbmRhcmQgKmUgPSBhcmc7CisJCXVuc2lnbmVkIGludCBpbmRleCA9IGUtPmluZGV4OworCisJCWlmIChpbmRleCA+PSBCVFRWX1RWTk9STVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdjRsMl92aWRlb19zdGRfY29uc3RydWN0KGUsIGJ0dHZfdHZub3Jtc1tlLT5pbmRleF0udjRsMl9pZCwKKwkJCQkJIGJ0dHZfdHZub3Jtc1tlLT5pbmRleF0ubmFtZSk7CisJCWUtPmluZGV4ID0gaW5kZXg7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19HX1NURDoKKwl7CisJCXY0bDJfc3RkX2lkICppZCA9IGFyZzsKKwkJKmlkID0gYnR0dl90dm5vcm1zW2J0di0+dHZub3JtXS52NGwyX2lkOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisJCXVuc2lnbmVkIGludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBCVFRWX1RWTk9STVM7IGkrKykKKwkJCWlmICgqaWQgJiBidHR2X3R2bm9ybXNbaV0udjRsMl9pZCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gQlRUVl9UVk5PUk1TKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZG93bigmYnR2LT5sb2NrKTsKKwkJc2V0X3R2bm9ybShidHYsaSk7CisJCWkyY192aWRpb2NzY2hhbihidHYpOworCQl1cCgmYnR2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1FVRVJZU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOworCisJCWlmIChidHJlYWQoQlQ4NDhfRFNUQVRVUykgJiBCVDg0OF9EU1RBVFVTX05VTUwpCisJCQkqaWQgPSBWNEwyX1NURF82MjVfNTA7CisJCWVsc2UKKwkJCSppZCA9IFY0TDJfU1REXzUyNV82MDsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgorCXsKKwkJc3RydWN0IHY0bDJfaW5wdXQgKmkgPSBhcmc7CisJCXVuc2lnbmVkIGludCBuOworCisJCW4gPSBpLT5pbmRleDsKKwkJaWYgKG4gPj0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS52aWRlb19pbnB1dHMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVtc2V0KGksMCxzaXplb2YoKmkpKTsKKwkJaS0+aW5kZXggICAgPSBuOworCQlpLT50eXBlICAgICA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisJCWktPmF1ZGlvc2V0ID0gMTsKKwkJaWYgKGktPmluZGV4ID09IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXIpIHsKKwkJCXNwcmludGYoaS0+bmFtZSwgIlRlbGV2aXNpb24iKTsKKwkJCWktPnR5cGUgID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOworCQkJaS0+dHVuZXIgPSAwOworCQl9IGVsc2UgaWYgKGktPmluZGV4ID09IGJ0di0+c3ZocykgeworCQkJc3ByaW50ZihpLT5uYW1lLCAiUy1WaWRlbyIpOworCQl9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpLT5uYW1lLCJDb21wb3NpdGUlZCIsaS0+aW5kZXgpOworCQl9CisJCWlmIChpLT5pbmRleCA9PSBidHYtPmlucHV0KSB7CisJCQlfX3UzMiBkc3RhdHVzID0gYnRyZWFkKEJUODQ4X0RTVEFUVVMpOworCQkJaWYgKDAgPT0gKGRzdGF0dXMgJiBCVDg0OF9EU1RBVFVTX1BSRVMpKQorCQkJCWktPnN0YXR1cyB8PSBWNEwyX0lOX1NUX05PX1NJR05BTDsKKwkJCWlmICgwID09IChkc3RhdHVzICYgQlQ4NDhfRFNUQVRVU19ITE9DKSkKKwkJCQlpLT5zdGF0dXMgfD0gVjRMMl9JTl9TVF9OT19IX0xPQ0s7CisJCX0KKwkJZm9yIChuID0gMDsgbiA8IEJUVFZfVFZOT1JNUzsgbisrKQorCQkJaS0+c3RkIHw9IGJ0dHZfdHZub3Jtc1tuXS52NGwyX2lkOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19JTlBVVDoKKwl7CisJCWludCAqaSA9IGFyZzsKKwkJKmkgPSBidHYtPmlucHV0OworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19JTlBVVDoKKwl7CisJCXVuc2lnbmVkIGludCAqaSA9IGFyZzsKKworCQlpZiAoKmkgPiBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnZpZGVvX2lucHV0cykKKwkJCXJldHVybiAtRUlOVkFMOworCQlkb3duKCZidHYtPmxvY2spOworCQlzZXRfaW5wdXQoYnR2LCppKTsKKwkJdXAoJmJ0di0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX0dfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKKworCQlpZiAoVU5TRVQgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoMCAhPSB0LT5pbmRleCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlkb3duKCZidHYtPmxvY2spOworCQltZW1zZXQodCwwLHNpemVvZigqdCkpOworCQlzdHJjcHkodC0+bmFtZSwgIlRlbGV2aXNpb24iKTsKKwkJdC0+dHlwZSAgICAgICA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCQl0LT5yYW5nZWhpZ2ggID0gMHhmZmZmZmZmZlVMOworCQl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTk9STTsKKwkJdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJCWlmIChidHJlYWQoQlQ4NDhfRFNUQVRVUykmQlQ4NDhfRFNUQVRVU19ITE9DKQorCQkJdC0+c2lnbmFsID0gMHhmZmZmOworCQl7CisJCQkvKiBIbW1tIC4uLiAqLworCQkJc3RydWN0IHZpZGVvX2F1ZGlvIHZhOworCQkJbWVtc2V0KCZ2YSwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19hdWRpbykpOworCQkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgVklESU9DR0FVRElPLCAmdmEpOworCQkJaWYgKGJ0di0+YXVkaW9faG9vaykKKwkJCQlidHYtPmF1ZGlvX2hvb2soYnR2LCZ2YSwwKTsKKwkJCWlmKHZhLm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pIHsKKwkJCQl0LT5hdWRtb2RlICAgICA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJCQkJdC0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJCQl9CisJCQlpZih2YS5tb2RlICYgVklERU9fU09VTkRfTEFORzEpIHsKKwkJCQl0LT5hdWRtb2RlICAgID0gVjRMMl9UVU5FUl9NT0RFX0xBTkcxOworCQkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMQorCQkJCQl8IFY0TDJfVFVORVJfU1VCX0xBTkcyOworCQkJfQorCQl9CisJCS8qIEZJWE1FOiBmaWxsIGNhcGFiaWxpdHkrYXVkbW9kZSAqLworCQl1cCgmYnR2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1NfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKKworCQlpZiAoVU5TRVQgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoMCAhPSB0LT5pbmRleCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlkb3duKCZidHYtPmxvY2spOworCQl7CisJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gdmE7CisJCQltZW1zZXQoJnZhLCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2F1ZGlvKSk7CisJCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBWSURJT0NHQVVESU8sICZ2YSk7CisJCQlpZiAodC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTU9OTykKKwkJCQl2YS5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKKwkJCWVsc2UgaWYgKHQtPmF1ZG1vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTykKKwkJCQl2YS5tb2RlID0gVklERU9fU09VTkRfU1RFUkVPOworCQkJZWxzZSBpZiAodC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTEFORzEpCisJCQkJdmEubW9kZSA9IFZJREVPX1NPVU5EX0xBTkcxOworCQkJZWxzZSBpZiAodC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTEFORzIpCisJCQkJdmEubW9kZSA9IFZJREVPX1NPVU5EX0xBTkcyOworCQkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgVklESU9DU0FVRElPLCAmdmEpOworCQkJaWYgKGJ0di0+YXVkaW9faG9vaykKKwkJCQlidHYtPmF1ZGlvX2hvb2soYnR2LCZ2YSwxKTsKKwkJfQorCQl1cCgmYnR2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6CisJeworCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CisKKwkJbWVtc2V0KGYsMCxzaXplb2YoKmYpKTsKKwkJZi0+dHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCQlmLT5mcmVxdWVuY3kgPSBidHYtPmZyZXE7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwl7CisJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKKworCQlpZiAodW5saWtlbHkoZi0+dHVuZXIgIT0gMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHVubGlrZWx5KGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRvd24oJmJ0di0+bG9jayk7CisJCWJ0di0+ZnJlcSA9IGYtPmZyZXF1ZW5jeTsKKwkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixWSURJT0NTRlJFUSwmYnR2LT5mcmVxKTsKKwkJaWYgKGJ0di0+aGFzX21hdGNoYm94ICYmIGJ0di0+cmFkaW9fdXNlcikKKwkJCXRlYTU3NTdfc2V0X2ZyZXEoYnR2LGJ0di0+ZnJlcSk7CisJCXVwKCZidHYtPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcmlmeV93aW5kb3coY29uc3Qgc3RydWN0IGJ0dHZfdHZub3JtICp0dm4sCisJCQkgc3RydWN0IHY0bDJfd2luZG93ICp3aW4sIGludCBmaXh1cCkKK3sKKwllbnVtIHY0bDJfZmllbGQgZmllbGQ7CisJaW50IG1heHcsIG1heGg7CisKKwlpZiAod2luLT53LndpZHRoICA8IDQ4IHx8IHdpbi0+dy5oZWlnaHQgPCAzMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHdpbi0+Y2xpcGNvdW50ID4gMjA0OCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmaWVsZCA9IHdpbi0+ZmllbGQ7CisJbWF4dyAgPSB0dm4tPnN3aWR0aDsKKwltYXhoICA9IHR2bi0+c2hlaWdodDsKKworCWlmIChWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCkgeworCQlmaWVsZCA9ICh3aW4tPncuaGVpZ2h0ID4gbWF4aC8yKQorCQkJPyBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQKKwkJCTogVjRMMl9GSUVMRF9UT1A7CisJfQorCXN3aXRjaCAoZmllbGQpIHsKKwljYXNlIFY0TDJfRklFTERfVE9QOgorCWNhc2UgVjRMMl9GSUVMRF9CT1RUT006CisJCW1heGggPSBtYXhoIC8gMjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghZml4dXAgJiYgKHdpbi0+dy53aWR0aCA+IG1heHcgfHwgd2luLT53LmhlaWdodCA+IG1heGgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3aW4tPncud2lkdGggPiBtYXh3KQorCQl3aW4tPncud2lkdGggPSBtYXh3OworCWlmICh3aW4tPncuaGVpZ2h0ID4gbWF4aCkKKwkJd2luLT53LmhlaWdodCA9IG1heGg7CisJd2luLT5maWVsZCA9IGZpZWxkOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldHVwX3dpbmRvdyhzdHJ1Y3QgYnR0dl9maCAqZmgsIHN0cnVjdCBidHR2ICpidHYsCisJCQlzdHJ1Y3QgdjRsMl93aW5kb3cgKndpbiwgaW50IGZpeHVwKQoreworCXN0cnVjdCB2NGwyX2NsaXAgKmNsaXBzID0gTlVMTDsKKwlpbnQgbixzaXplLHJldHZhbCA9IDA7CisKKwlpZiAoTlVMTCA9PSBmaC0+b3ZmbXQpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghKGZoLT5vdmZtdC0+ZmxhZ3MgJiBGT1JNQVRfRkxBR1NfUEFDS0VEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dmFsID0gdmVyaWZ5X3dpbmRvdygmYnR0dl90dm5vcm1zW2J0di0+dHZub3JtXSx3aW4sZml4dXApOworCWlmICgwICE9IHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIGNvcHkgY2xpcHMgIC0tICBsdWNraWx5IHY0bDEgKyB2NGwyIGFyZSBiaW5hcnkKKwkgICBjb21wYXRpYmxlIGhlcmUgLi4uKi8KKwluID0gd2luLT5jbGlwY291bnQ7CisJc2l6ZSA9IHNpemVvZigqY2xpcHMpKihuKzQpOworCWNsaXBzID0ga21hbGxvYyhzaXplLEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGNsaXBzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAobiA+IDApIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGNsaXBzLHdpbi0+Y2xpcHMsc2l6ZW9mKHN0cnVjdCB2NGwyX2NsaXApKm4pKSB7CisJCQlrZnJlZShjbGlwcyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwkvKiBjbGlwIGFnYWluc3Qgc2NyZWVuICovCisJaWYgKE5VTEwgIT0gYnR2LT5mYnVmLmJhc2UpCisJCW4gPSBidGN4X3NjcmVlbl9jbGlwcyhidHYtPmZidWYuZm10LndpZHRoLCBidHYtPmZidWYuZm10LmhlaWdodCwKKwkJCQkgICAgICAmd2luLT53LCBjbGlwcywgbik7CisJYnRjeF9zb3J0X2NsaXBzKGNsaXBzLG4pOworCisJLyogNC1ieXRlIGFsaWdubWVudHMgKi8KKwlzd2l0Y2ggKGZoLT5vdmZtdC0+ZGVwdGgpIHsKKwljYXNlIDg6CisJY2FzZSAyNDoKKwkJYnRjeF9hbGlnbigmd2luLT53LCBjbGlwcywgbiwgMyk7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWJ0Y3hfYWxpZ24oJndpbi0+dywgY2xpcHMsIG4sIDEpOworCQlicmVhazsKKwljYXNlIDMyOgorCQkvKiBubyBhbGlnbm1lbnQgZml4dXBzIG5lZWRlZCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlkb3duKCZmaC0+Y2FwLmxvY2spOworCWlmIChmaC0+b3YuY2xpcHMpCisJCWtmcmVlKGZoLT5vdi5jbGlwcyk7CisJZmgtPm92LmNsaXBzICAgID0gY2xpcHM7CisJZmgtPm92Lm5jbGlwcyAgID0gbjsKKworCWZoLT5vdi53ICAgICAgICA9IHdpbi0+dzsKKwlmaC0+b3YuZmllbGQgICAgPSB3aW4tPmZpZWxkOworCWZoLT5vdi5zZXR1cF9vayA9IDE7CisJYnR2LT5pbml0Lm92Lncud2lkdGggICA9IHdpbi0+dy53aWR0aDsKKwlidHYtPmluaXQub3Yudy5oZWlnaHQgID0gd2luLT53LmhlaWdodDsKKwlidHYtPmluaXQub3YuZmllbGQgICAgID0gd2luLT5maWVsZDsKKworCS8qIHVwZGF0ZSBvdmVybGF5IGlmIG5lZWRlZCAqLworCXJldHZhbCA9IDA7CisJaWYgKGNoZWNrX2J0cmVzKGZoLCBSRVNPVVJDRV9PVkVSTEFZKSkgeworCQlzdHJ1Y3QgYnR0dl9idWZmZXIgKm5ldzsKKworCQluZXcgPSB2aWRlb2J1Zl9hbGxvYyhzaXplb2YoKm5ldykpOworCQlidHR2X292ZXJsYXlfcmlzYyhidHYsICZmaC0+b3YsIGZoLT5vdmZtdCwgbmV3KTsKKwkJcmV0dmFsID0gYnR0dl9zd2l0Y2hfb3ZlcmxheShidHYsZmgsbmV3KTsKKwl9CisJdXAoJmZoLT5jYXAubG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSogYnR0dl9xdWV1ZShzdHJ1Y3QgYnR0dl9maCAqZmgpCit7CisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlKiBxID0gTlVMTDsKKworCXN3aXRjaCAoZmgtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJcSA9ICZmaC0+Y2FwOworCQlicmVhazsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCXEgPSAmZmgtPnZiaTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCXJldHVybiBxOworfQorCitzdGF0aWMgaW50IGJ0dHZfcmVzb3VyY2Uoc3RydWN0IGJ0dHZfZmggKmZoKQoreworCWludCByZXMgPSAwOworCisJc3dpdGNoIChmaC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlyZXMgPSBSRVNPVVJDRV9WSURFTzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlyZXMgPSBSRVNPVVJDRV9WQkk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGJ0dHZfc3dpdGNoX3R5cGUoc3RydWN0IGJ0dHZfZmggKmZoLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEgPSBidHR2X3F1ZXVlKGZoKTsKKwlpbnQgcmVzID0gYnR0dl9yZXNvdXJjZShmaCk7CisKKwlpZiAoY2hlY2tfYnRyZXMoZmgscmVzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAodmlkZW9idWZfcXVldWVfaXNfYnVzeShxKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlmaC0+dHlwZSA9IHR5cGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnR0dl9nX2ZtdChzdHJ1Y3QgYnR0dl9maCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzd2l0Y2ggKGYtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJbWVtc2V0KCZmLT5mbXQucGl4LDAsc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKTsKKwkJZi0+Zm10LnBpeC53aWR0aCAgICAgICAgPSBmaC0+d2lkdGg7CisJCWYtPmZtdC5waXguaGVpZ2h0ICAgICAgID0gZmgtPmhlaWdodDsKKwkJZi0+Zm10LnBpeC5maWVsZCAgICAgICAgPSBmaC0+Y2FwLmZpZWxkOworCQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ICA9IGZoLT5mbXQtPmZvdXJjYzsKKwkJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPQorCQkJKGYtPmZtdC5waXgud2lkdGggKiBmaC0+Zm10LT5kZXB0aCkgPj4gMzsKKwkJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQkJZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCW1lbXNldCgmZi0+Zm10LndpbiwwLHNpemVvZihzdHJ1Y3QgdjRsMl93aW5kb3cpKTsKKwkJZi0+Zm10Lndpbi53ICAgICA9IGZoLT5vdi53OworCQlmLT5mbXQud2luLmZpZWxkID0gZmgtPm92LmZpZWxkOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCWJ0dHZfdmJpX2dldF9mbXQoZmgsZik7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBidHR2X3RyeV9mbXQoc3RydWN0IGJ0dHZfZmggKmZoLCBzdHJ1Y3QgYnR0diAqYnR2LAorCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN3aXRjaCAoZi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCXsKKwkJY29uc3Qgc3RydWN0IGJ0dHZfZm9ybWF0ICpmbXQ7CisJCWVudW0gdjRsMl9maWVsZCBmaWVsZDsKKwkJdW5zaWduZWQgaW50IG1heHcsbWF4aDsKKworCQlmbXQgPSBmb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworCQlpZiAoTlVMTCA9PSBmbXQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBmaXh1cCBmb3JtYXQgKi8KKwkJbWF4dyAgPSBidHR2X3R2bm9ybXNbYnR2LT50dm5vcm1dLnN3aWR0aDsKKwkJbWF4aCAgPSBidHR2X3R2bm9ybXNbYnR2LT50dm5vcm1dLnNoZWlnaHQ7CisJCWZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKwkJaWYgKFY0TDJfRklFTERfQU5ZID09IGZpZWxkKQorCQkJZmllbGQgPSAoZi0+Zm10LnBpeC5oZWlnaHQgPiBtYXhoLzIpCisJCQkJPyBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQKKwkJCQk6IFY0TDJfRklFTERfQk9UVE9NOworCQlpZiAoVjRMMl9GSUVMRF9TRVFfQlQgPT0gZmllbGQpCisJCQlmaWVsZCA9IFY0TDJfRklFTERfU0VRX1RCOworCQlzd2l0Y2ggKGZpZWxkKSB7CisJCWNhc2UgVjRMMl9GSUVMRF9UT1A6CisJCWNhc2UgVjRMMl9GSUVMRF9CT1RUT006CisJCWNhc2UgVjRMMl9GSUVMRF9BTFRFUk5BVEU6CisJCQltYXhoID0gbWF4aC8yOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOgorCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9GSUVMRF9TRVFfVEI6CisJCQlpZiAoZm10LT5mbGFncyAmIEZPUk1BVF9GTEFHU19QTEFOQVIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogdXBkYXRlIGRhdGEgZm9yIHRoZSBhcHBsaWNhdGlvbiAqLworCQlmLT5mbXQucGl4LmZpZWxkID0gZmllbGQ7CisJCWlmIChmLT5mbXQucGl4LndpZHRoICA8IDQ4KQorCQkJZi0+Zm10LnBpeC53aWR0aCAgPSA0ODsKKwkJaWYgKGYtPmZtdC5waXguaGVpZ2h0IDwgMzIpCisJCQlmLT5mbXQucGl4LmhlaWdodCA9IDMyOworCQlpZiAoZi0+Zm10LnBpeC53aWR0aCAgPiBtYXh3KQorCQkJZi0+Zm10LnBpeC53aWR0aCA9IG1heHc7CisJCWlmIChmLT5mbXQucGl4LmhlaWdodCA+IG1heGgpCisJCQlmLT5mbXQucGl4LmhlaWdodCA9IG1heGg7CisJCWYtPmZtdC5waXgud2lkdGggJj0gfjB4MDM7CisJCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0KKwkJCShmLT5mbXQucGl4LndpZHRoICogZm10LT5kZXB0aCkgPj4gMzsKKwkJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQkJZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCXJldHVybiB2ZXJpZnlfd2luZG93KCZidHR2X3R2bm9ybXNbYnR2LT50dm5vcm1dLAorCQkJCSAgICAgJmYtPmZtdC53aW4sIDEpOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRToKKwkJYnR0dl92YmlfdHJ5X2ZtdChmaCxmKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IGJ0dHZfc19mbXQoc3RydWN0IGJ0dHZfZmggKmZoLCBzdHJ1Y3QgYnR0diAqYnR2LAorCQkgICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJaW50IHJldHZhbDsKKworCXN3aXRjaCAoZi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCXsKKwkJY29uc3Qgc3RydWN0IGJ0dHZfZm9ybWF0ICpmbXQ7CisKKwkJcmV0dmFsID0gYnR0dl9zd2l0Y2hfdHlwZShmaCxmLT50eXBlKTsKKwkJaWYgKDAgIT0gcmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJcmV0dmFsID0gYnR0dl90cnlfZm10KGZoLGJ0dixmKTsKKwkJaWYgKDAgIT0gcmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKworCQkvKiB1cGRhdGUgb3VyIHN0YXRlIGluZm9ybWF0aW9ucyAqLworCQlkb3duKCZmaC0+Y2FwLmxvY2spOworCQlmaC0+Zm10ICAgICAgICAgICAgICA9IGZtdDsKKwkJZmgtPmNhcC5maWVsZCAgICAgICAgPSBmLT5mbXQucGl4LmZpZWxkOworCQlmaC0+Y2FwLmxhc3QgICAgICAgICA9IFY0TDJfRklFTERfTk9ORTsKKwkJZmgtPndpZHRoICAgICAgICAgICAgPSBmLT5mbXQucGl4LndpZHRoOworCQlmaC0+aGVpZ2h0ICAgICAgICAgICA9IGYtPmZtdC5waXguaGVpZ2h0OworCQlidHYtPmluaXQuZm10ICAgICAgICA9IGZtdDsKKwkJYnR2LT5pbml0LndpZHRoICAgICAgPSBmLT5mbXQucGl4LndpZHRoOworCQlidHYtPmluaXQuaGVpZ2h0ICAgICA9IGYtPmZtdC5waXguaGVpZ2h0OworCQl1cCgmZmgtPmNhcC5sb2NrKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCXJldHVybiBzZXR1cF93aW5kb3coZmgsIGJ0diwgJmYtPmZtdC53aW4sIDEpOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRToKKwkJcmV0dmFsID0gYnR0dl9zd2l0Y2hfdHlwZShmaCxmLT50eXBlKTsKKwkJaWYgKDAgIT0gcmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKGxvY2tlZF9idHJlcyhmaC0+YnR2LCBSRVNPVVJDRV9WQkkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKwkJYnR0dl92YmlfdHJ5X2ZtdChmaCxmKTsKKwkJYnR0dl92Ymlfc2V0bGluZXMoZmgsYnR2LGYtPmZtdC52YmkuY291bnRbMF0pOworCQlidHR2X3ZiaV9nZXRfZm10KGZoLGYpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYnR0dl9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IGJ0dHZfZmggKmZoICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYnR0diAgICAqYnR2ID0gZmgtPmJ0djsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWwgPSAwOworCisJaWYgKGJ0dHZfZGVidWcgPiAxKSB7CisJCXN3aXRjaCAoX0lPQ19UWVBFKGNtZCkpIHsKKwkJY2FzZSAndic6CisJCQlwcmludGsoImJ0dHYlZDogaW9jdGwgMHgleCAodjRsMSwgVklESU9DJXMpXG4iLAorCQkJICAgICAgIGJ0di0+Yy5uciwgY21kLCAoX0lPQ19OUihjbWQpIDwgVjRMMV9JT0NUTFMpID8KKwkJCSAgICAgICB2NGwxX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIj8/PyIpOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJcHJpbnRrKCJidHR2JWQ6IGlvY3RsIDB4JXggKHY0bDIsICVzKVxuIiwKKwkJCSAgICAgICBidHYtPmMubnIsIGNtZCwgIHY0bDJfaW9jdGxfbmFtZXNbX0lPQ19OUihjbWQpXSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiYnR0diVkOiBpb2N0bCAweCV4ICg/Pz8pXG4iLAorCQkJICAgICAgIGJ0di0+Yy5uciwgY21kKTsKKwkJfQorCX0KKwlpZiAoYnR2LT5lcnJvcnMpCisJCWJ0dHZfcmVpbml0X2J0ODQ4KGJ0dik7CisKKwlzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIFZJRElPQ1NGUkVROgorICAgICAgICBjYXNlIFZJRElPQ1NUVU5FUjoKKyAgICAgICAgY2FzZSBWSURJT0NTQ0hBTjoKKwljYXNlIFZJRElPQ19TX0NUUkw6CisJY2FzZSBWSURJT0NfU19TVEQ6CisJY2FzZSBWSURJT0NfU19JTlBVVDoKKwljYXNlIFZJRElPQ19TX1RVTkVSOgorCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgorCQlyZXR2YWwgPSB2NGwyX3ByaW9fY2hlY2soJmJ0di0+cHJpbywmZmgtPnByaW8pOworCQlpZiAoMCAhPSByZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCisJLyogKioqICB2NGwxICAqKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJY2FzZSBWSURJT0NHQ0FQOgorCXsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqY2FwID0gYXJnOworCisJCW1lbXNldChjYXAsMCxzaXplb2YoKmNhcCkpOworICAgICAgICAgICAgICAgIHN0cmNweShjYXAtPm5hbWUsYnR2LT52aWRlb19kZXYtPm5hbWUpOworCQlpZiAoVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSA9PSBmaC0+dHlwZSkgeworCQkJLyogdmJpICovCisJCQljYXAtPnR5cGUgPSBWSURfVFlQRV9UVU5FUnxWSURfVFlQRV9URUxFVEVYVDsKKwkJfSBlbHNlIHsKKwkJCS8qIG90aGVycyAqLworCQkJY2FwLT50eXBlID0gVklEX1RZUEVfQ0FQVFVSRXwKKwkJCQlWSURfVFlQRV9UVU5FUnwKKwkJCQlWSURfVFlQRV9PVkVSTEFZfAorCQkJCVZJRF9UWVBFX0NMSVBQSU5HfAorCQkJCVZJRF9UWVBFX1NDQUxFUzsKKwkJCWNhcC0+bWF4d2lkdGggID0gYnR0dl90dm5vcm1zW2J0di0+dHZub3JtXS5zd2lkdGg7CisJCQljYXAtPm1heGhlaWdodCA9IGJ0dHZfdHZub3Jtc1tidHYtPnR2bm9ybV0uc2hlaWdodDsKKwkJCWNhcC0+bWlud2lkdGggID0gNDg7CisJCQljYXAtPm1pbmhlaWdodCA9IDMyOworCQl9CisJCWNhcC0+Y2hhbm5lbHMgID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS52aWRlb19pbnB1dHM7CisJCWNhcC0+YXVkaW9zICAgID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb19pbnB1dHM7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NHUElDVDoKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwaWMgPSBhcmc7CisKKwkJbWVtc2V0KHBpYywwLHNpemVvZigqcGljKSk7CisJCXBpYy0+YnJpZ2h0bmVzcyA9IGJ0di0+YnJpZ2h0OworCQlwaWMtPmNvbnRyYXN0ICAgPSBidHYtPmNvbnRyYXN0OworCQlwaWMtPmh1ZSAgICAgICAgPSBidHYtPmh1ZTsKKwkJcGljLT5jb2xvdXIgICAgID0gYnR2LT5zYXR1cmF0aW9uOworCQlpZiAoZmgtPmZtdCkgeworCQkJcGljLT5kZXB0aCAgID0gZmgtPmZtdC0+ZGVwdGg7CisJCQlwaWMtPnBhbGV0dGUgPSBmaC0+Zm10LT5wYWxldHRlOworCQl9CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ1NQSUNUOgorCXsKKwkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnBpYyA9IGFyZzsKKwkJY29uc3Qgc3RydWN0IGJ0dHZfZm9ybWF0ICpmbXQ7CisKKwkJZm10ID0gZm9ybWF0X2J5X3BhbGV0dGUocGljLT5wYWxldHRlKTsKKwkJaWYgKE5VTEwgPT0gZm10KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRvd24oJmZoLT5jYXAubG9jayk7CisJCWlmIChmbXQtPmRlcHRoICE9IHBpYy0+ZGVwdGgpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIGZoX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisJCWZoLT5vdmZtdCAgID0gZm10OworCQlmaC0+Zm10ICAgICA9IGZtdDsKKwkJYnR2LT5pbml0Lm92Zm10ICAgPSBmbXQ7CisJCWJ0di0+aW5pdC5mbXQgICAgID0gZm10OworCQlpZiAoYmlnZW5kaWFuKSB7CisJCQkvKiBkaXJ0eSBoYWNrIHRpbWU6ICBzd2FwIGJ5dGVzIGZvciBvdmVybGF5IGlmIHRoZQorCQkJICAgZGlzcGxheSBhZGFwdG9yIGlzIGJpZyBlbmRpYW4gKGluc21vZCBvcHRpb24pICovCisJCQlpZiAoZm10LT5wYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkdCNTU1IHx8CisJCQkgICAgZm10LT5wYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkdCNTY1IHx8CisJCQkgICAgZm10LT5wYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkdCMzIpIHsKKwkJCQlmaC0+b3ZmbXQgPSBmbXQrMTsKKwkJCX0KKwkJfQorCQlidDg0OF9icmlnaHQoYnR2LHBpYy0+YnJpZ2h0bmVzcyk7CisJCWJ0ODQ4X2NvbnRyYXN0KGJ0dixwaWMtPmNvbnRyYXN0KTsKKwkJYnQ4NDhfaHVlKGJ0dixwaWMtPmh1ZSk7CisJCWJ0ODQ4X3NhdChidHYscGljLT5jb2xvdXIpOworCQl1cCgmZmgtPmNhcC5sb2NrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ0dXSU46CisJeworCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp3aW4gPSBhcmc7CisKKwkJbWVtc2V0KHdpbiwwLHNpemVvZigqd2luKSk7CisJCXdpbi0+eCAgICAgID0gZmgtPm92LncubGVmdDsKKwkJd2luLT55ICAgICAgPSBmaC0+b3Yudy50b3A7CisJCXdpbi0+d2lkdGggID0gZmgtPm92Lncud2lkdGg7CisJCXdpbi0+aGVpZ2h0ID0gZmgtPm92LncuaGVpZ2h0OworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTV0lOOgorCXsKKwkJc3RydWN0IHZpZGVvX3dpbmRvdyAqd2luID0gYXJnOworCQlzdHJ1Y3QgdjRsMl93aW5kb3cgdzI7CisKKwkJdzIuZmllbGQgPSBWNEwyX0ZJRUxEX0FOWTsKKwkJdzIudy5sZWZ0ICAgID0gd2luLT54OworCQl3Mi53LnRvcCAgICAgPSB3aW4tPnk7CisJCXcyLncud2lkdGggICA9IHdpbi0+d2lkdGg7CisJCXcyLncuaGVpZ2h0ICA9IHdpbi0+aGVpZ2h0OworCQl3Mi5jbGlwY291bnQgPSB3aW4tPmNsaXBjb3VudDsKKwkJdzIuY2xpcHMgICAgID0gKHN0cnVjdCB2NGwyX2NsaXAgX191c2VyICopd2luLT5jbGlwczsKKwkJcmV0dmFsID0gc2V0dXBfd2luZG93KGZoLCBidHYsICZ3MiwgMCk7CisJCWlmICgwID09IHJldHZhbCkgeworCQkJLyogb24gdjRsMSB0aGlzIGlvY3RsIGFmZmVjdHMgdGhlIHJlYWQoKSBzaXplIHRvbyAqLworCQkJZmgtPndpZHRoICA9IGZoLT5vdi53LndpZHRoOworCQkJZmgtPmhlaWdodCA9IGZoLT5vdi53LmhlaWdodDsKKwkJCWJ0di0+aW5pdC53aWR0aCAgPSBmaC0+b3Yudy53aWR0aDsKKwkJCWJ0di0+aW5pdC5oZWlnaHQgPSBmaC0+b3Yudy5oZWlnaHQ7CisJCX0KKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwljYXNlIFZJRElPQ0dGQlVGOgorCXsKKwkJc3RydWN0IHZpZGVvX2J1ZmZlciAqZmJ1ZiA9IGFyZzsKKworCQlmYnVmLT5iYXNlICAgICAgICAgID0gYnR2LT5mYnVmLmJhc2U7CisJCWZidWYtPndpZHRoICAgICAgICAgPSBidHYtPmZidWYuZm10LndpZHRoOworCQlmYnVmLT5oZWlnaHQgICAgICAgID0gYnR2LT5mYnVmLmZtdC5oZWlnaHQ7CisJCWZidWYtPmJ5dGVzcGVybGluZSAgPSBidHYtPmZidWYuZm10LmJ5dGVzcGVybGluZTsKKwkJaWYgKGZoLT5vdmZtdCkKKwkJCWZidWYtPmRlcHRoID0gZmgtPm92Zm10LT5kZXB0aDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU0ZCVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyICpmYnVmID0gYXJnOworCQljb25zdCBzdHJ1Y3QgYnR0dl9mb3JtYXQgKmZtdDsKKwkJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwkJaWYoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgJiYKKyAgICAgICAgICAgICAgICAgICAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisJCWVuZCA9ICh1bnNpZ25lZCBsb25nKWZidWYtPmJhc2UgKworCQkJZmJ1Zi0+aGVpZ2h0ICogZmJ1Zi0+Ynl0ZXNwZXJsaW5lOworCQlkb3duKCZmaC0+Y2FwLmxvY2spOworCQlyZXR2YWwgPSAtRUlOVkFMOworCisJCXN3aXRjaCAoZmJ1Zi0+ZGVwdGgpIHsKKwkJY2FzZSA4OgorCQkJZm10ID0gZm9ybWF0X2J5X3BhbGV0dGUoVklERU9fUEFMRVRURV9ISTI0MCk7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCWZtdCA9IGZvcm1hdF9ieV9wYWxldHRlKFZJREVPX1BBTEVUVEVfUkdCNTY1KTsKKwkJCWJyZWFrOworCQljYXNlIDI0OgorCQkJZm10ID0gZm9ybWF0X2J5X3BhbGV0dGUoVklERU9fUEFMRVRURV9SR0IyNCk7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCWZtdCA9IGZvcm1hdF9ieV9wYWxldHRlKFZJREVPX1BBTEVUVEVfUkdCMzIpOworCQkJYnJlYWs7CisJCWNhc2UgMTU6CisJCQlmYnVmLT5kZXB0aCA9IDE2OworCQkJZm10ID0gZm9ybWF0X2J5X3BhbGV0dGUoVklERU9fUEFMRVRURV9SR0I1NTUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmbXQgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKE5VTEwgPT0gZm10KQorCQkJZ290byBmaF91bmxvY2tfYW5kX3JldHVybjsKKworCQlmaC0+b3ZmbXQgPSBmbXQ7CisJCWZoLT5mbXQgICA9IGZtdDsKKwkJYnR2LT5pbml0Lm92Zm10ID0gZm10OworCQlidHYtPmluaXQuZm10ICAgPSBmbXQ7CisJCWJ0di0+ZmJ1Zi5iYXNlICAgICAgICAgICAgID0gZmJ1Zi0+YmFzZTsKKwkJYnR2LT5mYnVmLmZtdC53aWR0aCAgICAgICAgPSBmYnVmLT53aWR0aDsKKwkJYnR2LT5mYnVmLmZtdC5oZWlnaHQgICAgICAgPSBmYnVmLT5oZWlnaHQ7CisJCWlmIChmYnVmLT5ieXRlc3BlcmxpbmUpCisJCQlidHYtPmZidWYuZm10LmJ5dGVzcGVybGluZSA9IGZidWYtPmJ5dGVzcGVybGluZTsKKwkJZWxzZQorCQkJYnR2LT5mYnVmLmZtdC5ieXRlc3BlcmxpbmUgPSBidHYtPmZidWYuZm10LndpZHRoKmZidWYtPmRlcHRoLzg7CisJCXVwKCZmaC0+Y2FwLmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ0NBUFRVUkU6CisJY2FzZSBWSURJT0NfT1ZFUkxBWToKKwl7CisJCXN0cnVjdCBidHR2X2J1ZmZlciAqbmV3OworCQlpbnQgKm9uID0gYXJnOworCisJCWlmICgqb24pIHsKKwkJCS8qIHZlcmlmeSBhcmdzICovCisJCQlpZiAoTlVMTCA9PSBidHYtPmZidWYuYmFzZSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghZmgtPm92LnNldHVwX29rKSB7CisJCQkJZHByaW50aygiYnR0diVkOiBvdmVybGF5OiAhc2V0dXBfb2tcbiIsYnR2LT5jLm5yKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCisJCWlmICghY2hlY2tfYWxsb2NfYnRyZXMoYnR2LGZoLFJFU09VUkNFX09WRVJMQVkpKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlkb3duKCZmaC0+Y2FwLmxvY2spOworCQlpZiAoKm9uKSB7CisJCQlmaC0+b3YudHZub3JtID0gYnR2LT50dm5vcm07CisJCQluZXcgPSB2aWRlb2J1Zl9hbGxvYyhzaXplb2YoKm5ldykpOworCQkJYnR0dl9vdmVybGF5X3Jpc2MoYnR2LCAmZmgtPm92LCBmaC0+b3ZmbXQsIG5ldyk7CisJCX0gZWxzZSB7CisJCQluZXcgPSBOVUxMOworCQl9CisKKwkJLyogc3dpdGNoIG92ZXIgKi8KKwkgICAgICAgIHJldHZhbCA9IGJ0dHZfc3dpdGNoX292ZXJsYXkoYnR2LGZoLG5ldyk7CisJCXVwKCZmaC0+Y2FwLmxvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWNhc2UgVklESU9DR01CVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqbWJ1ZiA9IGFyZzsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJZG93bigmZmgtPmNhcC5sb2NrKTsKKwkJcmV0dmFsID0gdmlkZW9idWZfbW1hcF9zZXR1cCgmZmgtPmNhcCxnYnVmZmVycyxnYnVmc2l6ZSwKKwkJCQkJICAgICBWNEwyX01FTU9SWV9NTUFQKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlnb3RvIGZoX3VubG9ja19hbmRfcmV0dXJuOworCQltZW1zZXQobWJ1ZiwwLHNpemVvZigqbWJ1ZikpOworCQltYnVmLT5mcmFtZXMgPSBnYnVmZmVyczsKKwkJbWJ1Zi0+c2l6ZSAgID0gZ2J1ZmZlcnMgKiBnYnVmc2l6ZTsKKwkJZm9yIChpID0gMDsgaSA8IGdidWZmZXJzOyBpKyspCisJCQltYnVmLT5vZmZzZXRzW2ldID0gaSAqIGdidWZzaXplOworCQl1cCgmZmgtPmNhcC5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DTUNBUFRVUkU6CisJeworCQlzdHJ1Y3QgdmlkZW9fbW1hcCAqdm0gPSBhcmc7CisJCXN0cnVjdCBidHR2X2J1ZmZlciAqYnVmOworCQllbnVtIHY0bDJfZmllbGQgZmllbGQ7CisKKwkJaWYgKHZtLT5mcmFtZSA+PSBWSURFT19NQVhfRlJBTUUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkb3duKCZmaC0+Y2FwLmxvY2spOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlidWYgPSAoc3RydWN0IGJ0dHZfYnVmZmVyICopZmgtPmNhcC5idWZzW3ZtLT5mcmFtZV07CisJCWlmIChOVUxMID09IGJ1ZikKKwkJCWdvdG8gZmhfdW5sb2NrX2FuZF9yZXR1cm47CisJCWlmICgwID09IGJ1Zi0+dmIuYmFkZHIpCisJCQlnb3RvIGZoX3VubG9ja19hbmRfcmV0dXJuOworCQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBTVEFURV9RVUVVRUQgfHwKKwkJICAgIGJ1Zi0+dmIuc3RhdGUgPT0gU1RBVEVfQUNUSVZFKQorCQkJZ290byBmaF91bmxvY2tfYW5kX3JldHVybjsKKworCQlmaWVsZCA9ICh2bS0+aGVpZ2h0ID4gYnR0dl90dm5vcm1zW2J0di0+dHZub3JtXS5zaGVpZ2h0LzIpCisJCQk/IFY0TDJfRklFTERfSU5URVJMQUNFRAorCQkJOiBWNEwyX0ZJRUxEX0JPVFRPTTsKKwkJcmV0dmFsID0gYnR0dl9wcmVwYXJlX2J1ZmZlcihidHYsYnVmLAorCQkJCQkgICAgIGZvcm1hdF9ieV9wYWxldHRlKHZtLT5mb3JtYXQpLAorCQkJCQkgICAgIHZtLT53aWR0aCx2bS0+aGVpZ2h0LGZpZWxkKTsKKwkJaWYgKDAgIT0gcmV0dmFsKQorCQkJZ290byBmaF91bmxvY2tfYW5kX3JldHVybjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJ0di0+c19sb2NrLGZsYWdzKTsKKwkJYnVmZmVyX3F1ZXVlKCZmaC0+Y2FwLCZidWYtPnZiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOworCQl1cCgmZmgtPmNhcC5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU1lOQzoKKwl7CisJCWludCAqZnJhbWUgPSBhcmc7CisJCXN0cnVjdCBidHR2X2J1ZmZlciAqYnVmOworCisJCWlmICgqZnJhbWUgPj0gVklERU9fTUFYX0ZSQU1FKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZG93bigmZmgtPmNhcC5sb2NrKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJYnVmID0gKHN0cnVjdCBidHR2X2J1ZmZlciAqKWZoLT5jYXAuYnVmc1sqZnJhbWVdOworCQlpZiAoTlVMTCA9PSBidWYpCisJCQlnb3RvIGZoX3VubG9ja19hbmRfcmV0dXJuOworCQlyZXR2YWwgPSB2aWRlb2J1Zl93YWl0b24oJmJ1Zi0+dmIsMCwxKTsKKwkJaWYgKDAgIT0gcmV0dmFsKQorCQkJZ290byBmaF91bmxvY2tfYW5kX3JldHVybjsKKwkJc3dpdGNoIChidWYtPnZiLnN0YXRlKSB7CisJCWNhc2UgU1RBVEVfRVJST1I6CisJCQlyZXR2YWwgPSAtRUlPOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgU1RBVEVfRE9ORToKKwkJCXZpZGVvYnVmX2RtYV9wY2lfc3luYyhidHYtPmMucGNpLCZidWYtPnZiLmRtYSk7CisJCQlidHR2X2RtYV9mcmVlKGJ0dixidWYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJdXAoJmZoLT5jYXAubG9jayk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJY2FzZSBWSURJT0NHVkJJRk1UOgorCXsKKwkJc3RydWN0IHZiaV9mb3JtYXQgKmZtdCA9ICh2b2lkICopIGFyZzsKKwkJc3RydWN0IHY0bDJfZm9ybWF0IGZtdDI7CisKKwkJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUpIHsKKwkJCXJldHZhbCA9IGJ0dHZfc3dpdGNoX3R5cGUoZmgsVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSk7CisJCQlpZiAoMCAhPSByZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlidHR2X3ZiaV9nZXRfZm10KGZoLCAmZm10Mik7CisKKwkJbWVtc2V0KGZtdCwwLHNpemVvZigqZm10KSk7CisJCWZtdC0+c2FtcGxpbmdfcmF0ZSAgICA9IGZtdDIuZm10LnZiaS5zYW1wbGluZ19yYXRlOworCQlmbXQtPnNhbXBsZXNfcGVyX2xpbmUgPSBmbXQyLmZtdC52Ymkuc2FtcGxlc19wZXJfbGluZTsKKwkJZm10LT5zYW1wbGVfZm9ybWF0ICAgID0gVklERU9fUEFMRVRURV9SQVc7CisJCWZtdC0+c3RhcnRbMF0gICAgICAgICA9IGZtdDIuZm10LnZiaS5zdGFydFswXTsKKwkJZm10LT5jb3VudFswXSAgICAgICAgID0gZm10Mi5mbXQudmJpLmNvdW50WzBdOworCQlmbXQtPnN0YXJ0WzFdICAgICAgICAgPSBmbXQyLmZtdC52Ymkuc3RhcnRbMV07CisJCWZtdC0+Y291bnRbMV0gICAgICAgICA9IGZtdDIuZm10LnZiaS5jb3VudFsxXTsKKwkJaWYgKGZtdDIuZm10LnZiaS5mbGFncyAmIFZCSV9VTlNZTkMpCisJCQlmbXQtPmZsYWdzICAgfD0gVjRMMl9WQklfVU5TWU5DOworCQlpZiAoZm10Mi5mbXQudmJpLmZsYWdzICYgVkJJX0lOVEVSTEFDRUQpCisJCQlmbXQtPmZsYWdzICAgfD0gVjRMMl9WQklfSU5URVJMQUNFRDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU1ZCSUZNVDoKKwl7CisJCXN0cnVjdCB2YmlfZm9ybWF0ICpmbXQgPSAodm9pZCAqKSBhcmc7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQyOworCisJCXJldHZhbCA9IGJ0dHZfc3dpdGNoX3R5cGUoZmgsVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSk7CisJCWlmICgwICE9IHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWJ0dHZfdmJpX2dldF9mbXQoZmgsICZmbXQyKTsKKworCQlpZiAoZm10LT5zYW1wbGluZ19yYXRlICAgICE9IGZtdDIuZm10LnZiaS5zYW1wbGluZ19yYXRlICAgICB8fAorCQkgICAgZm10LT5zYW1wbGVzX3Blcl9saW5lICE9IGZtdDIuZm10LnZiaS5zYW1wbGVzX3Blcl9saW5lICB8fAorCQkgICAgZm10LT5zYW1wbGVfZm9ybWF0ICAgICE9IFZJREVPX1BBTEVUVEVfUkFXICAgICAgICAgICAgICB8fAorCQkgICAgZm10LT5zdGFydFswXSAgICAgICAgICE9IGZtdDIuZm10LnZiaS5zdGFydFswXSAgICAgICAgICB8fAorCQkgICAgZm10LT5zdGFydFsxXSAgICAgICAgICE9IGZtdDIuZm10LnZiaS5zdGFydFsxXSAgICAgICAgICB8fAorCQkgICAgZm10LT5jb3VudFswXSAgICAgICAgICE9IGZtdC0+Y291bnRbMV0gICAgICAgICAgICAgICAgICB8fAorCQkgICAgZm10LT5jb3VudFswXSAgICAgICAgIDwgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorCQkgICAgZm10LT5jb3VudFswXSAgICAgICAgID4gIDMyIC8qIFZCSV9NQVhMSU5FUyAqLykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWJ0dHZfdmJpX3NldGxpbmVzKGZoLGJ0dixmbXQtPmNvdW50WzBdKTsKKwkJcmV0dXJuIDA7CisJfQorCisgICAgICAgIGNhc2UgQlRUVl9WRVJTSU9OOgorICAgICAgICBjYXNlIFZJRElPQ0dGUkVROgorICAgICAgICBjYXNlIFZJRElPQ1NGUkVROgorICAgICAgICBjYXNlIFZJRElPQ0dUVU5FUjoKKyAgICAgICAgY2FzZSBWSURJT0NTVFVORVI6CisgICAgICAgIGNhc2UgVklESU9DR0NIQU46CisgICAgICAgIGNhc2UgVklESU9DU0NIQU46CisJY2FzZSBWSURJT0NHQVVESU86CisJY2FzZSBWSURJT0NTQVVESU86CisJCXJldHVybiBidHR2X2NvbW1vbl9pb2N0bHMoYnR2LGNtZCxhcmcpOworCisJLyogKioqICB2NGwyICAqKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJaWYgKDAgPT0gdjRsMikKKwkJCXJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHN0cmNweShjYXAtPmRyaXZlciwiYnR0diIpOworICAgICAgICAgICAgICAgIHN0cmxjcHkoY2FwLT5jYXJkLGJ0di0+dmlkZW9fZGV2LT5uYW1lLHNpemVvZihjYXAtPmNhcmQpKTsKKwkJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCJQQ0k6JXMiLHBjaV9uYW1lKGJ0di0+Yy5wY2kpKTsKKwkJY2FwLT52ZXJzaW9uID0gQlRUVl9WRVJTSU9OX0NPREU7CisJCWNhcC0+Y2FwYWJpbGl0aWVzID0KKwkJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorCQkJVjRMMl9DQVBfVklERU9fT1ZFUkxBWSB8CisJCQlWNEwyX0NBUF9WQklfQ0FQVFVSRSB8CisJCQlWNEwyX0NBUF9SRUFEV1JJVEUgfAorCQkJVjRMMl9DQVBfU1RSRUFNSU5HOworCQlpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lciAhPSBVTlNFVCAmJgorCQkgICAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lciAhPSBUVU5FUl9BQlNFTlQpCisJCQljYXAtPmNhcGFiaWxpdGllcyB8PSBWNEwyX0NBUF9UVU5FUjsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfRU5VTV9GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmID0gYXJnOworCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKwkJdW5zaWduZWQgaW50IGk7CisJCWludCBpbmRleDsKKworCQl0eXBlICA9IGYtPnR5cGU7CisJCWlmIChWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFID09IHR5cGUpIHsKKwkJCS8qIHZiaSAqLworCQkJaW5kZXggPSBmLT5pbmRleDsKKwkJCWlmICgwICE9IGluZGV4KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJbWVtc2V0KGYsMCxzaXplb2YoKmYpKTsKKwkJCWYtPmluZGV4ICAgICAgID0gaW5kZXg7CisJCQlmLT50eXBlICAgICAgICA9IHR5cGU7CisJCQlmLT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9HUkVZOworCQkJc3RyY3B5KGYtPmRlc2NyaXB0aW9uLCJ2YmkgZGF0YSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiB2aWRlbyBjYXB0dXJlICsgb3ZlcmxheSAqLworCQlpbmRleCA9IC0xOworCQlmb3IgKGkgPSAwOyBpIDwgQlRUVl9GT1JNQVRTOyBpKyspIHsKKwkJCWlmIChidHR2X2Zvcm1hdHNbaV0uZm91cmNjICE9IC0xKQorCQkJCWluZGV4Kys7CisJCQlpZiAoKHVuc2lnbmVkIGludClpbmRleCA9PSBmLT5pbmRleCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoQlRUVl9GT1JNQVRTID09IGkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKGYtPnR5cGUpIHsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCQlpZiAoIShidHR2X2Zvcm1hdHNbaV0uZmxhZ3MgJiBGT1JNQVRfRkxBR1NfUEFDS0VEKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbWVtc2V0KGYsMCxzaXplb2YoKmYpKTsKKwkJZi0+aW5kZXggICAgICAgPSBpbmRleDsKKwkJZi0+dHlwZSAgICAgICAgPSB0eXBlOworCQlmLT5waXhlbGZvcm1hdCA9IGJ0dHZfZm9ybWF0c1tpXS5mb3VyY2M7CisJCXN0cmxjcHkoZi0+ZGVzY3JpcHRpb24sYnR0dl9mb3JtYXRzW2ldLm5hbWUsc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX1RSWV9GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSBhcmc7CisJCXJldHVybiBidHR2X3RyeV9mbXQoZmgsYnR2LGYpOworCX0KKwljYXNlIFZJRElPQ19HX0ZNVDoKKwl7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZiA9IGFyZzsKKwkJcmV0dXJuIGJ0dHZfZ19mbXQoZmgsZik7CisJfQorCWNhc2UgVklESU9DX1NfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOworCQlyZXR1cm4gYnR0dl9zX2ZtdChmaCxidHYsZik7CisJfQorCisJY2FzZSBWSURJT0NfR19GQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKmZiID0gYXJnOworCisJCSpmYiA9IGJ0di0+ZmJ1ZjsKKwkJZmItPmNhcGFiaWxpdHkgPSBWNEwyX0ZCVUZfQ0FQX0xJU1RfQ0xJUFBJTkc7CisJCWlmIChmaC0+b3ZmbXQpCisJCQlmYi0+Zm10LnBpeGVsZm9ybWF0ICA9IGZoLT5vdmZtdC0+Zm91cmNjOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19GQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKmZiID0gYXJnOworCQljb25zdCBzdHJ1Y3QgYnR0dl9mb3JtYXQgKmZtdDsKKworCQlpZighY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJgorCQkgICAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJLyogY2hlY2sgYXJncyAqLworCQlmbXQgPSBmb3JtYXRfYnlfZm91cmNjKGZiLT5mbXQucGl4ZWxmb3JtYXQpOworCQlpZiAoTlVMTCA9PSBmbXQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKDAgPT0gKGZtdC0+ZmxhZ3MgJiBGT1JNQVRfRkxBR1NfUEFDS0VEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRvd24oJmZoLT5jYXAubG9jayk7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWlmIChmYi0+ZmxhZ3MgJiBWNEwyX0ZCVUZfRkxBR19PVkVSTEFZKSB7CisJCQlpZiAoZmItPmZtdC53aWR0aCA+IGJ0dHZfdHZub3Jtc1tidHYtPnR2bm9ybV0uc3dpZHRoKQorCQkJCWdvdG8gZmhfdW5sb2NrX2FuZF9yZXR1cm47CisJCQlpZiAoZmItPmZtdC5oZWlnaHQgPiBidHR2X3R2bm9ybXNbYnR2LT50dm5vcm1dLnNoZWlnaHQpCisJCQkJZ290byBmaF91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCisJCS8qIG9rLCBhY2NlcHQgaXQgKi8KKwkJYnR2LT5mYnVmLmJhc2UgICAgICAgPSBmYi0+YmFzZTsKKwkJYnR2LT5mYnVmLmZtdC53aWR0aCAgPSBmYi0+Zm10LndpZHRoOworCQlidHYtPmZidWYuZm10LmhlaWdodCA9IGZiLT5mbXQuaGVpZ2h0OworCQlpZiAoMCAhPSBmYi0+Zm10LmJ5dGVzcGVybGluZSkKKwkJCWJ0di0+ZmJ1Zi5mbXQuYnl0ZXNwZXJsaW5lID0gZmItPmZtdC5ieXRlc3BlcmxpbmU7CisJCWVsc2UKKwkJCWJ0di0+ZmJ1Zi5mbXQuYnl0ZXNwZXJsaW5lID0gYnR2LT5mYnVmLmZtdC53aWR0aCpmbXQtPmRlcHRoLzg7CisKKwkJcmV0dmFsID0gMDsKKwkJZmgtPm92Zm10ID0gZm10OworCQlidHYtPmluaXQub3ZmbXQgPSBmbXQ7CisJCWlmIChmYi0+ZmxhZ3MgJiBWNEwyX0ZCVUZfRkxBR19PVkVSTEFZKSB7CisJCQlmaC0+b3Yudy5sZWZ0ICAgPSAwOworCQkJZmgtPm92LncudG9wICAgID0gMDsKKwkJCWZoLT5vdi53LndpZHRoICA9IGZiLT5mbXQud2lkdGg7CisJCQlmaC0+b3Yudy5oZWlnaHQgPSBmYi0+Zm10LmhlaWdodDsKKwkJCWJ0di0+aW5pdC5vdi53LndpZHRoICA9IGZiLT5mbXQud2lkdGg7CisJCQlidHYtPmluaXQub3Yudy5oZWlnaHQgPSBmYi0+Zm10LmhlaWdodDsKKwkJCWlmIChmaC0+b3YuY2xpcHMpCisJCQkJa2ZyZWUoZmgtPm92LmNsaXBzKTsKKwkJCWZoLT5vdi5jbGlwcyA9IE5VTEw7CisJCQlmaC0+b3YubmNsaXBzID0gMDsKKworCQkJaWYgKGNoZWNrX2J0cmVzKGZoLCBSRVNPVVJDRV9PVkVSTEFZKSkgeworCQkJCXN0cnVjdCBidHR2X2J1ZmZlciAqbmV3OworCisJCQkJbmV3ID0gdmlkZW9idWZfYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKwkJCQlidHR2X292ZXJsYXlfcmlzYyhidHYsJmZoLT5vdixmaC0+b3ZmbXQsbmV3KTsKKwkJCQlyZXR2YWwgPSBidHR2X3N3aXRjaF9vdmVybGF5KGJ0dixmaCxuZXcpOworCQkJfQorCQl9CisJCXVwKCZmaC0+Y2FwLmxvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWNhc2UgVklESU9DX1JFUUJVRlM6CisJCXJldHVybiB2aWRlb2J1Zl9yZXFidWZzKGJ0dHZfcXVldWUoZmgpLGFyZyk7CisKKwljYXNlIFZJRElPQ19RVUVSWUJVRjoKKwkJcmV0dXJuIHZpZGVvYnVmX3F1ZXJ5YnVmKGJ0dHZfcXVldWUoZmgpLGFyZyk7CisKKwljYXNlIFZJRElPQ19RQlVGOgorCQlyZXR1cm4gdmlkZW9idWZfcWJ1ZihidHR2X3F1ZXVlKGZoKSxhcmcpOworCisJY2FzZSBWSURJT0NfRFFCVUY6CisJCXJldHVybiB2aWRlb2J1Zl9kcWJ1ZihidHR2X3F1ZXVlKGZoKSxhcmcsCisJCQkJICAgICAgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCisJY2FzZSBWSURJT0NfU1RSRUFNT046CisJeworCQlpbnQgcmVzID0gYnR0dl9yZXNvdXJjZShmaCk7CisKKwkJaWYgKCFjaGVja19hbGxvY19idHJlcyhidHYsZmgscmVzKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldHVybiB2aWRlb2J1Zl9zdHJlYW1vbihidHR2X3F1ZXVlKGZoKSk7CisJfQorCWNhc2UgVklESU9DX1NUUkVBTU9GRjoKKwl7CisJCWludCByZXMgPSBidHR2X3Jlc291cmNlKGZoKTsKKworCQlyZXR2YWwgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoYnR0dl9xdWV1ZShmaCkpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJCWZyZWVfYnRyZXMoYnR2LGZoLHJlcyk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYyA9IGFyZzsKKwkJaW50IGk7CisKKwkJaWYgKChjLT5pZCA8ICBWNEwyX0NJRF9CQVNFIHx8CisJCSAgICAgYy0+aWQgPj0gVjRMMl9DSURfTEFTVFAxKSAmJgorCQkgICAgKGMtPmlkIDwgIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSB8fAorCQkgICAgIGMtPmlkID49IFY0TDJfQ0lEX1BSSVZBVEVfTEFTVFAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmb3IgKGkgPSAwOyBpIDwgQlRUVl9DVExTOyBpKyspCisJCQlpZiAoYnR0dl9jdGxzW2ldLmlkID09IGMtPmlkKQorCQkJCWJyZWFrOworCQlpZiAoaSA9PSBCVFRWX0NUTFMpIHsKKwkJCSpjID0gbm9fY3RsOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKmMgPSBidHR2X2N0bHNbaV07CisJCWlmIChpID49IDQgJiYgaSA8PSA4KSB7CisJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gdmE7CisJCQltZW1zZXQoJnZhLDAsc2l6ZW9mKHZhKSk7CisJCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBWSURJT0NHQVVESU8sICZ2YSk7CisJCQlpZiAoYnR2LT5hdWRpb19ob29rKQorCQkJCWJ0di0+YXVkaW9faG9vayhidHYsJnZhLDApOworCQkJc3dpdGNoIChidHR2X2N0bHNbaV0uaWQpIHsKKwkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQkJCWlmICghKHZhLmZsYWdzICYgVklERU9fQVVESU9fVk9MVU1FKSkKKwkJCQkJKmMgPSBub19jdGw7CisJCQkJYnJlYWs7CisJCQljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CisJCQkJaWYgKCEodmEuZmxhZ3MgJiBWSURFT19BVURJT19CQUxBTkNFKSkKKwkJCQkJKmMgPSBub19jdGw7CisJCQkJYnJlYWs7CisJCQljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CisJCQkJaWYgKCEodmEuZmxhZ3MgJiBWSURFT19BVURJT19CQVNTKSkKKwkJCQkJKmMgPSBub19jdGw7CisJCQkJYnJlYWs7CisJCQljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKKwkJCQlpZiAoISh2YS5mbGFncyAmIFZJREVPX0FVRElPX1RSRUJMRSkpCisJCQkJCSpjID0gbm9fY3RsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19HX0NUUkw6CisJCXJldHVybiBnZXRfY29udHJvbChidHYsYXJnKTsKKwljYXNlIFZJRElPQ19TX0NUUkw6CisJCXJldHVybiBzZXRfY29udHJvbChidHYsYXJnKTsKKwljYXNlIFZJRElPQ19HX1BBUk06CisJeworCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpwYXJtID0gYXJnOworCQlzdHJ1Y3QgdjRsMl9zdGFuZGFyZCBzOworCQlpZiAocGFybS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVtc2V0KHBhcm0sMCxzaXplb2YoKnBhcm0pKTsKKwkJdjRsMl92aWRlb19zdGRfY29uc3RydWN0KCZzLCBidHR2X3R2bm9ybXNbYnR2LT50dm5vcm1dLnY0bDJfaWQsCisJCQkJCSBidHR2X3R2bm9ybXNbYnR2LT50dm5vcm1dLm5hbWUpOworCQlwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lID0gcy5mcmFtZXBlcmlvZDsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfR19QUklPUklUWToKKwl7CisJCWVudW0gdjRsMl9wcmlvcml0eSAqcCA9IGFyZzsKKworCQkqcCA9IHY0bDJfcHJpb19tYXgoJmJ0di0+cHJpbyk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19TX1BSSU9SSVRZOgorCXsKKwkJZW51bSB2NGwyX3ByaW9yaXR5ICpwcmlvID0gYXJnOworCisJCXJldHVybiB2NGwyX3ByaW9fY2hhbmdlKCZidHYtPnByaW8sICZmaC0+cHJpbywgKnByaW8pOworCX0KKworCWNhc2UgVklESU9DX0VOVU1TVEQ6CisJY2FzZSBWSURJT0NfR19TVEQ6CisJY2FzZSBWSURJT0NfU19TVEQ6CisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgorCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJY2FzZSBWSURJT0NfU19JTlBVVDoKKwljYXNlIFZJRElPQ19HX1RVTkVSOgorCWNhc2UgVklESU9DX1NfVFVORVI6CisJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6CisJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CisJCXJldHVybiBidHR2X2NvbW1vbl9pb2N0bHMoYnR2LGNtZCxhcmcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7CisKKyBmaF91bmxvY2tfYW5kX3JldHVybjoKKwl1cCgmZmgtPmNhcC5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGJ0dHZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBidHR2X2ZoICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQlRUVl9WQklTSVpFOgorCQlidHR2X3N3aXRjaF90eXBlKGZoLFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUpOworCQlyZXR1cm4gZmgtPmxpbmVzICogMiAqIDIwNDg7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgYnR0dl9kb19pb2N0bCk7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBidHR2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBidHR2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChmaC0+YnR2LT5lcnJvcnMpCisJCWJ0dHZfcmVpbml0X2J0ODQ4KGZoLT5idHYpOworCWRwcmludGsoImJ0dHYlZDogcmVhZCBjb3VudD0lZCB0eXBlPSVzXG4iLAorCQlmaC0+YnR2LT5jLm5yLChpbnQpY291bnQsdjRsMl90eXBlX25hbWVzW2ZoLT50eXBlXSk7CisKKwlzd2l0Y2ggKGZoLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCWlmIChsb2NrZWRfYnRyZXMoZmgtPmJ0dixSRVNPVVJDRV9WSURFTykpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXR2YWwgPSB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPmNhcCwgZGF0YSwgY291bnQsIHBwb3MsCisJCQkJCSAgIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlpZiAoIWNoZWNrX2FsbG9jX2J0cmVzKGZoLT5idHYsZmgsUkVTT1VSQ0VfVkJJKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldHZhbCA9IHZpZGVvYnVmX3JlYWRfc3RyZWFtKCZmaC0+dmJpLCBkYXRhLCBjb3VudCwgcHBvcywgMSwKKwkJCQkJICAgICAgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBidHR2X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGJ0dHZfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBidHR2X2J1ZmZlciAqYnVmOworCWVudW0gdjRsMl9maWVsZCBmaWVsZDsKKworCWlmIChWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFID09IGZoLT50eXBlKSB7CisJCWlmICghY2hlY2tfYWxsb2NfYnRyZXMoZmgtPmJ0dixmaCxSRVNPVVJDRV9WQkkpKQorCQkJcmV0dXJuIFBPTExFUlI7CisJCXJldHVybiB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxlLCAmZmgtPnZiaSwgd2FpdCk7CisJfQorCisJaWYgKGNoZWNrX2J0cmVzKGZoLFJFU09VUkNFX1ZJREVPKSkgeworCQkvKiBzdHJlYW1pbmcgY2FwdHVyZSAqLworCQlpZiAobGlzdF9lbXB0eSgmZmgtPmNhcC5zdHJlYW0pKQorCQkJcmV0dXJuIFBPTExFUlI7CisJCWJ1ZiA9IGxpc3RfZW50cnkoZmgtPmNhcC5zdHJlYW0ubmV4dCxzdHJ1Y3QgYnR0dl9idWZmZXIsdmIuc3RyZWFtKTsKKwl9IGVsc2UgeworCQkvKiByZWFkKCkgY2FwdHVyZSAqLworCQlkb3duKCZmaC0+Y2FwLmxvY2spOworCQlpZiAoTlVMTCA9PSBmaC0+Y2FwLnJlYWRfYnVmKSB7CisJCQkvKiBuZWVkIHRvIGNhcHR1cmUgYSBuZXcgZnJhbWUgKi8KKwkJCWlmIChsb2NrZWRfYnRyZXMoZmgtPmJ0dixSRVNPVVJDRV9WSURFTykpIHsKKwkJCQl1cCgmZmgtPmNhcC5sb2NrKTsKKwkJCQlyZXR1cm4gUE9MTEVSUjsKKwkJCX0KKwkJCWZoLT5jYXAucmVhZF9idWYgPSB2aWRlb2J1Zl9hbGxvYyhmaC0+Y2FwLm1zaXplKTsKKwkJCWlmIChOVUxMID09IGZoLT5jYXAucmVhZF9idWYpIHsKKwkJCQl1cCgmZmgtPmNhcC5sb2NrKTsKKwkJCQlyZXR1cm4gUE9MTEVSUjsKKwkJCX0KKwkJCWZoLT5jYXAucmVhZF9idWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7CisJCQlmaWVsZCA9IHZpZGVvYnVmX25leHRfZmllbGQoJmZoLT5jYXApOworCQkJaWYgKDAgIT0gZmgtPmNhcC5vcHMtPmJ1Zl9wcmVwYXJlKCZmaC0+Y2FwLGZoLT5jYXAucmVhZF9idWYsZmllbGQpKSB7CisJCQkJdXAoJmZoLT5jYXAubG9jayk7CisJCQkJcmV0dXJuIFBPTExFUlI7CisJCQl9CisJCQlmaC0+Y2FwLm9wcy0+YnVmX3F1ZXVlKCZmaC0+Y2FwLGZoLT5jYXAucmVhZF9idWYpOworCQkJZmgtPmNhcC5yZWFkX29mZiA9IDA7CisJCX0KKwkJdXAoJmZoLT5jYXAubG9jayk7CisJCWJ1ZiA9IChzdHJ1Y3QgYnR0dl9idWZmZXIqKWZoLT5jYXAucmVhZF9idWY7CisJfQorCisJcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOworCWlmIChidWYtPnZiLnN0YXRlID09IFNUQVRFX0RPTkUgfHwKKwkgICAgYnVmLT52Yi5zdGF0ZSA9PSBTVEFURV9FUlJPUikKKwkJcmV0dXJuIFBPTExJTnxQT0xMUkROT1JNOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0dHZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBidHR2ICpidHYgPSBOVUxMOworCXN0cnVjdCBidHR2X2ZoICpmaDsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgImJ0dHY6IG9wZW4gbWlub3I9JWRcbiIsbWlub3IpOworCisJZm9yIChpID0gMDsgaSA8IGJ0dHZfbnVtOyBpKyspIHsKKwkJaWYgKGJ0dHZzW2ldLnZpZGVvX2RldiAmJgorCQkgICAgYnR0dnNbaV0udmlkZW9fZGV2LT5taW5vciA9PSBtaW5vcikgeworCQkJYnR2ID0gJmJ0dHZzW2ldOworCQkJdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChidHR2c1tpXS52YmlfZGV2ICYmCisJCSAgICBidHR2c1tpXS52YmlfZGV2LT5taW5vciA9PSBtaW5vcikgeworCQkJYnR2ID0gJmJ0dHZzW2ldOworCQkJdHlwZSA9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoTlVMTCA9PSBidHYpCisJCXJldHVybiAtRU5PREVWOworCisJZHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IG9wZW4gY2FsbGVkICh0eXBlPSVzKVxuIiwKKwkJYnR2LT5jLm5yLHY0bDJfdHlwZV9uYW1lc1t0eXBlXSk7CisKKwkvKiBhbGxvY2F0ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCisJZmggPSBrbWFsbG9jKHNpemVvZigqZmgpLEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGZoKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKKwkqZmggPSBidHYtPmluaXQ7CisJZmgtPnR5cGUgPSB0eXBlOworCWZoLT5vdi5zZXR1cF9vayA9IDA7CisJdjRsMl9wcmlvX29wZW4oJmJ0di0+cHJpbywmZmgtPnByaW8pOworCisJdmlkZW9idWZfcXVldWVfaW5pdCgmZmgtPmNhcCwgJmJ0dHZfdmlkZW9fcW9wcywKKwkJCSAgICBidHYtPmMucGNpLCAmYnR2LT5zX2xvY2ssCisJCQkgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkJICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGJ0dHZfYnVmZmVyKSwKKwkJCSAgICBmaCk7CisJdmlkZW9idWZfcXVldWVfaW5pdCgmZmgtPnZiaSwgJmJ0dHZfdmJpX3FvcHMsCisJCQkgICAgYnR2LT5jLnBjaSwgJmJ0di0+c19sb2NrLAorCQkJICAgIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUsCisJCQkgICAgVjRMMl9GSUVMRF9TRVFfVEIsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBidHR2X2J1ZmZlciksCisJCQkgICAgZmgpOworCWkyY192aWRpb2NzY2hhbihidHYpOworCisJYnR2LT51c2VycysrOworCWlmIChWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFID09IGZoLT50eXBlKQorCQlidHR2X3ZiaV9zZXRsaW5lcyhmaCxidHYsMTYpOworCWJ0dHZfZmllbGRfY291bnQoYnR2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHR2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGJ0dHZfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBidHR2ICpidHYgPSBmaC0+YnR2OworCisJLyogdHVybiBvZmYgb3ZlcmxheSAqLworCWlmIChjaGVja19idHJlcyhmaCwgUkVTT1VSQ0VfT1ZFUkxBWSkpCisJCWJ0dHZfc3dpdGNoX292ZXJsYXkoYnR2LGZoLE5VTEwpOworCisJLyogc3RvcCB2aWRlbyBjYXB0dXJlICovCisJaWYgKGNoZWNrX2J0cmVzKGZoLCBSRVNPVVJDRV9WSURFTykpIHsKKwkJdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+Y2FwKTsKKwkJZnJlZV9idHJlcyhidHYsZmgsUkVTT1VSQ0VfVklERU8pOworCX0KKwlpZiAoZmgtPmNhcC5yZWFkX2J1ZikgeworCQlidWZmZXJfcmVsZWFzZSgmZmgtPmNhcCxmaC0+Y2FwLnJlYWRfYnVmKTsKKwkJa2ZyZWUoZmgtPmNhcC5yZWFkX2J1Zik7CisJfQorCisJLyogc3RvcCB2YmkgY2FwdHVyZSAqLworCWlmIChjaGVja19idHJlcyhmaCwgUkVTT1VSQ0VfVkJJKSkgeworCQlpZiAoZmgtPnZiaS5zdHJlYW1pbmcpCisJCQl2aWRlb2J1Zl9zdHJlYW1vZmYoJmZoLT52YmkpOworCQlpZiAoZmgtPnZiaS5yZWFkaW5nKQorCQkJdmlkZW9idWZfcmVhZF9zdG9wKCZmaC0+dmJpKTsKKwkJZnJlZV9idHJlcyhidHYsZmgsUkVTT1VSQ0VfVkJJKTsKKwl9CisKKwkvKiBmcmVlIHN0dWZmICovCisJdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+Y2FwKTsKKwl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52YmkpOworCXY0bDJfcHJpb19jbG9zZSgmYnR2LT5wcmlvLCZmaC0+cHJpbyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlrZnJlZShmaCk7CisKKwlidHYtPnVzZXJzLS07CisJYnR0dl9maWVsZF9jb3VudChidHYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitidHR2X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBidHR2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWRwcmludGsoImJ0dHYlZDogbW1hcCB0eXBlPSVzIDB4JWx4KyVsZFxuIiwKKwkJZmgtPmJ0di0+Yy5uciwgdjRsMl90eXBlX25hbWVzW2ZoLT50eXBlXSwKKwkJdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KTsKKwlyZXR1cm4gdmlkZW9idWZfbW1hcF9tYXBwZXIoYnR0dl9xdWV1ZShmaCksdm1hKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYnR0dl9mb3BzID0KK3sKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSAgPSBidHR2X29wZW4sCisJLnJlbGVhc2UgID0gYnR0dl9yZWxlYXNlLAorCS5pb2N0bAkgID0gYnR0dl9pb2N0bCwKKwkubGxzZWVrCSAgPSBub19sbHNlZWssCisJLnJlYWQJICA9IGJ0dHZfcmVhZCwKKwkubW1hcAkgID0gYnR0dl9tbWFwLAorCS5wb2xsICAgICA9IGJ0dHZfcG9sbCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGJ0dHZfdmlkZW9fdGVtcGxhdGUgPQoreworCS5uYW1lICAgICA9ICJVTlNFVCIsCisJLnR5cGUgICAgID0gVklEX1RZUEVfQ0FQVFVSRXxWSURfVFlQRV9UVU5FUnxWSURfVFlQRV9PVkVSTEFZfAorCSAgICAgICAgICAgIFZJRF9UWVBFX0NMSVBQSU5HfFZJRF9UWVBFX1NDQUxFUywKKwkuaGFyZHdhcmUgPSBWSURfSEFSRFdBUkVfQlQ4NDgsCisJLmZvcHMgICAgID0gJmJ0dHZfZm9wcywKKwkubWlub3IgICAgPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGJ0dHZfdmJpX3RlbXBsYXRlID0KK3sKKwkubmFtZSAgICAgPSAiYnQ4NDgvODc4IHZiaSIsCisJLnR5cGUgICAgID0gVklEX1RZUEVfVFVORVJ8VklEX1RZUEVfVEVMRVRFWFQsCisJLmhhcmR3YXJlID0gVklEX0hBUkRXQVJFX0JUODQ4LAorCS5mb3BzICAgICA9ICZidHR2X2ZvcHMsCisJLm1pbm9yICAgID0gLTEsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogcmFkaW8gaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGludCByYWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGJ0dHYgKmJ0diA9IE5VTEw7CisJdW5zaWduZWQgaW50IGk7CisKKwlkcHJpbnRrKCJidHR2OiBvcGVuIG1pbm9yPSVkXG4iLG1pbm9yKTsKKworCWZvciAoaSA9IDA7IGkgPCBidHR2X251bTsgaSsrKSB7CisJCWlmIChidHR2c1tpXS5yYWRpb19kZXYtPm1pbm9yID09IG1pbm9yKSB7CisJCQlidHYgPSAmYnR0dnNbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoTlVMTCA9PSBidHYpCisJCXJldHVybiAtRU5PREVWOworCisJZHByaW50aygiYnR0diVkOiBvcGVuIGNhbGxlZCAocmFkaW8pXG4iLGJ0di0+Yy5ucik7CisJZG93bigmYnR2LT5sb2NrKTsKKwlpZiAoYnR2LT5yYWRpb191c2VyKSB7CisJCXVwKCZidHYtPmxvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlidHYtPnJhZGlvX3VzZXIrKzsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBidHY7CisKKwlpMmNfdmlkaW9jc2NoYW4oYnR2KTsKKyAgICAgICAgYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixBVURDX1NFVF9SQURJTywmYnR2LT50dW5lcl90eXBlKTsKKwlhdWRpb19tdXgoYnR2LEFVRElPX1JBRElPKTsKKworCXVwKCZidHYtPmxvY2spOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBidHR2ICAgICpidHYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlidHYtPnJhZGlvX3VzZXItLTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRpb19kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBidHR2ICAgICpidHYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DR0NBUDoKKwl7CisgICAgICAgICAgICAgICAgc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmNhcCA9IGFyZzsKKworCQltZW1zZXQoY2FwLDAsc2l6ZW9mKCpjYXApKTsKKyAgICAgICAgICAgICAgICBzdHJjcHkoY2FwLT5uYW1lLGJ0di0+cmFkaW9fZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICBjYXAtPnR5cGUgPSBWSURfVFlQRV9UVU5FUjsKKwkJY2FwLT5jaGFubmVscyA9IDE7CisJCWNhcC0+YXVkaW9zID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisKKyAgICAgICAgY2FzZSBWSURJT0NHVFVORVI6CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7CisKKyAgICAgICAgICAgICAgICBpZih2LT50dW5lcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQltZW1zZXQodiwwLHNpemVvZigqdikpOworICAgICAgICAgICAgICAgIHN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKKyAgICAgICAgICAgICAgICAvKiBqYXBhbjogICAgICAgICAgNzYuMCBNSHogLSAgODkuOSBNSHoKKyAgICAgICAgICAgICAgICAgICB3ZXN0ZXJuIGV1cm9wZTogODcuNSBNSHogLSAxMDguMCBNSHoKKyAgICAgICAgICAgICAgICAgICBydXNzaWE6ICAgICAgICAgNjUuMCBNSHogLSAxMDguMCBNSHogKi8KKyAgICAgICAgICAgICAgICB2LT5yYW5nZWxvdz0oaW50KSg2NSoxNik7CisgICAgICAgICAgICAgICAgdi0+cmFuZ2VoaWdoPShpbnQpKDEwOCoxNik7CisgICAgICAgICAgICAgICAgYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixjbWQsdik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBWSURJT0NTVFVORVI6CisJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwkJcmV0dXJuIDA7CisKKwljYXNlIEJUVFZfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBWSURJT0NHRlJFUToKKyAgICAgICAgY2FzZSBWSURJT0NTRlJFUToKKwljYXNlIFZJRElPQ0dBVURJTzoKKwljYXNlIFZJRElPQ1NBVURJTzoKKwkJcmV0dXJuIGJ0dHZfY29tbW9uX2lvY3RscyhidHYsY21kLGFyZyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHJhZGlvX2RvX2lvY3RsKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmFkaW9fZm9wcyA9Cit7CisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgID0gcmFkaW9fb3BlbiwKKwkucmVsZWFzZSAgPSByYWRpb19yZWxlYXNlLAorCS5pb2N0bAkgID0gcmFkaW9faW9jdGwsCisJLmxsc2VlawkgID0gbm9fbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgcmFkaW9fdGVtcGxhdGUgPQoreworCS5uYW1lICAgICA9ICJidDg0OC84NzggcmFkaW8iLAorCS50eXBlICAgICA9IFZJRF9UWVBFX1RVTkVSLAorCS5oYXJkd2FyZSA9IFZJRF9IQVJEV0FSRV9CVDg0OCwKKwkuZm9wcyAgICAgPSAmcmFkaW9fZm9wcywKKwkubWlub3IgICAgPSAtMSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBzb21lIGRlYnVnIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgYnR0dl9yaXNjX2RlY29kZSh1MzIgcmlzYykKK3sKKwlzdGF0aWMgY2hhciAqaW5zdHJbMTZdID0geworCQlbIEJUODQ4X1JJU0NfV1JJVEUgICAgID4+IDI4IF0gPSAid3JpdGUiLAorCQlbIEJUODQ4X1JJU0NfU0tJUCAgICAgID4+IDI4IF0gPSAic2tpcCIsCisJCVsgQlQ4NDhfUklTQ19XUklURUMgICAgPj4gMjggXSA9ICJ3cml0ZWMiLAorCQlbIEJUODQ4X1JJU0NfSlVNUCAgICAgID4+IDI4IF0gPSAianVtcCIsCisJCVsgQlQ4NDhfUklTQ19TWU5DICAgICAgPj4gMjggXSA9ICJzeW5jIiwKKwkJWyBCVDg0OF9SSVNDX1dSSVRFMTIzICA+PiAyOCBdID0gIndyaXRlMTIzIiwKKwkJWyBCVDg0OF9SSVNDX1NLSVAxMjMgICA+PiAyOCBdID0gInNraXAxMjMiLAorCQlbIEJUODQ4X1JJU0NfV1JJVEUxUzIzID4+IDI4IF0gPSAid3JpdGUxczIzIiwKKwl9OworCXN0YXRpYyBpbnQgaW5jclsxNl0gPSB7CisJCVsgQlQ4NDhfUklTQ19XUklURSAgICAgPj4gMjggXSA9IDIsCisJCVsgQlQ4NDhfUklTQ19KVU1QICAgICAgPj4gMjggXSA9IDIsCisJCVsgQlQ4NDhfUklTQ19TWU5DICAgICAgPj4gMjggXSA9IDIsCisJCVsgQlQ4NDhfUklTQ19XUklURTEyMyAgPj4gMjggXSA9IDUsCisJCVsgQlQ4NDhfUklTQ19TS0lQMTIzICAgPj4gMjggXSA9IDIsCisJCVsgQlQ4NDhfUklTQ19XUklURTFTMjMgPj4gMjggXSA9IDMsCisJfTsKKwlzdGF0aWMgY2hhciAqYml0c1tdID0geworCQkiYmUwIiwgICJiZTEiLCAgImJlMiIsICAiYmUzL3Jlc3luYyIsCisJCSJzZXQwIiwgInNldDEiLCAic2V0MiIsICJzZXQzIiwKKwkJImNscjAiLCAiY2xyMSIsICJjbHIyIiwgImNscjMiLAorCQkiaXJxIiwgICJyZXMiLCAgImVvbCIsICAic29sIiwKKwl9OworCWludCBpOworCisJcHJpbnRrKCIweCUwOHggWyAlcyIsIHJpc2MsCisJICAgICAgIGluc3RyW3Jpc2MgPj4gMjhdID8gaW5zdHJbcmlzYyA+PiAyOF0gOiAiSU5WQUxJRCIpOworCWZvciAoaSA9IEFSUkFZX1NJWkUoYml0cyktMTsgaSA+PSAwOyBpLS0pCisJCWlmIChyaXNjICYgKDEgPDwgKGkgKyAxMikpKQorCQkJcHJpbnRrKCIgJXMiLGJpdHNbaV0pOworCXByaW50aygiIGNvdW50PSVkIF1cbiIsIHJpc2MgJiAweGZmZik7CisJcmV0dXJuIGluY3JbcmlzYyA+PiAyOF0gPyBpbmNyW3Jpc2MgPj4gMjhdIDogMTsKK30KKwordm9pZCBidHR2X3Jpc2NfZGlzYXNtKHN0cnVjdCBidHR2ICpidHYsCisJCSAgICAgIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MpCit7CisJdW5zaWduZWQgaW50IGksaixuOworCisJcHJpbnRrKCIlczogcmlzYyBkaXNhc206ICVwIFtkbWE9MHglMDhseF1cbiIsCisJICAgICAgIGJ0di0+Yy5uYW1lLCByaXNjLT5jcHUsICh1bnNpZ25lZCBsb25nKXJpc2MtPmRtYSk7CisJZm9yIChpID0gMDsgaSA8IChyaXNjLT5zaXplID4+IDIpOyBpICs9IG4pIHsKKwkJcHJpbnRrKCIlczogICAweCVseDogIiwgYnR2LT5jLm5hbWUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykocmlzYy0+ZG1hICsgKGk8PDIpKSk7CisJCW4gPSBidHR2X3Jpc2NfZGVjb2RlKHJpc2MtPmNwdVtpXSk7CisJCWZvciAoaiA9IDE7IGogPCBuOyBqKyspCisJCQlwcmludGsoIiVzOiAgIDB4JWx4OiAweCUwOHggWyBhcmcgIyVkIF1cbiIsCisJCQkgICAgICAgYnR2LT5jLm5hbWUsICh1bnNpZ25lZCBsb25nKShyaXNjLT5kbWEgKyAoKGkraik8PDIpKSwKKwkJCSAgICAgICByaXNjLT5jcHVbaStqXSwgaik7CisJCWlmICgwID09IHJpc2MtPmNwdVtpXSkKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYnR0dl9wcmludF9yaXNjYWRkcihzdHJ1Y3QgYnR0diAqYnR2KQoreworCXByaW50aygiICBtYWluOiAlMDhMeFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPm1haW4uZG1hKTsKKwlwcmludGsoIiAgdmJpIDogbz0lMDhMeCBlPSUwOEx4XG4iLAorCSAgICAgICBidHYtPmN2YmkgPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3ZiaS0+dG9wLmRtYSA6IDAsCisJICAgICAgIGJ0di0+Y3ZiaSA/ICh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5jdmJpLT5ib3R0b20uZG1hIDogMCk7CisJcHJpbnRrKCIgIGNhcCA6IG89JTA4THggZT0lMDhMeFxuIiwKKwkgICAgICAgYnR2LT5jdXJyLnRvcCAgICA/ICh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5jdXJyLnRvcC0+dG9wLmRtYSA6IDAsCisJICAgICAgIGJ0di0+Y3Vyci5ib3R0b20gPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3Vyci5ib3R0b20tPmJvdHRvbS5kbWEgOiAwKTsKKwlwcmludGsoIiAgc2NyIDogbz0lMDhMeCBlPSUwOEx4XG4iLAorCSAgICAgICBidHYtPnNjcmVlbiA/ICh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5zY3JlZW4tPnRvcC5kbWEgOiAwLAorCSAgICAgICBidHYtPnNjcmVlbiA/ICh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5zY3JlZW4tPmJvdHRvbS5kbWEgOiAwKTsKKwlidHR2X3Jpc2NfZGlzYXNtKGJ0diwgJmJ0di0+bWFpbik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBpcnEgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgY2hhciAqaXJxX25hbWVbXSA9IHsKKwkiRk1UQ0hHIiwgIC8vIGZvcm1hdCBjaGFuZ2UgZGV0ZWN0ZWQgKDUyNSB2cy4gNjI1KQorCSJWU1lOQyIsICAgLy8gdmVydGljYWwgc3luYyAobmV3IGZpZWxkKQorCSJIU1lOQyIsICAgLy8gaG9yaXpvbnRhbCBzeW5jCisJIk9GTE9XIiwgICAvLyBjaHJvbWEvbHVtYSBBR0Mgb3ZlcmZsb3cKKwkiSExPQ0siLCAgIC8vIGhvcml6b250YWwgbG9jayBjaGFuZ2VkCisJIlZQUkVTIiwgICAvLyB2aWRlbyBwcmVzZW5jZSBjaGFuZ2VkCisJIjYiLCAiNyIsCisJIkkyQ0RPTkUiLCAvLyBodyBpcmMgb3BlcmF0aW9uIGZpbmlzaGVkCisJIkdQSU5UIiwgICAvLyBncGlvIHBvcnQgdHJpZ2dlcmVkIGlycQorCSIxMCIsCisJIlJJU0NJIiwgICAvLyByaXNjIGluc3RydWN0aW9uIHRyaWdnZXJlZCBpcnEKKwkiRkJVUyIsICAgIC8vIHBpeGVsIGRhdGEgZmlmbyBkcm9wcGVkIGRhdGEgKGhpZ2ggcGNpIGJ1cyBsYXRlbmNpZXMpCisJIkZUUkdUIiwgICAvLyBwaXhlbCBkYXRhIGZpZm8gb3ZlcnJ1bgorCSJGRFNSIiwgICAgLy8gZmlmbyBkYXRhIHN0cmVhbSByZXN5bmNyb25pc2F0aW9uCisJIlBQRVJSIiwgICAvLyBwYXJpdHkgZXJyb3IgKGRhdGEgdHJhbnNmZXIpCisJIlJJUEVSUiIsICAvLyBwYXJpdHkgZXJyb3IgKHJlYWQgcmlzYyBpbnN0cnVjdGlvbnMpCisJIlBBQk9SVCIsICAvLyBwY2kgYWJvcnQKKwkiT0NFUlIiLCAgIC8vIHJpc2MgaW5zdHJ1Y3Rpb24gZXJyb3IKKwkiU0NFUlIiLCAgIC8vIHN5bmNyb25pc2F0aW9uIGVycm9yCit9OworCitzdGF0aWMgdm9pZCBidHR2X3ByaW50X2lycWJpdHModTMyIHByaW50LCB1MzIgbWFyaykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXByaW50aygiYml0czoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcnFfbmFtZSk7IGkrKykgeworCQlpZiAocHJpbnQgJiAoMSA8PCBpKSkKKwkJCXByaW50aygiICVzIixpcnFfbmFtZVtpXSk7CisJCWlmIChtYXJrICYgKDEgPDwgaSkpCisJCQlwcmludGsoIioiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJ0dHZfaXJxX2RlYnVnX2xvd19sYXRlbmN5KHN0cnVjdCBidHR2ICpidHYsIHUzMiByYykKK3sKKwlwcmludGsoImJ0dHYlZDogaXJxOiBza2lwcGVkIGZyYW1lIFttYWluPSVseCxvX3ZiaT0lbHgsb19maWVsZD0lbHgscmM9JWx4XVxuIiwKKwkgICAgICAgYnR2LT5jLm5yLAorCSAgICAgICAodW5zaWduZWQgbG9uZylidHYtPm1haW4uZG1hLAorCSAgICAgICAodW5zaWduZWQgbG9uZylidHYtPm1haW4uY3B1W1JJU0NfU0xPVF9PX1ZCSSsxXSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpYnR2LT5tYWluLmNwdVtSSVNDX1NMT1RfT19GSUVMRCsxXSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmMpOworCisJaWYgKDAgPT0gKGJ0cmVhZChCVDg0OF9EU1RBVFVTKSAmIEJUODQ4X0RTVEFUVVNfSExPQykpIHsKKwkJcHJpbnRrKCJidHR2JWQ6IE9oLCB0aGVyZSAodGVtcG9yYXJlbHk/KSBpcyBubyBpbnB1dCBzaWduYWwuICIKKwkJICAgICAgICJPaywgdGhlbiB0aGlzIGlzIGhhcm1sZXNzLCBkb24ndCB3b3JyeSA7KVxuIiwKKwkJICAgICAgIGJ0di0+Yy5ucik7CisJCXJldHVybjsKKwl9CisJcHJpbnRrKCJidHR2JWQ6IFVobS4gTG9va3MgbGlrZSB3ZSBoYXZlIHVudXN1YWwgaGlnaCBJUlEgbGF0ZW5jaWVzLlxuIiwKKwkgICAgICAgYnR2LT5jLm5yKTsKKwlwcmludGsoImJ0dHYlZDogTGV0cyB0cnkgdG8gY2F0Y2ggdGhlIGN1bHBpdCByZWQtaGFuZGVkIC4uLlxuIiwKKwkgICAgICAgYnR2LT5jLm5yKTsKKwlkdW1wX3N0YWNrKCk7Cit9CisKK3N0YXRpYyBpbnQKK2J0dHZfaXJxX25leHRfdmlkZW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IGJ0dHZfYnVmZmVyX3NldCAqc2V0KQoreworCXN0cnVjdCBidHR2X2J1ZmZlciAqaXRlbTsKKworCW1lbXNldChzZXQsMCxzaXplb2YoKnNldCkpOworCisJLyogY2FwdHVyZSByZXF1ZXN0ID8gKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmJ0di0+Y2FwdHVyZSkpIHsKKwkJc2V0LT5mcmFtZV9pcnEgPSAxOworCQlpdGVtID0gbGlzdF9lbnRyeShidHYtPmNhcHR1cmUubmV4dCwgc3RydWN0IGJ0dHZfYnVmZmVyLCB2Yi5xdWV1ZSk7CisJCWlmIChWNEwyX0ZJRUxEX0hBU19UT1AoaXRlbS0+dmIuZmllbGQpKQorCQkJc2V0LT50b3AgICAgPSBpdGVtOworCQlpZiAoVjRMMl9GSUVMRF9IQVNfQk9UVE9NKGl0ZW0tPnZiLmZpZWxkKSkKKwkJCXNldC0+Ym90dG9tID0gaXRlbTsKKworCQkvKiBjYXB0dXJlIHJlcXVlc3QgZm9yIG90aGVyIGZpZWxkID8gKi8KKwkJaWYgKCFWNEwyX0ZJRUxEX0hBU19CT1RIKGl0ZW0tPnZiLmZpZWxkKSAmJgorCQkgICAgKGl0ZW0tPnZiLnF1ZXVlLm5leHQgIT0gJmJ0di0+Y2FwdHVyZSkpIHsKKwkJCWl0ZW0gPSBsaXN0X2VudHJ5KGl0ZW0tPnZiLnF1ZXVlLm5leHQsIHN0cnVjdCBidHR2X2J1ZmZlciwgdmIucXVldWUpOworCQkJaWYgKCFWNEwyX0ZJRUxEX0hBU19CT1RIKGl0ZW0tPnZiLmZpZWxkKSkgeworCQkJCWlmIChOVUxMID09IHNldC0+dG9wICYmCisJCQkJICAgIFY0TDJfRklFTERfVE9QID09IGl0ZW0tPnZiLmZpZWxkKSB7CisJCQkJCXNldC0+dG9wID0gaXRlbTsKKwkJCQl9CisJCQkJaWYgKE5VTEwgPT0gc2V0LT5ib3R0b20gJiYKKwkJCQkgICAgVjRMMl9GSUVMRF9CT1RUT00gPT0gaXRlbS0+dmIuZmllbGQpIHsKKwkJCQkJc2V0LT5ib3R0b20gPSBpdGVtOworCQkJCX0KKwkJCQlpZiAoTlVMTCAhPSBzZXQtPnRvcCAgJiYgIE5VTEwgIT0gc2V0LT5ib3R0b20pCisJCQkJCXNldC0+dG9wX2lycSA9IDI7CisJCQl9CisJCX0KKwl9CisKKwkvKiBzY3JlZW4gb3ZlcmxheSA/ICovCisJaWYgKE5VTEwgIT0gYnR2LT5zY3JlZW4pIHsKKwkJaWYgKFY0TDJfRklFTERfSEFTX0JPVEgoYnR2LT5zY3JlZW4tPnZiLmZpZWxkKSkgeworCQkJaWYgKE5VTEwgPT0gc2V0LT50b3AgJiYgTlVMTCA9PSBzZXQtPmJvdHRvbSkgeworCQkJCXNldC0+dG9wICAgID0gYnR2LT5zY3JlZW47CisJCQkJc2V0LT5ib3R0b20gPSBidHYtPnNjcmVlbjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChWNEwyX0ZJRUxEX1RPUCA9PSBidHYtPnNjcmVlbi0+dmIuZmllbGQgJiYKKwkJCSAgICBOVUxMID09IHNldC0+dG9wKSB7CisJCQkJc2V0LT50b3AgPSBidHYtPnNjcmVlbjsKKwkJCX0KKwkJCWlmIChWNEwyX0ZJRUxEX0JPVFRPTSA9PSBidHYtPnNjcmVlbi0+dmIuZmllbGQgJiYKKwkJCSAgICBOVUxMID09IHNldC0+Ym90dG9tKSB7CisJCQkJc2V0LT5ib3R0b20gPSBidHYtPnNjcmVlbjsKKwkJCX0KKwkJfQorCX0KKworCWRwcmludGsoImJ0dHYlZDogbmV4dCBzZXQ6IHRvcD0lcCBib3R0b209JXAgW3NjcmVlbj0lcCxpcnE9JWQsJWRdXG4iLAorCQlidHYtPmMubnIsc2V0LT50b3AsIHNldC0+Ym90dG9tLAorCQlidHYtPnNjcmVlbixzZXQtPmZyYW1lX2lycSxzZXQtPnRvcF9pcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYnR0dl9pcnFfd2FrZXVwX3ZpZGVvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCBidHR2X2J1ZmZlcl9zZXQgKndha2V1cCwKKwkJICAgICAgc3RydWN0IGJ0dHZfYnVmZmVyX3NldCAqY3VyciwgdW5zaWduZWQgaW50IHN0YXRlKQoreworCXN0cnVjdCB0aW1ldmFsIHRzOworCisJZG9fZ2V0dGltZW9mZGF5KCZ0cyk7CisKKwlpZiAod2FrZXVwLT50b3AgPT0gd2FrZXVwLT5ib3R0b20pIHsKKwkJaWYgKE5VTEwgIT0gd2FrZXVwLT50b3AgJiYgY3Vyci0+dG9wICE9IHdha2V1cC0+dG9wKSB7CisJCQlpZiAoaXJxX2RlYnVnID4gMSkKKwkJCQlwcmludGsoImJ0dHYlZDogd2FrZXVwOiBib3RoPSVwXG4iLGJ0di0+Yy5ucix3YWtldXAtPnRvcCk7CisJCQl3YWtldXAtPnRvcC0+dmIudHMgPSB0czsKKwkJCXdha2V1cC0+dG9wLT52Yi5maWVsZF9jb3VudCA9IGJ0di0+ZmllbGRfY291bnQ7CisJCQl3YWtldXAtPnRvcC0+dmIuc3RhdGUgPSBzdGF0ZTsKKwkJCXdha2VfdXAoJndha2V1cC0+dG9wLT52Yi5kb25lKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChOVUxMICE9IHdha2V1cC0+dG9wICYmIGN1cnItPnRvcCAhPSB3YWtldXAtPnRvcCkgeworCQkJaWYgKGlycV9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKCJidHR2JWQ6IHdha2V1cDogdG9wPSVwXG4iLGJ0di0+Yy5ucix3YWtldXAtPnRvcCk7CisJCQl3YWtldXAtPnRvcC0+dmIudHMgPSB0czsKKwkJCXdha2V1cC0+dG9wLT52Yi5maWVsZF9jb3VudCA9IGJ0di0+ZmllbGRfY291bnQ7CisJCQl3YWtldXAtPnRvcC0+dmIuc3RhdGUgPSBzdGF0ZTsKKwkJCXdha2VfdXAoJndha2V1cC0+dG9wLT52Yi5kb25lKTsKKwkJfQorCQlpZiAoTlVMTCAhPSB3YWtldXAtPmJvdHRvbSAmJiBjdXJyLT5ib3R0b20gIT0gd2FrZXVwLT5ib3R0b20pIHsKKwkJCWlmIChpcnFfZGVidWcgPiAxKQorCQkJCXByaW50aygiYnR0diVkOiB3YWtldXA6IGJvdHRvbT0lcFxuIixidHYtPmMubnIsd2FrZXVwLT5ib3R0b20pOworCQkJd2FrZXVwLT5ib3R0b20tPnZiLnRzID0gdHM7CisJCQl3YWtldXAtPmJvdHRvbS0+dmIuZmllbGRfY291bnQgPSBidHYtPmZpZWxkX2NvdW50OworCQkJd2FrZXVwLT5ib3R0b20tPnZiLnN0YXRlID0gc3RhdGU7CisJCQl3YWtlX3VwKCZ3YWtldXAtPmJvdHRvbS0+dmIuZG9uZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitidHR2X2lycV93YWtldXBfdmJpKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCBidHR2X2J1ZmZlciAqd2FrZXVwLAorCQkgICAgdW5zaWduZWQgaW50IHN0YXRlKQoreworCXN0cnVjdCB0aW1ldmFsIHRzOworCisJaWYgKE5VTEwgPT0gd2FrZXVwKQorCQlyZXR1cm47CisKKwlkb19nZXR0aW1lb2ZkYXkoJnRzKTsKKwl3YWtldXAtPnZiLnRzID0gdHM7CisJd2FrZXVwLT52Yi5maWVsZF9jb3VudCA9IGJ0di0+ZmllbGRfY291bnQ7CisJd2FrZXVwLT52Yi5zdGF0ZSA9IHN0YXRlOworCXdha2VfdXAoJndha2V1cC0+dmIuZG9uZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ0dHZfaXJxX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBidHR2ICpidHYgPSAoc3RydWN0IGJ0dHYgKilkYXRhOworCXN0cnVjdCBidHR2X2J1ZmZlcl9zZXQgb2xkLG5ldzsKKwlzdHJ1Y3QgYnR0dl9idWZmZXIgKm92Ymk7CisJc3RydWN0IGJ0dHZfYnVmZmVyICppdGVtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYnR0dl92ZXJib3NlKSB7CisJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdGltZW91dDogZHJvcD0lZCBpcnE9JWQvJWQsIHJpc2M9JTA4eCwgIiwKKwkJICAgICAgIGJ0di0+Yy5uciwgYnR2LT5mcmFtZWRyb3AsIGJ0di0+aXJxX21lLCBidHYtPmlycV90b3RhbCwKKwkJICAgICAgIGJ0cmVhZChCVDg0OF9SSVNDX0NPVU5UKSk7CisJCWJ0dHZfcHJpbnRfaXJxYml0cyhidHJlYWQoQlQ4NDhfSU5UX1NUQVQpLDApOworCQlwcmludGsoIlxuIik7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJ0di0+c19sb2NrLGZsYWdzKTsKKworCS8qIGRlYWN0aXZhdGUgc3R1ZmYgKi8KKwltZW1zZXQoJm5ldywwLHNpemVvZihuZXcpKTsKKwlvbGQgID0gYnR2LT5jdXJyOworCW92YmkgPSBidHYtPmN2Ymk7CisJYnR2LT5jdXJyID0gbmV3OworCWJ0di0+Y3ZiaSA9IE5VTEw7CisJYnR2LT5sb29wX2lycSA9IDA7CisJYnR0dl9idWZmZXJfYWN0aXZhdGVfdmlkZW8oYnR2LCAmbmV3KTsKKwlidHR2X2J1ZmZlcl9hY3RpdmF0ZV92YmkoYnR2LCAgIE5VTEwpOworCWJ0dHZfc2V0X2RtYShidHYsIDApOworCisJLyogd2FrZSB1cCAqLworCWJ0dHZfaXJxX3dha2V1cF92aWRlbyhidHYsICZvbGQsICZuZXcsIFNUQVRFX0VSUk9SKTsKKwlidHR2X2lycV93YWtldXBfdmJpKGJ0diwgb3ZiaSwgU1RBVEVfRVJST1IpOworCisJLyogY2FuY2VsIGFsbCBvdXRzdGFuZGluZyBjYXB0dXJlIC8gdmJpIHJlcXVlc3RzICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZidHYtPmNhcHR1cmUpKSB7CisJCWl0ZW0gPSBsaXN0X2VudHJ5KGJ0di0+Y2FwdHVyZS5uZXh0LCBzdHJ1Y3QgYnR0dl9idWZmZXIsIHZiLnF1ZXVlKTsKKwkJbGlzdF9kZWwoJml0ZW0tPnZiLnF1ZXVlKTsKKwkJaXRlbS0+dmIuc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJd2FrZV91cCgmaXRlbS0+dmIuZG9uZSk7CisJfQorCXdoaWxlICghbGlzdF9lbXB0eSgmYnR2LT52Y2FwdHVyZSkpIHsKKwkJaXRlbSA9IGxpc3RfZW50cnkoYnR2LT52Y2FwdHVyZS5uZXh0LCBzdHJ1Y3QgYnR0dl9idWZmZXIsIHZiLnF1ZXVlKTsKKwkJbGlzdF9kZWwoJml0ZW0tPnZiLnF1ZXVlKTsKKwkJaXRlbS0+dmIuc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJd2FrZV91cCgmaXRlbS0+dmIuZG9uZSk7CisJfQorCisJYnR2LT5lcnJvcnMrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidHYtPnNfbG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitidHR2X2lycV93YWtldXBfdG9wKHN0cnVjdCBidHR2ICpidHYpCit7CisJc3RydWN0IGJ0dHZfYnVmZmVyICp3YWtldXAgPSBidHYtPmN1cnIudG9wOworCisJaWYgKE5VTEwgPT0gd2FrZXVwKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJmJ0di0+c19sb2NrKTsKKwlidHYtPmN1cnIudG9wX2lycSA9IDA7CisJYnR2LT5jdXJyLnRvcCA9IE5VTEw7CisJYnR0dl9yaXNjX2hvb2soYnR2LCBSSVNDX1NMT1RfT19GSUVMRCwgTlVMTCwgMCk7CisKKwlkb19nZXR0aW1lb2ZkYXkoJndha2V1cC0+dmIudHMpOworCXdha2V1cC0+dmIuZmllbGRfY291bnQgPSBidHYtPmZpZWxkX2NvdW50OworCXdha2V1cC0+dmIuc3RhdGUgPSBTVEFURV9ET05FOworCXdha2VfdXAoJndha2V1cC0+dmIuZG9uZSk7CisJc3Bpbl91bmxvY2soJmJ0di0+c19sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfYWN0aXZlKHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsIHUzMiByYykKK3sKKwlpZiAocmMgPCByaXNjLT5kbWEpCisJCXJldHVybiAwOworCWlmIChyYyA+IHJpc2MtPmRtYSArIHJpc2MtPnNpemUpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorYnR0dl9pcnFfc3dpdGNoX3ZpZGVvKHN0cnVjdCBidHR2ICpidHYpCit7CisJc3RydWN0IGJ0dHZfYnVmZmVyX3NldCBuZXc7CisJc3RydWN0IGJ0dHZfYnVmZmVyX3NldCBvbGQ7CisJZG1hX2FkZHJfdCByYzsKKworCXNwaW5fbG9jaygmYnR2LT5zX2xvY2spOworCisJLyogbmV3IGJ1ZmZlciBzZXQgKi8KKwlidHR2X2lycV9uZXh0X3ZpZGVvKGJ0diwgJm5ldyk7CisJcmMgPSBidHJlYWQoQlQ4NDhfUklTQ19DT1VOVCk7CisJaWYgKChidHYtPmN1cnIudG9wICAgICYmIGlzX2FjdGl2ZSgmYnR2LT5jdXJyLnRvcC0+dG9wLCAgICAgICByYykpIHx8CisJICAgIChidHYtPmN1cnIuYm90dG9tICYmIGlzX2FjdGl2ZSgmYnR2LT5jdXJyLmJvdHRvbS0+Ym90dG9tLCByYykpKSB7CisJCWJ0di0+ZnJhbWVkcm9wKys7CisJCWlmIChkZWJ1Z19sYXRlbmN5KQorCQkJYnR0dl9pcnFfZGVidWdfbG93X2xhdGVuY3koYnR2LCByYyk7CisJCXNwaW5fdW5sb2NrKCZidHYtPnNfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwkvKiBzd2l0Y2ggb3ZlciAqLworCW9sZCA9IGJ0di0+Y3VycjsKKwlidHYtPmN1cnIgPSBuZXc7CisJYnR2LT5sb29wX2lycSAmPSB+MTsKKwlidHR2X2J1ZmZlcl9hY3RpdmF0ZV92aWRlbyhidHYsICZuZXcpOworCWJ0dHZfc2V0X2RtYShidHYsIDApOworCisJLyogc3dpdGNoIGlucHV0ICovCisJaWYgKFVOU0VUICE9IGJ0di0+bmV3X2lucHV0KSB7CisJCXZpZGVvX211eChidHYsYnR2LT5uZXdfaW5wdXQpOworCQlidHYtPm5ld19pbnB1dCA9IFVOU0VUOworCX0KKworCS8qIHdha2UgdXAgZmluaXNoZWQgYnVmZmVycyAqLworCWJ0dHZfaXJxX3dha2V1cF92aWRlbyhidHYsICZvbGQsICZuZXcsIFNUQVRFX0RPTkUpOworCXNwaW5fdW5sb2NrKCZidHYtPnNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitidHR2X2lycV9zd2l0Y2hfdmJpKHN0cnVjdCBidHR2ICpidHYpCit7CisJc3RydWN0IGJ0dHZfYnVmZmVyICpuZXcgPSBOVUxMOworCXN0cnVjdCBidHR2X2J1ZmZlciAqb2xkOworCXUzMiByYzsKKworCXNwaW5fbG9jaygmYnR2LT5zX2xvY2spOworCisJaWYgKCFsaXN0X2VtcHR5KCZidHYtPnZjYXB0dXJlKSkKKwkJbmV3ID0gbGlzdF9lbnRyeShidHYtPnZjYXB0dXJlLm5leHQsIHN0cnVjdCBidHR2X2J1ZmZlciwgdmIucXVldWUpOworCW9sZCA9IGJ0di0+Y3ZiaTsKKworCXJjID0gYnRyZWFkKEJUODQ4X1JJU0NfQ09VTlQpOworCWlmIChOVUxMICE9IG9sZCAmJiAoaXNfYWN0aXZlKCZvbGQtPnRvcCwgICAgcmMpIHx8CisJCQkgICAgaXNfYWN0aXZlKCZvbGQtPmJvdHRvbSwgcmMpKSkgeworCQlidHYtPmZyYW1lZHJvcCsrOworCQlpZiAoZGVidWdfbGF0ZW5jeSkKKwkJCWJ0dHZfaXJxX2RlYnVnX2xvd19sYXRlbmN5KGJ0diwgcmMpOworCQlzcGluX3VubG9jaygmYnR2LT5zX2xvY2spOworCQlyZXR1cm47CisJfQorCisJLyogc3dpdGNoICovCisJYnR2LT5jdmJpID0gbmV3OworCWJ0di0+bG9vcF9pcnEgJj0gfjQ7CisJYnR0dl9idWZmZXJfYWN0aXZhdGVfdmJpKGJ0diwgbmV3KTsKKwlidHR2X3NldF9kbWEoYnR2LCAwKTsKKworCWJ0dHZfaXJxX3dha2V1cF92YmkoYnR2LCBvbGQsIFNUQVRFX0RPTkUpOworCXNwaW5fdW5sb2NrKCZidHYtPnNfbG9jayk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBidHR2X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwl1MzIgc3RhdCxhc3RhdDsKKwl1MzIgZHN0YXQ7CisJaW50IGNvdW50OworCXN0cnVjdCBidHR2ICpidHY7CisJaW50IGhhbmRsZWQgPSAwOworCisJYnR2PShzdHJ1Y3QgYnR0diAqKWRldl9pZDsKKwljb3VudD0wOworCXdoaWxlICgxKSB7CisJCS8qIGdldC9jbGVhciBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMgKi8KKwkJc3RhdD1idHJlYWQoQlQ4NDhfSU5UX1NUQVQpOworCQlhc3RhdD1zdGF0JmJ0cmVhZChCVDg0OF9JTlRfTUFTSyk7CisJCWlmICghYXN0YXQpCisJCQlicmVhazsKKwkJaGFuZGxlZCA9IDE7CisJCWJ0d3JpdGUoc3RhdCxCVDg0OF9JTlRfU1RBVCk7CisKKwkJLyogZ2V0IGRldmljZSBzdGF0dXMgYml0cyAqLworCQlkc3RhdD1idHJlYWQoQlQ4NDhfRFNUQVRVUyk7CisKKwkJaWYgKGlycV9kZWJ1ZykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogaXJxIGxvb3A9JWQgZmM9JWQgIgorCQkJICAgICAgICJyaXNjcz0leCwgcmlzY2M9JTA4eCwgIiwKKwkJCSAgICAgICBidHYtPmMubnIsIGNvdW50LCBidHYtPmZpZWxkX2NvdW50LAorCQkJICAgICAgIHN0YXQ+PjI4LCBidHJlYWQoQlQ4NDhfUklTQ19DT1VOVCkpOworCQkJYnR0dl9wcmludF9pcnFiaXRzKHN0YXQsYXN0YXQpOworCQkJaWYgKHN0YXQgJiBCVDg0OF9JTlRfSExPQ0spCisJCQkJcHJpbnRrKCIgICBITE9DID0+ICVzIiwgKGRzdGF0ICYgQlQ4NDhfRFNUQVRVU19ITE9DKQorCQkJCSAgICAgICA/ICJ5ZXMiIDogIm5vIik7CisJCQlpZiAoc3RhdCAmIEJUODQ4X0lOVF9WUFJFUykKKwkJCQlwcmludGsoIiAgIFBSRVMgPT4gJXMiLCAoZHN0YXQgJiBCVDg0OF9EU1RBVFVTX1BSRVMpCisJCQkJICAgICAgID8gInllcyIgOiAibm8iKTsKKwkJCWlmIChzdGF0ICYgQlQ4NDhfSU5UX0ZNVENIRykKKwkJCQlwcmludGsoIiAgIE5VTUwgPT4gJXMiLCAoZHN0YXQgJiBCVDg0OF9EU1RBVFVTX05VTUwpCisJCQkJICAgICAgID8gIjYyNSIgOiAiNTI1Iik7CisJCQlwcmludGsoIlxuIik7CisJCX0KKworCQlpZiAoYXN0YXQmQlQ4NDhfSU5UX1ZTWU5DKQorICAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5maWVsZF9jb3VudCsrOworCisJCWlmIChhc3RhdCAmIEJUODQ4X0lOVF9HUElOVCkgeworCQkJd2FrZV91cCgmYnR2LT5ncGlvcSk7CisJCQlidHR2X2dwaW9faXJxKCZidHYtPmMpOworCQl9CisKKwkJaWYgKGFzdGF0ICYgQlQ4NDhfSU5UX0kyQ0RPTkUpIHsKKwkJCWJ0di0+aTJjX2RvbmUgPSBzdGF0OworCQkJd2FrZV91cCgmYnR2LT5pMmNfcXVldWUpOworCQl9CisKKyAgICAgICAgICAgICAgICBpZiAoKGFzdGF0ICYgQlQ4NDhfSU5UX1JJU0NJKSAgJiYgIChzdGF0ICYgKDQ8PDI4KSkpCisJCQlidHR2X2lycV9zd2l0Y2hfdmJpKGJ0dik7CisKKyAgICAgICAgICAgICAgICBpZiAoKGFzdGF0ICYgQlQ4NDhfSU5UX1JJU0NJKSAgJiYgIChzdGF0ICYgKDI8PDI4KSkpCisJCQlidHR2X2lycV93YWtldXBfdG9wKGJ0dik7CisKKyAgICAgICAgICAgICAgICBpZiAoKGFzdGF0ICYgQlQ4NDhfSU5UX1JJU0NJKSAgJiYgIChzdGF0ICYgKDE8PDI4KSkpCisJCQlidHR2X2lycV9zd2l0Y2hfdmlkZW8oYnR2KTsKKworCQlpZiAoKGFzdGF0ICYgQlQ4NDhfSU5UX0hMT0NLKSAgJiYgIGJ0di0+b3B0X2F1dG9tdXRlKQorCQkJYXVkaW9fbXV4KGJ0diwgLTEpOworCisJCWlmIChhc3RhdCAmIChCVDg0OF9JTlRfU0NFUlJ8QlQ4NDhfSU5UX09DRVJSKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiAlcyVzIEAgJTA4eCwiLGJ0di0+Yy5uciwKKwkJCSAgICAgICAoYXN0YXQgJiBCVDg0OF9JTlRfU0NFUlIpID8gIlNDRVJSIiA6ICIiLAorCQkJICAgICAgIChhc3RhdCAmIEJUODQ4X0lOVF9PQ0VSUikgPyAiT0NFUlIiIDogIiIsCisJCQkgICAgICAgYnRyZWFkKEJUODQ4X1JJU0NfQ09VTlQpKTsKKwkJCWJ0dHZfcHJpbnRfaXJxYml0cyhzdGF0LGFzdGF0KTsKKwkJCXByaW50aygiXG4iKTsKKwkJCWlmIChidHR2X2RlYnVnKQorCQkJCWJ0dHZfcHJpbnRfcmlzY2FkZHIoYnR2KTsKKwkJfQorCQlpZiAoZmRzciAmJiBhc3RhdCAmIEJUODQ4X0lOVF9GRFNSKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZEU1IgQCAlMDh4XG4iLAorCQkJICAgICAgIGJ0di0+Yy5ucixidHJlYWQoQlQ4NDhfUklTQ19DT1VOVCkpOworCQkJaWYgKGJ0dHZfZGVidWcpCisJCQkJYnR0dl9wcmludF9yaXNjYWRkcihidHYpOworCQl9CisKKwkJY291bnQrKzsKKwkJaWYgKGNvdW50ID4gNCkgeworCQkJYnR3cml0ZSgwLCBCVDg0OF9JTlRfTUFTSyk7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiYnR0diVkOiBJUlEgbG9ja3VwLCBjbGVhcmVkIGludCBtYXNrIFsiLCBidHYtPmMubnIpOworCQkJYnR0dl9wcmludF9pcnFiaXRzKHN0YXQsYXN0YXQpOworCQkJcHJpbnRrKCJdXG4iKTsKKwkJfQorCX0KKwlidHYtPmlycV90b3RhbCsrOworCWlmIChoYW5kbGVkKQorCQlidHYtPmlycV9tZSsrOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBpbml0aWFsaXRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSAqdmRldl9pbml0KHN0cnVjdCBidHR2ICpidHYsCisJCQkJICAgICAgc3RydWN0IHZpZGVvX2RldmljZSAqdGVtcGxhdGUsCisJCQkJICAgICAgY2hhciAqdHlwZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQ7CisKKwl2ZmQgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoTlVMTCA9PSB2ZmQpCisJCXJldHVybiBOVUxMOworCSp2ZmQgPSAqdGVtcGxhdGU7CisJdmZkLT5taW5vciAgID0gLTE7CisJdmZkLT5kZXYgICAgID0gJmJ0di0+Yy5wY2ktPmRldjsKKwl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKKwlzbnByaW50Zih2ZmQtPm5hbWUsIHNpemVvZih2ZmQtPm5hbWUpLCAiQlQlZCVzICVzICglcykiLAorCQkgYnR2LT5pZCwgKGJ0di0+aWQ9PTg0OCAmJiBidHYtPnJldmlzaW9uPT0weDEyKSA/ICJBIiA6ICIiLAorCQkgdHlwZSwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lKTsKKwlyZXR1cm4gdmZkOworfQorCitzdGF0aWMgdm9pZCBidHR2X3VucmVnaXN0ZXJfdmlkZW8oc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwlpZiAoYnR2LT52aWRlb19kZXYpIHsKKwkJaWYgKC0xICE9IGJ0di0+dmlkZW9fZGV2LT5taW5vcikKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGJ0di0+dmlkZW9fZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoYnR2LT52aWRlb19kZXYpOworCQlidHYtPnZpZGVvX2RldiA9IE5VTEw7CisJfQorCWlmIChidHYtPnZiaV9kZXYpIHsKKwkJaWYgKC0xICE9IGJ0di0+dmJpX2Rldi0+bWlub3IpCisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShidHYtPnZiaV9kZXYpOworCQllbHNlCisJCQl2aWRlb19kZXZpY2VfcmVsZWFzZShidHYtPnZiaV9kZXYpOworCQlidHYtPnZiaV9kZXYgPSBOVUxMOworCX0KKwlpZiAoYnR2LT5yYWRpb19kZXYpIHsKKwkJaWYgKC0xICE9IGJ0di0+cmFkaW9fZGV2LT5taW5vcikKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGJ0di0+cmFkaW9fZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoYnR2LT5yYWRpb19kZXYpOworCQlidHYtPnJhZGlvX2RldiA9IE5VTEw7CisJfQorfQorCisvKiByZWdpc3RlciB2aWRlbzRsaW51eCBkZXZpY2VzICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBidHR2X3JlZ2lzdGVyX3ZpZGVvKHN0cnVjdCBidHR2ICpidHYpCit7CisJLyogdmlkZW8gKi8KKwlidHYtPnZpZGVvX2RldiA9IHZkZXZfaW5pdChidHYsICZidHR2X3ZpZGVvX3RlbXBsYXRlLCAidmlkZW8iKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gYnR2LT52aWRlb19kZXYpCisJCWdvdG8gZXJyOworCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoYnR2LT52aWRlb19kZXYsVkZMX1RZUEVfR1JBQkJFUix2aWRlb19ucik8MCkKKwkJZ290byBlcnI7CisJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiByZWdpc3RlcmVkIGRldmljZSB2aWRlbyVkXG4iLAorCSAgICAgICBidHYtPmMubnIsYnR2LT52aWRlb19kZXYtPm1pbm9yICYgMHgxZik7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKGJ0di0+dmlkZW9fZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfY2FyZCk7CisKKwkvKiB2YmkgKi8KKwlidHYtPnZiaV9kZXYgPSB2ZGV2X2luaXQoYnR2LCAmYnR0dl92YmlfdGVtcGxhdGUsICJ2YmkiKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gYnR2LT52YmlfZGV2KQorCQlnb3RvIGVycjsKKyAgICAgICAgaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShidHYtPnZiaV9kZXYsVkZMX1RZUEVfVkJJLHZiaV9ucik8MCkKKwkJZ290byBlcnI7CisJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiByZWdpc3RlcmVkIGRldmljZSB2YmklZFxuIiwKKwkgICAgICAgYnR2LT5jLm5yLGJ0di0+dmJpX2Rldi0+bWlub3IgJiAweDFmKTsKKworICAgICAgICBpZiAoIWJ0di0+aGFzX3JhZGlvKQorCQlyZXR1cm4gMDsKKwkvKiByYWRpbyAqLworCWJ0di0+cmFkaW9fZGV2ID0gdmRldl9pbml0KGJ0diwgJnJhZGlvX3RlbXBsYXRlLCAicmFkaW8iKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gYnR2LT5yYWRpb19kZXYpCisJCWdvdG8gZXJyOworCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoYnR2LT5yYWRpb19kZXYsIFZGTF9UWVBFX1JBRElPLHJhZGlvX25yKTwwKQorCQlnb3RvIGVycjsKKwlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHJlZ2lzdGVyZWQgZGV2aWNlIHJhZGlvJWRcbiIsCisJICAgICAgIGJ0di0+Yy5ucixidHYtPnJhZGlvX2Rldi0+bWlub3IgJiAweDFmKTsKKworCS8qIGFsbCBkb25lICovCisJcmV0dXJuIDA7CisKKyBlcnI6CisJYnR0dl91bnJlZ2lzdGVyX3ZpZGVvKGJ0dik7CisJcmV0dXJuIC0xOworfQorCisKKy8qIG9uIE9wZW5GaXJtd2FyZSBtYWNoaW5lcyAoUG93ZXJNYWMgYXQgbGVhc3QpLCBQQ0kgbWVtb3J5IGN5Y2xlICovCisvKiByZXNwb25zZSBvbiBjYXJkcyB3aXRoIG5vIGZpcm13YXJlIGlzIG5vdCBlbmFibGVkIGJ5IE9GICovCitzdGF0aWMgdm9pZCBwY2lfc2V0X2NvbW1hbmQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorICAgICAgICB1bnNpZ25lZCBpbnQgY21kOworCisgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKKyAgICAgICAgY21kID0gKGNtZCB8IFBDSV9DT01NQU5EX01FTU9SWSApOworICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYnR0dl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyIGxhdDsKKwlzdHJ1Y3QgYnR0diAqYnR2OworCisJaWYgKGJ0dHZfbnVtID09IEJUVFZfTUFYKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwcmludGsoS0VSTl9JTkZPICJidHR2OiBCdDh4eCBjYXJkIGZvdW5kICglZCkuXG4iLCBidHR2X251bSk7CisgICAgICAgIGJ0dj0mYnR0dnNbYnR0dl9udW1dOworCW1lbXNldChidHYsMCxzaXplb2YoKmJ0dikpOworCWJ0di0+Yy5uciAgPSBidHR2X251bTsKKwlzcHJpbnRmKGJ0di0+Yy5uYW1lLCJidHR2JWQiLGJ0di0+Yy5ucik7CisKKwkvKiBpbml0aWFsaXplIHN0cnVjdHMgLyBmaWxsIGluIGRlZmF1bHRzICovCisgICAgICAgIGluaXRfTVVURVgoJmJ0di0+bG9jayk7CisgICAgICAgIGluaXRfTVVURVgoJmJ0di0+cmVzbG9jayk7CisgICAgICAgIHNwaW5fbG9ja19pbml0KCZidHYtPnNfbG9jayk7CisgICAgICAgIHNwaW5fbG9ja19pbml0KCZidHYtPmdwaW9fbG9jayk7CisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ0di0+Z3Bpb3EpOworICAgICAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZidHYtPmkyY19xdWV1ZSk7CisgICAgICAgIElOSVRfTElTVF9IRUFEKCZidHYtPmMuc3Vicyk7CisgICAgICAgIElOSVRfTElTVF9IRUFEKCZidHYtPmNhcHR1cmUpOworICAgICAgICBJTklUX0xJU1RfSEVBRCgmYnR2LT52Y2FwdHVyZSk7CisJdjRsMl9wcmlvX2luaXQoJmJ0di0+cHJpbyk7CisKKwlpbml0X3RpbWVyKCZidHYtPnRpbWVvdXQpOworCWJ0di0+dGltZW91dC5mdW5jdGlvbiA9IGJ0dHZfaXJxX3RpbWVvdXQ7CisJYnR2LT50aW1lb3V0LmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpYnR2OworCisgICAgICAgIGJ0di0+aTJjX3JjID0gLTE7CisgICAgICAgIGJ0di0+dHVuZXJfdHlwZSAgPSBVTlNFVDsKKyAgICAgICAgYnR2LT5waW5uYWNsZV9pZCA9IFVOU0VUOworCWJ0di0+bmV3X2lucHV0ICAgPSBVTlNFVDsKKwlidHYtPmdwaW9pcnEgICAgID0gMTsKKwlidHYtPmhhc19yYWRpbz1yYWRpb1tidHYtPmMubnJdOworCisJLyogcGNpIHN0dWZmIChpbml0LCBnZXQgaXJxL21taW8sIC4uLiAqLworCWJ0di0+Yy5wY2kgPSBkZXY7CisgICAgICAgIGJ0di0+aWQgID0gZGV2LT5kZXZpY2U7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IENhbid0IGVuYWJsZSBkZXZpY2UuXG4iLAorCQkgICAgICAgYnR2LT5jLm5yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorICAgICAgICBpZiAocGNpX3NldF9kbWFfbWFzayhkZXYsIDB4ZmZmZmZmZmYpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIiwKKwkJICAgICAgIGJ0di0+Yy5ucik7CisJCXJldHVybiAtRUlPOworICAgICAgICB9CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwwKSwKKwkJCQlwY2lfcmVzb3VyY2VfbGVuKGRldiwwKSwKKwkJCQlidHYtPmMubmFtZSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IGNhbid0IHJlcXVlc3QgaW9tZW0gKDB4JWx4KS5cbiIsCisJCSAgICAgICBidHYtPmMubnIsIHBjaV9yZXNvdXJjZV9zdGFydChkZXYsMCkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKyAgICAgICAgcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwlwY2lfc2V0X2NvbW1hbmQoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LGJ0dik7CisJaWYgKCFwY2lfZG1hX3N1cHBvcnRlZChkZXYsMHhmZmZmZmZmZikpIHsKKwkJcHJpbnRrKCJidHR2JWQ6IE9vcHM6IG5vIDMyYml0IFBDSSBETUEgPz8/XG4iLCBidHYtPmMubnIpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGZhaWwxOworCX0KKworICAgICAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmJ0di0+cmV2aXNpb24pOworICAgICAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmbGF0KTsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBCdCVkIChyZXYgJWQpIGF0ICVzLCAiLAorICAgICAgICAgICAgICAgYnR0dl9udW0sYnR2LT5pZCwgYnR2LT5yZXZpc2lvbiwgcGNpX25hbWUoZGV2KSk7CisgICAgICAgIHByaW50aygiaXJxOiAlZCwgbGF0ZW5jeTogJWQsIG1taW86IDB4JWx4XG4iLAorCSAgICAgICBidHYtPmMucGNpLT5pcnEsIGxhdCwgcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwwKSk7CisJc2NoZWR1bGUoKTsKKworCWJ0di0+YnQ4NDhfbW1pbz1pb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsMCksIDB4MTAwMCk7CisJaWYgKE5VTEwgPT0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LDApLCAweDEwMDApKSB7CisJCXByaW50aygiYnR0diVkOiBpb3JlbWFwKCkgZmFpbGVkXG4iLCBidHYtPmMubnIpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGZhaWwxOworCX0KKworICAgICAgICAvKiBpZGVudGlmeSBjYXJkICovCisJYnR0dl9pZGNhcmQoYnR2KTsKKworICAgICAgICAvKiBkaXNhYmxlIGlycXMsIHJlZ2lzdGVyIGlycSBoYW5kbGVyICovCisJYnR3cml0ZSgwLCBCVDg0OF9JTlRfTUFTSyk7CisgICAgICAgIHJlc3VsdCA9IHJlcXVlc3RfaXJxKGJ0di0+Yy5wY2ktPmlycSwgYnR0dl9pcnEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBX1NISVJRIHwgU0FfSU5URVJSVVBULGJ0di0+Yy5uYW1lLCh2b2lkICopYnR2KTsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImJ0dHYlZDogY2FuJ3QgZ2V0IElSUSAlZFxuIiwKKwkJICAgICAgIGJ0dHZfbnVtLGJ0di0+Yy5wY2ktPmlycSk7CisJCWdvdG8gZmFpbDE7CisgICAgICAgIH0KKworCWlmICgwICE9IGJ0dHZfaGFuZGxlX2NoaXBzZXQoYnR2KSkgeworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGZhaWwyOworICAgICAgICB9CisKKwkvKiBpbml0IG9wdGlvbnMgZnJvbSBpbnNtb2QgYXJncyAqLworCWJ0di0+b3B0X2NvbWJmaWx0ZXIgPSBjb21iZmlsdGVyOworCWJ0di0+b3B0X2x1bWFmaWx0ZXIgPSBsdW1hZmlsdGVyOworCWJ0di0+b3B0X2F1dG9tdXRlICAgPSBhdXRvbXV0ZTsKKwlidHYtPm9wdF9jaHJvbWFfYWdjID0gY2hyb21hX2FnYzsKKwlidHYtPm9wdF9hZGNfY3J1c2ggID0gYWRjX2NydXNoOworCWJ0di0+b3B0X3Zjcl9oYWNrICAgPSB2Y3JfaGFjazsKKwlidHYtPm9wdF93aGl0ZWNydXNoX3VwcGVyICA9IHdoaXRlY3J1c2hfdXBwZXI7CisJYnR2LT5vcHRfd2hpdGVjcnVzaF9sb3dlciAgPSB3aGl0ZWNydXNoX2xvd2VyOworCisJLyogZmlsbCBzdHJ1Y3QgYnR0diB3aXRoIHNvbWUgdXNlZnVsIGRlZmF1bHRzICovCisJYnR2LT5pbml0LmJ0diAgICAgICAgID0gYnR2OworCWJ0di0+aW5pdC5vdi53LndpZHRoICA9IDMyMDsKKwlidHYtPmluaXQub3Yudy5oZWlnaHQgPSAyNDA7CisJYnR2LT5pbml0LmZtdCAgICAgICAgID0gZm9ybWF0X2J5X3BhbGV0dGUoVklERU9fUEFMRVRURV9SR0IyNCk7CisJYnR2LT5pbml0LndpZHRoICAgICAgID0gMzIwOworCWJ0di0+aW5pdC5oZWlnaHQgICAgICA9IDI0MDsKKwlidHYtPmluaXQubGluZXMgICAgICAgPSAxNjsKKwlidHYtPmlucHV0ID0gMDsKKworCS8qIGluaXRpYWxpemUgaGFyZHdhcmUgKi8KKyAgICAgICAgaWYgKGJ0dHZfZ3BpbykKKyAgICAgICAgICAgICAgICBidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJwcmUtaW5pdCIpOworCisJYnR0dl9yaXNjX2luaXRfbWFpbihidHYpOworCWluaXRfYnQ4NDgoYnR2KTsKKworCS8qIGdwaW8gKi8KKyAgICAgICAgYnR3cml0ZSgweDAwLCBCVDg0OF9HUElPX1JFR19JTlApOworICAgICAgICBidHdyaXRlKDB4MDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsKKyAgICAgICAgaWYgKGJ0dHZfdmVyYm9zZSkKKyAgICAgICAgICAgICAgICBidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJpbml0Iik7CisKKyAgICAgICAgLyogbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgaTJjIGlzIHJlZ2lzdGVyZWQgKi8KKyAgICAgICAgYnR0dl9pbml0X2NhcmQxKGJ0dik7CisKKyAgICAgICAgLyogcmVnaXN0ZXIgaTJjICsgZ3BpbyAqLworICAgICAgICBpbml0X2J0dHZfaTJjKGJ0dik7CisKKyAgICAgICAgLyogc29tZSBjYXJkLXNwZWNpZmljIHN0dWZmIChuZWVkcyB3b3JraW5nIGkyYykgKi8KKyAgICAgICAgYnR0dl9pbml0X2NhcmQyKGJ0dik7CisJaW5pdF9pcnFyZWcoYnR2KTsKKworICAgICAgICAvKiByZWdpc3RlciB2aWRlbzRsaW51eCArIGlucHV0ICovCisJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX3ZpZGVvKSB7CisJCWJ0dHZfcmVnaXN0ZXJfdmlkZW8oYnR2KTsKKwkJYnQ4NDhfYnJpZ2h0KGJ0diwzMjc2OCk7CisJCWJ0ODQ4X2NvbnRyYXN0KGJ0diwzMjc2OCk7CisJCWJ0ODQ4X2h1ZShidHYsMzI3NjgpOworCQlidDg0OF9zYXQoYnR2LDMyNzY4KTsKKwkJYXVkaW9fbXV4KGJ0dixBVURJT19NVVRFKTsKKwkJc2V0X2lucHV0KGJ0diwwKTsKKwl9CisKKwkvKiBhZGQgc3ViZGV2aWNlcyAqLworCWlmIChidHYtPmhhc19yZW1vdGUpCisJCWJ0dHZfc3ViX2FkZF9kZXZpY2UoJmJ0di0+YywgInJlbW90ZSIpOworCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19kdmIpCisJCWJ0dHZfc3ViX2FkZF9kZXZpY2UoJmJ0di0+YywgImR2YiIpOworCisJLyogZXZlcnl0aGluZyBpcyBmaW5lICovCisJYnR0dl9udW0rKzsKKyAgICAgICAgcmV0dXJuIDA7CisKKyBmYWlsMjoKKyAgICAgICAgZnJlZV9pcnEoYnR2LT5jLnBjaS0+aXJxLGJ0dik7CisKKyBmYWlsMToKKwlpZiAoYnR2LT5idDg0OF9tbWlvKQorCQlpb3VubWFwKGJ0di0+YnQ4NDhfbW1pbyk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChidHYtPmMucGNpLDApLAorCQkJICAgcGNpX3Jlc291cmNlX2xlbihidHYtPmMucGNpLDApKTsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LE5VTEwpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBidHR2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKyAgICAgICAgc3RydWN0IGJ0dHYgKmJ0diA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKworCWlmIChidHR2X3ZlcmJvc2UpCisJCXByaW50aygiYnR0diVkOiB1bmxvYWRpbmdcbiIsYnR2LT5jLm5yKTsKKworICAgICAgICAvKiBzaHV0ZG93biBldmVyeXRoaW5nIChETUErSVJRcykgKi8KKwlidGFuZCh+MTUsIEJUODQ4X0dQSU9fRE1BX0NUTCk7CisJYnR3cml0ZSgwLCBCVDg0OF9JTlRfTUFTSyk7CisJYnR3cml0ZSh+MHgwLCBCVDg0OF9JTlRfU1RBVCk7CisJYnR3cml0ZSgweDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsKKwlpZiAoYnR0dl9ncGlvKQorCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJjbGVhbnVwIik7CisKKwkvKiB0ZWxsIGdwaW8gbW9kdWxlcyB3ZSBhcmUgbGVhdmluZyAuLi4gKi8KKwlidHYtPnNodXRkb3duPTE7CisJd2FrZV91cCgmYnR2LT5ncGlvcSk7CisJYnR0dl9zdWJfZGVsX2RldmljZXMoJmJ0di0+Yyk7CisKKyAgICAgICAgLyogdW5yZWdpc3RlciBpMmNfYnVzICsgaW5wdXQgKi8KKwlmaW5pX2J0dHZfaTJjKGJ0dik7CisKKwkvKiB1bnJlZ2lzdGVyIHZpZGVvNGxpbnV4ICovCisJYnR0dl91bnJlZ2lzdGVyX3ZpZGVvKGJ0dik7CisKKwkvKiBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKwlidGN4X3Jpc2NtZW1fZnJlZShidHYtPmMucGNpLCZidHYtPm1haW4pOworCisJLyogZnJlZSByZXNzb3VyY2VzICovCisgICAgICAgIGZyZWVfaXJxKGJ0di0+Yy5wY2ktPmlycSxidHYpOworCWlvdW5tYXAoYnR2LT5idDg0OF9tbWlvKTsKKyAgICAgICAgcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChidHYtPmMucGNpLDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3Jlc291cmNlX2xlbihidHYtPmMucGNpLDApKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IGJ0dHZfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworICAgICAgICBzdHJ1Y3QgYnR0diAqYnR2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBidHR2X2J1ZmZlcl9zZXQgaWRsZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZHByaW50aygiYnR0diVkOiBzdXNwZW5kICVkXG4iLCBidHYtPmMubnIsIHN0YXRlKTsKKworCS8qIHN0b3AgZG1hICsgaXJxcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZidHYtPnNfbG9jayxmbGFncyk7CisJbWVtc2V0KCZpZGxlLCAwLCBzaXplb2YoaWRsZSkpOworCWJ0di0+c3RhdGUudmlkZW8gPSBidHYtPmN1cnI7CisJYnR2LT5zdGF0ZS52YmkgICA9IGJ0di0+Y3ZiaTsKKwlidHYtPnN0YXRlLmxvb3BfaXJxID0gYnR2LT5sb29wX2lycTsKKwlidHYtPmN1cnIgPSBpZGxlOworCWJ0di0+bG9vcF9pcnEgPSAwOworCWJ0dHZfYnVmZmVyX2FjdGl2YXRlX3ZpZGVvKGJ0diwgJmlkbGUpOworCWJ0dHZfYnVmZmVyX2FjdGl2YXRlX3ZiaShidHYsIE5VTEwpOworCWJ0dHZfc2V0X2RtYShidHYsIDApOworCWJ0d3JpdGUoMCwgQlQ4NDhfSU5UX01BU0spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ0di0+c19sb2NrLGZsYWdzKTsKKworCS8qIHNhdmUgYnQ4Nzggc3RhdGUgKi8KKwlidHYtPnN0YXRlLmdwaW9fZW5hYmxlID0gYnRyZWFkKEJUODQ4X0dQSU9fT1VUX0VOKTsKKwlidHYtPnN0YXRlLmdwaW9fZGF0YSAgID0gZ3Bpb19yZWFkKCk7CisKKwkvKiBzYXZlIHBjaSBzdGF0ZSAqLworCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOworCWlmICgwICE9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgcGNpX2Nob29zZV9zdGF0ZShwY2lfZGV2LCBzdGF0ZSkpKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKwkJYnR2LT5zdGF0ZS5kaXNhYmxlZCA9IDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0dHZfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworICAgICAgICBzdHJ1Y3QgYnR0diAqYnR2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKCJidHR2JWQ6IHJlc3VtZVxuIiwgYnR2LT5jLm5yKTsKKworCS8qIHJlc3RvcmUgcGNpIHN0YXRlICovCisJaWYgKGJ0di0+c3RhdGUuZGlzYWJsZWQpIHsKKwkJcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCWJ0di0+c3RhdGUuZGlzYWJsZWQgPSAwOworCX0KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CisKKwkvKiByZXN0b3JlIGJ0ODc4IHN0YXRlICovCisJYnR0dl9yZWluaXRfYnQ4NDgoYnR2KTsKKwlncGlvX2lub3V0KDB4ZmZmZmZmLCBidHYtPnN0YXRlLmdwaW9fZW5hYmxlKTsKKwlncGlvX3dyaXRlKGJ0di0+c3RhdGUuZ3Bpb19kYXRhKTsKKworCS8qIHJlc3RhcnQgZG1hICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJ0di0+c19sb2NrLGZsYWdzKTsKKwlidHYtPmN1cnIgPSBidHYtPnN0YXRlLnZpZGVvOworCWJ0di0+Y3ZiaSA9IGJ0di0+c3RhdGUudmJpOworCWJ0di0+bG9vcF9pcnEgPSBidHYtPnN0YXRlLmxvb3BfaXJxOworCWJ0dHZfYnVmZmVyX2FjdGl2YXRlX3ZpZGVvKGJ0diwgJmJ0di0+Y3Vycik7CisJYnR0dl9idWZmZXJfYWN0aXZhdGVfdmJpKGJ0diwgYnR2LT5jdmJpKTsKKwlidHR2X3NldF9kbWEoYnR2LCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidHYtPnNfbG9jayxmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBidHR2X3BjaV90YmxbXSA9IHsKKyAgICAgICAge1BDSV9WRU5ET1JfSURfQlJPT0tUUkVFLCBQQ0lfREVWSUNFX0lEX0JUODQ4LAorICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfQlJPT0tUUkVFLCBQQ0lfREVWSUNFX0lEX0JUODQ5LAorICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfQlJPT0tUUkVFLCBQQ0lfREVWSUNFX0lEX0JUODc4LAorICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfQlJPT0tUUkVFLCBQQ0lfREVWSUNFX0lEX0JUODc5LAorICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisgICAgICAgIHswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBidHR2X3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYnR0dl9wY2lfZHJpdmVyID0geworICAgICAgICAubmFtZSAgICAgPSAiYnR0diIsCisgICAgICAgIC5pZF90YWJsZSA9IGJ0dHZfcGNpX3RibCwKKyAgICAgICAgLnByb2JlICAgID0gYnR0dl9wcm9iZSwKKyAgICAgICAgLnJlbW92ZSAgID0gX19kZXZleGl0X3AoYnR0dl9yZW1vdmUpLAorCS5zdXNwZW5kICA9IGJ0dHZfc3VzcGVuZCwKKwkucmVzdW1lICAgPSBidHR2X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgYnR0dl9pbml0X21vZHVsZSh2b2lkKQoreworCWJ0dHZfbnVtID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKKwkgICAgICAgKEJUVFZfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCisJICAgICAgIChCVFRWX1ZFUlNJT05fQ09ERSA+PiA4KSAmIDB4ZmYsCisJICAgICAgIEJUVFZfVkVSU0lPTl9DT0RFICYgMHhmZik7CisjaWZkZWYgU05BUFNIT1QKKwlwcmludGsoS0VSTl9JTkZPICJidHR2OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAorCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOworI2VuZGlmCisJaWYgKGdidWZmZXJzIDwgMiB8fCBnYnVmZmVycyA+IFZJREVPX01BWF9GUkFNRSkKKwkJZ2J1ZmZlcnMgPSAyOworCWlmIChnYnVmc2l6ZSA8IDAgfHwgZ2J1ZnNpemUgPiBCVFRWX01BWF9GQlVGKQorCQlnYnVmc2l6ZSA9IEJUVFZfTUFYX0ZCVUY7CisJZ2J1ZnNpemUgPSAoZ2J1ZnNpemUgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKKwlpZiAoYnR0dl92ZXJib3NlKQorCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiB1c2luZyAlZCBidWZmZXJzIHdpdGggJWRrICglZCBwYWdlcykgZWFjaCBmb3IgY2FwdHVyZVxuIiwKKwkJICAgICAgIGdidWZmZXJzLCBnYnVmc2l6ZSA+PiAxMCwgZ2J1ZnNpemUgPj4gUEFHRV9TSElGVCk7CisKKwlidHR2X2NoZWNrX2NoaXBzZXQoKTsKKworCWJ1c19yZWdpc3RlcigmYnR0dl9zdWJfYnVzX3R5cGUpOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmJ0dHZfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGJ0dHZfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJ0dHZfcGNpX2RyaXZlcik7CisJYnVzX3VucmVnaXN0ZXIoJmJ0dHZfc3ViX2J1c190eXBlKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KGJ0dHZfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYnR0dl9jbGVhbnVwX21vZHVsZSk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWdwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzMyMGNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWdwaW8uYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAgICAkSWQ6IGJ0dHYtZ3Bpby5jLHYgMS43IDIwMDUvMDIvMTYgMTI6MTQ6MTAga3JheGVsIEV4cCAkCisKKyAgICBidHR2LWdwaW8uYyAgLS0gIGdwaW8gc3ViIGRyaXZlcnMKKworICAgIHN5c2ZzLWJhc2VkIHN1YiBkcml2ZXIgaW50ZXJmYWNlIGZvciBidHR2CisgICAgbWFpbmx5IGludGVudGVkIGZvciBncGlvIGFjY2VzcworCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYgTWFyY3VzIE1ldHpsZXIgKG1vY21AdGhwLnVuaS1rb2Vsbi5kZSkKKyAgICAoYykgMTk5OS0yMDAzIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJidHR2cC5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogaW50ZXJuYWw6IHRoZSBidHR2ICJidXMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGludCBidHR2X3N1Yl9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBidHR2X3N1Yl9kcml2ZXIgKnN1YiA9IHRvX2J0dHZfc3ViX2RydihkcnYpOworCWludCBsZW4gPSBzdHJsZW4oc3ViLT53YW50ZWQpOworCisJaWYgKDAgPT0gc3RybmNtcChkZXYtPmJ1c19pZCwgc3ViLT53YW50ZWQsIGxlbikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYnVzX3R5cGUgYnR0dl9zdWJfYnVzX3R5cGUgPSB7CisJLm5hbWUgID0gImJ0dHYtc3ViIiwKKwkubWF0Y2ggPSAmYnR0dl9zdWJfYnVzX21hdGNoLAorfTsKK0VYUE9SVF9TWU1CT0woYnR0dl9zdWJfYnVzX3R5cGUpOworCitzdGF0aWMgdm9pZCByZWxlYXNlX3N1Yl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1YiA9IHRvX2J0dHZfc3ViX2RldihkZXYpOworCWtmcmVlKHN1Yik7Cit9CisKK2ludCBidHR2X3N1Yl9hZGRfZGV2aWNlKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUsIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViOworCWludCBlcnI7CisKKwlzdWIgPSBrbWFsbG9jKHNpemVvZigqc3ViKSxHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBzdWIpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChzdWIsMCxzaXplb2YoKnN1YikpOworCisJc3ViLT5jb3JlICAgICAgICA9IGNvcmU7CisJc3ViLT5kZXYucGFyZW50ICA9ICZjb3JlLT5wY2ktPmRldjsKKwlzdWItPmRldi5idXMgICAgID0gJmJ0dHZfc3ViX2J1c190eXBlOworCXN1Yi0+ZGV2LnJlbGVhc2UgPSByZWxlYXNlX3N1Yl9kZXZpY2U7CisJc25wcmludGYoc3ViLT5kZXYuYnVzX2lkLHNpemVvZihzdWItPmRldi5idXNfaWQpLCIlcyVkIiwKKwkJIG5hbWUsIGNvcmUtPm5yKTsKKworCWVyciA9IGRldmljZV9yZWdpc3Rlcigmc3ViLT5kZXYpOworCWlmICgwICE9IGVycikgeworCQlrZnJlZShzdWIpOworCQlyZXR1cm4gZXJyOworCX0KKwlwcmludGsoImJ0dHYlZDogYWRkIHN1YmRldmljZSBcIiVzXCJcbiIsIGNvcmUtPm5yLCBzdWItPmRldi5idXNfaWQpOworCWxpc3RfYWRkX3RhaWwoJnN1Yi0+bGlzdCwmY29yZS0+c3Vicyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHR2X3N1Yl9kZWxfZGV2aWNlcyhzdHJ1Y3QgYnR0dl9jb3JlICpjb3JlKQoreworCXN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1YjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtLCpzYXZlOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZW0sc2F2ZSwmY29yZS0+c3VicykgeworCQlzdWIgPSBsaXN0X2VudHJ5KGl0ZW0sc3RydWN0IGJ0dHZfc3ViX2RldmljZSxsaXN0KTsKKwkJbGlzdF9kZWwoJnN1Yi0+bGlzdCk7CisJCWRldmljZV91bnJlZ2lzdGVyKCZzdWItPmRldik7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGJ0dHZfZ3Bpb19pcnEoc3RydWN0IGJ0dHZfY29yZSAqY29yZSkKK3sKKwlzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyICpkcnY7CisJc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlsaXN0X2Zvcl9lYWNoKGl0ZW0sJmNvcmUtPnN1YnMpIHsKKwkJZGV2ID0gbGlzdF9lbnRyeShpdGVtLHN0cnVjdCBidHR2X3N1Yl9kZXZpY2UsbGlzdCk7CisJCWRydiA9IHRvX2J0dHZfc3ViX2RydihkZXYtPmRldi5kcml2ZXIpOworCQlpZiAoZHJ2ICYmIGRydi0+Z3Bpb19pcnEpCisJCQlkcnYtPmdwaW9faXJxKGRldik7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZXh0ZXJuYWw6IHN1Yi1kcml2ZXIgcmVnaXN0ZXIvdW5yZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IGJ0dHZfc3ViX3JlZ2lzdGVyKHN0cnVjdCBidHR2X3N1Yl9kcml2ZXIgKnN1YiwgY2hhciAqd2FudGVkKQoreworCXN1Yi0+ZHJ2LmJ1cyA9ICZidHR2X3N1Yl9idXNfdHlwZTsKKwlzbnByaW50ZihzdWItPndhbnRlZCxzaXplb2Yoc3ViLT53YW50ZWQpLCIlcyIsd2FudGVkKTsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZzdWItPmRydik7Cit9CitFWFBPUlRfU1lNQk9MKGJ0dHZfc3ViX3JlZ2lzdGVyKTsKKworaW50IGJ0dHZfc3ViX3VucmVnaXN0ZXIoc3RydWN0IGJ0dHZfc3ViX2RyaXZlciAqc3ViKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZzdWItPmRydik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGJ0dHZfc3ViX3VucmVnaXN0ZXIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZXh0ZXJuYWw6IGdwaW8gYWNjZXNzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordm9pZCBidHR2X2dwaW9faW5vdXQoc3RydWN0IGJ0dHZfY29yZSAqY29yZSwgdTMyIG1hc2ssIHUzMiBvdXRiaXRzKQoreworCXN0cnVjdCBidHR2ICpidHYgPSBjb250YWluZXJfb2YoY29yZSwgc3RydWN0IGJ0dHYsIGMpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGRhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnR2LT5ncGlvX2xvY2ssZmxhZ3MpOworCWRhdGEgPSBidHJlYWQoQlQ4NDhfR1BJT19PVVRfRU4pOworCWRhdGEgPSBkYXRhICYgfm1hc2s7CisJZGF0YSA9IGRhdGEgfCAobWFzayAmIG91dGJpdHMpOworCWJ0d3JpdGUoZGF0YSxCVDg0OF9HUElPX09VVF9FTik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnR2LT5ncGlvX2xvY2ssZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChidHR2X2dwaW9faW5vdXQpOworCit1MzIgYnR0dl9ncGlvX3JlYWQoc3RydWN0IGJ0dHZfY29yZSAqY29yZSkKK3sKKwlzdHJ1Y3QgYnR0diAqYnR2ID0gY29udGFpbmVyX29mKGNvcmUsIHN0cnVjdCBidHR2LCBjKTsKKwl1MzIgdmFsdWU7CisKKwl2YWx1ZSA9IGJ0cmVhZChCVDg0OF9HUElPX0RBVEEpOworCXJldHVybiB2YWx1ZTsKK30KK0VYUE9SVF9TWU1CT0woYnR0dl9ncGlvX3JlYWQpOworCit2b2lkIGJ0dHZfZ3Bpb193cml0ZShzdHJ1Y3QgYnR0dl9jb3JlICpjb3JlLCB1MzIgdmFsdWUpCit7CisJc3RydWN0IGJ0dHYgKmJ0diA9IGNvbnRhaW5lcl9vZihjb3JlLCBzdHJ1Y3QgYnR0diwgYyk7CisKKwlidHdyaXRlKHZhbHVlLEJUODQ4X0dQSU9fREFUQSk7Cit9CitFWFBPUlRfU1lNQk9MKGJ0dHZfZ3Bpb193cml0ZSk7CisKK3ZvaWQgYnR0dl9ncGlvX2JpdHMoc3RydWN0IGJ0dHZfY29yZSAqY29yZSwgdTMyIG1hc2ssIHUzMiBiaXRzKQoreworCXN0cnVjdCBidHR2ICpidHYgPSBjb250YWluZXJfb2YoY29yZSwgc3RydWN0IGJ0dHYsIGMpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGRhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnR2LT5ncGlvX2xvY2ssZmxhZ3MpOworCWRhdGEgPSBidHJlYWQoQlQ4NDhfR1BJT19EQVRBKTsKKwlkYXRhID0gZGF0YSAmIH5tYXNrOworCWRhdGEgPSBkYXRhIHwgKG1hc2sgJiBiaXRzKTsKKwlidHdyaXRlKGRhdGEsQlQ4NDhfR1BJT19EQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidHYtPmdwaW9fbG9jayxmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGJ0dHZfZ3Bpb19iaXRzKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDJmMWVjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYwpAQCAtMCwwICsxLDQ2MSBAQAorLyoKKyAgICAkSWQ6IGJ0dHYtaTJjLmMsdiAxLjE4IDIwMDUvMDIvMTYgMTI6MTQ6MTAga3JheGVsIEV4cCAkCisKKyAgICBidHR2LWkyYy5jICAtLSAgYWxsIHRoZSBpMmMgY29kZSBpcyBoZXJlCisKKyAgICBidHR2IC0gQnQ4NDggZnJhbWUgZ3JhYmJlciBkcml2ZXIKKworICAgIENvcHlyaWdodCAoQykgMTk5Niw5Nyw5OCBSYWxwaCAgTWV0emxlciAocmprbUB0aHAudW5pLWtvZWxuLmRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBNYXJjdXMgTWV0emxlciAobW9jbUB0aHAudW5pLWtvZWxuLmRlKQorICAgIChjKSAxOTk5LTIwMDMgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiYnR0dnAuaCIKKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSBidHR2X2kyY19hbGdvX2JpdF90ZW1wbGF0ZTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgYnR0dl9pMmNfYWRhcF9zd190ZW1wbGF0ZTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgYnR0dl9pMmNfYWRhcF9od190ZW1wbGF0ZTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBidHR2X2kyY19jbGllbnRfdGVtcGxhdGU7CisKK3N0YXRpYyBpbnQgYXR0YWNoX2luZm9ybShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIGludCBpMmNfZGVidWcgPSAwOworc3RhdGljIGludCBpMmNfaHcgPSAwOworc3RhdGljIGludCBpMmNfc2NhbiA9IDA7Cittb2R1bGVfcGFyYW0oaTJjX2RlYnVnLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGkyY19odywgICAgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShpMmNfc2NhbiwgIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGkyY19zY2FuLCJzY2FuIGkyYyBidXMgYXQgaW5zbW9kIHRpbWUiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEkyQyBmdW5jdGlvbnMgLSBiaXRiYW5naW5nIGFkYXB0ZXIgKHNvZnR3YXJlIGkyYykgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyB2b2lkIGJ0dHZfYml0X3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGJ0dHYgKmJ0diA9IChzdHJ1Y3QgYnR0diopZGF0YTsKKworCWlmIChzdGF0ZSkKKwkJYnR2LT5pMmNfc3RhdGUgfD0gMHgwMjsKKwllbHNlCisJCWJ0di0+aTJjX3N0YXRlICY9IH4weDAyOworCWJ0d3JpdGUoYnR2LT5pMmNfc3RhdGUsIEJUODQ4X0kyQyk7CisJYnRyZWFkKEJUODQ4X0kyQyk7Cit9CisKK3N0YXRpYyB2b2lkIGJ0dHZfYml0X3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGJ0dHYgKmJ0diA9IChzdHJ1Y3QgYnR0diopZGF0YTsKKworCWlmIChzdGF0ZSkKKwkJYnR2LT5pMmNfc3RhdGUgfD0gMHgwMTsKKwllbHNlCisJCWJ0di0+aTJjX3N0YXRlICY9IH4weDAxOworCWJ0d3JpdGUoYnR2LT5pMmNfc3RhdGUsIEJUODQ4X0kyQyk7CisJYnRyZWFkKEJUODQ4X0kyQyk7Cit9CisKK3N0YXRpYyBpbnQgYnR0dl9iaXRfZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJ0dHYgKmJ0diA9IChzdHJ1Y3QgYnR0diopZGF0YTsKKwlpbnQgc3RhdGU7CisKKwlzdGF0ZSA9IGJ0cmVhZChCVDg0OF9JMkMpICYgMHgwMiA/IDEgOiAwOworCXJldHVybiBzdGF0ZTsKK30KKworc3RhdGljIGludCBidHR2X2JpdF9nZXRzZGEodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYnR0diAqYnR2ID0gKHN0cnVjdCBidHR2KilkYXRhOworCWludCBzdGF0ZTsKKworCXN0YXRlID0gYnRyZWFkKEJUODQ4X0kyQykgJiAweDAxOworCXJldHVybiBzdGF0ZTsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSBidHR2X2kyY19hbGdvX2JpdF90ZW1wbGF0ZSA9IHsKKwkuc2V0c2RhICA9IGJ0dHZfYml0X3NldHNkYSwKKwkuc2V0c2NsICA9IGJ0dHZfYml0X3NldHNjbCwKKwkuZ2V0c2RhICA9IGJ0dHZfYml0X2dldHNkYSwKKwkuZ2V0c2NsICA9IGJ0dHZfYml0X2dldHNjbCwKKwkudWRlbGF5ICA9IDE2LAorCS5tZGVsYXkgID0gMTAsCisJLnRpbWVvdXQgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGJ0dHZfaTJjX2FkYXBfc3dfdGVtcGxhdGUgPSB7CisJLm93bmVyICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCisjaWZkZWYgSTJDX0NMQVNTX1RWX0FOQUxPRworCS5jbGFzcyAgICAgICAgICAgICA9IEkyQ19DTEFTU19UVl9BTkFMT0csCisjZW5kaWYKKwlJMkNfREVWTkFNRSgiYnQ4NDgiKSwKKwkuaWQgICAgICAgICAgICAgICAgPSBJMkNfSFdfQl9CVDg0OCwKKwkuY2xpZW50X3JlZ2lzdGVyICAgPSBhdHRhY2hfaW5mb3JtLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEkyQyBmdW5jdGlvbnMgLSBoYXJkd2FyZSBpMmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBpbnQgYWxnb19jb250cm9sKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGZ1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19FTVVMOworfQorCitzdGF0aWMgaW50CitidHR2X2kyY193YWl0X2RvbmUoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQgcmMgPSAwOworCisJYWRkX3dhaXRfcXVldWUoJmJ0di0+aTJjX3F1ZXVlLCAmd2FpdCk7CisJaWYgKDAgPT0gYnR2LT5pMmNfZG9uZSkKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMjApOworCXJlbW92ZV93YWl0X3F1ZXVlKCZidHYtPmkyY19xdWV1ZSwgJndhaXQpOworCisJaWYgKDAgPT0gYnR2LT5pMmNfZG9uZSkKKwkJLyogdGltZW91dCAqLworCQlyYyA9IC1FSU87CisJaWYgKGJ0di0+aTJjX2RvbmUgJiBCVDg0OF9JTlRfUkFDSykKKwkJcmMgPSAxOworCWJ0di0+aTJjX2RvbmUgPSAwOworCXJldHVybiByYzsKK30KKworI2RlZmluZSBJMkNfSFcgKEJUODc4X0kyQ19NT0RFICB8IEJUODQ4X0kyQ19TWU5DIHxcCisJCUJUODQ4X0kyQ19TQ0wgfCBCVDg0OF9JMkNfU0RBKQorCitzdGF0aWMgaW50CitidHR2X2kyY19zZW5kYnl0ZXMoc3RydWN0IGJ0dHYgKmJ0diwgY29uc3Qgc3RydWN0IGkyY19tc2cgKm1zZywgaW50IGxhc3QpCit7CisJdTMyIHhtaXQ7CisJaW50IHJldHZhbCxjbnQ7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKDAgPT0gbXNnLT5sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc3RhcnQsIGFkZHJlc3MgKyBmaXJzdCBieXRlICovCisJeG1pdCA9IChtc2ctPmFkZHIgPDwgMjUpIHwgKG1zZy0+YnVmWzBdIDw8IDE2KSB8IEkyQ19IVzsKKwlpZiAobXNnLT5sZW4gPiAxIHx8ICFsYXN0KQorCQl4bWl0IHw9IEJUODc4X0kyQ19OT1NUT1A7CisJYnR3cml0ZSh4bWl0LCBCVDg0OF9JMkMpOworCXJldHZhbCA9IGJ0dHZfaTJjX3dhaXRfZG9uZShidHYpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycjsKKwlpZiAocmV0dmFsID09IDApCisJCWdvdG8gZWlvOworCWlmIChpMmNfZGVidWcpIHsKKwkJcHJpbnRrKCIgPFcgJTAyeCAlMDJ4IiwgbXNnLT5hZGRyIDw8IDEsIG1zZy0+YnVmWzBdKTsKKwkJaWYgKCEoeG1pdCAmIEJUODc4X0kyQ19OT1NUT1ApKQorCQkJcHJpbnRrKCIgPlxuIik7CisJfQorCisJZm9yIChjbnQgPSAxOyBjbnQgPCBtc2ctPmxlbjsgY250KysgKSB7CisJCS8qIGZvbGxvd2luZyBieXRlcyAqLworCQl4bWl0ID0gKG1zZy0+YnVmW2NudF0gPDwgMjQpIHwgSTJDX0hXIHwgQlQ4NzhfSTJDX05PU1RBUlQ7CisJCWlmIChjbnQgPCBtc2ctPmxlbi0xIHx8ICFsYXN0KQorCQkJeG1pdCB8PSBCVDg3OF9JMkNfTk9TVE9QOworCQlidHdyaXRlKHhtaXQsIEJUODQ4X0kyQyk7CisJCXJldHZhbCA9IGJ0dHZfaTJjX3dhaXRfZG9uZShidHYpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWdvdG8gZXJyOworCQlpZiAocmV0dmFsID09IDApCisJCQlnb3RvIGVpbzsKKwkJaWYgKGkyY19kZWJ1ZykgeworCQkJcHJpbnRrKCIgJTAyeCIsIG1zZy0+YnVmW2NudF0pOworCQkJaWYgKCEoeG1pdCAmIEJUODc4X0kyQ19OT1NUT1ApKQorCQkJCXByaW50aygiID5cbiIpOworCQl9CisJfQorCXJldHVybiBtc2ctPmxlbjsKKworIGVpbzoKKwlyZXR2YWwgPSAtRUlPOworIGVycjoKKwlpZiAoaTJjX2RlYnVnKQorCQlwcmludGsoIiBFUlI6ICVkXG4iLHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorYnR0dl9pMmNfcmVhZGJ5dGVzKHN0cnVjdCBidHR2ICpidHYsIGNvbnN0IHN0cnVjdCBpMmNfbXNnICptc2csIGludCBsYXN0KQoreworCXUzMiB4bWl0OworCXUzMiBjbnQ7CisJaW50IHJldHZhbDsKKworCWZvcihjbnQgPSAwOyBjbnQgPCBtc2ctPmxlbjsgY250KyspIHsKKwkJeG1pdCA9IChtc2ctPmFkZHIgPDwgMjUpIHwgKDEgPDwgMjQpIHwgSTJDX0hXOworCQlpZiAoY250IDwgbXNnLT5sZW4tMSkKKwkJCXhtaXQgfD0gQlQ4NDhfSTJDX1czQjsKKwkJaWYgKGNudCA8IG1zZy0+bGVuLTEgfHwgIWxhc3QpCisJCQl4bWl0IHw9IEJUODc4X0kyQ19OT1NUT1A7CisJCWlmIChjbnQpCisJCQl4bWl0IHw9IEJUODc4X0kyQ19OT1NUQVJUOworCQlidHdyaXRlKHhtaXQsIEJUODQ4X0kyQyk7CisJCXJldHZhbCA9IGJ0dHZfaTJjX3dhaXRfZG9uZShidHYpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWdvdG8gZXJyOworCQlpZiAocmV0dmFsID09IDApCisJCQlnb3RvIGVpbzsKKwkJbXNnLT5idWZbY250XSA9ICgodTMyKWJ0cmVhZChCVDg0OF9JMkMpID4+IDgpICYgMHhmZjsKKwkJaWYgKGkyY19kZWJ1ZykgeworCQkJaWYgKCEoeG1pdCAmIEJUODc4X0kyQ19OT1NUQVJUKSkKKwkJCQlwcmludGsoIiA8UiAlMDJ4IiwgKG1zZy0+YWRkciA8PCAxKSArMSk7CisJCQlwcmludGsoIiA9JTAyeCIsIG1zZy0+YnVmW2NudF0pOworCQkJaWYgKCEoeG1pdCAmIEJUODc4X0kyQ19OT1NUT1ApKQorCQkJCXByaW50aygiID5cbiIpOworCQl9CisJfQorCXJldHVybiBtc2ctPmxlbjsKKworIGVpbzoKKwlyZXR2YWwgPSAtRUlPOworIGVycjoKKwlpZiAoaTJjX2RlYnVnKQorCQlwcmludGsoIiBFUlI6ICVkXG4iLHJldHZhbCk7CisgICAgICAgCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgYnR0dl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywgaW50IG51bSkKK3sKKwlzdHJ1Y3QgYnR0diAqYnR2ID0gaTJjX2dldF9hZGFwZGF0YShpMmNfYWRhcCk7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGk7CisKKwlpZiAoaTJjX2RlYnVnKQorCQlwcmludGsoImJ0LWkyYzoiKTsKKwlidHdyaXRlKEJUODQ4X0lOVF9JMkNET05FfEJUODQ4X0lOVF9SQUNLLCBCVDg0OF9JTlRfU1RBVCk7CisJZm9yIChpID0gMCA7IGkgPCBudW07IGkrKykgeworCQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7CisJCQkvKiByZWFkICovCisJCQlyZXR2YWwgPSBidHR2X2kyY19yZWFkYnl0ZXMoYnR2LCAmbXNnc1tpXSwgaSsxID09IG51bSk7CisJCQlpZiAocmV0dmFsIDwgMCkKKwkJCQlnb3RvIGVycjsKKwkJfSBlbHNlIHsKKwkJCS8qIHdyaXRlICovCisJCQlyZXR2YWwgPSBidHR2X2kyY19zZW5kYnl0ZXMoYnR2LCAmbXNnc1tpXSwgaSsxID09IG51bSk7CisJCQlpZiAocmV0dmFsIDwgMCkKKwkJCQlnb3RvIGVycjsKKwkJfQorCX0KKwlyZXR1cm4gbnVtOworCisgZXJyOgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBidHR2X2FsZ28gPSB7CisJLm5hbWUgICAgICAgICAgPSAiYnQ4NzgiLAorCS5pZCAgICAgICAgICAgID0gSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfQlQ4NDggLyogRklYTUUgKi8sCisJLm1hc3Rlcl94ZmVyICAgPSBidHR2X2kyY194ZmVyLAorCS5hbGdvX2NvbnRyb2wgID0gYWxnb19jb250cm9sLAorCS5mdW5jdGlvbmFsaXR5ID0gZnVuY3Rpb25hbGl0eSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgYnR0dl9pMmNfYWRhcF9od190ZW1wbGF0ZSA9IHsKKwkub3duZXIgICAgICAgICA9IFRISVNfTU9EVUxFLAorI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKKwkuY2xhc3MgICAgICAgICA9IEkyQ19DTEFTU19UVl9BTkFMT0csCisjZW5kaWYKKwlJMkNfREVWTkFNRSgiYnQ4NzgiKSwKKwkuaWQgICAgICAgICAgICA9IEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4IC8qIEZJWE1FICovLAorCS5hbGdvICAgICAgICAgID0gJmJ0dHZfYWxnbywKKwkuY2xpZW50X3JlZ2lzdGVyID0gYXR0YWNoX2luZm9ybSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBJMkMgZnVuY3Rpb25zIC0gY29tbW9uIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgaW50IGF0dGFjaF9pbmZvcm0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKyAgICAgICAgc3RydWN0IGJ0dHYgKmJ0diA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKworCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpCisJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsVFVORVJfU0VUX1RZUEUsJmJ0di0+dHVuZXJfdHlwZSk7CisJaWYgKGJ0di0+cGlubmFjbGVfaWQgIT0gVU5TRVQpCisJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsQVVEQ19DT05GSUdfUElOTkFDTEUsCisJCQkJICAgICAgJmJ0di0+cGlubmFjbGVfaWQpOworICAgICAgICBpZiAoYnR0dl9kZWJ1ZykKKwkJcHJpbnRrKCJidHR2JWQ6IGkyYyBhdHRhY2ggW2NsaWVudD0lc11cbiIsCisJCSAgICAgICBidHYtPmMubnIsIGkyY19jbGllbnRuYW1lKGNsaWVudCkpOworICAgICAgICByZXR1cm4gMDsKK30KKwordm9pZCBidHR2X2NhbGxfaTJjX2NsaWVudHMoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWlmICgwICE9IGJ0di0+aTJjX3JjKQorCQlyZXR1cm47CisJaTJjX2NsaWVudHNfY29tbWFuZCgmYnR2LT5jLmkyY19hZGFwLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBidHR2X2kyY19jbGllbnRfdGVtcGxhdGUgPSB7CisJSTJDX0RFVk5BTUUoImJ0dHYgaW50ZXJuYWwiKSwKK307CisKKworLyogcmVhZCBJMkMgKi8KK2ludCBidHR2X0kyQ1JlYWQoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgY2hhciBhZGRyLCBjaGFyICpwcm9iZV9mb3IpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyID0gMDsKKworCWlmICgwICE9IGJ0di0+aTJjX3JjKQorCQlyZXR1cm4gLTE7CisJaWYgKGJ0dHZfdmVyYm9zZSAmJiBOVUxMICE9IHByb2JlX2ZvcikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBpMmM6IGNoZWNraW5nIGZvciAlcyBAIDB4JTAyeC4uLiAiLAorCQkgICAgICAgYnR2LT5jLm5yLHByb2JlX2ZvcixhZGRyKTsKKyAgICAgICAgYnR2LT5pMmNfY2xpZW50LmFkZHIgPSBhZGRyID4+IDE7CisgICAgICAgIGlmICgxICE9IGkyY19tYXN0ZXJfcmVjdigmYnR2LT5pMmNfY2xpZW50LCAmYnVmZmVyLCAxKSkgeworCQlpZiAoTlVMTCAhPSBwcm9iZV9mb3IpIHsKKwkJCWlmIChidHR2X3ZlcmJvc2UpCisJCQkJcHJpbnRrKCJub3QgZm91bmRcbiIpOworCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogaTJjIHJlYWQgMHgleDogZXJyb3JcbiIsCisJCQkgICAgICAgYnR2LT5jLm5yLGFkZHIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKwl9CisJaWYgKGJ0dHZfdmVyYm9zZSAmJiBOVUxMICE9IHByb2JlX2ZvcikKKwkJcHJpbnRrKCJmb3VuZFxuIik7CisgICAgICAgIHJldHVybiBidWZmZXI7Cit9CisKKy8qIHdyaXRlIEkyQyAqLworaW50IGJ0dHZfSTJDV3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgY2hhciBhZGRyLCB1bnNpZ25lZCBjaGFyIGIxLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGIyLCBpbnQgYm90aCkKK3sKKyAgICAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbMl07CisgICAgICAgIGludCBieXRlcyA9IGJvdGggPyAyIDogMTsKKworCWlmICgwICE9IGJ0di0+aTJjX3JjKQorCQlyZXR1cm4gLTE7CisgICAgICAgIGJ0di0+aTJjX2NsaWVudC5hZGRyID0gYWRkciA+PiAxOworICAgICAgICBidWZmZXJbMF0gPSBiMTsKKyAgICAgICAgYnVmZmVyWzFdID0gYjI7CisgICAgICAgIGlmIChieXRlcyAhPSBpMmNfbWFzdGVyX3NlbmQoJmJ0di0+aTJjX2NsaWVudCwgYnVmZmVyLCBieXRlcykpCisJCXJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgRUVQUk9NIGNvbnRlbnQgKi8KK3ZvaWQgX19kZXZpbml0IGJ0dHZfcmVhZGVlKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGNoYXIgKmVlZGF0YSwgaW50IGFkZHIpCit7CisJYnR2LT5pMmNfY2xpZW50LmFkZHIgPSBhZGRyID4+IDE7CisJdHZlZXByb21fcmVhZCgmYnR2LT5pMmNfY2xpZW50LCBlZWRhdGEsIDI1Nik7Cit9CisKK3N0YXRpYyBjaGFyICppMmNfZGV2c1sxMjhdID0geworCVsgMHgzMCA+PiAxIF0gPSAiSVIgKGhhdXBwYXVnZSkiLAorCVsgMHg4MCA+PiAxIF0gPSAibXNwMzR4eCIsCisJWyAweDg2ID4+IDEgXSA9ICJ0ZGE5ODg3IiwKKwlbIDB4YTAgPj4gMSBdID0gImVlcHJvbSIsCisJWyAweGMwID4+IDEgXSA9ICJ0dW5lciAoYW5hbG9nKSIsCisJWyAweGMyID4+IDEgXSA9ICJ0dW5lciAoYW5hbG9nKSIsCit9OworCitzdGF0aWMgdm9pZCBkb19pMmNfc2NhbihjaGFyICpuYW1lLCBzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgaSxyYzsKKworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQljLT5hZGRyID0gaTsKKwkJcmMgPSBpMmNfbWFzdGVyX3JlY3YoYywmYnVmLDApOworCQlpZiAocmMgPCAwKQorCQkJY29udGludWU7CisJCXByaW50aygiJXM6IGkyYyBzY2FuOiBmb3VuZCBkZXZpY2UgQCAweCV4ICBbJXNdXG4iLAorCQkgICAgICAgbmFtZSwgaSA8PCAxLCBpMmNfZGV2c1tpXSA/IGkyY19kZXZzW2ldIDogIj8/PyIpOworCX0KK30KKworLyogaW5pdCArIHJlZ2lzdGVyIGkyYyBhbGdvLWJpdCBhZGFwdGVyICovCitpbnQgX19kZXZpbml0IGluaXRfYnR0dl9pMmMoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwltZW1jcHkoJmJ0di0+aTJjX2NsaWVudCwgJmJ0dHZfaTJjX2NsaWVudF90ZW1wbGF0ZSwKKwkgICAgICAgc2l6ZW9mKGJ0dHZfaTJjX2NsaWVudF90ZW1wbGF0ZSkpOworCisJaWYgKGkyY19odykKKwkJYnR2LT51c2VfaTJjX2h3ID0gMTsKKwlpZiAoYnR2LT51c2VfaTJjX2h3KSB7CisJCS8qIGJ0ODc4ICovCisJCW1lbWNweSgmYnR2LT5jLmkyY19hZGFwLCAmYnR0dl9pMmNfYWRhcF9od190ZW1wbGF0ZSwKKwkJICAgICAgIHNpemVvZihidHR2X2kyY19hZGFwX2h3X3RlbXBsYXRlKSk7CisJfSBlbHNlIHsKKwkJLyogYnQ4NDggKi8KKwkJbWVtY3B5KCZidHYtPmMuaTJjX2FkYXAsICZidHR2X2kyY19hZGFwX3N3X3RlbXBsYXRlLAorCQkgICAgICAgc2l6ZW9mKGJ0dHZfaTJjX2FkYXBfc3dfdGVtcGxhdGUpKTsKKwkJbWVtY3B5KCZidHYtPmkyY19hbGdvLCAmYnR0dl9pMmNfYWxnb19iaXRfdGVtcGxhdGUsCisJCSAgICAgICBzaXplb2YoYnR0dl9pMmNfYWxnb19iaXRfdGVtcGxhdGUpKTsKKwkJYnR2LT5pMmNfYWxnby5kYXRhID0gYnR2OworCQlidHYtPmMuaTJjX2FkYXAuYWxnb19kYXRhID0gJmJ0di0+aTJjX2FsZ287CisJfQorCisJYnR2LT5jLmkyY19hZGFwLmRldi5wYXJlbnQgPSAmYnR2LT5jLnBjaS0+ZGV2OworCXNucHJpbnRmKGJ0di0+Yy5pMmNfYWRhcC5uYW1lLCBzaXplb2YoYnR2LT5jLmkyY19hZGFwLm5hbWUpLAorCQkgImJ0JWQgIyVkIFslc10iLCBidHYtPmlkLCBidHYtPmMubnIsCisJCSBidHYtPnVzZV9pMmNfaHcgPyAiaHciIDogInN3Iik7CisKKyAgICAgICAgaTJjX3NldF9hZGFwZGF0YSgmYnR2LT5jLmkyY19hZGFwLCBidHYpOworICAgICAgICBidHYtPmkyY19jbGllbnQuYWRhcHRlciA9ICZidHYtPmMuaTJjX2FkYXA7CisKKyNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCisJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdmlkZW8pCisJCWJ0di0+Yy5pMmNfYWRhcC5jbGFzcyAmPSB+STJDX0NMQVNTX1RWX0FOQUxPRzsKKwlpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfZHZiKQorCQlidHYtPmMuaTJjX2FkYXAuY2xhc3MgfD0gSTJDX0NMQVNTX1RWX0RJR0lUQUw7CisjZW5kaWYKKworCWlmIChidHYtPnVzZV9pMmNfaHcpIHsKKwkJYnR2LT5pMmNfcmMgPSBpMmNfYWRkX2FkYXB0ZXIoJmJ0di0+Yy5pMmNfYWRhcCk7CisJfSBlbHNlIHsKKwkJYnR0dl9iaXRfc2V0c2NsKGJ0diwxKTsKKwkJYnR0dl9iaXRfc2V0c2RhKGJ0diwxKTsKKwkJYnR2LT5pMmNfcmMgPSBpMmNfYml0X2FkZF9idXMoJmJ0di0+Yy5pMmNfYWRhcCk7CisJfQorCWlmICgwID09IGJ0di0+aTJjX3JjICYmIGkyY19zY2FuKQorCQlkb19pMmNfc2NhbihidHYtPmMubmFtZSwmYnR2LT5pMmNfY2xpZW50KTsKKwlyZXR1cm4gYnR2LT5pMmNfcmM7Cit9CisKK2ludCBfX2RldmV4aXQgZmluaV9idHR2X2kyYyhzdHJ1Y3QgYnR0diAqYnR2KQoreworCWlmICgwICE9IGJ0di0+aTJjX3JjKQorCQlyZXR1cm4gMDsKKworCWlmIChidHYtPnVzZV9pMmNfaHcpIHsKKwkJcmV0dXJuIGkyY19kZWxfYWRhcHRlcigmYnR2LT5jLmkyY19hZGFwKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gaTJjX2JpdF9kZWxfYnVzKCZidHYtPmMuaTJjX2FkYXApOworCX0KK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiNTU0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pZi5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICAgICRJZDogYnR0di1pZi5jLHYgMS40IDIwMDQvMTEvMTcgMTg6NDc6NDcga3JheGVsIEV4cCAkCisKKyAgICBidHR2LWlmLmMgIC0tICBvbGQgZ3BpbyBpbnRlcmZhY2UgdG8gb3RoZXIga2VybmVsIG1vZHVsZXMKKyAgICAgICAgICAgICAgICAgICBkb24ndCB1c2UgaW4gbmV3IGNvZGUsIHdpbGwgZ28gYXdheSBpbiAyLjcKKwkJICAgaGF2ZSBhIGxvb2sgYXQgYnR0di1ncGlvLmMgaW5zdGVhZC4KKworICAgIGJ0dHYgLSBCdDg0OCBmcmFtZSBncmFiYmVyIGRyaXZlcgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk2LDk3LDk4IFJhbHBoICBNZXR6bGVyIChyamttQHRocC51bmkta29lbG4uZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIChtb2NtQHRocC51bmkta29lbG4uZGUpCisgICAgKGMpIDE5OTktMjAwMyBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiYnR0dnAuaCIKKworRVhQT1JUX1NZTUJPTChidHR2X2dldF9jYXJkaW5mbyk7CitFWFBPUlRfU1lNQk9MKGJ0dHZfZ2V0X3BjaWRldik7CitFWFBPUlRfU1lNQk9MKGJ0dHZfZ2V0X2lkKTsKK0VYUE9SVF9TWU1CT0woYnR0dl9ncGlvX2VuYWJsZSk7CitFWFBPUlRfU1lNQk9MKGJ0dHZfcmVhZF9ncGlvKTsKK0VYUE9SVF9TWU1CT0woYnR0dl93cml0ZV9ncGlvKTsKK0VYUE9SVF9TWU1CT0woYnR0dl9nZXRfZ3Bpb19xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKGJ0dHZfaTJjX2NhbGwpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0gZm9yIG90aGVyIG1vZHVsZXMgd2hpY2ggd2FudCB0byBhY2Nlc3MgdGhlICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIGdwaW8gcG9ydHMgKElSIGZvciBleGFtcGxlKSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICBzZWUgYnR0di5oIGZvciBjb21tZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgYnR0dl9nZXRfY2FyZGluZm8odW5zaWduZWQgaW50IGNhcmQsIGludCAqdHlwZSwgdW5zaWduZWQgKmNhcmRpZCkKK3sKKwlwcmludGsoIlRoZSBidHR2XyogaW50ZXJmYWNlIGlzIG9ic29sZXRlIGFuZCB3aWxsIGdvIGF3YXksXG4iCisJICAgICAgICJwbGVhc2UgdXNlIHRoZSBuZXcsIHN5c2ZzIGJhc2VkIGludGVyZmFjZSBpbnN0ZWFkLlxuIik7CisJaWYgKGNhcmQgPj0gYnR0dl9udW0pIHsKKwkJcmV0dXJuIC0xOworCX0KKwkqdHlwZSAgID0gYnR0dnNbY2FyZF0uYy50eXBlOworCSpjYXJkaWQgPSBidHR2c1tjYXJkXS5jYXJkaWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwY2lfZGV2KiBidHR2X2dldF9wY2lkZXYodW5zaWduZWQgaW50IGNhcmQpCit7CisJaWYgKGNhcmQgPj0gYnR0dl9udW0pCisJCXJldHVybiBOVUxMOworCXJldHVybiBidHR2c1tjYXJkXS5jLnBjaTsKK30KKworaW50IGJ0dHZfZ2V0X2lkKHVuc2lnbmVkIGludCBjYXJkKQoreworCXByaW50aygiVGhlIGJ0dHZfKiBpbnRlcmZhY2UgaXMgb2Jzb2xldGUgYW5kIHdpbGwgZ28gYXdheSxcbiIKKwkgICAgICAgInBsZWFzZSB1c2UgdGhlIG5ldywgc3lzZnMgYmFzZWQgaW50ZXJmYWNlIGluc3RlYWQuXG4iKTsKKwlpZiAoY2FyZCA+PSBidHR2X251bSkgeworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBidHR2c1tjYXJkXS5jLnR5cGU7Cit9CisKKworaW50IGJ0dHZfZ3Bpb19lbmFibGUodW5zaWduZWQgaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBidHR2ICpidHY7CisKKwlpZiAoY2FyZCA+PSBidHR2X251bSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidHYgPSAmYnR0dnNbY2FyZF07CisJZ3Bpb19pbm91dChtYXNrLGRhdGEpOworCWlmIChidHR2X2dwaW8pCisJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImV4dGVybiBlbmFibGUiKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0dHZfcmVhZF9ncGlvKHVuc2lnbmVkIGludCBjYXJkLCB1bnNpZ25lZCBsb25nICpkYXRhKQoreworCXN0cnVjdCBidHR2ICpidHY7CisKKwlpZiAoY2FyZCA+PSBidHR2X251bSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidHYgPSAmYnR0dnNbY2FyZF07CisKKwlpZihidHYtPnNodXRkb3duKSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKworLyogcHJpb3Igc2V0dGluZyBCVDg0OF9HUElPX1JFR19JTlAgaXMgKHByb2JhYmx5KSBub3QgbmVlZGVkCisgICBiZWNhdXNlIHdlIHNldCBkaXJlY3QgaW5wdXQgb24gaW5pdCAqLworCSpkYXRhID0gZ3Bpb19yZWFkKCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHR2X3dyaXRlX2dwaW8odW5zaWduZWQgaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBidHR2ICpidHY7CisKKwlpZiAoY2FyZCA+PSBidHR2X251bSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidHYgPSAmYnR0dnNbY2FyZF07CisKKy8qIHByaW9yIHNldHRpbmcgQlQ4NDhfR1BJT19SRUdfSU5QIGlzIChwcm9iYWJseSkgbm90IG5lZWRlZAorICAgYmVjYXVzZSBkaXJlY3QgaW5wdXQgaXMgc2V0IG9uIGluaXQgKi8KKwlncGlvX2JpdHMobWFzayxkYXRhKTsKKwlpZiAoYnR0dl9ncGlvKQorCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJleHRlcm4gd3JpdGUiKTsKKwlyZXR1cm4gMDsKK30KKword2FpdF9xdWV1ZV9oZWFkX3QqIGJ0dHZfZ2V0X2dwaW9fcXVldWUodW5zaWduZWQgaW50IGNhcmQpCit7CisJc3RydWN0IGJ0dHYgKmJ0djsKKworCWlmIChjYXJkID49IGJ0dHZfbnVtKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWJ0diA9ICZidHR2c1tjYXJkXTsKKwlpZiAoYnR0dnNbY2FyZF0uc2h1dGRvd24pIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAmYnR2LT5ncGlvcTsKK30KKwordm9pZCBidHR2X2kyY19jYWxsKHVuc2lnbmVkIGludCBjYXJkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJaWYgKGNhcmQgPj0gYnR0dl9udW0pCisJCXJldHVybjsKKwlidHR2X2NhbGxfaTJjX2NsaWVudHMoJmJ0dHZzW2NhcmRdLCBjbWQsIGFyZyk7Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtcmlzYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXJpc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM1Y2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXJpc2MuYwpAQCAtMCwwICsxLDgwMiBAQAorLyoKKyAgICAkSWQ6IGJ0dHYtcmlzYy5jLHYgMS4xMCAyMDA0LzExLzE5IDE4OjA3OjEyIGtyYXhlbCBFeHAgJAorCisgICAgYnR0di1yaXNjLmMgIC0tICBpbnRlcmZhY2VzIHRvIG90aGVyIGtlcm5lbCBtb2R1bGVzCisKKyAgICBidHR2IHJpc2MgY29kZSBoYW5kbGluZworCS0gbWVtb3J5IG1hbmFnZW1lbnQKKwktIGdlbmVyYXRpb24KKworICAgIChjKSAyMDAwLTIwMDMgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2luY2x1ZGUgImJ0dHZwLmgiCisKKyNkZWZpbmUgVkNSX0hBQ0tfTElORVMgNAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiByaXNjIGNvZGUgZ2VuZXJhdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2ludAorYnR0dl9yaXNjX3BhY2tlZChzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJCSB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgYnBsLAorCQkgdW5zaWduZWQgaW50IHBhZGRpbmcsIHVuc2lnbmVkIGludCBsaW5lcykKK3sKKwl1MzIgaW5zdHJ1Y3Rpb25zLGxpbmUsdG9kbzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXUzMiAqcnA7CisJaW50IHJjOworCisJLyogZXN0aW1hdGUgcmlzYyBtZW06IHdvcnN0IGNhc2UgaXMgb25lIHdyaXRlIHBlciBwYWdlIGJvcmRlciArCisJICAgb25lIHdyaXRlIHBlciBzY2FuIGxpbmUgKyBzeW5jICsganVtcCAoYWxsIDIgZHdvcmRzKSAqLworCWluc3RydWN0aW9ucyAgPSAoYnBsICogbGluZXMpIC8gUEFHRV9TSVpFICsgbGluZXM7CisJaW5zdHJ1Y3Rpb25zICs9IDI7CisJaWYgKChyYyA9IGJ0Y3hfcmlzY21lbV9hbGxvYyhidHYtPmMucGNpLHJpc2MsaW5zdHJ1Y3Rpb25zKjgpKSA8IDApCisJCXJldHVybiByYzsKKworCS8qIHN5bmMgaW5zdHJ1Y3Rpb24gKi8KKwlycCA9IHJpc2MtPmNwdTsKKwkqKHJwKyspID0gY3B1X3RvX2xlMzIoQlQ4NDhfUklTQ19TWU5DfEJUODQ4X0ZJRk9fU1RBVFVTX0ZNMSk7CisJKihycCsrKSA9IGNwdV90b19sZTMyKDApOworCisJLyogc2NhbiBsaW5lcyAqLworCXNnID0gc2dsaXN0OworCWZvciAobGluZSA9IDA7IGxpbmUgPCBsaW5lczsgbGluZSsrKSB7CisJCWlmICgoYnR2LT5vcHRfdmNyX2hhY2spICYmCisJCSAgICAobGluZSA+PSAobGluZXMgLSBWQ1JfSEFDS19MSU5FUykpKQorCQkJY29udGludWU7CisJCXdoaWxlIChvZmZzZXQgJiYgb2Zmc2V0ID49IHNnX2RtYV9sZW4oc2cpKSB7CisJCQlvZmZzZXQgLT0gc2dfZG1hX2xlbihzZyk7CisJCQlzZysrOworCQl9CisJCWlmIChicGwgPD0gc2dfZG1hX2xlbihzZyktb2Zmc2V0KSB7CisJCQkvKiBmaXRzIGludG8gY3VycmVudCBjaHVuayAqLworICAgICAgICAgICAgICAgICAgICAgICAgKihycCsrKT1jcHVfdG9fbGUzMihCVDg0OF9SSVNDX1dSSVRFfEJUODQ4X1JJU0NfU09MfAorCQkJCQkgICAgQlQ4NDhfUklTQ19FT0x8YnBsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoocnArKyk9Y3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3Moc2cpK29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQrPWJwbDsKKwkJfSBlbHNlIHsKKwkJCS8qIHNjYW5saW5lIG5lZWRzIHRvIGJlIHNwbGl0dGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICB0b2RvID0gYnBsOworICAgICAgICAgICAgICAgICAgICAgICAgKihycCsrKT1jcHVfdG9fbGUzMihCVDg0OF9SSVNDX1dSSVRFfEJUODQ4X1JJU0NfU09MfAorCQkJCQkgICAgKHNnX2RtYV9sZW4oc2cpLW9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKihycCsrKT1jcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzZykrb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvZG8gLT0gKHNnX2RtYV9sZW4oc2cpLW9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc2crKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0b2RvID4gc2dfZG1hX2xlbihzZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihycCsrKT1jcHVfdG9fbGUzMihCVDg0OF9SSVNDX1dSSVRFfAorCQkJCQkJICAgIHNnX2RtYV9sZW4oc2cpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihycCsrKT1jcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzZykpOworCQkJCXRvZG8gLT0gc2dfZG1hX2xlbihzZyk7CisJCQkJc2crKzsKKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICoocnArKyk9Y3B1X3RvX2xlMzIoQlQ4NDhfUklTQ19XUklURXxCVDg0OF9SSVNDX0VPTHwKKwkJCQkJICAgIHRvZG8pOworCQkJKihycCsrKT1jcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzZykpOworCQkJb2Zmc2V0ICs9IHRvZG87CisJCX0KKwkJb2Zmc2V0ICs9IHBhZGRpbmc7CisJfQorCisJLyogc2F2ZSBwb2ludGVyIHRvIGptcCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCisJcmlzYy0+am1wID0gcnA7CisJQlVHX09OKChyaXNjLT5qbXAgLSByaXNjLT5jcHUgKyAyKSAvIDQgPiByaXNjLT5zaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYnR0dl9yaXNjX3BsYW5hcihzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJCSB1bnNpZ25lZCBpbnQgeW9mZnNldCwgIHVuc2lnbmVkIGludCB5YnBsLAorCQkgdW5zaWduZWQgaW50IHlwYWRkaW5nLCB1bnNpZ25lZCBpbnQgeWxpbmVzLAorCQkgdW5zaWduZWQgaW50IHVvZmZzZXQsICB1bnNpZ25lZCBpbnQgdm9mZnNldCwKKwkJIHVuc2lnbmVkIGludCBoc2hpZnQsICAgdW5zaWduZWQgaW50IHZzaGlmdCwKKwkJIHVuc2lnbmVkIGludCBjcGFkZGluZykKK3sKKwl1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25zLGxpbmUsdG9kbyx5bGVuLGNocm9tYTsKKwl1MzIgKnJwLHJpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqeXNnOworCXN0cnVjdCBzY2F0dGVybGlzdCAqdXNnOworCXN0cnVjdCBzY2F0dGVybGlzdCAqdnNnOworCWludCB0b3BmaWVsZCA9ICgwID09IHlvZmZzZXQpOworCWludCByYzsKKworCS8qIGVzdGltYXRlIHJpc2MgbWVtOiB3b3JzdCBjYXNlIGlzIG9uZSB3cml0ZSBwZXIgcGFnZSBib3JkZXIgKworCSAgIG9uZSB3cml0ZSBwZXIgc2NhbiBsaW5lICg1IGR3b3JkcykKKwkgICBwbHVzIHN5bmMgKyBqdW1wICgyIGR3b3JkcykgKi8KKwlpbnN0cnVjdGlvbnMgID0gKHlicGwgKiB5bGluZXMgKiAyKSAvIFBBR0VfU0laRSArIHlsaW5lczsKKwlpbnN0cnVjdGlvbnMgKz0gMjsKKwlpZiAoKHJjID0gYnRjeF9yaXNjbWVtX2FsbG9jKGJ0di0+Yy5wY2kscmlzYyxpbnN0cnVjdGlvbnMqNCo1KSkgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBzeW5jIGluc3RydWN0aW9uICovCisJcnAgPSByaXNjLT5jcHU7CisJKihycCsrKSA9IGNwdV90b19sZTMyKEJUODQ4X1JJU0NfU1lOQ3xCVDg0OF9GSUZPX1NUQVRVU19GTTMpOworCSoocnArKykgPSBjcHVfdG9fbGUzMigwKTsKKworCS8qIHNjYW4gbGluZXMgKi8KKwl5c2cgPSBzZ2xpc3Q7CisJdXNnID0gc2dsaXN0OworCXZzZyA9IHNnbGlzdDsKKwlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgeWxpbmVzOyBsaW5lKyspIHsKKwkJaWYgKChidHYtPm9wdF92Y3JfaGFjaykgJiYKKwkJICAgIChsaW5lID49ICh5bGluZXMgLSBWQ1JfSEFDS19MSU5FUykpKQorCQkJY29udGludWU7CisJCXN3aXRjaCAodnNoaWZ0KSB7CisJCWNhc2UgMDoKKwkJCWNocm9tYSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKHRvcGZpZWxkKQorCQkJCWNocm9tYSA9ICgobGluZSAmIDEpID09IDApOworCQkJZWxzZQorCQkJCWNocm9tYSA9ICgobGluZSAmIDEpID09IDEpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmICh0b3BmaWVsZCkKKwkJCQljaHJvbWEgPSAoKGxpbmUgJiAzKSA9PSAwKTsKKwkJCWVsc2UKKwkJCQljaHJvbWEgPSAoKGxpbmUgJiAzKSA9PSAyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2hyb21hID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJZm9yICh0b2RvID0geWJwbDsgdG9kbyA+IDA7IHRvZG8gLT0geWxlbikgeworCQkJLyogZ28gdG8gbmV4dCBzZyBlbnRyeSBpZiBuZWVkZWQgKi8KKwkJCXdoaWxlICh5b2Zmc2V0ICYmIHlvZmZzZXQgPj0gc2dfZG1hX2xlbih5c2cpKSB7CisJCQkJeW9mZnNldCAtPSBzZ19kbWFfbGVuKHlzZyk7CisJCQkJeXNnKys7CisJCQl9CisJCQl3aGlsZSAodW9mZnNldCAmJiB1b2Zmc2V0ID49IHNnX2RtYV9sZW4odXNnKSkgeworCQkJCXVvZmZzZXQgLT0gc2dfZG1hX2xlbih1c2cpOworCQkJCXVzZysrOworCQkJfQorCQkJd2hpbGUgKHZvZmZzZXQgJiYgdm9mZnNldCA+PSBzZ19kbWFfbGVuKHZzZykpIHsKKwkJCQl2b2Zmc2V0IC09IHNnX2RtYV9sZW4odnNnKTsKKwkJCQl2c2crKzsKKwkJCX0KKworCQkJLyogY2FsY3VsYXRlIG1heCBudW1iZXIgb2YgYnl0ZXMgd2UgY2FuIHdyaXRlICovCisJCQl5bGVuID0gdG9kbzsKKwkJCWlmICh5b2Zmc2V0ICsgeWxlbiA+IHNnX2RtYV9sZW4oeXNnKSkKKwkJCQl5bGVuID0gc2dfZG1hX2xlbih5c2cpIC0geW9mZnNldDsKKwkJCWlmIChjaHJvbWEpIHsKKwkJCQlpZiAodW9mZnNldCArICh5bGVuPj5oc2hpZnQpID4gc2dfZG1hX2xlbih1c2cpKQorCQkJCQl5bGVuID0gKHNnX2RtYV9sZW4odXNnKSAtIHVvZmZzZXQpIDw8IGhzaGlmdDsKKwkJCQlpZiAodm9mZnNldCArICh5bGVuPj5oc2hpZnQpID4gc2dfZG1hX2xlbih2c2cpKQorCQkJCQl5bGVuID0gKHNnX2RtYV9sZW4odnNnKSAtIHZvZmZzZXQpIDw8IGhzaGlmdDsKKwkJCQlyaSA9IEJUODQ4X1JJU0NfV1JJVEUxMjM7CisJCQl9IGVsc2UgeworCQkJCXJpID0gQlQ4NDhfUklTQ19XUklURTFTMjM7CisJCQl9CisJCQlpZiAoeWJwbCA9PSB0b2RvKQorCQkJCXJpIHw9IEJUODQ4X1JJU0NfU09MOworCQkJaWYgKHlsZW4gPT0gdG9kbykKKwkJCQlyaSB8PSBCVDg0OF9SSVNDX0VPTDsKKworCQkJLyogd3JpdGUgcmlzYyBpbnN0cnVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKihycCsrKT1jcHVfdG9fbGUzMihyaSB8IHlsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgKihycCsrKT1jcHVfdG9fbGUzMigoKHlsZW4gPj4gaHNoaWZ0KSA8PCAxNikgfAorCQkJCQkgICAgKHlsZW4gPj4gaHNoaWZ0KSk7CisJCQkqKHJwKyspPWNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKHlzZykreW9mZnNldCk7CisJCQl5b2Zmc2V0ICs9IHlsZW47CisJCQlpZiAoY2hyb21hKSB7CisJCQkJKihycCsrKT1jcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyh1c2cpK3VvZmZzZXQpOworCQkJCXVvZmZzZXQgKz0geWxlbiA+PiBoc2hpZnQ7CisJCQkJKihycCsrKT1jcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyh2c2cpK3ZvZmZzZXQpOworCQkJCXZvZmZzZXQgKz0geWxlbiA+PiBoc2hpZnQ7CisJCQl9CisJCX0KKwkJeW9mZnNldCArPSB5cGFkZGluZzsKKwkJaWYgKGNocm9tYSkgeworCQkJdW9mZnNldCArPSBjcGFkZGluZzsKKwkJCXZvZmZzZXQgKz0gY3BhZGRpbmc7CisJCX0KKwl9CisKKwkvKiBzYXZlIHBvaW50ZXIgdG8gam1wIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KKwlyaXNjLT5qbXAgPSBycDsKKwlCVUdfT04oKHJpc2MtPmptcCAtIHJpc2MtPmNwdSArIDIpIC8gNCA+IHJpc2MtPnNpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitidHR2X3Jpc2Nfb3ZlcmxheShzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkgIGNvbnN0IHN0cnVjdCBidHR2X2Zvcm1hdCAqZm10LCBzdHJ1Y3QgYnR0dl9vdmVybGF5ICpvdiwKKwkJICBpbnQgc2tpcF9ldmVuLCBpbnQgc2tpcF9vZGQpCit7CisJaW50IGluc3RydWN0aW9ucyxyYyxsaW5lLG1heHksc3RhcnQsZW5kLHNraXAsbnNraXBzOworCXN0cnVjdCBidGN4X3NraXBsaXN0ICpza2lwczsKKwl1MzIgKnJwLHJpLHJhOworCXUzMiBhZGRyOworCisJLyogc2tpcCBsaXN0IGZvciB3aW5kb3cgY2xpcHBpbmcgKi8KKwlpZiAoTlVMTCA9PSAoc2tpcHMgPSBrbWFsbG9jKHNpemVvZigqc2tpcHMpICogb3YtPm5jbGlwcyxHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogZXN0aW1hdGUgcmlzYyBtZW06IHdvcnN0IGNhc2UgaXMgKGNsaXArMSkgKiBsaW5lcyBpbnN0cnVjdGlvbnMKKwkgICArIHN5bmMgKyBqdW1wIChhbGwgMiBkd29yZHMpICovCisJaW5zdHJ1Y3Rpb25zICA9IChvdi0+bmNsaXBzICsgMSkgKgorCQkoKHNraXBfZXZlbiB8fCBza2lwX29kZCkgPyBvdi0+dy5oZWlnaHQ+PjEgOiAgb3YtPncuaGVpZ2h0KTsKKwlpbnN0cnVjdGlvbnMgKz0gMjsKKwlpZiAoKHJjID0gYnRjeF9yaXNjbWVtX2FsbG9jKGJ0di0+Yy5wY2kscmlzYyxpbnN0cnVjdGlvbnMqOCkpIDwgMCkgeworCQlrZnJlZShza2lwcyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBzeW5jIGluc3RydWN0aW9uICovCisJcnAgPSByaXNjLT5jcHU7CisJKihycCsrKSA9IGNwdV90b19sZTMyKEJUODQ4X1JJU0NfU1lOQ3xCVDg0OF9GSUZPX1NUQVRVU19GTTEpOworCSoocnArKykgPSBjcHVfdG9fbGUzMigwKTsKKworCWFkZHIgID0gKHVuc2lnbmVkIGxvbmcpYnR2LT5mYnVmLmJhc2U7CisJYWRkciArPSBidHYtPmZidWYuZm10LmJ5dGVzcGVybGluZSAqIG92LT53LnRvcDsKKwlhZGRyICs9IChmbXQtPmRlcHRoID4+IDMpICAgICAgICAgICogb3YtPncubGVmdDsKKworCS8qIHNjYW4gbGluZXMgKi8KKwlmb3IgKG1heHkgPSAtMSwgbGluZSA9IDA7IGxpbmUgPCBvdi0+dy5oZWlnaHQ7CisJICAgICBsaW5lKyssIGFkZHIgKz0gYnR2LT5mYnVmLmZtdC5ieXRlc3BlcmxpbmUpIHsKKwkJaWYgKChidHYtPm9wdF92Y3JfaGFjaykgJiYKKwkJICAgICAobGluZSA+PSAob3YtPncuaGVpZ2h0IC0gVkNSX0hBQ0tfTElORVMpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGxpbmUlMikgPT0gMCAgJiYgIHNraXBfZXZlbikKKwkJCWNvbnRpbnVlOworCQlpZiAoKGxpbmUlMikgPT0gMSAgJiYgIHNraXBfb2RkKQorCQkJY29udGludWU7CisKKwkJLyogY2FsY3VsYXRlIGNsaXBwaW5nICovCisJCWlmIChsaW5lID4gbWF4eSkKKwkJCWJ0Y3hfY2FsY19za2lwcyhsaW5lLCBvdi0+dy53aWR0aCwgJm1heHksCisJCQkJCXNraXBzLCAmbnNraXBzLCBvdi0+Y2xpcHMsIG92LT5uY2xpcHMpOworCisJCS8qIHdyaXRlIG91dCByaXNjIGNvZGUgKi8KKwkJZm9yIChzdGFydCA9IDAsIHNraXAgPSAwOyBzdGFydCA8IG92LT53LndpZHRoOyBzdGFydCA9IGVuZCkgeworCQkJaWYgKHNraXAgPj0gbnNraXBzKSB7CisJCQkJcmkgID0gQlQ4NDhfUklTQ19XUklURTsKKwkJCQllbmQgPSBvdi0+dy53aWR0aDsKKwkJCX0gZWxzZSBpZiAoc3RhcnQgPCBza2lwc1tza2lwXS5zdGFydCkgeworCQkJCXJpICA9IEJUODQ4X1JJU0NfV1JJVEU7CisJCQkJZW5kID0gc2tpcHNbc2tpcF0uc3RhcnQ7CisJCQl9IGVsc2UgeworCQkJCXJpICA9IEJUODQ4X1JJU0NfU0tJUDsKKwkJCQllbmQgPSBza2lwc1tza2lwXS5lbmQ7CisJCQkJc2tpcCsrOworCQkJfQorCQkJaWYgKEJUODQ4X1JJU0NfV1JJVEUgPT0gcmkpCisJCQkJcmEgPSBhZGRyICsgKGZtdC0+ZGVwdGg+PjMpKnN0YXJ0OworCQkJZWxzZQorCQkJCXJhID0gMDsKKworCQkJaWYgKDAgPT0gc3RhcnQpCisJCQkJcmkgfD0gQlQ4NDhfUklTQ19TT0w7CisJCQlpZiAob3YtPncud2lkdGggPT0gZW5kKQorCQkJCXJpIHw9IEJUODQ4X1JJU0NfRU9MOworCQkJcmkgfD0gKGZtdC0+ZGVwdGg+PjMpICogKGVuZC1zdGFydCk7CisKKwkJCSoocnArKyk9Y3B1X3RvX2xlMzIocmkpOworCQkJaWYgKDAgIT0gcmEpCisJCQkJKihycCsrKT1jcHVfdG9fbGUzMihyYSk7CisJCX0KKwl9CisKKwkvKiBzYXZlIHBvaW50ZXIgdG8gam1wIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KKwlyaXNjLT5qbXAgPSBycDsKKwlCVUdfT04oKHJpc2MtPmptcCAtIHJpc2MtPmNwdSArIDIpIC8gNCA+IHJpc2MtPnNpemUpOworCWtmcmVlKHNraXBzKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorYnR0dl9jYWxjX2dlbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgYnR0dl9nZW9tZXRyeSAqZ2VvLAorCSAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGludGVybGVhdmVkLCBpbnQgbm9ybSkKK3sKKwljb25zdCBzdHJ1Y3QgYnR0dl90dm5vcm0gKnR2bm9ybSA9ICZidHR2X3R2bm9ybXNbbm9ybV07CisgICAgICAgIHUzMiB4c2YsIHNyOworCWludCB2ZGVsYXk7CisKKwlpbnQgc3dpZHRoICAgICAgID0gdHZub3JtLT5zd2lkdGg7CisJaW50IHRvdGFsd2lkdGggICA9IHR2bm9ybS0+dG90YWx3aWR0aDsKKwlpbnQgc2NhbGVkdHdpZHRoID0gdHZub3JtLT5zY2FsZWR0d2lkdGg7CisKKwlpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tdXhzZWxbYnR2LT5pbnB1dF0gPCAwKSB7CisJCXN3aWR0aCAgICAgICA9IDcyMDsKKwkJdG90YWx3aWR0aCAgID0gODU4OworCQlzY2FsZWR0d2lkdGggPSA4NTg7CisJfQorCisJdmRlbGF5ID0gdHZub3JtLT52ZGVsYXk7CisjaWYgMCAvKiBGSVhNRSAqLworCWlmICh2ZGVsYXkgPCBidHYtPnZiaS5saW5lcyoyKQorCQl2ZGVsYXkgPSBidHYtPnZiaS5saW5lcyoyOworI2VuZGlmCisKKyAgICAgICAgeHNmID0gKHdpZHRoKnNjYWxlZHR3aWR0aCkvc3dpZHRoOworICAgICAgICBnZW8tPmhzY2FsZSA9ICAoKHRvdGFsd2lkdGgqNDA5NlVMKS94c2YtNDA5Nik7CisgICAgICAgIGdlby0+aGRlbGF5ID0gIHR2bm9ybS0+aGRlbGF5eDE7CisgICAgICAgIGdlby0+aGRlbGF5ID0gIChnZW8tPmhkZWxheSp3aWR0aCkvc3dpZHRoOworICAgICAgICBnZW8tPmhkZWxheSAmPSAweDNmZTsKKyAgICAgICAgc3IgPSAoKHR2bm9ybS0+c2hlaWdodCA+PiAoaW50ZXJsZWF2ZWQ/MDoxKSkqNTEyKS9oZWlnaHQgLSA1MTI7CisgICAgICAgIGdlby0+dnNjYWxlID0gICgweDEwMDAwVUwtc3IpICYgMHgxZmZmOworICAgICAgICBnZW8tPmNyb3AgICA9ICAoKHdpZHRoPj44KSYweDAzKSB8ICgoZ2VvLT5oZGVsYXk+PjYpJjB4MGMpIHwKKyAgICAgICAgICAgICAgICAoKHR2bm9ybS0+c2hlaWdodD4+NCkmMHgzMCkgfCAoKHZkZWxheT4+MikmMHhjMCk7CisgICAgICAgIGdlby0+dnNjYWxlIHw9IGludGVybGVhdmVkID8gKEJUODQ4X1ZTQ0FMRV9JTlQ8PDgpIDogMDsKKyAgICAgICAgZ2VvLT52ZGVsYXkgID0gIHZkZWxheTsKKyAgICAgICAgZ2VvLT53aWR0aCAgID0gIHdpZHRoOworICAgICAgICBnZW8tPnNoZWlnaHQgPSAgdHZub3JtLT5zaGVpZ2h0OworCWdlby0+dnRvdGFsICA9ICB0dm5vcm0tPnZ0b3RhbDsKKworICAgICAgICBpZiAoYnR2LT5vcHRfY29tYmZpbHRlcikgeworICAgICAgICAgICAgICAgIGdlby0+dnRjICA9ICh3aWR0aCA8IDE5MykgPyAyIDogKCh3aWR0aCA8IDM4NSkgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgZ2VvLT5jb21iID0gKHdpZHRoIDwgNzY5KSA/IDEgOiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlby0+dnRjICA9IDA7CisgICAgICAgICAgICAgICAgZ2VvLT5jb21iID0gMDsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZAorYnR0dl9hcHBseV9nZW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IGJ0dHZfZ2VvbWV0cnkgKmdlbywgaW50IG9kZCkKK3sKKyAgICAgICAgaW50IG9mZiA9IG9kZCA/IDB4ODAgOiAweDAwOworCisJaWYgKGdlby0+Y29tYikKKwkJYnRvcihCVDg0OF9WU0NBTEVfQ09NQiwgQlQ4NDhfRV9WU0NBTEVfSEkrb2ZmKTsKKwllbHNlCisJCWJ0YW5kKH5CVDg0OF9WU0NBTEVfQ09NQiwgQlQ4NDhfRV9WU0NBTEVfSEkrb2ZmKTsKKworICAgICAgICBidHdyaXRlKGdlby0+dnRjLCAgICAgICAgICAgICBCVDg0OF9FX1ZUQytvZmYpOworICAgICAgICBidHdyaXRlKGdlby0+aHNjYWxlID4+IDgsICAgICBCVDg0OF9FX0hTQ0FMRV9ISStvZmYpOworICAgICAgICBidHdyaXRlKGdlby0+aHNjYWxlICYgMHhmZiwgICBCVDg0OF9FX0hTQ0FMRV9MTytvZmYpOworICAgICAgICBidGFvcigoZ2VvLT52c2NhbGU+PjgpLCAweGUwLCBCVDg0OF9FX1ZTQ0FMRV9ISStvZmYpOworICAgICAgICBidHdyaXRlKGdlby0+dnNjYWxlICYgMHhmZiwgICBCVDg0OF9FX1ZTQ0FMRV9MTytvZmYpOworICAgICAgICBidHdyaXRlKGdlby0+d2lkdGggJiAweGZmLCAgICBCVDg0OF9FX0hBQ1RJVkVfTE8rb2ZmKTsKKyAgICAgICAgYnR3cml0ZShnZW8tPmhkZWxheSAmIDB4ZmYsICAgQlQ4NDhfRV9IREVMQVlfTE8rb2ZmKTsKKyAgICAgICAgYnR3cml0ZShnZW8tPnNoZWlnaHQgJiAweGZmLCAgQlQ4NDhfRV9WQUNUSVZFX0xPK29mZik7CisgICAgICAgIGJ0d3JpdGUoZ2VvLT52ZGVsYXkgJiAweGZmLCAgIEJUODQ4X0VfVkRFTEFZX0xPK29mZik7CisgICAgICAgIGJ0d3JpdGUoZ2VvLT5jcm9wLCAgICAgICAgICAgIEJUODQ4X0VfQ1JPUCtvZmYpOworCWJ0d3JpdGUoZ2VvLT52dG90YWw+PjgsICAgICAgIEJUODQ4X1ZUT1RBTF9ISSk7CisgICAgICAgIGJ0d3JpdGUoZ2VvLT52dG90YWwgJiAweGZmLCAgIEJUODQ4X1ZUT1RBTF9MTyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHJpc2MgZ3JvdXAgLyByaXNjIG1haW4gbG9vcCAvIGRtYSBtYW5hZ2VtZW50ICAgICAgICAgICAgICAgKi8KKwordm9pZAorYnR0dl9zZXRfZG1hKHN0cnVjdCBidHR2ICpidHYsIGludCBvdmVycmlkZSkKK3sKKwl1bnNpZ25lZCBsb25nIGNtZDsKKwlpbnQgY2FwY3RsOworCisJYnR2LT5jYXBfY3RsID0gMDsKKwlpZiAoTlVMTCAhPSBidHYtPmN1cnIudG9wKSAgICAgIGJ0di0+Y2FwX2N0bCB8PSAweDAyOworCWlmIChOVUxMICE9IGJ0di0+Y3Vyci5ib3R0b20pICAgYnR2LT5jYXBfY3RsIHw9IDB4MDE7CisJaWYgKE5VTEwgIT0gYnR2LT5jdmJpKSAgICAgICAgICBidHYtPmNhcF9jdGwgfD0gMHgwYzsKKworCWNhcGN0bCAgPSAwOworCWNhcGN0bCB8PSAoYnR2LT5jYXBfY3RsICYgMHgwMykgPyAweDAzIDogMHgwMDsgIC8qIGNhcHR1cmUgICovCisJY2FwY3RsIHw9IChidHYtPmNhcF9jdGwgJiAweDBjKSA/IDB4MGMgOiAweDAwOyAgLyogdmJpIGRhdGEgKi8KKwljYXBjdGwgfD0gb3ZlcnJpZGU7CisKKwlkMnByaW50ayhLRVJOX0RFQlVHCisJCSAiYnR0diVkOiBjYXBjdGw9JXggbGlycT0lZCB0b3A9JTA4THgvJTA4THggZXZlbj0lMDhMeC8lMDhMeFxuIiwKKwkJIGJ0di0+Yy5ucixjYXBjdGwsYnR2LT5sb29wX2lycSwKKwkJIGJ0di0+Y3ZiaSAgICAgICAgID8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN2YmktPnRvcC5kbWEgICAgICAgICAgICA6IDAsCisJCSBidHYtPmN1cnIudG9wICAgICA/ICh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5jdXJyLnRvcC0+dG9wLmRtYSAgICAgICAgOiAwLAorCQkgYnR2LT5jdmJpICAgICAgICAgPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3ZiaS0+Ym90dG9tLmRtYSAgICAgICAgIDogMCwKKwkJIGJ0di0+Y3Vyci5ib3R0b20gID8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN1cnIuYm90dG9tLT5ib3R0b20uZG1hICA6IDApOworCisJY21kID0gQlQ4NDhfUklTQ19KVU1QOworCWlmIChidHYtPmxvb3BfaXJxKSB7CisJCWNtZCB8PSBCVDg0OF9SSVNDX0lSUTsKKwkJY21kIHw9IChidHYtPmxvb3BfaXJxICAmIDB4MGYpIDw8IDE2OworCQljbWQgfD0gKH5idHYtPmxvb3BfaXJxICYgMHgwZikgPDwgMjA7CisJfQorCWlmIChidHYtPmN1cnIuZnJhbWVfaXJxIHx8IGJ0di0+bG9vcF9pcnEgfHwgYnR2LT5jdmJpKSB7CisJCW1vZF90aW1lcigmYnR2LT50aW1lb3V0LCBqaWZmaWVzK0JUVFZfVElNRU9VVCk7CisJfSBlbHNlIHsKKwkJZGVsX3RpbWVyKCZidHYtPnRpbWVvdXQpOworCX0KKyAgICAgICAgYnR2LT5tYWluLmNwdVtSSVNDX1NMT1RfTE9PUF0gPSBjcHVfdG9fbGUzMihjbWQpOworCisJYnRhb3IoY2FwY3RsLCB+MHgwZiwgQlQ4NDhfQ0FQX0NUTCk7CisJaWYgKGNhcGN0bCkgeworCQlpZiAoYnR2LT5kbWFfb24pCisJCQlyZXR1cm47CisJCWJ0d3JpdGUoYnR2LT5tYWluLmRtYSwgQlQ4NDhfUklTQ19TVFJUX0FERCk7CisJCWJ0b3IoMywgQlQ4NDhfR1BJT19ETUFfQ1RMKTsKKwkJYnR2LT5kbWFfb24gPSAxOworCX0gZWxzZSB7CisJCWlmICghYnR2LT5kbWFfb24pCisJCQlyZXR1cm47CisgICAgICAgICAgICAgICAgYnRhbmQofjMsIEJUODQ4X0dQSU9fRE1BX0NUTCk7CisJCWJ0di0+ZG1hX29uID0gMDsKKwl9CisJcmV0dXJuOworfQorCitpbnQKK2J0dHZfcmlzY19pbml0X21haW4oc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwlpbnQgcmM7CisKKwlpZiAoKHJjID0gYnRjeF9yaXNjbWVtX2FsbG9jKGJ0di0+Yy5wY2ksJmJ0di0+bWFpbixQQUdFX1NJWkUpKSA8IDApCisJCXJldHVybiByYzsKKwlkcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogcmlzYyBtYWluIEAgJTA4THhcbiIsCisJCWJ0di0+Yy5uciwodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+bWFpbi5kbWEpOworCisJYnR2LT5tYWluLmNwdVswXSA9IGNwdV90b19sZTMyKEJUODQ4X1JJU0NfU1lOQyB8IEJUODQ4X1JJU0NfUkVTWU5DIHwKKwkJCQkgICAgICAgQlQ4NDhfRklGT19TVEFUVVNfVlJFKTsKKwlidHYtPm1haW4uY3B1WzFdID0gY3B1X3RvX2xlMzIoMCk7CisJYnR2LT5tYWluLmNwdVsyXSA9IGNwdV90b19sZTMyKEJUODQ4X1JJU0NfSlVNUCk7CisJYnR2LT5tYWluLmNwdVszXSA9IGNwdV90b19sZTMyKGJ0di0+bWFpbi5kbWEgKyAoNDw8MikpOworCisJLyogdG9wIGZpZWxkICovCisJYnR2LT5tYWluLmNwdVs0XSA9IGNwdV90b19sZTMyKEJUODQ4X1JJU0NfSlVNUCk7CisJYnR2LT5tYWluLmNwdVs1XSA9IGNwdV90b19sZTMyKGJ0di0+bWFpbi5kbWEgKyAoNjw8MikpOworCWJ0di0+bWFpbi5jcHVbNl0gPSBjcHVfdG9fbGUzMihCVDg0OF9SSVNDX0pVTVApOworCWJ0di0+bWFpbi5jcHVbN10gPSBjcHVfdG9fbGUzMihidHYtPm1haW4uZG1hICsgKDg8PDIpKTsKKworICAgICAgICBidHYtPm1haW4uY3B1WzhdID0gY3B1X3RvX2xlMzIoQlQ4NDhfUklTQ19TWU5DIHwgQlQ4NDhfUklTQ19SRVNZTkMgfAorCQkJCSAgICAgICBCVDg0OF9GSUZPX1NUQVRVU19WUk8pOworICAgICAgICBidHYtPm1haW4uY3B1WzldID0gY3B1X3RvX2xlMzIoMCk7CisKKwkvKiBib3R0b20gZmllbGQgKi8KKyAgICAgICAgYnR2LT5tYWluLmNwdVsxMF0gPSBjcHVfdG9fbGUzMihCVDg0OF9SSVNDX0pVTVApOworCWJ0di0+bWFpbi5jcHVbMTFdID0gY3B1X3RvX2xlMzIoYnR2LT5tYWluLmRtYSArICgxMjw8MikpOworICAgICAgICBidHYtPm1haW4uY3B1WzEyXSA9IGNwdV90b19sZTMyKEJUODQ4X1JJU0NfSlVNUCk7CisJYnR2LT5tYWluLmNwdVsxM10gPSBjcHVfdG9fbGUzMihidHYtPm1haW4uZG1hICsgKDE0PDwyKSk7CisKKwkvKiBqdW1wIGJhY2sgdG8gdG9wIGZpZWxkICovCisJYnR2LT5tYWluLmNwdVsxNF0gPSBjcHVfdG9fbGUzMihCVDg0OF9SSVNDX0pVTVApOworICAgICAgICBidHYtPm1haW4uY3B1WzE1XSA9IGNwdV90b19sZTMyKGJ0di0+bWFpbi5kbWEgKyAoMDw8MikpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorYnR0dl9yaXNjX2hvb2soc3RydWN0IGJ0dHYgKmJ0diwgaW50IHNsb3QsIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCisJICAgICAgIGludCBpcnFmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGNtZDsKKwl1bnNpZ25lZCBsb25nIG5leHQgPSBidHYtPm1haW4uZG1hICsgKChzbG90KzIpIDw8IDIpOworCisJaWYgKE5VTEwgPT0gcmlzYykgeworCQlkMnByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IHJpc2M9JXAgc2xvdFslZF09TlVMTFxuIiwKKwkJCSBidHYtPmMubnIscmlzYyxzbG90KTsKKwkJYnR2LT5tYWluLmNwdVtzbG90KzFdID0gY3B1X3RvX2xlMzIobmV4dCk7CisJfSBlbHNlIHsKKwkJZDJwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiByaXNjPSVwIHNsb3RbJWRdPSUwOEx4IGlycT0lZFxuIiwKKwkJCSBidHYtPmMubnIscmlzYyxzbG90LCh1bnNpZ25lZCBsb25nIGxvbmcpcmlzYy0+ZG1hLGlycWZsYWdzKTsKKwkJY21kID0gQlQ4NDhfUklTQ19KVU1QOworCQlpZiAoaXJxZmxhZ3MpIHsKKwkJCWNtZCB8PSBCVDg0OF9SSVNDX0lSUTsKKwkJCWNtZCB8PSAoaXJxZmxhZ3MgICYgMHgwZikgPDwgMTY7CisJCQljbWQgfD0gKH5pcnFmbGFncyAmIDB4MGYpIDw8IDIwOworCQl9CisJCXJpc2MtPmptcFswXSA9IGNwdV90b19sZTMyKGNtZCk7CisJCXJpc2MtPmptcFsxXSA9IGNwdV90b19sZTMyKG5leHQpOworCQlidHYtPm1haW4uY3B1W3Nsb3QrMV0gPSBjcHVfdG9fbGUzMihyaXNjLT5kbWEpOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZAorYnR0dl9kbWFfZnJlZShzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgYnR0dl9idWZmZXIgKmJ1ZikKK3sKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCUJVRygpOworCXZpZGVvYnVmX3dhaXRvbigmYnVmLT52YiwwLDApOworCXZpZGVvYnVmX2RtYV9wY2lfdW5tYXAoYnR2LT5jLnBjaSwgJmJ1Zi0+dmIuZG1hKTsKKwl2aWRlb2J1Zl9kbWFfZnJlZSgmYnVmLT52Yi5kbWEpOworCWJ0Y3hfcmlzY21lbV9mcmVlKGJ0di0+Yy5wY2ksJmJ1Zi0+Ym90dG9tKTsKKwlidGN4X3Jpc2NtZW1fZnJlZShidHYtPmMucGNpLCZidWYtPnRvcCk7CisJYnVmLT52Yi5zdGF0ZSA9IFNUQVRFX05FRURTX0lOSVQ7Cit9CisKK2ludAorYnR0dl9idWZmZXJfYWN0aXZhdGVfdmJpKHN0cnVjdCBidHR2ICpidHYsCisJCQkgc3RydWN0IGJ0dHZfYnVmZmVyICp2YmkpCit7CisJLyogdmJpIGNhcHR1cmUgKi8KKwlpZiAodmJpKSB7CisJCXZiaS0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CisJCWxpc3RfZGVsKCZ2YmktPnZiLnF1ZXVlKTsKKwkJYnR0dl9yaXNjX2hvb2soYnR2LCBSSVNDX1NMT1RfT19WQkksICZ2YmktPnRvcCwgICAgMCk7CisJCWJ0dHZfcmlzY19ob29rKGJ0diwgUklTQ19TTE9UX0VfVkJJLCAmdmJpLT5ib3R0b20sIDQpOworCX0gZWxzZSB7CisJCWJ0dHZfcmlzY19ob29rKGJ0diwgUklTQ19TTE9UX09fVkJJLCBOVUxMLCAwKTsKKwkJYnR0dl9yaXNjX2hvb2soYnR2LCBSSVNDX1NMT1RfRV9WQkksIE5VTEwsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitidHR2X2J1ZmZlcl9hY3RpdmF0ZV92aWRlbyhzdHJ1Y3QgYnR0diAqYnR2LAorCQkJICAgc3RydWN0IGJ0dHZfYnVmZmVyX3NldCAqc2V0KQoreworCS8qIHZpZGVvIGNhcHR1cmUgKi8KKwlpZiAoTlVMTCAhPSBzZXQtPnRvcCAgJiYgIE5VTEwgIT0gc2V0LT5ib3R0b20pIHsKKwkJaWYgKHNldC0+dG9wID09IHNldC0+Ym90dG9tKSB7CisJCQlzZXQtPnRvcC0+dmIuc3RhdGUgICAgPSBTVEFURV9BQ1RJVkU7CisJCQlpZiAoc2V0LT50b3AtPnZiLnF1ZXVlLm5leHQpCisJCQkJbGlzdF9kZWwoJnNldC0+dG9wLT52Yi5xdWV1ZSk7CisJCX0gZWxzZSB7CisJCQlzZXQtPnRvcC0+dmIuc3RhdGUgICAgPSBTVEFURV9BQ1RJVkU7CisJCQlzZXQtPmJvdHRvbS0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CisJCQlpZiAoc2V0LT50b3AtPnZiLnF1ZXVlLm5leHQpCisJCQkJbGlzdF9kZWwoJnNldC0+dG9wLT52Yi5xdWV1ZSk7CisJCQlpZiAoc2V0LT5ib3R0b20tPnZiLnF1ZXVlLm5leHQpCisJCQkJbGlzdF9kZWwoJnNldC0+Ym90dG9tLT52Yi5xdWV1ZSk7CisJCX0KKwkJYnR0dl9hcHBseV9nZW8oYnR2LCAmc2V0LT50b3AtPmdlbywgMSk7CisJCWJ0dHZfYXBwbHlfZ2VvKGJ0diwgJnNldC0+Ym90dG9tLT5nZW8sMCk7CisJCWJ0dHZfcmlzY19ob29rKGJ0diwgUklTQ19TTE9UX09fRklFTEQsICZzZXQtPnRvcC0+dG9wLAorCQkJICAgICAgIHNldC0+dG9wX2lycSk7CisJCWJ0dHZfcmlzY19ob29rKGJ0diwgUklTQ19TTE9UX0VfRklFTEQsICZzZXQtPmJvdHRvbS0+Ym90dG9tLAorCQkJICAgICAgIHNldC0+ZnJhbWVfaXJxKTsKKwkJYnRhb3IoKHNldC0+dG9wLT5idGZvcm1hdCAmIDB4ZjApIHwgKHNldC0+Ym90dG9tLT5idGZvcm1hdCAmIDB4MGYpLAorCQkgICAgICB+MHhmZiwgQlQ4NDhfQ09MT1JfRk1UKTsKKwkJYnRhb3IoKHNldC0+dG9wLT5idHN3YXAgJiAweDBhKSB8IChzZXQtPmJvdHRvbS0+YnRzd2FwICYgMHgwNSksCisJCSAgICAgIH4weDBmLCBCVDg0OF9DT0xPUl9DVEwpOworCX0gZWxzZSBpZiAoTlVMTCAhPSBzZXQtPnRvcCkgeworCQlzZXQtPnRvcC0+dmIuc3RhdGUgID0gU1RBVEVfQUNUSVZFOworCQlpZiAoc2V0LT50b3AtPnZiLnF1ZXVlLm5leHQpCisJCQlsaXN0X2RlbCgmc2V0LT50b3AtPnZiLnF1ZXVlKTsKKwkJYnR0dl9hcHBseV9nZW8oYnR2LCAmc2V0LT50b3AtPmdlbywxKTsKKwkJYnR0dl9hcHBseV9nZW8oYnR2LCAmc2V0LT50b3AtPmdlbywwKTsKKwkJYnR0dl9yaXNjX2hvb2soYnR2LCBSSVNDX1NMT1RfT19GSUVMRCwgJnNldC0+dG9wLT50b3AsCisJCQkgICAgICAgc2V0LT5mcmFtZV9pcnEpOworCQlidHR2X3Jpc2NfaG9vayhidHYsIFJJU0NfU0xPVF9FX0ZJRUxELCBOVUxMLCAgICAgICAgICAgMCk7CisJCWJ0YW9yKHNldC0+dG9wLT5idGZvcm1hdCAmIDB4ZmYsIH4weGZmLCBCVDg0OF9DT0xPUl9GTVQpOworCQlidGFvcihzZXQtPnRvcC0+YnRzd2FwICYgMHgwZiwgICB+MHgwZiwgQlQ4NDhfQ09MT1JfQ1RMKTsKKwl9IGVsc2UgaWYgKE5VTEwgIT0gc2V0LT5ib3R0b20pIHsKKwkJc2V0LT5ib3R0b20tPnZiLnN0YXRlID0gU1RBVEVfQUNUSVZFOworCQlpZiAoc2V0LT5ib3R0b20tPnZiLnF1ZXVlLm5leHQpCisJCQlsaXN0X2RlbCgmc2V0LT5ib3R0b20tPnZiLnF1ZXVlKTsKKwkJYnR0dl9hcHBseV9nZW8oYnR2LCAmc2V0LT5ib3R0b20tPmdlbywxKTsKKwkJYnR0dl9hcHBseV9nZW8oYnR2LCAmc2V0LT5ib3R0b20tPmdlbywwKTsKKwkJYnR0dl9yaXNjX2hvb2soYnR2LCBSSVNDX1NMT1RfT19GSUVMRCwgTlVMTCwgMCk7CisJCWJ0dHZfcmlzY19ob29rKGJ0diwgUklTQ19TTE9UX0VfRklFTEQsICZzZXQtPmJvdHRvbS0+Ym90dG9tLAorCQkJICAgICAgIHNldC0+ZnJhbWVfaXJxKTsKKwkJYnRhb3Ioc2V0LT5ib3R0b20tPmJ0Zm9ybWF0ICYgMHhmZiwgfjB4ZmYsIEJUODQ4X0NPTE9SX0ZNVCk7CisJCWJ0YW9yKHNldC0+Ym90dG9tLT5idHN3YXAgJiAweDBmLCAgIH4weDBmLCBCVDg0OF9DT0xPUl9DVEwpOworCX0gZWxzZSB7CisJCWJ0dHZfcmlzY19ob29rKGJ0diwgUklTQ19TTE9UX09fRklFTEQsIE5VTEwsIDApOworCQlidHR2X3Jpc2NfaG9vayhidHYsIFJJU0NfU0xPVF9FX0ZJRUxELCBOVUxMLCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogY2FsY3VsYXRlIGdlb21ldHJ5LCBidWlsZCByaXNjIGNvZGUgKi8KK2ludAorYnR0dl9idWZmZXJfcmlzYyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgYnR0dl9idWZmZXIgKmJ1ZikKK3sKKwljb25zdCBzdHJ1Y3QgYnR0dl90dm5vcm0gKnR2bm9ybSA9IGJ0dHZfdHZub3JtcyArIGJ1Zi0+dHZub3JtOworCisJZHByaW50ayhLRVJOX0RFQlVHCisJCSJidHR2JWQ6IGJ1ZmZlciBmaWVsZDogJXMgIGZvcm1hdDogJXMgIHNpemU6ICVkeCVkXG4iLAorCQlidHYtPmMubnIsIHY0bDJfZmllbGRfbmFtZXNbYnVmLT52Yi5maWVsZF0sCisJCWJ1Zi0+Zm10LT5uYW1lLCBidWYtPnZiLndpZHRoLCBidWYtPnZiLmhlaWdodCk7CisKKwkvKiBwYWNrZWQgcGl4ZWwgbW9kZXMgKi8KKwlpZiAoYnVmLT5mbXQtPmZsYWdzICYgRk9STUFUX0ZMQUdTX1BBQ0tFRCkgeworCQlpbnQgYnBsID0gKGJ1Zi0+Zm10LT5kZXB0aCA+PiAzKSAqIGJ1Zi0+dmIud2lkdGg7CisJCWludCBicGYgPSBicGwgKiAoYnVmLT52Yi5oZWlnaHQgPj4gMSk7CisKKwkJYnR0dl9jYWxjX2dlbyhidHYsJmJ1Zi0+Z2VvLGJ1Zi0+dmIud2lkdGgsYnVmLT52Yi5oZWlnaHQsCisJCQkgICAgICBWNEwyX0ZJRUxEX0hBU19CT1RIKGJ1Zi0+dmIuZmllbGQpLGJ1Zi0+dHZub3JtKTsKKworCQlzd2l0Y2ggKGJ1Zi0+dmIuZmllbGQpIHsKKwkJY2FzZSBWNEwyX0ZJRUxEX1RPUDoKKwkJCWJ0dHZfcmlzY19wYWNrZWQoYnR2LCZidWYtPnRvcCxidWYtPnZiLmRtYS5zZ2xpc3QsCisJCQkJCSAwLGJwbCwwLGJ1Zi0+dmIuaGVpZ2h0KTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRklFTERfQk9UVE9NOgorCQkJYnR0dl9yaXNjX3BhY2tlZChidHYsJmJ1Zi0+Ym90dG9tLGJ1Zi0+dmIuZG1hLnNnbGlzdCwKKwkJCQkJIDAsYnBsLDAsYnVmLT52Yi5oZWlnaHQpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOgorCQkJYnR0dl9yaXNjX3BhY2tlZChidHYsJmJ1Zi0+dG9wLGJ1Zi0+dmIuZG1hLnNnbGlzdCwKKwkJCQkJIDAsYnBsLGJwbCxidWYtPnZiLmhlaWdodCA+PiAxKTsKKwkJCWJ0dHZfcmlzY19wYWNrZWQoYnR2LCZidWYtPmJvdHRvbSxidWYtPnZiLmRtYS5zZ2xpc3QsCisJCQkJCSBicGwsYnBsLGJwbCxidWYtPnZiLmhlaWdodCA+PiAxKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRklFTERfU0VRX1RCOgorCQkJYnR0dl9yaXNjX3BhY2tlZChidHYsJmJ1Zi0+dG9wLGJ1Zi0+dmIuZG1hLnNnbGlzdCwKKwkJCQkJIDAsYnBsLDAsYnVmLT52Yi5oZWlnaHQgPj4gMSk7CisJCQlidHR2X3Jpc2NfcGFja2VkKGJ0diwmYnVmLT5ib3R0b20sYnVmLT52Yi5kbWEuc2dsaXN0LAorCQkJCQkgYnBmLGJwbCwwLGJ1Zi0+dmIuaGVpZ2h0ID4+IDEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCX0KKworCS8qIHBsYW5hciBtb2RlcyAqLworCWlmIChidWYtPmZtdC0+ZmxhZ3MgJiBGT1JNQVRfRkxBR1NfUExBTkFSKSB7CisJCWludCB1b2Zmc2V0LCB2b2Zmc2V0OworCQlpbnQgeXBhZGRpbmcsIGNwYWRkaW5nLCBsaW5lczsKKworCQkvKiBjYWxjdWxhdGUgY2hyb21hIG9mZnNldHMgKi8KKwkJdW9mZnNldCA9IGJ1Zi0+dmIud2lkdGggKiBidWYtPnZiLmhlaWdodDsKKwkJdm9mZnNldCA9IGJ1Zi0+dmIud2lkdGggKiBidWYtPnZiLmhlaWdodDsKKwkJaWYgKGJ1Zi0+Zm10LT5mbGFncyAmIEZPUk1BVF9GTEFHU19DckNiKSB7CisJCQkvKiBZLUNyLUNiIHBsYW5lIG9yZGVyICovCisJCQl1b2Zmc2V0ID4+PSBidWYtPmZtdC0+aHNoaWZ0OworCQkJdW9mZnNldCA+Pj0gYnVmLT5mbXQtPnZzaGlmdDsKKwkJCXVvZmZzZXQgICs9IHZvZmZzZXQ7CisJCX0gZWxzZSB7CisJCQkvKiBZLUNiLUNyIHBsYW5lIG9yZGVyICovCisJCQl2b2Zmc2V0ID4+PSBidWYtPmZtdC0+aHNoaWZ0OworCQkJdm9mZnNldCA+Pj0gYnVmLT5mbXQtPnZzaGlmdDsKKwkJCXZvZmZzZXQgICs9IHVvZmZzZXQ7CisJCX0KKworCQlzd2l0Y2ggKGJ1Zi0+dmIuZmllbGQpIHsKKwkJY2FzZSBWNEwyX0ZJRUxEX1RPUDoKKwkJCWJ0dHZfY2FsY19nZW8oYnR2LCZidWYtPmdlbyxidWYtPnZiLndpZHRoLAorCQkJCSAgICAgIGJ1Zi0+dmIuaGVpZ2h0LDAsYnVmLT50dm5vcm0pOworCQkJYnR0dl9yaXNjX3BsYW5hcihidHYsICZidWYtPnRvcCwgYnVmLT52Yi5kbWEuc2dsaXN0LAorCQkJCQkgMCxidWYtPnZiLndpZHRoLDAsYnVmLT52Yi5oZWlnaHQsCisJCQkJCSB1b2Zmc2V0LHZvZmZzZXQsYnVmLT5mbXQtPmhzaGlmdCwKKwkJCQkJIGJ1Zi0+Zm10LT52c2hpZnQsMCk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTToKKwkJCWJ0dHZfY2FsY19nZW8oYnR2LCZidWYtPmdlbyxidWYtPnZiLndpZHRoLAorCQkJCSAgICAgIGJ1Zi0+dmIuaGVpZ2h0LDAsYnVmLT50dm5vcm0pOworCQkJYnR0dl9yaXNjX3BsYW5hcihidHYsICZidWYtPmJvdHRvbSwgYnVmLT52Yi5kbWEuc2dsaXN0LAorCQkJCQkgMCxidWYtPnZiLndpZHRoLDAsYnVmLT52Yi5oZWlnaHQsCisJCQkJCSB1b2Zmc2V0LHZvZmZzZXQsYnVmLT5mbXQtPmhzaGlmdCwKKwkJCQkJIGJ1Zi0+Zm10LT52c2hpZnQsMCk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6CisJCQlidHR2X2NhbGNfZ2VvKGJ0diwmYnVmLT5nZW8sYnVmLT52Yi53aWR0aCwKKwkJCQkgICAgICBidWYtPnZiLmhlaWdodCwxLGJ1Zi0+dHZub3JtKTsKKwkJCWxpbmVzICAgID0gYnVmLT52Yi5oZWlnaHQgPj4gMTsKKwkJCXlwYWRkaW5nID0gYnVmLT52Yi53aWR0aDsKKwkJCWNwYWRkaW5nID0gYnVmLT52Yi53aWR0aCA+PiBidWYtPmZtdC0+aHNoaWZ0OworCQkJYnR0dl9yaXNjX3BsYW5hcihidHYsJmJ1Zi0+dG9wLAorCQkJCQkgYnVmLT52Yi5kbWEuc2dsaXN0LAorCQkJCQkgMCxidWYtPnZiLndpZHRoLHlwYWRkaW5nLGxpbmVzLAorCQkJCQkgdW9mZnNldCx2b2Zmc2V0LAorCQkJCQkgYnVmLT5mbXQtPmhzaGlmdCwKKwkJCQkJIGJ1Zi0+Zm10LT52c2hpZnQsCisJCQkJCSBjcGFkZGluZyk7CisJCQlidHR2X3Jpc2NfcGxhbmFyKGJ0diwmYnVmLT5ib3R0b20sCisJCQkJCSBidWYtPnZiLmRtYS5zZ2xpc3QsCisJCQkJCSB5cGFkZGluZyxidWYtPnZiLndpZHRoLHlwYWRkaW5nLGxpbmVzLAorCQkJCQkgdW9mZnNldCtjcGFkZGluZywKKwkJCQkJIHZvZmZzZXQrY3BhZGRpbmcsCisJCQkJCSBidWYtPmZtdC0+aHNoaWZ0LAorCQkJCQkgYnVmLT5mbXQtPnZzaGlmdCwKKwkJCQkJIGNwYWRkaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRklFTERfU0VRX1RCOgorCQkJYnR0dl9jYWxjX2dlbyhidHYsJmJ1Zi0+Z2VvLGJ1Zi0+dmIud2lkdGgsCisJCQkJICAgICAgYnVmLT52Yi5oZWlnaHQsMSxidWYtPnR2bm9ybSk7CisJCQlsaW5lcyAgICA9IGJ1Zi0+dmIuaGVpZ2h0ID4+IDE7CisJCQl5cGFkZGluZyA9IGJ1Zi0+dmIud2lkdGg7CisJCQljcGFkZGluZyA9IGJ1Zi0+dmIud2lkdGggPj4gYnVmLT5mbXQtPmhzaGlmdDsKKwkJCWJ0dHZfcmlzY19wbGFuYXIoYnR2LCZidWYtPnRvcCwKKwkJCQkJIGJ1Zi0+dmIuZG1hLnNnbGlzdCwKKwkJCQkJIDAsYnVmLT52Yi53aWR0aCwwLGxpbmVzLAorCQkJCQkgdW9mZnNldCA+PiAxLAorCQkJCQkgdm9mZnNldCA+PiAxLAorCQkJCQkgYnVmLT5mbXQtPmhzaGlmdCwKKwkJCQkJIGJ1Zi0+Zm10LT52c2hpZnQsCisJCQkJCSAwKTsKKwkJCWJ0dHZfcmlzY19wbGFuYXIoYnR2LCZidWYtPmJvdHRvbSwKKwkJCQkJIGJ1Zi0+dmIuZG1hLnNnbGlzdCwKKwkJCQkJIGxpbmVzICogeXBhZGRpbmcsYnVmLT52Yi53aWR0aCwwLGxpbmVzLAorCQkJCQkgbGluZXMgKiB5cGFkZGluZyArICh1b2Zmc2V0ID4+IDEpLAorCQkJCQkgbGluZXMgKiB5cGFkZGluZyArICh2b2Zmc2V0ID4+IDEpLAorCQkJCQkgYnVmLT5mbXQtPmhzaGlmdCwKKwkJCQkJIGJ1Zi0+Zm10LT52c2hpZnQsCisJCQkJCSAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwl9CisKKwkvKiByYXcgZGF0YSAqLworCWlmIChidWYtPmZtdC0+ZmxhZ3MgJiBGT1JNQVRfRkxBR1NfUkFXKSB7CisJCS8qIGJ1aWxkIHJpc2MgY29kZSAqLworCQlidWYtPnZiLmZpZWxkID0gVjRMMl9GSUVMRF9TRVFfVEI7CisJCWJ0dHZfY2FsY19nZW8oYnR2LCZidWYtPmdlbyx0dm5vcm0tPnN3aWR0aCx0dm5vcm0tPnNoZWlnaHQsCisJCQkgICAgICAxLGJ1Zi0+dHZub3JtKTsKKwkJYnR0dl9yaXNjX3BhY2tlZChidHYsICZidWYtPnRvcCwgIGJ1Zi0+dmIuZG1hLnNnbGlzdCwKKwkJCQkgMCwgUkFXX0JQTCwgMCwgUkFXX0xJTkVTKTsKKwkJYnR0dl9yaXNjX3BhY2tlZChidHYsICZidWYtPmJvdHRvbSwgYnVmLT52Yi5kbWEuc2dsaXN0LAorCQkJCSBidWYtPnZiLnNpemUvMiAsIFJBV19CUEwsIDAsIFJBV19MSU5FUyk7CisJfQorCisJLyogY29weSBmb3JtYXQgaW5mbyAqLworCWJ1Zi0+YnRmb3JtYXQgPSBidWYtPmZtdC0+YnRmb3JtYXQ7CisJYnVmLT5idHN3YXAgICA9IGJ1Zi0+Zm10LT5idHN3YXA7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogY2FsY3VsYXRlIGdlb21ldHJ5LCBidWlsZCByaXNjIGNvZGUgKi8KK2ludAorYnR0dl9vdmVybGF5X3Jpc2Moc3RydWN0IGJ0dHYgKmJ0diwKKwkJICBzdHJ1Y3QgYnR0dl9vdmVybGF5ICpvdiwKKwkJICBjb25zdCBzdHJ1Y3QgYnR0dl9mb3JtYXQgKmZtdCwKKwkJICBzdHJ1Y3QgYnR0dl9idWZmZXIgKmJ1ZikKK3sKKwkvKiBjaGVjayBpbnRlcmxlYXZlLCBib3R0b20rdG9wIGZpZWxkcyAqLworCWRwcmludGsoS0VSTl9ERUJVRworCQkiYnR0diVkOiBvdmVybGF5IGZpZWxkczogJXMgZm9ybWF0OiAlcyAgc2l6ZTogJWR4JWRcbiIsCisJCWJ0di0+Yy5uciwgdjRsMl9maWVsZF9uYW1lc1tidWYtPnZiLmZpZWxkXSwKKwkJZm10LT5uYW1lLG92LT53LndpZHRoLG92LT53LmhlaWdodCk7CisKKwkvKiBjYWxjdWxhdGUgZ2VvbWV0cnkgKi8KKwlidHR2X2NhbGNfZ2VvKGJ0diwmYnVmLT5nZW8sb3YtPncud2lkdGgsb3YtPncuaGVpZ2h0LAorCQkgICAgICBWNEwyX0ZJRUxEX0hBU19CT1RIKG92LT5maWVsZCksIG92LT50dm5vcm0pOworCisJLyogYnVpbGQgcmlzYyBjb2RlICovCisJc3dpdGNoIChvdi0+ZmllbGQpIHsKKwljYXNlIFY0TDJfRklFTERfVE9QOgorCQlidHR2X3Jpc2Nfb3ZlcmxheShidHYsICZidWYtPnRvcCwgICAgZm10LCBvdiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9GSUVMRF9CT1RUT006CisJCWJ0dHZfcmlzY19vdmVybGF5KGJ0diwgJmJ1Zi0+Ym90dG9tLCBmbXQsIG92LCAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6CisjaWYgMAorCQlidHR2X3Jpc2Nfb3ZlcmxheShidHYsICZidWYtPnRvcCwgICAgZm10LCBvdiwgMSwgMCk7CisJCWJ0dHZfcmlzY19vdmVybGF5KGJ0diwgJmJ1Zi0+Ym90dG9tLCBmbXQsIG92LCAwLCAxKTsKKyNlbHNlCisJCWJ0dHZfcmlzY19vdmVybGF5KGJ0diwgJmJ1Zi0+dG9wLCAgICBmbXQsIG92LCAwLCAxKTsKKwkJYnR0dl9yaXNjX292ZXJsYXkoYnR2LCAmYnVmLT5ib3R0b20sIGZtdCwgb3YsIDEsIDApOworI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCS8qIGNvcHkgZm9ybWF0IGluZm8gKi8KKwlidWYtPmJ0Zm9ybWF0ID0gZm10LT5idGZvcm1hdDsKKwlidWYtPmJ0c3dhcCAgID0gZm10LT5idHN3YXA7CisJYnVmLT52Yi5maWVsZCA9IG92LT5maWVsZDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di12YmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmYzZTYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXZiaS5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICAgICRJZDogYnR0di12YmkuYyx2IDEuOSAyMDA1LzAxLzEzIDE3OjIyOjMzIGtyYXhlbCBFeHAgJAorCisgICAgYnR0diAtIEJ0ODQ4IGZyYW1lIGdyYWJiZXIgZHJpdmVyCisgICAgdmJpIGludGVyZmFjZQorCisgICAgKGMpIDIwMDIgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJidHR2cC5oIgorCisjZGVmaW5lIFZCSV9ERUZMSU5FUyAxNgorI2RlZmluZSBWQklfTUFYTElORVMgMzIKKworc3RhdGljIHVuc2lnbmVkIGludCB2YmlidWZzID0gNDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmJpX2RlYnVnID0gMDsKKworbW9kdWxlX3BhcmFtKHZiaWJ1ZnMsICAgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbSh2YmlfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZiaWJ1ZnMsIm51bWJlciBvZiB2YmkgYnVmZmVycywgcmFuZ2UgMi0zMiwgZGVmYXVsdCA0Iik7CitNT0RVTEVfUEFSTV9ERVNDKHZiaV9kZWJ1ZywidmJpIGNvZGUgZGVidWcgbWVzc2FnZXMsIGRlZmF1bHQgaXMgMCAobm8pIik7CisKKyNpZmRlZiBkcHJpbnRrCisjIHVuZGVmIGRwcmludGsKKyNlbmRpZgorI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAodmJpX2RlYnVnKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZC92Ymk6ICIgZm10LCBidHYtPmMubnIgLCAjIyBhcmcpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB2YmkgcmlzYyBjb2RlICsgbW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgaW50Cit2YmlfYnVmZmVyX3Jpc2Moc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IGJ0dHZfYnVmZmVyICpidWYsIGludCBsaW5lcykKK3sKKwlpbnQgYnBsID0gMjA0ODsKKworCWJ0dHZfcmlzY19wYWNrZWQoYnR2LCAmYnVmLT50b3AsIGJ1Zi0+dmIuZG1hLnNnbGlzdCwKKwkJCSAwLCBicGwtNCwgNCwgbGluZXMpOworCWJ0dHZfcmlzY19wYWNrZWQoYnR2LCAmYnVmLT5ib3R0b20sIGJ1Zi0+dmIuZG1hLnNnbGlzdCwKKwkJCSBsaW5lcyAqIGJwbCwgYnBsLTQsIDQsIGxpbmVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YmlfYnVmZmVyX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKnNpemUpCit7CisJc3RydWN0IGJ0dHZfZmggKmZoID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBidHR2ICpidHYgPSBmaC0+YnR2OworCisJaWYgKDAgPT0gKmNvdW50KQorCQkqY291bnQgPSB2YmlidWZzOworCSpzaXplID0gZmgtPmxpbmVzICogMiAqIDIwNDg7CisJZHByaW50aygic2V0dXA6IGxpbmVzPSVkXG4iLGZoLT5saW5lcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmJpX2J1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKKwkJCSAgICAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAorCQkJICAgICAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQoreworCXN0cnVjdCBidHR2X2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgYnR0diAqYnR2ID0gZmgtPmJ0djsKKwlzdHJ1Y3QgYnR0dl9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2YixzdHJ1Y3QgYnR0dl9idWZmZXIsdmIpOworCWludCByYzsKKworCWJ1Zi0+dmIuc2l6ZSA9IGZoLT5saW5lcyAqIDIgKiAyMDQ4OworCWlmICgwICE9IGJ1Zi0+dmIuYmFkZHIgICYmICBidWYtPnZiLmJzaXplIDwgYnVmLT52Yi5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChTVEFURV9ORUVEU19JTklUID09IGJ1Zi0+dmIuc3RhdGUpIHsKKwkJaWYgKDAgIT0gKHJjID0gdmlkZW9idWZfaW9sb2NrKGJ0di0+Yy5wY2ksICZidWYtPnZiLCBOVUxMKSkpCisJCQlnb3RvIGZhaWw7CisJCWlmICgwICE9IChyYyA9IHZiaV9idWZmZXJfcmlzYyhidHYsYnVmLGZoLT5saW5lcykpKQorCQkJZ290byBmYWlsOworCX0KKwlidWYtPnZiLnN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7CisJYnVmLT52Yi5maWVsZCA9IGZpZWxkOworCWRwcmludGsoImJ1ZiBwcmVwYXJlICVwOiB0b3A9JXAgYm90dG9tPSVwIGZpZWxkPSVzXG4iLAorCQl2YiwgJmJ1Zi0+dG9wLCAmYnVmLT5ib3R0b20sCisJCXY0bDJfZmllbGRfbmFtZXNbYnVmLT52Yi5maWVsZF0pOworCXJldHVybiAwOworCisgZmFpbDoKKwlidHR2X2RtYV9mcmVlKGJ0dixidWYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK3ZiaV9idWZmZXJfcXVldWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgYnR0dl9maCAqZmggPSBxLT5wcml2X2RhdGE7CisJc3RydWN0IGJ0dHYgKmJ0diA9IGZoLT5idHY7CisJc3RydWN0IGJ0dHZfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsc3RydWN0IGJ0dHZfYnVmZmVyLHZiKTsKKworCWRwcmludGsoInF1ZXVlICVwXG4iLHZiKTsKKwlidWYtPnZiLnN0YXRlID0gU1RBVEVfUVVFVUVEOworCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsJmJ0di0+dmNhcHR1cmUpOworCWlmIChOVUxMID09IGJ0di0+Y3ZiaSkgeworCQlmaC0+YnR2LT5sb29wX2lycSB8PSA0OworCQlidHR2X3NldF9kbWEoYnR2LDB4MGMpOworCX0KK30KKworc3RhdGljIHZvaWQgdmJpX2J1ZmZlcl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IGJ0dHZfZmggKmZoID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBidHR2ICpidHYgPSBmaC0+YnR2OworCXN0cnVjdCBidHR2X2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBidHR2X2J1ZmZlcix2Yik7CisKKwlkcHJpbnRrKCJmcmVlICVwXG4iLHZiKTsKKwlidHR2X2RtYV9mcmVlKGZoLT5idHYsYnVmKTsKK30KKworc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyBidHR2X3ZiaV9xb3BzID0geworCS5idWZfc2V0dXAgICAgPSB2YmlfYnVmZmVyX3NldHVwLAorCS5idWZfcHJlcGFyZSAgPSB2YmlfYnVmZmVyX3ByZXBhcmUsCisJLmJ1Zl9xdWV1ZSAgICA9IHZiaV9idWZmZXJfcXVldWUsCisJLmJ1Zl9yZWxlYXNlICA9IHZiaV9idWZmZXJfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgYnR0dl92Ymlfc2V0bGluZXMoc3RydWN0IGJ0dHZfZmggKmZoLCBzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgbGluZXMpCit7CisJaW50IHZkZWxheTsKKworCWlmIChsaW5lcyA8IDEpCisJCWxpbmVzID0gMTsKKwlpZiAobGluZXMgPiBWQklfTUFYTElORVMpCisJCWxpbmVzID0gVkJJX01BWExJTkVTOworCWZoLT5saW5lcyA9IGxpbmVzOworCisJdmRlbGF5ID0gYnRyZWFkKEJUODQ4X0VfVkRFTEFZX0xPKTsKKwlpZiAodmRlbGF5IDwgbGluZXMqMikgeworCQl2ZGVsYXkgPSBsaW5lcyoyOworCQlidHdyaXRlKHZkZWxheSxCVDg0OF9FX1ZERUxBWV9MTyk7CisJCWJ0d3JpdGUodmRlbGF5LEJUODQ4X09fVkRFTEFZX0xPKTsKKwl9Cit9CisKK3ZvaWQgYnR0dl92YmlfdHJ5X2ZtdChzdHJ1Y3QgYnR0dl9maCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwljb25zdCBzdHJ1Y3QgYnR0dl90dm5vcm0gKnR2bm9ybTsKKwl1MzIgc3RhcnQwLHN0YXJ0MTsKKwlzMzIgY291bnQwLGNvdW50MSxjb3VudDsKKworCXR2bm9ybSA9ICZidHR2X3R2bm9ybXNbZmgtPmJ0di0+dHZub3JtXTsKKwlmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRTsKKwlmLT5mbXQudmJpLnNhbXBsaW5nX3JhdGUgICAgPSB0dm5vcm0tPkZzYzsKKwlmLT5mbXQudmJpLnNhbXBsZXNfcGVyX2xpbmUgPSAyMDQ4OworCWYtPmZtdC52Ymkuc2FtcGxlX2Zvcm1hdCAgICA9IFY0TDJfUElYX0ZNVF9HUkVZOworCWYtPmZtdC52Ymkub2Zmc2V0ICAgICAgICAgICA9IDI0NDsKKwlmLT5mbXQudmJpLmZsYWdzICAgICAgICAgICAgPSAwOworCXN3aXRjaCAoZmgtPmJ0di0+dHZub3JtKSB7CisJY2FzZSAxOiAvKiBOVFNDICovCisJCXN0YXJ0MCA9IDEwOworCQlzdGFydDEgPSAyNzM7CisJCWJyZWFrOworCWNhc2UgMDogLyogUEFMICovCisJY2FzZSAyOiAvKiBTRUNBTSAqLworCWRlZmF1bHQ6CisJCXN0YXJ0MCA9IDc7CisJCXN0YXJ0MSA9IDMyMDsKKwl9CisKKwljb3VudDAgPSAoZi0+Zm10LnZiaS5zdGFydFswXSArIGYtPmZtdC52YmkuY291bnRbMF0pIC0gc3RhcnQwOworCWNvdW50MSA9IChmLT5mbXQudmJpLnN0YXJ0WzFdICsgZi0+Zm10LnZiaS5jb3VudFsxXSkgLSBzdGFydDE7CisJY291bnQgID0gbWF4KGNvdW50MCxjb3VudDEpOworCWlmIChjb3VudCA+IFZCSV9NQVhMSU5FUykKKwkJY291bnQgPSBWQklfTUFYTElORVM7CisJaWYgKGNvdW50IDwgMSkKKwkJY291bnQgPSAxOworCisJZi0+Zm10LnZiaS5zdGFydFswXSA9IHN0YXJ0MDsKKwlmLT5mbXQudmJpLnN0YXJ0WzFdID0gc3RhcnQxOworCWYtPmZtdC52YmkuY291bnRbMF0gPSBjb3VudDsKKwlmLT5mbXQudmJpLmNvdW50WzFdID0gY291bnQ7Cit9CisKK3ZvaWQgYnR0dl92YmlfZ2V0X2ZtdChzdHJ1Y3QgYnR0dl9maCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwljb25zdCBzdHJ1Y3QgYnR0dl90dm5vcm0gKnR2bm9ybTsKKworCXR2bm9ybSA9ICZidHR2X3R2bm9ybXNbZmgtPmJ0di0+dHZub3JtXTsKKwltZW1zZXQoZiwwLHNpemVvZigqZikpOworCWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOworCWYtPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSAgICA9IHR2bm9ybS0+RnNjOworCWYtPmZtdC52Ymkuc2FtcGxlc19wZXJfbGluZSA9IDIwNDg7CisJZi0+Zm10LnZiaS5zYW1wbGVfZm9ybWF0ICAgID0gVjRMMl9QSVhfRk1UX0dSRVk7CisJZi0+Zm10LnZiaS5vZmZzZXQgICAgICAgICAgID0gMjQ0OworCWYtPmZtdC52YmkuY291bnRbMF0gICAgICAgICA9IGZoLT5saW5lczsKKwlmLT5mbXQudmJpLmNvdW50WzFdICAgICAgICAgPSBmaC0+bGluZXM7CisJZi0+Zm10LnZiaS5mbGFncyAgICAgICAgICAgID0gMDsKKwlzd2l0Y2ggKGZoLT5idHYtPnR2bm9ybSkgeworCWNhc2UgMTogLyogTlRTQyAqLworCQlmLT5mbXQudmJpLnN0YXJ0WzBdID0gMTA7CisJCWYtPmZtdC52Ymkuc3RhcnRbMV0gPSAyNzM7CisJCWJyZWFrOworCWNhc2UgMDogLyogUEFMICovCisJY2FzZSAyOiAvKiBTRUNBTSAqLworCWRlZmF1bHQ6CisJCWYtPmZtdC52Ymkuc3RhcnRbMF0gPSA3OworCQlmLT5mbXQudmJpLnN0YXJ0WzFdID0gMzE5OworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjJiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYuaApAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqICRJZDogYnR0di5oLHYgMS4xNyAyMDA1LzAyLzIyIDE0OjA2OjMyIGtyYXhlbCBFeHAgJAorICoKKyAqICBidHR2IC0gQnQ4NDggZnJhbWUgZ3JhYmJlciBkcml2ZXIKKyAqCisgKiAgY2FyZCBJRCdzIGFuZCBleHRlcm5hbCBpbnRlcmZhY2VzIG9mIHRoZSBidHR2IGRyaXZlcgorICogIGJhc2ljYWxseSBzdHVmZiBuZWVkZWQgYnkgb3RoZXIgZHJpdmVycyAoaTJjLCBsaXJjLCAuLi4pCisgKiAgYW5kIGlzIHN1cHBvcnRlZCBub3QgdG8gY2hhbmdlIG11Y2ggb3ZlciB0aW1lLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcgUmFscGggTWV0emxlciAocmprbUB0aHAudW5pLWtvZWxuLmRlKQorICogIChjKSAxOTk5LDIwMDAgR2VyZCBLbm9yciA8a3JheGVsQGdvbGRiYWNoLmluLWJlcmxpbi5kZT4KKyAqCisgKi8KKworI2lmbmRlZiBfQlRUVl9IXworI2RlZmluZSBfQlRUVl9IXworCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZXhwb3J0ZWQgYnkgYnR0di1jYXJkcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEJUVFZfVU5LTk9XTiAgICAgICAweDAwCisjZGVmaW5lIEJUVFZfTUlSTyAgICAgICAgICAweDAxCisjZGVmaW5lIEJUVFZfSEFVUFBBVUdFICAgICAweDAyCisjZGVmaW5lIEJUVFZfU1RCICAgICAgICAgICAweDAzCisjZGVmaW5lIEJUVFZfSU5URUwgICAgICAgICAweDA0CisjZGVmaW5lIEJUVFZfRElBTU9ORCAgICAgICAweDA1CisjZGVmaW5lIEJUVFZfQVZFUk1FRElBICAgICAweDA2CisjZGVmaW5lIEJUVFZfTUFUUklYX1ZJU0lPTiAweDA3CisjZGVmaW5lIEJUVFZfRkxZVklERU8gICAgICAweDA4CisjZGVmaW5lIEJUVFZfVFVSQk9UViAgICAgICAweDA5CisjZGVmaW5lIEJUVFZfSEFVUFBBVUdFODc4ICAweDBhCisjZGVmaW5lIEJUVFZfTUlST1BSTyAgICAgICAweDBiCisjZGVmaW5lIEJUVFZfQURTVEVDSF9UViAgICAweDBjCisjZGVmaW5lIEJUVFZfQVZFUk1FRElBOTggICAweDBkCisjZGVmaW5lIEJUVFZfVkhYICAgICAgICAgICAweDBlCisjZGVmaW5lIEJUVFZfWk9MVFJJWCAgICAgICAweDBmCisjZGVmaW5lIEJUVFZfUElYVklFV1BMQVlUViAweDEwCisjZGVmaW5lIEJUVFZfV0lOVklFV182MDEgICAweDExCisjZGVmaW5lIEJUVFZfQVZFQ19JTlRFUkNBUCAweDEyCisjZGVmaW5lIEJUVFZfTElGRV9GTFlLSVQgICAweDEzCisjZGVmaW5lIEJUVFZfQ0VJX1JBRkZMRVMgICAweDE0CisjZGVmaW5lIEJUVFZfQ09ORkVSRU5DRVRWICAweDE1CisjZGVmaW5lIEJUVFZfUEhPRUJFX1RWTUFTICAweDE2CisjZGVmaW5lIEJUVFZfTU9EVEVDXzIwNSAgICAweDE3CisjZGVmaW5lIEJUVFZfTUFHSUNUVklFVzA2MSAweDE4CisjZGVmaW5lIEJUVFZfVk9CSVNfQk9PU1RBUiAweDE5CisjZGVmaW5lIEJUVFZfSEFVUFBBVUdfV0NBTSAweDFhCisjZGVmaW5lIEJUVFZfTUFYSSAgICAgICAgICAweDFiCisjZGVmaW5lIEJUVFZfVEVSUkFUViAgICAgICAweDFjCisjZGVmaW5lIEJUVFZfUFhDMjAwICAgICAgICAweDFkCisjZGVmaW5lIEJUVFZfRkxZVklERU9fOTggICAweDFlCisjZGVmaW5lIEJUVFZfSVBST1RWICAgICAgICAweDFmCisjZGVmaW5lIEJUVFZfSU5URUxfQ19TX1BDSSAweDIwCisjZGVmaW5lIEJUVFZfVEVSUkFUVkFMVUUgICAweDIxCisjZGVmaW5lIEJUVFZfV0lORkFTVDIwMDAgICAweDIyCisjZGVmaW5lIEJUVFZfQ0hST05PU19WUzIgICAweDIzCisjZGVmaW5lIEJUVFZfVFlQSE9PTl9UVklFVyAweDI0CisjZGVmaW5lIEJUVFZfUFhFTFZXUExUVlBSTyAweDI1CisjZGVmaW5lIEJUVFZfTUFHSUNUVklFVzA2MyAweDI2CisjZGVmaW5lIEJUVFZfUElOTkFDTEUgICAgICAweDI3CisjZGVmaW5lIEJUVFZfU1RCMiAgICAgICAgICAweDI4CisjZGVmaW5lIEJUVFZfQVZQSE9ORTk4ICAgICAweDI5CisjZGVmaW5lIEJUVFZfUFY5NTEgICAgICAgICAweDJhCisjZGVmaW5lIEJUVFZfT05BSVJfVFYgICAgICAweDJiCisjZGVmaW5lIEJUVFZfU0lHTUFfVFZJSV9GTSAweDJjCisjZGVmaW5lIEJUVFZfTUFUUklYX1ZJU0lPTjIgMHgyZAorI2RlZmluZSBCVFRWX1pPTFRSSVhfR0VOSUUgMHgyZQorI2RlZmluZSBCVFRWX1RFUlJBVFZSQURJTyAgMHgyZgorI2RlZmluZSBCVFRWX0RZTkFMSU5LICAgICAgMHgzMAorI2RlZmluZSBCVFRWX0dWQkNUVjNQQ0kgICAgMHgzMQorI2RlZmluZSBCVFRWX1BYRUxWV1BMVFZQQUsgMHgzMgorI2RlZmluZSBCVFRWX0VBR0xFICAgICAgICAgMHgzMworI2RlZmluZSBCVFRWX1BJTk5BQ0xFUFJPICAgMHgzNAorI2RlZmluZSBCVFRWX1RWSUVXX1JEU19GTSAgMHgzNQorI2RlZmluZSBCVFRWX0xJRkVURUNfOTQxNSAgMHgzNgorI2RlZmluZSBCVFRWX0JFU1RCVVlfRUFTWVRWIDB4MzcKKyNkZWZpbmUgQlRUVl9GTFlWSURFT185OEZNIDB4MzgKKyNkZWZpbmUgQlRUVl9HTVYxICAgICAgICAgIDB4M2QKKyNkZWZpbmUgQlRUVl9CRVNUQlVZX0VBU1lUVjIgMHgzZQorI2RlZmluZSBCVFRWX0FUSV9UVldPTkRFUiAgMHgzZgorI2RlZmluZSBCVFRWX0FUSV9UVldPTkRFUlZFIDB4NDAKKyNkZWZpbmUgQlRUVl9GTFlWSURFTzIwMDAgICAweDQxCisjZGVmaW5lIEJUVFZfVEVSUkFUVkFMVUVSICAgMHg0MgorI2RlZmluZSBCVFRWX0dWQkNUVjRQQ0kgICAgIDB4NDMKKyNkZWZpbmUgQlRUVl9WT09ET09UVl9GTSAgICAweDQ0CisjZGVmaW5lIEJUVFZfQUlNTVMgICAgICAgICAgMHg0NQorI2RlZmluZSBCVFRWX1BWX0JUODc4UF9QTFVTIDB4NDYKKyNkZWZpbmUgQlRUVl9GTFlWSURFTzk4RVogICAweDQ3CisjZGVmaW5lIEJUVFZfUFZfQlQ4NzhQXzlCICAgMHg0OAorI2RlZmluZSBCVFRWX1NFTlNPUkFZMzExICAgIDB4NDkKKyNkZWZpbmUgQlRUVl9SVjYwNSAgICAgICAgICAweDRhCisjZGVmaW5lIEJUVFZfV0lORFZSICAgICAgICAgMHg0YworI2RlZmluZSBCVFRWX0dSQU5EVEVDICAgICAgIDB4NGQKKyNkZWZpbmUgQlRUVl9LV09STEQgICAgICAgICAweDRlCisjZGVmaW5lIEJUVFZfSEFVUFBBVUdFUFZSICAgMHg1MAorI2RlZmluZSBCVFRWX0dWQkNUVjVQQ0kgICAgIDB4NTEKKyNkZWZpbmUgQlRUVl9PU1BSRVkxeDAgICAgICAweDUyCisjZGVmaW5lIEJUVFZfT1NQUkVZMXgwXzg0OCAgMHg1MworI2RlZmluZSBCVFRWX09TUFJFWTEwMV84NDggIDB4NTQKKyNkZWZpbmUgQlRUVl9PU1BSRVkxeDEgICAgICAweDU1CisjZGVmaW5lIEJUVFZfT1NQUkVZMXgxX1NWSUQgMHg1NgorI2RlZmluZSBCVFRWX09TUFJFWTJ4eCAgICAgIDB4NTcKKyNkZWZpbmUgQlRUVl9PU1BSRVkyeDBfU1ZJRCAweDU4CisjZGVmaW5lIEJUVFZfT1NQUkVZMngwICAgICAgMHg1OQorI2RlZmluZSBCVFRWX09TUFJFWTUwMCAgICAgIDB4NWEKKyNkZWZpbmUgQlRUVl9PU1BSRVk1NDAgICAgICAweDViCisjZGVmaW5lIEJUVFZfT1NQUkVZMjAwMCAgICAgMHg1YworI2RlZmluZSBCVFRWX0lEU19FQUdMRSAgICAgIDB4NWQKKyNkZWZpbmUgQlRUVl9QSU5OQUNMRVNBVCAgICAweDVlCisjZGVmaW5lIEJUVFZfRk9STUFDX1BST1RWICAgMHg1ZgorI2RlZmluZSBCVFRWX0VVUkVTWVNfUElDT0xPIDB4NjEKKyNkZWZpbmUgQlRUVl9QVjE1MCAgICAgICAgICAweDYyCisjZGVmaW5lIEJUVFZfQURfVFZLNTAzICAgICAgMHg2MworI2RlZmluZSBCVFRWX0lWQzIwMCAgICAgICAgIDB4NjYKKyNkZWZpbmUgQlRUVl9YR1VBUkQgICAgICAgICAweDY3CisjZGVmaW5lIEJUVFZfTkVCVUxBX0RJR0lUViAgMHg2OAorI2RlZmluZSBCVFRWX1BWMTQzICAgICAgICAgIDB4NjkKKyNkZWZpbmUgQlRUVl9JVkMxMDAgICAgICAgICAweDZlCisjZGVmaW5lIEJUVFZfSVZDMTIwICAgICAgICAgMHg2ZgorI2RlZmluZSBCVFRWX1BDX0hEVFYgICAgICAgIDB4NzAKKyNkZWZpbmUgQlRUVl9UV0lOSEFOX0RTVCAgICAweDcxCisjZGVmaW5lIEJUVFZfV0lORkFTVFZDMTAwICAgMHg3MgorI2RlZmluZSBCVFRWX1NJTVVTX0dWQzExMDAgIDB4NzQKKyNkZWZpbmUgQlRUVl9OR1NUVl9QTFVTICAgICAweDc1CisjZGVmaW5lIEJUVFZfTE1MQlQ0ICAgICAgICAgMHg3NgorI2RlZmluZSBCVFRWX1BJQ09MT19URVRSQV9DSElQIDB4NzkKKyNkZWZpbmUgQlRUVl9BVkRWQlRfNzcxICAgICAweDdiCisjZGVmaW5lIEJUVFZfQVZEVkJUXzc2MSAgICAgMHg3YworI2RlZmluZSBCVFRWX01BVFJJWF9WSVNJT05TUSAgMHg3ZAorI2RlZmluZSBCVFRWX01BVFJJWF9WSVNJT05TTEMgMHg3ZQorI2RlZmluZSBCVFRWX0FQQUNfVklFV0NPTVAgIDB4N2YKKyNkZWZpbmUgQlRUVl9EVklDT19EVkJUX0xJVEUgIDB4ODAKKyNkZWZpbmUgQlRUVl9USUJFVF9DUzE2ICAweDgzCisjZGVmaW5lIEJUVFZfS09ESUNPTV80NDAwUiAgMHg4NAorCisvKiBpMmMgYWRkcmVzcyBsaXN0ICovCisjZGVmaW5lIEkyQ19UU0E1NTIyICAgICAgICAweGMyCisjZGVmaW5lIEkyQ19UREE3NDMyICAgICAgICAweDhhCisjZGVmaW5lIEkyQ19CVDgzMl9BTFQxCSAgIDB4ODgKKyNkZWZpbmUgSTJDX0JUODMyX0FMVDIJICAgMHg4YSAvLyBhbHRlcm5hdGUgc2V0dGluZworI2RlZmluZSBJMkNfVERBODQyNSAgICAgICAgMHg4MgorI2RlZmluZSBJMkNfVERBOTg0MCAgICAgICAgMHg4NAorI2RlZmluZSBJMkNfVERBOTg1MCAgICAgICAgMHhiNiAvKiBhbHNvIHVzZWQgYnkgOTg1NSw5ODczICovCisjZGVmaW5lIEkyQ19UREE5ODc0ICAgICAgICAweGIwIC8qIGFsc28gdXNlZCBieSA5ODc1ICovCisjZGVmaW5lIEkyQ19UREE5ODc1ICAgICAgICAweGIwCisjZGVmaW5lIEkyQ19IQVVQRUUgICAgICAgICAweGEwCisjZGVmaW5lIEkyQ19TVEJFRSAgICAgICAgICAweGFlCisjZGVmaW5lIEkyQ19WSFggICAgICAgICAgICAweGMwCisjZGVmaW5lIEkyQ19NU1AzNDAwICAgICAgICAweDgwCisjZGVmaW5lIEkyQ19NU1AzNDAwX0FMVCAgICAweDg4CisjZGVmaW5lIEkyQ19URUE2MzAwICAgICAgICAweDgwIC8qIGFsc28gdXNlZCBieSA2MzIwICovCisjZGVmaW5lIEkyQ19EUEwzNTE4CSAgIDB4ODQKKyNkZWZpbmUgSTJDX1REQTk4ODcJICAgMHg4NgorCisvKiBtb3JlIGNhcmQtc3BlY2lmaWMgZGVmaW5lcyAqLworI2RlZmluZSBQVDIyNTRfTF9DSEFOTkVMIDB4MTAKKyNkZWZpbmUgUFQyMjU0X1JfQ0hBTk5FTCAweDA4CisjZGVmaW5lIFBUMjI1NF9EQlNfSU5fMiAweDQwMAorI2RlZmluZSBQVDIyNTRfREJTX0lOXzEwIDB4MjAwMDAKKyNkZWZpbmUgV0lOVklFV19QVDIyNTRfQ0xLICAweDQwCisjZGVmaW5lIFdJTlZJRVdfUFQyMjU0X0RBVEEgMHgyMAorI2RlZmluZSBXSU5WSUVXX1BUMjI1NF9TVFJPQkUgMHg4MAorCisvKiBkaWdpdGFsX21vZGUgKi8KKyNkZWZpbmUgRElHSVRBTF9NT0RFX1ZJREVPIDEKKyNkZWZpbmUgRElHSVRBTF9NT0RFX0NBTUVSQSAyCisKK3N0cnVjdCBidHR2X2NvcmUgeworCS8qIGRldmljZSBzdHJ1Y3RzICovCisJc3RydWN0IHBjaV9kZXYgICAgICAgKnBjaTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgICBpMmNfYWRhcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICBzdWJzOyAgICAgLyogc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqLworCisJLyogZGV2aWNlIGNvbmZpZyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICBucjsgICAgICAgLyogZGV2IG5yIChmb3IgcHJpbnRrKCJidHR2JWQ6IC4uLiIpOyAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICB0eXBlOyAgICAgLyogY2FyZCB0eXBlIChwb2ludGVyIGludG8gdHZjYXJkc1tdKSAgKi8KKwljaGFyICAgICAgICAgICAgICAgICBuYW1lWzhdOyAgLyogZGV2IG5hbWUgKi8KK307CisKK3N0cnVjdCBidHR2OworCitzdHJ1Y3QgdHZjYXJkCit7CisgICAgICAgIGNoYXIgKm5hbWU7CisgICAgICAgIHVuc2lnbmVkIGludCB2aWRlb19pbnB1dHM7CisgICAgICAgIHVuc2lnbmVkIGludCBhdWRpb19pbnB1dHM7CisgICAgICAgIHVuc2lnbmVkIGludCB0dW5lcjsKKyAgICAgICAgdW5zaWduZWQgaW50IHN2aHM7CisJdW5zaWduZWQgaW50IGRpZ2l0YWxfbW9kZTsgLy8gRElHSVRBTF9NT0RFX0NBTUVSQSBvciBESUdJVEFMX01PREVfVklERU8KKyAgICAgICAgdTMyIGdwaW9tYXNrOworICAgICAgICB1MzIgbXV4c2VsWzE2XTsKKyAgICAgICAgdTMyIGF1ZGlvbXV4WzZdOyAvKiBUdW5lciwgUmFkaW8sIGV4dGVybmFsLCBpbnRlcm5hbCwgbXV0ZSwgc3RlcmVvICovCisgICAgICAgIHUzMiBncGlvbWFzazI7ICAgLyogR1BJTyBNVVggbWFzayAqLworCisJLyogaTJjIGF1ZGlvIGZsYWdzICovCisJdW5zaWduZWQgaW50IG5vX21zcDM0eHg6MTsKKwl1bnNpZ25lZCBpbnQgbm9fdGRhOTg3NToxOworCXVuc2lnbmVkIGludCBub190ZGE3NDMyOjE7CisJdW5zaWduZWQgaW50IG5lZWRzX3R2YXVkaW86MTsKKwl1bnNpZ25lZCBpbnQgbXNwMzR4eF9hbHQ6MTsKKworCS8qIGZsYWc6IHZpZGVvIHBjaSBmdW5jdGlvbiBpcyB1bnVzZWQgKi8KKwl1bnNpZ25lZCBpbnQgbm9fdmlkZW86MTsKKwl1bnNpZ25lZCBpbnQgaGFzX2R2YjoxOworCXVuc2lnbmVkIGludCBoYXNfcmVtb3RlOjE7CisJdW5zaWduZWQgaW50IG5vX2dwaW9pcnE6MTsKKworCS8qIG90aGVyIHNldHRpbmdzICovCisJdW5zaWduZWQgaW50IHBsbDsKKyNkZWZpbmUgUExMX05PTkUgMAorI2RlZmluZSBQTExfMjggICAxCisjZGVmaW5lIFBMTF8zNSAgIDIKKworCXVuc2lnbmVkIGludCB0dW5lcl90eXBlOworCXVuc2lnbmVkIGludCBoYXNfcmFkaW87CisJdm9pZCAoKmF1ZGlvX2hvb2spKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CisJdm9pZCAoKm11eHNlbF9ob29rKShzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOworfTsKKworZXh0ZXJuIHN0cnVjdCB0dmNhcmQgYnR0dl90dmNhcmRzW107CisKKy8qIGlkZW50aWZpY2F0aW9uIC8gaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNhcmQgKi8KK2V4dGVybiB2b2lkIGJ0dHZfaWRjYXJkKHN0cnVjdCBidHR2ICpidHYpOworZXh0ZXJuIHZvaWQgYnR0dl9pbml0X2NhcmQxKHN0cnVjdCBidHR2ICpidHYpOworZXh0ZXJuIHZvaWQgYnR0dl9pbml0X2NhcmQyKHN0cnVjdCBidHR2ICpidHYpOworCisvKiBjYXJkLXNwZWNpZmljIGZ1bnRpb25zICovCitleHRlcm4gdm9pZCB0ZWE1NzU3X3NldF9mcmVxKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIHNob3J0IGZyZXEpOworZXh0ZXJuIHZvaWQgYnR0dl90ZGE5ODgwX3NldG5vcm0oc3RydWN0IGJ0dHYgKmJ0diwgaW50IG5vcm0pOworCisvKiBleHRyYSB0d2Vha3MgZm9yIHNvbWUgY2hpcHNldHMgKi8KK2V4dGVybiB2b2lkIGJ0dHZfY2hlY2tfY2hpcHNldCh2b2lkKTsKK2V4dGVybiBpbnQgYnR0dl9oYW5kbGVfY2hpcHNldChzdHJ1Y3QgYnR0diAqYnR2KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZXhwb3J0ZWQgYnkgYnR0di1pZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiB0aGlzIG9ic29sZXRlIC0tIHBsZWFzZSB1c2UgdGhlIHN5c2ZzLWJhc2VkCisgICBpbnRlcmZhY2UgYmVsb3cgZm9yIG5ldyBjb2RlICovCisKKy8qIHJldHVybnMgY2FyZCB0eXBlICsgY2FyZCBJRCAoZm9yIGJ0ODc4LWJhc2VkIG9uZXMpCisgICBmb3IgcG9zc2libGUgdmFsdWVzIHNlZSBsaW5lcyBiZWxvdyBiZWdpbm5pbmcgd2l0aCAjZGVmaW5lIEJUVFZfVU5LTk9XTgorICAgcmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBpZiBlcnJvciBvY2N1cnJlZAorKi8KK2V4dGVybiBpbnQgYnR0dl9nZXRfY2FyZGluZm8odW5zaWduZWQgaW50IGNhcmQsIGludCAqdHlwZSwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpjYXJkaWQpOworZXh0ZXJuIHN0cnVjdCBwY2lfZGV2KiBidHR2X2dldF9wY2lkZXYodW5zaWduZWQgaW50IGNhcmQpOworCisvKiBvYnNvbGV0ZSwgdXNlIGJ0dHZfZ2V0X2NhcmRpbmZvIGluc3RlYWQgKi8KK2V4dGVybiBpbnQgYnR0dl9nZXRfaWQodW5zaWduZWQgaW50IGNhcmQpOworCisvKiBzZXRzIEdQT0UgcmVnaXN0ZXIgKEJUODQ4X0dQSU9fT1VUX0VOKSB0byBuZXcgdmFsdWU6CisgICBkYXRhIHwgKGN1cnJlbnRfR1BPRV92YWx1ZSAmIH5tYXNrKQorICAgcmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBpZiBlcnJvciBvY2N1cnJlZAorKi8KK2V4dGVybiBpbnQgYnR0dl9ncGlvX2VuYWJsZSh1bnNpZ25lZCBpbnQgY2FyZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG1hc2ssIHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKy8qIGZpbGxzIGRhdGEgd2l0aCBHUERBVEEgcmVnaXN0ZXIgY29udGVudHMKKyAgIHJldHVybnMgbmVnYXRpdmUgdmFsdWUgaWYgZXJyb3Igb2NjdXJyZWQKKyovCitleHRlcm4gaW50IGJ0dHZfcmVhZF9ncGlvKHVuc2lnbmVkIGludCBjYXJkLCB1bnNpZ25lZCBsb25nICpkYXRhKTsKKworLyogc2V0cyBHUERBVEEgcmVnaXN0ZXIgdG8gbmV3IHZhbHVlOgorICAoZGF0YSAmIG1hc2spIHwgKGN1cnJlbnRfR1BEQVRBX3ZhbHVlICYgfm1hc2spCisgIHJldHVybnMgbmVnYXRpdmUgdmFsdWUgaWYgZXJyb3Igb2NjdXJyZWQKKyovCitleHRlcm4gaW50IGJ0dHZfd3JpdGVfZ3Bpbyh1bnNpZ25lZCBpbnQgY2FyZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyBkYXRhKTsKKworLyogcmV0dXJucyBwb2ludGVyIHRvIHRhc2sgcXVldWUgd2hpY2ggY2FuIGJlIHVzZWQgYXMgcGFyYW1ldGVyIHRvCisgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uCisgICBpbiBpbnRlcnJ1cHQgaGFuZGxlciBpZiBCVDg0OF9JTlRfR1BJTlQgYml0IGlzIHNldCAtIHRoaXMgcXVldWUgaXMgYWN0aXZhdGVkCisgICAod2FrZV91cF9pbnRlcnJ1cHRpYmxlKSBhbmQgZm9sbG93aW5nIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGJ0dHZfcmVhZF9ncGlvCisgICBzaG91bGQgcmV0dXJuIG5ldyB2YWx1ZSBvZiBHUERBVEEsCisgICByZXR1cm5zIE5VTEwgdmFsdWUgaWYgZXJyb3Igb2NjdXJyZWQgb3IgcXVldWUgaXMgbm90IGF2YWlsYWJsZQorICAgV0FSTklORzogYmVjYXVzZSB0aGVyZSBpcyBubyBidWZmZXIgZm9yIEdQSU8gZGF0YSwgb25lIE1VU1QKKyAgIHByb2Nlc3MgZGF0YSBBU0FQCisqLworZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90KiBidHR2X2dldF9ncGlvX3F1ZXVlKHVuc2lnbmVkIGludCBjYXJkKTsKKworLyogY2FsbCBpMmMgY2xpZW50cworKi8KK2V4dGVybiB2b2lkIGJ0dHZfaTJjX2NhbGwodW5zaWduZWQgaW50IGNhcmQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBzeXNmcy9kcml2ZXItbW9kZWQgYmFzZWQgZ3BpbyBhY2Nlc3MgaW50ZXJmYWNlICAgICAgICAgICAgICovCisKKworc3RydWN0IGJ0dHZfc3ViX2RldmljZSB7CisJc3RydWN0IGRldmljZSAgICBkZXY7CisJc3RydWN0IGJ0dHZfY29yZSAqY29yZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworI2RlZmluZSB0b19idHR2X3N1Yl9kZXYoeCkgY29udGFpbmVyX29mKCh4KSwgc3RydWN0IGJ0dHZfc3ViX2RldmljZSwgZGV2KQorCitzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyIHsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAgIGRydjsKKwljaGFyICAgICAgICAgICAgICAgICAgIHdhbnRlZFtCVVNfSURfU0laRV07CisJdm9pZCAgICAgICAgICAgICAgICAgICAoKmdwaW9faXJxKShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpOworfTsKKyNkZWZpbmUgdG9fYnR0dl9zdWJfZHJ2KHgpIGNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBidHR2X3N1Yl9kcml2ZXIsIGRydikKKworaW50IGJ0dHZfc3ViX3JlZ2lzdGVyKHN0cnVjdCBidHR2X3N1Yl9kcml2ZXIgKmRydiwgY2hhciAqd2FudGVkKTsKK2ludCBidHR2X3N1Yl91bnJlZ2lzdGVyKHN0cnVjdCBidHR2X3N1Yl9kcml2ZXIgKmRydik7CisKKy8qIGdwaW8gYWNjZXNzIGZ1bmN0aW9ucyAqLwordm9pZCBidHR2X2dwaW9faW5vdXQoc3RydWN0IGJ0dHZfY29yZSAqY29yZSwgdTMyIG1hc2ssIHUzMiBvdXRiaXRzKTsKK3UzMiBidHR2X2dwaW9fcmVhZChzdHJ1Y3QgYnR0dl9jb3JlICpjb3JlKTsKK3ZvaWQgYnR0dl9ncGlvX3dyaXRlKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUsIHUzMiB2YWx1ZSk7Cit2b2lkIGJ0dHZfZ3Bpb19iaXRzKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUsIHUzMiBtYXNrLCB1MzIgYml0cyk7CisKKyNkZWZpbmUgZ3Bpb19pbm91dChtYXNrLGJpdHMpICBidHR2X2dwaW9faW5vdXQoJmJ0di0+YywgbWFzaywgYml0cykKKyNkZWZpbmUgZ3Bpb19yZWFkKCkgICAgICAgICAgICBidHR2X2dwaW9fcmVhZCgmYnR2LT5jKQorI2RlZmluZSBncGlvX3dyaXRlKHZhbHVlKSAgICAgIGJ0dHZfZ3Bpb193cml0ZSgmYnR2LT5jLCB2YWx1ZSkKKyNkZWZpbmUgZ3Bpb19iaXRzKG1hc2ssYml0cykgICBidHR2X2dwaW9fYml0cygmYnR2LT5jLCBtYXNrLCBiaXRzKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGkyYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworZXh0ZXJuIHZvaWQgYnR0dl9jYWxsX2kyY19jbGllbnRzKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CitleHRlcm4gaW50IGJ0dHZfSTJDUmVhZChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBjaGFyIGFkZHIsIGNoYXIgKnByb2JlX2Zvcik7CitleHRlcm4gaW50IGJ0dHZfSTJDV3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgY2hhciBhZGRyLCB1bnNpZ25lZCBjaGFyIGIxLAorCQkJIHVuc2lnbmVkIGNoYXIgYjIsIGludCBib3RoKTsKK2V4dGVybiB2b2lkIGJ0dHZfcmVhZGVlKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGNoYXIgKmVlZGF0YSwgaW50IGFkZHIpOworCisjZW5kaWYgLyogX0JUVFZfSF8gKi8KKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHZwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHZwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5YmE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0dnAuaApAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAgICAkSWQ6IGJ0dHZwLmgsdiAxLjE3IDIwMDUvMDIvMTYgMTI6MTQ6MTAga3JheGVsIEV4cCAkCisKKyAgICBidHR2IC0gQnQ4NDggZnJhbWUgZ3JhYmJlciBkcml2ZXIKKworICAgIGJ0dHYncyAqcHJpdmF0ZSogaGVhZGVyIGZpbGUgIC0tICBub2JvZHkgb3RoZXIgdGhhbiBidHR2IGl0c2VsZgorICAgIHNob3VsZCBldmVyIGluY2x1ZGUgdGhpcyBmaWxlLgorCisgICAgKGMpIDIwMDAtMjAwMiBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpZm5kZWYgX0JUVFZQX0hfCisjZGVmaW5lIF9CVFRWUF9IXworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2RlZmluZSBCVFRWX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLDksMTUpCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KKyNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgorI2luY2x1ZGUgPG1lZGlhL3R2ZWVwcm9tLmg+CisjaW5jbHVkZSA8bWVkaWEvaXItY29tbW9uLmg+CisKKyNpbmNsdWRlICJidDg0OC5oIgorI2luY2x1ZGUgImJ0dHYuaCIKKyNpbmNsdWRlICJidGN4LXJpc2MuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBGT1JNQVRfRkxBR1NfRElUSEVSICAgICAgIDB4MDEKKyNkZWZpbmUgRk9STUFUX0ZMQUdTX1BBQ0tFRCAgICAgICAweDAyCisjZGVmaW5lIEZPUk1BVF9GTEFHU19QTEFOQVIgICAgICAgMHgwNAorI2RlZmluZSBGT1JNQVRfRkxBR1NfUkFXICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRk9STUFUX0ZMQUdTX0NyQ2IgICAgICAgICAweDEwCisKKyNkZWZpbmUgUklTQ19TTE9UX09fVkJJICAgICAgICA0CisjZGVmaW5lIFJJU0NfU0xPVF9PX0ZJRUxEICAgICAgNgorI2RlZmluZSBSSVNDX1NMT1RfRV9WQkkgICAgICAgMTAKKyNkZWZpbmUgUklTQ19TTE9UX0VfRklFTEQgICAgIDEyCisjZGVmaW5lIFJJU0NfU0xPVF9MT09QICAgICAgICAxNAorCisjZGVmaW5lIFJFU09VUkNFX09WRVJMQVkgICAgICAgMQorI2RlZmluZSBSRVNPVVJDRV9WSURFTyAgICAgICAgIDIKKyNkZWZpbmUgUkVTT1VSQ0VfVkJJICAgICAgICAgICA0CisKKyNkZWZpbmUgUkFXX0xJTkVTICAgICAgICAgICAgNjQwCisjZGVmaW5lIFJBV19CUEwgICAgICAgICAgICAgMTAyNAorCisjZGVmaW5lIFVOU0VUICgtMVUpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGJ0dHZfdHZub3JtIHsKKwlpbnQgICB2NGwyX2lkOworCWNoYXIgICpuYW1lOworICAgICAgICB1MzIgICBGc2M7CisgICAgICAgIHUxNiAgIHN3aWR0aCwgc2hlaWdodDsgLyogc2NhbGVkIHN0YW5kYXJkIHdpZHRoLCBoZWlnaHQgKi8KKwl1MTYgICB0b3RhbHdpZHRoOworCXU4ICAgIGFkZWxheSwgYmRlbGF5LCBpZm9ybTsKKwl1MzIgICBzY2FsZWR0d2lkdGg7CisJdTE2ICAgaGRlbGF5eDEsIGhhY3RpdmV4MTsKKwl1MTYgICB2ZGVsYXk7CisgICAgICAgIHU4ICAgIHZiaXBhY2s7CisJdTE2ICAgdnRvdGFsOworCWludCAgIHNyYW07Cit9OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBidHR2X3R2bm9ybSBidHR2X3R2bm9ybXNbXTsKKworc3RydWN0IGJ0dHZfZm9ybWF0IHsKKwljaGFyICpuYW1lOworCWludCAgcGFsZXR0ZTsgICAgICAgICAvKiB2aWRlbzRsaW51eCAxICAgICAgKi8KKwlpbnQgIGZvdXJjYzsgICAgICAgICAgLyogdmlkZW80bGludXggMiAgICAgICovCisJaW50ICBidGZvcm1hdDsgICAgICAgIC8qIEJUODQ4X0NPTE9SX0ZNVF8qICAqLworCWludCAgYnRzd2FwOyAgICAgICAgICAvKiBCVDg0OF9DT0xPUl9DVExfKiAgKi8KKwlpbnQgIGRlcHRoOyAgICAgICAgICAgLyogYml0L3BpeGVsICAgICAgICAgICovCisJaW50ICBmbGFnczsKKwlpbnQgIGhzaGlmdCx2c2hpZnQ7ICAgLyogZm9yIHBsYW5hciBtb2RlcyAgICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBidHR2X2dlb21ldHJ5IHsKKwl1OCAgdnRjLGNyb3AsY29tYjsKKwl1MTYgd2lkdGgsaHNjYWxlLGhkZWxheTsKKwl1MTYgc2hlaWdodCx2c2NhbGUsdmRlbGF5LHZ0b3RhbDsKK307CisKK3N0cnVjdCBidHR2X2J1ZmZlciB7CisJLyogY29tbW9uIHY0bCBidWZmZXIgc3R1ZmYgLS0gbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgICAgIHZiOworCisJLyogYnR0diBzcGVjaWZpYyAqLworCWNvbnN0IHN0cnVjdCBidHR2X2Zvcm1hdCAgICpmbXQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgdHZub3JtOworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGJ0Zm9ybWF0OworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGJ0c3dhcDsKKwlzdHJ1Y3QgYnR0dl9nZW9tZXRyeSAgICAgICBnZW87CisJc3RydWN0IGJ0Y3hfcmlzY21lbSAgICAgICAgdG9wOworCXN0cnVjdCBidGN4X3Jpc2NtZW0gICAgICAgIGJvdHRvbTsKK307CisKK3N0cnVjdCBidHR2X2J1ZmZlcl9zZXQgeworCXN0cnVjdCBidHR2X2J1ZmZlciAgICAgKnRvcDsgICAgICAgLyogdG9wIGZpZWxkIGJ1ZmZlciAgICAqLworCXN0cnVjdCBidHR2X2J1ZmZlciAgICAgKmJvdHRvbTsgICAgLyogYm90dG9tIGZpZWxkIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgdG9wX2lycTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgIGZyYW1lX2lycTsKK307CisKK3N0cnVjdCBidHR2X292ZXJsYXkgeworCWludCAgICAgICAgICAgICAgICAgICAgdHZub3JtOworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgdzsKKwllbnVtIHY0bDJfZmllbGQgICAgICAgIGZpZWxkOworCXN0cnVjdCB2NGwyX2NsaXAgICAgICAgKmNsaXBzOworCWludCAgICAgICAgICAgICAgICAgICAgbmNsaXBzOworCWludCAgICAgICAgICAgICAgICAgICAgc2V0dXBfb2s7Cit9OworCitzdHJ1Y3QgYnR0dl9maCB7CisJc3RydWN0IGJ0dHYgICAgICAgICAgICAgICpidHY7CisJaW50IHJlc291cmNlczsKKyNpZmRlZiBWSURJT0NfR19QUklPUklUWQorCWVudW0gdjRsMl9wcmlvcml0eSAgICAgICBwcmlvOworI2VuZGlmCisJZW51bSB2NGwyX2J1Zl90eXBlICAgICAgIHR5cGU7CisKKwkvKiB2aWRlbyBjYXB0dXJlICovCisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICAgIGNhcDsKKwljb25zdCBzdHJ1Y3QgYnR0dl9mb3JtYXQgKmZtdDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgd2lkdGg7CisJaW50ICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDsKKworCS8qIGN1cnJlbnQgc2V0dGluZ3MgKi8KKwljb25zdCBzdHJ1Y3QgYnR0dl9mb3JtYXQgKm92Zm10OworCXN0cnVjdCBidHR2X292ZXJsYXkgICAgICBvdjsKKworCS8qIHZpZGVvIG92ZXJsYXkgKi8KKwlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgICAgdmJpOworCWludCAgICAgICAgICAgICAgICAgICAgICBsaW5lczsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGJ0dHYtcmlzYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogcmlzYyBjb2RlIGdlbmVyYXRvcnMgLSBjYXB0dXJlICovCitpbnQgYnR0dl9yaXNjX3BhY2tlZChzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBicGwsCisJCSAgICAgdW5zaWduZWQgaW50IHBpdGNoLCB1bnNpZ25lZCBpbnQgbGluZXMpOworCisvKiBjb250cm9sIGRtYSByZWdpc3RlciArIHJpc2MgbWFpbiBsb29wICovCit2b2lkIGJ0dHZfc2V0X2RtYShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgb3ZlcnJpZGUpOworaW50IGJ0dHZfcmlzY19pbml0X21haW4oc3RydWN0IGJ0dHYgKmJ0dik7CitpbnQgYnR0dl9yaXNjX2hvb2soc3RydWN0IGJ0dHYgKmJ0diwgaW50IHNsb3QsIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCisJCSAgIGludCBpcnFmbGFncyk7CisKKy8qIGNhcHR1cmUgYnVmZmVyIGhhbmRsaW5nICovCitpbnQgYnR0dl9idWZmZXJfcmlzYyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgYnR0dl9idWZmZXIgKmJ1Zik7CitpbnQgYnR0dl9idWZmZXJfYWN0aXZhdGVfdmlkZW8oc3RydWN0IGJ0dHYgKmJ0diwKKwkJCSAgICAgICBzdHJ1Y3QgYnR0dl9idWZmZXJfc2V0ICpzZXQpOworaW50IGJ0dHZfYnVmZmVyX2FjdGl2YXRlX3ZiaShzdHJ1Y3QgYnR0diAqYnR2LAorCQkJICAgICBzdHJ1Y3QgYnR0dl9idWZmZXIgKnZiaSk7Cit2b2lkIGJ0dHZfZG1hX2ZyZWUoc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IGJ0dHZfYnVmZmVyICpidWYpOworCisvKiBvdmVybGF5IGhhbmRsaW5nICovCitpbnQgYnR0dl9vdmVybGF5X3Jpc2Moc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IGJ0dHZfb3ZlcmxheSAqb3YsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBidHR2X2Zvcm1hdCAqZm10LAorCQkgICAgICBzdHJ1Y3QgYnR0dl9idWZmZXIgKmJ1Zik7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogYnR0di12YmkuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit2b2lkIGJ0dHZfdmJpX3RyeV9mbXQoc3RydWN0IGJ0dHZfZmggKmZoLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOwordm9pZCBidHR2X3ZiaV9nZXRfZm10KHN0cnVjdCBidHR2X2ZoICpmaCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKK3ZvaWQgYnR0dl92Ymlfc2V0bGluZXMoc3RydWN0IGJ0dHZfZmggKmZoLCBzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgbGluZXMpOworCitleHRlcm4gc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyBidHR2X3ZiaV9xb3BzOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBidHR2LWdwaW8uYyAqLworCisKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgYnR0dl9zdWJfYnVzX3R5cGU7CitpbnQgYnR0dl9zdWJfYWRkX2RldmljZShzdHJ1Y3QgYnR0dl9jb3JlICpjb3JlLCBjaGFyICpuYW1lKTsKK2ludCBidHR2X3N1Yl9kZWxfZGV2aWNlcyhzdHJ1Y3QgYnR0dl9jb3JlICpjb3JlKTsKK3ZvaWQgYnR0dl9ncGlvX2lycShzdHJ1Y3QgYnR0dl9jb3JlICpjb3JlKTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBidHR2LWRyaXZlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIGluc21vZCBvcHRpb25zICovCitleHRlcm4gdW5zaWduZWQgaW50IGJ0dHZfdmVyYm9zZTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYnR0dl9kZWJ1ZzsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYnR0dl9ncGlvOworZXh0ZXJuIHZvaWQgYnR0dl9ncGlvX3RyYWNraW5nKHN0cnVjdCBidHR2ICpidHYsIGNoYXIgKmNvbW1lbnQpOworZXh0ZXJuIGludCBpbml0X2J0dHZfaTJjKHN0cnVjdCBidHR2ICpidHYpOworZXh0ZXJuIGludCBmaW5pX2J0dHZfaTJjKHN0cnVjdCBidHR2ICpidHYpOworCisjZGVmaW5lIHZwcmludGsgIGlmIChidHR2X3ZlcmJvc2UpIHByaW50aworI2RlZmluZSBkcHJpbnRrICBpZiAoYnR0dl9kZWJ1ZyA+PSAxKSBwcmludGsKKyNkZWZpbmUgZDJwcmludGsgaWYgKGJ0dHZfZGVidWcgPj0gMikgcHJpbnRrCisKKy8qIG91ciBkZXZpY2VzICovCisjZGVmaW5lIEJUVFZfTUFYIDE2CitleHRlcm4gdW5zaWduZWQgaW50IGJ0dHZfbnVtOworCisjZGVmaW5lIEJUVFZfTUFYX0ZCVUYgICAweDIwODAwMAorI2RlZmluZSBWQklCVUZfU0laRSAgICAgKDIwNDgqVkJJX01BWExJTkVTKjIpCisjZGVmaW5lIEJUVFZfVElNRU9VVCAgICAoSFovMikgLyogMC41IHNlY29uZHMgKi8KKyNkZWZpbmUgQlRUVl9GUkVFX0lETEUgIChIWikgICAvKiBvbmUgc2Vjb25kICovCisKKworc3RydWN0IGJ0dHZfcGxsX2luZm8geworCXVuc2lnbmVkIGludCBwbGxfaWZyZXE7ICAgIC8qIFBMTCBpbnB1dCBmcmVxdWVuY3kgICAgICAgICovCisJdW5zaWduZWQgaW50IHBsbF9vZnJlcTsgICAgLyogUExMIG91dHB1dCBmcmVxdWVuY3kgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgcGxsX2NyeXN0YWw7ICAvKiBDcnlzdGFsIHVzZWQgZm9yIGlucHV0ICAgICAqLworCXVuc2lnbmVkIGludCBwbGxfY3VycmVudDsgIC8qIEN1cnJlbnRseSBwcm9ncmFtbWVkIG9mcmVxICovCit9OworCisvKiBmb3IgZ3Bpby1jb25uZWN0ZWQgcmVtb3RlIGNvbnRyb2wgKi8KK3N0cnVjdCBidHR2X2lucHV0IHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICAgICAgZGV2OworCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZSBpcjsKKwljaGFyICAgICAgICAgICAgICAgICAgbmFtZVszMl07CisJY2hhciAgICAgICAgICAgICAgICAgIHBoeXNbMzJdOworCXUzMiAgICAgICAgICAgICAgICAgICBtYXNrX2tleWNvZGU7CisJdTMyICAgICAgICAgICAgICAgICAgIG1hc2tfa2V5ZG93bjsKK307CisKK3N0cnVjdCBidHR2X3N1c3BlbmRfc3RhdGUgeworCXUzMiAgZ3Bpb19lbmFibGU7CisJdTMyICBncGlvX2RhdGE7CisJaW50ICBkaXNhYmxlZDsKKwlpbnQgIGxvb3BfaXJxOworCXN0cnVjdCBidHR2X2J1ZmZlcl9zZXQgdmlkZW87CisJc3RydWN0IGJ0dHZfYnVmZmVyICAgICAqdmJpOworfTsKKworc3RydWN0IGJ0dHYgeworCXN0cnVjdCBidHR2X2NvcmUgYzsKKworCS8qIHBjaSBkZXZpY2UgY29uZmlnICovCisJdW5zaWduZWQgc2hvcnQgaWQ7CisJdW5zaWduZWQgY2hhciByZXZpc2lvbjsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmJ0ODQ4X21taW87ICAgLyogcG9pbnRlciB0byBtbWlvICovCisKKwkvKiBjYXJkIGNvbmZpZ3VyYXRpb24gaW5mbyAqLworCXVuc2lnbmVkIGludCBjYXJkaWQ7ICAgLyogcGNpIHN1YnN5c3RlbSBpZCAoYnQ4NzggYmFzZWQgb25lcykgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHR1bmVyX3R5cGU7ICAvKiB0dW5lciBjaGlwIHR5cGUgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHBpbm5hY2xlX2lkOworCXVuc2lnbmVkIGludCBzdmhzOworCXN0cnVjdCBidHR2X3BsbF9pbmZvIHBsbDsKKwlpbnQgdHJpdG9uMTsKKwlpbnQgZ3Bpb2lycTsKKwlpbnQgdXNlX2kyY19odzsKKworCS8qIG9sZCBncGlvIGludGVyZmFjZSAqLworCXdhaXRfcXVldWVfaGVhZF90IGdwaW9xOworCWludCBzaHV0ZG93bjsKKwl2b2lkICgqYXVkaW9faG9vaykoc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKKworCS8qIG5ldyBncGlvIGludGVyZmFjZSAqLworCXNwaW5sb2NrX3QgZ3Bpb19sb2NrOworCisJLyogaTJjIGxheWVyICovCisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICAgaTJjX2FsZ287CisJc3RydWN0IGkyY19jbGllbnQgICAgICAgICAgaTJjX2NsaWVudDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBpMmNfc3RhdGUsIGkyY19yYzsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBpMmNfZG9uZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICAgICBpMmNfcXVldWU7CisKKwkvKiB2aWRlbzRsaW51eCAoMSkgKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb19kZXY7CisJc3RydWN0IHZpZGVvX2RldmljZSAqcmFkaW9fZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZiaV9kZXY7CisKKwkvKiBpbmZyYXJlZCByZW1vdGUgKi8KKwlpbnQgaGFzX3JlbW90ZTsKKwlzdHJ1Y3QgYnR0dl9pbnB1dCAqcmVtb3RlOworCisJLyogbG9ja2luZyAqLworCXNwaW5sb2NrX3Qgc19sb2NrOworICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJaW50IHJlc291cmNlczsKKyAgICAgICAgc3RydWN0IHNlbWFwaG9yZSByZXNsb2NrOworI2lmZGVmIFZJRElPQ19HX1BSSU9SSVRZCisJc3RydWN0IHY0bDJfcHJpb19zdGF0ZSBwcmlvOworI2VuZGlmCisKKwkvKiB2aWRlbyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBpbnB1dDsKKwl1bnNpZ25lZCBpbnQgYXVkaW87CisJdW5zaWduZWQgbG9uZyBmcmVxOworCWludCB0dm5vcm0saHVlLGNvbnRyYXN0LGJyaWdodCxzYXR1cmF0aW9uOworCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyIGZidWY7CisJdW5zaWduZWQgaW50IGZpZWxkX2NvdW50OworCisJLyogdmFyaW91cyBvcHRpb25zICovCisJaW50IG9wdF9jb21iZmlsdGVyOworCWludCBvcHRfbHVtYWZpbHRlcjsKKwlpbnQgb3B0X2F1dG9tdXRlOworCWludCBvcHRfY2hyb21hX2FnYzsKKwlpbnQgb3B0X2FkY19jcnVzaDsKKwlpbnQgb3B0X3Zjcl9oYWNrOworCWludCBvcHRfd2hpdGVjcnVzaF91cHBlcjsKKwlpbnQgb3B0X3doaXRlY3J1c2hfbG93ZXI7CisKKwkvKiByYWRpbyBkYXRhL3N0YXRlICovCisJaW50IGhhc19yYWRpbzsKKwlpbnQgcmFkaW9fdXNlcjsKKworCS8qIG1pcm8vcGlubmFjbGUgKyBBaW1zbGFiIFZIWAorCSAgIHBoaWxpcHMgbWF0Y2hib3ggKHRlYTU3NTcgcmFkaW8gdHVuZXIpIHN1cHBvcnQgKi8KKwlpbnQgaGFzX21hdGNoYm94OworCWludCBtYm94X3dlOworCWludCBtYm94X2RhdGE7CisJaW50IG1ib3hfY2xrOworCWludCBtYm94X21vc3Q7CisJaW50IG1ib3hfbWFzazsKKworCS8qIElTQSBzdHVmZiAoVGVycmF0ZWMgQWN0aXZlIFJhZGlvIFVwZ3JhZGUpICovCisJaW50IG1ib3hfaW9yOworCWludCBtYm94X2lvdzsKKwlpbnQgbWJveF9jc2VsOworCisJLyogcmlzYyBtZW1vcnkgbWFuYWdlbWVudCBkYXRhCisJICAgLSBtdXN0IGFxdWlyZSBzX2xvY2sgYmVmb3JlIGNoYW5naW5nIHRoZXNlCisJICAgLSBvbmx5IHRoZSBpcnEgaGFuZGxlciBpcyBzdXBwb3J0ZWQgdG8gdG91Y2ggdG9wICsgYm90dG9tICsgdmN1cnIgKi8KKwlzdHJ1Y3QgYnRjeF9yaXNjbWVtICAgICBtYWluOworCXN0cnVjdCBidHR2X2J1ZmZlciAgICAgICpzY3JlZW47ICAgIC8qIG92ZXJsYXkgICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBjYXB0dXJlOyAgICAvKiB2aWRlbyBjYXB0dXJlIHF1ZXVlICovCisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgdmNhcHR1cmU7ICAgLyogdmJpIGNhcHR1cmUgcXVldWUgICAqLworCXN0cnVjdCBidHR2X2J1ZmZlcl9zZXQgIGN1cnI7ICAgICAgIC8qIGFjdGl2ZSBidWZmZXJzICAgICAgKi8KKwlzdHJ1Y3QgYnR0dl9idWZmZXIgICAgICAqY3ZiaTsgICAgICAvKiBhY3RpdmUgdmJpIGJ1ZmZlciAgICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgbG9vcF9pcnE7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbmV3X2lucHV0OworCisJdW5zaWduZWQgbG9uZyBjYXBfY3RsOworCXVuc2lnbmVkIGxvbmcgZG1hX29uOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXQ7CisJc3RydWN0IGJ0dHZfc3VzcGVuZF9zdGF0ZSBzdGF0ZTsKKworCS8qIHN0YXRzICovCisJdW5zaWduZWQgaW50IGVycm9yczsKKwl1bnNpZ25lZCBpbnQgZnJhbWVkcm9wOworCXVuc2lnbmVkIGludCBpcnFfdG90YWw7CisJdW5zaWduZWQgaW50IGlycV9tZTsKKworCXVuc2lnbmVkIGludCB1c2VyczsKKwlzdHJ1Y3QgYnR0dl9maCBpbml0OworfTsKK2V4dGVybiBzdHJ1Y3QgYnR0diBidHR2c1tCVFRWX01BWF07CisKKy8qIHByaXZhdGUgaW9jdGxzICovCisjZGVmaW5lIEJUVFZfVkVSU0lPTiAgICAgICAgICAgIF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzYsIGludCkKKyNkZWZpbmUgQlRUVl9WQklTSVpFICAgICAgICAgICAgX0lPUigndicgLCBCQVNFX1ZJRElPQ1BSSVZBVEUrOCwgaW50KQorCisjZW5kaWYKKworI2RlZmluZSBidHdyaXRlKGRhdCxhZHIpICAgIHdyaXRlbCgoZGF0KSwgYnR2LT5idDg0OF9tbWlvKyhhZHIpKQorI2RlZmluZSBidHJlYWQoYWRyKSAgICAgICAgIHJlYWRsKGJ0di0+YnQ4NDhfbW1pbysoYWRyKSkKKworI2RlZmluZSBidGFuZChkYXQsYWRyKSAgICAgIGJ0d3JpdGUoKGRhdCkgJiBidHJlYWQoYWRyKSwgYWRyKQorI2RlZmluZSBidG9yKGRhdCxhZHIpICAgICAgIGJ0d3JpdGUoKGRhdCkgfCBidHJlYWQoYWRyKSwgYWRyKQorI2RlZmluZSBidGFvcihkYXQsbWFzayxhZHIpIGJ0d3JpdGUoKGRhdCkgfCAoKG1hc2spICYgYnRyZWFkKGFkcikpLCBhZHIpCisKKyNlbmRpZiAvKiBfQlRUVlBfSF8gKi8KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2NWQwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jCkBAIC0wLDAgKzEsMTAyNyBAQAorLyoKKyAqICAgIFF1aWNrQ2FtIERyaXZlciBGb3IgVmlkZW80TGludXguCisgKgorICoJVmlkZW80TGludXggY29udmVyc2lvbiB3b3JrIGJ5IEFsYW4gQ294LgorICoJUGFycG9ydCBjb21wYXRpYmlsaXR5IGJ5IFBoaWwgQmx1bmRlbGwuCisgKglCdXN5IGxvb3AgYXZvaWRhbmNlIGJ5IE1hcmsgQ29va2UuCisgKgorICogICAgTW9kdWxlIHBhcmFtZXRlcnM6CisgKgorICoJbWF4cG9sbD08MSAtIDUwMDA+CisgKgorICoJICBXaGVuIHBvbGxpbmcgdGhlIFF1aWNrQ2FtIGZvciBhIHJlc3BvbnNlLCBidXN5LXdhaXQgZm9yIGEKKyAqCSAgbWF4aW11bSBvZiB0aGlzIG1hbnkgbG9vcHMuIFRoZSBkZWZhdWx0IG9mIDI1MCBnaXZlcyBsaXR0bGUKKyAqCSAgaW1wYWN0IG9uIGludGVyYWN0aXZlIHJlc3BvbnNlLgorICoKKyAqCSAgTk9URTogSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvbyBoaWdoLCB0aGUgcHJvY2Vzc29yCisgKgkJd2lsbCBidXN5IHdhaXQgdW50aWwgdGhpcyBsb29wIHRpbWVzIG91dCwgYW5kIHRoZW4KKyAqCQlzbG93bHkgcG9sbCBmb3IgYSBmdXJ0aGVyIDUgc2Vjb25kcyBiZWZvcmUgZmFpbGluZworICoJCXRoZSB0cmFuc2FjdGlvbi4gWW91IGhhdmUgYmVlbiB3YXJuZWQuCisgKgorICoJeWllbGRsaW5lcz08MSAtIDI1MD4KKyAqCisgKgkgIFdoZW4gYWNxdWlyaW5nIGEgZnJhbWUgZnJvbSB0aGUgY2FtZXJhLCB0aGUgZGF0YSBnYXRoZXJpbmcKKyAqCSAgbG9vcCB3aWxsIHlpZWxkIGJhY2sgdG8gdGhlIHNjaGVkdWxlciBhZnRlciBjb21wbGV0aW5nCisgKgkgIHRoaXMgbWFueSBsaW5lcy4gVGhlIGRlZmF1bHQgb2YgNCBwcm92aWRlcyBhIHRyYWRlLW9mZgorICoJICBiZXR3ZWVuIGluY3JlYXNlZCBmcmFtZSBhY3F1aXNpdGlvbiB0aW1lIGFuZCBpbXBhY3Qgb24KKyAqCSAgaW50ZXJhY3RpdmUgcmVzcG9uc2UuCisgKi8KKworLyogcWNhbS1saWIuYyAtLSBMaWJyYXJ5IGZvciBwcm9ncmFtbWluZyB3aXRoIHRoZSBDb25uZWN0aXggUXVpY2tDYW0uCisgKiBTZWUgdGhlIGluY2x1ZGVkIGRvY3VtZW50YXRpb24gZm9yIHVzYWdlIGluc3RydWN0aW9ucyBhbmQgZGV0YWlscworICogb2YgdGhlIHByb3RvY29sIGludm9sdmVkLiAqLworCisKKy8qIFZlcnNpb24gMC41LCBBdWd1c3QgNCwgMTk5NiAqLworLyogVmVyc2lvbiAwLjcsIEF1Z3VzdCAyNywgMTk5NiAqLworLyogVmVyc2lvbiAwLjksIE5vdmVtYmVyIDE3LCAxOTk2ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKEMpIDE5OTYgYnkgU2NvdHQgTGFpcmQKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFNDT1RUIExBSVJEIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImJ3LXFjYW0uaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBtYXhwb2xsPTI1MDsgICAvKiBNYXhpbXVtIGJ1c3ktbG9vcCBjb3VudCBmb3IgcWNhbSBJL08gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgeWllbGRsaW5lcz00OyAgLyogWWllbGQgYWZ0ZXIgdGhpcyBtYW55IGR1cmluZyBjYXB0dXJlICovCitzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CisKK21vZHVsZV9wYXJhbShtYXhwb2xsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHlpZWxkbGluZXMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlYWRfbHBzdGF0dXMoc3RydWN0IHFjYW1fZGV2aWNlICpxKQoreworCXJldHVybiBwYXJwb3J0X3JlYWRfc3RhdHVzKHEtPnBwb3J0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVhZF9scGRhdGEoc3RydWN0IHFjYW1fZGV2aWNlICpxKQoreworCXJldHVybiBwYXJwb3J0X3JlYWRfZGF0YShxLT5wcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9scGRhdGEoc3RydWN0IHFjYW1fZGV2aWNlICpxLCBpbnQgZCkKK3sKKwlwYXJwb3J0X3dyaXRlX2RhdGEocS0+cHBvcnQsIGQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbHBjb250cm9sKHN0cnVjdCBxY2FtX2RldmljZSAqcSwgaW50IGQpCit7CisJcGFycG9ydF93cml0ZV9jb250cm9sKHEtPnBwb3J0LCBkKTsKK30KKworc3RhdGljIGludCBxY193YWl0aGFuZChzdHJ1Y3QgcWNhbV9kZXZpY2UgKnEsIGludCB2YWwpOworc3RhdGljIGludCBxY19jb21tYW5kKHN0cnVjdCBxY2FtX2RldmljZSAqcSwgaW50IGNvbW1hbmQpOworc3RhdGljIGludCBxY19yZWFkcGFyYW0oc3RydWN0IHFjYW1fZGV2aWNlICpxKTsKK3N0YXRpYyBpbnQgcWNfc2V0c2Nhbm1vZGUoc3RydWN0IHFjYW1fZGV2aWNlICpxKTsKK3N0YXRpYyBpbnQgcWNfcmVhZGJ5dGVzKHN0cnVjdCBxY2FtX2RldmljZSAqcSwgY2hhciBidWZmZXJbXSk7CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHFjYW1fdGVtcGxhdGU7CisKK3N0YXRpYyBpbnQgcWNfY2FsaWJyYXRlKHN0cnVjdCBxY2FtX2RldmljZSAqcSkKK3sKKwkvKgorCSAqCUJ1Z2ZpeCBieSBIYW5ubyBNdWVsbGVyIGhtdWVsbGVyQGthYmVsLmRlLCBNYWkgMjEgOTYKKwkgKglUaGUgd2hpdGUgYmFsYW5jZSBpcyBhbiBpbmRpdmlkaXVhbCB2YWx1ZSBmb3IgZWFjaAorCSAqCXF1aWNrY2FtLgorCSAqLworCisJaW50IHZhbHVlOworCWludCBjb3VudCA9IDA7CisKKwlxY19jb21tYW5kKHEsIDI3KTsJLyogQXV0b0FkanVzdE9mZnNldCAqLworCXFjX2NvbW1hbmQocSwgMCk7CS8qIER1bW15IFBhcmFtZXRlciwgaWdub3JlZCBieSB0aGUgY2FtZXJhICovCisKKwkvKiBHZXRPZmZzZXQgKDMzKSB3aWxsIHJlYWQgMjU1IHVudGlsIGF1dG9jYWxpYnJhdGlvbiAqLworCS8qIGlzIGZpbmlzaGVkLiBBZnRlciB0aGF0LCBhIHZhbHVlIG9mIDEtMjU0IHdpbGwgYmUgKi8KKwkvKiByZXR1cm5lZC4gKi8KKworCWRvIHsKKwkJcWNfY29tbWFuZChxLCAzMyk7CisJCXZhbHVlID0gcWNfcmVhZHBhcmFtKHEpOworCQltZGVsYXkoMSk7CisJCXNjaGVkdWxlKCk7CisJCWNvdW50Kys7CisJfSB3aGlsZSAodmFsdWUgPT0gMHhmZiAmJiBjb3VudDwyMDQ4KTsKKworCXEtPndoaXRlYmFsID0gdmFsdWU7CisJcmV0dXJuIHZhbHVlOworfQorCisvKiBJbml0aWFsaXplIHRoZSBRdWlja0NhbSBkcml2ZXIgY29udHJvbCBzdHJ1Y3R1cmUuICBUaGlzIGlzIHdoZXJlCisgKiBkZWZhdWx0cyBhcmUgc2V0IGZvciBwZW9wbGUgd2hvIGRvbid0IGhhdmUgYSBjb25maWcgZmlsZS4qLworCitzdGF0aWMgc3RydWN0IHFjYW1fZGV2aWNlICpxY2FtX2luaXQoc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJc3RydWN0IHFjYW1fZGV2aWNlICpxOworCQorCXEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcWNhbV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZihxPT1OVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXEtPnBwb3J0ID0gcG9ydDsKKwlxLT5wZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgImJ3LXFjYW0iLCBOVUxMLCBOVUxMLAorCQkJCQkgIE5VTEwsIDAsIE5VTEwpOworCWlmIChxLT5wZGV2ID09IE5VTEwpIAorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJidy1xY2FtOiBjb3VsZG4ndCByZWdpc3RlciBmb3IgJXMuXG4iLAorCQkgICAgICAgcG9ydC0+bmFtZSk7CisJCWtmcmVlKHEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJbWVtY3B5KCZxLT52ZGV2LCAmcWNhbV90ZW1wbGF0ZSwgc2l6ZW9mKHFjYW1fdGVtcGxhdGUpKTsKKwkKKwlpbml0X01VVEVYKCZxLT5sb2NrKTsKKworCXEtPnBvcnRfbW9kZSA9IChRQ19BTlkgfCBRQ19OT1RTRVQpOworCXEtPndpZHRoID0gMzIwOworCXEtPmhlaWdodCA9IDI0MDsKKwlxLT5icHAgPSA0OworCXEtPnRyYW5zZmVyX3NjYWxlID0gMjsKKwlxLT5jb250cmFzdCA9IDE5MjsKKwlxLT5icmlnaHRuZXNzID0gMTgwOworCXEtPndoaXRlYmFsID0gMTA1OworCXEtPnRvcCA9IDE7CisJcS0+bGVmdCA9IDE0OworCXEtPm1vZGUgPSAtMTsKKwlxLT5zdGF0dXMgPSBRQ19QQVJBTV9DSEFOR0U7CisJcmV0dXJuIHE7Cit9CisKKworLyogcWNfY29tbWFuZCBpcyBwcm9iYWJseSBhIGJpdCBvZiBhIG1pc25vbWVyIC0tIGl0J3MgdXNlZCB0byBzZW5kCisgKiBieXRlcyAqdG8qIHRoZSBjYW1lcmEuICBHZW5lcmFsbHksIHRoZXNlIGJ5dGVzIGFyZSBlaXRoZXIgY29tbWFuZHMKKyAqIG9yIGFyZ3VtZW50cyB0byBjb21tYW5kcywgc28gdGhlIG5hbWUgZml0cywgYnV0IGl0IHN0aWxsIGJ1Z3MgbWUgYQorICogYml0LiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBhIGxpc3Qgb2YgY29tbWFuZHMuICovCisKK3N0YXRpYyBpbnQgcWNfY29tbWFuZChzdHJ1Y3QgcWNhbV9kZXZpY2UgKnEsIGludCBjb21tYW5kKQoreworCWludCBuMSwgbjI7CisJaW50IGNtZDsKKworCXdyaXRlX2xwZGF0YShxLCBjb21tYW5kKTsKKwl3cml0ZV9scGNvbnRyb2wocSwgNik7CisKKwluMSA9IHFjX3dhaXRoYW5kKHEsIDEpOworCisJd3JpdGVfbHBjb250cm9sKHEsIDB4ZSk7CisJbjIgPSBxY193YWl0aGFuZChxLCAwKTsKKworCWNtZCA9IChuMSAmIDB4ZjApIHwgKChuMiAmIDB4ZjApID4+IDQpOworCXJldHVybiBjbWQ7Cit9CisKK3N0YXRpYyBpbnQgcWNfcmVhZHBhcmFtKHN0cnVjdCBxY2FtX2RldmljZSAqcSkKK3sKKwlpbnQgbjEsIG4yOworCWludCBjbWQ7CisKKwl3cml0ZV9scGNvbnRyb2wocSwgNik7CisJbjEgPSBxY193YWl0aGFuZChxLCAxKTsKKworCXdyaXRlX2xwY29udHJvbChxLCAweGUpOworCW4yID0gcWNfd2FpdGhhbmQocSwgMCk7CisKKwljbWQgPSAobjEgJiAweGYwKSB8ICgobjIgJiAweGYwKSA+PiA0KTsKKwlyZXR1cm4gY21kOworfQorCisvKiBxY193YWl0aGFuZCBidXN5LXdhaXRzIGZvciBhIGhhbmRzaGFrZSBzaWduYWwgZnJvbSB0aGUgUXVpY2tDYW0uCisgKiBBbG1vc3QgYWxsIGNvbW11bmljYXRpb24gd2l0aCB0aGUgY2FtZXJhIHJlcXVpcmVzIGhhbmRzaGFraW5nLiAqLworCitzdGF0aWMgaW50IHFjX3dhaXRoYW5kKHN0cnVjdCBxY2FtX2RldmljZSAqcSwgaW50IHZhbCkKK3sKKwlpbnQgc3RhdHVzOworCWludCBydW5zPTA7CisKKwlpZiAodmFsKQorCXsKKwkJd2hpbGUgKCEoKHN0YXR1cyA9IHJlYWRfbHBzdGF0dXMocSkpICYgOCkpCisJCXsKKwkJCS8qIDEwMDAgaXMgZW5vdWdoIHNwaW5zIG9uIHRoZSBJL08gZm9yIGFsbCBub3JtYWwKKwkJCSAgIGNhc2VzLCBhdCB0aGF0IHBvaW50IHdlIHN0YXJ0IHRvIHBvbGwgc2xvd2x5IAorCQkJICAgdW50aWwgdGhlIGNhbWVyYSB3YWtlcyB1cC4gSG93ZXZlciwgd2UgYXJlCisJCQkgICBidXN5IGJsb2NrZWQgdW50aWwgdGhlIGNhbWVyYSByZXNwb25kcywgc28KKwkJCSAgIHNldHRpbmcgaXQgbG93ZXIgaXMgbXVjaCBiZXR0ZXIgZm9yIGludGVyYWN0aXZlCisJCQkgICByZXNwb25zZS4gKi8KKwkJCSAgIAorCQkJaWYocnVucysrPm1heHBvbGwpCisJCQl7CisJCQkJbXNsZWVwX2ludGVycnVwdGlibGUoNSk7CisJCQl9CisJCQlpZihydW5zPihtYXhwb2xsKzEwMDApKSAvKiA1IHNlY29uZHMgKi8KKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJd2hpbGUgKCgoc3RhdHVzID0gcmVhZF9scHN0YXR1cyhxKSkgJiA4KSkKKwkJeworCQkJLyogMTAwMCBpcyBlbm91Z2ggc3BpbnMgb24gdGhlIEkvTyBmb3IgYWxsIG5vcm1hbAorCQkJICAgY2FzZXMsIGF0IHRoYXQgcG9pbnQgd2Ugc3RhcnQgdG8gcG9sbCBzbG93bHkgCisJCQkgICB1bnRpbCB0aGUgY2FtZXJhIHdha2VzIHVwLiBIb3dldmVyLCB3ZSBhcmUKKwkJCSAgIGJ1c3kgYmxvY2tlZCB1bnRpbCB0aGUgY2FtZXJhIHJlc3BvbmRzLCBzbworCQkJICAgc2V0dGluZyBpdCBsb3dlciBpcyBtdWNoIGJldHRlciBmb3IgaW50ZXJhY3RpdmUKKwkJCSAgIHJlc3BvbnNlLiAqLworCQkJICAgCisJCQlpZihydW5zKys+bWF4cG9sbCkKKwkJCXsKKwkJCQltc2xlZXBfaW50ZXJydXB0aWJsZSg1KTsKKwkJCX0KKwkJCWlmKHJ1bnMrKz4obWF4cG9sbCsxMDAwKSkgLyogNSBzZWNvbmRzICovCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogV2FpdGhhbmQyIGlzIHVzZWQgd2hlbiB0aGUgcWNhbSBpcyBpbiBiaWRpcmVjdGlvbmFsIG1vZGUsIGFuZCB0aGUKKyAqIGhhbmRzaGFraW5nIHNpZ25hbCBpcyBDYW1SZHkyIChiaXQgMCBvZiBkYXRhIHJlZykgaW5zdGVhZCBvZiBDYW1SZHkxCisgKiAoYml0IDMgb2Ygc3RhdHVzIHJlZ2lzdGVyKS4gIEl0IGFsc28gcmV0dXJucyB0aGUgbGFzdCB2YWx1ZSByZWFkLAorICogc2luY2UgdGhpcyBkYXRhIGlzIHVzZWZ1bC4gKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBxY193YWl0aGFuZDIoc3RydWN0IHFjYW1fZGV2aWNlICpxLCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IHJ1bnM9MDsKKwkKKwlkbyAKKwl7CisJCXN0YXR1cyA9IHJlYWRfbHBkYXRhKHEpOworCQkvKiAxMDAwIGlzIGVub3VnaCBzcGlucyBvbiB0aGUgSS9PIGZvciBhbGwgbm9ybWFsCisJCSAgIGNhc2VzLCBhdCB0aGF0IHBvaW50IHdlIHN0YXJ0IHRvIHBvbGwgc2xvd2x5IAorCQkgICB1bnRpbCB0aGUgY2FtZXJhIHdha2VzIHVwLiBIb3dldmVyLCB3ZSBhcmUKKwkJICAgYnVzeSBibG9ja2VkIHVudGlsIHRoZSBjYW1lcmEgcmVzcG9uZHMsIHNvCisJCSAgIHNldHRpbmcgaXQgbG93ZXIgaXMgbXVjaCBiZXR0ZXIgZm9yIGludGVyYWN0aXZlCisJCSAgIHJlc3BvbnNlLiAqLworCQkgICAKKwkJaWYocnVucysrPm1heHBvbGwpCisJCXsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDUpOworCQl9CisJCWlmKHJ1bnMrKz4obWF4cG9sbCsxMDAwKSkgLyogNSBzZWNvbmRzICovCisJCQlyZXR1cm4gMDsKKwl9CisJd2hpbGUgKChzdGF0dXMgJiAxKSAhPSB2YWwpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBUcnkgdG8gZGV0ZWN0IGEgUXVpY2tDYW0uICBJdCBhcHBlYXJzIHRvIGZsYXNoIHRoZSB1cHBlciA0IGJpdHMgb2YKKyAgIHRoZSBzdGF0dXMgcmVnaXN0ZXIgYXQgNS0xMCBIei4gIFRoaXMgaXMgb25seSB1c2VkIGluIHRoZSBhdXRvcHJvYmUKKyAgIGNvZGUuICBCZSBhd2FyZSB0aGF0IHRoaXMgaXNuJ3QgdGhlIHdheSBDb25uZWN0aXggZGV0ZWN0cyB0aGUKKyAgIGNhbWVyYSAodGhleSBzZW5kIGEgcmVzZXQgYW5kIHRyeSB0byBoYW5kc2hha2UpLCBidXQgdGhpcyBzaG91bGQgYmUKKyAgIGFsbW9zdCBjb21wbGV0ZWx5IHNhZmUsIHdoaWxlIHRoZWlyIG1ldGhvZCBzY3Jld3MgdXAgbXkgcHJpbnRlciBpZgorICAgSSBwbHVnIGl0IGluIGJlZm9yZSB0aGUgY2FtZXJhLiAqLworCitzdGF0aWMgaW50IHFjX2RldGVjdChzdHJ1Y3QgcWNhbV9kZXZpY2UgKnEpCit7CisJaW50IHJlZywgbGFzdHJlZzsKKwlpbnQgY291bnQgPSAwOworCWludCBpOworCisJbGFzdHJlZyA9IHJlZyA9IHJlYWRfbHBzdGF0dXMocSkgJiAweGYwOworCisJZm9yIChpID0gMDsgaSA8IDUwMDsgaSsrKSAKKwl7CisJCXJlZyA9IHJlYWRfbHBzdGF0dXMocSkgJiAweGYwOworCQlpZiAocmVnICE9IGxhc3RyZWcpCisJCQljb3VudCsrOworCQlsYXN0cmVnID0gcmVnOworCQltZGVsYXkoMik7CisJfQorCisKKyNpZiAwCisJLyogRm9yY2UgY2FtZXJhIGRldGVjdGlvbiBkdXJpbmcgdGVzdGluZy4gU29tZXRpbWVzIHRoZSBjYW1lcmEKKwkgICB3b24ndCBiZSBmbGFzaGluZyB0aGVzZSBiaXRzLiBQb3NzaWJseSB1bmxvYWRpbmcgdGhlIG1vZHVsZQorCSAgIGluIHRoZSBtaWRkbGUgb2YgYSBncmFiPyBPciBzb21lIHRpbWVvdXQgY29uZGl0aW9uPworCSAgIEkndmUgc2VlbiB0aGlzIHBhcmFtZXRlciBhcyBsb3cgYXMgMTkgb24gbXkgNDUwTWh6IGJveCAtIG1wYyAqLworCXByaW50aygiRGVidWdnaW5nOiBRQ2FtIGRldGVjdGlvbiBjb3VudGVyIDwzMC0yMDAgY291bnRzIGFzIGRldGVjdGVkPjogJWRcbiIsIGNvdW50KTsKKwlyZXR1cm4gMTsKKyNlbmRpZgorCisJLyogQmUgKGV2ZW4gbW9yZSkgbGliZXJhbCBpbiB3aGF0IHlvdSBhY2NlcHQuLi4gICovCisKKy8qCWlmIChjb3VudCA+IDMwICYmIGNvdW50IDwgMjAwKSAqLworCWlmIChjb3VudCA+IDIwICYmIGNvdW50IDwgMzAwKQorCQlyZXR1cm4gMTsJLyogZm91bmQgKi8KKwllbHNlCisJCXJldHVybiAwOwkvKiBub3QgZm91bmQgKi8KK30KKworCisvKiBSZXNldCB0aGUgUXVpY2tDYW0uICBUaGlzIHVzZXMgdGhlIHNhbWUgc2VxdWVuY2UgdGhlIFdpbmRvd3MKKyAqIFF1aWNrUGljIHByb2dyYW0gdXNlcy4gIFNvbWVvbmUgd2l0aCBhIGJpLWRpcmVjdGlvbmFsIHBvcnQgc2hvdWxkCisgKiBjaGVjayB0aGF0IGJpLWRpcmVjdGlvbmFsIG1vZGUgaXMgZGV0ZWN0ZWQgcmlnaHQsIGFuZCB0aGVuCisgKiBpbXBsZW1lbnQgYmktZGlyZWN0aW9uYWwgbW9kZSBpbiBxY19yZWFkYnl0ZSgpLiAqLworCitzdGF0aWMgdm9pZCBxY19yZXNldChzdHJ1Y3QgcWNhbV9kZXZpY2UgKnEpCit7CisJc3dpdGNoIChxLT5wb3J0X21vZGUgJiBRQ19GT1JDRV9NQVNLKSAKKwl7CisJCWNhc2UgUUNfRk9SQ0VfVU5JRElSOgorCQkJcS0+cG9ydF9tb2RlID0gKHEtPnBvcnRfbW9kZSAmIH5RQ19NT0RFX01BU0spIHwgUUNfVU5JRElSOworCQkJYnJlYWs7CisKKwkJY2FzZSBRQ19GT1JDRV9CSURJUjoKKwkJCXEtPnBvcnRfbW9kZSA9IChxLT5wb3J0X21vZGUgJiB+UUNfTU9ERV9NQVNLKSB8IFFDX0JJRElSOworCQkJYnJlYWs7CisKKwkJY2FzZSBRQ19BTlk6CisJCQl3cml0ZV9scGNvbnRyb2wocSwgMHgyMCk7CisJCQl3cml0ZV9scGRhdGEocSwgMHg3NSk7CisJCisJCQlpZiAocmVhZF9scGRhdGEocSkgIT0gMHg3NSkgeworCQkJCXEtPnBvcnRfbW9kZSA9IChxLT5wb3J0X21vZGUgJiB+UUNfTU9ERV9NQVNLKSB8IFFDX0JJRElSOworCQkJfSBlbHNlIHsKKwkJCQlxLT5wb3J0X21vZGUgPSAocS0+cG9ydF9tb2RlICYgflFDX01PREVfTUFTSykgfCBRQ19VTklESVI7CisJCQl9CisJCQlicmVhazsKKwl9CisKKwl3cml0ZV9scGNvbnRyb2wocSwgMHhiKTsKKwl1ZGVsYXkoMjUwKTsKKwl3cml0ZV9scGNvbnRyb2wocSwgMHhlKTsKKwlxY19zZXRzY2FubW9kZShxKTsJCS8qIGluIGNhc2UgcG9ydF9tb2RlIGNoYW5nZWQgKi8KK30KKworCisvKiBEZWNpZGUgd2hpY2ggc2NhbiBtb2RlIHRvIHVzZS4gIFRoZXJlJ3Mgbm8gcmVhbCByZXF1aXJlbWVudCB0aGF0CisgKiB0aGUgc2Nhbm1vZGUgbWF0Y2ggdGhlIHJlc29sdXRpb24gaW4gcS0+aGVpZ2h0IGFuZCBxLT4gd2lkdGggLS0gdGhlCisgKiBjYW1lcmEgdGFrZXMgdGhlIHBpY3R1cmUgYXQgdGhlIHJlc29sdXRpb24gc3BlY2lmaWVkIGluIHRoZQorICogInNjYW5tb2RlIiBhbmQgdGhlbiByZXR1cm5zIHRoZSBpbWFnZSBhdCB0aGUgcmVzb2x1dGlvbiBzcGVjaWZpZWQKKyAqIHdpdGggdGhlIHJlc29sdXRpb24gY29tbWFuZHMuICBJZiB0aGUgc2NhbiBpcyBiaWdnZXIgdGhhbiB0aGUKKyAqIHJlcXVlc3RlZCByZXNvbHV0aW9uLCB0aGUgdXBwZXItbGVmdCBoYW5kIGNvcm5lciBvZiB0aGUgc2NhbiBpcworICogcmV0dXJuZWQuICBJZiB0aGUgc2NhbiBpcyBzbWFsbGVyLCB0aGVuIHRoZSByZXN0IG9mIHRoZSBpbWFnZQorICogcmV0dXJuZWQgY29udGFpbnMgZ2FyYmFnZS4gKi8KKworc3RhdGljIGludCBxY19zZXRzY2FubW9kZShzdHJ1Y3QgcWNhbV9kZXZpY2UgKnEpCit7CisJaW50IG9sZF9tb2RlID0gcS0+bW9kZTsKKwkKKwlzd2l0Y2ggKHEtPnRyYW5zZmVyX3NjYWxlKSAKKwl7CisJCWNhc2UgMToKKwkJCXEtPm1vZGUgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXEtPm1vZGUgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXEtPm1vZGUgPSA4OworCQkJYnJlYWs7CisJfQorCisJc3dpdGNoIChxLT5icHApIAorCXsKKwkJY2FzZSA0OgorCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCXEtPm1vZGUgKz0gMjsKKwkJCWJyZWFrOworCX0KKworCXN3aXRjaCAocS0+cG9ydF9tb2RlICYgUUNfTU9ERV9NQVNLKSAKKwl7CisJCWNhc2UgUUNfQklESVI6CisJCQlxLT5tb2RlICs9IDE7CisJCQlicmVhazsKKwkJY2FzZSBRQ19OT1RTRVQ6CisJCWNhc2UgUUNfVU5JRElSOgorCQkJYnJlYWs7CisJfQorCQorCWlmIChxLT5tb2RlICE9IG9sZF9tb2RlKQorCQlxLT5zdGF0dXMgfD0gUUNfUEFSQU1fQ0hBTkdFOworCQorCXJldHVybiAwOworfQorCisKKy8qIFJlc2V0IHRoZSBRdWlja0NhbSBhbmQgcHJvZ3JhbSBmb3IgYnJpZ2h0bmVzcywgY29udHJhc3QsCisgKiB3aGl0ZS1iYWxhbmNlLCBhbmQgcmVzb2x1dGlvbi4gKi8KKworc3RhdGljIHZvaWQgcWNfc2V0KHN0cnVjdCBxY2FtX2RldmljZSAqcSkKK3sKKwlpbnQgdmFsOworCWludCB2YWwyOworCisJcWNfcmVzZXQocSk7CisKKwkvKiBTZXQgdGhlIGJyaWdodG5lc3MuICBZZXMsIHRoaXMgaXMgcmVwZXRpdGl2ZSwgYnV0IGl0IHdvcmtzLgorCSAqIFNob3J0ZXIgdmVyc2lvbnMgc2VlbSB0byBmYWlsIHN1YnRseS4gIEZlZWwgZnJlZSB0byB0cnkgOi0pLiAqLworCS8qIEkgdGhpbmsgdGhlIHByb2JsZW0gd2FzIGluIHFjX2NvbW1hbmQsIG5vdCBoZXJlIC0tIGJscyAqLworCQorCXFjX2NvbW1hbmQocSwgMHhiKTsKKwlxY19jb21tYW5kKHEsIHEtPmJyaWdodG5lc3MpOworCisJdmFsID0gcS0+aGVpZ2h0IC8gcS0+dHJhbnNmZXJfc2NhbGU7CisJcWNfY29tbWFuZChxLCAweDExKTsKKwlxY19jb21tYW5kKHEsIHZhbCk7CisJaWYgKChxLT5wb3J0X21vZGUgJiBRQ19NT0RFX01BU0spID09IFFDX1VOSURJUiAmJiBxLT5icHAgPT0gNikgeworCQkvKiBUaGUgbm9ybWFsICJ0cmFuc2ZlcnMgcGVyIGxpbmUiIGNhbGN1bGF0aW9uIGRvZXNuJ3Qgc2VlbSB0byB3b3JrCisJCSAgIGFzIGV4cGVjdGVkIGhlcmUgKGFuZCB5ZXQgaXQgd29ya3MgZmluZSBpbiBxY19zY2FuKS4gIE5vIGlkZWEKKwkJICAgd2h5IHRoaXMgY2FzZSBpcyB0aGUgb2RkIG1hbiBvdXQuICBGb3J0dW5hdGVseSwgTGFpcmQncyBvcmlnaW5hbAorCQkgICB3b3JraW5nIHZlcnNpb24gZ2l2ZXMgbWUgYSBnb29kIHdheSB0byBndWVzcyBhdCB3b3JraW5nIHZhbHVlcy4KKwkJICAgLS0gYmxzICovCisJCXZhbCA9IHEtPndpZHRoOworCQl2YWwyID0gcS0+dHJhbnNmZXJfc2NhbGUgKiA0OworCX0gZWxzZSB7CisJCXZhbCA9IHEtPndpZHRoICogcS0+YnBwOworCQl2YWwyID0gKCgocS0+cG9ydF9tb2RlICYgUUNfTU9ERV9NQVNLKSA9PSBRQ19CSURJUikgPyAyNCA6IDgpICoKKwkJICAgIHEtPnRyYW5zZmVyX3NjYWxlOworCX0KKwl2YWwgPSAodmFsICsgdmFsMiAtIDEpIC8gdmFsMjsKKwlxY19jb21tYW5kKHEsIDB4MTMpOworCXFjX2NvbW1hbmQocSwgdmFsKTsKKworCS8qIFNldHRpbmcgdG9wIGFuZCBsZWZ0IC0tIGJscyAqLworCXFjX2NvbW1hbmQocSwgMHhkKTsKKwlxY19jb21tYW5kKHEsIHEtPnRvcCk7CisJcWNfY29tbWFuZChxLCAweGYpOworCXFjX2NvbW1hbmQocSwgcS0+bGVmdCAvIDIpOworCisJcWNfY29tbWFuZChxLCAweDE5KTsKKwlxY19jb21tYW5kKHEsIHEtPmNvbnRyYXN0KTsKKwlxY19jb21tYW5kKHEsIDB4MWYpOworCXFjX2NvbW1hbmQocSwgcS0+d2hpdGViYWwpOworCisJLyogQ2xlYXIgZmxhZyB0aGF0IHdlIG11c3QgdXBkYXRlIHRoZSBncmFiYmluZyBwYXJhbWV0ZXJzIG9uIHRoZSBjYW1lcmEKKwkgICBiZWZvcmUgd2UgZ3JhYiB0aGUgbmV4dCBmcmFtZSAqLworCXEtPnN0YXR1cyAmPSAoflFDX1BBUkFNX0NIQU5HRSk7Cit9CisKKy8qIFFjX3JlYWRieXRlcyByZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIFFDIGFuZCBwdXRzIHRoZW0gaW4KKyAgIHRoZSBzdXBwbGllZCBidWZmZXIuICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwKKyAgIG9yIC0xIG9uIGVycm9yLiAqLworCitzdGF0aWMgaW5saW5lIGludCBxY19yZWFkYnl0ZXMoc3RydWN0IHFjYW1fZGV2aWNlICpxLCBjaGFyIGJ1ZmZlcltdKQoreworCWludCByZXQ9MTsKKwl1bnNpZ25lZCBpbnQgaGksIGxvOworCXVuc2lnbmVkIGludCBoaTIsIGxvMjsKKwlzdGF0aWMgaW50IHN0YXRlID0gMDsKKworCWlmIChidWZmZXIgPT0gTlVMTCkgCisJeworCQlzdGF0ZSA9IDA7CisJCXJldHVybiAwOworCX0KKwkKKwlzd2l0Y2ggKHEtPnBvcnRfbW9kZSAmIFFDX01PREVfTUFTSykgCisJeworCQljYXNlIFFDX0JJRElSOgkJLyogQmktZGlyZWN0aW9uYWwgUG9ydCAqLworCQkJd3JpdGVfbHBjb250cm9sKHEsIDB4MjYpOworCQkJbG8gPSAocWNfd2FpdGhhbmQyKHEsIDEpID4+IDEpOworCQkJaGkgPSAocmVhZF9scHN0YXR1cyhxKSA+PiAzKSAmIDB4MWY7CisJCQl3cml0ZV9scGNvbnRyb2wocSwgMHgyZSk7CisJCQlsbzIgPSAocWNfd2FpdGhhbmQyKHEsIDApID4+IDEpOworCQkJaGkyID0gKHJlYWRfbHBzdGF0dXMocSkgPj4gMykgJiAweDFmOworCQkJc3dpdGNoIChxLT5icHApIAorCQkJeworCQkJCWNhc2UgNDoKKwkJCQkJYnVmZmVyWzBdID0gbG8gJiAweGY7CisJCQkJCWJ1ZmZlclsxXSA9ICgobG8gJiAweDcwKSA+PiA0KSB8ICgoaGkgJiAxKSA8PCAzKTsKKwkJCQkJYnVmZmVyWzJdID0gKGhpICYgMHgxZSkgPj4gMTsKKwkJCQkJYnVmZmVyWzNdID0gbG8yICYgMHhmOworCQkJCQlidWZmZXJbNF0gPSAoKGxvMiAmIDB4NzApID4+IDQpIHwgKChoaTIgJiAxKSA8PCAzKTsKKwkJCQkJYnVmZmVyWzVdID0gKGhpMiAmIDB4MWUpID4+IDE7CisJCQkJCXJldCA9IDY7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNjoKKwkJCQkJYnVmZmVyWzBdID0gbG8gJiAweDNmOworCQkJCQlidWZmZXJbMV0gPSAoKGxvICYgMHg0MCkgPj4gNikgfCAoaGkgPDwgMSk7CisJCQkJCWJ1ZmZlclsyXSA9IGxvMiAmIDB4M2Y7CisJCQkJCWJ1ZmZlclszXSA9ICgobG8yICYgMHg0MCkgPj4gNikgfCAoaGkyIDw8IDEpOworCQkJCQlyZXQgPSA0OworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUUNfVU5JRElSOgkvKiBVbmlkaXJlY3Rpb25hbCBQb3J0ICovCisJCQl3cml0ZV9scGNvbnRyb2wocSwgNik7CisJCQlsbyA9IChxY193YWl0aGFuZChxLCAxKSAmIDB4ZjApID4+IDQ7CisJCQl3cml0ZV9scGNvbnRyb2wocSwgMHhlKTsKKwkJCWhpID0gKHFjX3dhaXRoYW5kKHEsIDApICYgMHhmMCkgPj4gNDsKKworCQkJc3dpdGNoIChxLT5icHApIAorCQkJeworCQkJCWNhc2UgNDoKKwkJCQkJYnVmZmVyWzBdID0gbG87CisJCQkJCWJ1ZmZlclsxXSA9IGhpOworCQkJCQlyZXQgPSAyOworCQkJCQlicmVhazsKKwkJCQljYXNlIDY6CisJCQkJCXN3aXRjaCAoc3RhdGUpIAorCQkJCQl7CisJCQkJCQljYXNlIDA6CisJCQkJCQkJYnVmZmVyWzBdID0gKGxvIDw8IDIpIHwgKChoaSAmIDB4YykgPj4gMik7CisJCQkJCQkJcS0+c2F2ZWRfYml0cyA9IChoaSAmIDMpIDw8IDQ7CisJCQkJCQkJc3RhdGUgPSAxOworCQkJCQkJCXJldCA9IDE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDE6CisJCQkJCQkJYnVmZmVyWzBdID0gbG8gfCBxLT5zYXZlZF9iaXRzOworCQkJCQkJCXEtPnNhdmVkX2JpdHMgPSBoaSA8PCAyOworCQkJCQkJCXN0YXRlID0gMjsKKwkJCQkJCQlyZXQgPSAxOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCWJ1ZmZlclswXSA9ICgobG8gJiAweGMpID4+IDIpIHwgcS0+c2F2ZWRfYml0czsKKwkJCQkJCQlidWZmZXJbMV0gPSAoKGxvICYgMykgPDwgNCkgfCBoaTsKKwkJCQkJCQlzdGF0ZSA9IDA7CisJCQkJCQkJcmV0ID0gMjsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiByZXF1ZXN0cyBhIHNjYW4gZnJvbSB0aGUgY2FtZXJhLiAgSXQgc2VuZHMgdGhlIGNvcnJlY3QgaW5zdHJ1Y3Rpb25zCisgKiB0byB0aGUgY2FtZXJhIGFuZCB0aGVuIHJlYWRzIGJhY2sgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzLiAgSW4KKyAqIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgcm91dGluZSB0aGUgcmV0dXJuIHN0cnVjdHVyZSBjb250YWluZWQKKyAqIHRoZSByYXcgb3V0cHV0IGZyb20gdGhlIGNhbWVyYSwgYW5kIHRoZXJlIHdhcyBhICdxY19jb252ZXJ0c2NhbicKKyAqIGZ1bmN0aW9uIHRoYXQgY29udmVydGVkIHRoYXQgdG8gYSB1c2VmdWwgZm9ybWF0LiAgSW4gdmVyc2lvbiAwLjMgSQorICogcm9sbGVkIHFjX2NvbnZlcnRzY2FuIGludG8gcWNfc2NhbiBhbmQgbm93IEkgb25seSByZXR1cm4gdGhlCisgKiBjb252ZXJ0ZWQgc2Nhbi4gIFRoZSBmb3JtYXQgaXMganVzdCBhbiBvbmUtZGltZW5zaW9uYWwgYXJyYXkgb2YKKyAqIGNoYXJhY3RlcnMsIG9uZSBmb3IgZWFjaCBwaXhlbCwgd2l0aCAwPWJsYWNrIHVwIHRvIG49d2hpdGUsIHdoZXJlCisgKiBuPTJeKGJpdCBkZXB0aCktMS4gIEFzayBtZSBmb3IgbW9yZSBkZXRhaWxzIGlmIHlvdSBkb24ndCB1bmRlcnN0YW5kCisgKiB0aGlzLiAqLworCitzdGF0aWMgbG9uZyBxY19jYXB0dXJlKHN0cnVjdCBxY2FtX2RldmljZSAqIHEsIGNoYXIgX191c2VyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWludCBpLCBqLCBrLCB5aWVsZDsKKwlpbnQgYnl0ZXM7CisJaW50IGxpbmVzdG90cmFucywgdHJhbnNwZXJsaW5lOworCWludCBkaXZpc29yOworCWludCBwaXhlbHNfcGVyX2xpbmU7CisJaW50IHBpeGVsc19yZWFkID0gMDsKKwlpbnQgZ290PTA7CisJY2hhciBidWZmZXJbNl07CisJaW50ICBzaGlmdD04LXEtPmJwcDsKKwljaGFyIGludmVydDsKKworCWlmIChxLT5tb2RlID09IC0xKSAKKwkJcmV0dXJuIC1FTlhJTzsKKworCXFjX2NvbW1hbmQocSwgMHg3KTsKKwlxY19jb21tYW5kKHEsIHEtPm1vZGUpOworCisJaWYgKChxLT5wb3J0X21vZGUgJiBRQ19NT0RFX01BU0spID09IFFDX0JJRElSKSAKKwl7CisJCXdyaXRlX2xwY29udHJvbChxLCAweDJlKTsJLyogdHVybiBwb3J0IGFyb3VuZCAqLworCQl3cml0ZV9scGNvbnRyb2wocSwgMHgyNik7CisJCSh2b2lkKSBxY193YWl0aGFuZChxLCAxKTsKKwkJd3JpdGVfbHBjb250cm9sKHEsIDB4MmUpOworCQkodm9pZCkgcWNfd2FpdGhhbmQocSwgMCk7CisJfQorCQorCS8qIHN0cmFuZ2UgLS0gc2hvdWxkIGJlIDE1OjYzIGJlbG93LCBidXQgNGJwcCBpcyBvZGQgKi8KKwlpbnZlcnQgPSAocS0+YnBwID09IDQpID8gMTYgOiA2MzsKKworCWxpbmVzdG90cmFucyA9IHEtPmhlaWdodCAvIHEtPnRyYW5zZmVyX3NjYWxlOworCXBpeGVsc19wZXJfbGluZSA9IHEtPndpZHRoIC8gcS0+dHJhbnNmZXJfc2NhbGU7CisJdHJhbnNwZXJsaW5lID0gcS0+d2lkdGggKiBxLT5icHA7CisJZGl2aXNvciA9ICgoKHEtPnBvcnRfbW9kZSAmIFFDX01PREVfTUFTSykgPT0gUUNfQklESVIpID8gMjQgOiA4KSAqCisJICAgIHEtPnRyYW5zZmVyX3NjYWxlOworCXRyYW5zcGVybGluZSA9ICh0cmFuc3BlcmxpbmUgKyBkaXZpc29yIC0gMSkgLyBkaXZpc29yOworCisJZm9yIChpID0gMCwgeWllbGQgPSB5aWVsZGxpbmVzOyBpIDwgbGluZXN0b3RyYW5zOyBpKyspIAorCXsKKwkJZm9yIChwaXhlbHNfcmVhZCA9IGogPSAwOyBqIDwgdHJhbnNwZXJsaW5lOyBqKyspIAorCQl7CisJCQlieXRlcyA9IHFjX3JlYWRieXRlcyhxLCBidWZmZXIpOworCQkJZm9yIChrID0gMDsgayA8IGJ5dGVzICYmIChwaXhlbHNfcmVhZCArIGspIDwgcGl4ZWxzX3Blcl9saW5lOyBrKyspIAorCQkJeworCQkJCWludCBvOworCQkJCWlmIChidWZmZXJba10gPT0gMCAmJiBpbnZlcnQgPT0gMTYpIAorCQkJCXsKKwkJCQkJLyogNGJwcCBpcyBvZGQgKGFnYWluKSAtLSBpbnZlcnRlciBpcyAxNiwgbm90IDE1LCBidXQgb3V0cHV0CisJCQkJCSAgIG11c3QgYmUgMC0xNSAtLSBibHMgKi8KKwkJCQkJYnVmZmVyW2tdID0gMTY7CisJCQkJfQorCQkJCW89aSpwaXhlbHNfcGVyX2xpbmUgKyBwaXhlbHNfcmVhZCArIGs7CisJCQkJaWYobzxsZW4pCisJCQkJeworCQkJCQlnb3QrKzsKKwkJCQkJcHV0X3VzZXIoKGludmVydCAtIGJ1ZmZlcltrXSk8PHNoaWZ0LCBidWYrbyk7CisJCQkJfQorCQkJfQorCQkJcGl4ZWxzX3JlYWQgKz0gYnl0ZXM7CisJCX0KKwkJKHZvaWQpIHFjX3JlYWRieXRlcyhxLCBOVUxMKTsJLyogcmVzZXQgc3RhdGUgbWFjaGluZSAqLworCQkKKwkJLyogR3JhYmJpbmcgYW4gZW50aXJlIGZyYW1lIGZyb20gdGhlIHF1aWNrY2FtIGlzIGEgbGVuZ3RoeQorCQkgICBwcm9jZXNzLiBXZSBkb24ndCAodXN1YWxseSkgd2FudCB0byBidXN5LWJsb2NrIHRoZQorCQkgICBwcm9jZXNzb3IgZm9yIHRoZSBlbnRpcmUgZnJhbWUuIHlpZWxkbGluZXMgaXMgYSBtb2R1bGUKKwkJICAgcGFyYW1ldGVyLiBJZiB3ZSB5aWVsZCBldmVyeSBsaW5lLCB0aGUgbWluaW11bSBmcmFtZQorCQkgICB0aW1lIHdpbGwgYmUgMjQwIC8gMjAwID0gMS4yIHNlY29uZHMuIFRoZSBjb21waWxlLXRpbWUKKwkJICAgZGVmYXVsdCBpcyB0byB5aWVsZCBldmVyeSA0IGxpbmVzLiAqLworCQlpZiAoaSA+PSB5aWVsZCkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoNSk7CisJCQl5aWVsZCA9IGkgKyB5aWVsZGxpbmVzOworCQl9CisJfQorCisJaWYgKChxLT5wb3J0X21vZGUgJiBRQ19NT0RFX01BU0spID09IFFDX0JJRElSKSAKKwl7CisJCXdyaXRlX2xwY29udHJvbChxLCAyKTsKKwkJd3JpdGVfbHBjb250cm9sKHEsIDYpOworCQl1ZGVsYXkoMyk7CisJCXdyaXRlX2xwY29udHJvbChxLCAweGUpOworCX0KKwlpZihnb3Q8bGVuKQorCQlyZXR1cm4gZ290OworCXJldHVybiBsZW47Cit9CisKKy8qCisgKglWaWRlbzRsaW51eCBpbnRlcmZhY2luZworICovCisKK3N0YXRpYyBpbnQgcWNhbV9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcWNhbV9kZXZpY2UgKnFjYW09KHN0cnVjdCBxY2FtX2RldmljZSAqKWRldjsKKwkKKwlzd2l0Y2goY21kKQorCXsKKwkJY2FzZSBWSURJT0NHQ0FQOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqYiA9IGFyZzsKKwkJCXN0cmNweShiLT5uYW1lLCAiUXVpY2tjYW0iKTsKKwkJCWItPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFfFZJRF9UWVBFX1NDQUxFU3xWSURfVFlQRV9NT05PQ0hST01FOworCQkJYi0+Y2hhbm5lbHMgPSAxOworCQkJYi0+YXVkaW9zID0gMDsKKwkJCWItPm1heHdpZHRoID0gMzIwOworCQkJYi0+bWF4aGVpZ2h0ID0gMjQwOworCQkJYi0+bWlud2lkdGggPSA4MDsKKwkJCWItPm1pbmhlaWdodCA9IDYwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHQ0hBTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisJCQlpZih2LT5jaGFubmVsIT0wKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJdi0+ZmxhZ3M9MDsKKwkJCXYtPnR1bmVycz0wOworCQkJLyogR29vZCBxdWVzdGlvbi4uIGl0cyBjb21wb3NpdGUgb3IgU1ZIUyBzby4uICovCisJCQl2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCQlzdHJjcHkodi0+bmFtZSwgIkNhbWVyYSIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NTQ0hBTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisJCQlpZih2LT5jaGFubmVsIT0wKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHVFVORVI6CisJCXsKKwkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKKwkJCWlmKHYtPnR1bmVyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc3RyY3B5KHYtPm5hbWUsICJGb3JtYXQiKTsKKwkJCXYtPnJhbmdlbG93PTA7CisJCQl2LT5yYW5nZWhpZ2g9MDsKKwkJCXYtPmZsYWdzPSAwOworCQkJdi0+bW9kZSA9IFZJREVPX01PREVfQVVUTzsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DU1RVTkVSOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7CisJCQlpZih2LT50dW5lcikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmKHYtPm1vZGUhPVZJREVPX01PREVfQVVUTykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DR1BJQ1Q6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCQkJcC0+Y29sb3VyPTB4ODAwMDsKKwkJCXAtPmh1ZT0weDgwMDA7CisJCQlwLT5icmlnaHRuZXNzPXFjYW0tPmJyaWdodG5lc3M8PDg7CisJCQlwLT5jb250cmFzdD1xY2FtLT5jb250cmFzdDw8ODsKKwkJCXAtPndoaXRlbmVzcz1xY2FtLT53aGl0ZWJhbDw8ODsKKwkJCXAtPmRlcHRoPXFjYW0tPmJwcDsKKwkJCXAtPnBhbGV0dGU9VklERU9fUEFMRVRURV9HUkVZOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NTUElDVDoKKwkJeworCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CisJCQlpZihwLT5wYWxldHRlIT1WSURFT19QQUxFVFRFX0dSRVkpCisJCQkgICAgCXJldHVybiAtRUlOVkFMOworCQkJaWYocC0+ZGVwdGghPTQgJiYgcC0+ZGVwdGghPTYpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkKKwkJCS8qCisJCQkgKglOb3cgbG9hZCB0aGUgY2FtZXJhLgorCQkJICovCisKKwkJCXFjYW0tPmJyaWdodG5lc3MgPSBwLT5icmlnaHRuZXNzPj44OworCQkJcWNhbS0+Y29udHJhc3QgPSBwLT5jb250cmFzdD4+ODsKKwkJCXFjYW0tPndoaXRlYmFsID0gcC0+d2hpdGVuZXNzPj44OworCQkJcWNhbS0+YnBwID0gcC0+ZGVwdGg7CisKKwkJCWRvd24oJnFjYW0tPmxvY2spOwkJCQorCQkJcWNfc2V0c2Nhbm1vZGUocWNhbSk7CisJCQl1cCgmcWNhbS0+bG9jayk7CisJCQlxY2FtLT5zdGF0dXMgfD0gUUNfUEFSQU1fQ0hBTkdFOworCisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ1NXSU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCQkJaWYodnctPmZsYWdzKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYodnctPmNsaXBjb3VudCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmKHZ3LT5oZWlnaHQ8NjB8fHZ3LT5oZWlnaHQ+MjQwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYodnctPndpZHRoPDgwfHx2dy0+d2lkdGg+MzIwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQorCQkJcWNhbS0+d2lkdGggPSAzMjA7CisJCQlxY2FtLT5oZWlnaHQgPSAyNDA7CisJCQlxY2FtLT50cmFuc2Zlcl9zY2FsZSA9IDQ7CisJCQkKKwkJCWlmKHZ3LT53aWR0aD49MTYwICYmIHZ3LT5oZWlnaHQ+PTEyMCkKKwkJCXsKKwkJCQlxY2FtLT50cmFuc2Zlcl9zY2FsZSA9IDI7CisJCQl9CisJCQlpZih2dy0+d2lkdGg+PTMyMCAmJiB2dy0+aGVpZ2h0Pj0yNDApCisJCQl7CisJCQkJcWNhbS0+d2lkdGggPSAzMjA7CisJCQkJcWNhbS0+aGVpZ2h0ID0gMjQwOworCQkJCXFjYW0tPnRyYW5zZmVyX3NjYWxlID0gMTsKKwkJCX0KKwkJCWRvd24oJnFjYW0tPmxvY2spOworCQkJcWNfc2V0c2Nhbm1vZGUocWNhbSk7CisJCQl1cCgmcWNhbS0+bG9jayk7CisJCQkKKwkJCS8qIFdlIG11c3QgdXBkYXRlIHRoZSBjYW1lcmEgYmVmb3JlIHdlIGdyYWIuIFdlIGNvdWxkCisJCQkgICBqdXN0IGhhdmUgY2hhbmdlZCB0aGUgZ3JhYiBzaXplICovCisJCQlxY2FtLT5zdGF0dXMgfD0gUUNfUEFSQU1fQ0hBTkdFOworCQkJCisJCQkvKiBPayB3ZSBmaWd1cmVkIG91dCB3aGF0IHRvIHVzZSBmcm9tIG91ciB3aWRlIGNob2ljZSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHV0lOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKKwkJCW1lbXNldCh2dywgMCwgc2l6ZW9mKCp2dykpOworCQkJdnctPndpZHRoPXFjYW0tPndpZHRoL3FjYW0tPnRyYW5zZmVyX3NjYWxlOworCQkJdnctPmhlaWdodD1xY2FtLT5oZWlnaHQvcWNhbS0+dHJhbnNmZXJfc2NhbGU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ0tFWToKKwkJCXJldHVybiAwOworCQljYXNlIFZJRElPQ0NBUFRVUkU6CisJCWNhc2UgVklESU9DR0ZCVUY6CisJCWNhc2UgVklESU9DU0ZCVUY6CisJCWNhc2UgVklESU9DR0ZSRVE6CisJCWNhc2UgVklESU9DU0ZSRVE6CisJCWNhc2UgVklESU9DR0FVRElPOgorCQljYXNlIFZJRElPQ1NBVURJTzoKKwkJCXJldHVybiAtRUlOVkFMOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWNhbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBxY2FtX2RvX2lvY3RsKTsKK30KKworc3RhdGljIHNzaXplX3QgcWNhbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBxY2FtX2RldmljZSAqcWNhbT0oc3RydWN0IHFjYW1fZGV2aWNlICopdjsKKwlpbnQgbGVuOworCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2socWNhbS0+cGRldik7CisJCisJZG93bigmcWNhbS0+bG9jayk7CisJCisJcWNfcmVzZXQocWNhbSk7CisKKwkvKiBVcGRhdGUgdGhlIGNhbWVyYSBwYXJhbWV0ZXJzIGlmIHdlIG5lZWQgdG8gKi8KKwlpZiAocWNhbS0+c3RhdHVzICYgUUNfUEFSQU1fQ0hBTkdFKQorCQlxY19zZXQocWNhbSk7CisKKwlsZW49cWNfY2FwdHVyZShxY2FtLCBidWYsY291bnQpOworCQorCXVwKCZxY2FtLT5sb2NrKTsKKwkKKwlwYXJwb3J0X3JlbGVhc2UocWNhbS0+cGRldik7CisJcmV0dXJuIGxlbjsKK30KKyAKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHFjYW1fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCisJLmlvY3RsICAgICAgICAgID0gcWNhbV9pb2N0bCwKKwkucmVhZAkJPSBxY2FtX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAorfTsKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHFjYW1fdGVtcGxhdGU9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJDb25uZWN0aXggUXVpY2tjYW0iLAorCS50eXBlCQk9IFZJRF9UWVBFX0NBUFRVUkUsCisJLmhhcmR3YXJlCT0gVklEX0hBUkRXQVJFX1FDQU1fQlcsCisJLmZvcHMgICAgICAgICAgID0gJnFjYW1fZm9wcywKK307CisKKyNkZWZpbmUgTUFYX0NBTVMgNAorc3RhdGljIHN0cnVjdCBxY2FtX2RldmljZSAqcWNhbXNbTUFYX0NBTVNdOworc3RhdGljIHVuc2lnbmVkIGludCBudW1fY2FtcyA9IDA7CisKK3N0YXRpYyBpbnQgaW5pdF9id3FjYW0oc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJc3RydWN0IHFjYW1fZGV2aWNlICpxY2FtOworCisJaWYgKG51bV9jYW1zID09IE1BWF9DQU1TKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJUb28gbWFueSBRdWlja2NhbXMgKG1heCAlZClcbiIsIE1BWF9DQU1TKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJcWNhbT1xY2FtX2luaXQocG9ydCk7CisJaWYocWNhbT09TlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCQorCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2socWNhbS0+cGRldik7CisKKwlxY19yZXNldChxY2FtKTsKKwkKKwlpZihxY19kZXRlY3QocWNhbSk9PTApCisJeworCQlwYXJwb3J0X3JlbGVhc2UocWNhbS0+cGRldik7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocWNhbS0+cGRldik7CisJCWtmcmVlKHFjYW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcWNfY2FsaWJyYXRlKHFjYW0pOworCisJcGFycG9ydF9yZWxlYXNlKHFjYW0tPnBkZXYpOworCQorCXByaW50ayhLRVJOX0lORk8gIkNvbm5lY3RpeCBRdWlja2NhbSBvbiAlc1xuIiwgcWNhbS0+cHBvcnQtPm5hbWUpOworCQorCWlmKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmcWNhbS0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpPT0tMSkKKwl7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocWNhbS0+cGRldik7CisJCWtmcmVlKHFjYW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlxY2Ftc1tudW1fY2FtcysrXSA9IHFjYW07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xvc2VfYndxY2FtKHN0cnVjdCBxY2FtX2RldmljZSAqcWNhbSkKK3sKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmcWNhbS0+dmRldik7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShxY2FtLT5wZGV2KTsKKwlrZnJlZShxY2FtKTsKK30KKworLyogVGhlIHBhcnBvcnQgcGFyYW1ldGVyIGNvbnRyb2xzIHdoaWNoIHBhcnBvcnRzIHdpbGwgYmUgc2Nhbm5lZC4KKyAqIFNjYW5uaW5nIGFsbCBwYXJwb3J0cyBjYXVzZXMgc29tZSBwcmludGVycyB0byBwcmludCBhIGdhcmJhZ2UgcGFnZS4KKyAqICAgICAgIC0tIE1hcmNoIDE0LCAxOTk5ICBCaWxseSBEb25haHVlIDxiaWxseUBlc2NhcGUuY29tPiAqLworI2lmZGVmIE1PRFVMRQorc3RhdGljIGNoYXIgKnBhcnBvcnRbTUFYX0NBTVNdID0geyBOVUxMLCB9OworbW9kdWxlX3BhcmFtX2FycmF5KHBhcnBvcnQsIGNoYXJwLCBOVUxMLCAwKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGFjY2VwdF9id3FjYW0oc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisjaWZkZWYgTU9EVUxFCisJaW50IG47CisKKwlpZiAocGFycG9ydFswXSAmJiBzdHJuY21wKHBhcnBvcnRbMF0sICJhdXRvIiwgNCkgIT0gMCkgeworCQkvKiB1c2VyIGdhdmUgcGFycG9ydCBwYXJhbWV0ZXJzICovCisJCWZvcihuPTA7IHBhcnBvcnRbbl0gJiYgbjxNQVhfQ0FNUzsgbisrKXsKKwkJCWNoYXIgKmVwOworCQkJdW5zaWduZWQgbG9uZyByOworCQkJciA9IHNpbXBsZV9zdHJ0b3VsKHBhcnBvcnRbbl0sICZlcCwgMCk7CisJCQlpZiAoZXAgPT0gcGFycG9ydFtuXSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiYnctcWNhbTogYmFkIHBvcnQgc3BlY2lmaWVyIFwiJXNcIlxuIiwKKwkJCQkJcGFycG9ydFtuXSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAociA9PSBwb3J0LT5udW1iZXIpCisJCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGJ3cWNhbV9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJaWYgKGFjY2VwdF9id3FjYW0ocG9ydCkpCisJCWluaXRfYndxY2FtKHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBid3FjYW1fZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBudW1fY2FtczsgaSsrKSB7CisJCXN0cnVjdCBxY2FtX2RldmljZSAqcWNhbSA9IHFjYW1zW2ldOworCQlpZiAocWNhbSAmJiBxY2FtLT5wZGV2LT5wb3J0ID09IHBvcnQpIHsKKwkJCXFjYW1zW2ldID0gTlVMTDsKKwkJCWNsb3NlX2J3cWNhbShxY2FtKTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBid3FjYW1fZHJpdmVyID0geworCS5uYW1lCT0gImJ3LXFjYW0iLAorCS5hdHRhY2gJPSBid3FjYW1fYXR0YWNoLAorCS5kZXRhY2gJPSBid3FjYW1fZGV0YWNoLAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfYndfcWNhbXModm9pZCkKK3sKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZid3FjYW1fZHJpdmVyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9id19xY2Ftcyh2b2lkKQoreworI2lmZGVmIE1PRFVMRQorCS8qIERvIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiB0aGUgbW9kdWxlIHBhcmFtZXRlcnMuICovCisJaWYgKG1heHBvbGwgPiA1MDAwKSB7CisJCXByaW50aygiQ29ubmVjdGl4IFF1aWNrY2FtIG1heC1wb2xsIHdhcyBhYm92ZSA1MDAwLiBVc2luZyA1MDAwLlxuIik7CisJCW1heHBvbGwgPSA1MDAwOworCX0KKwkKKwlpZiAoeWllbGRsaW5lcyA8IDEpIHsKKwkJcHJpbnRrKCJDb25uZWN0aXggUXVpY2tjYW0geWllbGRsaW5lcyB3YXMgbGVzcyB0aGFuIDEuIFVzaW5nIDEuXG4iKTsKKwkJeWllbGRsaW5lcyA9IDE7CisJfQorI2VuZGlmCisJcmV0dXJuIHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZid3FjYW1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9id19xY2Ftcyk7Cittb2R1bGVfZXhpdChleGl0X2J3X3FjYW1zKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjNlOGFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqCVZpZGVvNExpbnV4IGJ3LXFjYW0gZHJpdmVyCisgKgorICoJRGVyaXZlZCBmcm9tIGNvZGUuLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChDKSAxOTk2IGJ5IFNjb3R0IExhaXJkCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBTQ09UVCBMQUlSRCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPbmUgZnJvbSBjb2x1bW4gQS4uLiAqLworI2RlZmluZSBRQ19OT1RTRVQgMAorI2RlZmluZSBRQ19VTklESVIgMQorI2RlZmluZSBRQ19CSURJUiAgMgorI2RlZmluZSBRQ19TRVJJQUwgMworCisvKiAuLi4gYW5kIG9uZSBmcm9tIGNvbHVtbiBCICovCisjZGVmaW5lIFFDX0FOWSAgICAgICAgICAweDAwCisjZGVmaW5lIFFDX0ZPUkNFX1VOSURJUiAweDEwCisjZGVmaW5lIFFDX0ZPUkNFX0JJRElSICAweDIwCisjZGVmaW5lIFFDX0ZPUkNFX1NFUklBTCAweDMwCisvKiBpbiB0aGUgcG9ydF9tb2RlIG1lbWJlciAqLworCisjZGVmaW5lIFFDX01PREVfTUFTSyAgICAweDA3CisjZGVmaW5lIFFDX0ZPUkNFX01BU0sgICAweDcwCisKKyNkZWZpbmUgTUFYX0hFSUdIVCAyNDMKKyNkZWZpbmUgTUFYX1dJRFRIIDMzNgorCisvKiBCaXQgZmllbGRzIGZvciBzdGF0dXMgZmxhZ3MgKi8KKyNkZWZpbmUgUUNfUEFSQU1fQ0hBTkdFCTB4MDEgLyogQ2FtZXJhIHN0YXR1cyBjaGFuZ2UgaGFzIG9jY3VycmVkICovCisKK3N0cnVjdCBxY2FtX2RldmljZSB7CisJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OworCXN0cnVjdCBwYXJkZXZpY2UgKnBkZXY7CisJc3RydWN0IHBhcnBvcnQgKnBwb3J0OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlpbnQgYnBwOworCWludCBtb2RlOworCWludCBjb250cmFzdCwgYnJpZ2h0bmVzcywgd2hpdGViYWw7CisJaW50IHBvcnRfbW9kZTsKKwlpbnQgdHJhbnNmZXJfc2NhbGU7CisJaW50IHRvcCwgbGVmdDsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBzYXZlZF9iaXRzOworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDQyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jCkBAIC0wLDAgKzEsODU1IEBACisvKgorICoJVmlkZW80TGludXggQ29sb3VyIFF1aWNrQ2FtIGRyaXZlcgorICoJQ29weXJpZ2h0IDE5OTctMjAwMCBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKgorICogICAgTW9kdWxlIHBhcmFtZXRlcnM6CisgKgorICoJcGFycG9ydD1hdXRvICAgICAgLS0gcHJvYmUgYWxsIHBhcnBvcnRzIChkZWZhdWx0KQorICoJcGFycG9ydD0wICAgICAgICAgLS0gcGFycG9ydDAgYmVjb21lcyBxY2FtMQorICoJcGFycG9ydD0yLDAsMSAgICAgLS0gcGFycG9ydHMgMiwwLDEgYXJlIHRyaWVkIGluIHRoYXQgb3JkZXIKKyAqCisgKglwcm9iZT0wCQkgIC0tIGRvIG5vIHByb2JpbmcsIGFzc3VtZSBjYW1lcmEgaXMgcHJlc2VudAorICoJcHJvYmU9MQkJICAtLSB1c2UgSUVFRS0xMjg0IGF1dG9wcm9iZSBkYXRhIG9ubHkgKGRlZmF1bHQpCisgKglwcm9iZT0yCQkgIC0tIHByb2JlIGFnZ3Jlc3NpdmVseSBmb3IgY2FtZXJhcworICoKKyAqCWZvcmNlX3JnYj0xICAgICAgIC0tIGZvcmNlIGRhdGEgZm9ybWF0IHRvIFJHQiAoZGVmYXVsdCBpcyBCR1IpCisgKgorICogVGhlIHBhcnBvcnQgcGFyYW1ldGVyIGNvbnRyb2xzIHdoaWNoIHBhcnBvcnRzIHdpbGwgYmUgc2Nhbm5lZC4KKyAqIFNjYW5uaW5nIGFsbCBwYXJwb3J0cyBjYXVzZXMgc29tZSBwcmludGVycyB0byBwcmludCBhIGdhcmJhZ2UgcGFnZS4KKyAqICAgICAgIC0tIE1hcmNoIDE0LCAxOTk5ICBCaWxseSBEb25haHVlIDxiaWxseUBlc2NhcGUuY29tPiAKKyAqCisgKiBGaXhlZCBkYXRhIGZvcm1hdCB0byBCR1IsIGFkZGVkIGZvcmNlX3JnYiBwYXJhbWV0ZXIuIEFkZGVkIG1pc3NpbmcKKyAqIHBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoKSBvbiBtb2R1bGUgcmVtb3ZhbC4KKyAqICAgICAgIC0tIE1heSAyOCwgMjAwMCAgQ2xhdWRpbyBNYXRzdW9rYSA8Y2xhdWRpb0Bjb25lY3RpdmEuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RydWN0IHFjYW1fZGV2aWNlIHsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CisJc3RydWN0IHBhcmRldmljZSAqcGRldjsKKwlzdHJ1Y3QgcGFycG9ydCAqcHBvcnQ7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IGNjZF93aWR0aCwgY2NkX2hlaWdodDsKKwlpbnQgbW9kZTsKKwlpbnQgY29udHJhc3QsIGJyaWdodG5lc3MsIHdoaXRlYmFsOworCWludCB0b3AsIGxlZnQ7CisJdW5zaWduZWQgaW50IGJpZGlyZWN0aW9uYWw7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOworfTsKKworLyogY2FtZXJhcyBtYXhpbXVtICovCisjZGVmaW5lIE1BWF9DQU1TIDQKKworLyogVGhlIHRocmVlIHBvc3NpYmxlIFF1aWNrQ2FtIG1vZGVzICovCisjZGVmaW5lIFFDX01JTExJT05TCTB4MTgKKyNkZWZpbmUgUUNfQklMTElPTlMJMHgxMAorI2RlZmluZSBRQ19USE9VU0FORFMJMHgwOAkvKiB3aXRoIFZJREVDIGNvbXByZXNzaW9uIChub3Qgc3VwcG9ydGVkKSAqLworCisvKiBUaGUgdGhyZWUgcG9zc2libGUgZGVjaW1hdGlvbnMgKi8KKyNkZWZpbmUgUUNfREVDSU1BVElPTl8xCQkwCisjZGVmaW5lIFFDX0RFQ0lNQVRJT05fMgkJMgorI2RlZmluZSBRQ19ERUNJTUFUSU9OXzQJCTQKKworI2RlZmluZSBCQU5ORVIgIkNvbG91ciBRdWlja0NhbSBmb3IgVmlkZW80TGludXggdjAuMDUiCisKK3N0YXRpYyBpbnQgcGFycG9ydFtNQVhfQ0FNU10gPSB7IFsxIC4uLiBNQVhfQ0FNUy0xXSA9IC0xIH07CitzdGF0aWMgaW50IHByb2JlID0gMjsKK3N0YXRpYyBpbnQgZm9yY2VfcmdiID0gMDsKK3N0YXRpYyBpbnQgdmlkZW9fbnIgPSAtMTsKKworc3RhdGljIGlubGluZSB2b2lkIHFjYW1fc2V0X2FjayhzdHJ1Y3QgcWNhbV9kZXZpY2UgKnFjYW0sIHVuc2lnbmVkIGludCBpKQoreworCS8qIG5vdGU6IHRoZSBRQyBzcGVjcyByZWZlciB0byB0aGUgUENBY2sgcGluIGJ5IHZvbHRhZ2UsIG5vdAorCSAgIHNvZnR3YXJlIGxldmVsLiAgUEMgcG9ydHMgaGF2ZSBidWlsdGluIGludmVydGVycy4gKi8KKwlwYXJwb3J0X2Zyb2JfY29udHJvbChxY2FtLT5wcG9ydCwgOCwgaT84OjApOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBxY2FtX3JlYWR5MShzdHJ1Y3QgcWNhbV9kZXZpY2UgKnFjYW0pCit7CisJcmV0dXJuIChwYXJwb3J0X3JlYWRfc3RhdHVzKHFjYW0tPnBwb3J0KSAmIDB4OCk/MTowOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBxY2FtX3JlYWR5MihzdHJ1Y3QgcWNhbV9kZXZpY2UgKnFjYW0pCit7CisJcmV0dXJuIChwYXJwb3J0X3JlYWRfZGF0YShxY2FtLT5wcG9ydCkgJiAweDEpPzE6MDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBxY2FtX2F3YWl0X3JlYWR5MShzdHJ1Y3QgcWNhbV9kZXZpY2UgKnFjYW0sIAorCQkJCQkgICAgIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIG9sZGppZmZpZXMgPSBqaWZmaWVzOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChvbGRqaWZmaWVzID0gamlmZmllczsgKGppZmZpZXMgLSBvbGRqaWZmaWVzKSA8IChIWi8yNSk7ICkKKwkJaWYgKHFjYW1fcmVhZHkxKHFjYW0pID09IHZhbHVlKQorCQkJcmV0dXJuIDA7CisKKwkvKiBJZiB0aGUgY2FtZXJhIGRpZG4ndCByZXNwb25kIHdpdGhpbiAxLzI1IHNlY29uZCwgcG9sbCBzbG93bHkgCisJICAgZm9yIGEgd2hpbGUuICovCisJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspCisJeworCQlpZiAocWNhbV9yZWFkeTEocWNhbSkgPT0gdmFsdWUpCisJCQlyZXR1cm4gMDsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwKTsKKwl9CisKKwkvKiBQcm9iYWJseSBzb21lYm9keSBwdWxsZWQgdGhlIHBsdWcgb3V0LiAgTm90IG11Y2ggd2UgY2FuIGRvLiAqLworCXByaW50ayhLRVJOX0VSUiAiYy1xY2FtOiByZWFkeTEgdGltZW91dCAoJWQpICV4ICV4XG4iLCB2YWx1ZSwKKwkgICAgICAgcGFycG9ydF9yZWFkX3N0YXR1cyhxY2FtLT5wcG9ydCksCisJICAgICAgIHBhcnBvcnRfcmVhZF9jb250cm9sKHFjYW0tPnBwb3J0KSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcWNhbV9hd2FpdF9yZWFkeTIoc3RydWN0IHFjYW1fZGV2aWNlICpxY2FtLCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBvbGRqaWZmaWVzID0gamlmZmllczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAob2xkamlmZmllcyA9IGppZmZpZXM7IChqaWZmaWVzIC0gb2xkamlmZmllcykgPCAoSFovMjUpOyApCisJCWlmIChxY2FtX3JlYWR5MihxY2FtKSA9PSB2YWx1ZSkKKwkJCXJldHVybiAwOworCisJLyogSWYgdGhlIGNhbWVyYSBkaWRuJ3QgcmVzcG9uZCB3aXRoaW4gMS8yNSBzZWNvbmQsIHBvbGwgc2xvd2x5IAorCSAgIGZvciBhIHdoaWxlLiAqLworCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKQorCXsKKwkJaWYgKHFjYW1fcmVhZHkyKHFjYW0pID09IHZhbHVlKQorCQkJcmV0dXJuIDA7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CisJfQorCisJLyogUHJvYmFibHkgc29tZWJvZHkgcHVsbGVkIHRoZSBwbHVnIG91dC4gIE5vdCBtdWNoIHdlIGNhbiBkby4gKi8KKwlwcmludGsoS0VSTl9FUlIgImMtcWNhbTogcmVhZHkyIHRpbWVvdXQgKCVkKSAleCAleCAleFxuIiwgdmFsdWUsCisJICAgICAgIHBhcnBvcnRfcmVhZF9zdGF0dXMocWNhbS0+cHBvcnQpLAorCSAgICAgICBwYXJwb3J0X3JlYWRfY29udHJvbChxY2FtLT5wcG9ydCksCisJICAgICAgIHBhcnBvcnRfcmVhZF9kYXRhKHFjYW0tPnBwb3J0KSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcWNhbV9yZWFkX2RhdGEoc3RydWN0IHFjYW1fZGV2aWNlICpxY2FtKQoreworCXVuc2lnbmVkIGludCBpZGF0YTsKKwlxY2FtX3NldF9hY2socWNhbSwgMCk7CisJaWYgKHFjYW1fYXdhaXRfcmVhZHkxKHFjYW0sIDEpKSByZXR1cm4gLTE7CisJaWRhdGEgPSBwYXJwb3J0X3JlYWRfc3RhdHVzKHFjYW0tPnBwb3J0KSAmIDB4ZjA7CisJcWNhbV9zZXRfYWNrKHFjYW0sIDEpOworCWlmIChxY2FtX2F3YWl0X3JlYWR5MShxY2FtLCAwKSkgcmV0dXJuIC0xOworCWlkYXRhIHw9IChwYXJwb3J0X3JlYWRfc3RhdHVzKHFjYW0tPnBwb3J0KSA+PiA0KTsKKwlyZXR1cm4gaWRhdGE7Cit9CisKK3N0YXRpYyBpbnQgcWNhbV93cml0ZV9kYXRhKHN0cnVjdCBxY2FtX2RldmljZSAqcWNhbSwgdW5zaWduZWQgaW50IGRhdGEpCit7CisJdW5zaWduZWQgaW50IGlkYXRhOworCXBhcnBvcnRfd3JpdGVfZGF0YShxY2FtLT5wcG9ydCwgZGF0YSk7CisJaWRhdGEgPSBxY2FtX3JlYWRfZGF0YShxY2FtKTsKKwlpZiAoZGF0YSAhPSBpZGF0YSkgCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjcWNhbTogc2VudCAleCBidXQgcmVjZWl2ZWQgJXhcbiIsIGRhdGEsIAorCQkgICAgICAgaWRhdGEpOworCQlyZXR1cm4gMTsKKwl9IAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBxY2FtX3NldChzdHJ1Y3QgcWNhbV9kZXZpY2UgKnFjYW0sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGludCBkYXRhKQoreworCWlmIChxY2FtX3dyaXRlX2RhdGEocWNhbSwgY21kKSkKKwkJcmV0dXJuIC0xOworCWlmIChxY2FtX3dyaXRlX2RhdGEocWNhbSwgZGF0YSkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcWNhbV9nZXQoc3RydWN0IHFjYW1fZGV2aWNlICpxY2FtLCB1bnNpZ25lZCBpbnQgY21kKQoreworCWlmIChxY2FtX3dyaXRlX2RhdGEocWNhbSwgY21kKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBxY2FtX3JlYWRfZGF0YShxY2FtKTsKK30KKworc3RhdGljIGludCBxY19kZXRlY3Qoc3RydWN0IHFjYW1fZGV2aWNlICpxY2FtKQoreworCXVuc2lnbmVkIGludCBzdGF0LCBvc3RhdCwgaSwgY291bnQgPSAwOworCisJLyogVGhlIHByb2JlIHJvdXRpbmUgYmVsb3cgaXMgbm90IHZlcnkgcmVsaWFibGUuICBUaGUgSUVFRS0xMjg0CisJICAgcHJvYmUgdGFrZXMgcHJlY2VkZW5jZS4gKi8KKwkvKiBYWFggQ3VycmVudGx5IHBhcnBvcnQgcHJvdmlkZXMgbm8gd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KKwkgICAidGhlIElFRUUgcHJvYmUgd2FzIG5vdCBkb25lIiBhbmQgInRoZSBwcm9iZSB3YXMgZG9uZSwgYnV0CisJICAgbm8gZGV2aWNlIHdhcyBmb3VuZCIuICBGaXggdGhpcyBvbmUgZGF5LiAqLworCWlmIChxY2FtLT5wcG9ydC0+cHJvYmVfaW5mb1swXS5jbGFzcyA9PSBQQVJQT1JUX0NMQVNTX01FRElBCisJICAgICYmIHFjYW0tPnBwb3J0LT5wcm9iZV9pbmZvWzBdLm1vZGVsCisJICAgICYmICFzdHJjbXAocWNhbS0+cGRldi0+cG9ydC0+cHJvYmVfaW5mb1swXS5tb2RlbCwgCisJCSAgICAgICAiQ29sb3IgUXVpY2tDYW0gMi4wIikpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlF1aWNrQ2FtOiBGb3VuZCBieSBJRUVFMTI4NCBwcm9iZS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJCisJaWYgKHByb2JlIDwgMikKKwkJcmV0dXJuIDA7CisKKwlwYXJwb3J0X3dyaXRlX2NvbnRyb2wocWNhbS0+cHBvcnQsIDB4Yyk7CisKKwkvKiBsb29rIGZvciBhIGhlYXJ0YmVhdCAqLworCW9zdGF0ID0gc3RhdCA9IHBhcnBvcnRfcmVhZF9zdGF0dXMocWNhbS0+cHBvcnQpOworCWZvciAoaT0wOyBpPDI1MDsgaSsrKSAKKwl7CisJCW1kZWxheSgxKTsKKwkJc3RhdCA9IHBhcnBvcnRfcmVhZF9zdGF0dXMocWNhbS0+cHBvcnQpOworCQlpZiAob3N0YXQgIT0gc3RhdCkgCisJCXsKKwkJCWlmICgrK2NvdW50ID49IDMpIHJldHVybiAxOworCQkJb3N0YXQgPSBzdGF0OworCQl9CisJfQorCisJLyogUmVzZXQgdGhlIGNhbWVyYSBhbmQgdHJ5IGFnYWluICovCisJcGFycG9ydF93cml0ZV9jb250cm9sKHFjYW0tPnBwb3J0LCAweGMpOworCXBhcnBvcnRfd3JpdGVfY29udHJvbChxY2FtLT5wcG9ydCwgMHg4KTsKKwltZGVsYXkoMSk7CisJcGFycG9ydF93cml0ZV9jb250cm9sKHFjYW0tPnBwb3J0LCAweGMpOworCW1kZWxheSgxKTsKKwljb3VudCA9IDA7CisKKwlvc3RhdCA9IHN0YXQgPSBwYXJwb3J0X3JlYWRfc3RhdHVzKHFjYW0tPnBwb3J0KTsKKwlmb3IgKGk9MDsgaTwyNTA7IGkrKykgCisJeworCQltZGVsYXkoMSk7CisJCXN0YXQgPSBwYXJwb3J0X3JlYWRfc3RhdHVzKHFjYW0tPnBwb3J0KTsKKwkJaWYgKG9zdGF0ICE9IHN0YXQpIAorCQl7CisJCQlpZiAoKytjb3VudCA+PSAzKSByZXR1cm4gMTsKKwkJCW9zdGF0ID0gc3RhdDsKKwkJfQorCX0KKworCS8qIG5vIChvciBmbGF0bGluZSkgY2FtZXJhLCBnaXZlIHVwICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFjX3Jlc2V0KHN0cnVjdCBxY2FtX2RldmljZSAqcWNhbSkKK3sKKwlwYXJwb3J0X3dyaXRlX2NvbnRyb2wocWNhbS0+cHBvcnQsIDB4Yyk7CisJcGFycG9ydF93cml0ZV9jb250cm9sKHFjYW0tPnBwb3J0LCAweDgpOworCW1kZWxheSgxKTsKKwlwYXJwb3J0X3dyaXRlX2NvbnRyb2wocWNhbS0+cHBvcnQsIDB4Yyk7CisJbWRlbGF5KDEpOyAgICAgICAgICAKK30KKworLyogUmVzZXQgdGhlIFF1aWNrQ2FtIGFuZCBwcm9ncmFtIGZvciBicmlnaHRuZXNzLCBjb250cmFzdCwKKyAqIHdoaXRlLWJhbGFuY2UsIGFuZCByZXNvbHV0aW9uLiAqLworCitzdGF0aWMgdm9pZCBxY19zZXR1cChzdHJ1Y3QgcWNhbV9kZXZpY2UgKnEpCit7CisJcWNfcmVzZXQocSk7CisKKwkvKiBTZXQgdGhlIGJyaWdodG5lc3MuICAqLworICAgICAgIAlxY2FtX3NldChxLCAxMSwgcS0+YnJpZ2h0bmVzcyk7CisKKwkvKiBTZXQgdGhlIGhlaWdodCBhbmQgd2lkdGguICBUaGVzZSByZWZlciB0byB0aGUgYWN0dWFsCisJICAgQ0NEIGFyZWEgKmJlZm9yZSogYXBwbHlpbmcgdGhlIHNlbGVjdGVkIGRlY2ltYXRpb24uICAqLworCXFjYW1fc2V0KHEsIDE3LCBxLT5jY2RfaGVpZ2h0KTsKKwlxY2FtX3NldChxLCAxOSwgcS0+Y2NkX3dpZHRoIC8gMik7CisKKwkvKiBTZXQgdG9wIGFuZCBsZWZ0LiAgKi8KKwlxY2FtX3NldChxLCAweGQsIHEtPnRvcCk7CisJcWNhbV9zZXQocSwgMHhmLCBxLT5sZWZ0KTsKKworCS8qIFNldCBjb250cmFzdCBhbmQgd2hpdGUgYmFsYW5jZS4gICovCisJcWNhbV9zZXQocSwgMHgxOSwgcS0+Y29udHJhc3QpOworCXFjYW1fc2V0KHEsIDB4MWYsIHEtPndoaXRlYmFsKTsKKwkKKwkvKiBTZXQgdGhlIHNwZWVkLiAgKi8KKwlxY2FtX3NldChxLCA0NSwgMik7Cit9CisKKy8qIFJlYWQgc29tZSBieXRlcyBmcm9tIHRoZSBjYW1lcmEgYW5kIHB1dCB0aGVtIGluIHRoZSBidWZmZXIuIAorICAgbmJ5dGVzIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDMsIGJlY2F1c2UgYmlkaXJlY3Rpb25hbCBtb2RlIGdpdmVzCisgICB1cyB0aHJlZSBieXRlcyBhdCBhIHRpbWUuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHFjYW1fcmVhZF9ieXRlcyhzdHJ1Y3QgcWNhbV9kZXZpY2UgKnEsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZXMgPSAwOworCisJcWNhbV9zZXRfYWNrKHEsIDApOworCWlmIChxLT5iaWRpcmVjdGlvbmFsKQorCXsKKwkJLyogSXQncyBhIGJpZGlyZWN0aW9uYWwgcG9ydCAqLworCQl3aGlsZSAoYnl0ZXMgPCBuYnl0ZXMpCisJCXsKKwkJCXVuc2lnbmVkIGludCBsbzEsIGhpMSwgbG8yLCBoaTI7CisJCQl1bnNpZ25lZCBjaGFyIHIsIGcsIGI7CisKKwkJCWlmIChxY2FtX2F3YWl0X3JlYWR5MihxLCAxKSkgcmV0dXJuIGJ5dGVzOworCQkJbG8xID0gcGFycG9ydF9yZWFkX2RhdGEocS0+cHBvcnQpID4+IDE7CisJCQloaTEgPSAoKHBhcnBvcnRfcmVhZF9zdGF0dXMocS0+cHBvcnQpID4+IDMpICYgMHgxZikgXiAweDEwOworCQkJcWNhbV9zZXRfYWNrKHEsIDEpOworCQkJaWYgKHFjYW1fYXdhaXRfcmVhZHkyKHEsIDApKSByZXR1cm4gYnl0ZXM7CisJCQlsbzIgPSBwYXJwb3J0X3JlYWRfZGF0YShxLT5wcG9ydCkgPj4gMTsKKwkJCWhpMiA9ICgocGFycG9ydF9yZWFkX3N0YXR1cyhxLT5wcG9ydCkgPj4gMykgJiAweDFmKSBeIDB4MTA7CisJCQlxY2FtX3NldF9hY2socSwgMCk7CisJCQlyID0gKGxvMSB8ICgoaGkxICYgMSk8PDcpKTsKKwkJCWcgPSAoKGhpMSAmIDB4MWUpPDwzKSB8ICgoaGkyICYgMHgxZSk+PjEpOworCQkJYiA9IChsbzIgfCAoKGhpMiAmIDEpPDw3KSk7CisJCQlpZiAoZm9yY2VfcmdiKSB7CisJCQkJYnVmW2J5dGVzKytdID0gcjsKKwkJCQlidWZbYnl0ZXMrK10gPSBnOworCQkJCWJ1ZltieXRlcysrXSA9IGI7CisJCQl9IGVsc2UgeworCQkJCWJ1ZltieXRlcysrXSA9IGI7CisJCQkJYnVmW2J5dGVzKytdID0gZzsKKwkJCQlidWZbYnl0ZXMrK10gPSByOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCS8qIEl0J3MgYSB1bmlkaXJlY3Rpb25hbCBwb3J0ICovCisJCWludCBpID0gMCwgbiA9IGJ5dGVzOworCQl1bnNpZ25lZCBjaGFyIHJnYlszXTsKKworCQl3aGlsZSAoYnl0ZXMgPCBuYnl0ZXMpCisJCXsKKwkJCXVuc2lnbmVkIGludCBoaSwgbG87CisKKwkJCWlmIChxY2FtX2F3YWl0X3JlYWR5MShxLCAxKSkgcmV0dXJuIGJ5dGVzOworCQkJaGkgPSAocGFycG9ydF9yZWFkX3N0YXR1cyhxLT5wcG9ydCkgJiAweGYwKTsKKwkJCXFjYW1fc2V0X2FjayhxLCAxKTsKKwkJCWlmIChxY2FtX2F3YWl0X3JlYWR5MShxLCAwKSkgcmV0dXJuIGJ5dGVzOworCQkJbG8gPSAocGFycG9ydF9yZWFkX3N0YXR1cyhxLT5wcG9ydCkgJiAweGYwKTsKKwkJCXFjYW1fc2V0X2FjayhxLCAwKTsKKwkJCS8qIGZsaXAgc29tZSBiaXRzICovCisJCQlyZ2JbKGkgPSBieXRlcysrICUgMyldID0gKGhpIHwgKGxvID4+IDQpKSBeIDB4ODg7CisJCQlpZiAoaSA+PSAyKSB7CitnZXRfZnJhZ21lbnQ6CisJCQkJaWYgKGZvcmNlX3JnYikgeworCQkJCQlidWZbbisrXSA9IHJnYlswXTsKKwkJCQkJYnVmW24rK10gPSByZ2JbMV07CisJCQkJCWJ1ZltuKytdID0gcmdiWzJdOworCQkJCX0gZWxzZSB7CisJCQkJCWJ1ZltuKytdID0gcmdiWzJdOworCQkJCQlidWZbbisrXSA9IHJnYlsxXTsKKwkJCQkJYnVmW24rK10gPSByZ2JbMF07CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChpKSB7CisJCQlpID0gMDsKKwkJCWdvdG8gZ2V0X2ZyYWdtZW50OworCQl9CisJfQorCXJldHVybiBieXRlczsKK30KKworI2RlZmluZSBCVUZTWgkxNTAKKworc3RhdGljIGxvbmcgcWNfY2FwdHVyZShzdHJ1Y3QgcWNhbV9kZXZpY2UgKnEsIGNoYXIgX191c2VyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXVuc2lnbmVkIGxpbmVzLCBwaXhlbHNwZXJsaW5lLCBiaXRzcGVyeGZlcjsKKwl1bnNpZ25lZCBpbnQgaXNfYmlfZGlyID0gcS0+YmlkaXJlY3Rpb25hbDsKKwlzaXplX3Qgd2FudGxlbiwgb3V0cHRyID0gMDsKKwljaGFyIHRtcGJ1ZltCVUZTWl07CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBXYWl0IGZvciBjYW1lcmEgdG8gYmVjb21lIHJlYWR5ICovCisJZm9yICg7OykKKwl7CisJCWludCBpID0gcWNhbV9nZXQocSwgNDEpOworCQlpZiAoaSA9PSAtMSkgeworCQkJcWNfc2V0dXAocSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoKGkgJiAweDgwKSA9PSAwKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCXNjaGVkdWxlKCk7CisJfQorCisJaWYgKHFjYW1fc2V0KHEsIDcsIChxLT5tb2RlIHwgKGlzX2JpX2Rpcj8xOjApKSArIDEpKQorCQlyZXR1cm4gLUVJTzsKKwkKKwlsaW5lcyA9IHEtPmhlaWdodDsKKwlwaXhlbHNwZXJsaW5lID0gcS0+d2lkdGg7CisJYml0c3BlcnhmZXIgPSAoaXNfYmlfZGlyKSA/IDI0IDogODsKKworCWlmIChpc19iaV9kaXIpCisJeworCQkvKiBUdXJuIHRoZSBwb3J0IGFyb3VuZCAqLworCQlwYXJwb3J0X2RhdGFfcmV2ZXJzZShxLT5wcG9ydCk7CisJCW1kZWxheSgzKTsKKwkJcWNhbV9zZXRfYWNrKHEsIDApOworCQlpZiAocWNhbV9hd2FpdF9yZWFkeTEocSwgMSkpIHsKKwkJCXFjX3NldHVwKHEpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcWNhbV9zZXRfYWNrKHEsIDEpOworCQlpZiAocWNhbV9hd2FpdF9yZWFkeTEocSwgMCkpIHsKKwkJCXFjX3NldHVwKHEpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwl3YW50bGVuID0gbGluZXMgKiBwaXhlbHNwZXJsaW5lICogMjQgLyA4OworCisJd2hpbGUgKHdhbnRsZW4pCisJeworCQlzaXplX3QgdCwgczsKKwkJcyA9ICh3YW50bGVuID4gQlVGU1opP0JVRlNaOndhbnRsZW47CisJCXQgPSBxY2FtX3JlYWRfYnl0ZXMocSwgdG1wYnVmLCBzKTsKKwkJaWYgKG91dHB0ciA8IGxlbikKKwkJeworCQkJc2l6ZV90IHN6ID0gbGVuIC0gb3V0cHRyOworCQkJaWYgKHN6ID4gdCkgc3ogPSB0OworCQkJaWYgKF9fY29weV90b191c2VyKGJ1ZitvdXRwdHIsIHRtcGJ1Ziwgc3opKQorCQkJCWJyZWFrOworCQkJb3V0cHRyICs9IHN6OworCQl9CisJCXdhbnRsZW4gLT0gdDsKKwkJaWYgKHQgPCBzKQorCQkJYnJlYWs7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCWxlbiA9IG91dHB0cjsKKworCWlmICh3YW50bGVuKQorCXsKKwkJcHJpbnRrKCJxY2FtOiBzaG9ydCByZWFkLlxuIik7CisJCWlmIChpc19iaV9kaXIpCisJCQlwYXJwb3J0X2RhdGFfZm9yd2FyZChxLT5wcG9ydCk7CisJCXFjX3NldHVwKHEpOworCQlyZXR1cm4gbGVuOworCX0KKworCWlmIChpc19iaV9kaXIpCisJeworCQlpbnQgbDsKKwkJZG8geworCQkJbCA9IHFjYW1fcmVhZF9ieXRlcyhxLCB0bXBidWYsIDMpOworCQkJY29uZF9yZXNjaGVkKCk7CisJCX0gd2hpbGUgKGwgJiYgKHRtcGJ1ZlswXSA9PSAweDdlIHx8IHRtcGJ1ZlsxXSA9PSAweDdlIHx8IHRtcGJ1ZlsyXSA9PSAweDdlKSk7CisJCWlmIChmb3JjZV9yZ2IpIHsKKwkJCWlmICh0bXBidWZbMF0gIT0gMHhlIHx8IHRtcGJ1ZlsxXSAhPSAweDAgfHwgdG1wYnVmWzJdICE9IDB4ZikKKwkJCQlwcmludGsoInFjYW06IGJhZCBFT0ZcbiIpOworCQl9IGVsc2UgeworCQkJaWYgKHRtcGJ1ZlswXSAhPSAweGYgfHwgdG1wYnVmWzFdICE9IDB4MCB8fCB0bXBidWZbMl0gIT0gMHhlKQorCQkJCXByaW50aygicWNhbTogYmFkIEVPRlxuIik7CisJCX0KKwkJcWNhbV9zZXRfYWNrKHEsIDApOworCQlpZiAocWNhbV9hd2FpdF9yZWFkeTEocSwgMSkpCisJCXsKKwkJCXByaW50aygicWNhbTogbm8gYWNrIGFmdGVyIEVPRlxuIik7CisJCQlwYXJwb3J0X2RhdGFfZm9yd2FyZChxLT5wcG9ydCk7CisJCQlxY19zZXR1cChxKTsKKwkJCXJldHVybiBsZW47CisJCX0KKwkJcGFycG9ydF9kYXRhX2ZvcndhcmQocS0+cHBvcnQpOworCQltZGVsYXkoMyk7CisJCXFjYW1fc2V0X2FjayhxLCAxKTsKKwkJaWYgKHFjYW1fYXdhaXRfcmVhZHkxKHEsIDApKQorCQl7CisJCQlwcmludGsoInFjYW06IG5vIGFjayB0byBwb3J0IHR1cm5hcm91bmRcbiIpOworCQkJcWNfc2V0dXAocSk7CisJCQlyZXR1cm4gbGVuOworCQl9CisJfQorCWVsc2UKKwl7CisJCWludCBsOworCQlkbyB7CisJCQlsID0gcWNhbV9yZWFkX2J5dGVzKHEsIHRtcGJ1ZiwgMSk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfSB3aGlsZSAobCAmJiB0bXBidWZbMF0gPT0gMHg3ZSk7CisJCWwgPSBxY2FtX3JlYWRfYnl0ZXMocSwgdG1wYnVmKzEsIDIpOworCQlpZiAoZm9yY2VfcmdiKSB7CisJCQlpZiAodG1wYnVmWzBdICE9IDB4ZSB8fCB0bXBidWZbMV0gIT0gMHgwIHx8IHRtcGJ1ZlsyXSAhPSAweGYpCisJCQkJcHJpbnRrKCJxY2FtOiBiYWQgRU9GXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh0bXBidWZbMF0gIT0gMHhmIHx8IHRtcGJ1ZlsxXSAhPSAweDAgfHwgdG1wYnVmWzJdICE9IDB4ZSkKKwkJCQlwcmludGsoInFjYW06IGJhZCBFT0ZcbiIpOworCQl9CisJfQorCisJcWNhbV93cml0ZV9kYXRhKHEsIDApOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKglWaWRlbzRsaW51eCBpbnRlcmZhY2luZworICovCisKK3N0YXRpYyBpbnQgcWNhbV9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcWNhbV9kZXZpY2UgKnFjYW09KHN0cnVjdCBxY2FtX2RldmljZSAqKWRldjsKKwkKKwlzd2l0Y2goY21kKQorCXsKKwkJY2FzZSBWSURJT0NHQ0FQOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqYiA9IGFyZzsKKwkJCXN0cmNweShiLT5uYW1lLCAiUXVpY2tjYW0iKTsKKwkJCWItPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFfFZJRF9UWVBFX1NDQUxFUzsKKwkJCWItPmNoYW5uZWxzID0gMTsKKwkJCWItPmF1ZGlvcyA9IDA7CisJCQliLT5tYXh3aWR0aCA9IDMyMDsKKwkJCWItPm1heGhlaWdodCA9IDI0MDsKKwkJCWItPm1pbndpZHRoID0gODA7CisJCQliLT5taW5oZWlnaHQgPSA2MDsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DR0NIQU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCQkJaWYodi0+Y2hhbm5lbCE9MCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXYtPmZsYWdzPTA7CisJCQl2LT50dW5lcnM9MDsKKwkJCS8qIEdvb2QgcXVlc3Rpb24uLiBpdHMgY29tcG9zaXRlIG9yIFNWSFMgc28uLiAqLworCQkJdi0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOworCQkJc3RyY3B5KHYtPm5hbWUsICJDYW1lcmEiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DU0NIQU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCQkJaWYodi0+Y2hhbm5lbCE9MCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DR1RVTkVSOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7CisJCQlpZih2LT50dW5lcikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7CisJCQlzdHJjcHkodi0+bmFtZSwgIkZvcm1hdCIpOworCQkJdi0+bW9kZSA9IFZJREVPX01PREVfQVVUTzsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DU1RVTkVSOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7CisJCQlpZih2LT50dW5lcikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmKHYtPm1vZGUhPVZJREVPX01PREVfQVVUTykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DR1BJQ1Q6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCQkJcC0+Y29sb3VyPTB4ODAwMDsKKwkJCXAtPmh1ZT0weDgwMDA7CisJCQlwLT5icmlnaHRuZXNzPXFjYW0tPmJyaWdodG5lc3M8PDg7CisJCQlwLT5jb250cmFzdD1xY2FtLT5jb250cmFzdDw8ODsKKwkJCXAtPndoaXRlbmVzcz1xY2FtLT53aGl0ZWJhbDw8ODsKKwkJCXAtPmRlcHRoPTI0OworCQkJcC0+cGFsZXR0ZT1WSURFT19QQUxFVFRFX1JHQjI0OworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NTUElDVDoKKwkJeworCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CisKKwkJCS8qCisJCQkgKglTYW5pdHkgY2hlY2sgYXJncworCQkJICovCisJCQlpZiAocC0+ZGVwdGggIT0gMjQgfHwgcC0+cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JHQjI0KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJCisJCQkvKgorCQkJICoJTm93IGxvYWQgdGhlIGNhbWVyYS4KKwkJCSAqLworCQkJcWNhbS0+YnJpZ2h0bmVzcyA9IHAtPmJyaWdodG5lc3M+Pjg7CisJCQlxY2FtLT5jb250cmFzdCA9IHAtPmNvbnRyYXN0Pj44OworCQkJcWNhbS0+d2hpdGViYWwgPSBwLT53aGl0ZW5lc3M+Pjg7CisKKwkJCWRvd24oJnFjYW0tPmxvY2spOwkJCQorCQkJcGFycG9ydF9jbGFpbV9vcl9ibG9jayhxY2FtLT5wZGV2KTsKKwkJCXFjX3NldHVwKHFjYW0pOyAKKwkJCXBhcnBvcnRfcmVsZWFzZShxY2FtLT5wZGV2KTsKKwkJCXVwKCZxY2FtLT5sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DU1dJTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7CisKKwkJCWlmKHZ3LT5mbGFncykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmKHZ3LT5jbGlwY291bnQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZih2dy0+aGVpZ2h0PDYwfHx2dy0+aGVpZ2h0PjI0MCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmKHZ3LT53aWR0aDw4MHx8dnctPndpZHRoPjMyMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkKKwkJCXFjYW0tPndpZHRoID0gODA7CisJCQlxY2FtLT5oZWlnaHQgPSA2MDsKKwkJCXFjYW0tPm1vZGUgPSBRQ19ERUNJTUFUSU9OXzQ7CisJCQkKKwkJCWlmKHZ3LT53aWR0aD49MTYwICYmIHZ3LT5oZWlnaHQ+PTEyMCkKKwkJCXsKKwkJCQlxY2FtLT53aWR0aCA9IDE2MDsKKwkJCQlxY2FtLT5oZWlnaHQgPSAxMjA7CisJCQkJcWNhbS0+bW9kZSA9IFFDX0RFQ0lNQVRJT05fMjsKKwkJCX0KKwkJCWlmKHZ3LT53aWR0aD49MzIwICYmIHZ3LT5oZWlnaHQ+PTI0MCkKKwkJCXsKKwkJCQlxY2FtLT53aWR0aCA9IDMyMDsKKwkJCQlxY2FtLT5oZWlnaHQgPSAyNDA7CisJCQkJcWNhbS0+bW9kZSA9IFFDX0RFQ0lNQVRJT05fMTsKKwkJCX0KKwkJCXFjYW0tPm1vZGUgfD0gUUNfTUlMTElPTlM7CisjaWYgMAorCQkJaWYodnctPndpZHRoPj02NDAgJiYgdnctPmhlaWdodD49NDgwKQorCQkJeworCQkJCXFjYW0tPndpZHRoID0gNjQwOworCQkJCXFjYW0tPmhlaWdodCA9IDQ4MDsKKwkJCQlxY2FtLT5tb2RlID0gUUNfQklMTElPTlMgfCBRQ19ERUNJTUFUSU9OXzE7CisJCQl9CisjZW5kaWYKKwkJCS8qIE9rIHdlIGZpZ3VyZWQgb3V0IHdoYXQgdG8gdXNlIGZyb20gb3VyIAorCQkJICAgd2lkZSBjaG9pY2UgKi8KKwkJCWRvd24oJnFjYW0tPmxvY2spOworCQkJcGFycG9ydF9jbGFpbV9vcl9ibG9jayhxY2FtLT5wZGV2KTsKKwkJCXFjX3NldHVwKHFjYW0pOworCQkJcGFycG9ydF9yZWxlYXNlKHFjYW0tPnBkZXYpOworCQkJdXAoJnFjYW0tPmxvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHV0lOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKKwkJCW1lbXNldCh2dywgMCwgc2l6ZW9mKCp2dykpOworCQkJdnctPndpZHRoPXFjYW0tPndpZHRoOworCQkJdnctPmhlaWdodD1xY2FtLT5oZWlnaHQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ0tFWToKKwkJCXJldHVybiAwOworCQljYXNlIFZJRElPQ0NBUFRVUkU6CisJCWNhc2UgVklESU9DR0ZCVUY6CisJCWNhc2UgVklESU9DU0ZCVUY6CisJCWNhc2UgVklESU9DR0ZSRVE6CisJCWNhc2UgVklESU9DU0ZSRVE6CisJCWNhc2UgVklESU9DR0FVRElPOgorCQljYXNlIFZJRElPQ1NBVURJTzoKKwkJCXJldHVybiAtRUlOVkFMOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWNhbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBxY2FtX2RvX2lvY3RsKTsKK30KKworc3RhdGljIHNzaXplX3QgcWNhbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBxY2FtX2RldmljZSAqcWNhbT0oc3RydWN0IHFjYW1fZGV2aWNlICopdjsKKwlpbnQgbGVuOworCisJZG93bigmcWNhbS0+bG9jayk7CisJcGFycG9ydF9jbGFpbV9vcl9ibG9jayhxY2FtLT5wZGV2KTsKKwkvKiBQcm9iYWJseSBzaG91bGQgaGF2ZSBhIHNlbWFwaG9yZSBhZ2FpbnN0IG11bHRpcGxlIHVzZXJzICovCisJbGVuID0gcWNfY2FwdHVyZShxY2FtLCBidWYsY291bnQpOyAKKwlwYXJwb3J0X3JlbGVhc2UocWNhbS0+cGRldik7CisJdXAoJnFjYW0tPmxvY2spOworCXJldHVybiBsZW47Cit9CisKKy8qIHZpZGVvIGRldmljZSB0ZW1wbGF0ZSAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcWNhbV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKKwkuaW9jdGwgICAgICAgICAgPSBxY2FtX2lvY3RsLAorCS5yZWFkCQk9IHFjYW1fcmVhZCwKKwkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCit9OworCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBxY2FtX3RlbXBsYXRlPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiQ29sb3VyIFF1aWNrQ2FtIiwKKwkudHlwZQkJPSBWSURfVFlQRV9DQVBUVVJFLAorCS5oYXJkd2FyZQk9IFZJRF9IQVJEV0FSRV9RQ0FNX0MsCisJLmZvcHMgICAgICAgICAgID0gJnFjYW1fZm9wcywKK307CisKKy8qIEluaXRpYWxpemUgdGhlIFF1aWNrQ2FtIGRyaXZlciBjb250cm9sIHN0cnVjdHVyZS4gKi8KKworc3RhdGljIHN0cnVjdCBxY2FtX2RldmljZSAqcWNhbV9pbml0KHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCXN0cnVjdCBxY2FtX2RldmljZSAqcTsKKwkKKwlxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHFjYW1fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYocT09TlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlxLT5wcG9ydCA9IHBvcnQ7CisJcS0+cGRldiA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHBvcnQsICJjLXFjYW0iLCBOVUxMLCBOVUxMLAorCQkJCQkgIE5VTEwsIDAsIE5VTEwpOworCisJcS0+YmlkaXJlY3Rpb25hbCA9IChxLT5wcG9ydC0+bW9kZXMgJiBQQVJQT1JUX01PREVfVFJJU1RBVEUpPzE6MDsKKworCWlmIChxLT5wZGV2ID09IE5VTEwpIAorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJjLXFjYW06IGNvdWxkbid0IHJlZ2lzdGVyIGZvciAlcy5cbiIsCisJCSAgICAgICBwb3J0LT5uYW1lKTsKKwkJa2ZyZWUocSk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwltZW1jcHkoJnEtPnZkZXYsICZxY2FtX3RlbXBsYXRlLCBzaXplb2YocWNhbV90ZW1wbGF0ZSkpOworCisJaW5pdF9NVVRFWCgmcS0+bG9jayk7CisJcS0+d2lkdGggPSBxLT5jY2Rfd2lkdGggPSAzMjA7CisJcS0+aGVpZ2h0ID0gcS0+Y2NkX2hlaWdodCA9IDI0MDsKKwlxLT5tb2RlID0gUUNfTUlMTElPTlMgfCBRQ19ERUNJTUFUSU9OXzE7CisJcS0+Y29udHJhc3QgPSAxOTI7CisJcS0+YnJpZ2h0bmVzcyA9IDI0MDsKKwlxLT53aGl0ZWJhbCA9IDEyODsKKwlxLT50b3AgPSAxOworCXEtPmxlZnQgPSAxNDsKKwlyZXR1cm4gcTsKK30KKworc3RhdGljIHN0cnVjdCBxY2FtX2RldmljZSAqcWNhbXNbTUFYX0NBTVNdOworc3RhdGljIHVuc2lnbmVkIGludCBudW1fY2FtcyA9IDA7CisKK3N0YXRpYyBpbnQgaW5pdF9jcWNhbShzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgcWNhbV9kZXZpY2UgKnFjYW07CisKKwlpZiAocGFycG9ydFswXSAhPSAtMSkKKwl7CisJCS8qIFRoZSB1c2VyIGdhdmUgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zICovCisJCWludCBpLCBmb3VuZCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0FNUyAmJiBwYXJwb3J0W2ldICE9IC0xOyBpKyspCisJCXsKKwkJCWlmIChwYXJwb3J0WzBdID09IHBvcnQtPm51bWJlcikKKwkJCQlmb3VuZCA9IDE7CisJCX0KKwkJaWYgKCFmb3VuZCkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChudW1fY2FtcyA9PSBNQVhfQ0FNUykKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlxY2FtID0gcWNhbV9pbml0KHBvcnQpOworCWlmIChxY2FtPT1OVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkJCisJcGFycG9ydF9jbGFpbV9vcl9ibG9jayhxY2FtLT5wZGV2KTsKKworCXFjX3Jlc2V0KHFjYW0pOworCQorCWlmIChwcm9iZSAmJiBxY19kZXRlY3QocWNhbSk9PTApCisJeworCQlwYXJwb3J0X3JlbGVhc2UocWNhbS0+cGRldik7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocWNhbS0+cGRldik7CisJCWtmcmVlKHFjYW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlxY19zZXR1cChxY2FtKTsKKworCXBhcnBvcnRfcmVsZWFzZShxY2FtLT5wZGV2KTsKKwkKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZxY2FtLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucik9PS0xKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgQ29sb3VyIFF1aWNrQ2FtIG9uICVzXG4iLAorCQkgICAgICAgcWNhbS0+cHBvcnQtPm5hbWUpOworCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHFjYW0tPnBkZXYpOworCQlrZnJlZShxY2FtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAidmlkZW8lZDogQ29sb3VyIFF1aWNrQ2FtIGZvdW5kIG9uICVzXG4iLCAKKwkgICAgICAgcWNhbS0+dmRldi5taW5vciwgcWNhbS0+cHBvcnQtPm5hbWUpOworCQorCXFjYW1zW251bV9jYW1zKytdID0gcWNhbTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9jcWNhbShzdHJ1Y3QgcWNhbV9kZXZpY2UgKnFjYW0pCit7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnFjYW0tPnZkZXYpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocWNhbS0+cGRldik7CisJa2ZyZWUocWNhbSk7Cit9CisKK3N0YXRpYyB2b2lkIGNxX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlpbml0X2NxY2FtKHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBjcV9kZXRhY2goc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJLyogV3JpdGUgdGhpcyBzb21lIGRheS4gKi8KK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBjcWNhbV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiY3FjYW0iLAorCS5hdHRhY2ggPSBjcV9hdHRhY2gsCisJLmRldGFjaCA9IGNxX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNxY2FtX2luaXQgKHZvaWQpCit7CisJcHJpbnRrKEJBTk5FUiAiXG4iKTsKKworCXJldHVybiBwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmY3FjYW1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNxY2FtX2NsZWFudXAgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NhbXM7IGkrKykKKwkJY2xvc2VfY3FjYW0ocWNhbXNbaV0pOworCisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmY3FjYW1fZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKEJBTk5FUik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIEZJWE1FOiBwYXJwb3J0PWF1dG8gd291bGQgbmV2ZXIgaGF2ZSB3b3JrZWQsIHN1cmVseT8gLS1SUiAqLworTU9EVUxFX1BBUk1fREVTQyhwYXJwb3J0ICwicGFycG9ydD08YXV0b3xuWyxuXS4uLj4gZm9yIHBvcnQgZGV0ZWN0aW9uIG1ldGhvZFxuXAorcHJvYmU9PDB8MXwyPiBmb3IgY2FtZXJhIGRldGVjdGlvbiBtZXRob2RcblwKK2ZvcmNlX3JnYj08MHwxPiBmb3IgUkdCIGRhdGEgZm9ybWF0IChkZWZhdWx0IEJHUikiKTsKK21vZHVsZV9wYXJhbV9hcnJheShwYXJwb3J0LCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKHByb2JlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGZvcmNlX3JnYiwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CisKK21vZHVsZV9pbml0KGNxY2FtX2luaXQpOworbW9kdWxlX2V4aXQoY3FjYW1fY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDhiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEuYwpAQCAtMCwwICsxLDQwNzMgQEAKKy8qCisgKiBjcGlhIENQaUEgZHJpdmVyCisgKgorICogU3VwcG9ydHMgQ1BpQSBiYXNlZCBWaWRlbyBDYW1lcmEncy4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDE5OTktMjAwMCBQZXRlciBQcmVnbGVyCisgKiAoQykgQ29weXJpZ2h0IDE5OTktMjAwMCBTY290dCBKLiBCZXJ0aW4KKyAqIChDKSBDb3B5cmlnaHQgMTk5OS0yMDAwIEpvaGFubmVzIEVyZGZlbHQgPGpvaGFubmVzQGVyZGZlbHQuY29tPgorICogKEMpIENvcHlyaWdodCAyMDAwIFNUTWljcm9lbGVjdHJvbmljcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIGRlZmluZSBfQ1BJQV9ERUJVR18gZm9yIHZlcmJvc2UgZGVidWcgb3V0cHV0IChzZWUgY3BpYS5oKSAqLworLyogI2RlZmluZSBfQ1BJQV9ERUJVR18gIDEgKi8gIAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaWZkZWYgQ09ORklHX0tNT0QKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImNwaWEuaCIKKworI2lmZGVmIENPTkZJR19WSURFT19DUElBX1BQCitleHRlcm4gaW50IGNwaWFfcHBfaW5pdCh2b2lkKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19WSURFT19DUElBX1VTQgorZXh0ZXJuIGludCBjcGlhX3VzYl9pbml0KHZvaWQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgdmlkZW9fbnIgPSAtMTsKKworI2lmZGVmIE1PRFVMRQorbW9kdWxlX3BhcmFtKHZpZGVvX25yLCBpbnQsIDApOworTU9EVUxFX0FVVEhPUigiU2NvdHQgSi4gQmVydGluIDxzYmVydGluQHNlY3VyZW55bS5uZXQ+ICYgUGV0ZXIgUHJlZ2xlciA8UGV0ZXJfUHJlZ2xlckBlbWFpbC5jb20+ICYgSm9oYW5uZXMgRXJkZmVsdCA8am9oYW5uZXNAZXJkZmVsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlY0TC1kcml2ZXIgZm9yIFZpc2lvbiBDUGlBIGJhc2VkIGNhbWVyYXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ2aWRlbyIpOworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb2xvcnNwYWNlX2NvbnYgPSAwOworbW9kdWxlX3BhcmFtKGNvbG9yc3BhY2VfY29udiwgdXNob3J0LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY29sb3JzcGFjZV9jb252LAorICAgICAgICAgICAgICAgICAiXG48bj4gQ29sb3JzcGFjZSBjb252ZXJzaW9uOiIKKyAgICAgICAgICAgICAgICAgIlxuMCA9IGRpc2FibGUiCisgICAgICAgICAgICAgICAgICJcbjEgPSBlbmFibGUiCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgMCIKKyAgICAgICAgICAgICAgICAgIlxuIik7CisKKyNkZWZpbmUgQUJPVVQgIlY0TC1Ecml2ZXIgZm9yIFZpc2lvbiBDUGlBIGJhc2VkIGNhbWVyYXMiCisKKyNpZm5kZWYgVklEX0hBUkRXQVJFX0NQSUEKKyNkZWZpbmUgVklEX0hBUkRXQVJFX0NQSUEgMjQgICAgLyogRklYTUUgLT4gZnJvbSBsaW51eC92aWRlb2Rldi5oICovCisjZW5kaWYKKworI2RlZmluZSBDUElBX01PRFVMRV9DUElBCQkJKDA8PDUpCisjZGVmaW5lIENQSUFfTU9EVUxFX1NZU1RFTQkJCSgxPDw1KQorI2RlZmluZSBDUElBX01PRFVMRV9WUF9DVFJMCQkJKDU8PDUpCisjZGVmaW5lIENQSUFfTU9EVUxFX0NBUFRVUkUJCQkoNjw8NSkKKyNkZWZpbmUgQ1BJQV9NT0RVTEVfREVCVUcJCQkoNzw8NSkKKworI2RlZmluZSBJTlBVVCAoREFUQV9JTiA8PCA4KQorI2RlZmluZSBPVVRQVVQgKERBVEFfT1VUIDw8IDgpCisKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX0dldENQSUFWZXJzaW9uCShJTlBVVCB8IENQSUFfTU9EVUxFX0NQSUEgfCAxKQorI2RlZmluZSBDUElBX0NPTU1BTkRfR2V0UG5QSUQJCShJTlBVVCB8IENQSUFfTU9EVUxFX0NQSUEgfCAyKQorI2RlZmluZSBDUElBX0NPTU1BTkRfR2V0Q2FtZXJhU3RhdHVzCShJTlBVVCB8IENQSUFfTU9EVUxFX0NQSUEgfCAzKQorI2RlZmluZSBDUElBX0NPTU1BTkRfR290b0hpUG93ZXIJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NQSUEgfCA0KQorI2RlZmluZSBDUElBX0NPTU1BTkRfR290b0xvUG93ZXIJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NQSUEgfCA1KQorI2RlZmluZSBDUElBX0NPTU1BTkRfR290b1N1c3BlbmQJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NQSUEgfCA3KQorI2RlZmluZSBDUElBX0NPTU1BTkRfR290b1Bhc3NUaHJvdWdoCShPVVRQVVQgfCBDUElBX01PRFVMRV9DUElBIHwgOCkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX01vZGlmeUNhbWVyYVN0YXR1cwkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfQ1BJQSB8IDEwKQorCisjZGVmaW5lIENQSUFfQ09NTUFORF9SZWFkVkNSZWdzCQkoSU5QVVQgfCBDUElBX01PRFVMRV9TWVNURU0gfCAxKQorI2RlZmluZSBDUElBX0NPTU1BTkRfV3JpdGVWQ1JlZwkJKE9VVFBVVCB8IENQSUFfTU9EVUxFX1NZU1RFTSB8IDIpCisjZGVmaW5lIENQSUFfQ09NTUFORF9SZWFkTUNQb3J0cwkoSU5QVVQgfCBDUElBX01PRFVMRV9TWVNURU0gfCAzKQorI2RlZmluZSBDUElBX0NPTU1BTkRfV3JpdGVNQ1BvcnQJKE9VVFBVVCB8IENQSUFfTU9EVUxFX1NZU1RFTSB8IDQpCisjZGVmaW5lIENQSUFfQ09NTUFORF9TZXRCYXVkUmF0ZQkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfU1lTVEVNIHwgNSkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1NldEVDUFRpbWluZwkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfU1lTVEVNIHwgNikKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1JlYWRJREFUQQkJKElOUFVUIHwgQ1BJQV9NT0RVTEVfU1lTVEVNIHwgNykKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1dyaXRlSURBVEEJCShPVVRQVVQgfCBDUElBX01PRFVMRV9TWVNURU0gfCA4KQorI2RlZmluZSBDUElBX0NPTU1BTkRfR2VuZXJpY0NhbGwJKE9VVFBVVCB8IENQSUFfTU9EVUxFX1NZU1RFTSB8IDkpCisjZGVmaW5lIENQSUFfQ09NTUFORF9JMkNTdGFydAkJKE9VVFBVVCB8IENQSUFfTU9EVUxFX1NZU1RFTSB8IDEwKQorI2RlZmluZSBDUElBX0NPTU1BTkRfSTJDU3RvcAkJKE9VVFBVVCB8IENQSUFfTU9EVUxFX1NZU1RFTSB8IDExKQorI2RlZmluZSBDUElBX0NPTU1BTkRfSTJDV3JpdGUJCShPVVRQVVQgfCBDUElBX01PRFVMRV9TWVNURU0gfCAxMikKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX0kyQ1JlYWQJCShJTlBVVCB8IENQSUFfTU9EVUxFX1NZU1RFTSB8IDEzKQorCisjZGVmaW5lIENQSUFfQ09NTUFORF9HZXRWUFZlcnNpb24JKElOUFVUIHwgQ1BJQV9NT0RVTEVfVlBfQ1RSTCB8IDEpCisjZGVmaW5lIENQSUFfQ09NTUFORF9SZXNldEZyYW1lQ291bnRlcgkoSU5QVVQgfCBDUElBX01PRFVMRV9WUF9DVFJMIHwgMikKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1NldENvbG91clBhcmFtcwkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfVlBfQ1RSTCB8IDMpCisjZGVmaW5lIENQSUFfQ09NTUFORF9TZXRFeHBvc3VyZQkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfVlBfQ1RSTCB8IDQpCisjZGVmaW5lIENQSUFfQ09NTUFORF9TZXRDb2xvdXJCYWxhbmNlCShPVVRQVVQgfCBDUElBX01PRFVMRV9WUF9DVFJMIHwgNikKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1NldFNlbnNvckZQUwkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfVlBfQ1RSTCB8IDcpCisjZGVmaW5lIENQSUFfQ09NTUFORF9TZXRWUERlZmF1bHRzCShPVVRQVVQgfCBDUElBX01PRFVMRV9WUF9DVFJMIHwgOCkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1NldEFwY29yCQkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfVlBfQ1RSTCB8IDkpCisjZGVmaW5lIENQSUFfQ09NTUFORF9TZXRGbGlja2VyQ3RybAkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfVlBfQ1RSTCB8IDEwKQorI2RlZmluZSBDUElBX0NPTU1BTkRfU2V0VkxPZmZzZXQJKE9VVFBVVCB8IENQSUFfTU9EVUxFX1ZQX0NUUkwgfCAxMSkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX0dldENvbG91clBhcmFtcwkoSU5QVVQgfCBDUElBX01PRFVMRV9WUF9DVFJMIHwgMTYpCisjZGVmaW5lIENQSUFfQ09NTUFORF9HZXRDb2xvdXJCYWxhbmNlCShJTlBVVCB8IENQSUFfTU9EVUxFX1ZQX0NUUkwgfCAxNykKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX0dldEV4cG9zdXJlCShJTlBVVCB8IENQSUFfTU9EVUxFX1ZQX0NUUkwgfCAxOCkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1NldFNlbnNvck1hdHJpeAkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfVlBfQ1RSTCB8IDE5KQorI2RlZmluZSBDUElBX0NPTU1BTkRfQ29sb3VyQmFycwkJKE9VVFBVVCB8IENQSUFfTU9EVUxFX1ZQX0NUUkwgfCAyNSkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1JlYWRWUFJlZ3MJCShJTlBVVCB8IENQSUFfTU9EVUxFX1ZQX0NUUkwgfCAzMCkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1dyaXRlVlBSZWcJCShPVVRQVVQgfCBDUElBX01PRFVMRV9WUF9DVFJMIHwgMzEpCisKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX0dyYWJGcmFtZQkJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NBUFRVUkUgfCAxKQorI2RlZmluZSBDUElBX0NPTU1BTkRfVXBsb2FkRnJhbWUJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NBUFRVUkUgfCAyKQorI2RlZmluZSBDUElBX0NPTU1BTkRfU2V0R3JhYk1vZGUJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NBUFRVUkUgfCAzKQorI2RlZmluZSBDUElBX0NPTU1BTkRfSW5pdFN0cmVhbUNhcAkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfQ0FQVFVSRSB8IDQpCisjZGVmaW5lIENQSUFfQ09NTUFORF9GaW5pU3RyZWFtQ2FwCShPVVRQVVQgfCBDUElBX01PRFVMRV9DQVBUVVJFIHwgNSkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1N0YXJ0U3RyZWFtQ2FwCShPVVRQVVQgfCBDUElBX01PRFVMRV9DQVBUVVJFIHwgNikKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX0VuZFN0cmVhbUNhcAkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfQ0FQVFVSRSB8IDcpCisjZGVmaW5lIENQSUFfQ09NTUFORF9TZXRGb3JtYXQJCShPVVRQVVQgfCBDUElBX01PRFVMRV9DQVBUVVJFIHwgOCkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1NldFJPSQkJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NBUFRVUkUgfCA5KQorI2RlZmluZSBDUElBX0NPTU1BTkRfU2V0Q29tcHJlc3Npb24JKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NBUFRVUkUgfCAxMCkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1NldENvbXByZXNzaW9uVGFyZ2V0IChPVVRQVVQgfCBDUElBX01PRFVMRV9DQVBUVVJFIHwgMTEpCisjZGVmaW5lIENQSUFfQ09NTUFORF9TZXRZVVZUaHJlc2gJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NBUFRVUkUgfCAxMikKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1NldENvbXByZXNzaW9uUGFyYW1zIChPVVRQVVQgfCBDUElBX01PRFVMRV9DQVBUVVJFIHwgMTMpCisjZGVmaW5lIENQSUFfQ09NTUFORF9EaXNjYXJkRnJhbWUJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NBUFRVUkUgfCAxNCkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX0dyYWJSZXNldAkJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0NBUFRVUkUgfCAxNSkKKworI2RlZmluZSBDUElBX0NPTU1BTkRfT3V0cHV0UlMyMzIJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0RFQlVHIHwgMSkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX0Fib3J0UHJvY2VzcwkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfREVCVUcgfCA0KQorI2RlZmluZSBDUElBX0NPTU1BTkRfU2V0RHJhbVBhZ2UJKE9VVFBVVCB8IENQSUFfTU9EVUxFX0RFQlVHIHwgNSkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX1N0YXJ0RHJhbVVwbG9hZAkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfREVCVUcgfCA2KQorI2RlZmluZSBDUElBX0NPTU1BTkRfU3RhcnREdW1teUR0cmVhbQkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfREVCVUcgfCA4KQorI2RlZmluZSBDUElBX0NPTU1BTkRfQWJvcnRTdHJlYW0JKE9VVFBVVCB8IENQSUFfTU9EVUxFX0RFQlVHIHwgOSkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX0Rvd25sb2FkRFJBTQkoT1VUUFVUIHwgQ1BJQV9NT0RVTEVfREVCVUcgfCAxMCkKKyNkZWZpbmUgQ1BJQV9DT01NQU5EX051bGwJCShPVVRQVVQgfCBDUElBX01PRFVMRV9ERUJVRyB8IDExKQorCitlbnVtIHsKKwlGUkFNRV9SRUFEWSwJCS8qIFJlYWR5IHRvIGdyYWIgaW50byAqLworCUZSQU1FX0dSQUJCSU5HLAkJLyogSW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZ3JhYmJlZCBpbnRvICovCisJRlJBTUVfRE9ORSwJCS8qIEZpbmlzaGVkIGdyYWJiaW5nLCBidXQgbm90IGJlZW4gc3luY2VkIHlldCAqLworCUZSQU1FX1VOVVNFRCwJCS8qIFVudXNlZCAobm8gTUNBUFRVUkUpICovCit9OworCisjZGVmaW5lIENPTU1BTkRfTk9ORQkJCTB4MDAwMAorI2RlZmluZSBDT01NQU5EX1NFVENPTVBSRVNTSU9OCQkweDAwMDEKKyNkZWZpbmUgQ09NTUFORF9TRVRDT01QUkVTU0lPTlRBUkdFVAkweDAwMDIKKyNkZWZpbmUgQ09NTUFORF9TRVRDT0xPVVJQQVJBTVMJCTB4MDAwNAorI2RlZmluZSBDT01NQU5EX1NFVEZPUk1BVAkJMHgwMDA4CisjZGVmaW5lIENPTU1BTkRfUEFVU0UJCQkweDAwMTAKKyNkZWZpbmUgQ09NTUFORF9SRVNVTUUJCQkweDAwMjAKKyNkZWZpbmUgQ09NTUFORF9TRVRZVVZUSFJFU0gJCTB4MDA0MAorI2RlZmluZSBDT01NQU5EX1NFVEVDUFRJTUlORwkJMHgwMDgwCisjZGVmaW5lIENPTU1BTkRfU0VUQ09NUFJFU1NJT05QQVJBTVMJMHgwMTAwCisjZGVmaW5lIENPTU1BTkRfU0VURVhQT1NVUkUJCTB4MDIwMAorI2RlZmluZSBDT01NQU5EX1NFVENPTE9VUkJBTEFOQ0UJMHgwNDAwCisjZGVmaW5lIENPTU1BTkRfU0VUU0VOU09SRlBTCQkweDA4MDAKKyNkZWZpbmUgQ09NTUFORF9TRVRBUENPUgkJMHgxMDAwCisjZGVmaW5lIENPTU1BTkRfU0VURkxJQ0tFUkNUUkwJCTB4MjAwMAorI2RlZmluZSBDT01NQU5EX1NFVFZMT0ZGU0VUCQkweDQwMDAKKyNkZWZpbmUgQ09NTUFORF9TRVRMSUdIVFMJCTB4ODAwMAorCisjZGVmaW5lIFJPVU5EX1VQX0VYUF9GT1JfRkxJQ0tFUiAxNQorCisvKiBDb25zdGFudHMgZm9yIGF1dG9tYXRpYyBmcmFtZSByYXRlIGFkanVzdG1lbnQgKi8KKyNkZWZpbmUgTUFYX0VYUCAgICAgICAzMDIKKyNkZWZpbmUgTUFYX0VYUF8xMDIgICAyNTUKKyNkZWZpbmUgTE9XX0VYUCAgICAgICAxNDAKKyNkZWZpbmUgVkVSWV9MT1dfRVhQICAgNzAKKyNkZWZpbmUgVEMgICAgICAgICAgICAgOTQKKyNkZWZpbmUJRVhQX0FDQ19EQVJLICAgNTAKKyNkZWZpbmUJRVhQX0FDQ19MSUdIVCAgOTAKKyNkZWZpbmUgSElHSF9DT01QXzEwMiAxNjAJCQorI2RlZmluZSBNQVhfQ09NUCAgICAgIDIzOQkJCisjZGVmaW5lIERBUktfVElNRSAgICAgICAzCisjZGVmaW5lIExJR0hUX1RJTUUgICAgICAzCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIDEwbXMgbG9vcHMgdG8gd2FpdCBmb3IgdGhlIHN0cmVhbSB0byBiZWNvbWUgcmVhZHkgKi8KKyNkZWZpbmUgUkVBRFlfVElNRU9VVCAxMDAKKworLyogRGV2ZWxvcGVyJ3MgR3VpZGUgVGFibGUgNSBwIDMtMzQKKyAqIGluZGV4ZWQgYnkgW21haW5zXVtzZW5zb3JGcHMuYmFzZXJhdGVdW3NlbnNvckZwcy5kaXZpc29yXSovCitzdGF0aWMgdTggZmxpY2tlcl9qdW1wc1syXVsyXVs0XSA9Cit7IHsgeyA3NiwgMzgsIDE5LCA5IH0sIHsgOTIsIDQ2LCAyMywgMTEgfSB9LAorICB7IHsgNjQsIDMyLCAxNiwgOCB9LCB7IDc2LCAzOCwgMTksIDl9IH0KK307CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgbG9jYWwgZnVuY3Rpb24gKi8KK3N0YXRpYyB2b2lkIHJlc2V0X2NhbWVyYV9zdHJ1Y3Qoc3RydWN0IGNhbV9kYXRhICpjYW0pOworc3RhdGljIGludCBmaW5kX292ZXJfZXhwb3N1cmUoaW50IGJyaWdodG5lc3MpOworc3RhdGljIHZvaWQgc2V0X2ZsaWNrZXIoc3RydWN0IGNhbV9wYXJhbXMgKnBhcmFtcywgdm9sYXRpbGUgdTMyICpjb21tYW5kX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9uKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1lbW9yeSBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCAqcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXZvaWQgKm1lbTsKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCW1lbSA9IHZtYWxsb2NfMzIoc2l6ZSk7CisJaWYgKCFtZW0pCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7IC8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZCBydmZyZWUodm9pZCAqbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBhZHI7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisJdmZyZWUobWVtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAvcHJvYyBpbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqY3BpYV9wcm9jX3Jvb3Q9TlVMTDsKKworc3RhdGljIGludCBjcGlhX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpvdXQgPSBwYWdlOworCWludCBsZW4sIHRtcDsKKwlzdHJ1Y3QgY2FtX2RhdGEgKmNhbSA9IGRhdGE7CisJY2hhciB0bXBzdHJbMjldOworCisJLyogSU1QT1JUQU5UOiBUaGlzIG91dHB1dCBNVVNUIGJlIGtlcHQgdW5kZXIgUEFHRV9TSVpFCisJICogICAgICAgICAgICBvciB3ZSBuZWVkIHRvIGdldCBtb3JlIHNvcGhpc3RpY2F0ZWQuICovCisKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJyZWFkLW9ubHlcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJWNEwgRHJpdmVyIHZlcnNpb246ICAgICAgICVkLiVkLiVkXG4iLAorCQkgICAgICAgQ1BJQV9NQUpfVkVSLCBDUElBX01JTl9WRVIsIENQSUFfUEFUQ0hfVkVSKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJDUElBIFZlcnNpb246ICAgICAgICAgICAgICVkLiUwMmQgKCVkLiVkKVxuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy52ZXJzaW9uLmZpcm13YXJlVmVyc2lvbiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy52ZXJzaW9uLmZpcm13YXJlUmV2aXNpb24sCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMudmVyc2lvbi52Y1ZlcnNpb24sCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMudmVyc2lvbi52Y1JldmlzaW9uKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJDUElBIFBuUC1JRDogICAgICAgICAgICAgICUwNHg6JTA0eDolMDR4XG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLnBucElELnZlbmRvciwgY2FtLT5wYXJhbXMucG5wSUQucHJvZHVjdCwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5wbnBJRC5kZXZpY2VSZXZpc2lvbik7CisJb3V0ICs9IHNwcmludGYob3V0LCAiVlAtVmVyc2lvbjogICAgICAgICAgICAgICAlZC4lZCAlMDR4XG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLnZwVmVyc2lvbi52cFZlcnNpb24sCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMudnBWZXJzaW9uLnZwUmV2aXNpb24sCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMudnBWZXJzaW9uLmNhbWVyYUhlYWRJRCk7CisJCisJb3V0ICs9IHNwcmludGYob3V0LCAic3lzdGVtX3N0YXRlOiAgICAgICAgICAgICAlIzA0eFxuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5zdGF0dXMuc3lzdGVtU3RhdGUpOworCW91dCArPSBzcHJpbnRmKG91dCwgImdyYWJfc3RhdGU6ICAgICAgICAgICAgICAgJSMwNHhcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuc3RhdHVzLmdyYWJTdGF0ZSk7CisJb3V0ICs9IHNwcmludGYob3V0LCAic3RyZWFtX3N0YXRlOiAgICAgICAgICAgICAlIzA0eFxuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5zdGF0dXMuc3RyZWFtU3RhdGUpOworCW91dCArPSBzcHJpbnRmKG91dCwgImZhdGFsX2Vycm9yOiAgICAgICAgICAgICAgJSMwNHhcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuc3RhdHVzLmZhdGFsRXJyb3IpOworCW91dCArPSBzcHJpbnRmKG91dCwgImNtZF9lcnJvcjogICAgICAgICAgICAgICAgJSMwNHhcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuc3RhdHVzLmNtZEVycm9yKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJkZWJ1Z19mbGFnczogICAgICAgICAgICAgICUjMDR4XG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLnN0YXR1cy5kZWJ1Z0ZsYWdzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ2cF9zdGF0dXM6ICAgICAgICAgICAgICAgICUjMDR4XG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLnN0YXR1cy52cFN0YXR1cyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiZXJyb3JfY29kZTogICAgICAgICAgICAgICAlIzA0eFxuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5zdGF0dXMuZXJyb3JDb2RlKTsKKwkvKiBRWDMgc3BlY2lmaWMgZW50cmllcyAqLworCWlmIChjYW0tPnBhcmFtcy5xeDMucXgzX2RldGVjdGVkKSB7CisJCW91dCArPSBzcHJpbnRmKG91dCwgImJ1dHRvbjogICAgICAgICAgICAgICAgICAgJTRkXG4iLAorCQkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5xeDMuYnV0dG9uKTsKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiY3JhZGxlZDogICAgICAgICAgICAgICAgICAlNGRcbiIsCisJCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLnF4My5jcmFkbGVkKTsKKwl9CisJb3V0ICs9IHNwcmludGYob3V0LCAidmlkZW9fc2l6ZTogICAgICAgICAgICAgICAlc1xuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5mb3JtYXQudmlkZW9TaXplID09IFZJREVPU0laRV9DSUYgPworCQkgICAgICAgIkNJRiAiIDogIlFDSUYiKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJyb2k6ICAgICAgICAgICAgICAgICAgICAgICglM2QsICUzZCkgdG8gKCUzZCwgJTNkKVxuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5yb2kuY29sU3RhcnQqOCwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5yb2kucm93U3RhcnQqNCwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5yb2kuY29sRW5kKjgsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMucm9pLnJvd0VuZCo0KTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJhY3R1YWxfZnBzOiAgICAgICAgICAgICAgICUzZFxuIiwgY2FtLT5mcHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInRyYW5zZmVyX3JhdGU6ICAgICAgICAgICAgJTRka0Ivc1xuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnRyYW5zZmVyX3JhdGUpOworCQorCW91dCArPSBzcHJpbnRmKG91dCwgIlxucmVhZC13cml0ZVxuIik7CisJb3V0ICs9IHNwcmludGYob3V0LCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIGN1cnJlbnQgICAgICAgbWluIgorCSAgICAgICAgICAgICAgICIgICAgICAgbWF4ICAgZGVmYXVsdCAgY29tbWVudFxuIik7CisJb3V0ICs9IHNwcmludGYob3V0LCAiYnJpZ2h0bmVzczogICAgICAgICAgICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5icmlnaHRuZXNzLCAwLCAxMDAsIDUwKTsKKwlpZiAoY2FtLT5wYXJhbXMudmVyc2lvbi5maXJtd2FyZVZlcnNpb24gPT0gMSAmJgorCSAgIGNhbS0+cGFyYW1zLnZlcnNpb24uZmlybXdhcmVSZXZpc2lvbiA9PSAyKQorCQkvKiAxLTAyIGZpcm13YXJlIGxpbWl0cyBjb250cmFzdCB0byA4MCAqLworCQl0bXAgPSA4MDsKKwllbHNlCisJCXRtcCA9IDk2OworCisJb3V0ICs9IHNwcmludGYob3V0LCAiY29udHJhc3Q6ICAgICAgICAgICAgICAgJThkICAlOGQgICU4ZCAgJThkIgorCSAgICAgICAgICAgICAgICIgIHN0ZXBzIG9mIDhcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuY29sb3VyUGFyYW1zLmNvbnRyYXN0LCAwLCB0bXAsIDQ4KTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJzYXR1cmF0aW9uOiAgICAgICAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuY29sb3VyUGFyYW1zLnNhdHVyYXRpb24sIDAsIDEwMCwgNTApOworCXRtcCA9ICgyNTAwMCs1MDAwKmNhbS0+cGFyYW1zLnNlbnNvckZwcy5iYXNlcmF0ZSkvCisJICAgICAgKDE8PGNhbS0+cGFyYW1zLnNlbnNvckZwcy5kaXZpc29yKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJzZW5zb3JfZnBzOiAgICAgICAgICAgICAlNGQuJTAzZCAgJThkICAlOGQgICU4ZFxuIiwKKwkgICAgICAgICAgICAgICB0bXAvMTAwMCwgdG1wJTEwMDAsIDMsIDMwLCAxNSk7CisJb3V0ICs9IHNwcmludGYob3V0LCAic3RyZWFtX3N0YXJ0X2xpbmU6ICAgICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIDIqY2FtLT5wYXJhbXMuc3RyZWFtU3RhcnRMaW5lLCAwLAorCQkgICAgICAgY2FtLT5wYXJhbXMuZm9ybWF0LnZpZGVvU2l6ZSA9PSBWSURFT1NJWkVfQ0lGID8gMjg4OjE0NCwKKwkJICAgICAgIGNhbS0+cGFyYW1zLmZvcm1hdC52aWRlb1NpemUgPT0gVklERU9TSVpFX0NJRiA/IDI0MDoxMjApOworCW91dCArPSBzcHJpbnRmKG91dCwgInN1Yl9zYW1wbGU6ICAgICAgICAgICAgICU4cyAgJThzICAlOHMgICU4c1xuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5mb3JtYXQuc3ViU2FtcGxlID09IFNVQlNBTVBMRV80MjAgPworCQkgICAgICAgIjQyMCIgOiAiNDIyIiwgIjQyMCIsICI0MjIiLCAiNDIyIik7CisJb3V0ICs9IHNwcmludGYob3V0LCAieXV2X29yZGVyOiAgICAgICAgICAgICAgJThzICAlOHMgICU4cyAgJThzXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmZvcm1hdC55dXZPcmRlciA9PSBZVVZPUkRFUl9ZVVlWID8KKwkJICAgICAgICJZVVlWIiA6ICJVWVZZIiwgIllVWVYiICwgIlVZVlkiLCAiWVVZViIpOworCW91dCArPSBzcHJpbnRmKG91dCwgImVjcF90aW1pbmc6ICAgICAgICAgICAgICU4cyAgJThzICAlOHMgICU4c1xuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5lY3BUaW1pbmcgPyAic2xvdyIgOiAibm9ybWFsIiwgInNsb3ciLAorCQkgICAgICAgIm5vcm1hbCIsICJub3JtYWwiKTsKKworCWlmIChjYW0tPnBhcmFtcy5jb2xvdXJCYWxhbmNlLmJhbGFuY2VNb2RlID09IDIpIHsKKwkJc3ByaW50Zih0bXBzdHIsICJhdXRvIik7CisJfSBlbHNlIHsKKwkJc3ByaW50Zih0bXBzdHIsICJtYW51YWwiKTsKKwl9CisJb3V0ICs9IHNwcmludGYob3V0LCAiY29sb3JfYmFsYW5jZV9tb2RlOiAgICAgJThzICAlOHMgICU4cyIKKwkJICAgICAgICIgICU4c1xuIiwgIHRtcHN0ciwgIm1hbnVhbCIsICJhdXRvIiwgImF1dG8iKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJyZWRfZ2FpbjogICAgICAgICAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuY29sb3VyQmFsYW5jZS5yZWRHYWluLCAwLCAyMTIsIDMyKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJncmVlbl9nYWluOiAgICAgICAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuY29sb3VyQmFsYW5jZS5ncmVlbkdhaW4sIDAsIDIxMiwgNik7CisJb3V0ICs9IHNwcmludGYob3V0LCAiYmx1ZV9nYWluOiAgICAgICAgICAgICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbG91ckJhbGFuY2UuYmx1ZUdhaW4sIDAsIDIxMiwgOTIpOworCisJaWYgKGNhbS0+cGFyYW1zLnZlcnNpb24uZmlybXdhcmVWZXJzaW9uID09IDEgJiYKKwkgICBjYW0tPnBhcmFtcy52ZXJzaW9uLmZpcm13YXJlUmV2aXNpb24gPT0gMikKKwkJLyogMS0wMiBmaXJtd2FyZSBsaW1pdHMgZ2FpbiB0byAyICovCisJCXNwcmludGYodG1wc3RyLCAiJThkICAlOGQgICU4ZCIsIDEsIDIsIDIpOworCWVsc2UKKwkJc3ByaW50Zih0bXBzdHIsICIlOGQgICU4ZCAgJThkIiwgMSwgOCwgMik7CisKKwlpZiAoY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ2Fpbk1vZGUgPT0gMCkKKwkJb3V0ICs9IHNwcmludGYob3V0LCAibWF4X2dhaW46ICAgICAgICAgICAgICAgIHVua25vd24gICUyOHMiCisJCSAgICAgICAgICAgICAgICIgIHBvd2VycyBvZiAyXG4iLCB0bXBzdHIpOyAKKwllbHNlCisJCW91dCArPSBzcHJpbnRmKG91dCwgIm1heF9nYWluOiAgICAgICAgICAgICAgICU4ZCAgJTI4cyIKKwkJCSAgICAgICAiICAxLDIsNCBvciA4IFxuIiwKKwkJICAgICAgICAgICAgICAgMTw8KGNhbS0+cGFyYW1zLmV4cG9zdXJlLmdhaW5Nb2RlLTEpLCB0bXBzdHIpOworCisJc3dpdGNoKGNhbS0+cGFyYW1zLmV4cG9zdXJlLmV4cE1vZGUpIHsKKwljYXNlIDE6CisJY2FzZSAzOgorCQlzcHJpbnRmKHRtcHN0ciwgIm1hbnVhbCIpOworCQlicmVhazsKKwljYXNlIDI6CisJCXNwcmludGYodG1wc3RyLCAiYXV0byIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcHJpbnRmKHRtcHN0ciwgInVua25vd24iKTsKKwkJYnJlYWs7CisJfQorCW91dCArPSBzcHJpbnRmKG91dCwgImV4cG9zdXJlX21vZGU6ICAgICAgICAgICU4cyAgJThzICAlOHMiCisJCSAgICAgICAiICAlOHNcbiIsICB0bXBzdHIsICJtYW51YWwiLCAiYXV0byIsICJhdXRvIik7CisJb3V0ICs9IHNwcmludGYob3V0LCAiY2VudHJlX3dlaWdodDogICAgICAgICAgJThzICAlOHMgICU4cyAgJThzXG4iLAorCSAgICAgICAgICAgICAgICgyLWNhbS0+cGFyYW1zLmV4cG9zdXJlLmNlbnRyZVdlaWdodCkgPyAib24iIDogIm9mZiIsCisJICAgICAgICAgICAgICAgIm9mZiIsICJvbiIsICJvbiIpOworCW91dCArPSBzcHJpbnRmKG91dCwgImdhaW46ICAgICAgICAgICAgICAgICAgICU4ZCAgJThkICBtYXhfZ2FpbiAgJThkICAxLDIsNCw4IHBvc3NpYmxlXG4iLAorCSAgICAgICAgICAgICAgIDE8PGNhbS0+cGFyYW1zLmV4cG9zdXJlLmdhaW4sIDEsIDEpOworCWlmIChjYW0tPnBhcmFtcy52ZXJzaW9uLmZpcm13YXJlVmVyc2lvbiA9PSAxICYmCisJICAgY2FtLT5wYXJhbXMudmVyc2lvbi5maXJtd2FyZVJldmlzaW9uID09IDIpCisJCS8qIDEtMDIgZmlybXdhcmUgbGltaXRzIGZpbmVFeHAvMiB0byAxMjcgKi8KKwkJdG1wID0gMjU0OworCWVsc2UKKwkJdG1wID0gNTEwOworCisJb3V0ICs9IHNwcmludGYob3V0LCAiZmluZV9leHA6ICAgICAgICAgICAgICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmV4cG9zdXJlLmZpbmVFeHAqMiwgMCwgdG1wLCAwKTsKKwlpZiAoY2FtLT5wYXJhbXMudmVyc2lvbi5maXJtd2FyZVZlcnNpb24gPT0gMSAmJgorCSAgIGNhbS0+cGFyYW1zLnZlcnNpb24uZmlybXdhcmVSZXZpc2lvbiA9PSAyKQorCQkvKiAxLTAyIGZpcm13YXJlIGxpbWl0cyBjb2Fyc2VFeHBIaSB0byAwICovCisJCXRtcCA9IE1BWF9FWFBfMTAyOworCWVsc2UKKwkJdG1wID0gTUFYX0VYUDsKKworCW91dCArPSBzcHJpbnRmKG91dCwgImNvYXJzZV9leHA6ICAgICAgICAgICAgICU4ZCAgJThkICAlOGQiCisJCSAgICAgICAiICAlOGRcbiIsIGNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cExvKworCQkgICAgICAgMjU2KmNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cEhpLCAwLCB0bXAsIDE4NSk7CisJb3V0ICs9IHNwcmludGYob3V0LCAicmVkX2NvbXA6ICAgICAgICAgICAgICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmV4cG9zdXJlLnJlZENvbXAsIENPTVBfUkVELCAyNTUsIENPTVBfUkVEKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJncmVlbjFfY29tcDogICAgICAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ3JlZW4xQ29tcCwgQ09NUF9HUkVFTjEsIDI1NSwKKwkJICAgICAgIENPTVBfR1JFRU4xKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJncmVlbjJfY29tcDogICAgICAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ3JlZW4yQ29tcCwgQ09NUF9HUkVFTjIsIDI1NSwKKwkJICAgICAgIENPTVBfR1JFRU4yKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJibHVlX2NvbXA6ICAgICAgICAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuYmx1ZUNvbXAsIENPTVBfQkxVRSwgMjU1LCBDT01QX0JMVUUpOworCQorCW91dCArPSBzcHJpbnRmKG91dCwgImFwY29yX2dhaW4xOiAgICAgICAgICAgICUjOHggICUjOHggICUjOHggICUjOHhcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuYXBjb3IuZ2FpbjEsIDAsIDB4ZmYsIDB4MWMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImFwY29yX2dhaW4yOiAgICAgICAgICAgICUjOHggICUjOHggICUjOHggICUjOHhcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuYXBjb3IuZ2FpbjIsIDAsIDB4ZmYsIDB4MWEpOworCW91dCArPSBzcHJpbnRmKG91dCwgImFwY29yX2dhaW40OiAgICAgICAgICAgICUjOHggICUjOHggICUjOHggICUjOHhcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuYXBjb3IuZ2FpbjQsIDAsIDB4ZmYsIDB4MmQpOworCW91dCArPSBzcHJpbnRmKG91dCwgImFwY29yX2dhaW44OiAgICAgICAgICAgICUjOHggICUjOHggICUjOHggICUjOHhcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuYXBjb3IuZ2FpbjgsIDAsIDB4ZmYsIDB4MmEpOworCW91dCArPSBzcHJpbnRmKG91dCwgInZsX29mZnNldF9nYWluMTogICAgICAgICU4ZCAgJThkICAlOGQgICU4ZFxuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy52bE9mZnNldC5nYWluMSwgMCwgMjU1LCAyNCk7CisJb3V0ICs9IHNwcmludGYob3V0LCAidmxfb2Zmc2V0X2dhaW4yOiAgICAgICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLnZsT2Zmc2V0LmdhaW4yLCAwLCAyNTUsIDI4KTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ2bF9vZmZzZXRfZ2FpbjQ6ICAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMudmxPZmZzZXQuZ2FpbjQsIDAsIDI1NSwgMzApOworCW91dCArPSBzcHJpbnRmKG91dCwgInZsX29mZnNldF9nYWluODogICAgICAgICU4ZCAgJThkICAlOGQgICU4ZFxuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy52bE9mZnNldC5nYWluOCwgMCwgMjU1LCAzMCk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiZmxpY2tlcl9jb250cm9sOiAgICAgICAgJThzICAlOHMgICU4cyAgJThzXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmZsaWNrZXJDb250cm9sLmZsaWNrZXJNb2RlID8gIm9uIiA6ICJvZmYiLAorCQkgICAgICAgIm9mZiIsICJvbiIsICJvZmYiKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJtYWluc19mcmVxdWVuY3k6ICAgICAgICAlOGQgICU4ZCAgJThkICAlOGQiCisJICAgICAgICAgICAgICAgIiBvbmx5IDUwLzYwXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+bWFpbnNGcmVxID8gNjAgOiA1MCwgNTAsIDYwLCA1MCk7CisJaWYoY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuYWxsb3dhYmxlT3ZlckV4cG9zdXJlIDwgMCkKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiYWxsb3dhYmxlX292ZXJleHBvc3VyZTogJTRkYXV0byAgICAgIGF1dG8gICU4ZCAgICAgIGF1dG9cbiIsCisJCSAgICAgICAgICAgICAgIC1jYW0tPnBhcmFtcy5mbGlja2VyQ29udHJvbC5hbGxvd2FibGVPdmVyRXhwb3N1cmUsCisJCSAgICAgICAgICAgICAgIDI1NSk7CisJZWxzZQorCQlvdXQgKz0gc3ByaW50ZihvdXQsICJhbGxvd2FibGVfb3ZlcmV4cG9zdXJlOiAlOGQgICAgICBhdXRvICAlOGQgICAgICBhdXRvXG4iLAorCQkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5mbGlja2VyQ29udHJvbC5hbGxvd2FibGVPdmVyRXhwb3N1cmUsCisJCSAgICAgICAgICAgICAgIDI1NSk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiY29tcHJlc3Npb25fbW9kZTogICAgICAgIik7CisJc3dpdGNoKGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uLm1vZGUpIHsKKwljYXNlIENQSUFfQ09NUFJFU1NJT05fTk9ORToKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJThzIiwgIm5vbmUiKTsKKwkJYnJlYWs7CisJY2FzZSBDUElBX0NPTVBSRVNTSU9OX0FVVE86CisJCW91dCArPSBzcHJpbnRmKG91dCwgIiU4cyIsICJhdXRvIik7CisJCWJyZWFrOworCWNhc2UgQ1BJQV9DT01QUkVTU0lPTl9NQU5VQUw6CisJCW91dCArPSBzcHJpbnRmKG91dCwgIiU4cyIsICJtYW51YWwiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJThzIiwgInVua25vd24iKTsKKwkJYnJlYWs7CisJfQorCW91dCArPSBzcHJpbnRmKG91dCwgIiAgICBub25lLGF1dG8sbWFudWFsICAgICAgYXV0b1xuIik7CisJb3V0ICs9IHNwcmludGYob3V0LCAiZGVjaW1hdGlvbl9lbmFibGU6ICAgICAgJThzICAlOHMgICU4cyAgJThzXG4iLAorICAgICAgICAJICAgICAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uLmRlY2ltYXRpb24gPT0KKwkJICAgICAgIERFQ0lNQVRJT05fRU5BQiA/ICJvbiI6Im9mZiIsICJvZmYiLCAib24iLCAKKwkJICAgICAgICJvZmYiKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJjb21wcmVzc2lvbl90YXJnZXQ6ICAgICU5cyAlOXMgJTlzICU5c1xuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5jb21wcmVzc2lvblRhcmdldC5mclRhcmdldGluZyAgPT0gCisJCSAgICAgICBDUElBX0NPTVBSRVNTSU9OX1RBUkdFVF9GUkFNRVJBVEUgPworCQkgICAgICAgImZyYW1lcmF0ZSI6InF1YWxpdHkiLAorCQkgICAgICAgImZyYW1lcmF0ZSIsICJxdWFsaXR5IiwgInF1YWxpdHkiKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ0YXJnZXRfZnJhbWVyYXRlOiAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuY29tcHJlc3Npb25UYXJnZXQudGFyZ2V0RlIsIDEsIDMwLCAxNSk7CisJb3V0ICs9IHNwcmludGYob3V0LCAidGFyZ2V0X3F1YWxpdHk6ICAgICAgICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uVGFyZ2V0LnRhcmdldFEsIDEsIDY0LCA1KTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ5X3RocmVzaG9sZDogICAgICAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMueXV2VGhyZXNob2xkLnlUaHJlc2hvbGQsIDAsIDMxLCA2KTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ1dl90aHJlc2hvbGQ6ICAgICAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMueXV2VGhyZXNob2xkLnV2VGhyZXNob2xkLCAwLCAzMSwgNik7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaHlzdGVyZXNpczogICAgICAgICAgICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLmh5c3RlcmVzaXMsIDAsIDI1NSwgMyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAidGhyZXNob2xkX21heDogICAgICAgICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLnRocmVzaE1heCwgMCwgMjU1LCAxMSk7CisJb3V0ICs9IHNwcmludGYob3V0LCAic21hbGxfc3RlcDogICAgICAgICAgICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLnNtYWxsU3RlcCwgMCwgMjU1LCAxKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJsYXJnZV9zdGVwOiAgICAgICAgICAgICAlOGQgICU4ZCAgJThkICAlOGRcbiIsCisJICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuY29tcHJlc3Npb25QYXJhbXMubGFyZ2VTdGVwLCAwLCAyNTUsIDMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImRlY2ltYXRpb25faHlzdGVyZXNpczogICU4ZCAgJThkICAlOGQgICU4ZFxuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5kZWNpbWF0aW9uSHlzdGVyZXNpcywKKwkJICAgICAgIDAsIDI1NSwgMik7CisJb3V0ICs9IHNwcmludGYob3V0LCAiZnJfZGlmZl9zdGVwX3RocmVzaDogICAgJThkICAlOGQgICU4ZCAgJThkXG4iLAorCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLmZyRGlmZlN0ZXBUaHJlc2gsCisJCSAgICAgICAwLCAyNTUsIDUpOworCW91dCArPSBzcHJpbnRmKG91dCwgInFfZGlmZl9zdGVwX3RocmVzaDogICAgICU4ZCAgJThkICAlOGQgICU4ZFxuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5xRGlmZlN0ZXBUaHJlc2gsCisJCSAgICAgICAwLCAyNTUsIDMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImRlY2ltYXRpb25fdGhyZXNoX21vZDogICU4ZCAgJThkICAlOGQgICU4ZFxuIiwKKwkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5kZWNpbWF0aW9uVGhyZXNoTW9kLAorCQkgICAgICAgMCwgMjU1LCAyKTsKKwkvKiBRWDMgc3BlY2lmaWMgZW50cmllcyAqLworCWlmIChjYW0tPnBhcmFtcy5xeDMucXgzX2RldGVjdGVkKSB7CisJCW91dCArPSBzcHJpbnRmKG91dCwgInRvcGxpZ2h0OiAgICAgICAgICAgICAgICU4cyAgJThzICAlOHMgICU4c1xuIiwgCisJCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLnF4My50b3BsaWdodCA/ICJvbiIgOiAib2ZmIiwKKwkJCSAgICAgICAib2ZmIiwgIm9uIiwgIm9mZiIpOworCQlvdXQgKz0gc3ByaW50ZihvdXQsICJib3R0b21saWdodDogICAgICAgICAgICAlOHMgICU4cyAgJThzICAlOHNcbiIsIAorCQkgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5xeDMuYm90dG9tbGlnaHQgPyAib24iIDogIm9mZiIsCisJCQkgICAgICAgIm9mZiIsICJvbiIsICJvZmYiKTsKKwl9CisJCisJbGVuID0gb3V0IC0gcGFnZTsKKwlsZW4gLT0gb2ZmOworCWlmIChsZW4gPCBjb3VudCkgeworCQkqZW9mID0gMTsKKwkJaWYgKGxlbiA8PSAwKSByZXR1cm4gMDsKKwl9IGVsc2UKKwkJbGVuID0gY291bnQ7CisKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCXJldHVybiBsZW47Cit9CisKKworc3RhdGljIGludCBtYXRjaChjaGFyICpjaGVja3N0ciwgY2hhciAqKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyAqY291bnQsCisgICAgICAgICAgICAgICAgIGludCAqZmluZF9jb2xvbiwgaW50ICplcnIpCit7CisJaW50IHJldCwgY29sb25fZm91bmQgPSAxOworCWludCBsZW4gPSBzdHJsZW4oY2hlY2tzdHIpOworCXJldCA9IChsZW4gPD0gKmNvdW50ICYmIHN0cm5jbXAoKmJ1ZmZlciwgY2hlY2tzdHIsIGxlbikgPT0gMCk7CisJaWYgKHJldCkgeworCQkqYnVmZmVyICs9IGxlbjsKKwkJKmNvdW50IC09IGxlbjsKKwkJaWYgKCpmaW5kX2NvbG9uKSB7CisJCQljb2xvbl9mb3VuZCA9IDA7CisJCQl3aGlsZSAoKmNvdW50ICYmICgqKmJ1ZmZlciA9PSAnICcgfHwgKipidWZmZXIgPT0gJ1x0JyB8fAorCQkJCQkgICghY29sb25fZm91bmQgJiYgKipidWZmZXIgPT0gJzonKSkpIHsKKwkJCQlpZiAoKipidWZmZXIgPT0gJzonKQorCQkJCQljb2xvbl9mb3VuZCA9IDE7CisJCQkJLS0qY291bnQ7CisJCQkJKysqYnVmZmVyOworCQkJfQorCQkJaWYgKCEqY291bnQgfHwgIWNvbG9uX2ZvdW5kKQorCQkJCSplcnIgPSAtRUlOVkFMOworCQkJKmZpbmRfY29sb24gPSAwOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB2YWx1ZShjaGFyICoqYnVmZmVyLCB1bnNpZ25lZCBsb25nICpjb3VudCwgaW50ICplcnIpCit7CisJY2hhciAqcDsKKwl1bnNpZ25lZCBsb25nIGludCByZXQ7CisJcmV0ID0gc2ltcGxlX3N0cnRvdWwoKmJ1ZmZlciwgJnAsIDApOworCWlmIChwID09ICpidWZmZXIpCisJCSplcnIgPSAtRUlOVkFMOworCWVsc2UgeworCQkqY291bnQgLT0gcCAtICpidWZmZXI7CisJCSpidWZmZXIgPSBwOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNwaWFfd3JpdGVfcHJvYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNhbV9kYXRhICpjYW0gPSBkYXRhOworCXN0cnVjdCBjYW1fcGFyYW1zIG5ld19wYXJhbXM7CisJY2hhciAqcGFnZSwgKmJ1ZmZlcjsKKwlpbnQgcmV0dmFsLCBmaW5kX2NvbG9uOworCWludCBzaXplID0gY291bnQ7CisJdW5zaWduZWQgbG9uZyB2YWwgPSAwOworCXUzMiBjb21tYW5kX2ZsYWdzID0gMDsKKwl1OCBuZXdfbWFpbnM7CisKKwkvKgorCSAqIFRoaXMgY29kZSB0byBjb3B5IGZyb20gYnVmIHRvIHBhZ2UgaXMgc2hhbWVsZXNzbHkgY29waWVkCisJICogZnJvbSB0aGUgY29teCBkcml2ZXIKKwkgKi8KKwlpZiAoY291bnQgPiBQQUdFX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb3VudCBpcyAlbHUgPiAlZCEhIVxuIiwgY291bnQsIChpbnQpUEFHRV9TSVpFKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJaWYgKCEocGFnZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpKSkgcmV0dXJuIC1FTk9NRU07CisKKwlpZihjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkKKwl7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwYWdlW2NvdW50LTFdID09ICdcbicpCisJCXBhZ2VbY291bnQtMV0gPSAnXDAnOworCWVsc2UgaWYgKGNvdW50IDwgUEFHRV9TSVpFKQorCQlwYWdlW2NvdW50XSA9ICdcMCc7CisJZWxzZSBpZiAocGFnZVtjb3VudF0pIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCQorCWJ1ZmZlciA9IHBhZ2U7CisJCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2FtLT5wYXJhbV9sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkKKwkvKgorCSAqIFNraXAgb3ZlciBsZWFkaW5nIHdoaXRlc3BhY2UKKwkgKi8KKwl3aGlsZSAoY291bnQgJiYgaXNzcGFjZSgqYnVmZmVyKSkgeworCQktLWNvdW50OworCQkrK2J1ZmZlcjsKKwl9CisJCisJbWVtY3B5KCZuZXdfcGFyYW1zLCAmY2FtLT5wYXJhbXMsIHNpemVvZihzdHJ1Y3QgY2FtX3BhcmFtcykpOworCW5ld19tYWlucyA9IGNhbS0+bWFpbnNGcmVxOworCQorI2RlZmluZSBNQVRDSCh4KSAobWF0Y2goeCwgJmJ1ZmZlciwgJmNvdW50LCAmZmluZF9jb2xvbiwgJnJldHZhbCkpCisjZGVmaW5lIFZBTFVFICh2YWx1ZSgmYnVmZmVyLCZjb3VudCwgJnJldHZhbCkpCisjZGVmaW5lIEZJUk1XQVJFX1ZFUlNJT04oeCx5KSAobmV3X3BhcmFtcy52ZXJzaW9uLmZpcm13YXJlVmVyc2lvbiA9PSAoeCkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19wYXJhbXMudmVyc2lvbi5maXJtd2FyZVJldmlzaW9uID09ICh5KSkKKwkKKwlyZXR2YWwgPSAwOworCXdoaWxlIChjb3VudCAmJiAhcmV0dmFsKSB7CisJCWZpbmRfY29sb24gPSAxOworCQlpZiAoTUFUQ0goImJyaWdodG5lc3MiKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJaWYgKHZhbCA8PSAxMDApCisJCQkJCW5ld19wYXJhbXMuY29sb3VyUGFyYW1zLmJyaWdodG5lc3MgPSB2YWw7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVENPTE9VUlBBUkFNUzsKKwkJCWlmKG5ld19wYXJhbXMuZmxpY2tlckNvbnRyb2wuYWxsb3dhYmxlT3ZlckV4cG9zdXJlIDwgMCkKKwkJCQluZXdfcGFyYW1zLmZsaWNrZXJDb250cm9sLmFsbG93YWJsZU92ZXJFeHBvc3VyZSA9IAorCQkJCQktZmluZF9vdmVyX2V4cG9zdXJlKG5ld19wYXJhbXMuY29sb3VyUGFyYW1zLmJyaWdodG5lc3MpOworCQkJaWYobmV3X3BhcmFtcy5mbGlja2VyQ29udHJvbC5mbGlja2VyTW9kZSAhPSAwKQorCQkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRGTElDS0VSQ1RSTDsKKworCQl9IGVsc2UgaWYgKE1BVENIKCJjb250cmFzdCIpKSB7CisJCQlpZiAoIXJldHZhbCkKKwkJCQl2YWwgPSBWQUxVRTsKKworCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQlpZiAodmFsIDw9IDEwMCkgeworCQkJCQkvKiBjb250cmFzdCBpcyBpbiBzdGVwcyBvZiA4LCBzbyByb3VuZCovCisJCQkJCXZhbCA9ICgodmFsICsgMykgLyA4KSAqIDg7CisJCQkJCS8qIDEtMDIgZmlybXdhcmUgbGltaXRzIGNvbnRyYXN0IHRvIDgwKi8KKwkJCQkJaWYgKEZJUk1XQVJFX1ZFUlNJT04oMSwyKSAmJiB2YWwgPiA4MCkKKwkJCQkJCXZhbCA9IDgwOworCisJCQkJCW5ld19wYXJhbXMuY29sb3VyUGFyYW1zLmNvbnRyYXN0ID0gdmFsOworCQkJCX0gZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVENPTE9VUlBBUkFNUzsKKwkJfSBlbHNlIGlmIChNQVRDSCgic2F0dXJhdGlvbiIpKSB7CisJCQlpZiAoIXJldHZhbCkKKwkJCQl2YWwgPSBWQUxVRTsKKworCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQlpZiAodmFsIDw9IDEwMCkKKwkJCQkJbmV3X3BhcmFtcy5jb2xvdXJQYXJhbXMuc2F0dXJhdGlvbiA9IHZhbDsKKwkJCQllbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VUQ09MT1VSUEFSQU1TOworCQl9IGVsc2UgaWYgKE1BVENIKCJzZW5zb3JfZnBzIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCS8qIGZpbmQgdmFsdWVzIHNvIHRoYXQgc2Vuc29yRlBTIGlzIG1pbmltaXplZCwKKwkJCQkgKiBidXQgPj0gdmFsICovCisJCQkJaWYgKHZhbCA+IDMwKQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJCWVsc2UgaWYgKHZhbCA+IDI1KSB7CisJCQkJCW5ld19wYXJhbXMuc2Vuc29yRnBzLmRpdmlzb3IgPSAwOworCQkJCQluZXdfcGFyYW1zLnNlbnNvckZwcy5iYXNlcmF0ZSA9IDE7CisJCQkJfSBlbHNlIGlmICh2YWwgPiAxNSkgeworCQkJCQluZXdfcGFyYW1zLnNlbnNvckZwcy5kaXZpc29yID0gMDsKKwkJCQkJbmV3X3BhcmFtcy5zZW5zb3JGcHMuYmFzZXJhdGUgPSAwOworCQkJCX0gZWxzZSBpZiAodmFsID4gMTIpIHsKKwkJCQkJbmV3X3BhcmFtcy5zZW5zb3JGcHMuZGl2aXNvciA9IDE7CisJCQkJCW5ld19wYXJhbXMuc2Vuc29yRnBzLmJhc2VyYXRlID0gMTsKKwkJCQl9IGVsc2UgaWYgKHZhbCA+IDcpIHsKKwkJCQkJbmV3X3BhcmFtcy5zZW5zb3JGcHMuZGl2aXNvciA9IDE7CisJCQkJCW5ld19wYXJhbXMuc2Vuc29yRnBzLmJhc2VyYXRlID0gMDsKKwkJCQl9IGVsc2UgaWYgKHZhbCA+IDYpIHsKKwkJCQkJbmV3X3BhcmFtcy5zZW5zb3JGcHMuZGl2aXNvciA9IDI7CisJCQkJCW5ld19wYXJhbXMuc2Vuc29yRnBzLmJhc2VyYXRlID0gMTsKKwkJCQl9IGVsc2UgaWYgKHZhbCA+IDMpIHsKKwkJCQkJbmV3X3BhcmFtcy5zZW5zb3JGcHMuZGl2aXNvciA9IDI7CisJCQkJCW5ld19wYXJhbXMuc2Vuc29yRnBzLmJhc2VyYXRlID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQluZXdfcGFyYW1zLnNlbnNvckZwcy5kaXZpc29yID0gMzsKKwkJCQkJLyogRWl0aGVyIGJhc2UgcmF0ZSB3b3VsZCB3b3JrIGhlcmUgKi8KKwkJCQkJbmV3X3BhcmFtcy5zZW5zb3JGcHMuYmFzZXJhdGUgPSAxOworCQkJCX0KKwkJCQluZXdfcGFyYW1zLmZsaWNrZXJDb250cm9sLmNvYXJzZUp1bXAgPSAKKwkJCQkJZmxpY2tlcl9qdW1wc1tuZXdfbWFpbnNdCisJCQkJCVtuZXdfcGFyYW1zLnNlbnNvckZwcy5iYXNlcmF0ZV0KKwkJCQkJW25ld19wYXJhbXMuc2Vuc29yRnBzLmRpdmlzb3JdOworCQkJCWlmIChuZXdfcGFyYW1zLmZsaWNrZXJDb250cm9sLmZsaWNrZXJNb2RlKQorCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURkxJQ0tFUkNUUkw7CisJCQl9CisJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VUU0VOU09SRlBTOworCQkJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9OT1JNQUw7CisJCX0gZWxzZSBpZiAoTUFUQ0goInN0cmVhbV9zdGFydF9saW5lIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWludCBtYXhfbGluZSA9IDI4ODsKKworCQkJCWlmIChuZXdfcGFyYW1zLmZvcm1hdC52aWRlb1NpemUgPT0gVklERU9TSVpFX1FDSUYpCisJCQkJCW1heF9saW5lID0gMTQ0OworCQkJCWlmICh2YWwgPD0gbWF4X2xpbmUpCisJCQkJCW5ld19wYXJhbXMuc3RyZWFtU3RhcnRMaW5lID0gdmFsLzI7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQl9IGVsc2UgaWYgKE1BVENIKCJzdWJfc2FtcGxlIikpIHsKKwkJCWlmICghcmV0dmFsICYmIE1BVENIKCI0MjAiKSkKKwkJCQluZXdfcGFyYW1zLmZvcm1hdC5zdWJTYW1wbGUgPSBTVUJTQU1QTEVfNDIwOworCQkJZWxzZSBpZiAoIXJldHZhbCAmJiBNQVRDSCgiNDIyIikpCisJCQkJbmV3X3BhcmFtcy5mb3JtYXQuc3ViU2FtcGxlID0gU1VCU0FNUExFXzQyMjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCisJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURk9STUFUOworCQl9IGVsc2UgaWYgKE1BVENIKCJ5dXZfb3JkZXIiKSkgeworCQkJaWYgKCFyZXR2YWwgJiYgTUFUQ0goIllVWVYiKSkKKwkJCQluZXdfcGFyYW1zLmZvcm1hdC55dXZPcmRlciA9IFlVVk9SREVSX1lVWVY7CisJCQllbHNlIGlmICghcmV0dmFsICYmIE1BVENIKCJVWVZZIikpCisJCQkJbmV3X3BhcmFtcy5mb3JtYXQueXV2T3JkZXIgPSBZVVZPUkRFUl9VWVZZOworCQkJZWxzZQorCQkJCXJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRGT1JNQVQ7CisJCX0gZWxzZSBpZiAoTUFUQ0goImVjcF90aW1pbmciKSkgeworCQkJaWYgKCFyZXR2YWwgJiYgTUFUQ0goIm5vcm1hbCIpKQorCQkJCW5ld19wYXJhbXMuZWNwVGltaW5nID0gMDsKKwkJCWVsc2UgaWYgKCFyZXR2YWwgJiYgTUFUQ0goInNsb3ciKSkKKwkJCQluZXdfcGFyYW1zLmVjcFRpbWluZyA9IDE7CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKworCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVEVDUFRJTUlORzsKKwkJfSBlbHNlIGlmIChNQVRDSCgiY29sb3JfYmFsYW5jZV9tb2RlIikpIHsKKwkJCWlmICghcmV0dmFsICYmIE1BVENIKCJtYW51YWwiKSkKKwkJCQluZXdfcGFyYW1zLmNvbG91ckJhbGFuY2UuYmFsYW5jZU1vZGUgPSAzOworCQkJZWxzZSBpZiAoIXJldHZhbCAmJiBNQVRDSCgiYXV0byIpKQorCQkJCW5ld19wYXJhbXMuY29sb3VyQmFsYW5jZS5iYWxhbmNlTW9kZSA9IDI7CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKworCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVENPTE9VUkJBTEFOQ0U7CisJCX0gZWxzZSBpZiAoTUFUQ0goInJlZF9nYWluIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWlmICh2YWwgPD0gMjEyKSB7CisJCQkJCW5ld19wYXJhbXMuY29sb3VyQmFsYW5jZS5yZWRHYWluID0gdmFsOworCQkJCQluZXdfcGFyYW1zLmNvbG91ckJhbGFuY2UuYmFsYW5jZU1vZGUgPSAxOworCQkJCX0gZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVENPTE9VUkJBTEFOQ0U7CisJCX0gZWxzZSBpZiAoTUFUQ0goImdyZWVuX2dhaW4iKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJaWYgKHZhbCA8PSAyMTIpIHsKKwkJCQkJbmV3X3BhcmFtcy5jb2xvdXJCYWxhbmNlLmdyZWVuR2FpbiA9IHZhbDsKKwkJCQkJbmV3X3BhcmFtcy5jb2xvdXJCYWxhbmNlLmJhbGFuY2VNb2RlID0gMTsKKwkJCQl9IGVsc2UKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCX0KKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRDT0xPVVJCQUxBTkNFOworCQl9IGVsc2UgaWYgKE1BVENIKCJibHVlX2dhaW4iKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJaWYgKHZhbCA8PSAyMTIpIHsKKwkJCQkJbmV3X3BhcmFtcy5jb2xvdXJCYWxhbmNlLmJsdWVHYWluID0gdmFsOworCQkJCQluZXdfcGFyYW1zLmNvbG91ckJhbGFuY2UuYmFsYW5jZU1vZGUgPSAxOworCQkJCX0gZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVENPTE9VUkJBTEFOQ0U7CisJCX0gZWxzZSBpZiAoTUFUQ0goIm1heF9nYWluIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCS8qIDEtMDIgZmlybXdhcmUgbGltaXRzIGdhaW4gdG8gMiAqLworCQkJCWlmIChGSVJNV0FSRV9WRVJTSU9OKDEsMikgJiYgdmFsID4gMikKKwkJCQkJdmFsID0gMjsKKwkJCQlzd2l0Y2godmFsKSB7CisJCQkJY2FzZSAxOgorCQkJCQluZXdfcGFyYW1zLmV4cG9zdXJlLmdhaW5Nb2RlID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQluZXdfcGFyYW1zLmV4cG9zdXJlLmdhaW5Nb2RlID0gMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQluZXdfcGFyYW1zLmV4cG9zdXJlLmdhaW5Nb2RlID0gMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA4OgorCQkJCQluZXdfcGFyYW1zLmV4cG9zdXJlLmdhaW5Nb2RlID0gNDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVEVYUE9TVVJFOworCQl9IGVsc2UgaWYgKE1BVENIKCJleHBvc3VyZV9tb2RlIikpIHsKKwkJCWlmICghcmV0dmFsICYmIE1BVENIKCJhdXRvIikpCisJCQkJbmV3X3BhcmFtcy5leHBvc3VyZS5leHBNb2RlID0gMjsKKwkJCWVsc2UgaWYgKCFyZXR2YWwgJiYgTUFUQ0goIm1hbnVhbCIpKSB7CisJCQkJaWYgKG5ld19wYXJhbXMuZXhwb3N1cmUuZXhwTW9kZSA9PSAyKQorCQkJCQluZXdfcGFyYW1zLmV4cG9zdXJlLmV4cE1vZGUgPSAzOworCQkJCWlmKG5ld19wYXJhbXMuZmxpY2tlckNvbnRyb2wuZmxpY2tlck1vZGUgIT0gMCkKKwkJCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVEZMSUNLRVJDVFJMOworCQkJCW5ld19wYXJhbXMuZmxpY2tlckNvbnRyb2wuZmxpY2tlck1vZGUgPSAwOworCQkJfSBlbHNlCisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKworCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVEVYUE9TVVJFOworCQl9IGVsc2UgaWYgKE1BVENIKCJjZW50cmVfd2VpZ2h0IikpIHsKKwkJCWlmICghcmV0dmFsICYmIE1BVENIKCJvbiIpKQorCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuY2VudHJlV2VpZ2h0ID0gMTsKKwkJCWVsc2UgaWYgKCFyZXR2YWwgJiYgTUFUQ0goIm9mZiIpKQorCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuY2VudHJlV2VpZ2h0ID0gMjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCisJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURVhQT1NVUkU7CisJCX0gZWxzZSBpZiAoTUFUQ0goImdhaW4iKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJc3dpdGNoKHZhbCkgeworCQkJCWNhc2UgMToKKwkJCQkJbmV3X3BhcmFtcy5leHBvc3VyZS5nYWluID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQluZXdfcGFyYW1zLmV4cG9zdXJlLmdhaW4gPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuZ2FpbiA9IDI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgODoKKwkJCQkJbmV3X3BhcmFtcy5leHBvc3VyZS5nYWluID0gMzsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuZXhwTW9kZSA9IDE7CisJCQkJaWYobmV3X3BhcmFtcy5mbGlja2VyQ29udHJvbC5mbGlja2VyTW9kZSAhPSAwKQorCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURkxJQ0tFUkNUUkw7CisJCQkJbmV3X3BhcmFtcy5mbGlja2VyQ29udHJvbC5mbGlja2VyTW9kZSA9IDA7CisJCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVEVYUE9TVVJFOworCQkJCWlmIChuZXdfcGFyYW1zLmV4cG9zdXJlLmdhaW4gPgorCQkJCSAgICBuZXdfcGFyYW1zLmV4cG9zdXJlLmdhaW5Nb2RlLTEpCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoTUFUQ0goImZpbmVfZXhwIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFLzI7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJaWYgKHZhbCA8IDI1NikgeworCQkJCQkvKiAxLTAyIGZpcm13YXJlIGxpbWl0cyBmaW5lRXhwLzIgdG8gMTI3Ki8KKwkJCQkJaWYgKEZJUk1XQVJFX1ZFUlNJT04oMSwyKSAmJiB2YWwgPiAxMjcpCisJCQkJCQl2YWwgPSAxMjc7CisJCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuZmluZUV4cCA9IHZhbDsKKwkJCQkJbmV3X3BhcmFtcy5leHBvc3VyZS5leHBNb2RlID0gMTsKKwkJCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVEVYUE9TVVJFOworCQkJCQlpZihuZXdfcGFyYW1zLmZsaWNrZXJDb250cm9sLmZsaWNrZXJNb2RlICE9IDApCisJCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURkxJQ0tFUkNUUkw7CisJCQkJCW5ld19wYXJhbXMuZmxpY2tlckNvbnRyb2wuZmxpY2tlck1vZGUgPSAwOworCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURkxJQ0tFUkNUUkw7CisJCQkJfSBlbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoTUFUQ0goImNvYXJzZV9leHAiKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJaWYgKHZhbCA8PSBNQVhfRVhQKSB7CisJCQkJCWlmIChGSVJNV0FSRV9WRVJTSU9OKDEsMikgJiYKKwkJCQkJICAgIHZhbCA+IE1BWF9FWFBfMTAyKQorCQkJCQkJdmFsID0gTUFYX0VYUF8xMDI7CisJCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuY29hcnNlRXhwTG8gPQorCQkJCQkJdmFsICYgMHhmZjsKKwkJCQkJbmV3X3BhcmFtcy5leHBvc3VyZS5jb2Fyc2VFeHBIaSA9CisJCQkJCQl2YWwgPj4gODsKKwkJCQkJbmV3X3BhcmFtcy5leHBvc3VyZS5leHBNb2RlID0gMTsKKwkJCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVEVYUE9TVVJFOworCQkJCQlpZihuZXdfcGFyYW1zLmZsaWNrZXJDb250cm9sLmZsaWNrZXJNb2RlICE9IDApCisJCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURkxJQ0tFUkNUUkw7CisJCQkJCW5ld19wYXJhbXMuZmxpY2tlckNvbnRyb2wuZmxpY2tlck1vZGUgPSAwOworCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURkxJQ0tFUkNUUkw7CisJCQkJfSBlbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoTUFUQ0goInJlZF9jb21wIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWlmICh2YWwgPj0gQ09NUF9SRUQgJiYgdmFsIDw9IDI1NSkgeworCQkJCQluZXdfcGFyYW1zLmV4cG9zdXJlLnJlZENvbXAgPSB2YWw7CisJCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuY29tcE1vZGUgPSAxOworCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURVhQT1NVUkU7CisJCQkJfSBlbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoTUFUQ0goImdyZWVuMV9jb21wIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWlmICh2YWwgPj0gQ09NUF9HUkVFTjEgJiYgdmFsIDw9IDI1NSkgeworCQkJCQluZXdfcGFyYW1zLmV4cG9zdXJlLmdyZWVuMUNvbXAgPSB2YWw7CisJCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuY29tcE1vZGUgPSAxOworCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURVhQT1NVUkU7CisJCQkJfSBlbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoTUFUQ0goImdyZWVuMl9jb21wIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWlmICh2YWwgPj0gQ09NUF9HUkVFTjIgJiYgdmFsIDw9IDI1NSkgeworCQkJCQluZXdfcGFyYW1zLmV4cG9zdXJlLmdyZWVuMkNvbXAgPSB2YWw7CisJCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuY29tcE1vZGUgPSAxOworCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURVhQT1NVUkU7CisJCQkJfSBlbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoTUFUQ0goImJsdWVfY29tcCIpKSB7CisJCQlpZiAoIXJldHZhbCkKKwkJCQl2YWwgPSBWQUxVRTsKKworCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQlpZiAodmFsID49IENPTVBfQkxVRSAmJiB2YWwgPD0gMjU1KSB7CisJCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuYmx1ZUNvbXAgPSB2YWw7CisJCQkJCW5ld19wYXJhbXMuZXhwb3N1cmUuY29tcE1vZGUgPSAxOworCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURVhQT1NVUkU7CisJCQkJfSBlbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoTUFUQ0goImFwY29yX2dhaW4xIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRBUENPUjsKKwkJCQlpZiAodmFsIDw9IDB4ZmYpCisJCQkJCW5ld19wYXJhbXMuYXBjb3IuZ2FpbjEgPSB2YWw7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQl9IGVsc2UgaWYgKE1BVENIKCJhcGNvcl9nYWluMiIpKSB7CisJCQlpZiAoIXJldHZhbCkKKwkJCQl2YWwgPSBWQUxVRTsKKworCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VUQVBDT1I7CisJCQkJaWYgKHZhbCA8PSAweGZmKQorCQkJCQluZXdfcGFyYW1zLmFwY29yLmdhaW4yID0gdmFsOworCQkJCWVsc2UKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIGlmIChNQVRDSCgiYXBjb3JfZ2FpbjQiKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVEFQQ09SOworCQkJCWlmICh2YWwgPD0gMHhmZikKKwkJCQkJbmV3X3BhcmFtcy5hcGNvci5nYWluNCA9IHZhbDsKKwkJCQllbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoTUFUQ0goImFwY29yX2dhaW44IikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRBUENPUjsKKwkJCQlpZiAodmFsIDw9IDB4ZmYpCisJCQkJCW5ld19wYXJhbXMuYXBjb3IuZ2FpbjggPSB2YWw7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQl9IGVsc2UgaWYgKE1BVENIKCJ2bF9vZmZzZXRfZ2FpbjEiKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJaWYgKHZhbCA8PSAweGZmKQorCQkJCQluZXdfcGFyYW1zLnZsT2Zmc2V0LmdhaW4xID0gdmFsOworCQkJCWVsc2UKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCX0KKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRWTE9GRlNFVDsKKwkJfSBlbHNlIGlmIChNQVRDSCgidmxfb2Zmc2V0X2dhaW4yIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWlmICh2YWwgPD0gMHhmZikKKwkJCQkJbmV3X3BhcmFtcy52bE9mZnNldC5nYWluMiA9IHZhbDsKKwkJCQllbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VUVkxPRkZTRVQ7CisJCX0gZWxzZSBpZiAoTUFUQ0goInZsX29mZnNldF9nYWluNCIpKSB7CisJCQlpZiAoIXJldHZhbCkKKwkJCQl2YWwgPSBWQUxVRTsKKworCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQlpZiAodmFsIDw9IDB4ZmYpCisJCQkJCW5ld19wYXJhbXMudmxPZmZzZXQuZ2FpbjQgPSB2YWw7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVFZMT0ZGU0VUOworCQl9IGVsc2UgaWYgKE1BVENIKCJ2bF9vZmZzZXRfZ2FpbjgiKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJaWYgKHZhbCA8PSAweGZmKQorCQkJCQluZXdfcGFyYW1zLnZsT2Zmc2V0LmdhaW44ID0gdmFsOworCQkJCWVsc2UKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCX0KKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRWTE9GRlNFVDsKKwkJfSBlbHNlIGlmIChNQVRDSCgiZmxpY2tlcl9jb250cm9sIikpIHsKKwkJCWlmICghcmV0dmFsICYmIE1BVENIKCJvbiIpKSB7CisJCQkJc2V0X2ZsaWNrZXIoJm5ld19wYXJhbXMsICZjb21tYW5kX2ZsYWdzLCAxKTsKKwkJCX0gZWxzZSBpZiAoIXJldHZhbCAmJiBNQVRDSCgib2ZmIikpIHsKKwkJCQlzZXRfZmxpY2tlcigmbmV3X3BhcmFtcywgJmNvbW1hbmRfZmxhZ3MsIDApOworCQkJfSBlbHNlCisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKworCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVEZMSUNLRVJDVFJMOworCQl9IGVsc2UgaWYgKE1BVENIKCJtYWluc19mcmVxdWVuY3kiKSkgeworCQkJaWYgKCFyZXR2YWwgJiYgTUFUQ0goIjUwIikpIHsKKwkJCQluZXdfbWFpbnMgPSAwOworCQkJCW5ld19wYXJhbXMuZmxpY2tlckNvbnRyb2wuY29hcnNlSnVtcCA9IAorCQkJCQlmbGlja2VyX2p1bXBzW25ld19tYWluc10KKwkJCQkJW25ld19wYXJhbXMuc2Vuc29yRnBzLmJhc2VyYXRlXQorCQkJCQlbbmV3X3BhcmFtcy5zZW5zb3JGcHMuZGl2aXNvcl07CisJCQkJaWYgKG5ld19wYXJhbXMuZmxpY2tlckNvbnRyb2wuZmxpY2tlck1vZGUpCisJCQkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRGTElDS0VSQ1RSTDsKKwkJCX0gZWxzZSBpZiAoIXJldHZhbCAmJiBNQVRDSCgiNjAiKSkgeworCQkJCW5ld19tYWlucyA9IDE7CisJCQkJbmV3X3BhcmFtcy5mbGlja2VyQ29udHJvbC5jb2Fyc2VKdW1wID0gCisJCQkJCWZsaWNrZXJfanVtcHNbbmV3X21haW5zXQorCQkJCQlbbmV3X3BhcmFtcy5zZW5zb3JGcHMuYmFzZXJhdGVdCisJCQkJCVtuZXdfcGFyYW1zLnNlbnNvckZwcy5kaXZpc29yXTsKKwkJCQlpZiAobmV3X3BhcmFtcy5mbGlja2VyQ29udHJvbC5mbGlja2VyTW9kZSkKKwkJCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVEZMSUNLRVJDVFJMOworCQkJfSBlbHNlCisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJfSBlbHNlIGlmIChNQVRDSCgiYWxsb3dhYmxlX292ZXJleHBvc3VyZSIpKSB7CisJCQlpZiAoIXJldHZhbCAmJiBNQVRDSCgiYXV0byIpKSB7CisJCQkJbmV3X3BhcmFtcy5mbGlja2VyQ29udHJvbC5hbGxvd2FibGVPdmVyRXhwb3N1cmUgPSAKKwkJCQkJLWZpbmRfb3Zlcl9leHBvc3VyZShuZXdfcGFyYW1zLmNvbG91clBhcmFtcy5icmlnaHRuZXNzKTsKKwkJCQlpZihuZXdfcGFyYW1zLmZsaWNrZXJDb250cm9sLmZsaWNrZXJNb2RlICE9IDApCisJCQkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRGTElDS0VSQ1RSTDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFyZXR2YWwpCisJCQkJCXZhbCA9IFZBTFVFOworCisJCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQkJaWYgKHZhbCA8PSAweGZmKSB7CisJCQkJCQluZXdfcGFyYW1zLmZsaWNrZXJDb250cm9sLgorCQkJCQkJCWFsbG93YWJsZU92ZXJFeHBvc3VyZSA9IHZhbDsKKwkJCQkJCWlmKG5ld19wYXJhbXMuZmxpY2tlckNvbnRyb2wuZmxpY2tlck1vZGUgIT0gMCkKKwkJCQkJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURkxJQ0tFUkNUUkw7CisJCQkJCX0gZWxzZQorCQkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoTUFUQ0goImNvbXByZXNzaW9uX21vZGUiKSkgeworCQkJaWYgKCFyZXR2YWwgJiYgTUFUQ0goIm5vbmUiKSkKKwkJCQluZXdfcGFyYW1zLmNvbXByZXNzaW9uLm1vZGUgPQorCQkJCQlDUElBX0NPTVBSRVNTSU9OX05PTkU7CisJCQllbHNlIGlmICghcmV0dmFsICYmIE1BVENIKCJhdXRvIikpCisJCQkJbmV3X3BhcmFtcy5jb21wcmVzc2lvbi5tb2RlID0KKwkJCQkJQ1BJQV9DT01QUkVTU0lPTl9BVVRPOworCQkJZWxzZSBpZiAoIXJldHZhbCAmJiBNQVRDSCgibWFudWFsIikpCisJCQkJbmV3X3BhcmFtcy5jb21wcmVzc2lvbi5tb2RlID0KKwkJCQkJQ1BJQV9DT01QUkVTU0lPTl9NQU5VQUw7CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKworCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVENPTVBSRVNTSU9OOworCQl9IGVsc2UgaWYgKE1BVENIKCJkZWNpbWF0aW9uX2VuYWJsZSIpKSB7CisJCQlpZiAoIXJldHZhbCAmJiBNQVRDSCgib2ZmIikpCisJCQkJbmV3X3BhcmFtcy5jb21wcmVzc2lvbi5kZWNpbWF0aW9uID0gMDsKKwkJCWVsc2UgaWYgKCFyZXR2YWwgJiYgTUFUQ0goIm9uIikpCisJCQkJbmV3X3BhcmFtcy5jb21wcmVzc2lvbi5kZWNpbWF0aW9uID0gMTsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCisJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VUQ09NUFJFU1NJT047CisJCX0gZWxzZSBpZiAoTUFUQ0goImNvbXByZXNzaW9uX3RhcmdldCIpKSB7CisJCQlpZiAoIXJldHZhbCAmJiBNQVRDSCgicXVhbGl0eSIpKQorCQkJCW5ld19wYXJhbXMuY29tcHJlc3Npb25UYXJnZXQuZnJUYXJnZXRpbmcgPSAKKwkJCQkJQ1BJQV9DT01QUkVTU0lPTl9UQVJHRVRfUVVBTElUWTsKKwkJCWVsc2UgaWYgKCFyZXR2YWwgJiYgTUFUQ0goImZyYW1lcmF0ZSIpKQorCQkJCW5ld19wYXJhbXMuY29tcHJlc3Npb25UYXJnZXQuZnJUYXJnZXRpbmcgPSAKKwkJCQkJQ1BJQV9DT01QUkVTU0lPTl9UQVJHRVRfRlJBTUVSQVRFOworCQkJZWxzZQorCQkJCXJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRDT01QUkVTU0lPTlRBUkdFVDsKKwkJfSBlbHNlIGlmIChNQVRDSCgidGFyZ2V0X2ZyYW1lcmF0ZSIpKSB7CisJCQlpZiAoIXJldHZhbCkKKwkJCQl2YWwgPSBWQUxVRTsKKworCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQlpZih2YWwgPiAwICYmIHZhbCA8PSAzMCkKKwkJCQkJbmV3X3BhcmFtcy5jb21wcmVzc2lvblRhcmdldC50YXJnZXRGUiA9IHZhbDsKKwkJCQllbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VUQ09NUFJFU1NJT05UQVJHRVQ7CisJCX0gZWxzZSBpZiAoTUFUQ0goInRhcmdldF9xdWFsaXR5IikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWlmKHZhbCA+IDAgJiYgdmFsIDw9IDY0KQorCQkJCQluZXdfcGFyYW1zLmNvbXByZXNzaW9uVGFyZ2V0LnRhcmdldFEgPSB2YWw7CisJCQkJZWxzZSAKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCX0KKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRDT01QUkVTU0lPTlRBUkdFVDsKKwkJfSBlbHNlIGlmIChNQVRDSCgieV90aHJlc2hvbGQiKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJaWYgKHZhbCA8IDMyKQorCQkJCQluZXdfcGFyYW1zLnl1dlRocmVzaG9sZC55VGhyZXNob2xkID0gdmFsOworCQkJCWVsc2UKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCX0KKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRZVVZUSFJFU0g7CisJCX0gZWxzZSBpZiAoTUFUQ0goInV2X3RocmVzaG9sZCIpKSB7CisJCQlpZiAoIXJldHZhbCkKKwkJCQl2YWwgPSBWQUxVRTsKKworCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQlpZiAodmFsIDwgMzIpCisJCQkJCW5ld19wYXJhbXMueXV2VGhyZXNob2xkLnV2VGhyZXNob2xkID0gdmFsOworCQkJCWVsc2UKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCX0KKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRZVVZUSFJFU0g7CisJCX0gZWxzZSBpZiAoTUFUQ0goImh5c3RlcmVzaXMiKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJaWYgKHZhbCA8PSAweGZmKQorCQkJCQluZXdfcGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLmh5c3RlcmVzaXMgPSB2YWw7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVENPTVBSRVNTSU9OUEFSQU1TOworCQl9IGVsc2UgaWYgKE1BVENIKCJ0aHJlc2hvbGRfbWF4IikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWlmICh2YWwgPD0gMHhmZikKKwkJCQkJbmV3X3BhcmFtcy5jb21wcmVzc2lvblBhcmFtcy50aHJlc2hNYXggPSB2YWw7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVENPTVBSRVNTSU9OUEFSQU1TOworCQl9IGVsc2UgaWYgKE1BVENIKCJzbWFsbF9zdGVwIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWlmICh2YWwgPD0gMHhmZikKKwkJCQkJbmV3X3BhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5zbWFsbFN0ZXAgPSB2YWw7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVENPTVBSRVNTSU9OUEFSQU1TOworCQl9IGVsc2UgaWYgKE1BVENIKCJsYXJnZV9zdGVwIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWlmICh2YWwgPD0gMHhmZikKKwkJCQkJbmV3X3BhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5sYXJnZVN0ZXAgPSB2YWw7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfQorCQkJY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVENPTVBSRVNTSU9OUEFSQU1TOworCQl9IGVsc2UgaWYgKE1BVENIKCJkZWNpbWF0aW9uX2h5c3RlcmVzaXMiKSkgeworCQkJaWYgKCFyZXR2YWwpCisJCQkJdmFsID0gVkFMVUU7CisKKwkJCWlmICghcmV0dmFsKSB7CisJCQkJaWYgKHZhbCA8PSAweGZmKQorCQkJCQluZXdfcGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLmRlY2ltYXRpb25IeXN0ZXJlc2lzID0gdmFsOworCQkJCWVsc2UKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCX0KKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRDT01QUkVTU0lPTlBBUkFNUzsKKwkJfSBlbHNlIGlmIChNQVRDSCgiZnJfZGlmZl9zdGVwX3RocmVzaCIpKSB7CisJCQlpZiAoIXJldHZhbCkKKwkJCQl2YWwgPSBWQUxVRTsKKworCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQlpZiAodmFsIDw9IDB4ZmYpCisJCQkJCW5ld19wYXJhbXMuY29tcHJlc3Npb25QYXJhbXMuZnJEaWZmU3RlcFRocmVzaCA9IHZhbDsKKwkJCQllbHNlCisJCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQl9CisJCQljb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VUQ09NUFJFU1NJT05QQVJBTVM7CisJCX0gZWxzZSBpZiAoTUFUQ0goInFfZGlmZl9zdGVwX3RocmVzaCIpKSB7CisJCQlpZiAoIXJldHZhbCkKKwkJCQl2YWwgPSBWQUxVRTsKKworCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQlpZiAodmFsIDw9IDB4ZmYpCisJCQkJCW5ld19wYXJhbXMuY29tcHJlc3Npb25QYXJhbXMucURpZmZTdGVwVGhyZXNoID0gdmFsOworCQkJCWVsc2UKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCX0KKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRDT01QUkVTU0lPTlBBUkFNUzsKKwkJfSBlbHNlIGlmIChNQVRDSCgiZGVjaW1hdGlvbl90aHJlc2hfbW9kIikpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXZhbCA9IFZBTFVFOworCisJCQlpZiAoIXJldHZhbCkgeworCQkJCWlmICh2YWwgPD0gMHhmZikKKwkJCQkJbmV3X3BhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5kZWNpbWF0aW9uVGhyZXNoTW9kID0gdmFsOworCQkJCWVsc2UKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCX0KKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRDT01QUkVTU0lPTlBBUkFNUzsKKwkJfSBlbHNlIGlmIChNQVRDSCgidG9wbGlnaHQiKSkgeworCQkgICAgICAgIGlmICghcmV0dmFsICYmIE1BVENIKCJvbiIpKQorCQkJCW5ld19wYXJhbXMucXgzLnRvcGxpZ2h0ID0gMTsKKwkJCWVsc2UgaWYgKCFyZXR2YWwgJiYgTUFUQ0goIm9mZiIpKQorCQkJCW5ld19wYXJhbXMucXgzLnRvcGxpZ2h0ID0gMDsKKwkJCWVsc2UgCisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRMSUdIVFM7CisJCX0gZWxzZSBpZiAoTUFUQ0goImJvdHRvbWxpZ2h0IikpIHsKKwkJICAgICAgICBpZiAoIXJldHZhbCAmJiBNQVRDSCgib24iKSkKKwkJCQluZXdfcGFyYW1zLnF4My5ib3R0b21saWdodCA9IDE7CisJCQllbHNlIGlmICghcmV0dmFsICYmIE1BVENIKCJvZmYiKSkgIAorCQkJCW5ld19wYXJhbXMucXgzLmJvdHRvbWxpZ2h0ID0gMDsKKwkJCWVsc2UgCisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRMSUdIVFM7CisJCX0gZWxzZSB7CisJCQlEQkcoIk5vIG1hdGNoIGZvdW5kXG4iKTsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCX0KKworCQlpZiAoIXJldHZhbCkgeworCQkJd2hpbGUgKGNvdW50ICYmIGlzc3BhY2UoKmJ1ZmZlcikgJiYgKmJ1ZmZlciAhPSAnXG4nKSB7CisJCQkJLS1jb3VudDsKKwkJCQkrK2J1ZmZlcjsKKwkJCX0KKwkJCWlmIChjb3VudCkgeworCQkJCWlmICgqYnVmZmVyID09ICdcMCcgJiYgY291bnQgIT0gMSkKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCQllbHNlIGlmICgqYnVmZmVyICE9ICdcbicgJiYgKmJ1ZmZlciAhPSAnOycgJiYKKwkJCQkJICpidWZmZXIgIT0gJ1wwJykKKwkJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCQllbHNlIHsKKwkJCQkJLS1jb3VudDsKKwkJCQkJKytidWZmZXI7CisJCQkJfQorCQkJfQorCQl9CisJfQorI3VuZGVmIE1BVENICQorI3VuZGVmIFZBTFVFCisjdW5kZWYgRklSTVdBUkVfVkVSU0lPTgorCWlmICghcmV0dmFsKSB7CisJCWlmIChjb21tYW5kX2ZsYWdzICYgQ09NTUFORF9TRVRDT0xPVVJQQVJBTVMpIHsKKwkJCS8qIEFkanVzdCBjYW0tPnZwIHRvIHJlZmxlY3QgdGhlc2UgY2hhbmdlcyAqLworCQkJY2FtLT52cC5icmlnaHRuZXNzID0KKwkJCQluZXdfcGFyYW1zLmNvbG91clBhcmFtcy5icmlnaHRuZXNzKjY1NTM1LzEwMDsKKwkJCWNhbS0+dnAuY29udHJhc3QgPQorCQkJCW5ld19wYXJhbXMuY29sb3VyUGFyYW1zLmNvbnRyYXN0KjY1NTM1LzEwMDsKKwkJCWNhbS0+dnAuY29sb3VyID0KKwkJCQluZXdfcGFyYW1zLmNvbG91clBhcmFtcy5zYXR1cmF0aW9uKjY1NTM1LzEwMDsKKwkJfQorCQlpZigoY29tbWFuZF9mbGFncyAmIENPTU1BTkRfU0VURVhQT1NVUkUpICYmCisJCSAgIG5ld19wYXJhbXMuZXhwb3N1cmUuZXhwTW9kZSA9PSAyKQorCQkJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9OT1JNQUw7CisKKwkJbWVtY3B5KCZjYW0tPnBhcmFtcywgJm5ld19wYXJhbXMsIHNpemVvZihzdHJ1Y3QgY2FtX3BhcmFtcykpOworCQljYW0tPm1haW5zRnJlcSA9IG5ld19tYWluczsKKwkJY2FtLT5jbWRfcXVldWUgfD0gY29tbWFuZF9mbGFnczsKKwkJcmV0dmFsID0gc2l6ZTsKKwl9IGVsc2UKKwkJREJHKCJlcnJvcjogJWRcbiIsIHJldHZhbCk7CisJCisJdXAoJmNhbS0+cGFyYW1fbG9jayk7CisJCitvdXQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworIAlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcHJvY19jcGlhX2NhbShzdHJ1Y3QgY2FtX2RhdGEgKmNhbSkKK3sKKwljaGFyIG5hbWVbN107CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisJCisJaWYgKCFjcGlhX3Byb2Nfcm9vdCB8fCAhY2FtKQorCQlyZXR1cm47CisKKwlzcHJpbnRmKG5hbWUsICJ2aWRlbyVkIiwgY2FtLT52ZGV2Lm1pbm9yKTsKKwkKKwllbnQgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgY3BpYV9wcm9jX3Jvb3QpOworCWlmICghZW50KQorCQlyZXR1cm47CisKKwllbnQtPmRhdGEgPSBjYW07CisJZW50LT5yZWFkX3Byb2MgPSBjcGlhX3JlYWRfcHJvYzsKKwllbnQtPndyaXRlX3Byb2MgPSBjcGlhX3dyaXRlX3Byb2M7CisJLyogCisJICAgc2l6ZSBvZiB0aGUgcHJvYyBlbnRyeSBpcyAzNzM2IGJ5dGVzIGZvciB0aGUgc3RhbmRhcmQgd2ViY2FtOworIAkgICB0aGUgZXh0cmEgZmVhdHVyZXMgb2YgdGhlIFFYMyBtaWNyb3Njb3BlIGFkZCAxODkgYnl0ZXMuCisJICAgKHdlIGhhdmUgbm90IHlldCBwcm9iZWQgdGhlIGNhbWVyYSB0byBzZWUgd2hpY2ggdHlwZSBpdCBpcykuCisJKi8KKwllbnQtPnNpemUgPSAzNzM2ICsgMTg5OworCWNhbS0+cHJvY19lbnRyeSA9IGVudDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9wcm9jX2NwaWFfY2FtKHN0cnVjdCBjYW1fZGF0YSAqY2FtKQoreworCWNoYXIgbmFtZVs3XTsKKwkKKwlpZiAoIWNhbSB8fCAhY2FtLT5wcm9jX2VudHJ5KQorCQlyZXR1cm47CisJCisJc3ByaW50ZihuYW1lLCAidmlkZW8lZCIsIGNhbS0+dmRldi5taW5vcik7CisJcmVtb3ZlX3Byb2NfZW50cnkobmFtZSwgY3BpYV9wcm9jX3Jvb3QpOworCWNhbS0+cHJvY19lbnRyeSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHByb2NfY3BpYV9jcmVhdGUodm9pZCkKK3sKKwljcGlhX3Byb2Nfcm9vdCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJjcGlhIiwgU19JRkRJUiwgTlVMTCk7CisKKwlpZiAoY3BpYV9wcm9jX3Jvb3QpCisJCWNwaWFfcHJvY19yb290LT5vd25lciA9IFRISVNfTU9EVUxFOworCWVsc2UKKwkJTE9HKCJVbmFibGUgdG8gaW5pdGlhbGlzZSAvcHJvYy9jcGlhXG4iKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHByb2NfY3BpYV9kZXN0cm95KHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImNwaWEiLCBOVUxMKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWJ1ZyBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIHByaW50c3RhdHVzKGNhbSkgXAorICBEQkcoIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIixcCisJY2FtLT5wYXJhbXMuc3RhdHVzLnN5c3RlbVN0YXRlLCBjYW0tPnBhcmFtcy5zdGF0dXMuZ3JhYlN0YXRlLCBcCisJY2FtLT5wYXJhbXMuc3RhdHVzLnN0cmVhbVN0YXRlLCBjYW0tPnBhcmFtcy5zdGF0dXMuZmF0YWxFcnJvciwgXAorCWNhbS0+cGFyYW1zLnN0YXR1cy5jbWRFcnJvciwgY2FtLT5wYXJhbXMuc3RhdHVzLmRlYnVnRmxhZ3MsIFwKKwljYW0tPnBhcmFtcy5zdGF0dXMudnBTdGF0dXMsIGNhbS0+cGFyYW1zLnN0YXR1cy5lcnJvckNvZGUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB2NGwgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBzdXBwb3J0ZWQgZnJhbWUgcGFsZXR0ZXMgYW5kIGRlcHRocyAqLworc3RhdGljIGlubGluZSBpbnQgdmFsaWRfbW9kZSh1MTYgcGFsZXR0ZSwgdTE2IGRlcHRoKQoreworCWlmICgocGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1lVVjQyMiAmJiBkZXB0aCA9PSAxNikgfHwKKwkgICAgKHBhbGV0dGUgPT0gVklERU9fUEFMRVRURV9ZVVlWICYmIGRlcHRoID09IDE2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoY29sb3JzcGFjZV9jb252KQorCQlyZXR1cm4gKHBhbGV0dGUgPT0gVklERU9fUEFMRVRURV9HUkVZICYmIGRlcHRoID09IDgpIHx8CisJCSAgICAgICAocGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1JHQjU1NSAmJiBkZXB0aCA9PSAxNikgfHwKKwkJICAgICAgIChwYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkdCNTY1ICYmIGRlcHRoID09IDE2KSB8fAorCQkgICAgICAgKHBhbGV0dGUgPT0gVklERU9fUEFMRVRURV9SR0IyNCAmJiBkZXB0aCA9PSAyNCkgfHwKKwkJICAgICAgIChwYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkdCMzIgJiYgZGVwdGggPT0gMzIpIHx8CisJCSAgICAgICAocGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1VZVlkgJiYgZGVwdGggPT0gMTYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfdmlkZW9zaXplKCBpbnQgd2lkdGgsIGludCBoZWlnaHQgKQoreworCS8qIHJldHVybiB0aGUgYmVzdCBtYXRjaCwgd2hlcmUgJ2Jlc3QnIGlzIGFzIGFsd2F5cworCSAqIHRoZSBsYXJnZXN0IHRoYXQgaXMgbm90IGJpZ2dlciB0aGFuIHdoYXQgaXMgcmVxdWVzdGVkLiAqLworCWlmICh3aWR0aD49MzUyICYmIGhlaWdodD49Mjg4KQorCQlyZXR1cm4gVklERU9TSVpFXzM1Ml8yODg7IC8qIENJRiAqLworCisJaWYgKHdpZHRoPj0zMjAgJiYgaGVpZ2h0Pj0yNDApCisJCXJldHVybiBWSURFT1NJWkVfMzIwXzI0MDsgLyogU0lGICovCisKKwlpZiAod2lkdGg+PTI4OCAmJiBoZWlnaHQ+PTIxNikKKwkJcmV0dXJuIFZJREVPU0laRV8yODhfMjE2OworCisJaWYgKHdpZHRoPj0yNTYgJiYgaGVpZ2h0Pj0xOTIpCisJCXJldHVybiBWSURFT1NJWkVfMjU2XzE5MjsKKworCWlmICh3aWR0aD49MjI0ICYmIGhlaWdodD49MTY4KQorCQlyZXR1cm4gVklERU9TSVpFXzIyNF8xNjg7CisKKwlpZiAod2lkdGg+PTE5MiAmJiBoZWlnaHQ+PTE0NCkKKwkJcmV0dXJuIFZJREVPU0laRV8xOTJfMTQ0OworCisJaWYgKHdpZHRoPj0xNzYgJiYgaGVpZ2h0Pj0xNDQpCisJCXJldHVybiBWSURFT1NJWkVfMTc2XzE0NDsgLyogUUNJRiAqLworCisJaWYgKHdpZHRoPj0xNjAgJiYgaGVpZ2h0Pj0xMjApCisJCXJldHVybiBWSURFT1NJWkVfMTYwXzEyMDsgLyogUVNJRiAqLworCisJaWYgKHdpZHRoPj0xMjggJiYgaGVpZ2h0Pj05NikKKwkJcmV0dXJuIFZJREVPU0laRV8xMjhfOTY7CisKKwlpZiAod2lkdGg+PTg4ICYmIGhlaWdodD49NzIpCisJCXJldHVybiBWSURFT1NJWkVfODhfNzI7CisKKwlpZiAod2lkdGg+PTY0ICYmIGhlaWdodD49NDgpCisJCXJldHVybiBWSURFT1NJWkVfNjRfNDg7CisKKwlpZiAod2lkdGg+PTQ4ICYmIGhlaWdodD49NDgpCisJCXJldHVybiBWSURFT1NJWkVfNDhfNDg7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIHRoZXNlIGFyZSB0aGUgY2FwdHVyZSBzaXplcyB3ZSBzdXBwb3J0ICovCitzdGF0aWMgdm9pZCBzZXRfdndfc2l6ZShzdHJ1Y3QgY2FtX2RhdGEgKmNhbSkKK3sKKwkvKiB0aGUgY29sL3Jvdy9zdGFydC9lbmQgdmFsdWVzIGFyZSB0aGUgcmVzdWx0IG9mIHNpbXBsZSBtYXRoICAgICovCisJLyogc3R1ZHkgdGhlIFNldFJPSS1jb21tYW5kIGluIGNwaWEgZGV2ZWxvcGVycyBndWlkZSBwIDItMjIgICAgICAqLworCS8qIHN0cmVhbVN0YXJ0TGluZSBpcyBzZXQgdG8gdGhlIHJlY29tbWVuZGVkIHZhbHVlIGluIHRoZSBjcGlhICAgKi8KKwkvKiAgZGV2ZWxvcGVycyBndWlkZSBwIDMtMzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJc3dpdGNoKGNhbS0+dmlkZW9fc2l6ZSkgeworCWNhc2UgVklERU9TSVpFX0NJRjoKKwkJY2FtLT52dy53aWR0aCA9IDM1MjsKKwkJY2FtLT52dy5oZWlnaHQgPSAyODg7CisJCWNhbS0+cGFyYW1zLmZvcm1hdC52aWRlb1NpemU9VklERU9TSVpFX0NJRjsKKwkJY2FtLT5wYXJhbXMucm9pLmNvbFN0YXJ0PTA7CisJCWNhbS0+cGFyYW1zLnJvaS5yb3dTdGFydD0wOworCQljYW0tPnBhcmFtcy5zdHJlYW1TdGFydExpbmUgPSAxMjA7CisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFX1NJRjoKKwkJY2FtLT52dy53aWR0aCA9IDMyMDsKKwkJY2FtLT52dy5oZWlnaHQgPSAyNDA7CisJCWNhbS0+cGFyYW1zLmZvcm1hdC52aWRlb1NpemU9VklERU9TSVpFX0NJRjsKKwkJY2FtLT5wYXJhbXMucm9pLmNvbFN0YXJ0PTI7CisJCWNhbS0+cGFyYW1zLnJvaS5yb3dTdGFydD02OworCQljYW0tPnBhcmFtcy5zdHJlYW1TdGFydExpbmUgPSAxMjA7CisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzI4OF8yMTY6CisJCWNhbS0+dncud2lkdGggPSAyODg7CisJCWNhbS0+dncuaGVpZ2h0ID0gMjE2OworCQljYW0tPnBhcmFtcy5mb3JtYXQudmlkZW9TaXplPVZJREVPU0laRV9DSUY7CisJCWNhbS0+cGFyYW1zLnJvaS5jb2xTdGFydD00OworCQljYW0tPnBhcmFtcy5yb2kucm93U3RhcnQ9OTsKKwkJY2FtLT5wYXJhbXMuc3RyZWFtU3RhcnRMaW5lID0gMTIwOworCQlicmVhazsKKwljYXNlIFZJREVPU0laRV8yNTZfMTkyOgorCQljYW0tPnZ3LndpZHRoID0gMjU2OworCQljYW0tPnZ3LmhlaWdodCA9IDE5MjsKKwkJY2FtLT5wYXJhbXMuZm9ybWF0LnZpZGVvU2l6ZT1WSURFT1NJWkVfQ0lGOworCQljYW0tPnBhcmFtcy5yb2kuY29sU3RhcnQ9NjsKKwkJY2FtLT5wYXJhbXMucm9pLnJvd1N0YXJ0PTEyOworCQljYW0tPnBhcmFtcy5zdHJlYW1TdGFydExpbmUgPSAxMjA7CisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzIyNF8xNjg6CisJCWNhbS0+dncud2lkdGggPSAyMjQ7CisJCWNhbS0+dncuaGVpZ2h0ID0gMTY4OworCQljYW0tPnBhcmFtcy5mb3JtYXQudmlkZW9TaXplPVZJREVPU0laRV9DSUY7CisJCWNhbS0+cGFyYW1zLnJvaS5jb2xTdGFydD04OworCQljYW0tPnBhcmFtcy5yb2kucm93U3RhcnQ9MTU7CisJCWNhbS0+cGFyYW1zLnN0cmVhbVN0YXJ0TGluZSA9IDEyMDsKKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfMTkyXzE0NDoKKwkJY2FtLT52dy53aWR0aCA9IDE5MjsKKwkJY2FtLT52dy5oZWlnaHQgPSAxNDQ7CisJCWNhbS0+cGFyYW1zLmZvcm1hdC52aWRlb1NpemU9VklERU9TSVpFX0NJRjsKKwkJY2FtLT5wYXJhbXMucm9pLmNvbFN0YXJ0PTEwOworCQljYW0tPnBhcmFtcy5yb2kucm93U3RhcnQ9MTg7CisJCWNhbS0+cGFyYW1zLnN0cmVhbVN0YXJ0TGluZSA9IDEyMDsKKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfUUNJRjoKKwkJY2FtLT52dy53aWR0aCA9IDE3NjsKKwkJY2FtLT52dy5oZWlnaHQgPSAxNDQ7CisJCWNhbS0+cGFyYW1zLmZvcm1hdC52aWRlb1NpemU9VklERU9TSVpFX1FDSUY7CisJCWNhbS0+cGFyYW1zLnJvaS5jb2xTdGFydD0wOworCQljYW0tPnBhcmFtcy5yb2kucm93U3RhcnQ9MDsKKwkJY2FtLT5wYXJhbXMuc3RyZWFtU3RhcnRMaW5lID0gNjA7CisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFX1FTSUY6CisJCWNhbS0+dncud2lkdGggPSAxNjA7CisJCWNhbS0+dncuaGVpZ2h0ID0gMTIwOworCQljYW0tPnBhcmFtcy5mb3JtYXQudmlkZW9TaXplPVZJREVPU0laRV9RQ0lGOworCQljYW0tPnBhcmFtcy5yb2kuY29sU3RhcnQ9MTsKKwkJY2FtLT5wYXJhbXMucm9pLnJvd1N0YXJ0PTM7CisJCWNhbS0+cGFyYW1zLnN0cmVhbVN0YXJ0TGluZSA9IDYwOworCQlicmVhazsKKwljYXNlIFZJREVPU0laRV8xMjhfOTY6CisJCWNhbS0+dncud2lkdGggPSAxMjg7CisJCWNhbS0+dncuaGVpZ2h0ID0gOTY7CisJCWNhbS0+cGFyYW1zLmZvcm1hdC52aWRlb1NpemU9VklERU9TSVpFX1FDSUY7CisJCWNhbS0+cGFyYW1zLnJvaS5jb2xTdGFydD0zOworCQljYW0tPnBhcmFtcy5yb2kucm93U3RhcnQ9NjsKKwkJY2FtLT5wYXJhbXMuc3RyZWFtU3RhcnRMaW5lID0gNjA7CisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzg4XzcyOgorCQljYW0tPnZ3LndpZHRoID0gODg7CisJCWNhbS0+dncuaGVpZ2h0ID0gNzI7CisJCWNhbS0+cGFyYW1zLmZvcm1hdC52aWRlb1NpemU9VklERU9TSVpFX1FDSUY7CisJCWNhbS0+cGFyYW1zLnJvaS5jb2xTdGFydD01OworCQljYW0tPnBhcmFtcy5yb2kucm93U3RhcnQ9OTsKKwkJY2FtLT5wYXJhbXMuc3RyZWFtU3RhcnRMaW5lID0gNjA7CisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzY0XzQ4OgorCQljYW0tPnZ3LndpZHRoID0gNjQ7CisJCWNhbS0+dncuaGVpZ2h0ID0gNDg7CisJCWNhbS0+cGFyYW1zLmZvcm1hdC52aWRlb1NpemU9VklERU9TSVpFX1FDSUY7CisJCWNhbS0+cGFyYW1zLnJvaS5jb2xTdGFydD03OworCQljYW0tPnBhcmFtcy5yb2kucm93U3RhcnQ9MTI7CisJCWNhbS0+cGFyYW1zLnN0cmVhbVN0YXJ0TGluZSA9IDYwOworCQlicmVhazsKKwljYXNlIFZJREVPU0laRV80OF80ODoKKwkJY2FtLT52dy53aWR0aCA9IDQ4OworCQljYW0tPnZ3LmhlaWdodCA9IDQ4OworCQljYW0tPnBhcmFtcy5mb3JtYXQudmlkZW9TaXplPVZJREVPU0laRV9RQ0lGOworCQljYW0tPnBhcmFtcy5yb2kuY29sU3RhcnQ9ODsKKwkJY2FtLT5wYXJhbXMucm9pLnJvd1N0YXJ0PTY7CisJCWNhbS0+cGFyYW1zLnN0cmVhbVN0YXJ0TGluZSA9IDYwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0coImJhZCB2aWRlb3NpemUgdmFsdWU6ICVkXG4iLCBjYW0tPnZpZGVvX3NpemUpOworCQlyZXR1cm47CisJfQorCisJaWYoY2FtLT52Yy53aWR0aCA9PSAwKQorCQljYW0tPnZjLndpZHRoID0gY2FtLT52dy53aWR0aDsKKwlpZihjYW0tPnZjLmhlaWdodCA9PSAwKQorCQljYW0tPnZjLmhlaWdodCA9IGNhbS0+dncuaGVpZ2h0OworCQorCWNhbS0+cGFyYW1zLnJvaS5jb2xTdGFydCArPSBjYW0tPnZjLnggPj4gMzsKKwljYW0tPnBhcmFtcy5yb2kuY29sRW5kID0gY2FtLT5wYXJhbXMucm9pLmNvbFN0YXJ0ICsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbS0+dmMud2lkdGggPj4gMyk7CisJY2FtLT5wYXJhbXMucm9pLnJvd1N0YXJ0ICs9IGNhbS0+dmMueSA+PiAyOworCWNhbS0+cGFyYW1zLnJvaS5yb3dFbmQgPSBjYW0tPnBhcmFtcy5yb2kucm93U3RhcnQgKworCSAgICAgICAgICAgICAgICAgICAgICAgICAoY2FtLT52Yy5oZWlnaHQgPj4gMik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NhdGVfZnJhbWVfYnVmKHN0cnVjdCBjYW1fZGF0YSAqY2FtKQoreworCWludCBpOworCisJY2FtLT5mcmFtZV9idWYgPSBydm1hbGxvYyhGUkFNRV9OVU0gKiBDUElBX01BWF9GUkFNRV9TSVpFKTsKKwlpZiAoIWNhbS0+ZnJhbWVfYnVmKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfTlVNOyBpKyspCisJCWNhbS0+ZnJhbWVbaV0uZGF0YSA9IGNhbS0+ZnJhbWVfYnVmICsgaSAqIENQSUFfTUFYX0ZSQU1FX1NJWkU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmcmVlX2ZyYW1lX2J1ZihzdHJ1Y3QgY2FtX2RhdGEgKmNhbSkKK3sKKwlpbnQgaTsKKwkKKwlydmZyZWUoY2FtLT5mcmFtZV9idWYsIEZSQU1FX05VTSpDUElBX01BWF9GUkFNRV9TSVpFKTsKKwljYW0tPmZyYW1lX2J1ZiA9IE5VTEw7CisJZm9yIChpPTA7IGkgPCBGUkFNRV9OVU07IGkrKykKKwkJY2FtLT5mcmFtZVtpXS5kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2ZyYW1lcyhzdHJ1Y3QgY3BpYV9mcmFtZSBmcmFtZVtGUkFNRV9OVU1dKQoreworCWludCBpOworCisJZm9yIChpPTA7IGkgPCBGUkFNRV9OVU07IGkrKykKKwkJZnJhbWVbaV0uc3RhdGUgPSBGUkFNRV9VTlVTRUQ7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdlbmVyYWwgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzZW5kIGFuIGFyYml0cmFyeSBjb21tYW5kIHRvIHRoZSBjYW1lcmEgKi8KK3N0YXRpYyBpbnQgZG9fY29tbWFuZChzdHJ1Y3QgY2FtX2RhdGEgKmNhbSwgdTE2IGNvbW1hbmQsIHU4IGEsIHU4IGIsIHU4IGMsIHU4IGQpCit7CisJaW50IHJldHZhbCwgZGF0YXNpemU7CisJdTggY21kWzhdLCBkYXRhWzhdOworCisJc3dpdGNoKGNvbW1hbmQpIHsKKwljYXNlIENQSUFfQ09NTUFORF9HZXRDUElBVmVyc2lvbjoKKwljYXNlIENQSUFfQ09NTUFORF9HZXRQblBJRDoKKwljYXNlIENQSUFfQ09NTUFORF9HZXRDYW1lcmFTdGF0dXM6CisJY2FzZSBDUElBX0NPTU1BTkRfR2V0VlBWZXJzaW9uOgorCQlkYXRhc2l6ZT04OworCQlicmVhazsKKwljYXNlIENQSUFfQ09NTUFORF9HZXRDb2xvdXJQYXJhbXM6CisJY2FzZSBDUElBX0NPTU1BTkRfR2V0Q29sb3VyQmFsYW5jZToKKwljYXNlIENQSUFfQ09NTUFORF9HZXRFeHBvc3VyZToKKwkJZG93bigmY2FtLT5wYXJhbV9sb2NrKTsKKwkJZGF0YXNpemU9ODsKKwkJYnJlYWs7CisJY2FzZSBDUElBX0NPTU1BTkRfUmVhZE1DUG9ydHM6IAorCWNhc2UgQ1BJQV9DT01NQU5EX1JlYWRWQ1JlZ3M6CisJCWRhdGFzaXplID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGF0YXNpemU9MDsKKwkJYnJlYWs7CisJfQorCisJY21kWzBdID0gY29tbWFuZD4+ODsKKwljbWRbMV0gPSBjb21tYW5kJjB4ZmY7CisJY21kWzJdID0gYTsKKwljbWRbM10gPSBiOworCWNtZFs0XSA9IGM7CisJY21kWzVdID0gZDsKKwljbWRbNl0gPSBkYXRhc2l6ZTsKKwljbWRbN10gPSAwOworCisJcmV0dmFsID0gY2FtLT5vcHMtPnRyYW5zZmVyQ21kKGNhbS0+bG93bGV2ZWxfZGF0YSwgY21kLCBkYXRhKTsKKwlpZiAocmV0dmFsKSB7CisJCURCRygiJXggLSBmYWlsZWQsIHJldHZhbD0lZFxuIiwgY29tbWFuZCwgcmV0dmFsKTsKKwkJaWYgKGNvbW1hbmQgPT0gQ1BJQV9DT01NQU5EX0dldENvbG91clBhcmFtcyB8fAorCQkgICAgY29tbWFuZCA9PSBDUElBX0NPTU1BTkRfR2V0Q29sb3VyQmFsYW5jZSB8fAorCQkgICAgY29tbWFuZCA9PSBDUElBX0NPTU1BTkRfR2V0RXhwb3N1cmUpCisJCQl1cCgmY2FtLT5wYXJhbV9sb2NrKTsKKwl9IGVsc2UgeworCQlzd2l0Y2goY29tbWFuZCkgeworCQljYXNlIENQSUFfQ09NTUFORF9HZXRDUElBVmVyc2lvbjoKKwkJCWNhbS0+cGFyYW1zLnZlcnNpb24uZmlybXdhcmVWZXJzaW9uID0gZGF0YVswXTsKKwkJCWNhbS0+cGFyYW1zLnZlcnNpb24uZmlybXdhcmVSZXZpc2lvbiA9IGRhdGFbMV07CisJCQljYW0tPnBhcmFtcy52ZXJzaW9uLnZjVmVyc2lvbiA9IGRhdGFbMl07CisJCQljYW0tPnBhcmFtcy52ZXJzaW9uLnZjUmV2aXNpb24gPSBkYXRhWzNdOworCQkJYnJlYWs7CisJCWNhc2UgQ1BJQV9DT01NQU5EX0dldFBuUElEOgorCQkJY2FtLT5wYXJhbXMucG5wSUQudmVuZG9yID0gZGF0YVswXSsoKCh1MTYpZGF0YVsxXSk8PDgpOworCQkJY2FtLT5wYXJhbXMucG5wSUQucHJvZHVjdCA9IGRhdGFbMl0rKCgodTE2KWRhdGFbM10pPDw4KTsKKwkJCWNhbS0+cGFyYW1zLnBucElELmRldmljZVJldmlzaW9uID0KKwkJCQlkYXRhWzRdKygoKHUxNilkYXRhWzVdKTw8OCk7CisJCQlicmVhazsKKwkJY2FzZSBDUElBX0NPTU1BTkRfR2V0Q2FtZXJhU3RhdHVzOgorCQkJY2FtLT5wYXJhbXMuc3RhdHVzLnN5c3RlbVN0YXRlID0gZGF0YVswXTsKKwkJCWNhbS0+cGFyYW1zLnN0YXR1cy5ncmFiU3RhdGUgPSBkYXRhWzFdOworCQkJY2FtLT5wYXJhbXMuc3RhdHVzLnN0cmVhbVN0YXRlID0gZGF0YVsyXTsKKwkJCWNhbS0+cGFyYW1zLnN0YXR1cy5mYXRhbEVycm9yID0gZGF0YVszXTsKKwkJCWNhbS0+cGFyYW1zLnN0YXR1cy5jbWRFcnJvciA9IGRhdGFbNF07CisJCQljYW0tPnBhcmFtcy5zdGF0dXMuZGVidWdGbGFncyA9IGRhdGFbNV07CisJCQljYW0tPnBhcmFtcy5zdGF0dXMudnBTdGF0dXMgPSBkYXRhWzZdOworCQkJY2FtLT5wYXJhbXMuc3RhdHVzLmVycm9yQ29kZSA9IGRhdGFbN107CisJCQlicmVhazsKKwkJY2FzZSBDUElBX0NPTU1BTkRfR2V0VlBWZXJzaW9uOgorCQkJY2FtLT5wYXJhbXMudnBWZXJzaW9uLnZwVmVyc2lvbiA9IGRhdGFbMF07CisJCQljYW0tPnBhcmFtcy52cFZlcnNpb24udnBSZXZpc2lvbiA9IGRhdGFbMV07CisJCQljYW0tPnBhcmFtcy52cFZlcnNpb24uY2FtZXJhSGVhZElEID0KKwkJCQlkYXRhWzJdKygoKHUxNilkYXRhWzNdKTw8OCk7CisJCQlicmVhazsKKwkJY2FzZSBDUElBX0NPTU1BTkRfR2V0Q29sb3VyUGFyYW1zOgorCQkJY2FtLT5wYXJhbXMuY29sb3VyUGFyYW1zLmJyaWdodG5lc3MgPSBkYXRhWzBdOworCQkJY2FtLT5wYXJhbXMuY29sb3VyUGFyYW1zLmNvbnRyYXN0ID0gZGF0YVsxXTsKKwkJCWNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5zYXR1cmF0aW9uID0gZGF0YVsyXTsKKwkJCXVwKCZjYW0tPnBhcmFtX2xvY2spOworCQkJYnJlYWs7CisJCWNhc2UgQ1BJQV9DT01NQU5EX0dldENvbG91ckJhbGFuY2U6CisJCQljYW0tPnBhcmFtcy5jb2xvdXJCYWxhbmNlLnJlZEdhaW4gPSBkYXRhWzBdOworCQkJY2FtLT5wYXJhbXMuY29sb3VyQmFsYW5jZS5ncmVlbkdhaW4gPSBkYXRhWzFdOworCQkJY2FtLT5wYXJhbXMuY29sb3VyQmFsYW5jZS5ibHVlR2FpbiA9IGRhdGFbMl07CisJCQl1cCgmY2FtLT5wYXJhbV9sb2NrKTsKKwkJCWJyZWFrOworCQljYXNlIENQSUFfQ09NTUFORF9HZXRFeHBvc3VyZToKKwkJCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmdhaW4gPSBkYXRhWzBdOworCQkJY2FtLT5wYXJhbXMuZXhwb3N1cmUuZmluZUV4cCA9IGRhdGFbMV07CisJCQljYW0tPnBhcmFtcy5leHBvc3VyZS5jb2Fyc2VFeHBMbyA9IGRhdGFbMl07CisJCQljYW0tPnBhcmFtcy5leHBvc3VyZS5jb2Fyc2VFeHBIaSA9IGRhdGFbM107CisJCQljYW0tPnBhcmFtcy5leHBvc3VyZS5yZWRDb21wID0gZGF0YVs0XTsKKwkJCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmdyZWVuMUNvbXAgPSBkYXRhWzVdOworCQkJY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ3JlZW4yQ29tcCA9IGRhdGFbNl07CisJCQljYW0tPnBhcmFtcy5leHBvc3VyZS5ibHVlQ29tcCA9IGRhdGFbN107CisJCQl1cCgmY2FtLT5wYXJhbV9sb2NrKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1BJQV9DT01NQU5EX1JlYWRNQ1BvcnRzOiAKKwkJCWlmICghY2FtLT5wYXJhbXMucXgzLnF4M19kZXRlY3RlZCkgCisJCQkJYnJlYWs7CisJCQkvKiB0ZXN0IGJ1dHRvbiBwcmVzcyAqLyAKKwkJCWNhbS0+cGFyYW1zLnF4My5idXR0b24gPSAoKGRhdGFbMV0gJiAweDAyKSA9PSAwKTsKKwkJCWlmIChjYW0tPnBhcmFtcy5xeDMuYnV0dG9uKSB7CisJCQkJLyogYnV0dG9uIHByZXNzZWQgLSB1bmxvY2sgdGhlIGxhdGNoICovCisJCQkJZG9fY29tbWFuZChjYW0sQ1BJQV9DT01NQU5EX1dyaXRlTUNQb3J0LDMsMHhERiwweERGLDApOworCQkJCWRvX2NvbW1hbmQoY2FtLENQSUFfQ09NTUFORF9Xcml0ZU1DUG9ydCwzLDB4RkYsMHhGRiwwKTsKKwkJCX0KKworCQkJLyogdGVzdCB3aGV0aGVyIG1pY3Jvc2NvcGUgaXMgY3JhZGxlZCAqLworCQkJY2FtLT5wYXJhbXMucXgzLmNyYWRsZWQgPSAoKGRhdGFbMl0gJiAweDQwKSA9PSAwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBzZW5kIGEgY29tbWFuZCAgdG8gdGhlIGNhbWVyYSB3aXRoIGFuIGFkZGl0aW9uYWwgZGF0YSB0cmFuc2FjdGlvbiAqLworc3RhdGljIGludCBkb19jb21tYW5kX2V4dGVuZGVkKHN0cnVjdCBjYW1fZGF0YSAqY2FtLCB1MTYgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBhLCB1OCBiLCB1OCBjLCB1OCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGUsIHU4IGYsIHU4IGcsIHU4IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggaSwgdTggaiwgdTggaywgdTggbCkKK3sKKwlpbnQgcmV0dmFsOworCXU4IGNtZFs4XSwgZGF0YVs4XTsKKworCWNtZFswXSA9IGNvbW1hbmQ+Pjg7CisJY21kWzFdID0gY29tbWFuZCYweGZmOworCWNtZFsyXSA9IGE7CisJY21kWzNdID0gYjsKKwljbWRbNF0gPSBjOworCWNtZFs1XSA9IGQ7CisJY21kWzZdID0gODsKKwljbWRbN10gPSAwOworCWRhdGFbMF0gPSBlOworCWRhdGFbMV0gPSBmOworCWRhdGFbMl0gPSBnOworCWRhdGFbM10gPSBoOworCWRhdGFbNF0gPSBpOworCWRhdGFbNV0gPSBqOworCWRhdGFbNl0gPSBrOworCWRhdGFbN10gPSBsOworCisJcmV0dmFsID0gY2FtLT5vcHMtPnRyYW5zZmVyQ21kKGNhbS0+bG93bGV2ZWxfZGF0YSwgY21kLCBkYXRhKTsKKwlpZiAocmV0dmFsKQorCQlEQkcoIiV4IC0gZmFpbGVkXG4iLCBjb21tYW5kKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29sb3JzcGFjZSBjb252ZXJzaW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExJTUlUKHgpICgoKCh4KT4weGZmZmZmZik/MHhmZjAwMDA6KCgoeCk8PTB4ZmZmZik/MDooeCkmMHhmZjAwMDApKT4+MTYpCisKK3N0YXRpYyBpbnQgY29udmVydDQyMCh1bnNpZ25lZCBjaGFyICp5dXYsIHVuc2lnbmVkIGNoYXIgKnJnYiwgaW50IG91dF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBpbnQgbW1hcF9rbHVkZ2UpCit7CisJaW50IHksIHUsIHYsIHIsIGcsIGIsIHkxOworCQorCS8qIE9kZCBsaW5lcyB1c2UgdGhlIHNhbWUgdSBhbmQgdiBhcyB0aGUgcHJldmlvdXMgbGluZS4KKwkgKiBCZWNhdXNlIG9mIGNvbXByZXNzaW9uLCBpdCBpcyBuZWNlc3NhcnkgdG8gZ2V0IHRoaXMKKwkgKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkZWNvZGVkIGltYWdlLiAqLworCXN3aXRjaChvdXRfZm10KSB7CisJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU1NToKKwkJeSA9ICgqeXV2KysgLSAxNikgKiA3NjMxMDsKKwkJeTEgPSAoKnl1diAtIDE2KSAqIDc2MzEwOworCQlyID0gKCgqKHJnYisxLWxpbmVzaXplKSkgJiAweDdjKSA8PCAxOworCQlnID0gKCgqKHJnYi1saW5lc2l6ZSkpICYgMHhlMCkgPj4gNCB8CisJCSAgICAoKCoocmdiKzEtbGluZXNpemUpKSAmIDB4MDMpIDw8IDY7CisJCWIgPSAoKCoocmdiLWxpbmVzaXplKSkgJiAweDFmKSA8PCAzOworCQl1ID0gKC01MzI5NCAqIHIgLSAxMDQ2MzUgKiBnICsgMTU3OTI5ICogYikgLyA1NzU2NDk1OworCQl2ID0gKDE1Nzk2OCAqIHIgLSAxMzIyNzggKiBnIC0gMjU2OTAgKiBiKSAvIDUzNjYxNTk7CisJCXIgPSAxMDQ2MzUgKiB2OworCQlnID0gLTI1NjkwICogdSAtIDUzMjk0ICogdjsKKwkJYiA9IDEzMjI3OCAqIHU7CisJCSpyZ2IrKyA9ICgoTElNSVQoZyt5KSAmIDB4ZjgpIDw8IDIpIHwgKExJTUlUKGIreSkgPj4gMyk7CisJCSpyZ2IrKyA9ICgoTElNSVQocit5KSAmIDB4ZjgpID4+IDEpIHwgKExJTUlUKGcreSkgPj4gNik7CisJCSpyZ2IrKyA9ICgoTElNSVQoZyt5MSkgJiAweGY4KSA8PCAyKSB8IChMSU1JVChiK3kxKSA+PiAzKTsKKwkJKnJnYiA9ICgoTElNSVQocit5MSkgJiAweGY4KSA+PiAxKSB8IChMSU1JVChnK3kxKSA+PiA2KTsKKwkJcmV0dXJuIDQ7CisJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU2NToKKwkJeSA9ICgqeXV2KysgLSAxNikgKiA3NjMxMDsKKwkJeTEgPSAoKnl1diAtIDE2KSAqIDc2MzEwOworCQlyID0gKCoocmdiKzEtbGluZXNpemUpKSAmIDB4Zjg7CisJCWcgPSAoKCoocmdiLWxpbmVzaXplKSkgJiAweGUwKSA+PiAzIHwKKwkJICAgICgoKihyZ2IrMS1saW5lc2l6ZSkpICYgMHgwNykgPDwgNTsKKwkJYiA9ICgoKihyZ2ItbGluZXNpemUpKSAmIDB4MWYpIDw8IDM7CisJCXUgPSAoLTUzMjk0ICogciAtIDEwNDYzNSAqIGcgKyAxNTc5MjkgKiBiKSAvIDU3NTY0OTU7CisJCXYgPSAoMTU3OTY4ICogciAtIDEzMjI3OCAqIGcgLSAyNTY5MCAqIGIpIC8gNTM2NjE1OTsKKwkJciA9IDEwNDYzNSAqIHY7CisJCWcgPSAtMjU2OTAgKiB1IC0gNTMyOTQgKiB2OworCQliID0gMTMyMjc4ICogdTsKKwkJKnJnYisrID0gKChMSU1JVChnK3kpICYgMHhmYykgPDwgMykgfCAoTElNSVQoYit5KSA+PiAzKTsKKwkJKnJnYisrID0gKExJTUlUKHIreSkgJiAweGY4KSB8IChMSU1JVChnK3kpID4+IDUpOworCQkqcmdiKysgPSAoKExJTUlUKGcreTEpICYgMHhmYykgPDwgMykgfCAoTElNSVQoYit5MSkgPj4gMyk7CisJCSpyZ2IgPSAoTElNSVQocit5MSkgJiAweGY4KSB8IChMSU1JVChnK3kxKSA+PiA1KTsKKwkJcmV0dXJuIDQ7CisJCWJyZWFrOworCWNhc2UgVklERU9fUEFMRVRURV9SR0IyNDoKKwljYXNlIFZJREVPX1BBTEVUVEVfUkdCMzI6CisJCXkgPSAoKnl1disrIC0gMTYpICogNzYzMTA7CisJCXkxID0gKCp5dXYgLSAxNikgKiA3NjMxMDsKKwkJaWYgKG1tYXBfa2x1ZGdlKSB7CisJCQlyID0gKihyZ2IrMi1saW5lc2l6ZSk7CisJCQlnID0gKihyZ2IrMS1saW5lc2l6ZSk7CisJCQliID0gKihyZ2ItbGluZXNpemUpOworCQl9IGVsc2UgeworCQkJciA9ICoocmdiLWxpbmVzaXplKTsKKwkJCWcgPSAqKHJnYisxLWxpbmVzaXplKTsKKwkJCWIgPSAqKHJnYisyLWxpbmVzaXplKTsKKwkJfQorCQl1ID0gKC01MzI5NCAqIHIgLSAxMDQ2MzUgKiBnICsgMTU3OTI5ICogYikgLyA1NzU2NDk1OworCQl2ID0gKDE1Nzk2OCAqIHIgLSAxMzIyNzggKiBnIC0gMjU2OTAgKiBiKSAvIDUzNjYxNTk7CisJCXIgPSAxMDQ2MzUgKiB2OworCQlnID0gLTI1NjkwICogdSArIC01MzI5NCAqIHY7CisJCWIgPSAxMzIyNzggKiB1OworCQlpZiAobW1hcF9rbHVkZ2UpIHsKKwkJCSpyZ2IrKyA9IExJTUlUKGIreSk7CisJCQkqcmdiKysgPSBMSU1JVChnK3kpOworCQkJKnJnYisrID0gTElNSVQocit5KTsKKwkJCWlmKG91dF9mbXQgPT0gVklERU9fUEFMRVRURV9SR0IzMikKKwkJCQlyZ2IrKzsKKwkJCSpyZ2IrKyA9IExJTUlUKGIreTEpOworCQkJKnJnYisrID0gTElNSVQoZyt5MSk7CisJCQkqcmdiID0gTElNSVQocit5MSk7CisJCX0gZWxzZSB7CisJCQkqcmdiKysgPSBMSU1JVChyK3kpOworCQkJKnJnYisrID0gTElNSVQoZyt5KTsKKwkJCSpyZ2IrKyA9IExJTUlUKGIreSk7CisJCQlpZihvdXRfZm10ID09IFZJREVPX1BBTEVUVEVfUkdCMzIpCisJCQkJcmdiKys7CisJCQkqcmdiKysgPSBMSU1JVChyK3kxKTsKKwkJCSpyZ2IrKyA9IExJTUlUKGcreTEpOworCQkJKnJnYiA9IExJTUlUKGIreTEpOworCQl9CisJCWlmKG91dF9mbXQgPT0gVklERU9fUEFMRVRURV9SR0IzMikKKwkJCXJldHVybiA4OworCQlyZXR1cm4gNjsKKwljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIyOgorCWNhc2UgVklERU9fUEFMRVRURV9ZVVlWOgorCQl5ID0gKnl1disrOworCQl1ID0gKihyZ2IrMS1saW5lc2l6ZSk7CisJCXkxID0gKnl1djsKKwkJdiA9ICoocmdiKzMtbGluZXNpemUpOworCQkqcmdiKysgPSB5OworCQkqcmdiKysgPSB1OworCQkqcmdiKysgPSB5MTsKKwkJKnJnYiA9IHY7CisJCXJldHVybiA0OworCWNhc2UgVklERU9fUEFMRVRURV9VWVZZOgorCQl1ID0gKihyZ2ItbGluZXNpemUpOworCQl5ID0gKnl1disrOworCQl2ID0gKihyZ2IrMi1saW5lc2l6ZSk7CisJCXkxID0gKnl1djsKKwkJKnJnYisrID0gdTsKKwkJKnJnYisrID0geTsKKwkJKnJnYisrID0gdjsKKwkJKnJnYiA9IHkxOworCQlyZXR1cm4gNDsKKwljYXNlIFZJREVPX1BBTEVUVEVfR1JFWToKKwkJKnJnYisrID0gKnl1disrOworCQkqcmdiID0gKnl1djsKKwkJcmV0dXJuIDI7CisJZGVmYXVsdDoKKwkJREJHKCJFbXB0eTogJWRcbiIsIG91dF9mbXQpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKworc3RhdGljIGludCB5dXZjb252ZXJ0KHVuc2lnbmVkIGNoYXIgKnl1diwgdW5zaWduZWQgY2hhciAqcmdiLCBpbnQgb3V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fdXl2eSwgaW50IG1tYXBfa2x1ZGdlKQoreworCWludCB5LCB1LCB2LCByLCBnLCBiLCB5MTsKKworCXN3aXRjaChvdXRfZm10KSB7CisJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU1NToKKwljYXNlIFZJREVPX1BBTEVUVEVfUkdCNTY1OgorCWNhc2UgVklERU9fUEFMRVRURV9SR0IyNDoKKwljYXNlIFZJREVPX1BBTEVUVEVfUkdCMzI6CisJCWlmIChpbl91eXZ5KSB7CisJCQl1ID0gKnl1disrIC0gMTI4OworCQkJeSA9ICgqeXV2KysgLSAxNikgKiA3NjMxMDsKKwkJCXYgPSAqeXV2KysgLSAxMjg7CisJCQl5MSA9ICgqeXV2IC0gMTYpICogNzYzMTA7CisJCX0gZWxzZSB7CisJCQl5ID0gKCp5dXYrKyAtIDE2KSAqIDc2MzEwOworCQkJdSA9ICp5dXYrKyAtIDEyODsKKwkJCXkxID0gKCp5dXYrKyAtIDE2KSAqIDc2MzEwOworCQkJdiA9ICp5dXYgLSAxMjg7CisJCX0KKwkJciA9IDEwNDYzNSAqIHY7CisJCWcgPSAtMjU2OTAgKiB1ICsgLTUzMjk0ICogdjsKKwkJYiA9IDEzMjI3OCAqIHU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXkgPSAqeXV2Kys7CisJCXUgPSAqeXV2Kys7CisJCXkxID0gKnl1disrOworCQl2ID0gKnl1djsKKwkJLyogSnVzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyAqLworCQlyID0gMDsKKwkJZyA9IDA7CisJCWIgPSAwOworCQlicmVhazsKKwl9CisJc3dpdGNoKG91dF9mbXQpIHsKKwljYXNlIFZJREVPX1BBTEVUVEVfUkdCNTU1OgorCQkqcmdiKysgPSAoKExJTUlUKGcreSkgJiAweGY4KSA8PCAyKSB8IChMSU1JVChiK3kpID4+IDMpOworCQkqcmdiKysgPSAoKExJTUlUKHIreSkgJiAweGY4KSA+PiAxKSB8IChMSU1JVChnK3kpID4+IDYpOworCQkqcmdiKysgPSAoKExJTUlUKGcreTEpICYgMHhmOCkgPDwgMikgfCAoTElNSVQoYit5MSkgPj4gMyk7CisJCSpyZ2IgPSAoKExJTUlUKHIreTEpICYgMHhmOCkgPj4gMSkgfCAoTElNSVQoZyt5MSkgPj4gNik7CisJCXJldHVybiA0OworCWNhc2UgVklERU9fUEFMRVRURV9SR0I1NjU6CisJCSpyZ2IrKyA9ICgoTElNSVQoZyt5KSAmIDB4ZmMpIDw8IDMpIHwgKExJTUlUKGIreSkgPj4gMyk7CisJCSpyZ2IrKyA9IChMSU1JVChyK3kpICYgMHhmOCkgfCAoTElNSVQoZyt5KSA+PiA1KTsKKwkJKnJnYisrID0gKChMSU1JVChnK3kxKSAmIDB4ZmMpIDw8IDMpIHwgKExJTUlUKGIreTEpID4+IDMpOworCQkqcmdiID0gKExJTUlUKHIreTEpICYgMHhmOCkgfCAoTElNSVQoZyt5MSkgPj4gNSk7CisJCXJldHVybiA0OworCWNhc2UgVklERU9fUEFMRVRURV9SR0IyNDoKKwkJaWYgKG1tYXBfa2x1ZGdlKSB7CisJCQkqcmdiKysgPSBMSU1JVChiK3kpOworCQkJKnJnYisrID0gTElNSVQoZyt5KTsKKwkJCSpyZ2IrKyA9IExJTUlUKHIreSk7CisJCQkqcmdiKysgPSBMSU1JVChiK3kxKTsKKwkJCSpyZ2IrKyA9IExJTUlUKGcreTEpOworCQkJKnJnYiA9IExJTUlUKHIreTEpOworCQl9IGVsc2UgeworCQkJKnJnYisrID0gTElNSVQocit5KTsKKwkJCSpyZ2IrKyA9IExJTUlUKGcreSk7CisJCQkqcmdiKysgPSBMSU1JVChiK3kpOworCQkJKnJnYisrID0gTElNSVQocit5MSk7CisJCQkqcmdiKysgPSBMSU1JVChnK3kxKTsKKwkJCSpyZ2IgPSBMSU1JVChiK3kxKTsKKwkJfQorCQlyZXR1cm4gNjsKKwljYXNlIFZJREVPX1BBTEVUVEVfUkdCMzI6CisJCWlmIChtbWFwX2tsdWRnZSkgeworCQkJKnJnYisrID0gTElNSVQoYit5KTsKKwkJCSpyZ2IrKyA9IExJTUlUKGcreSk7CisJCQkqcmdiKysgPSBMSU1JVChyK3kpOworCQkJcmdiKys7CisJCQkqcmdiKysgPSBMSU1JVChiK3kxKTsKKwkJCSpyZ2IrKyA9IExJTUlUKGcreTEpOworCQkJKnJnYiA9IExJTUlUKHIreTEpOworCQl9IGVsc2UgeworCQkJKnJnYisrID0gTElNSVQocit5KTsKKwkJCSpyZ2IrKyA9IExJTUlUKGcreSk7CisJCQkqcmdiKysgPSBMSU1JVChiK3kpOworCQkJcmdiKys7CisJCQkqcmdiKysgPSBMSU1JVChyK3kxKTsKKwkJCSpyZ2IrKyA9IExJTUlUKGcreTEpOworCQkJKnJnYiA9IExJTUlUKGIreTEpOworCQl9CisJCXJldHVybiA4OworCWNhc2UgVklERU9fUEFMRVRURV9HUkVZOgorCQkqcmdiKysgPSB5OworCQkqcmdiID0geTE7CisJCXJldHVybiAyOworCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjI6CisJY2FzZSBWSURFT19QQUxFVFRFX1lVWVY6CisJCSpyZ2IrKyA9IHk7CisJCSpyZ2IrKyA9IHU7CisJCSpyZ2IrKyA9IHkxOworCQkqcmdiID0gdjsKKwkJcmV0dXJuIDQ7CisJY2FzZSBWSURFT19QQUxFVFRFX1VZVlk6CisJCSpyZ2IrKyA9IHU7CisJCSpyZ2IrKyA9IHk7CisJCSpyZ2IrKyA9IHY7CisJCSpyZ2IgPSB5MTsKKwkJcmV0dXJuIDQ7CisJZGVmYXVsdDoKKwkJREJHKCJFbXB0eTogJWRcbiIsIG91dF9mbXQpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2tpcGNvdW50KGludCBjb3VudCwgaW50IGZtdCkKK3sKKwlzd2l0Y2goZm10KSB7CisJY2FzZSBWSURFT19QQUxFVFRFX0dSRVk6CisJCXJldHVybiBjb3VudDsKKwljYXNlIFZJREVPX1BBTEVUVEVfUkdCNTU1OgorCWNhc2UgVklERU9fUEFMRVRURV9SR0I1NjU6CisJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMjoKKwljYXNlIFZJREVPX1BBTEVUVEVfWVVZVjoKKwljYXNlIFZJREVPX1BBTEVUVEVfVVlWWToKKwkJcmV0dXJuIDIqY291bnQ7CisJY2FzZSBWSURFT19QQUxFVFRFX1JHQjI0OgorCQlyZXR1cm4gMypjb3VudDsKKwljYXNlIFZJREVPX1BBTEVUVEVfUkdCMzI6CisJCXJldHVybiA0KmNvdW50OworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBwYXJzZV9waWN0dXJlKHN0cnVjdCBjYW1fZGF0YSAqY2FtLCBpbnQgc2l6ZSkKK3sKKwl1OCAqb2J1ZiwgKmlidWYsICplbmRfb2J1ZjsKKwlpbnQgbGwsIGluX3V5dnksIGNvbXByZXNzZWQsIGRlY2ltYXRpb24sIGV2ZW5fbGluZSwgb3JpZ3NpemUsIG91dF9mbXQ7CisJaW50IHJvd3MsIGNvbHMsIGxpbmVzaXplLCBzdWJzYW1wbGVfNDIyOworCisJLyogbWFrZSBzdXJlIHBhcmFtcyBkb24ndCBjaGFuZ2Ugd2hpbGUgd2UgYXJlIGRlY29kaW5nICovCisJZG93bigmY2FtLT5wYXJhbV9sb2NrKTsKKworCW9idWYgPSBjYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5kYXRhOworCWVuZF9vYnVmID0gb2J1ZitDUElBX01BWF9GUkFNRV9TSVpFOworCWlidWYgPSBjYW0tPnJhd19pbWFnZTsKKwlvcmlnc2l6ZSA9IHNpemU7CisJb3V0X2ZtdCA9IGNhbS0+dnAucGFsZXR0ZTsKKworCWlmICgoaWJ1ZlswXSAhPSBNQUdJQ18wKSB8fCAoaWJ1ZlsxXSAhPSBNQUdJQ18xKSkgeworCQlMT0coImhlYWRlciBub3QgZm91bmRcbiIpOworCQl1cCgmY2FtLT5wYXJhbV9sb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICgoaWJ1ZlsxNl0gIT0gVklERU9TSVpFX1FDSUYpICYmIChpYnVmWzE2XSAhPSBWSURFT1NJWkVfQ0lGKSkgeworCQlMT0coIndyb25nIHZpZGVvIHNpemVcbiIpOworCQl1cCgmY2FtLT5wYXJhbV9sb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwlpZiAoaWJ1ZlsxN10gIT0gU1VCU0FNUExFXzQyMCAmJiBpYnVmWzE3XSAhPSBTVUJTQU1QTEVfNDIyKSB7CisJCUxPRygiaWxsZWdhbCBzdWJ0eXBlICVkXG4iLGlidWZbMTddKTsKKwkJdXAoJmNhbS0+cGFyYW1fbG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJc3Vic2FtcGxlXzQyMiA9IGlidWZbMTddID09IFNVQlNBTVBMRV80MjI7CisJCisJaWYgKGlidWZbMThdICE9IFlVVk9SREVSX1lVWVYgJiYgaWJ1ZlsxOF0gIT0gWVVWT1JERVJfVVlWWSkgeworCQlMT0coImlsbGVnYWwgeXV2b3JkZXIgJWRcbiIsaWJ1ZlsxOF0pOworCQl1cCgmY2FtLT5wYXJhbV9sb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpbl91eXZ5ID0gaWJ1ZlsxOF0gPT0gWVVWT1JERVJfVVlWWTsKKwkKKwlpZiAoKGlidWZbMjRdICE9IGNhbS0+cGFyYW1zLnJvaS5jb2xTdGFydCkgfHwKKwkgICAgKGlidWZbMjVdICE9IGNhbS0+cGFyYW1zLnJvaS5jb2xFbmQpIHx8CisJICAgIChpYnVmWzI2XSAhPSBjYW0tPnBhcmFtcy5yb2kucm93U3RhcnQpIHx8CisJICAgIChpYnVmWzI3XSAhPSBjYW0tPnBhcmFtcy5yb2kucm93RW5kKSkgeworCQlMT0coIlJPSSBtaXNtYXRjaFxuIik7CisJCXVwKCZjYW0tPnBhcmFtX2xvY2spOworCQlyZXR1cm4gLTE7CisJfQorCWNvbHMgPSA4KihpYnVmWzI1XSAtIGlidWZbMjRdKTsKKwlyb3dzID0gNCooaWJ1ZlsyN10gLSBpYnVmWzI2XSk7CisKKwkKKwlpZiAoKGlidWZbMjhdICE9IE5PVF9DT01QUkVTU0VEKSAmJiAoaWJ1ZlsyOF0gIT0gQ09NUFJFU1NFRCkpIHsKKwkJTE9HKCJpbGxlZ2FsIGNvbXByZXNzaW9uICVkXG4iLGlidWZbMjhdKTsKKwkJdXAoJmNhbS0+cGFyYW1fbG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJY29tcHJlc3NlZCA9IChpYnVmWzI4XSA9PSBDT01QUkVTU0VEKTsKKwkKKwlpZiAoaWJ1ZlsyOV0gIT0gTk9fREVDSU1BVElPTiAmJiBpYnVmWzI5XSAhPSBERUNJTUFUSU9OX0VOQUIpIHsKKwkJTE9HKCJpbGxlZ2FsIGRlY2ltYXRpb24gJWRcbiIsaWJ1ZlsyOV0pOworCQl1cCgmY2FtLT5wYXJhbV9sb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkZWNpbWF0aW9uID0gKGlidWZbMjldID09IERFQ0lNQVRJT05fRU5BQik7CQorCisJY2FtLT5wYXJhbXMueXV2VGhyZXNob2xkLnlUaHJlc2hvbGQgPSBpYnVmWzMwXTsKKwljYW0tPnBhcmFtcy55dXZUaHJlc2hvbGQudXZUaHJlc2hvbGQgPSBpYnVmWzMxXTsKKwljYW0tPnBhcmFtcy5zdGF0dXMuc3lzdGVtU3RhdGUgPSBpYnVmWzMyXTsKKwljYW0tPnBhcmFtcy5zdGF0dXMuZ3JhYlN0YXRlID0gaWJ1ZlszM107CisJY2FtLT5wYXJhbXMuc3RhdHVzLnN0cmVhbVN0YXRlID0gaWJ1ZlszNF07CisJY2FtLT5wYXJhbXMuc3RhdHVzLmZhdGFsRXJyb3IgPSBpYnVmWzM1XTsKKwljYW0tPnBhcmFtcy5zdGF0dXMuY21kRXJyb3IgPSBpYnVmWzM2XTsKKwljYW0tPnBhcmFtcy5zdGF0dXMuZGVidWdGbGFncyA9IGlidWZbMzddOworCWNhbS0+cGFyYW1zLnN0YXR1cy52cFN0YXR1cyA9IGlidWZbMzhdOworCWNhbS0+cGFyYW1zLnN0YXR1cy5lcnJvckNvZGUgPSBpYnVmWzM5XTsKKwljYW0tPmZwcyA9IGlidWZbNDFdOworCXVwKCZjYW0tPnBhcmFtX2xvY2spOworCQorCWxpbmVzaXplID0gc2tpcGNvdW50KGNvbHMsIG91dF9mbXQpOworCWlidWYgKz0gRlJBTUVfSEVBREVSX1NJWkU7CisJc2l6ZSAtPSBGUkFNRV9IRUFERVJfU0laRTsKKwlsbCA9IGlidWZbMF0gfCAoaWJ1ZlsxXSA8PCA4KTsKKwlpYnVmICs9IDI7CisJZXZlbl9saW5lID0gMTsKKworCXdoaWxlIChzaXplID4gMCkgeworCQlzaXplIC09IChsbCsyKTsKKwkJaWYgKHNpemUgPCAwKSB7CisJCQlMT0coIkluc3VmZmljaWVudCBkYXRhIGluIGJ1ZmZlclxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl3aGlsZSAobGwgPiAxKSB7CisJCQlpZiAoIWNvbXByZXNzZWQgfHwgKGNvbXByZXNzZWQgJiYgISgqaWJ1ZiAmIDEpKSkgeworCQkJCWlmKHN1YnNhbXBsZV80MjIgfHwgZXZlbl9saW5lKSB7CisJCQkJb2J1ZiArPSB5dXZjb252ZXJ0KGlidWYsIG9idWYsIG91dF9mbXQsCisJCQkJICAgICAgICAgICAgICAgICAgIGluX3V5dnksIGNhbS0+bW1hcF9rbHVkZ2UpOworCQkJCWlidWYgKz0gNDsKKwkJCQlsbCAtPSA0OworCQkJfSBlbHNlIHsKKwkJCQkJLyogU1VCU0FNUExFXzQyMCBvbiBhbiBvZGQgbGluZSAqLworCQkJCQlvYnVmICs9IGNvbnZlcnQ0MjAoaWJ1Ziwgb2J1ZiwKKwkJCQkJICAgICAgICAgICAgICAgICAgIG91dF9mbXQsIGxpbmVzaXplLAorCQkJICAgICAgICAgICAgICAgIAkJICAgY2FtLT5tbWFwX2tsdWRnZSk7CisJCQkJCWlidWYgKz0gMjsKKwkJCQkJbGwgLT0gMjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qc2tpcCBjb21wcmVzc2VkIGludGVydmFsIGZyb20gcHJldmlvdXMgZnJhbWUqLworCQkJCW9idWYgKz0gc2tpcGNvdW50KCppYnVmID4+IDEsIG91dF9mbXQpOworCQkJCWlmIChvYnVmID4gZW5kX29idWYpIHsKKwkJCQkJTE9HKCJJbnN1ZmZpY2llbnQgYnVmZmVyIHNpemVcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCSsraWJ1ZjsKKwkJCQlsbC0tOworCQkJfQorCQl9CisJCWlmIChsbCA9PSAxKSB7CisJCQlpZiAoKmlidWYgIT0gRU9MKSB7CisJCQkJREJHKCJFT0wgbm90IGZvdW5kIGdpdmluZyB1cCBhZnRlciAlZC8lZCIKKwkJCQkgICAgIiBieXRlc1xuIiwgb3JpZ3NpemUtc2l6ZSwgb3JpZ3NpemUpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJKytpYnVmOyAvKiBza2lwIG92ZXIgRU9MICovCisKKwkJCWlmICgoc2l6ZSA+IDMpICYmIChpYnVmWzBdID09IEVPSSkgJiYgKGlidWZbMV0gPT0gRU9JKSAmJgorCQkJICAgKGlidWZbMl0gPT0gRU9JKSAmJiAoaWJ1ZlszXSA9PSBFT0kpKSB7CisJCQkgCXNpemUgLT0gNDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYoZGVjaW1hdGlvbikgeworCQkJCS8qIHNraXAgdGhlIG9kZCBsaW5lcyBmb3Igbm93ICovCisJCQkJb2J1ZiArPSBsaW5lc2l6ZTsKKwkJCX0KKworCQkJaWYgKHNpemUgPiAxKSB7CisJCQkJbGwgPSBpYnVmWzBdIHwgKGlidWZbMV0gPDwgOCk7CisJCQkJaWJ1ZiArPSAyOyAvKiBza2lwIG92ZXIgbGluZSBsZW5ndGggKi8KKwkJCX0KKwkJCWlmKCFkZWNpbWF0aW9uKQorCQkJCWV2ZW5fbGluZSA9ICFldmVuX2xpbmU7CisJCX0gZWxzZSB7CisJCQlMT0coImxpbmUgbGVuZ3RoIHdhcyBub3QgMSBidXQgJWQgYWZ0ZXIgJWQvJWQgYnl0ZXNcbiIsCisJCQkgICAgbGwsIG9yaWdzaXplLXNpemUsIG9yaWdzaXplKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwkKKwlpZihkZWNpbWF0aW9uKSB7CisJCS8qIGludGVycG9sYXRlIG9kZCByb3dzICovCisJCWludCBpLCBqOworCQl1OCAqcHJldiwgKm5leHQ7CisJCXByZXYgPSBjYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5kYXRhOworCQlvYnVmID0gcHJlditsaW5lc2l6ZTsKKwkJbmV4dCA9IG9idWYrbGluZXNpemU7CisJCWZvcihpPTE7IGk8cm93cy0xOyBpKz0yKSB7CisJCQlmb3Ioaj0wOyBqPGxpbmVzaXplOyArK2opIHsKKwkJCQkqb2J1ZisrID0gKChpbnQpKnByZXYrKyArICpuZXh0KyspIC8gMjsKKwkJCX0KKwkJCXByZXYgKz0gbGluZXNpemU7CisJCQlvYnVmICs9IGxpbmVzaXplOworCQkJbmV4dCArPSBsaW5lc2l6ZTsKKwkJfQorCQkvKiBsYXN0IHJvdyBpcyBvZGQsIGp1c3QgY29weSBwcmV2aW91cyByb3cgKi8KKwkJbWVtY3B5KG9idWYsIHByZXYsIGxpbmVzaXplKTsKKwl9CisKKwljYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5jb3VudCA9IG9idWYtY2FtLT5kZWNvbXByZXNzZWRfZnJhbWUuZGF0YTsKKworCXJldHVybiBjYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5jb3VudDsKK30KKworLyogSW5pdFN0cmVhbUNhcCB3cmFwcGVyIHRvIHNlbGVjdCBjb3JyZWN0IHN0YXJ0IGxpbmUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGluaXRfc3RyZWFtX2NhcChzdHJ1Y3QgY2FtX2RhdGEgKmNhbSkKK3sKKwlyZXR1cm4gZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9Jbml0U3RyZWFtQ2FwLAorCSAgICAgICAgICAgICAgICAgIDAsIGNhbS0+cGFyYW1zLnN0cmVhbVN0YXJ0TGluZSwgMCwgMCk7Cit9CisKKworLyogIGZpbmRfb3Zlcl9leHBvc3VyZQorICogICAgRmluZHMgYSBzdWl0YWJsZSB2YWx1ZSBvZiBPdmVyRXhwb3N1cmUgZm9yIHVzZSB3aXRoIFNldEZsaWNrZXJDdHJsCisgKiAgICBTb21lIGNhbGN1bGF0aW9uIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhpcyB2YWx1ZSBjaGFuZ2VzIHdpdGggdGhlIGJyaWdodG5lc3MKKyAqICAgIHNldCB3aXRoIFNldENvbG91clBhcmFtZXRlcnMKKyAqCisgKiAgUGFyYW1ldGVyczogQnJpZ2h0bmVzcyAgLSAgbGFzdCBicmlnaHRuZXNzIHZhbHVlIHNldCB3aXRoIFNldENvbG91clBhcmFtZXRlcnMKKyAqCisgKiAgUmV0dXJuczogT3ZlckV4cG9zdXJlIHZhbHVlIHRvIHVzZSB3aXRoIFNldEZsaWNrZXJDdHJsCisgKi8KKyNkZWZpbmUgRkxJQ0tFUl9NQVhfRVhQT1NVUkUgICAgICAgICAgICAgICAgICAgIDI1MAorI2RlZmluZSBGTElDS0VSX0FMTE9XQUJMRV9PVkVSX0VYUE9TVVJFICAgICAgICAgMTQ2CisjZGVmaW5lIEZMSUNLRVJfQlJJR0hUTkVTU19DT05TVEFOVCAgICAgICAgICAgICA1OQorc3RhdGljIGludCBmaW5kX292ZXJfZXhwb3N1cmUoaW50IGJyaWdodG5lc3MpCit7CisJaW50IE1heEFsbG93YWJsZU92ZXJFeHBvc3VyZSwgT3ZlckV4cG9zdXJlOworCisJTWF4QWxsb3dhYmxlT3ZlckV4cG9zdXJlID0gRkxJQ0tFUl9NQVhfRVhQT1NVUkUgLSBicmlnaHRuZXNzIC0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBGTElDS0VSX0JSSUdIVE5FU1NfQ09OU1RBTlQ7CisKKwlpZiAoTWF4QWxsb3dhYmxlT3ZlckV4cG9zdXJlIDwgRkxJQ0tFUl9BTExPV0FCTEVfT1ZFUl9FWFBPU1VSRSkgeworCQlPdmVyRXhwb3N1cmUgPSBNYXhBbGxvd2FibGVPdmVyRXhwb3N1cmU7CisJfSBlbHNlIHsKKwkJT3ZlckV4cG9zdXJlID0gRkxJQ0tFUl9BTExPV0FCTEVfT1ZFUl9FWFBPU1VSRTsKKwl9CisKKwlyZXR1cm4gT3ZlckV4cG9zdXJlOworfQorI3VuZGVmIEZMSUNLRVJfTUFYX0VYUE9TVVJFCisjdW5kZWYgRkxJQ0tFUl9BTExPV0FCTEVfT1ZFUl9FWFBPU1VSRQorI3VuZGVmIEZMSUNLRVJfQlJJR0hUTkVTU19DT05TVEFOVAorCisvKiB1cGRhdGUgdmFyaW91cyBjYW1lcmEgbW9kZXMgYW5kIHNldHRpbmdzICovCitzdGF0aWMgdm9pZCBkaXNwYXRjaF9jb21tYW5kcyhzdHJ1Y3QgY2FtX2RhdGEgKmNhbSkKK3sKKwlkb3duKCZjYW0tPnBhcmFtX2xvY2spOworCWlmIChjYW0tPmNtZF9xdWV1ZT09Q09NTUFORF9OT05FKSB7CisJCXVwKCZjYW0tPnBhcmFtX2xvY2spOworCQlyZXR1cm47CisJfQorCURFQl9CWVRFKGNhbS0+Y21kX3F1ZXVlKTsKKwlERUJfQllURShjYW0tPmNtZF9xdWV1ZT4+OCk7CisJaWYgKGNhbS0+Y21kX3F1ZXVlICYgQ09NTUFORF9TRVRGT1JNQVQpIHsKKwkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9TZXRGb3JtYXQsCisJICAgICAgICAJICAgY2FtLT5wYXJhbXMuZm9ybWF0LnZpZGVvU2l6ZSwKKwkgICAgICAgIAkgICBjYW0tPnBhcmFtcy5mb3JtYXQuc3ViU2FtcGxlLAorCSAgICAgICAgCSAgIGNhbS0+cGFyYW1zLmZvcm1hdC55dXZPcmRlciwgMCk7CisJCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfU2V0Uk9JLAorCSAgICAgICAgCSAgIGNhbS0+cGFyYW1zLnJvaS5jb2xTdGFydCwgY2FtLT5wYXJhbXMucm9pLmNvbEVuZCwKKwkgICAgICAgIAkgICBjYW0tPnBhcmFtcy5yb2kucm93U3RhcnQsIGNhbS0+cGFyYW1zLnJvaS5yb3dFbmQpOworCQljYW0tPmZpcnN0X2ZyYW1lID0gMTsKKwl9CisKKwlpZiAoY2FtLT5jbWRfcXVldWUgJiBDT01NQU5EX1NFVENPTE9VUlBBUkFNUykKKwkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9TZXRDb2xvdXJQYXJhbXMsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuY29sb3VyUGFyYW1zLmJyaWdodG5lc3MsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuY29sb3VyUGFyYW1zLmNvbnRyYXN0LAorCQkgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5zYXR1cmF0aW9uLCAwKTsKKworCWlmIChjYW0tPmNtZF9xdWV1ZSAmIENPTU1BTkRfU0VUQVBDT1IpCisJCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfU2V0QXBjb3IsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuYXBjb3IuZ2FpbjEsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuYXBjb3IuZ2FpbjIsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuYXBjb3IuZ2FpbjQsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuYXBjb3IuZ2FpbjgpOworCisJaWYgKGNhbS0+Y21kX3F1ZXVlICYgQ09NTUFORF9TRVRWTE9GRlNFVCkKKwkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9TZXRWTE9mZnNldCwKKwkJICAgICAgICAgICBjYW0tPnBhcmFtcy52bE9mZnNldC5nYWluMSwKKwkJICAgICAgICAgICBjYW0tPnBhcmFtcy52bE9mZnNldC5nYWluMiwKKwkJICAgICAgICAgICBjYW0tPnBhcmFtcy52bE9mZnNldC5nYWluNCwKKwkJICAgICAgICAgICBjYW0tPnBhcmFtcy52bE9mZnNldC5nYWluOCk7CisKKwlpZiAoY2FtLT5jbWRfcXVldWUgJiBDT01NQU5EX1NFVEVYUE9TVVJFKSB7CisJCWRvX2NvbW1hbmRfZXh0ZW5kZWQoY2FtLCBDUElBX0NPTU1BTkRfU2V0RXhwb3N1cmUsCisJCSAgICAgICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ2Fpbk1vZGUsCisJCSAgICAgICAgICAgICAgICAgICAgMSwKKwkJICAgICAgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5jb21wTW9kZSwKKwkJICAgICAgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5jZW50cmVXZWlnaHQsCisJCSAgICAgICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ2FpbiwKKwkJICAgICAgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5maW5lRXhwLAorCQkgICAgICAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cExvLAorCQkgICAgICAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cEhpLAorCQkgICAgICAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmV4cG9zdXJlLnJlZENvbXAsCisJCSAgICAgICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ3JlZW4xQ29tcCwKKwkJICAgICAgICAgICAgICAgICAgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5ncmVlbjJDb21wLAorCQkgICAgICAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmV4cG9zdXJlLmJsdWVDb21wKTsKKwkJaWYoY2FtLT5wYXJhbXMuZXhwb3N1cmUuZXhwTW9kZSAhPSAxKSB7CisJCQlkb19jb21tYW5kX2V4dGVuZGVkKGNhbSwgQ1BJQV9DT01NQU5EX1NldEV4cG9zdXJlLAorCQkgICAgICAgICAgICAgICAgCSAgICAwLAorCQkgICAgICAgICAgICAgICAgCSAgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5leHBNb2RlLAorCQkgICAgICAgICAgICAgICAgCSAgICAwLCAwLAorCQkgICAgICAgICAgICAgICAgCSAgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5nYWluLAorCQkgICAgICAgICAgICAgICAgCSAgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5maW5lRXhwLAorCQkgICAgICAgICAgICAgICAgCSAgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5jb2Fyc2VFeHBMbywKKwkJICAgICAgICAgICAgICAgIAkgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuY29hcnNlRXhwSGksCisJCSAgICAgICAgICAgICAgICAJICAgIDAsIDAsIDAsIDApOworCQl9CisJfQorCQorCWlmIChjYW0tPmNtZF9xdWV1ZSAmIENPTU1BTkRfU0VUQ09MT1VSQkFMQU5DRSkgeworCQlpZiAoY2FtLT5wYXJhbXMuY29sb3VyQmFsYW5jZS5iYWxhbmNlTW9kZSA9PSAxKSB7CisJCQlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX1NldENvbG91ckJhbGFuY2UsCisJCQkJICAgMSwKKwkJCQkgICBjYW0tPnBhcmFtcy5jb2xvdXJCYWxhbmNlLnJlZEdhaW4sCisJCQkJICAgY2FtLT5wYXJhbXMuY29sb3VyQmFsYW5jZS5ncmVlbkdhaW4sCisJCQkJICAgY2FtLT5wYXJhbXMuY29sb3VyQmFsYW5jZS5ibHVlR2Fpbik7CisJCQlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX1NldENvbG91ckJhbGFuY2UsCisJCQkJICAgMywgMCwgMCwgMCk7CisJCX0KKwkJaWYgKGNhbS0+cGFyYW1zLmNvbG91ckJhbGFuY2UuYmFsYW5jZU1vZGUgPT0gMikgeworCQkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9TZXRDb2xvdXJCYWxhbmNlLAorCQkJCSAgIDIsIDAsIDAsIDApOworCQl9CisJCWlmIChjYW0tPnBhcmFtcy5jb2xvdXJCYWxhbmNlLmJhbGFuY2VNb2RlID09IDMpIHsKKwkJCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfU2V0Q29sb3VyQmFsYW5jZSwKKwkJCQkgICAzLCAwLCAwLCAwKTsKKwkJfQorCX0KKworCWlmIChjYW0tPmNtZF9xdWV1ZSAmIENPTU1BTkRfU0VUQ09NUFJFU1NJT05UQVJHRVQpCisJCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfU2V0Q29tcHJlc3Npb25UYXJnZXQsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuY29tcHJlc3Npb25UYXJnZXQuZnJUYXJnZXRpbmcsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuY29tcHJlc3Npb25UYXJnZXQudGFyZ2V0RlIsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuY29tcHJlc3Npb25UYXJnZXQudGFyZ2V0USwgMCk7CisKKwlpZiAoY2FtLT5jbWRfcXVldWUgJiBDT01NQU5EX1NFVFlVVlRIUkVTSCkKKwkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9TZXRZVVZUaHJlc2gsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMueXV2VGhyZXNob2xkLnlUaHJlc2hvbGQsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMueXV2VGhyZXNob2xkLnV2VGhyZXNob2xkLCAwLCAwKTsKKworCWlmIChjYW0tPmNtZF9xdWV1ZSAmIENPTU1BTkRfU0VUQ09NUFJFU1NJT05QQVJBTVMpCisJCWRvX2NvbW1hbmRfZXh0ZW5kZWQoY2FtLCBDUElBX0NPTU1BTkRfU2V0Q29tcHJlc3Npb25QYXJhbXMsCisJCSAgICAgICAgICAgIDAsIDAsIDAsIDAsCisJCSAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLmh5c3RlcmVzaXMsCisJCSAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLnRocmVzaE1heCwKKwkJICAgICAgICAgICAgY2FtLT5wYXJhbXMuY29tcHJlc3Npb25QYXJhbXMuc21hbGxTdGVwLAorCQkgICAgICAgICAgICBjYW0tPnBhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5sYXJnZVN0ZXAsCisJCSAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLmRlY2ltYXRpb25IeXN0ZXJlc2lzLAorCQkgICAgICAgICAgICBjYW0tPnBhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5mckRpZmZTdGVwVGhyZXNoLAorCQkgICAgICAgICAgICBjYW0tPnBhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5xRGlmZlN0ZXBUaHJlc2gsCisJCSAgICAgICAgICAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLmRlY2ltYXRpb25UaHJlc2hNb2QpOworCisJaWYgKGNhbS0+Y21kX3F1ZXVlICYgQ09NTUFORF9TRVRDT01QUkVTU0lPTikKKwkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9TZXRDb21wcmVzc2lvbiwKKwkJICAgICAgICAgICBjYW0tPnBhcmFtcy5jb21wcmVzc2lvbi5tb2RlLAorCQkJICAgY2FtLT5wYXJhbXMuY29tcHJlc3Npb24uZGVjaW1hdGlvbiwgMCwgMCk7CisKKwlpZiAoY2FtLT5jbWRfcXVldWUgJiBDT01NQU5EX1NFVFNFTlNPUkZQUykKKwkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9TZXRTZW5zb3JGUFMsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuc2Vuc29yRnBzLmRpdmlzb3IsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuc2Vuc29yRnBzLmJhc2VyYXRlLCAwLCAwKTsKKworCWlmIChjYW0tPmNtZF9xdWV1ZSAmIENPTU1BTkRfU0VURkxJQ0tFUkNUUkwpCisJCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfU2V0RmxpY2tlckN0cmwsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuZmxpY2tlck1vZGUsCisJCSAgICAgICAgICAgY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuY29hcnNlSnVtcCwKKwkJICAgICAgICAgICBhYnMoY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuYWxsb3dhYmxlT3ZlckV4cG9zdXJlKSwKKwkJICAgICAgICAgICAwKTsKKworCWlmIChjYW0tPmNtZF9xdWV1ZSAmIENPTU1BTkRfU0VURUNQVElNSU5HKQorCQlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX1NldEVDUFRpbWluZywKKwkJICAgICAgICAgICBjYW0tPnBhcmFtcy5lY3BUaW1pbmcsIDAsIDAsIDApOworCisJaWYgKGNhbS0+Y21kX3F1ZXVlICYgQ09NTUFORF9QQVVTRSkKKwkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9FbmRTdHJlYW1DYXAsIDAsIDAsIDAsIDApOworCisJaWYgKGNhbS0+Y21kX3F1ZXVlICYgQ09NTUFORF9SRVNVTUUpCisJCWluaXRfc3RyZWFtX2NhcChjYW0pOworCisJaWYgKGNhbS0+Y21kX3F1ZXVlICYgQ09NTUFORF9TRVRMSUdIVFMgJiYgY2FtLT5wYXJhbXMucXgzLnF4M19kZXRlY3RlZCkKKwkgIHsKKwkgICAgaW50IHAxID0gKGNhbS0+cGFyYW1zLnF4My5ib3R0b21saWdodCA9PSAwKSA8PCAxOworICAgICAgICAgICAgaW50IHAyID0gKGNhbS0+cGFyYW1zLnF4My50b3BsaWdodCA9PSAwKSA8PCAzOworICAgICAgICAgICAgZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9Xcml0ZVZDUmVnLCAgMHg5MCwgMHg4RiwgMHg1MCwgMCk7CisgICAgICAgICAgICBkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX1dyaXRlTUNQb3J0LCAyLCAwLCAocDF8cDJ8MHhFMCksIDApOworCSAgfQorCisJY2FtLT5jbWRfcXVldWUgPSBDT01NQU5EX05PTkU7CisJdXAoJmNhbS0+cGFyYW1fbG9jayk7CisJcmV0dXJuOworfQorCisKKworc3RhdGljIHZvaWQgc2V0X2ZsaWNrZXIoc3RydWN0IGNhbV9wYXJhbXMgKnBhcmFtcywgdm9sYXRpbGUgdTMyICpjb21tYW5kX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9uKQoreworCS8qIEV2ZXJ5dGhpbmcgaW4gaGVyZSBpcyBmcm9tIHRoZSBXaW5kb3dzIGRyaXZlciAqLworI2RlZmluZSBGSVJNV0FSRV9WRVJTSU9OKHgseSkgKHBhcmFtcy0+dmVyc2lvbi5maXJtd2FyZVZlcnNpb24gPT0gKHgpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnZlcnNpb24uZmlybXdhcmVSZXZpc2lvbiA9PSAoeSkpCisvKiBkZWZpbmUgZm9yIGNvbXBnYWluIGNhbGN1bGF0aW9uICovCisjaWYgMAorI2RlZmluZSBDT01QR0FJTihiYXNlLCBjdXJleHAsIG5ld2V4cCkgXAorICAgICh1OCkgKCgoKGZsb2F0KSBiYXNlIC0gMTI4LjApICogKChmbG9hdCkgY3VyZXhwIC8gKGZsb2F0KSBuZXdleHApKSArIDEyOC41KQorI2RlZmluZSBFWFBfRlJPTV9DT01QKGJhc2Vjb21wLCBjdXJjb21wLCBjdXJleHApIFwKKyAgICAodTE2KSgoZmxvYXQpY3VyZXhwICogKGZsb2F0KSh1OCkoY3VyY29tcCArIDEyOCkgLyAoZmxvYXQpKHU4KShiYXNlY29tcCAtIDEyOCkpCisjZWxzZQorICAvKiBlcXVpdmFsZW50IGZ1bmN0aW9ucyB3aXRob3V0IGZsb2F0aW5nIHBvaW50IG1hdGggKi8KKyNkZWZpbmUgQ09NUEdBSU4oYmFzZSwgY3VyZXhwLCBuZXdleHApIFwKKyAgICAodTgpKDEyOCArICgoKHUzMikoMiooYmFzZS0xMjgpKmN1cmV4cCArIG5ld2V4cCkpIC8gKDIqIG5ld2V4cCkpICkKKyNkZWZpbmUgRVhQX0ZST01fQ09NUChiYXNlY29tcCwgY3VyY29tcCwgY3VyZXhwKSBcCisgICAgICh1MTYpKCgodTMyKShjdXJleHAgKiAodTgpKGN1cmNvbXAgKyAxMjgpKSAvICh1OCkoYmFzZWNvbXAgLSAxMjgpKSkKKyNlbmRpZgorCisgCisJaW50IGN1cnJlbnRleHAgPSBwYXJhbXMtPmV4cG9zdXJlLmNvYXJzZUV4cExvICsKKwkJCSBwYXJhbXMtPmV4cG9zdXJlLmNvYXJzZUV4cEhpKjI1NjsKKwlpbnQgc3RhcnRleHA7CisJaWYgKG9uKSB7CisJCWludCBjaiA9IHBhcmFtcy0+ZmxpY2tlckNvbnRyb2wuY29hcnNlSnVtcDsKKwkJcGFyYW1zLT5mbGlja2VyQ29udHJvbC5mbGlja2VyTW9kZSA9IDE7CisJCXBhcmFtcy0+ZmxpY2tlckNvbnRyb2wuZGlzYWJsZWQgPSAwOworCQlpZihwYXJhbXMtPmV4cG9zdXJlLmV4cE1vZGUgIT0gMikKKwkJCSpjb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VURVhQT1NVUkU7CisJCXBhcmFtcy0+ZXhwb3N1cmUuZXhwTW9kZSA9IDI7CisJCWN1cnJlbnRleHAgPSBjdXJyZW50ZXhwIDw8IHBhcmFtcy0+ZXhwb3N1cmUuZ2FpbjsKKwkJcGFyYW1zLT5leHBvc3VyZS5nYWluID0gMDsKKwkJLyogcm91bmQgZG93biBjdXJyZW50IGV4cG9zdXJlIHRvIG5lYXJlc3QgdmFsdWUgKi8KKwkJc3RhcnRleHAgPSAoY3VycmVudGV4cCArIFJPVU5EX1VQX0VYUF9GT1JfRkxJQ0tFUikgLyBjajsKKwkJaWYoc3RhcnRleHAgPCAxKQorCQkJc3RhcnRleHAgPSAxOworCQlzdGFydGV4cCA9IChzdGFydGV4cCAqIGNqKSAtIDE7CisJCWlmKEZJUk1XQVJFX1ZFUlNJT04oMSwyKSkKKwkJCXdoaWxlKHN0YXJ0ZXhwID4gTUFYX0VYUF8xMDIpCisJCQkJc3RhcnRleHAgLT0gY2o7CisJCWVsc2UKKwkJCXdoaWxlKHN0YXJ0ZXhwID4gTUFYX0VYUCkKKwkJCQlzdGFydGV4cCAtPSBjajsKKwkJcGFyYW1zLT5leHBvc3VyZS5jb2Fyc2VFeHBMbyA9IHN0YXJ0ZXhwICYgMHhmZjsKKwkJcGFyYW1zLT5leHBvc3VyZS5jb2Fyc2VFeHBIaSA9IHN0YXJ0ZXhwID4+IDg7CisJCWlmIChjdXJyZW50ZXhwID4gc3RhcnRleHApIHsKKwkJCWlmIChjdXJyZW50ZXhwID4gKDIgKiBzdGFydGV4cCkpCisJCQkJY3VycmVudGV4cCA9IDIgKiBzdGFydGV4cDsKKwkJCXBhcmFtcy0+ZXhwb3N1cmUucmVkQ29tcCA9IENPTVBHQUlOIChDT01QX1JFRCwgY3VycmVudGV4cCwgc3RhcnRleHApOworCQkJcGFyYW1zLT5leHBvc3VyZS5ncmVlbjFDb21wID0gQ09NUEdBSU4gKENPTVBfR1JFRU4xLCBjdXJyZW50ZXhwLCBzdGFydGV4cCk7CisJCQlwYXJhbXMtPmV4cG9zdXJlLmdyZWVuMkNvbXAgPSBDT01QR0FJTiAoQ09NUF9HUkVFTjIsIGN1cnJlbnRleHAsIHN0YXJ0ZXhwKTsKKwkJCXBhcmFtcy0+ZXhwb3N1cmUuYmx1ZUNvbXAgPSBDT01QR0FJTiAoQ09NUF9CTFVFLCBjdXJyZW50ZXhwLCBzdGFydGV4cCk7CisJCX0gZWxzZSB7CisJCQlwYXJhbXMtPmV4cG9zdXJlLnJlZENvbXAgPSBDT01QX1JFRDsKKwkJCXBhcmFtcy0+ZXhwb3N1cmUuZ3JlZW4xQ29tcCA9IENPTVBfR1JFRU4xOworCQkJcGFyYW1zLT5leHBvc3VyZS5ncmVlbjJDb21wID0gQ09NUF9HUkVFTjI7CisJCQlwYXJhbXMtPmV4cG9zdXJlLmJsdWVDb21wID0gQ09NUF9CTFVFOworCQl9CisJCWlmKEZJUk1XQVJFX1ZFUlNJT04oMSwyKSkKKwkJCXBhcmFtcy0+ZXhwb3N1cmUuY29tcE1vZGUgPSAwOworCQllbHNlIAorCQkJcGFyYW1zLT5leHBvc3VyZS5jb21wTW9kZSA9IDE7CisKKwkJcGFyYW1zLT5hcGNvci5nYWluMSA9IDB4MTg7CisJCXBhcmFtcy0+YXBjb3IuZ2FpbjIgPSAweDE4OworCQlwYXJhbXMtPmFwY29yLmdhaW40ID0gMHgxNjsKKwkJcGFyYW1zLT5hcGNvci5nYWluOCA9IDB4MTQ7CisJCSpjb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VUQVBDT1I7CisJfSBlbHNlIHsKKwkJcGFyYW1zLT5mbGlja2VyQ29udHJvbC5mbGlja2VyTW9kZSA9IDA7CisJCXBhcmFtcy0+ZmxpY2tlckNvbnRyb2wuZGlzYWJsZWQgPSAxOworCQkvKiBDb2Fyc2UgPSBhdmVyYWdlIG9mIGVxdWl2YWxlbnQgY29hcnNlIGZvciBlYWNoIGNvbXAgY2hhbm5lbCAqLworCQlzdGFydGV4cCA9IEVYUF9GUk9NX0NPTVAoQ09NUF9SRUQsIHBhcmFtcy0+ZXhwb3N1cmUucmVkQ29tcCwgY3VycmVudGV4cCk7CisJCXN0YXJ0ZXhwICs9IEVYUF9GUk9NX0NPTVAoQ09NUF9HUkVFTjEsIHBhcmFtcy0+ZXhwb3N1cmUuZ3JlZW4xQ29tcCwgY3VycmVudGV4cCk7CisJCXN0YXJ0ZXhwICs9IEVYUF9GUk9NX0NPTVAoQ09NUF9HUkVFTjIsIHBhcmFtcy0+ZXhwb3N1cmUuZ3JlZW4yQ29tcCwgY3VycmVudGV4cCk7CisJCXN0YXJ0ZXhwICs9IEVYUF9GUk9NX0NPTVAoQ09NUF9CTFVFLCBwYXJhbXMtPmV4cG9zdXJlLmJsdWVDb21wLCBjdXJyZW50ZXhwKTsKKwkJc3RhcnRleHAgPSBzdGFydGV4cCA+PiAyOworCQl3aGlsZShzdGFydGV4cCA+IE1BWF9FWFAgJiYKKwkJICAgICAgcGFyYW1zLT5leHBvc3VyZS5nYWluIDwgcGFyYW1zLT5leHBvc3VyZS5nYWluTW9kZS0xKSB7CisJCQlzdGFydGV4cCA9IHN0YXJ0ZXhwID4+IDE7CisJCQkrK3BhcmFtcy0+ZXhwb3N1cmUuZ2FpbjsKKwkJfQorCQlpZihGSVJNV0FSRV9WRVJTSU9OKDEsMikgJiYgc3RhcnRleHAgPiBNQVhfRVhQXzEwMikKKwkJCXN0YXJ0ZXhwID0gTUFYX0VYUF8xMDI7CisJCWlmKHN0YXJ0ZXhwID4gTUFYX0VYUCkKKwkJCXN0YXJ0ZXhwID0gTUFYX0VYUDsKKwkJcGFyYW1zLT5leHBvc3VyZS5jb2Fyc2VFeHBMbyA9IHN0YXJ0ZXhwJjB4ZmY7CisJCXBhcmFtcy0+ZXhwb3N1cmUuY29hcnNlRXhwSGkgPSBzdGFydGV4cCA+PiA4OworCQlwYXJhbXMtPmV4cG9zdXJlLnJlZENvbXAgPSBDT01QX1JFRDsKKwkJcGFyYW1zLT5leHBvc3VyZS5ncmVlbjFDb21wID0gQ09NUF9HUkVFTjE7CisJCXBhcmFtcy0+ZXhwb3N1cmUuZ3JlZW4yQ29tcCA9IENPTVBfR1JFRU4yOworCQlwYXJhbXMtPmV4cG9zdXJlLmJsdWVDb21wID0gQ09NUF9CTFVFOworCQlwYXJhbXMtPmV4cG9zdXJlLmNvbXBNb2RlID0gMTsKKwkJKmNvbW1hbmRfZmxhZ3MgfD0gQ09NTUFORF9TRVRFWFBPU1VSRTsKKwkJcGFyYW1zLT5hcGNvci5nYWluMSA9IDB4MTg7CisJCXBhcmFtcy0+YXBjb3IuZ2FpbjIgPSAweDE2OworCQlwYXJhbXMtPmFwY29yLmdhaW40ID0gMHgyNDsKKwkJcGFyYW1zLT5hcGNvci5nYWluOCA9IDB4MzQ7CisJCSpjb21tYW5kX2ZsYWdzIHw9IENPTU1BTkRfU0VUQVBDT1I7CisJfQorCXBhcmFtcy0+dmxPZmZzZXQuZ2FpbjEgPSAyMDsKKwlwYXJhbXMtPnZsT2Zmc2V0LmdhaW4yID0gMjQ7CisJcGFyYW1zLT52bE9mZnNldC5nYWluNCA9IDI2OworCXBhcmFtcy0+dmxPZmZzZXQuZ2FpbjggPSAyNjsKKwkqY29tbWFuZF9mbGFncyB8PSBDT01NQU5EX1NFVFZMT0ZGU0VUOworI3VuZGVmIEZJUk1XQVJFX1ZFUlNJT04KKyN1bmRlZiBFWFBfRlJPTV9DT01QCisjdW5kZWYgQ09NUEdBSU4KK30KKworI2RlZmluZSBGSVJNV0FSRV9WRVJTSU9OKHgseSkgKGNhbS0+cGFyYW1zLnZlcnNpb24uZmlybXdhcmVWZXJzaW9uID09ICh4KSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5wYXJhbXMudmVyc2lvbi5maXJtd2FyZVJldmlzaW9uID09ICh5KSkKKy8qIG1vbml0b3IgdGhlIGV4cG9zdXJlIGFuZCBhZGp1c3QgdGhlIHNlbnNvciBmcmFtZSByYXRlIGlmIG5lZWRlZCAqLworc3RhdGljIHZvaWQgbW9uaXRvcl9leHBvc3VyZShzdHJ1Y3QgY2FtX2RhdGEgKmNhbSkKK3sKKwl1OCBleHBfYWNjLCBiY29tcCwgZ2FpbiwgY29hcnNlTCwgY21kWzhdLCBkYXRhWzhdOworCWludCByZXR2YWwsIGxpZ2h0X2V4cCwgZGFya19leHAsIHZlcnlfZGFya19leHA7CisJaW50IG9sZF9leHBvc3VyZSwgbmV3X2V4cG9zdXJlLCBmcmFtZXJhdGU7CisJCisJLyogZ2V0IG5lY2Vzc2FyeSBzdGF0cyBhbmQgcmVnaXN0ZXIgc2V0dGluZ3MgZnJvbSBjYW1lcmEgKi8KKwkvKiBkb19jb21tYW5kIGNhbid0IGhhbmRsZSB0aGlzLCBzbyBkbyBpdCBvdXJzZWx2ZXMgKi8KKwljbWRbMF0gPSBDUElBX0NPTU1BTkRfUmVhZFZQUmVncz4+ODsKKwljbWRbMV0gPSBDUElBX0NPTU1BTkRfUmVhZFZQUmVncyYweGZmOworCWNtZFsyXSA9IDMwOworCWNtZFszXSA9IDQ7CisJY21kWzRdID0gOTsKKwljbWRbNV0gPSA4OworCWNtZFs2XSA9IDg7CisJY21kWzddID0gMDsKKwlyZXR2YWwgPSBjYW0tPm9wcy0+dHJhbnNmZXJDbWQoY2FtLT5sb3dsZXZlbF9kYXRhLCBjbWQsIGRhdGEpOworCWlmIChyZXR2YWwpIHsKKwkJTE9HKCJSZWFkVlBSZWdzKDMwLDQsOSw4KSAtIGZhaWxlZCwgcmV0dmFsPSVkXG4iLAorCQkgICAgcmV0dmFsKTsKKwkJcmV0dXJuOworCX0KKwlleHBfYWNjID0gZGF0YVswXTsKKwliY29tcCA9IGRhdGFbMV07CisJZ2FpbiA9IGRhdGFbMl07CisJY29hcnNlTCA9IGRhdGFbM107CisKKwlkb3duKCZjYW0tPnBhcmFtX2xvY2spOworCWxpZ2h0X2V4cCA9IGNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5icmlnaHRuZXNzICsKKwkgICAgICAgICAgICBUQyAtIDUwICsgRVhQX0FDQ19MSUdIVDsKKwlpZihsaWdodF9leHAgPiAyNTUpCisJCWxpZ2h0X2V4cCA9IDI1NTsKKwlkYXJrX2V4cCA9IGNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5icmlnaHRuZXNzICsKKwkgICAgICAgICAgIFRDIC0gNTAgLSBFWFBfQUNDX0RBUks7CisJaWYoZGFya19leHAgPCAwKQorCQlkYXJrX2V4cCA9IDA7CisJdmVyeV9kYXJrX2V4cCA9IGRhcmtfZXhwLzI7CisJCisJb2xkX2V4cG9zdXJlID0gY2FtLT5wYXJhbXMuZXhwb3N1cmUuY29hcnNlRXhwSGkgKiAyNTYgKworCSAgICAgICAgICAgICAgIGNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cExvOworCisJaWYoIWNhbS0+cGFyYW1zLmZsaWNrZXJDb250cm9sLmRpc2FibGVkKSB7CisJCS8qIEZsaWNrZXIgY29udHJvbCBvbiAqLworCQlpbnQgbWF4X2NvbXAgPSBGSVJNV0FSRV9WRVJTSU9OKDEsMikgPyBNQVhfQ09NUCA6IEhJR0hfQ09NUF8xMDI7CisJCWJjb21wICs9IDEyODsJLyogZGVjb2RlICovCisJCWlmKGJjb21wID49IG1heF9jb21wICYmIGV4cF9hY2MgPCBkYXJrX2V4cCkgeworCQkJLyogZGFyayAqLworCQkJaWYoZXhwX2FjYyA8IHZlcnlfZGFya19leHApIHsKKwkJCQkvKiB2ZXJ5IGRhcmsgKi8KKwkJCQlpZihjYW0tPmV4cG9zdXJlX3N0YXR1cyA9PSBFWFBPU1VSRV9WRVJZX0RBUkspCisJCQkJCSsrY2FtLT5leHBvc3VyZV9jb3VudDsKKwkJCQllbHNlIHsKKwkJCQkJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9WRVJZX0RBUks7CisJCQkJCWNhbS0+ZXhwb3N1cmVfY291bnQgPSAxOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyoganVzdCBkYXJrICovCisJCQkJaWYoY2FtLT5leHBvc3VyZV9zdGF0dXMgPT0gRVhQT1NVUkVfREFSSykKKwkJCQkJKytjYW0tPmV4cG9zdXJlX2NvdW50OworCQkJCWVsc2UgeworCQkJCQljYW0tPmV4cG9zdXJlX3N0YXR1cyA9IEVYUE9TVVJFX0RBUks7CisJCQkJCWNhbS0+ZXhwb3N1cmVfY291bnQgPSAxOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmKG9sZF9leHBvc3VyZSA8PSBMT1dfRVhQIHx8IGV4cF9hY2MgPiBsaWdodF9leHApIHsKKwkJCS8qIGxpZ2h0ICovCisJCQlpZihvbGRfZXhwb3N1cmUgPD0gVkVSWV9MT1dfRVhQKSB7CisJCQkJLyogdmVyeSBsaWdodCAqLworCQkJCWlmKGNhbS0+ZXhwb3N1cmVfc3RhdHVzID09IEVYUE9TVVJFX1ZFUllfTElHSFQpCisJCQkJCSsrY2FtLT5leHBvc3VyZV9jb3VudDsKKwkJCQllbHNlIHsKKwkJCQkJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9WRVJZX0xJR0hUOworCQkJCQljYW0tPmV4cG9zdXJlX2NvdW50ID0gMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIGp1c3QgbGlnaHQgKi8KKwkJCQlpZihjYW0tPmV4cG9zdXJlX3N0YXR1cyA9PSBFWFBPU1VSRV9MSUdIVCkKKwkJCQkJKytjYW0tPmV4cG9zdXJlX2NvdW50OworCQkJCWVsc2UgeworCQkJCQljYW0tPmV4cG9zdXJlX3N0YXR1cyA9IEVYUE9TVVJFX0xJR0hUOworCQkJCQljYW0tPmV4cG9zdXJlX2NvdW50ID0gMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBub3QgZGFyayBvciBsaWdodCAqLworCQkJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9OT1JNQUw7CisJCX0KKwl9IGVsc2UgeworCQkvKiBGbGlja2VyIGNvbnRyb2wgb2ZmICovCisJCWlmKG9sZF9leHBvc3VyZSA+PSBNQVhfRVhQICYmIGV4cF9hY2MgPCBkYXJrX2V4cCkgeworCQkJLyogZGFyayAqLworCQkJaWYoZXhwX2FjYyA8IHZlcnlfZGFya19leHApIHsKKwkJCQkvKiB2ZXJ5IGRhcmsgKi8KKwkJCQlpZihjYW0tPmV4cG9zdXJlX3N0YXR1cyA9PSBFWFBPU1VSRV9WRVJZX0RBUkspCisJCQkJCSsrY2FtLT5leHBvc3VyZV9jb3VudDsKKwkJCQllbHNlIHsKKwkJCQkJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9WRVJZX0RBUks7CisJCQkJCWNhbS0+ZXhwb3N1cmVfY291bnQgPSAxOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyoganVzdCBkYXJrICovCisJCQkJaWYoY2FtLT5leHBvc3VyZV9zdGF0dXMgPT0gRVhQT1NVUkVfREFSSykKKwkJCQkJKytjYW0tPmV4cG9zdXJlX2NvdW50OworCQkJCWVsc2UgeworCQkJCQljYW0tPmV4cG9zdXJlX3N0YXR1cyA9IEVYUE9TVVJFX0RBUks7CisJCQkJCWNhbS0+ZXhwb3N1cmVfY291bnQgPSAxOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmKG9sZF9leHBvc3VyZSA8PSBMT1dfRVhQIHx8IGV4cF9hY2MgPiBsaWdodF9leHApIHsKKwkJCS8qIGxpZ2h0ICovCisJCQlpZihvbGRfZXhwb3N1cmUgPD0gVkVSWV9MT1dfRVhQKSB7CisJCQkJLyogdmVyeSBsaWdodCAqLworCQkJCWlmKGNhbS0+ZXhwb3N1cmVfc3RhdHVzID09IEVYUE9TVVJFX1ZFUllfTElHSFQpCisJCQkJCSsrY2FtLT5leHBvc3VyZV9jb3VudDsKKwkJCQllbHNlIHsKKwkJCQkJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9WRVJZX0xJR0hUOworCQkJCQljYW0tPmV4cG9zdXJlX2NvdW50ID0gMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIGp1c3QgbGlnaHQgKi8KKwkJCQlpZihjYW0tPmV4cG9zdXJlX3N0YXR1cyA9PSBFWFBPU1VSRV9MSUdIVCkKKwkJCQkJKytjYW0tPmV4cG9zdXJlX2NvdW50OworCQkJCWVsc2UgeworCQkJCQljYW0tPmV4cG9zdXJlX3N0YXR1cyA9IEVYUE9TVVJFX0xJR0hUOworCQkJCQljYW0tPmV4cG9zdXJlX2NvdW50ID0gMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBub3QgZGFyayBvciBsaWdodCAqLworCQkJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9OT1JNQUw7CisJCX0KKwl9CisJCisJZnJhbWVyYXRlID0gY2FtLT5mcHM7CisJaWYoZnJhbWVyYXRlID4gMzAgfHwgZnJhbWVyYXRlIDwgMSkKKwkJZnJhbWVyYXRlID0gMTsKKwkKKwlpZighY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuZGlzYWJsZWQpIHsKKwkJLyogRmxpY2tlciBjb250cm9sIG9uICovCisJCWlmKChjYW0tPmV4cG9zdXJlX3N0YXR1cyA9PSBFWFBPU1VSRV9WRVJZX0RBUksgfHwKKwkJICAgIGNhbS0+ZXhwb3N1cmVfc3RhdHVzID09IEVYUE9TVVJFX0RBUkspICYmCisJCSAgIGNhbS0+ZXhwb3N1cmVfY291bnQgPj0gREFSS19USU1FKmZyYW1lcmF0ZSAmJgorCQkgICBjYW0tPnBhcmFtcy5zZW5zb3JGcHMuZGl2aXNvciA8IDMpIHsKKworCQkJLyogZGFyayBmb3IgdG9vIGxvbmcgKi8KKwkJCSsrY2FtLT5wYXJhbXMuc2Vuc29yRnBzLmRpdmlzb3I7CisJCQljYW0tPmNtZF9xdWV1ZSB8PSBDT01NQU5EX1NFVFNFTlNPUkZQUzsKKworCQkJY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuY29hcnNlSnVtcCA9IAorCQkJCWZsaWNrZXJfanVtcHNbY2FtLT5tYWluc0ZyZXFdCisJCQkJICAgICAgICAgICAgIFtjYW0tPnBhcmFtcy5zZW5zb3JGcHMuYmFzZXJhdGVdCisJCQkJICAgICAgICAgICAgIFtjYW0tPnBhcmFtcy5zZW5zb3JGcHMuZGl2aXNvcl07CisJCQljYW0tPmNtZF9xdWV1ZSB8PSBDT01NQU5EX1NFVEZMSUNLRVJDVFJMOworCisJCQluZXdfZXhwb3N1cmUgPSBjYW0tPnBhcmFtcy5mbGlja2VyQ29udHJvbC5jb2Fyc2VKdW1wLTE7CisJCQl3aGlsZShuZXdfZXhwb3N1cmUgPCBvbGRfZXhwb3N1cmUvMikKKwkJCQluZXdfZXhwb3N1cmUgKz0gY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuY29hcnNlSnVtcDsKKwkJCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cExvID0gbmV3X2V4cG9zdXJlICYgMHhmZjsKKwkJCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cEhpID0gbmV3X2V4cG9zdXJlID4+IDg7CisJCQljYW0tPmNtZF9xdWV1ZSB8PSBDT01NQU5EX1NFVEVYUE9TVVJFOworCQkJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9OT1JNQUw7CisJCQlMT0coIkF1dG9tYXRpY2FsbHkgZGVjcmVhc2luZyBzZW5zb3JfZnBzXG4iKTsKKworCQl9IGVsc2UgaWYoKGNhbS0+ZXhwb3N1cmVfc3RhdHVzID09IEVYUE9TVVJFX1ZFUllfTElHSFQgfHwKKwkJICAgIGNhbS0+ZXhwb3N1cmVfc3RhdHVzID09IEVYUE9TVVJFX0xJR0hUKSAmJgorCQkgICBjYW0tPmV4cG9zdXJlX2NvdW50ID49IExJR0hUX1RJTUUqZnJhbWVyYXRlICYmCisJCSAgIGNhbS0+cGFyYW1zLnNlbnNvckZwcy5kaXZpc29yID4gMCkgeworCisJCQkvKiBsaWdodCBmb3IgdG9vIGxvbmcgKi8KKwkJICAgCWludCBtYXhfZXhwID0gRklSTVdBUkVfVkVSU0lPTigxLDIpID8gTUFYX0VYUF8xMDIgOiBNQVhfRVhQIDsgCisKKwkJCS0tY2FtLT5wYXJhbXMuc2Vuc29yRnBzLmRpdmlzb3I7CisJCQljYW0tPmNtZF9xdWV1ZSB8PSBDT01NQU5EX1NFVFNFTlNPUkZQUzsKKworCQkJY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuY29hcnNlSnVtcCA9IAorCQkJCWZsaWNrZXJfanVtcHNbY2FtLT5tYWluc0ZyZXFdCisJCQkJICAgICAgICAgICAgIFtjYW0tPnBhcmFtcy5zZW5zb3JGcHMuYmFzZXJhdGVdCisJCQkJICAgICAgICAgICAgIFtjYW0tPnBhcmFtcy5zZW5zb3JGcHMuZGl2aXNvcl07CisJCQljYW0tPmNtZF9xdWV1ZSB8PSBDT01NQU5EX1NFVEZMSUNLRVJDVFJMOworCisJCQluZXdfZXhwb3N1cmUgPSBjYW0tPnBhcmFtcy5mbGlja2VyQ29udHJvbC5jb2Fyc2VKdW1wLTE7CisJCQl3aGlsZShuZXdfZXhwb3N1cmUgPCAyKm9sZF9leHBvc3VyZSAmJgorCQkJICAgICAgbmV3X2V4cG9zdXJlKworCQkJICAgICAgY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuY29hcnNlSnVtcCA8IG1heF9leHApCisJCQkJbmV3X2V4cG9zdXJlICs9IGNhbS0+cGFyYW1zLmZsaWNrZXJDb250cm9sLmNvYXJzZUp1bXA7CisJCQljYW0tPnBhcmFtcy5leHBvc3VyZS5jb2Fyc2VFeHBMbyA9IG5ld19leHBvc3VyZSAmIDB4ZmY7CisJCQljYW0tPnBhcmFtcy5leHBvc3VyZS5jb2Fyc2VFeHBIaSA9IG5ld19leHBvc3VyZSA+PiA4OworCQkJY2FtLT5jbWRfcXVldWUgfD0gQ09NTUFORF9TRVRFWFBPU1VSRTsKKwkJCWNhbS0+ZXhwb3N1cmVfc3RhdHVzID0gRVhQT1NVUkVfTk9STUFMOworCQkJTE9HKCJBdXRvbWF0aWNhbGx5IGluY3JlYXNpbmcgc2Vuc29yX2Zwc1xuIik7CisJCX0KKwl9IGVsc2UgeworCQkvKiBGbGlja2VyIGNvbnRyb2wgb2ZmICovCisJCWlmKChjYW0tPmV4cG9zdXJlX3N0YXR1cyA9PSBFWFBPU1VSRV9WRVJZX0RBUksgfHwKKwkJICAgIGNhbS0+ZXhwb3N1cmVfc3RhdHVzID09IEVYUE9TVVJFX0RBUkspICYmCisJCSAgIGNhbS0+ZXhwb3N1cmVfY291bnQgPj0gREFSS19USU1FKmZyYW1lcmF0ZSAmJgorCQkgICBjYW0tPnBhcmFtcy5zZW5zb3JGcHMuZGl2aXNvciA8IDMpIHsKKworCQkJLyogZGFyayBmb3IgdG9vIGxvbmcgKi8KKwkJCSsrY2FtLT5wYXJhbXMuc2Vuc29yRnBzLmRpdmlzb3I7CisJCQljYW0tPmNtZF9xdWV1ZSB8PSBDT01NQU5EX1NFVFNFTlNPUkZQUzsKKworCQkJaWYoY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ2FpbiA+IDApIHsKKwkJCQktLWNhbS0+cGFyYW1zLmV4cG9zdXJlLmdhaW47CisJCQkJY2FtLT5jbWRfcXVldWUgfD0gQ09NTUFORF9TRVRFWFBPU1VSRTsKKwkJCX0KKwkJCWNhbS0+ZXhwb3N1cmVfc3RhdHVzID0gRVhQT1NVUkVfTk9STUFMOworCQkJTE9HKCJBdXRvbWF0aWNhbGx5IGRlY3JlYXNpbmcgc2Vuc29yX2Zwc1xuIik7CisKKwkJfSBlbHNlIGlmKChjYW0tPmV4cG9zdXJlX3N0YXR1cyA9PSBFWFBPU1VSRV9WRVJZX0xJR0hUIHx8CisJCSAgICBjYW0tPmV4cG9zdXJlX3N0YXR1cyA9PSBFWFBPU1VSRV9MSUdIVCkgJiYKKwkJICAgY2FtLT5leHBvc3VyZV9jb3VudCA+PSBMSUdIVF9USU1FKmZyYW1lcmF0ZSAmJgorCQkgICBjYW0tPnBhcmFtcy5zZW5zb3JGcHMuZGl2aXNvciA+IDApIHsKKworCQkJLyogbGlnaHQgZm9yIHRvbyBsb25nICovCisJCQktLWNhbS0+cGFyYW1zLnNlbnNvckZwcy5kaXZpc29yOworCQkJY2FtLT5jbWRfcXVldWUgfD0gQ09NTUFORF9TRVRTRU5TT1JGUFM7CisKKwkJCWlmKGNhbS0+cGFyYW1zLmV4cG9zdXJlLmdhaW4gPAorCQkJICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ2Fpbk1vZGUtMSkgeworCQkJCSsrY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ2FpbjsKKwkJCQljYW0tPmNtZF9xdWV1ZSB8PSBDT01NQU5EX1NFVEVYUE9TVVJFOworCQkJfQorCQkJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9OT1JNQUw7CisJCQlMT0coIkF1dG9tYXRpY2FsbHkgaW5jcmVhc2luZyBzZW5zb3JfZnBzXG4iKTsKKwkJfQorCX0KKwl1cCgmY2FtLT5wYXJhbV9sb2NrKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBpZiBmbGlja2VyIGlzIHN3aXRjaGVkIG9mZiwgdGhpcyBmdW5jdGlvbiBzd2l0Y2hlcyBpdCBiYWNrIG9uLkl0IGNoZWNrcywKKyAgIGhvd2V2ZXIsIHRoYXQgY29uZGl0aW9ucyBhcmUgc3VpdGFibGUgYmVmb3JlIHJlc3RhcnRpbmcgaXQuCisgICBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgZmlybXdhcmUgdmVyc2lvbiAxLjIuCisKKyAgIEl0IGFsc28gYWRqdXN0IHRoZSBjb2xvdXIgYmFsYW5jZSB3aGVuIGFuIGV4cG9zdXJlIHN0ZXAgaXMgZGV0ZWN0ZWQgLSBhcworICAgbG9uZyBhcyBmbGlja2VyIGlzIHJ1bm5pbmcKKyovICAgCitzdGF0aWMgdm9pZCByZXN0YXJ0X2ZsaWNrZXIoc3RydWN0IGNhbV9kYXRhICpjYW0pCit7CisJaW50IGNhbV9leHBvc3VyZSwgb2xkX2V4cDsKKwlpZighRklSTVdBUkVfVkVSU0lPTigxLDIpKQorCQlyZXR1cm47CisJZG93bigmY2FtLT5wYXJhbV9sb2NrKTsKKwlpZihjYW0tPnBhcmFtcy5mbGlja2VyQ29udHJvbC5mbGlja2VyTW9kZSA9PSAwIHx8CisJICAgY2FtLT5yYXdfaW1hZ2VbMzldID09IDApIHsKKwkJdXAoJmNhbS0+cGFyYW1fbG9jayk7CisJCXJldHVybjsKKwl9CisJY2FtX2V4cG9zdXJlID0gY2FtLT5yYXdfaW1hZ2VbMzldKjI7CisJb2xkX2V4cCA9IGNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cExvICsKKwkgICAgICAgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuY29hcnNlRXhwSGkqMjU2OworIAkvKiAKKwkgIHNlZSBob3cgZmFyIGF3YXkgY2FtZXJhIGV4cG9zdXJlIGlzIGZyb20gYSB2YWxpZCAKKyAJICBmbGlja2VyIGV4cG9zdXJlIHZhbHVlCisgCSovCisgCWNhbV9leHBvc3VyZSAlPSBjYW0tPnBhcmFtcy5mbGlja2VyQ29udHJvbC5jb2Fyc2VKdW1wOworCWlmKCFjYW0tPnBhcmFtcy5mbGlja2VyQ29udHJvbC5kaXNhYmxlZCAmJgorICAgICAJICAgY2FtX2V4cG9zdXJlIDw9IGNhbS0+cGFyYW1zLmZsaWNrZXJDb250cm9sLmNvYXJzZUp1bXAgLSAzKSB7CisJCS8qIEZsaWNrZXIgY29udHJvbCBhdXRvLWRpc2FibGVkICovCisJCWNhbS0+cGFyYW1zLmZsaWNrZXJDb250cm9sLmRpc2FibGVkID0gMTsKKwl9CisJCisJaWYoY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuZGlzYWJsZWQgJiYKKwkgICBjYW0tPnBhcmFtcy5mbGlja2VyQ29udHJvbC5mbGlja2VyTW9kZSAmJgorCSAgIG9sZF9leHAgPiBjYW0tPnBhcmFtcy5mbGlja2VyQ29udHJvbC5jb2Fyc2VKdW1wICsKKwkgICAgICAgICAgICAgUk9VTkRfVVBfRVhQX0ZPUl9GTElDS0VSKSB7CisJCS8qIGV4cG9zdXJlIGlzIG5vdyBoaWdoIGVub3VnaCB0byBzd2l0Y2gKKwkJICAgZmxpY2tlciBjb250cm9sIGJhY2sgb24gKi8KKwkJc2V0X2ZsaWNrZXIoJmNhbS0+cGFyYW1zLCAmY2FtLT5jbWRfcXVldWUsIDEpOworCQlpZigoY2FtLT5jbWRfcXVldWUgJiBDT01NQU5EX1NFVEVYUE9TVVJFKSAmJgorCQkgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5leHBNb2RlID09IDIpCisJCQljYW0tPmV4cG9zdXJlX3N0YXR1cyA9IEVYUE9TVVJFX05PUk1BTDsKKworCX0KKwl1cCgmY2FtLT5wYXJhbV9sb2NrKTsKK30KKyN1bmRlZiBGSVJNV0FSRV9WRVJTSU9OCisKK3N0YXRpYyBpbnQgY2xlYXJfc3RhbGwoc3RydWN0IGNhbV9kYXRhICpjYW0pCit7CisJLyogRklYTUU6IERvZXMgdGhpcyBhY3R1YWxseSB3b3JrPyAqLworCUxPRygiQ2xlYXJpbmcgc3RhbGxcbiIpOworCQorCWNhbS0+b3BzLT5zdHJlYW1SZWFkKGNhbS0+bG93bGV2ZWxfZGF0YSwgY2FtLT5yYXdfaW1hZ2UsIDApOworCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfR2V0Q2FtZXJhU3RhdHVzLDAsMCwwLDApOworCXJldHVybiBjYW0tPnBhcmFtcy5zdGF0dXMuc3RyZWFtU3RhdGUgIT0gU1RSRUFNX1BBVVNFRDsKK30KKworLyoga2VybmVsIHRocmVhZCBmdW5jdGlvbiB0byByZWFkIGltYWdlIGZyb20gY2FtZXJhICovCitzdGF0aWMgaW50IGZldGNoX2ZyYW1lKHZvaWQgKmRhdGEpCit7CisJaW50IGltYWdlX3NpemUsIHJldHJ5OworCXN0cnVjdCBjYW1fZGF0YSAqY2FtID0gKHN0cnVjdCBjYW1fZGF0YSAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBvbGRqaWYsIHJhdGUsIGRpZmY7CisKKwkvKiBBbGxvdyB1cCB0byB0d28gYmFkIGltYWdlcyBpbiBhIHJvdyB0byBiZSByZWFkIGFuZAorCSAqIGlnbm9yZWQgYmVmb3JlIGFuIGVycm9yIGlzIHJlcG9ydGVkICovCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMzsgKytyZXRyeSkgeworCQlpZiAocmV0cnkpCisJCQlEQkcoInJldHJ5PSVkXG4iLCByZXRyeSk7CisKKwkJaWYgKCFjYW0tPm9wcykKKwkJCWNvbnRpbnVlOworCisJCS8qIGxvYWQgZmlyc3QgZnJhbWUgYWx3YXlzIHVuY29tcHJlc3NlZCAqLworCQlpZiAoY2FtLT5maXJzdF9mcmFtZSAmJgorCQkgICAgY2FtLT5wYXJhbXMuY29tcHJlc3Npb24ubW9kZSAhPSBDUElBX0NPTVBSRVNTSU9OX05PTkUpIHsKKwkJCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfU2V0Q29tcHJlc3Npb24sCisJCQkJICAgQ1BJQV9DT01QUkVTU0lPTl9OT05FLAorCQkJCSAgIE5PX0RFQ0lNQVRJT04sIDAsIDApOworCQkJLyogVHJpYWwgJiBlcnJvciAtIERpc2NhcmRpbmcgYSBmcmFtZSBwcmV2ZW50cyB0aGUKKwkJCSAgIGZpcnN0IGZyYW1lIGZyb20gaGF2aW5nIGFuIGVycm9yIGluIHRoZSBkYXRhLiAqLworCQkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9EaXNjYXJkRnJhbWUsIDAsIDAsIDAsIDApOworCQl9CisKKwkJLyogaW5pdCBjYW1lcmEgdXBsb2FkICovCisJCWlmIChkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX0dyYWJGcmFtZSwgMCwKKwkJCSAgICAgICBjYW0tPnBhcmFtcy5zdHJlYW1TdGFydExpbmUsIDAsIDApKQorCQkJY29udGludWU7CisKKwkJaWYgKGNhbS0+b3BzLT53YWl0X2Zvcl9zdHJlYW1fcmVhZHkpIHsKKwkJCS8qIGxvb3AgdW50aWwgaW1hZ2UgcmVhZHkgKi8KKwkJCWludCBjb3VudCA9IDA7CisJCQlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX0dldENhbWVyYVN0YXR1cywwLDAsMCwwKTsKKwkJCXdoaWxlIChjYW0tPnBhcmFtcy5zdGF0dXMuc3RyZWFtU3RhdGUgIT0gU1RSRUFNX1JFQURZKSB7CisJCQkJaWYoKytjb3VudCA+IFJFQURZX1RJTUVPVVQpCisJCQkJCWJyZWFrOworCQkJCWlmKGNhbS0+cGFyYW1zLnN0YXR1cy5zdHJlYW1TdGF0ZSA9PQorCQkJCSAgIFNUUkVBTV9QQVVTRUQpIHsKKwkJCQkJLyogQmFkIG5ld3MgKi8KKwkJCQkJaWYoIWNsZWFyX3N0YWxsKGNhbSkpCisJCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisKKwkJCQljb25kX3Jlc2NoZWQoKTsKKworCQkJCS8qIHNsZWVwIGZvciAxMCBtcywgaG9wZWZ1bGx5IDspICovCisJCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQkJcmV0dXJuIC1FSU5UUjsKKworCQkJCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfR2V0Q2FtZXJhU3RhdHVzLAorCQkJCSAgICAgICAgICAgMCwgMCwgMCwgMCk7CisJCQl9CisJCQlpZihjYW0tPnBhcmFtcy5zdGF0dXMuc3RyZWFtU3RhdGUgIT0gU1RSRUFNX1JFQURZKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQljb25kX3Jlc2NoZWQoKTsKKworCQkvKiBncmFiIGltYWdlIGZyb20gY2FtZXJhICovCisJCW9sZGppZiA9IGppZmZpZXM7CisJCWltYWdlX3NpemUgPSBjYW0tPm9wcy0+c3RyZWFtUmVhZChjYW0tPmxvd2xldmVsX2RhdGEsCisJCQkJCQkgIGNhbS0+cmF3X2ltYWdlLCAwKTsKKwkJaWYgKGltYWdlX3NpemUgPD0gMCkgeworCQkJREJHKCJzdHJlYW1SZWFkIGZhaWxlZDogJWRcbiIsIGltYWdlX3NpemUpOworCQkJY29udGludWU7CisJCX0KKworCQlyYXRlID0gaW1hZ2Vfc2l6ZSAqIEhaIC8gMTAyNDsKKwkJZGlmZiA9IGppZmZpZXMtb2xkamlmOworCQljYW0tPnRyYW5zZmVyX3JhdGUgPSBkaWZmPT0wID8gcmF0ZSA6IHJhdGUvZGlmZjsKKwkJCS8qIGRpZmY9PTAgPyB1bmxpa2VseSBidXQgcG9zc2libGUgKi8KKworCQkvKiBTd2l0Y2ggZmxpY2tlciBjb250cm9sIGJhY2sgb24gaWYgaXQgZ290IHR1cm5lZCBvZmYgKi8KKwkJcmVzdGFydF9mbGlja2VyKGNhbSk7CisJCQorCQkvKiBJZiBBRUMgaXMgZW5hYmxlZCwgbW9uaXRvciB0aGUgZXhwb3N1cmUgYW5kCisJCSAgIGFkanVzdCB0aGUgc2Vuc29yIGZyYW1lIHJhdGUgaWYgbmVlZGVkICovCisJCWlmKGNhbS0+cGFyYW1zLmV4cG9zdXJlLmV4cE1vZGUgPT0gMikKKwkJCW1vbml0b3JfZXhwb3N1cmUoY2FtKTsKKwkJCisJCS8qIGNhbWVyYSBpZGxlIG5vdyBzbyBkaXNwYXRjaCBxdWV1ZWQgY29tbWFuZHMgKi8KKwkJZGlzcGF0Y2hfY29tbWFuZHMoY2FtKTsKKworCQkvKiBVcGRhdGUgb3VyIGtub3dsZWRnZSBvZiB0aGUgY2FtZXJhIHN0YXRlICovCisgCQlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX0dldENvbG91ckJhbGFuY2UsIDAsIDAsIDAsIDApOworIAkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9HZXRFeHBvc3VyZSwgMCwgMCwgMCwgMCk7CisJCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfUmVhZE1DUG9ydHMsIDAsIDAsIDAsIDApOworCisJCS8qIGRlY29tcHJlc3MgYW5kIGNvbnZlcnQgaW1hZ2UgdG8gYnkgY29weWluZyBpdCBmcm9tCisJCSAqIHJhd19pbWFnZSB0byBkZWNvbXByZXNzZWRfZnJhbWUKKwkJICovCisKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJY2FtLT5pbWFnZV9zaXplID0gcGFyc2VfcGljdHVyZShjYW0sIGltYWdlX3NpemUpOworCQlpZiAoY2FtLT5pbWFnZV9zaXplIDw9IDApIHsKKwkJCURCRygicGFyc2VfcGljdHVyZSBmYWlsZWQgJWRcbiIsIGNhbS0+aW1hZ2Vfc2l6ZSk7CisJCQlpZihjYW0tPnBhcmFtcy5jb21wcmVzc2lvbi5tb2RlICE9CisJCQkgICBDUElBX0NPTVBSRVNTSU9OX05PTkUpIHsKKwkJCQkvKiBDb21wcmVzc2lvbiBtYXkgbm90IHdvcmsgcmlnaHQgaWYgd2UKKwkJCQkgICBoYWQgYSBiYWQgZnJhbWUsIGdldCB0aGUgbmV4dCBvbmUKKwkJCQkgICB1bmNvbXByZXNzZWQuICovCisJCQkJY2FtLT5maXJzdF9mcmFtZSA9IDE7CisJCQkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9TZXRHcmFiTW9kZSwKKwkJICAgICAgICAJCSAgIENQSUFfR1JBQl9TSU5HTEUsIDAsIDAsIDApOworCQkJCS8qIEZJWE1FOiBUcmlhbCAmIGVycm9yIC0gbmVlZCB1cCB0byA3MG1zIGZvcgorCQkJCSAgIHRoZSBncmFiIG1vZGUgY2hhbmdlIHRvIGNvbXBsZXRlID8gKi8KKwkJCQltc2xlZXBfaW50ZXJydXB0aWJsZSg3MCk7CisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKworCWlmIChyZXRyeSA8IDMpIHsKKwkJLyogRklYTUU6IHRoaXMgb25seSB3b3JrcyBmb3IgZG91YmxlIGJ1ZmZlcmluZyAqLworCQlpZiAoY2FtLT5mcmFtZVtjYW0tPmN1cmZyYW1lXS5zdGF0ZSA9PSBGUkFNRV9SRUFEWSkgeworCQkJbWVtY3B5KGNhbS0+ZnJhbWVbY2FtLT5jdXJmcmFtZV0uZGF0YSwKKwkJCSAgICAgICBjYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5kYXRhLAorCQkJICAgICAgIGNhbS0+ZGVjb21wcmVzc2VkX2ZyYW1lLmNvdW50KTsKKwkJCWNhbS0+ZnJhbWVbY2FtLT5jdXJmcmFtZV0uc3RhdGUgPSBGUkFNRV9ET05FOworCQl9IGVsc2UKKwkJCWNhbS0+ZGVjb21wcmVzc2VkX2ZyYW1lLnN0YXRlID0gRlJBTUVfRE9ORTsKKworCQlpZiAoY2FtLT5maXJzdF9mcmFtZSkgeworCQkJY2FtLT5maXJzdF9mcmFtZSA9IDA7CisJCQlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX1NldENvbXByZXNzaW9uLAorCQkgICAgICAgIAkgICBjYW0tPnBhcmFtcy5jb21wcmVzc2lvbi5tb2RlLAorCQkJCSAgIGNhbS0+cGFyYW1zLmNvbXByZXNzaW9uLmRlY2ltYXRpb24sIDAsIDApOworCisJCQkvKiBTd2l0Y2ggZnJvbSBzaW5nbGUtZ3JhYiB0byBjb250aW51b3VzIGdyYWIgKi8KKwkJCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfU2V0R3JhYk1vZGUsCisJCSAgICAgICAgCSAgIENQSUFfR1JBQl9DT05USU5VT1VTLCAwLCAwLCAwKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgY2FwdHVyZV9mcmFtZShzdHJ1Y3QgY2FtX2RhdGEgKmNhbSwgc3RydWN0IHZpZGVvX21tYXAgKnZtKQoreworCWlmICghY2FtLT5mcmFtZV9idWYpIHsKKwkJLyogd2UgZG8gbGF6eSBhbGxvY2F0aW9uICovCisJCWludCBlcnI7CisJCWlmICgoZXJyID0gYWxsb2NhdGVfZnJhbWVfYnVmKGNhbSkpKQorCQkJcmV0dXJuIGVycjsKKwl9CisJCisJY2FtLT5jdXJmcmFtZSA9IHZtLT5mcmFtZTsKKwljYW0tPmZyYW1lW2NhbS0+Y3VyZnJhbWVdLnN0YXRlID0gRlJBTUVfUkVBRFk7CisJcmV0dXJuIGZldGNoX2ZyYW1lKGNhbSk7Cit9CisgIAorc3RhdGljIGludCBnb3RvX2hpZ2hfcG93ZXIoc3RydWN0IGNhbV9kYXRhICpjYW0pCit7CisJaWYgKGRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfR290b0hpUG93ZXIsIDAsIDAsIDAsIDApKQorCQlyZXR1cm4gLUVJTzsKKwltc2xlZXBfaW50ZXJydXB0aWJsZSg0MCk7CS8qIHdpbmRvd3MgZHJpdmVyIGRvZXMgaXQgdG9vICovCisJaWYoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRUlOVFI7CisJaWYgKGRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfR2V0Q2FtZXJhU3RhdHVzLCAwLCAwLCAwLCAwKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGNhbS0+cGFyYW1zLnN0YXR1cy5zeXN0ZW1TdGF0ZSA9PSBISV9QT1dFUl9TVEFURSkgeworCQlEQkcoImNhbWVyYSBub3cgaW4gSElHSCBwb3dlciBzdGF0ZVxuIik7CisJCXJldHVybiAwOworCX0KKwlwcmludHN0YXR1cyhjYW0pOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGdvdG9fbG93X3Bvd2VyKHN0cnVjdCBjYW1fZGF0YSAqY2FtKQoreworCWlmIChkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX0dvdG9Mb1Bvd2VyLCAwLCAwLCAwLCAwKSkKKwkJcmV0dXJuIC0xOworCWlmIChkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX0dldENhbWVyYVN0YXR1cywgMCwgMCwgMCwgMCkpCisJCXJldHVybiAtMTsKKwlpZiAoY2FtLT5wYXJhbXMuc3RhdHVzLnN5c3RlbVN0YXRlID09IExPX1BPV0VSX1NUQVRFKSB7CisJCURCRygiY2FtZXJhIG5vdyBpbiBMT1cgcG93ZXIgc3RhdGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcHJpbnRzdGF0dXMoY2FtKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfY2FtZXJhX3N0YXRlKHN0cnVjdCBjYW1fZGF0YSAqY2FtKQoreworCWlmKCEoY2FtLT5jbWRfcXVldWUgJiBDT01NQU5EX1NFVENPTE9VUkJBTEFOQ0UpKQorCQlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX0dldENvbG91ckJhbGFuY2UsIDAsIDAsIDAsIDApOworCWlmKCEoY2FtLT5jbWRfcXVldWUgJiBDT01NQU5EX1NFVEVYUE9TVVJFKSkKKwkJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9HZXRFeHBvc3VyZSwgMCwgMCwgMCwgMCk7CisKKwlEQkcoIiVkLyVkLyVkLyVkLyVkLyVkLyVkLyVkXG4iLAorCSAgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ2FpbiwKKwkgICAgIGNhbS0+cGFyYW1zLmV4cG9zdXJlLmZpbmVFeHAsCisJICAgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5jb2Fyc2VFeHBMbywKKwkgICAgIGNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cEhpLAorCSAgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUucmVkQ29tcCwKKwkgICAgIGNhbS0+cGFyYW1zLmV4cG9zdXJlLmdyZWVuMUNvbXAsCisJICAgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5ncmVlbjJDb21wLAorCSAgICAgY2FtLT5wYXJhbXMuZXhwb3N1cmUuYmx1ZUNvbXApOworCURCRygiJWQvJWQvJWRcbiIsCisJICAgICBjYW0tPnBhcmFtcy5jb2xvdXJCYWxhbmNlLnJlZEdhaW4sCisJICAgICBjYW0tPnBhcmFtcy5jb2xvdXJCYWxhbmNlLmdyZWVuR2FpbiwKKwkgICAgIGNhbS0+cGFyYW1zLmNvbG91ckJhbGFuY2UuYmx1ZUdhaW4pOworfQorCitzdGF0aWMgaW50IHNldF9jYW1lcmFfc3RhdGUoc3RydWN0IGNhbV9kYXRhICpjYW0pCit7CisJY2FtLT5jbWRfcXVldWUgPSBDT01NQU5EX1NFVENPTVBSRVNTSU9OIHwKKwkgICAgICAgICAgICAgICAgIENPTU1BTkRfU0VUQ09NUFJFU1NJT05UQVJHRVQgfAorCSAgICAgICAgICAgICAgICAgQ09NTUFORF9TRVRDT0xPVVJQQVJBTVMgfAorCSAgICAgICAgICAgICAgICAgQ09NTUFORF9TRVRGT1JNQVQgfAorCSAgICAgICAgICAgICAgICAgQ09NTUFORF9TRVRZVVZUSFJFU0ggfAorCSAgICAgICAgICAgICAgICAgQ09NTUFORF9TRVRFQ1BUSU1JTkcgfAorCSAgICAgICAgICAgICAgICAgQ09NTUFORF9TRVRDT01QUkVTU0lPTlBBUkFNUyB8CisJICAgICAgICAgICAgICAgICBDT01NQU5EX1NFVEVYUE9TVVJFIHwKKwkgICAgICAgICAgICAgICAgIENPTU1BTkRfU0VUQ09MT1VSQkFMQU5DRSB8CisJICAgICAgICAgICAgICAgICBDT01NQU5EX1NFVFNFTlNPUkZQUyB8CisJICAgICAgICAgICAgICAgICBDT01NQU5EX1NFVEFQQ09SIHwKKwkgICAgICAgICAgICAgICAgIENPTU1BTkRfU0VURkxJQ0tFUkNUUkwgfAorCSAgICAgICAgICAgICAgICAgQ09NTUFORF9TRVRWTE9GRlNFVDsKKworCWRvX2NvbW1hbmQoY2FtLCBDUElBX0NPTU1BTkRfU2V0R3JhYk1vZGUsIENQSUFfR1JBQl9TSU5HTEUsMCwwLDApOworCWRpc3BhdGNoX2NvbW1hbmRzKGNhbSk7CisJCisJLyogV2FpdCA2IGZyYW1lcyBmb3IgdGhlIHNlbnNvciB0byBnZXQgYWxsIHNldHRpbmdzIGFuZAorCSAgIEFFQy9BQ0IgdG8gc2V0dGxlICovCisJbXNsZWVwX2ludGVycnVwdGlibGUoNiooY2FtLT5wYXJhbXMuc2Vuc29yRnBzLmJhc2VyYXRlID8gMzMgOiA0MCkgKgorCQkJICAgICAgICgxIDw8IGNhbS0+cGFyYW1zLnNlbnNvckZwcy5kaXZpc29yKSArIDEwKTsKKworCWlmKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCQorCXNhdmVfY2FtZXJhX3N0YXRlKGNhbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X3ZlcnNpb25faW5mb3JtYXRpb24oc3RydWN0IGNhbV9kYXRhICpjYW0pCit7CisJLyogR2V0Q1BJQVZlcnNpb24gKi8KKwlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX0dldENQSUFWZXJzaW9uLCAwLCAwLCAwLCAwKTsKKworCS8qIEdldFBuUElEICovCisJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9HZXRQblBJRCwgMCwgMCwgMCwgMCk7Cit9CisKKy8qIGluaXRpYWxpemUgY2FtZXJhICovCitzdGF0aWMgaW50IHJlc2V0X2NhbWVyYShzdHJ1Y3QgY2FtX2RhdGEgKmNhbSkKK3sKKwlpbnQgZXJyOworCS8qIFN0YXJ0IHRoZSBjYW1lcmEgaW4gbG93IHBvd2VyIG1vZGUgKi8KKwlpZiAoZ290b19sb3dfcG93ZXIoY2FtKSkgeworCQlpZiAoY2FtLT5wYXJhbXMuc3RhdHVzLnN5c3RlbVN0YXRlICE9IFdBUk1fQk9PVF9TVEFURSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCS8qIEZJWE1FOiB0aGlzIGlzIGp1c3QgZGlydHkgdHJpYWwgYW5kIGVycm9yICovCisJCWVyciA9IGdvdG9faGlnaF9wb3dlcihjYW0pOworCQlpZihlcnIpCisJCQlyZXR1cm4gZXJyOworCQlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX0Rpc2NhcmRGcmFtZSwgMCwgMCwgMCwgMCk7CisJCWlmIChnb3RvX2xvd19wb3dlcihjYW0pKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCS8qIHByb2NlZHVyZSBkZXNjcmliZWQgaW4gZGV2ZWxvcGVyJ3MgZ3VpZGUgcDMtMjggKi8KKwkKKwkvKiBDaGVjayB0aGUgZmlybXdhcmUgdmVyc2lvbi4gKi8KKwljYW0tPnBhcmFtcy52ZXJzaW9uLmZpcm13YXJlVmVyc2lvbiA9IDA7CisJZ2V0X3ZlcnNpb25faW5mb3JtYXRpb24oY2FtKTsKKwlpZiAoY2FtLT5wYXJhbXMudmVyc2lvbi5maXJtd2FyZVZlcnNpb24gIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBBIGJ1ZyBpbiBmaXJtd2FyZSAxLTAyIGxpbWl0cyBnYWluTW9kZSB0byAyICovCisJaWYoY2FtLT5wYXJhbXMudmVyc2lvbi5maXJtd2FyZVJldmlzaW9uIDw9IDIgJiYKKwkgICBjYW0tPnBhcmFtcy5leHBvc3VyZS5nYWluTW9kZSA+IDIpIHsKKwkJY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ2Fpbk1vZGUgPSAyOworCX0KKworCS8qIHNldCBRWDMgZGV0ZWN0ZWQgZmxhZyAqLworCWNhbS0+cGFyYW1zLnF4My5xeDNfZGV0ZWN0ZWQgPSAoY2FtLT5wYXJhbXMucG5wSUQudmVuZG9yID09IDB4MDgxMyAmJgorCQkJCQljYW0tPnBhcmFtcy5wbnBJRC5wcm9kdWN0ID09IDB4MDAwMSk7CisKKyAJLyogVGhlIGZhdGFsIGVycm9yIGNoZWNraW5nIHNob3VsZCBiZSBkb25lIGFmdGVyCisJICogdGhlIGNhbWVyYSBwb3dlcnMgdXAgKGRldmVsb3BlcidzIGd1aWRlIHAgMy0zOCkgKi8KKworCS8qIFNldCBzdHJlYW1TdGF0ZSBiZWZvcmUgdHJhbnNpdGlvbiB0byBoaWdoIHBvd2VyIHRvIGF2b2lkIGJ1ZworCSAqIGluIGZpcm13YXJlIDEtMDIgKi8KKwlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX01vZGlmeUNhbWVyYVN0YXR1cywgU1RSRUFNU1RBVEUsIDAsCisJICAgICAgICAgICBTVFJFQU1fTk9UX1JFQURZLCAwKTsKKwkKKwkvKiBHb3RvSGlQb3dlciAqLworCWVyciA9IGdvdG9faGlnaF9wb3dlcihjYW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBDaGVjayB0aGUgY2FtZXJhIHN0YXR1cyAqLworCWlmIChkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX0dldENhbWVyYVN0YXR1cywgMCwgMCwgMCwgMCkpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNhbS0+cGFyYW1zLnN0YXR1cy5mYXRhbEVycm9yKSB7CisJCURCRygiZmF0YWxfZXJyb3I6ICAgICAgICAgICAgICAlIzA0eFxuIiwKKwkJICAgIGNhbS0+cGFyYW1zLnN0YXR1cy5mYXRhbEVycm9yKTsKKwkJREJHKCJ2cF9zdGF0dXM6ICAgICAgICAgICAgICAgICUjMDR4XG4iLAorCQkgICAgY2FtLT5wYXJhbXMuc3RhdHVzLnZwU3RhdHVzKTsKKwkJaWYgKGNhbS0+cGFyYW1zLnN0YXR1cy5mYXRhbEVycm9yICYgfihDT01fRkxBR3xDUElBX0ZMQUcpKSB7CisJCQkvKiBGYXRhbCBlcnJvciBpbiBjYW1lcmEgKi8KKwkJCXJldHVybiAtRUlPOworCQl9IGVsc2UgaWYgKGNhbS0+cGFyYW1zLnN0YXR1cy5mYXRhbEVycm9yICYgKENPTV9GTEFHfENQSUFfRkxBRykpIHsKKwkJCS8qIEZpcm13YXJlIDEtMDIgbWF5IGRvIHRoaXMgZm9yIHBhcmFsbGVsIHBvcnQgY2FtZXJhcywKKwkJCSAqIGp1c3QgY2xlYXIgdGhlIGZsYWdzIChkZXZlbG9wZXIncyBndWlkZSBwIDMtMzgpICovCisJCQlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX01vZGlmeUNhbWVyYVN0YXR1cywKKwkJCSAgICAgICAgICAgRkFUQUxFUlJPUiwgfihDT01fRkxBR3xDUElBX0ZMQUcpLCAwLCAwKTsKKwkJfQorCX0KKwkKKwkvKiBDaGVjayB0aGUgY2FtZXJhIHN0YXR1cyBhZ2FpbiAqLworCWlmIChjYW0tPnBhcmFtcy5zdGF0dXMuZmF0YWxFcnJvcikgeworCQlpZiAoY2FtLT5wYXJhbXMuc3RhdHVzLmZhdGFsRXJyb3IpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisJCisJLyogVlBWZXJzaW9uIGNhbid0IGJlIHJldHJpZXZlZCBiZWZvcmUgdGhlIGNhbWVyYSBpcyBpbiBIaVBvd2VyLAorCSAqIHNvIGdldCBpdCBoZXJlIGluc3RlYWQgb2YgaW4gZ2V0X3ZlcnNpb25faW5mb3JtYXRpb24uICovCisJZG9fY29tbWFuZChjYW0sIENQSUFfQ09NTUFORF9HZXRWUFZlcnNpb24sIDAsIDAsIDAsIDApOworCisJLyogc2V0IGNhbWVyYSB0byBhIGtub3duIHN0YXRlICovCisJcmV0dXJuIHNldF9jYW1lcmFfc3RhdGUoY2FtKTsKK30KKworc3RhdGljIHZvaWQgcHV0X2NhbShzdHJ1Y3QgY3BpYV9jYW1lcmFfb3BzKiBvcHMpCit7CisJaWYgKG9wcy0+b3duZXIpCisJCW1vZHVsZV9wdXQob3BzLT5vd25lcik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVjRMIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgY3BpYV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IGNhbV9kYXRhICpjYW0gPSBkZXYtPnByaXY7CisJaW50IGVycjsKKworCWlmICghY2FtKSB7CisJCURCRygiSW50ZXJuYWwgZXJyb3IsIGNhbV9kYXRhIG5vdCBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY2FtLT5vcGVuX2NvdW50ID4gMCkgeworCQlEQkcoIkNhbWVyYSBhbHJlYWR5IG9wZW5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICghdHJ5X21vZHVsZV9nZXQoY2FtLT5vcHMtPm93bmVyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkb3duKCZjYW0tPmJ1c3lfbG9jayk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWNhbS0+cmF3X2ltYWdlKSB7CisJCWNhbS0+cmF3X2ltYWdlID0gcnZtYWxsb2MoQ1BJQV9NQVhfSU1BR0VfU0laRSk7CisJCWlmICghY2FtLT5yYXdfaW1hZ2UpCisJCQlnb3RvIG9vcHM7CisJfQorCQorCWlmICghY2FtLT5kZWNvbXByZXNzZWRfZnJhbWUuZGF0YSkgeworCQljYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5kYXRhID0gcnZtYWxsb2MoQ1BJQV9NQVhfRlJBTUVfU0laRSk7CisJCWlmICghY2FtLT5kZWNvbXByZXNzZWRfZnJhbWUuZGF0YSkKKwkJCWdvdG8gb29wczsKKwl9CisJCisJLyogb3BlbiBjcGlhICovCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoY2FtLT5vcHMtPm9wZW4oY2FtLT5sb3dsZXZlbF9kYXRhKSkKKwkJZ290byBvb3BzOworCQorCS8qIHJlc2V0IHRoZSBjYW1lcmEgKi8KKwlpZiAoKGVyciA9IHJlc2V0X2NhbWVyYShjYW0pKSAhPSAwKSB7CisJCWNhbS0+b3BzLT5jbG9zZShjYW0tPmxvd2xldmVsX2RhdGEpOworCQlnb3RvIG9vcHM7CisJfQorCQorCWVyciA9IC1FSU5UUjsKKwlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJZ290byBvb3BzOworCisJLyogU2V0IG93bmVyc2hpcCBvZiAvcHJvYy9jcGlhL3ZpZGVvWCB0byBjdXJyZW50IHVzZXIgKi8KKwlpZihjYW0tPnByb2NfZW50cnkpCisJCWNhbS0+cHJvY19lbnRyeS0+dWlkID0gY3VycmVudC0+dWlkOworCisJLyogc2V0IG1hcmsgZm9yIGxvYWRpbmcgZmlyc3QgZnJhbWUgdW5jb21wcmVzc2VkICovCisJY2FtLT5maXJzdF9mcmFtZSA9IDE7CisKKwkvKiBpbml0IGl0IHRvIHNvbWV0aGluZyAqLworCWNhbS0+bW1hcF9rbHVkZ2UgPSAwOworCQorCSsrY2FtLT5vcGVuX2NvdW50OworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKwl1cCgmY2FtLT5idXN5X2xvY2spOworCXJldHVybiAwOworCisgb29wczoKKwlpZiAoY2FtLT5kZWNvbXByZXNzZWRfZnJhbWUuZGF0YSkgeworCQlydmZyZWUoY2FtLT5kZWNvbXByZXNzZWRfZnJhbWUuZGF0YSwgQ1BJQV9NQVhfRlJBTUVfU0laRSk7CisJCWNhbS0+ZGVjb21wcmVzc2VkX2ZyYW1lLmRhdGEgPSBOVUxMOworCX0KKwlpZiAoY2FtLT5yYXdfaW1hZ2UpIHsKKwkJcnZmcmVlKGNhbS0+cmF3X2ltYWdlLCBDUElBX01BWF9JTUFHRV9TSVpFKTsKKwkJY2FtLT5yYXdfaW1hZ2UgPSBOVUxMOworCX0KKwl1cCgmY2FtLT5idXN5X2xvY2spOworCXB1dF9jYW0oY2FtLT5vcHMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3BpYV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgIHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjYW1fZGF0YSAqY2FtID0gZGV2LT5wcml2OworCisJaWYgKGNhbS0+b3BzKSB7CisJICAgICAgICAvKiBSZXR1cm4gb3duZXJzaGlwIG9mIC9wcm9jL2NwaWEvdmlkZW9YIHRvIHJvb3QgKi8KKwkJaWYoY2FtLT5wcm9jX2VudHJ5KQorCQkJY2FtLT5wcm9jX2VudHJ5LT51aWQgPSAwOworCQorCQkvKiBzYXZlIGNhbWVyYSBzdGF0ZSBmb3IgbGF0ZXIgb3BlbiAoZGV2ZWxvcGVycyBndWlkZSBjaCAzLjUuMykgKi8KKwkJc2F2ZV9jYW1lcmFfc3RhdGUoY2FtKTsKKworCQkvKiBHb3RvTG9Qb3dlciAqLworCQlnb3RvX2xvd19wb3dlcihjYW0pOworCisJCS8qIFVwZGF0ZSB0aGUgY2FtZXJhIHN0YXR1cyAqLworCQlkb19jb21tYW5kKGNhbSwgQ1BJQV9DT01NQU5EX0dldENhbWVyYVN0YXR1cywgMCwgMCwgMCwgMCk7CisKKwkJLyogY2xlYW51cCBpbnRlcm5hbCBzdGF0ZSBzdHVmZiAqLworCQlmcmVlX2ZyYW1lcyhjYW0tPmZyYW1lKTsKKworCQkvKiBjbG9zZSBjcGlhICovCisJCWNhbS0+b3BzLT5jbG9zZShjYW0tPmxvd2xldmVsX2RhdGEpOworCisJCXB1dF9jYW0oY2FtLT5vcHMpOworCX0KKworCWlmICgtLWNhbS0+b3Blbl9jb3VudCA9PSAwKSB7CisJCS8qIGNsZWFuIHVwIGNhcHR1cmUtYnVmZmVycyAqLworCQlpZiAoY2FtLT5yYXdfaW1hZ2UpIHsKKwkJCXJ2ZnJlZShjYW0tPnJhd19pbWFnZSwgQ1BJQV9NQVhfSU1BR0VfU0laRSk7CisJCQljYW0tPnJhd19pbWFnZSA9IE5VTEw7CisJCX0KKworCQlpZiAoY2FtLT5kZWNvbXByZXNzZWRfZnJhbWUuZGF0YSkgeworCQkJcnZmcmVlKGNhbS0+ZGVjb21wcmVzc2VkX2ZyYW1lLmRhdGEsIENQSUFfTUFYX0ZSQU1FX1NJWkUpOworCQkJY2FtLT5kZWNvbXByZXNzZWRfZnJhbWUuZGF0YSA9IE5VTEw7CisJCX0KKworCQlpZiAoY2FtLT5mcmFtZV9idWYpCisJCQlmcmVlX2ZyYW1lX2J1ZihjYW0pOworCisJCWlmICghY2FtLT5vcHMpCisJCQlrZnJlZShjYW0pOworCX0KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwaWFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNhbV9kYXRhICpjYW0gPSBkZXYtPnByaXY7CisJaW50IGVycjsKKworCS8qIG1ha2UgdGhpcyBfcmVhbGx5XyBzbXAgYW5kIG11bHRpdGhyZWFkLXNhZmUgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjYW0tPmJ1c3lfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CisKKwlpZiAoIWJ1ZikgeworCQlEQkcoImJ1ZiBOVUxMXG4iKTsKKwkJdXAoJmNhbS0+YnVzeV9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFjb3VudCkgeworCQlEQkcoImNvdW50IDBcbiIpOworCQl1cCgmY2FtLT5idXN5X2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWNhbS0+b3BzKSB7CisJCURCRygib3BzIE5VTExcbiIpOworCQl1cCgmY2FtLT5idXN5X2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiB1cGxvYWQgZnJhbWUgKi8KKwljYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5zdGF0ZSA9IEZSQU1FX1JFQURZOworCWNhbS0+bW1hcF9rbHVkZ2U9MDsKKwlpZigoZXJyID0gZmV0Y2hfZnJhbWUoY2FtKSkgIT0gMCkgeworCQlEQkcoIkVSUk9SIGZyb20gZmV0Y2hfZnJhbWU6ICVkXG4iLCBlcnIpOworCQl1cCgmY2FtLT5idXN5X2xvY2spOworCQlyZXR1cm4gZXJyOworCX0KKwljYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5zdGF0ZSA9IEZSQU1FX1VOVVNFRDsKKworCS8qIGNvcHkgZGF0YSB0byB1c2VyIHNwYWNlICovCisJaWYgKGNhbS0+ZGVjb21wcmVzc2VkX2ZyYW1lLmNvdW50ID4gY291bnQpIHsKKwkJREJHKCJjb3VudCB3cm9uZzogJWQsICVsdVxuIiwgY2FtLT5kZWNvbXByZXNzZWRfZnJhbWUuY291bnQsCisJCSAgICAodW5zaWduZWQgbG9uZykgY291bnQpOworCQl1cCgmY2FtLT5idXN5X2xvY2spOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGNhbS0+ZGVjb21wcmVzc2VkX2ZyYW1lLmRhdGEsCisJICAgICAgICAgICAgICAgIGNhbS0+ZGVjb21wcmVzc2VkX2ZyYW1lLmNvdW50KSkgeworCQlEQkcoImNvcHlfdG9fdXNlciBmYWlsZWRcbiIpOworCQl1cCgmY2FtLT5idXN5X2xvY2spOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl1cCgmY2FtLT5idXN5X2xvY2spOworCXJldHVybiBjYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5jb3VudDsKK30KKworc3RhdGljIGludCBjcGlhX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBpb2N0bG5yLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjYW1fZGF0YSAqY2FtID0gZGV2LT5wcml2OworCWludCByZXR2YWwgPSAwOworCisJaWYgKCFjYW0gfHwgIWNhbS0+b3BzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwkvKiBtYWtlIHRoaXMgX3JlYWxseV8gc21wLXNhZmUgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjYW0tPmJ1c3lfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CisKKwkvL0RCRygiY3BpYV9pb2N0bDogJXVcbiIsIGlvY3RsbnIpOworCisJc3dpdGNoIChpb2N0bG5yKSB7CisJLyogcXVlcnkgY2FwYWJpbGl0ZXMgKi8KKwljYXNlIFZJRElPQ0dDQVA6CisJeworCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqYiA9IGFyZzsKKworCQlEQkcoIlZJRElPQ0dDQVBcbiIpOworCQlzdHJjcHkoYi0+bmFtZSwgIkNQaUEgQ2FtZXJhIik7CisJCWItPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfU1VCQ0FQVFVSRTsKKwkJYi0+Y2hhbm5lbHMgPSAxOworCQliLT5hdWRpb3MgPSAwOworCQliLT5tYXh3aWR0aCA9IDM1MjsJLyogVklERU9TSVpFX0NJRiAqLworCQliLT5tYXhoZWlnaHQgPSAyODg7CisJCWItPm1pbndpZHRoID0gNDg7CS8qIFZJREVPU0laRV80OF80OCAqLworCQliLT5taW5oZWlnaHQgPSA0ODsKKwkJYnJlYWs7CisJfQorCisJLyogZ2V0L3NldCB2aWRlbyBzb3VyY2UgLSB3ZSBhcmUgYSBjYW1lcmEgYW5kIG5vdGhpbmcgZWxzZSAqLworCWNhc2UgVklESU9DR0NIQU46CisJeworCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKworCQlEQkcoIlZJRElPQ0dDSEFOXG4iKTsKKwkJaWYgKHYtPmNoYW5uZWwgIT0gMCkgeworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJdi0+Y2hhbm5lbCA9IDA7CisJCXN0cmNweSh2LT5uYW1lLCAiQ2FtZXJhIik7CisJCXYtPnR1bmVycyA9IDA7CisJCXYtPmZsYWdzID0gMDsKKwkJdi0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOworCQl2LT5ub3JtID0gMDsKKwkJYnJlYWs7CisJfQorCQorCWNhc2UgVklESU9DU0NIQU46CisJeworCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKworCQlEQkcoIlZJRElPQ1NDSEFOXG4iKTsKKwkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCS8qIGltYWdlIHByb3BlcnRpZXMgKi8KKwljYXNlIFZJRElPQ0dQSUNUOgorCXsKKwkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnBpYyA9IGFyZzsKKwkJREJHKCJWSURJT0NHUElDVFxuIik7CisJCSpwaWMgPSBjYW0tPnZwOworCQlicmVhazsKKwl9CisJCisJY2FzZSBWSURJT0NTUElDVDoKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICp2cCA9IGFyZzsKKworCQlEQkcoIlZJRElPQ1NQSUNUXG4iKTsKKworCQkvKiBjaGVjayB2YWxpZGl0eSAqLworCQlEQkcoInBhbGV0dGU6ICVkXG4iLCB2cC0+cGFsZXR0ZSk7CisJCURCRygiZGVwdGg6ICVkXG4iLCB2cC0+ZGVwdGgpOworCQlpZiAoIXZhbGlkX21vZGUodnAtPnBhbGV0dGUsIHZwLT5kZXB0aCkpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWRvd24oJmNhbS0+cGFyYW1fbG9jayk7CisJCS8qIGJyaWdodG5lc3MsIGNvbG91ciwgY29udHJhc3QgbmVlZCBubyBjaGVjayAwLTY1NTM1ICovCisJCWNhbS0+dnAgPSAqdnA7CisJCS8qIHVwZGF0ZSBjYW0tPnBhcmFtcy5jb2xvdXJQYXJhbXMgKi8KKwkJY2FtLT5wYXJhbXMuY29sb3VyUGFyYW1zLmJyaWdodG5lc3MgPSB2cC0+YnJpZ2h0bmVzcyoxMDAvNjU1MzU7CisJCWNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5jb250cmFzdCA9IHZwLT5jb250cmFzdCoxMDAvNjU1MzU7CisJCWNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5zYXR1cmF0aW9uID0gdnAtPmNvbG91cioxMDAvNjU1MzU7CisJCS8qIGNvbnRyYXN0IGlzIGluIHN0ZXBzIG9mIDgsIHNvIHJvdW5kICovCisJCWNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5jb250cmFzdCA9CisJCQkoKGNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5jb250cmFzdCArIDMpIC8gOCkgKiA4OworCQlpZiAoY2FtLT5wYXJhbXMudmVyc2lvbi5maXJtd2FyZVZlcnNpb24gPT0gMSAmJgorCQkgICAgY2FtLT5wYXJhbXMudmVyc2lvbi5maXJtd2FyZVJldmlzaW9uID09IDIgJiYKKwkJICAgIGNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5jb250cmFzdCA+IDgwKSB7CisJCQkvKiAxLTAyIGZpcm13YXJlIGxpbWl0cyBjb250cmFzdCB0byA4MCAqLworCQkJY2FtLT5wYXJhbXMuY29sb3VyUGFyYW1zLmNvbnRyYXN0ID0gODA7CisJCX0KKworCQkvKiBBZGp1c3QgZmxpY2tlciBjb250cm9sIGlmIG5lY2Vzc2FyeSAqLworCQlpZihjYW0tPnBhcmFtcy5mbGlja2VyQ29udHJvbC5hbGxvd2FibGVPdmVyRXhwb3N1cmUgPCAwKQorCQkJY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuYWxsb3dhYmxlT3ZlckV4cG9zdXJlID0gCisJCQkJLWZpbmRfb3Zlcl9leHBvc3VyZShjYW0tPnBhcmFtcy5jb2xvdXJQYXJhbXMuYnJpZ2h0bmVzcyk7CisJCWlmKGNhbS0+cGFyYW1zLmZsaWNrZXJDb250cm9sLmZsaWNrZXJNb2RlICE9IDApCisJCQljYW0tPmNtZF9xdWV1ZSB8PSBDT01NQU5EX1NFVEZMSUNLRVJDVFJMOworCQkKKworCQkvKiBxdWV1ZSBjb21tYW5kIHRvIHVwZGF0ZSBjYW1lcmEgKi8KKwkJY2FtLT5jbWRfcXVldWUgfD0gQ09NTUFORF9TRVRDT0xPVVJQQVJBTVM7CisJCXVwKCZjYW0tPnBhcmFtX2xvY2spOworCQlEQkcoIlZJRElPQ1NQSUNUOiAlZCAvICVkIC8vICVkIC8gJWQgLyAlZCAvICVkXG4iLAorCQkgICAgdnAtPmRlcHRoLCB2cC0+cGFsZXR0ZSwgdnAtPmJyaWdodG5lc3MsIHZwLT5odWUsIHZwLT5jb2xvdXIsCisJCSAgICB2cC0+Y29udHJhc3QpOworCQlicmVhazsKKwl9CisKKwkvKiBnZXQvc2V0IGNhcHR1cmUgd2luZG93ICovCisJY2FzZSBWSURJT0NHV0lOOgorCXsKKwkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7CisJCURCRygiVklESU9DR1dJTlxuIik7CisKKwkJKnZ3ID0gY2FtLT52dzsKKwkJYnJlYWs7CisJfQorCQorCWNhc2UgVklESU9DU1dJTjoKKwl7CisJCS8qIGNvcHlfZnJvbV91c2VyLCBjaGVjayB2YWxpZGl0eSwgY29weSB0byBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KKwkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7CisJCURCRygiVklESU9DU1dJTlxuIik7CisKKwkJaWYgKHZ3LT5jbGlwY291bnQgIT0gMCkgeyAgICAvKiBjbGlwcGluZyBub3Qgc3VwcG9ydGVkICovCisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHZ3LT5jbGlwcyAhPSBOVUxMKSB7ICAgICAvKiBjbGlwcGluZyBub3Qgc3VwcG9ydGVkICovCisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB3ZSBzZXQgdGhlIHZpZGVvIHdpbmRvdyB0byBzb21ldGhpbmcgc21hbGxlciBvciBlcXVhbCB0byB3aGF0CisJCSogaXMgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyPz8/CisJCSovCisJCWRvd24oJmNhbS0+cGFyYW1fbG9jayk7CisJCWlmICh2dy0+d2lkdGggIT0gY2FtLT52dy53aWR0aCB8fCB2dy0+aGVpZ2h0ICE9IGNhbS0+dncuaGVpZ2h0KSB7CisJCQlpbnQgdmlkZW9fc2l6ZSA9IG1hdGNoX3ZpZGVvc2l6ZSh2dy0+d2lkdGgsIHZ3LT5oZWlnaHQpOworCisJCQlpZiAodmlkZW9fc2l6ZSA8IDApIHsKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJCXVwKCZjYW0tPnBhcmFtX2xvY2spOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FtLT52aWRlb19zaXplID0gdmlkZW9fc2l6ZTsKKworCQkJLyogdmlkZW8gc2l6ZSBpcyBjaGFuZ2luZywgcmVzZXQgdGhlIHN1YmNhcHR1cmUgYXJlYSAqLworCQkJbWVtc2V0KCZjYW0tPnZjLCAwLCBzaXplb2YoY2FtLT52YykpOworCQkJCisJCQlzZXRfdndfc2l6ZShjYW0pOworCQkJREJHKCIlZCAvICVkXG4iLCBjYW0tPnZ3LndpZHRoLCBjYW0tPnZ3LmhlaWdodCk7CisJCQljYW0tPmNtZF9xdWV1ZSB8PSBDT01NQU5EX1NFVEZPUk1BVDsKKwkJfQorCisJCXVwKCZjYW0tPnBhcmFtX2xvY2spOworCisJCS8qIHNldGZvcm1hdCBpZ25vcmVkIGJ5IGNhbWVyYSBkdXJpbmcgc3RyZWFtaW5nLAorCQkgKiBzbyBzdG9wL2Rpc3BhdGNoL3N0YXJ0ICovCisJCWlmIChjYW0tPmNtZF9xdWV1ZSAmIENPTU1BTkRfU0VURk9STUFUKSB7CisJCQlEQkcoIlxuIik7CisJCQlkaXNwYXRjaF9jb21tYW5kcyhjYW0pOworCQl9CisJCURCRygiJWQvJWQ6JWRcbiIsIGNhbS0+dmlkZW9fc2l6ZSwKKwkJICAgIGNhbS0+dncud2lkdGgsIGNhbS0+dncuaGVpZ2h0KTsKKwkJYnJlYWs7CisJfQorCisJLyogbW1hcCBpbnRlcmZhY2UgKi8KKwljYXNlIFZJRElPQ0dNQlVGOgorCXsKKwkJc3RydWN0IHZpZGVvX21idWYgKnZtID0gYXJnOworCQlpbnQgaTsKKworCQlEQkcoIlZJRElPQ0dNQlVGXG4iKTsKKwkJbWVtc2V0KHZtLCAwLCBzaXplb2YoKnZtKSk7CisJCXZtLT5zaXplID0gQ1BJQV9NQVhfRlJBTUVfU0laRSpGUkFNRV9OVU07CisJCXZtLT5mcmFtZXMgPSBGUkFNRV9OVU07CisJCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9OVU07IGkrKykKKwkJCXZtLT5vZmZzZXRzW2ldID0gQ1BJQV9NQVhfRlJBTUVfU0laRSAqIGk7CisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ01DQVBUVVJFOgorCXsKKwkJc3RydWN0IHZpZGVvX21tYXAgKnZtID0gYXJnOworCQlpbnQgdmlkZW9fc2l6ZTsKKworCQlEQkcoIlZJRElPQ01DQVBUVVJFOiAlZCAvICVkIC8gJWR4JWRcbiIsIHZtLT5mb3JtYXQsIHZtLT5mcmFtZSwKKwkJICAgIHZtLT53aWR0aCwgdm0tPmhlaWdodCk7CisJCWlmICh2bS0+ZnJhbWU8MHx8dm0tPmZyYW1lPj1GUkFNRV9OVU0pIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHNldCB2aWRlbyBmb3JtYXQgKi8KKwkJY2FtLT52cC5wYWxldHRlID0gdm0tPmZvcm1hdDsKKwkJc3dpdGNoKHZtLT5mb3JtYXQpIHsKKwkJY2FzZSBWSURFT19QQUxFVFRFX0dSRVk6CisJCQljYW0tPnZwLmRlcHRoPTg7CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU1NToKKwkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU2NToKKwkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMjoKKwkJY2FzZSBWSURFT19QQUxFVFRFX1lVWVY6CisJCWNhc2UgVklERU9fUEFMRVRURV9VWVZZOgorCQkJY2FtLT52cC5kZXB0aCA9IDE2OworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fUEFMRVRURV9SR0IyNDoKKwkJCWNhbS0+dnAuZGVwdGggPSAyNDsKKwkJCWJyZWFrOworCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCMzI6CisJCQljYW0tPnZwLmRlcHRoID0gMzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAocmV0dmFsKQorCQkJYnJlYWs7CisKKwkJLyogc2V0IHZpZGVvIHNpemUgKi8KKwkJdmlkZW9fc2l6ZSA9IG1hdGNoX3ZpZGVvc2l6ZSh2bS0+d2lkdGgsIHZtLT5oZWlnaHQpOworCQlpZiAodmlkZW9fc2l6ZSA8IDApIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAodmlkZW9fc2l6ZSAhPSBjYW0tPnZpZGVvX3NpemUpIHsKKwkJCWNhbS0+dmlkZW9fc2l6ZSA9IHZpZGVvX3NpemU7CisKKwkJCS8qIHZpZGVvIHNpemUgaXMgY2hhbmdpbmcsIHJlc2V0IHRoZSBzdWJjYXB0dXJlIGFyZWEgKi8KKwkJCW1lbXNldCgmY2FtLT52YywgMCwgc2l6ZW9mKGNhbS0+dmMpKTsKKwkJCQorCQkJc2V0X3Z3X3NpemUoY2FtKTsKKwkJCWNhbS0+Y21kX3F1ZXVlIHw9IENPTU1BTkRfU0VURk9STUFUOworCQkJZGlzcGF0Y2hfY29tbWFuZHMoY2FtKTsKKwkJfQorCQkvKiBhY2NvcmRpbmcgdG8gdjRsLXNwZWMgd2UgbXVzdCBzdGFydCBzdHJlYW1pbmcgaGVyZSAqLworCQljYW0tPm1tYXBfa2x1ZGdlID0gMTsKKwkJcmV0dmFsID0gY2FwdHVyZV9mcmFtZShjYW0sIHZtKTsKKworCQlicmVhazsKKwl9CisJCisJY2FzZSBWSURJT0NTWU5DOgorCXsKKwkJaW50ICpmcmFtZSA9IGFyZzsKKworCQkvL0RCRygiVklESU9DU1lOQzogJWRcbiIsICpmcmFtZSk7CisKKwkJaWYgKCpmcmFtZTwwIHx8ICpmcmFtZSA+PSBGUkFNRV9OVU0pIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoY2FtLT5mcmFtZVsqZnJhbWVdLnN0YXRlKSB7CisJCWNhc2UgRlJBTUVfVU5VU0VEOgorCQljYXNlIEZSQU1FX1JFQURZOgorCQljYXNlIEZSQU1FX0dSQUJCSU5HOgorCQkJREJHKCJzeW5jIHRvIHVudXNlZCBmcmFtZSAlZFxuIiwgKmZyYW1lKTsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIEZSQU1FX0RPTkU6CisJCQljYW0tPmZyYW1lWypmcmFtZV0uc3RhdGUgPSBGUkFNRV9VTlVTRUQ7CisJCQkvL0RCRygiVklESU9DU1lOQzogJWQgc3luY2VkXG4iLCAqZnJhbWUpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldHZhbCA9PSAtRUlOVFIpIHsKKwkJCS8qIEZJWE1FIC0geGF3dHYgZG9lcyBub3QgaGFuZGxlIHRoaXMgbmljZSAqLworCQkJcmV0dmFsID0gMDsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ0dDQVBUVVJFOgorCXsKKwkJc3RydWN0IHZpZGVvX2NhcHR1cmUgKnZjID0gYXJnOworCisJCURCRygiVklESU9DR0NBUFRVUkVcbiIpOworCisJCSp2YyA9IGNhbS0+dmM7CisKKwkJYnJlYWs7CisJfQkKKworCWNhc2UgVklESU9DU0NBUFRVUkU6CisJeworCQlzdHJ1Y3QgdmlkZW9fY2FwdHVyZSAqdmMgPSBhcmc7CisKKwkJREJHKCJWSURJT0NTQ0FQVFVSRVxuIik7CisKKwkJaWYgKHZjLT5kZWNpbWF0aW9uICE9IDApIHsgICAgLyogSG93IHNob3VsZCB0aGlzIGJlIHVzZWQ/ICovCisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHZjLT5mbGFncyAhPSAwKSB7ICAgICAvKiBFdmVuL29kZCBncmFiIG5vdCBzdXBwb3J0ZWQgKi8KKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQkKKwkJLyogQ2xpcCB0byB0aGUgcmVzb2x1dGlvbiB3ZSBjYW4gc2V0IGZvciB0aGUgUk9JCisJCSAgIChldmVyeSA4IGNvbHVtbnMgYW5kIDQgcm93cykgKi8KKwkJdmMtPnggICAgICA9IHZjLT54ICAgICAgJiB+KF9fdTMyKTc7CisJCXZjLT55ICAgICAgPSB2Yy0+eSAgICAgICYgfihfX3UzMikzOworCQl2Yy0+d2lkdGggID0gdmMtPndpZHRoICAmIH4oX191MzIpNzsKKwkJdmMtPmhlaWdodCA9IHZjLT5oZWlnaHQgJiB+KF9fdTMyKTM7CisKKwkJaWYodmMtPndpZHRoID09IDAgfHwgdmMtPmhlaWdodCA9PSAwIHx8CisJCSAgIHZjLT54ICsgdmMtPndpZHRoICA+IGNhbS0+dncud2lkdGggfHwKKwkJICAgdmMtPnkgKyB2Yy0+aGVpZ2h0ID4gY2FtLT52dy5oZWlnaHQpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCURCRygiJWQsJWQvJWR4JWRcbiIsIHZjLT54LHZjLT55LHZjLT53aWR0aCwgdmMtPmhlaWdodCk7CisJCQorCQlkb3duKCZjYW0tPnBhcmFtX2xvY2spOworCQkKKwkJY2FtLT52Yy54ICAgICAgPSB2Yy0+eDsKKwkJY2FtLT52Yy55ICAgICAgPSB2Yy0+eTsKKwkJY2FtLT52Yy53aWR0aCAgPSB2Yy0+d2lkdGg7CisJCWNhbS0+dmMuaGVpZ2h0ID0gdmMtPmhlaWdodDsKKwkJCisJCXNldF92d19zaXplKGNhbSk7CisJCWNhbS0+Y21kX3F1ZXVlIHw9IENPTU1BTkRfU0VURk9STUFUOworCisJCXVwKCZjYW0tPnBhcmFtX2xvY2spOworCisJCS8qIHNldGZvcm1hdCBpZ25vcmVkIGJ5IGNhbWVyYSBkdXJpbmcgc3RyZWFtaW5nLAorCQkgKiBzbyBzdG9wL2Rpc3BhdGNoL3N0YXJ0ICovCisJCWRpc3BhdGNoX2NvbW1hbmRzKGNhbSk7CisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ0dVTklUOgorCXsKKwkJc3RydWN0IHZpZGVvX3VuaXQgKnZ1ID0gYXJnOworCisJCURCRygiVklESU9DR1VOSVRcbiIpOworCisJCXZ1LT52aWRlbyAgICA9IGNhbS0+dmRldi5taW5vcjsKKwkJdnUtPnZiaSAgICAgID0gVklERU9fTk9fVU5JVDsKKwkJdnUtPnJhZGlvICAgID0gVklERU9fTk9fVU5JVDsKKwkJdnUtPmF1ZGlvICAgID0gVklERU9fTk9fVU5JVDsKKwkJdnUtPnRlbGV0ZXh0ID0gVklERU9fTk9fVU5JVDsKKworCQlicmVhazsKKwl9CisKKwkJCisJLyogcG9pbnRsZXNzIHRvIGltcGxlbWVudCBvdmVybGF5IHdpdGggdGhpcyBjYW1lcmEgKi8KKwljYXNlIFZJRElPQ0NBUFRVUkU6CisJY2FzZSBWSURJT0NHRkJVRjoKKwljYXNlIFZJRElPQ1NGQlVGOgorCWNhc2UgVklESU9DS0VZOgorCS8qIHR1bmVyIGludGVyZmFjZSAtIHdlIGhhdmUgbm9uZSAqLworCWNhc2UgVklESU9DR1RVTkVSOgorCWNhc2UgVklESU9DU1RVTkVSOgorCWNhc2UgVklESU9DR0ZSRVE6CisJY2FzZSBWSURJT0NTRlJFUToKKwkvKiBhdWRpbyBpbnRlcmZhY2UgLSB3ZSBoYXZlIG5vbmUgKi8KKwljYXNlIFZJRElPQ0dBVURJTzoKKwljYXNlIFZJRElPQ1NBVURJTzoKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisKKwl1cCgmY2FtLT5idXN5X2xvY2spOworCXJldHVybiByZXR2YWw7Cit9IAorCitzdGF0aWMgaW50IGNwaWFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgY3BpYV9kb19pb2N0bCk7Cit9CisKKworLyogRklYTUUgKi8KK3N0YXRpYyBpbnQgY3BpYV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplICA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvczsKKwlzdHJ1Y3QgY2FtX2RhdGEgKmNhbSA9IGRldi0+cHJpdjsKKwlpbnQgcmV0dmFsOworCisJaWYgKCFjYW0gfHwgIWNhbS0+b3BzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlEQkcoImNwaWFfbW1hcDogJWxkXG4iLCBzaXplKTsKKworCWlmIChzaXplID4gRlJBTUVfTlVNKkNQSUFfTUFYX0ZSQU1FX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFjYW0gfHwgIWNhbS0+b3BzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwkvKiBtYWtlIHRoaXMgX3JlYWxseV8gc21wLXNhZmUgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjYW0tPmJ1c3lfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CisKKwlpZiAoIWNhbS0+ZnJhbWVfYnVmKSB7CS8qIHdlIGRvIGxhenkgYWxsb2NhdGlvbiAqLworCQlpZiAoKHJldHZhbCA9IGFsbG9jYXRlX2ZyYW1lX2J1ZihjYW0pKSkgeworCQkJdXAoJmNhbS0+YnVzeV9sb2NrKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisKKwlwb3MgPSAodW5zaWduZWQgbG9uZykoY2FtLT5mcmFtZV9idWYpOworCXdoaWxlIChzaXplID4gMCkgeworCQlwYWdlID0gdm1hbGxvY190b19wZm4oKHZvaWQgKilwb3MpOworCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsIHBhZ2UsIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKSB7CisJCQl1cCgmY2FtLT5idXN5X2xvY2spOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJc3RhcnQgKz0gUEFHRV9TSVpFOworCQlwb3MgKz0gUEFHRV9TSVpFOworCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKKwkJCXNpemUgLT0gUEFHRV9TSVpFOworCQllbHNlCisJCQlzaXplID0gMDsKKwl9CisKKwlEQkcoImNwaWFfbW1hcDogJWxkXG4iLCBzaXplKTsKKwl1cCgmY2FtLT5idXN5X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNwaWFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gY3BpYV9vcGVuLAorCS5yZWxlYXNlICAgICAgIAk9IGNwaWFfY2xvc2UsCisJLnJlYWQJCT0gY3BpYV9yZWFkLAorCS5tbWFwCQk9IGNwaWFfbW1hcCwKKwkuaW9jdGwgICAgICAgICAgPSBjcGlhX2lvY3RsLAorCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGNwaWFfdGVtcGxhdGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJDUGlBIENhbWVyYSIsCisJLnR5cGUJCT0gVklEX1RZUEVfQ0FQVFVSRSwKKwkuaGFyZHdhcmUJPSBWSURfSEFSRFdBUkVfQ1BJQSwKKwkuZm9wcyAgICAgICAgICAgPSAmY3BpYV9mb3BzLAorfTsKKworLyogaW5pdGlhbGlzZSBjYW1fZGF0YSBzdHJ1Y3R1cmUgICovCitzdGF0aWMgdm9pZCByZXNldF9jYW1lcmFfc3RydWN0KHN0cnVjdCBjYW1fZGF0YSAqY2FtKQoreworCS8qIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIHZhbHVlcyBhcmUgdGhlIGRlZmF1bHRzIGZyb20KKwkgKiAiU29mdHdhcmUgRGV2ZWxvcGVyJ3MgR3VpZGUgZm9yIENQaUEgQ2FtZXJhcyIuICBBbnkgY2hhbmdlcworCSAqIHRvIHRoZSBkZWZhdWx0cyBhcmUgbm90ZWQgaW4gY29tbWVudHMuICovCisJY2FtLT5wYXJhbXMuY29sb3VyUGFyYW1zLmJyaWdodG5lc3MgPSA1MDsKKwljYW0tPnBhcmFtcy5jb2xvdXJQYXJhbXMuY29udHJhc3QgPSA0ODsKKwljYW0tPnBhcmFtcy5jb2xvdXJQYXJhbXMuc2F0dXJhdGlvbiA9IDUwOworCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmdhaW5Nb2RlID0gNDsKKwljYW0tPnBhcmFtcy5leHBvc3VyZS5leHBNb2RlID0gMjsJCS8qIEFFQyAqLworCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvbXBNb2RlID0gMTsKKwljYW0tPnBhcmFtcy5leHBvc3VyZS5jZW50cmVXZWlnaHQgPSAxOworCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmdhaW4gPSAwOworCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmZpbmVFeHAgPSAwOworCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cExvID0gMTg1OworCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmNvYXJzZUV4cEhpID0gMDsKKwljYW0tPnBhcmFtcy5leHBvc3VyZS5yZWRDb21wID0gQ09NUF9SRUQ7CisJY2FtLT5wYXJhbXMuZXhwb3N1cmUuZ3JlZW4xQ29tcCA9IENPTVBfR1JFRU4xOworCWNhbS0+cGFyYW1zLmV4cG9zdXJlLmdyZWVuMkNvbXAgPSBDT01QX0dSRUVOMjsKKwljYW0tPnBhcmFtcy5leHBvc3VyZS5ibHVlQ29tcCA9IENPTVBfQkxVRTsKKwljYW0tPnBhcmFtcy5jb2xvdXJCYWxhbmNlLmJhbGFuY2VNb2RlID0gMjsJLyogQUNCICovCisJY2FtLT5wYXJhbXMuY29sb3VyQmFsYW5jZS5yZWRHYWluID0gMzI7CisJY2FtLT5wYXJhbXMuY29sb3VyQmFsYW5jZS5ncmVlbkdhaW4gPSA2OworCWNhbS0+cGFyYW1zLmNvbG91ckJhbGFuY2UuYmx1ZUdhaW4gPSA5MjsKKwljYW0tPnBhcmFtcy5hcGNvci5nYWluMSA9IDB4MTg7CisJY2FtLT5wYXJhbXMuYXBjb3IuZ2FpbjIgPSAweDE2OworCWNhbS0+cGFyYW1zLmFwY29yLmdhaW40ID0gMHgyNDsKKwljYW0tPnBhcmFtcy5hcGNvci5nYWluOCA9IDB4MzQ7CisJY2FtLT5wYXJhbXMuZmxpY2tlckNvbnRyb2wuZmxpY2tlck1vZGUgPSAwOworCWNhbS0+cGFyYW1zLmZsaWNrZXJDb250cm9sLmRpc2FibGVkID0gMTsKKworCWNhbS0+cGFyYW1zLmZsaWNrZXJDb250cm9sLmNvYXJzZUp1bXAgPSAKKwkJZmxpY2tlcl9qdW1wc1tjYW0tPm1haW5zRnJlcV0KKwkJICAgICAgICAgICAgIFtjYW0tPnBhcmFtcy5zZW5zb3JGcHMuYmFzZXJhdGVdCisJCSAgICAgICAgICAgICBbY2FtLT5wYXJhbXMuc2Vuc29yRnBzLmRpdmlzb3JdOworCWNhbS0+cGFyYW1zLmZsaWNrZXJDb250cm9sLmFsbG93YWJsZU92ZXJFeHBvc3VyZSA9IAorCQktZmluZF9vdmVyX2V4cG9zdXJlKGNhbS0+cGFyYW1zLmNvbG91clBhcmFtcy5icmlnaHRuZXNzKTsKKwljYW0tPnBhcmFtcy52bE9mZnNldC5nYWluMSA9IDIwOworCWNhbS0+cGFyYW1zLnZsT2Zmc2V0LmdhaW4yID0gMjQ7CisJY2FtLT5wYXJhbXMudmxPZmZzZXQuZ2FpbjQgPSAyNjsKKwljYW0tPnBhcmFtcy52bE9mZnNldC5nYWluOCA9IDI2OworCWNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLmh5c3RlcmVzaXMgPSAzOworCWNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLnRocmVzaE1heCA9IDExOworCWNhbS0+cGFyYW1zLmNvbXByZXNzaW9uUGFyYW1zLnNtYWxsU3RlcCA9IDE7CisJY2FtLT5wYXJhbXMuY29tcHJlc3Npb25QYXJhbXMubGFyZ2VTdGVwID0gMzsKKwljYW0tPnBhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5kZWNpbWF0aW9uSHlzdGVyZXNpcyA9IDI7CisJY2FtLT5wYXJhbXMuY29tcHJlc3Npb25QYXJhbXMuZnJEaWZmU3RlcFRocmVzaCA9IDU7CisJY2FtLT5wYXJhbXMuY29tcHJlc3Npb25QYXJhbXMucURpZmZTdGVwVGhyZXNoID0gMzsKKwljYW0tPnBhcmFtcy5jb21wcmVzc2lvblBhcmFtcy5kZWNpbWF0aW9uVGhyZXNoTW9kID0gMjsKKwkvKiBFbmQgb2YgZGVmYXVsdCB2YWx1ZXMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wZXIncyBHdWlkZSAqLworCQorCWNhbS0+dHJhbnNmZXJfcmF0ZSA9IDA7CisJY2FtLT5leHBvc3VyZV9zdGF0dXMgPSBFWFBPU1VSRV9OT1JNQUw7CisJCisJLyogU2V0IFNlbnNvciBGUFMgdG8gMTVmcHMuIFRoaXMgc2VlbXMgYmV0dGVyIHRoYW4gMzBmcHMKKwkgKiBmb3IgaW5kb29yIGxpZ2h0aW5nLiAqLworCWNhbS0+cGFyYW1zLnNlbnNvckZwcy5kaXZpc29yID0gMTsKKwljYW0tPnBhcmFtcy5zZW5zb3JGcHMuYmFzZXJhdGUgPSAxOworCQorCWNhbS0+cGFyYW1zLnl1dlRocmVzaG9sZC55VGhyZXNob2xkID0gNjsgLyogRnJvbSB3aW5kb3dzIGRyaXZlciAqLworCWNhbS0+cGFyYW1zLnl1dlRocmVzaG9sZC51dlRocmVzaG9sZCA9IDY7IC8qIEZyb20gd2luZG93cyBkcml2ZXIgKi8KKwkKKwljYW0tPnBhcmFtcy5mb3JtYXQuc3ViU2FtcGxlID0gU1VCU0FNUExFXzQyMjsKKwljYW0tPnBhcmFtcy5mb3JtYXQueXV2T3JkZXIgPSBZVVZPUkRFUl9ZVVlWOworCQorCWNhbS0+cGFyYW1zLmNvbXByZXNzaW9uLm1vZGUgPSBDUElBX0NPTVBSRVNTSU9OX0FVVE87CisJY2FtLT5wYXJhbXMuY29tcHJlc3Npb25UYXJnZXQuZnJUYXJnZXRpbmcgPQorCQlDUElBX0NPTVBSRVNTSU9OX1RBUkdFVF9RVUFMSVRZOworCWNhbS0+cGFyYW1zLmNvbXByZXNzaW9uVGFyZ2V0LnRhcmdldEZSID0gMTU7IC8qIEZyb20gd2luZG93cyBkcml2ZXIgKi8KKwljYW0tPnBhcmFtcy5jb21wcmVzc2lvblRhcmdldC50YXJnZXRRID0gNTsgLyogRnJvbSB3aW5kb3dzIGRyaXZlciAqLworCisJY2FtLT5wYXJhbXMucXgzLnF4M19kZXRlY3RlZCA9IDA7CisJY2FtLT5wYXJhbXMucXgzLnRvcGxpZ2h0ID0gMDsKKwljYW0tPnBhcmFtcy5xeDMuYm90dG9tbGlnaHQgPSAwOworCWNhbS0+cGFyYW1zLnF4My5idXR0b24gPSAwOworCWNhbS0+cGFyYW1zLnF4My5jcmFkbGVkID0gMDsKKworCWNhbS0+dmlkZW9fc2l6ZSA9IFZJREVPU0laRV9DSUY7CisJCisJY2FtLT52cC5jb2xvdXIgPSAzMjc2ODsgICAgICAvKiA1MCUgKi8KKwljYW0tPnZwLmh1ZSA9IDMyNzY4OyAgICAgICAgIC8qIDUwJSAqLworCWNhbS0+dnAuYnJpZ2h0bmVzcyA9IDMyNzY4OyAgLyogNTAlICovCisJY2FtLT52cC5jb250cmFzdCA9IDMyNzY4OyAgICAvKiA1MCUgKi8KKwljYW0tPnZwLndoaXRlbmVzcyA9IDA7ICAgICAgIC8qIG5vdCB1c2VkIC0+IGdyYXlzY2FsZSBvbmx5ICovCisJY2FtLT52cC5kZXB0aCA9IDI0OyAgICAgICAgICAvKiB0byBiZSBzZXQgYnkgdXNlciAqLworCWNhbS0+dnAucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7IC8qIHRvIGJlIHNldCBieSB1c2VyICovCisKKwljYW0tPnZjLnggPSAwOworCWNhbS0+dmMueSA9IDA7CisJY2FtLT52Yy53aWR0aCA9IDA7CisJY2FtLT52Yy5oZWlnaHQgPSAwOworCQorCWNhbS0+dncueCA9IDA7CisJY2FtLT52dy55ID0gMDsKKwlzZXRfdndfc2l6ZShjYW0pOworCWNhbS0+dncuY2hyb21ha2V5ID0gMDsKKwljYW0tPnZ3LmZsYWdzID0gMDsKKwljYW0tPnZ3LmNsaXBjb3VudCA9IDA7CisJY2FtLT52dy5jbGlwcyA9IE5VTEw7CisKKwljYW0tPmNtZF9xdWV1ZSA9IENPTU1BTkRfTk9ORTsKKwljYW0tPmZpcnN0X2ZyYW1lID0gMTsKKworCXJldHVybjsKK30KKworLyogaW5pdGlhbGl6ZSBjYW1fZGF0YSBzdHJ1Y3R1cmUgICovCitzdGF0aWMgdm9pZCBpbml0X2NhbWVyYV9zdHJ1Y3Qoc3RydWN0IGNhbV9kYXRhICpjYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNwaWFfY2FtZXJhX29wcyAqb3BzICkKK3sKKwlpbnQgaTsKKworCS8qIERlZmF1bHQgZXZlcnl0aGluZyB0byAwICovCisJbWVtc2V0KGNhbSwgMCwgc2l6ZW9mKHN0cnVjdCBjYW1fZGF0YSkpOworCisJY2FtLT5vcHMgPSBvcHM7CisJaW5pdF9NVVRFWCgmY2FtLT5wYXJhbV9sb2NrKTsKKwlpbml0X01VVEVYKCZjYW0tPmJ1c3lfbG9jayk7CisKKwlyZXNldF9jYW1lcmFfc3RydWN0KGNhbSk7CisKKwljYW0tPnByb2NfZW50cnkgPSBOVUxMOworCisJbWVtY3B5KCZjYW0tPnZkZXYsICZjcGlhX3RlbXBsYXRlLCBzaXplb2YoY3BpYV90ZW1wbGF0ZSkpOworCWNhbS0+dmRldi5wcml2ID0gY2FtOworCQorCWNhbS0+Y3VyZnJhbWUgPSAwOworCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9OVU07IGkrKykgeworCQljYW0tPmZyYW1lW2ldLndpZHRoID0gMDsKKwkJY2FtLT5mcmFtZVtpXS5oZWlnaHQgPSAwOworCQljYW0tPmZyYW1lW2ldLnN0YXRlID0gRlJBTUVfVU5VU0VEOworCQljYW0tPmZyYW1lW2ldLmRhdGEgPSBOVUxMOworCX0KKwljYW0tPmRlY29tcHJlc3NlZF9mcmFtZS53aWR0aCA9IDA7CisJY2FtLT5kZWNvbXByZXNzZWRfZnJhbWUuaGVpZ2h0ID0gMDsKKwljYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5zdGF0ZSA9IEZSQU1FX1VOVVNFRDsKKwljYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5kYXRhID0gTlVMTDsKK30KKworc3RydWN0IGNhbV9kYXRhICpjcGlhX3JlZ2lzdGVyX2NhbWVyYShzdHJ1Y3QgY3BpYV9jYW1lcmFfb3BzICpvcHMsIHZvaWQgKmxvd2xldmVsKQoreworICAgICAgICBzdHJ1Y3QgY2FtX2RhdGEgKmNhbWVyYTsKKwkKKwlpZiAoKGNhbWVyYSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjYW1fZGF0YSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCQorCWluaXRfY2FtZXJhX3N0cnVjdCggY2FtZXJhLCBvcHMgKTsKKwljYW1lcmEtPmxvd2xldmVsX2RhdGEgPSBsb3dsZXZlbDsKKwkKKwkvKiByZWdpc3RlciB2NGwgZGV2aWNlICovCisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmY2FtZXJhLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucikgPT0gLTEpIHsKKwkJa2ZyZWUoY2FtZXJhKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBnZXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIGNhbWVyYTogb3Blbi9yZXNldC9jbG9zZSAqLworCisJLyogb3BlbiBjcGlhICovCisJaWYgKGNhbWVyYS0+b3BzLT5vcGVuKGNhbWVyYS0+bG93bGV2ZWxfZGF0YSkpCisJCXJldHVybiBjYW1lcmE7CisJCisJLyogcmVzZXQgdGhlIGNhbWVyYSAqLworCWlmIChyZXNldF9jYW1lcmEoY2FtZXJhKSAhPSAwKSB7CisJCWNhbWVyYS0+b3BzLT5jbG9zZShjYW1lcmEtPmxvd2xldmVsX2RhdGEpOworCQlyZXR1cm4gY2FtZXJhOworCX0KKworCS8qIGNsb3NlIGNwaWEgKi8KKwljYW1lcmEtPm9wcy0+Y2xvc2UoY2FtZXJhLT5sb3dsZXZlbF9kYXRhKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJY3JlYXRlX3Byb2NfY3BpYV9jYW0oY2FtZXJhKTsKKyNlbmRpZgorCisJcHJpbnRrKEtFUk5fSU5GTyAiICBDUGlBIFZlcnNpb246ICVkLiUwMmQgKCVkLiVkKVxuIiwKKwkgICAgICAgY2FtZXJhLT5wYXJhbXMudmVyc2lvbi5maXJtd2FyZVZlcnNpb24sCisJICAgICAgIGNhbWVyYS0+cGFyYW1zLnZlcnNpb24uZmlybXdhcmVSZXZpc2lvbiwKKwkgICAgICAgY2FtZXJhLT5wYXJhbXMudmVyc2lvbi52Y1ZlcnNpb24sCisJICAgICAgIGNhbWVyYS0+cGFyYW1zLnZlcnNpb24udmNSZXZpc2lvbik7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBDUGlBIFBuUC1JRDogJTA0eDolMDR4OiUwNHhcbiIsCisJICAgICAgIGNhbWVyYS0+cGFyYW1zLnBucElELnZlbmRvciwKKwkgICAgICAgY2FtZXJhLT5wYXJhbXMucG5wSUQucHJvZHVjdCwKKwkgICAgICAgY2FtZXJhLT5wYXJhbXMucG5wSUQuZGV2aWNlUmV2aXNpb24pOworCXByaW50ayhLRVJOX0lORk8gIiAgVlAtVmVyc2lvbjogJWQuJWQgJTA0eFxuIiwKKwkgICAgICAgY2FtZXJhLT5wYXJhbXMudnBWZXJzaW9uLnZwVmVyc2lvbiwKKwkgICAgICAgY2FtZXJhLT5wYXJhbXMudnBWZXJzaW9uLnZwUmV2aXNpb24sCisJICAgICAgIGNhbWVyYS0+cGFyYW1zLnZwVmVyc2lvbi5jYW1lcmFIZWFkSUQpOworCisJcmV0dXJuIGNhbWVyYTsKK30KKwordm9pZCBjcGlhX3VucmVnaXN0ZXJfY2FtZXJhKHN0cnVjdCBjYW1fZGF0YSAqY2FtKQoreworCURCRygidW5yZWdpc3RlcmluZyB2aWRlb1xuIik7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+dmRldik7CisJaWYgKGNhbS0+b3Blbl9jb3VudCkgeworCQlwdXRfY2FtKGNhbS0+b3BzKTsKKwkJREJHKCJjYW1lcmEgb3BlbiAtLSBzZXR0aW5nIG9wcyB0byBOVUxMXG4iKTsKKwkJY2FtLT5vcHMgPSBOVUxMOworCX0KKwkKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCURCRygiZGVzdHJveWluZyAvcHJvYy9jcGlhL3ZpZGVvJWRcbiIsIGNhbS0+dmRldi5taW5vcik7CisJZGVzdHJveV9wcm9jX2NwaWFfY2FtKGNhbSk7CisjZW5kaWYJCisJaWYgKCFjYW0tPm9wZW5fY291bnQpIHsKKwkJREJHKCJmcmVlaW5nIGNhbWVyYVxuIik7CisJCWtmcmVlKGNhbSk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBjcGlhX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlcyB2JWQuJWQuJWRcbiIsIEFCT1VULAorCSAgICAgICBDUElBX01BSl9WRVIsIENQSUFfTUlOX1ZFUiwgQ1BJQV9QQVRDSF9WRVIpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiU2luY2UgaW4ta2VybmVsIGNvbG9yc3BhY2UgY29udmVyc2lvbiBpcyBub3QgIgorCSAgICAgICAiYWxsb3dlZCwgaXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBub3cuIFVzZXJzIHNob3VsZCBmaXggdGhlICIKKwkgICAgICAgImFwcGxpY2F0aW9ucyBpbiBjYXNlIHRoZXkgZG9uJ3Qgd29yayB3aXRob3V0IGNvbnZlcnNpb24gIgorCSAgICAgICAicmVlbmFibGVkIGJ5IHNldHRpbmcgdGhlICdjb2xvcnNwYWNlX2NvbnYnIG1vZHVsZSAiCisJICAgICAgICJwYXJhbWV0ZXIgdG8gMSIpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlwcm9jX2NwaWFfY3JlYXRlKCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19WSURFT19DUElBX1BQCisJY3BpYV9wcF9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVklERU9fQ1BJQV9VU0IKKwljcGlhX3VzYl9pbml0KCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3BpYV9leGl0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlwcm9jX2NwaWFfZGVzdHJveSgpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0KGNwaWFfaW5pdCk7Cittb2R1bGVfZXhpdChjcGlhX2V4aXQpOworCisvKiBFeHBvcnRlZCBzeW1ib2xzIGZvciBtb2R1bGVzLiAqLworCitFWFBPUlRfU1lNQk9MKGNwaWFfcmVnaXN0ZXJfY2FtZXJhKTsKK0VYUE9SVF9TWU1CT0woY3BpYV91bnJlZ2lzdGVyX2NhbWVyYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjliNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEuaApAQCAtMCwwICsxLDQzMCBAQAorI2lmbmRlZiBjcGlhX2gKKyNkZWZpbmUgY3BpYV9oCisKKy8qCisgKiBDUGlBIFBhcmFsbGVsIFBvcnQgVmlkZW80TGludXggZHJpdmVyCisgKgorICogU3VwcG9ydHMgQ1BpQSBiYXNlZCBwYXJhbGxlbCBwb3J0IFZpZGVvIENhbWVyYSdzLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBCYXMgSHVpc21hbiwKKyAqICAgICAgICAgICAgICAgICAgICBQZXRlciBQcmVnbGVyLAorICogICAgICAgICAgICAgICAgICAgIFNjb3R0IEouIEJlcnRpbiwKKyAqICAgICAgICAgICAgICAgICAgICBWTFNJIFZpc2lvbiBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2RlZmluZSBDUElBX01BSl9WRVIJMQorI2RlZmluZSBDUElBX01JTl9WRVIgICAyCisjZGVmaW5lIENQSUFfUEFUQ0hfVkVSCTMKKworI2RlZmluZSBDUElBX1BQX01BSl9WRVIgICAgICAgQ1BJQV9NQUpfVkVSCisjZGVmaW5lIENQSUFfUFBfTUlOX1ZFUiAgICAgICBDUElBX01JTl9WRVIKKyNkZWZpbmUgQ1BJQV9QUF9QQVRDSF9WRVIgICAgIENQSUFfUEFUQ0hfVkVSCisKKyNkZWZpbmUgQ1BJQV9VU0JfTUFKX1ZFUiAgICAgIENQSUFfTUFKX1ZFUgorI2RlZmluZSBDUElBX1VTQl9NSU5fVkVSICAgICAgQ1BJQV9NSU5fVkVSCisjZGVmaW5lIENQSUFfVVNCX1BBVENIX1ZFUiAgICBDUElBX1BBVENIX1ZFUgorCisjZGVmaW5lIENQSUFfTUFYX0ZSQU1FX1NJWkVfVU5BTElHTkVECSgzNTIgKiAyODggKiA0KSAgIC8qIENJRiBhdCBSR0IzMiAqLworI2RlZmluZSBDUElBX01BWF9GUkFNRV9TSVpFCSgoQ1BJQV9NQVhfRlJBTUVfU0laRV9VTkFMSUdORUQgKyBQQUdFX1NJWkUgLSAxKSAmIH4oUEFHRV9TSVpFIC0gMSkpIC8qIGFsaWduIGFib3ZlIHRvIFBBR0VfU0laRSAqLworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCitzdHJ1Y3QgY3BpYV9jYW1lcmFfb3BzCit7CisJLyogb3BlbiBzZXRzIHByaXZkYXRhIHRvIHBvaW50IHRvIHN0cnVjdHVyZSBmb3IgdGhpcyBjYW1lcmEuCisgICAgICAgICAqIFJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IsIG90aGVyd2lzZSAwLgorCSAqLworCWludCAoKm9wZW4pKHZvaWQgKnByaXZkYXRhKTsKKwkKKwkvKiBSZWdpc3RlcnMgY2FsbGJhY2sgZnVuY3Rpb24gY2IgdG8gYmUgY2FsbGVkIHdpdGggY2JkYXRhCisJICogd2hlbiBhbiBpbWFnZSBpcyByZWFkeS4gIElmIGNiIGlzIE5VTEwsIG9ubHkgc2luZ2xlIGltYWdlIGdyYWJzCisJICogc2hvdWxkIGJlIHVzZWQuICBjYiBzaG91bGQgaW1tZWRpYXRlbHkgY2FsbCBzdHJlYW1SZWFkIHRvIHJlYWQKKwkgKiB0aGUgZGF0YSBvciBkYXRhIG1heSBiZSBsb3N0LiBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLAorCSAqIG90aGVyd2lzZSAwLgorCSAqLworCWludCAoKnJlZ2lzdGVyQ2FsbGJhY2spKHZvaWQgKnByaXZkYXRhLCB2b2lkICgqY2IpKHZvaWQgKmNiZGF0YSksCisJICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2JkYXRhKTsKKwkKKwkvKiB0cmFuc2ZlckNtZCBzZW5kcyBjb21tYW5kcyB0byB0aGUgY2FtZXJhLiAgY29tbWFuZCBNVVNUIHBvaW50IHRvCisJICogYW4gIDggYnl0ZSBidWZmZXIgaW4ga2VybmVsIHNwYWNlLiBkYXRhIGNhbiBiZSBOVUxMIGlmIG5vIGV4dHJhCisJICogZGF0YSBpcyBuZWVkZWQuICBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBpcyBnaXZlbiBieSB0aGUgbGFzdCAyCisJICogYnl0ZXMgb2YgY29tbWFuZC4gIGRhdGEgbXVzdCBhbHNvIHBvaW50IHRvIG1lbW9yeSBpbiBrZXJuZWwgc3BhY2UuCisJICogUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciwgb3RoZXJ3aXNlIDAuCisJICovCisJaW50ICgqdHJhbnNmZXJDbWQpKHZvaWQgKnByaXZkYXRhLCB1OCAqY29tbWFuZCwgdTggKmRhdGEpOworCisJLyogc3RyZWFtU3RhcnQgaW5pdGlhdGVzIHN0cmVhbSBjYXB0dXJlIG1vZGUuCisJICogUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciwgb3RoZXJ3aXNlIDAuCisJICovCisJaW50ICgqc3RyZWFtU3RhcnQpKHZvaWQgKnByaXZkYXRhKTsKKwkKKwkvKiBzdHJlYW1TdG9wIHRlcm1pbmF0ZXMgc3RyZWFtIGNhcHR1cmUgbW9kZS4KKwkgKiBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLCBvdGhlcndpc2UgMC4KKwkgKi8KKwlpbnQgKCpzdHJlYW1TdG9wKSh2b2lkICpwcml2ZGF0YSk7CisgICAgICAgIAorCS8qIHN0cmVhbVJlYWQgcmVhZHMgYSBmcmFtZSBmcm9tIHRoZSBjYW1lcmEuICBidWZmZXIgcG9pbnRzIHRvIGEKKyAgICAgICAgICogYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGEgY29tcGxldGUgZnJhbWUgaW4ga2VybmVsIHNwYWNlLgorICAgICAgICAgKiBub2Jsb2NrIGluZGljYXRlcyBpZiB0aGlzIHNob3VsZCBiZSBhIG5vbiBibG9ja2luZyByZWFkLgorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAgICAgICAgICovCisJaW50ICgqc3RyZWFtUmVhZCkodm9pZCAqcHJpdmRhdGEsIHU4ICpidWZmZXIsIGludCBub2Jsb2NrKTsKKwkKKwkvKiBjbG9zZSBkaXNhYmxlcyB0aGUgZGV2aWNlIHVudGlsIG9wZW4oKSBpcyBjYWxsZWQgYWdhaW4uCisJICogUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciwgb3RoZXJ3aXNlIDAuCisJICovCisJaW50ICgqY2xvc2UpKHZvaWQgKnByaXZkYXRhKTsKKwkKKwkvKiBJZiB3YWl0X2Zvcl9zdHJlYW1fcmVhZHkgaXMgbm9uLXplcm8sIHdhaXQgdW50aWwgdGhlIHN0cmVhbVN0YXRlCisJICogaXMgU1RSRUFNX1JFQURZIGJlZm9yZSBjYWxsaW5nIHN0cmVhbVJlYWQuCisJICovCisJaW50IHdhaXRfZm9yX3N0cmVhbV9yZWFkeTsKKworCS8qIAorCSAqIFVzZWQgdG8gbWFpbnRhaW4gbG93bGV2ZWwgbW9kdWxlIHVzYWdlIGNvdW50cworCSAqLworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKworc3RydWN0IGNwaWFfZnJhbWUgeworCXU4ICpkYXRhOworCWludCBjb3VudDsKKwlpbnQgd2lkdGg7CisJaW50IGhlaWdodDsKKwl2b2xhdGlsZSBpbnQgc3RhdGU7Cit9OworCitzdHJ1Y3QgY2FtX3BhcmFtcyB7CisJc3RydWN0IHsKKwkJdTggZmlybXdhcmVWZXJzaW9uOworCQl1OCBmaXJtd2FyZVJldmlzaW9uOworCQl1OCB2Y1ZlcnNpb247CisJCXU4IHZjUmV2aXNpb247CisJfSB2ZXJzaW9uOworCXN0cnVjdCB7CisJCXUxNiB2ZW5kb3I7CisJCXUxNiBwcm9kdWN0OworCQl1MTYgZGV2aWNlUmV2aXNpb247CisJfSBwbnBJRDsKKwlzdHJ1Y3QgeworCQl1OCB2cFZlcnNpb247CisJCXU4IHZwUmV2aXNpb247CisJCXUxNiBjYW1lcmFIZWFkSUQ7CisJfSB2cFZlcnNpb247CisJc3RydWN0IHsKKwkJdTggc3lzdGVtU3RhdGU7CisJCXU4IGdyYWJTdGF0ZTsKKwkJdTggc3RyZWFtU3RhdGU7CisJCXU4IGZhdGFsRXJyb3I7CisJCXU4IGNtZEVycm9yOworCQl1OCBkZWJ1Z0ZsYWdzOworCQl1OCB2cFN0YXR1czsKKwkJdTggZXJyb3JDb2RlOworCX0gc3RhdHVzOworCXN0cnVjdCB7CisJCXU4IGJyaWdodG5lc3M7CisJCXU4IGNvbnRyYXN0OworCQl1OCBzYXR1cmF0aW9uOworCX0gY29sb3VyUGFyYW1zOworCXN0cnVjdCB7CisJCXU4IGdhaW5Nb2RlOworCQl1OCBleHBNb2RlOworCQl1OCBjb21wTW9kZTsKKwkJdTggY2VudHJlV2VpZ2h0OworCQl1OCBnYWluOworCQl1OCBmaW5lRXhwOworCQl1OCBjb2Fyc2VFeHBMbzsKKwkJdTggY29hcnNlRXhwSGk7CisJCXU4IHJlZENvbXA7CisJCXU4IGdyZWVuMUNvbXA7CisJCXU4IGdyZWVuMkNvbXA7CisJCXU4IGJsdWVDb21wOworCX0gZXhwb3N1cmU7CisJc3RydWN0IHsKKwkJdTggYmFsYW5jZU1vZGU7CisJCXU4IHJlZEdhaW47CisJCXU4IGdyZWVuR2FpbjsKKwkJdTggYmx1ZUdhaW47CisJfSBjb2xvdXJCYWxhbmNlOworCXN0cnVjdCB7CisJCXU4IGRpdmlzb3I7CisJCXU4IGJhc2VyYXRlOworCX0gc2Vuc29yRnBzOworCXN0cnVjdCB7CisJCXU4IGdhaW4xOworCQl1OCBnYWluMjsKKwkJdTggZ2FpbjQ7CisJCXU4IGdhaW44OworCX0gYXBjb3I7CisJc3RydWN0IHsKKwkJdTggZGlzYWJsZWQ7CisJCXU4IGZsaWNrZXJNb2RlOworCQl1OCBjb2Fyc2VKdW1wOworCQlpbnQgYWxsb3dhYmxlT3ZlckV4cG9zdXJlOworCX0gZmxpY2tlckNvbnRyb2w7CisJc3RydWN0IHsKKwkJdTggZ2FpbjE7CisJCXU4IGdhaW4yOworCQl1OCBnYWluNDsKKwkJdTggZ2Fpbjg7CisJfSB2bE9mZnNldDsKKwlzdHJ1Y3QgeworCQl1OCBtb2RlOworCQl1OCBkZWNpbWF0aW9uOworCX0gY29tcHJlc3Npb247CisJc3RydWN0IHsKKwkJdTggZnJUYXJnZXRpbmc7CisJCXU4IHRhcmdldEZSOworCQl1OCB0YXJnZXRROworCX0gY29tcHJlc3Npb25UYXJnZXQ7CisJc3RydWN0IHsKKwkJdTggeVRocmVzaG9sZDsKKwkJdTggdXZUaHJlc2hvbGQ7CisJfSB5dXZUaHJlc2hvbGQ7CisJc3RydWN0IHsKKwkJdTggaHlzdGVyZXNpczsKKwkJdTggdGhyZXNoTWF4OworCQl1OCBzbWFsbFN0ZXA7CisJCXU4IGxhcmdlU3RlcDsKKwkJdTggZGVjaW1hdGlvbkh5c3RlcmVzaXM7CisJCXU4IGZyRGlmZlN0ZXBUaHJlc2g7CisJCXU4IHFEaWZmU3RlcFRocmVzaDsKKwkJdTggZGVjaW1hdGlvblRocmVzaE1vZDsKKwl9IGNvbXByZXNzaW9uUGFyYW1zOworCXN0cnVjdCB7CisJCXU4IHZpZGVvU2l6ZTsJCS8qIENJRi9RQ0lGICovCisJCXU4IHN1YlNhbXBsZTsKKwkJdTggeXV2T3JkZXI7CisgCX0gZm9ybWF0OworICAgICAgICBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVsIFFYMyBzcGVjaWZpYyBkYXRhICovCisgICAgICAgICAgICAgICAgdTggcXgzX2RldGVjdGVkOyAgICAgICAgLyogYSBRWDMgaXMgcHJlc2VudCAqLworICAgICAgICAgICAgICAgIHU4IHRvcGxpZ2h0OyAgICAgICAgICAgIC8qIHRvcCBsaWdodCBsaXQgLCBSL1cgKi8KKyAgICAgICAgICAgICAgICB1OCBib3R0b21saWdodDsgICAgICAgICAvKiBib3R0b20gbGlnaHQgbGl0LCBSL1cgKi8KKyAgICAgICAgICAgICAgICB1OCBidXR0b247ICAgICAgICAgICAgICAvKiBzbmFwc2hvdCBidXR0b24gcHJlc3NlZCAoUi9PKSAqLworICAgICAgICAgICAgICAgIHU4IGNyYWRsZWQ7ICAgICAgICAgICAgIC8qIG1pY3Jvc2NvcGUgaXMgaW4gY3JhZGxlIChSL08pICovCisgICAgICAgIH0gcXgzOworCXN0cnVjdCB7CisJCXU4IGNvbFN0YXJ0OwkJLyogc2tpcCBmaXJzdCA4KmNvbFN0YXJ0IHBpeGVscyAqLworCQl1OCBjb2xFbmQ7CQkvKiBmaW5pc2ggYXQgOCpjb2xFbmQgcGl4ZWxzICovCisJCXU4IHJvd1N0YXJ0OwkJLyogc2tpcCBmaXJzdCA0KnJvd1N0YXJ0IGxpbmVzICovCisJCXU4IHJvd0VuZDsJCS8qIGZpbmlzaCBhdCA0KnJvd0VuZCBsaW5lcyAqLworCX0gcm9pOworCXU4IGVjcFRpbWluZzsKKwl1OCBzdHJlYW1TdGFydExpbmU7Cit9OworCitlbnVtIHY0bF9jYW1zdGF0ZXMgeworCUNQSUFfVjRMX0lETEUgPSAwLAorCUNQSUFfVjRMX0VSUk9SLAorCUNQSUFfVjRMX0NPTU1BTkQsCisJQ1BJQV9WNExfR1JBQkJJTkcsCisJQ1BJQV9WNExfU1RSRUFNSU5HLAorCUNQSUFfVjRMX1NUUkVBTUlOR19QQVVTRUQsCit9OworCisjZGVmaW5lIEZSQU1FX05VTQkyCS8qIGRvdWJsZSBidWZmZXJpbmcgZm9yIG5vdyAqLworCitzdHJ1Y3QgY2FtX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgY2FtX2RhdGFfbGlzdDsKKworICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlIGJ1c3lfbG9jazsgICAgIC8qIGd1YXJkIGFnYWluc3QgU01QIG11bHRpdGhyZWFkaW5nICovCisJc3RydWN0IGNwaWFfY2FtZXJhX29wcyAqb3BzOwkvKiBsb3dsZXZlbCBkcml2ZXIgb3BlcmF0aW9ucyAqLworCXZvaWQgKmxvd2xldmVsX2RhdGE7CQkvKiBwcml2YXRlIGRhdGEgZm9yIGxvd2xldmVsIGRyaXZlciAqLworCXU4ICpyYXdfaW1hZ2U7CQkJLyogYnVmZmVyIGZvciByYXcgaW1hZ2UgZGF0YSAqLworCXN0cnVjdCBjcGlhX2ZyYW1lIGRlY29tcHJlc3NlZF9mcmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWZmZXIgdG8gaG9sZCBkZWNvbXByZXNzZWQgZnJhbWUgKi8KKwlpbnQgaW1hZ2Vfc2l6ZTsJCSAgICAgICAgLyogc2l6ZW9mIGxhc3QgZGVjb21wcmVzc2VkIGltYWdlICovCisJaW50IG9wZW5fY291bnQ7CQkJLyogIyBvZiBwcm9jZXNzIHRoYXQgaGF2ZSBjYW1lcmEgb3BlbiAqLworCisJCQkJLyogY2FtZXJhIHN0YXR1cyAqLworCWludCBmcHM7CQkJLyogYWN0dWFsIGZwcyByZXBvcnRlZCBieSB0aGUgY2FtZXJhICovCisJaW50IHRyYW5zZmVyX3JhdGU7CQkvKiB0cmFuc2ZlciByYXRlIGZyb20gY2FtZXJhIGluIGtCL3MgKi8KKwl1OCBtYWluc0ZyZXE7CQkJLyogZm9yIGZsaWNrZXIgY29udHJvbCAqLworCisJCQkJLyogcHJvYyBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIHBhcmFtX2xvY2s7CS8qIHBhcmFtcyBsb2NrIGZvciB0aGlzIGNhbWVyYSAqLworCXN0cnVjdCBjYW1fcGFyYW1zIHBhcmFtczsJLyogY2FtZXJhIHNldHRpbmdzICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudHJ5OwkvKiAvcHJvYy9jcGlhL3ZpZGVvWCAqLworCQorCQkJCQkvKiB2NGwgKi8KKwlpbnQgdmlkZW9fc2l6ZTsJCQkvKiBWSURFT19TSVpFXyAqLworCXZvbGF0aWxlIGVudW0gdjRsX2NhbXN0YXRlcyBjYW1zdGF0ZTsJLyogdjRsIGxheWVyIHN0YXR1cyAqLworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsJLyogdjRsIHZpZGVvZGV2ICovCisJc3RydWN0IHZpZGVvX3BpY3R1cmUgdnA7CS8qIHY0bCBjYW1lcmEgc2V0dGluZ3MgKi8KKwlzdHJ1Y3QgdmlkZW9fd2luZG93IHZ3OwkJLyogdjRsIGNhcHR1cmUgYXJlYSAqLworCXN0cnVjdCB2aWRlb19jYXB0dXJlIHZjOyAgICAgICAJLyogdjRsIHN1YmNhcHR1cmUgYXJlYSAqLworCisJCQkJLyogbW1hcCBpbnRlcmZhY2UgKi8KKwlpbnQgY3VyZnJhbWU7CQkJLyogdGhlIGN1cnJlbnQgZnJhbWUgdG8gZ3JhYiBpbnRvICovCisJdTggKmZyYW1lX2J1ZjsJCQkvKiBmcmFtZSBidWZmZXIgZGF0YSAqLworICAgICAgICBzdHJ1Y3QgY3BpYV9mcmFtZSBmcmFtZVtGUkFNRV9OVU1dOworCQkJCS8qIEZSQU1FX05VTS1idWZmZXJpbmcsIHNvIHdlIG5lZWQgYSBhcnJheSAqLworCisJaW50IGZpcnN0X2ZyYW1lOworCWludCBtbWFwX2tsdWRnZTsJCS8qICd3cm9uZycgYnl0ZSBvcmRlciBmb3IgbW1hcCAqLworCXZvbGF0aWxlIHUzMiBjbWRfcXVldWU7CQkvKiBxdWV1ZWQgY29tbWFuZHMgKi8KKwlpbnQgZXhwb3N1cmVfc3RhdHVzOwkJLyogRVhQT1NVUkVfKiAqLworCWludCBleHBvc3VyZV9jb3VudDsJCS8qIG51bWJlciBvZiBmcmFtZXMgYXQgdGhpcyBzdGF0dXMgKi8KK307CisKKy8qIGNwaWFfcmVnaXN0ZXJfY2FtZXJhIGlzIGNhbGxlZCBieSBsb3cgbGV2ZWwgZHJpdmVyIGZvciBlYWNoIGNhbWVyYS4KKyAqIEEgdW5pcXVlIGNhbWVyYSBudW1iZXIgaXMgcmV0dXJuZWQsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IgKi8KK3N0cnVjdCBjYW1fZGF0YSAqY3BpYV9yZWdpc3Rlcl9jYW1lcmEoc3RydWN0IGNwaWFfY2FtZXJhX29wcyAqb3BzLCB2b2lkICpsb3dsZXZlbCk7CisKKy8qIGNwaWFfdW5yZWdpc3Rlcl9jYW1lcmEgaXMgY2FsbGVkIGJ5IGxvdyBsZXZlbCBkcml2ZXIgd2hlbiBhIGNhbWVyYQorICogaXMgcmVtb3ZlZC4gIFRoaXMgbXVzdCBub3QgZmFpbC4gKi8KK3ZvaWQgY3BpYV91bnJlZ2lzdGVyX2NhbWVyYShzdHJ1Y3QgY2FtX2RhdGEgKmNhbSk7CisKKy8qIHJhdyBDSUYgKyA2NCBieXRlIGhlYWRlciArICgyIGJ5dGVzIGxpbmVfbGVuZ3RoICsgRU9MKSBwZXIgbGluZSArIDQqRU9JICsKKyAqIG9uZSBieXRlIDE2Yml0IERNQSBhbGlnbm1lbnQKKyAqLworI2RlZmluZSBDUElBX01BWF9JTUFHRV9TSVpFICgoMzUyKjI4OCoyKSs2NCsoMjg4KjMpKzUpCisKKy8qIGNvbnN0YW50IHZhbHVlJ3MgKi8KKyNkZWZpbmUgTUFHSUNfMAkJMHgxOQorI2RlZmluZSBNQUdJQ18xCQkweDY4CisjZGVmaW5lIERBVEFfSU4JCTB4QzAKKyNkZWZpbmUgREFUQV9PVVQJMHg0MAorI2RlZmluZSBWSURFT1NJWkVfUUNJRgkwCS8qIDE3NngxNDQgKi8KKyNkZWZpbmUgVklERU9TSVpFX0NJRgkxCS8qIDM1MngyODggKi8KKyNkZWZpbmUgVklERU9TSVpFX1NJRgkyCS8qIDMyMHgyNDAgKi8KKyNkZWZpbmUgVklERU9TSVpFX1FTSUYJMwkvKiAxNjB4MTIwICovCisjZGVmaW5lIFZJREVPU0laRV80OF80OAkJNCAvKiB3aGVyZSBubyBvbmUgaGFzIGdvbmUgYmVmb3JlLCBpY29uc2l6ZSEgKi8KKyNkZWZpbmUgVklERU9TSVpFXzY0XzQ4CQk1CisjZGVmaW5lIFZJREVPU0laRV8xMjhfOTYJNgorI2RlZmluZSBWSURFT1NJWkVfMTYwXzEyMAlWSURFT1NJWkVfUVNJRgorI2RlZmluZSBWSURFT1NJWkVfMTc2XzE0NAlWSURFT1NJWkVfUUNJRgorI2RlZmluZSBWSURFT1NJWkVfMTkyXzE0NAk3CisjZGVmaW5lIFZJREVPU0laRV8yMjRfMTY4CTgKKyNkZWZpbmUgVklERU9TSVpFXzI1Nl8xOTIJOQorI2RlZmluZSBWSURFT1NJWkVfMjg4XzIxNgkxMAorI2RlZmluZSBWSURFT1NJWkVfMzIwXzI0MAlWSURFT1NJWkVfU0lGCisjZGVmaW5lIFZJREVPU0laRV8zNTJfMjg4CVZJREVPU0laRV9DSUYKKyNkZWZpbmUgVklERU9TSVpFXzg4XzcyCQkxMSAvKiBxdWFydGVyIENJRiAqLworI2RlZmluZSBTVUJTQU1QTEVfNDIwCTAKKyNkZWZpbmUgU1VCU0FNUExFXzQyMgkxCisjZGVmaW5lIFlVVk9SREVSX1lVWVYJMAorI2RlZmluZSBZVVZPUkRFUl9VWVZZCTEKKyNkZWZpbmUgTk9UX0NPTVBSRVNTRUQJMAorI2RlZmluZSBDT01QUkVTU0VECTEKKyNkZWZpbmUgTk9fREVDSU1BVElPTgkwCisjZGVmaW5lIERFQ0lNQVRJT05fRU5BQgkxCisjZGVmaW5lIEVPSQkJMHhmZgkvKiBFbmQgT2YgSW1hZ2UgKi8KKyNkZWZpbmUgRU9MCQkweGZkCS8qIEVuZCBPZiBMaW5lICovCisjZGVmaW5lIEZSQU1FX0hFQURFUl9TSVpFCTY0CisKKy8qIEltYWdlIGdyYWIgbW9kZXMgKi8KKyNkZWZpbmUgQ1BJQV9HUkFCX1NJTkdMRQkwCisjZGVmaW5lIENQSUFfR1JBQl9DT05USU5VT1VTCTEKKworLyogQ29tcHJlc3Npb24gcGFyYW1ldGVycyAqLworI2RlZmluZSBDUElBX0NPTVBSRVNTSU9OX05PTkUJMAorI2RlZmluZSBDUElBX0NPTVBSRVNTSU9OX0FVVE8JMQorI2RlZmluZSBDUElBX0NPTVBSRVNTSU9OX01BTlVBTAkyCisjZGVmaW5lIENQSUFfQ09NUFJFU1NJT05fVEFSR0VUX1FVQUxJVFkgICAgICAgICAwCisjZGVmaW5lIENQSUFfQ09NUFJFU1NJT05fVEFSR0VUX0ZSQU1FUkFURSAgICAgICAxCisKKy8qIFJldHVybiBvZmZzZXRzIGZvciBHZXRDYW1lcmFTdGF0ZSAqLworI2RlZmluZSBTWVNURU1TVEFURQkwCisjZGVmaW5lIEdSQUJTVEFURQkxCisjZGVmaW5lIFNUUkVBTVNUQVRFCTIKKyNkZWZpbmUgRkFUQUxFUlJPUgkzCisjZGVmaW5lIENNREVSUk9SCTQKKyNkZWZpbmUgREVCVUdGTEFHUwk1CisjZGVmaW5lIFZQU1RBVFVTCTYKKyNkZWZpbmUgRVJST1JDT0RFCTcKKworLyogU3lzdGVtU3RhdGUgKi8KKyNkZWZpbmUgVU5JTklUSUFMSVNFRF9TVEFURQkwCisjZGVmaW5lIFBBU1NfVEhST1VHSF9TVEFURQkxCisjZGVmaW5lIExPX1BPV0VSX1NUQVRFCQkyCisjZGVmaW5lIEhJX1BPV0VSX1NUQVRFCQkzCisjZGVmaW5lIFdBUk1fQk9PVF9TVEFURQkJNAorCisvKiBHcmFiU3RhdGUgKi8KKyNkZWZpbmUgR1JBQl9JRExFCQkwCisjZGVmaW5lIEdSQUJfQUNUSVZFCQkxCisjZGVmaW5lIEdSQUJfRE9ORQkJMgorCisvKiBTdHJlYW1TdGF0ZSAqLworI2RlZmluZSBTVFJFQU1fTk9UX1JFQURZCTAKKyNkZWZpbmUgU1RSRUFNX1JFQURZCQkxCisjZGVmaW5lIFNUUkVBTV9PUEVOCQkyCisjZGVmaW5lIFNUUkVBTV9QQVVTRUQJCTMKKyNkZWZpbmUgU1RSRUFNX0ZJTklTSEVECQk0CisKKy8qIEZhdGFsIEVycm9yLCBDbWRFcnJvciwgYW5kIERlYnVnRmxhZ3MgKi8KKyNkZWZpbmUgQ1BJQV9GTEFHCSAgMQorI2RlZmluZSBTWVNURU1fRkxBRwkgIDIKKyNkZWZpbmUgSU5UX0NUUkxfRkxBRwkgIDQKKyNkZWZpbmUgUFJPQ0VTU19GTEFHCSAgOAorI2RlZmluZSBDT01fRkxBRwkgMTYKKyNkZWZpbmUgVlBfQ1RSTF9GTEFHCSAzMgorI2RlZmluZSBDQVBUVVJFX0ZMQUcJIDY0CisjZGVmaW5lIERFQlVHX0ZMQUcJMTI4CisKKy8qIFZQU3RhdHVzICovCisjZGVmaW5lIFZQX1NUQVRFX09LCQkJMHgwMAorCisjZGVmaW5lIFZQX1NUQVRFX0ZBSUxFRF9WSURFT0lOSVQJMHgwMQorI2RlZmluZSBWUF9TVEFURV9GQUlMRURfQUVDQUNCSU5JVAkweDAyCisjZGVmaW5lIFZQX1NUQVRFX0FFQ19NQVgJCTB4MDQKKyNkZWZpbmUgVlBfU1RBVEVfQUNCX0JNQVgJCTB4MDgKKworI2RlZmluZSBWUF9TVEFURV9BQ0JfUk1JTgkJMHgxMAorI2RlZmluZSBWUF9TVEFURV9BQ0JfR01JTgkJMHgyMAorI2RlZmluZSBWUF9TVEFURV9BQ0JfUk1BWAkJMHg0MAorI2RlZmluZSBWUF9TVEFURV9BQ0JfR01BWAkJMHg4MAorCisvKiBkZWZhdWx0IChtaW5pbXVtKSBjb21wZW5zYXRpb24gdmFsdWVzICovCisjZGVmaW5lIENPTVBfUkVEICAgICAgICAyMjAKKyNkZWZpbmUgQ09NUF9HUkVFTjEgICAgIDIxNAorI2RlZmluZSBDT01QX0dSRUVOMiAgICAgQ09NUF9HUkVFTjEKKyNkZWZpbmUgQ09NUF9CTFVFICAgICAgIDIzMAorCisvKiBleHBvc3VyZSBzdGF0dXMgKi8KKyNkZWZpbmUgRVhQT1NVUkVfVkVSWV9MSUdIVCAwCisjZGVmaW5lIEVYUE9TVVJFX0xJR0hUICAgICAgMQorI2RlZmluZSBFWFBPU1VSRV9OT1JNQUwgICAgIDIKKyNkZWZpbmUgRVhQT1NVUkVfREFSSyAgICAgICAzCisjZGVmaW5lIEVYUE9TVVJFX1ZFUllfREFSSyAgNAorCisvKiBFcnJvckNvZGUgKi8KKyNkZWZpbmUgRVJST1JfRkxJQ0tFUl9CRUxPV19NSU5fRVhQICAgICAweDAxIC8qZmxpY2tlciBleHBvc3VyZSBnb3QgYmVsb3cgbWluaW11bSBleHBvc3VyZSAqLworI2RlZmluZSBBTE9HKGZtdCxhcmdzLi4uKSBwcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIExPRyhmbXQsYXJncy4uLikgQUxPRyhLRVJOX0lORk8gX19GSUxFX18gIjolcyglZCk6IiBmbXQsIF9fRlVOQ1RJT05fXyAsIF9fTElORV9fICwgIyNhcmdzKQorCisjaWZkZWYgX0NQSUFfREVCVUdfCisjZGVmaW5lIEFEQkcoZm10LGFyZ3MuLi4pIHByaW50ayhmbXQsIGppZmZpZXMsICMjYXJncykKKyNkZWZpbmUgREJHKGZtdCxhcmdzLi4uKSBBREJHKEtFUk5fREVCVUcgX19GSUxFX18iICglbGQpOiVzKCVkKToiIGZtdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyAsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIERCRyhmbW4sYXJncy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIERFQl9CWVRFKHApXAorICBEQkcoIiUxZCAlMWQgJTFkICUxZCAlMWQgJTFkICUxZCAlMWQgXG4iLFwKKyAgICAgIChwKSYweDgwPzE6MCwgKHApJjB4NDA/MTowLCAocCkmMHgyMD8xOjAsIChwKSYweDEwPzE6MCxcCisgICAgICAgIChwKSYweDA4PzE6MCwgKHApJjB4MDQ/MTowLCAocCkmMHgwMj8xOjAsIChwKSYweDAxPzE6MCk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBjcGlhX2ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV9wcC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmMTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV9wcC5jCkBAIC0wLDAgKzEsODg2IEBACisvKgorICogY3BpYV9wcCBDUGlBIFBhcmFsbGVsIFBvcnQgZHJpdmVyCisgKgorICogU3VwcG9ydHMgQ1BpQSBiYXNlZCBwYXJhbGxlbCBwb3J0IFZpZGVvIENhbWVyYSdzLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBCYXMgSHVpc21hbiA8Ymh1aXNtQGNzLnV0d2VudGUubmw+CisgKiAoQykgQ29weXJpZ2h0IDE5OTktMjAwMCBTY290dCBKLiBCZXJ0aW4gPHNiZXJ0aW5Ac2VjdXJlbnltLm5ldD4sCisgKiAoQykgQ29weXJpZ2h0IDE5OTktMjAwMCBQZXRlciBQcmVnbGVyIDxQZXRlcl9QcmVnbGVyQGVtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBkZWZpbmUgX0NQSUFfREVCVUdfIGZvciB2ZXJib3NlIGRlYnVnIG91dHB1dCAoc2VlIGNwaWEuaCkgKi8KKy8qICNkZWZpbmUgX0NQSUFfREVCVUdfICAxICovICAKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bGludXgva21vZC5oPgorCisvKiAjZGVmaW5lIF9DUElBX0RFQlVHXwkJZGVmaW5lIGZvciB2ZXJib3NlIGRlYnVnIG91dHB1dCAqLworI2luY2x1ZGUgImNwaWEuaCIKKworc3RhdGljIGludCBjcGlhX3BwX29wZW4odm9pZCAqcHJpdmRhdGEpOworc3RhdGljIGludCBjcGlhX3BwX3JlZ2lzdGVyQ2FsbGJhY2sodm9pZCAqcHJpdmRhdGEsIHZvaWQgKCpjYikgKHZvaWQgKmNiZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYmRhdGEpOworc3RhdGljIGludCBjcGlhX3BwX3RyYW5zZmVyQ21kKHZvaWQgKnByaXZkYXRhLCB1OCAqY29tbWFuZCwgdTggKmRhdGEpOworc3RhdGljIGludCBjcGlhX3BwX3N0cmVhbVN0YXJ0KHZvaWQgKnByaXZkYXRhKTsKK3N0YXRpYyBpbnQgY3BpYV9wcF9zdHJlYW1TdG9wKHZvaWQgKnByaXZkYXRhKTsKK3N0YXRpYyBpbnQgY3BpYV9wcF9zdHJlYW1SZWFkKHZvaWQgKnByaXZkYXRhLCB1OCAqYnVmZmVyLCBpbnQgbm9ibG9jayk7CitzdGF0aWMgaW50IGNwaWFfcHBfY2xvc2Uodm9pZCAqcHJpdmRhdGEpOworCisKKyNkZWZpbmUgQUJPVVQgIlBhcmFsbGVsIHBvcnQgZHJpdmVyIGZvciBWaXNpb24gQ1BpQSBiYXNlZCBjYW1lcmFzIgorCisjZGVmaW5lIFBBQ0tFVF9MRU5HVEggIDgKKworLyogTWFnaWMgbnVtYmVycyBmb3IgZGVmaW5pbmcgcG9ydC1kZXZpY2UgbWFwcGluZ3MgKi8KKyNkZWZpbmUgUFBDUElBX1BBUlBPUlRfVU5TUEVDIC00CisjZGVmaW5lIFBQQ1BJQV9QQVJQT1JUX0FVVE8gLTMKKyNkZWZpbmUgUFBDUElBX1BBUlBPUlRfT0ZGIC0yCisjZGVmaW5lIFBQQ1BJQV9QQVJQT1JUX05PTkUgLTEKKworI2lmZGVmIE1PRFVMRQorc3RhdGljIGludCBwYXJwb3J0X25yW1BBUlBPUlRfTUFYXSA9IHtbMCAuLi4gUEFSUE9SVF9NQVggLSAxXSA9IFBQQ1BJQV9QQVJQT1JUX1VOU1BFQ307CitzdGF0aWMgY2hhciAqcGFycG9ydFtQQVJQT1JUX01BWF0gPSB7TlVMTCx9OworCitNT0RVTEVfQVVUSE9SKCJCLiBIdWlzbWFuIDxiaHVpc21AY3MudXR3ZW50ZS5ubD4gJiBQZXRlciBQcmVnbGVyIDxQZXRlcl9QcmVnbGVyQGVtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUGFyYWxsZWwgcG9ydCBkcml2ZXIgZm9yIFZpc2lvbiBDUGlBIGJhc2VkIGNhbWVyYXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHBhcnBvcnQsIGNoYXJwLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGFycG9ydCwgIidhdXRvJyBvciBhIGxpc3Qgb2YgcGFyYWxsZWwgcG9ydCBudW1iZXJzLiBKdXN0IGxpa2UgbHAuIik7CisjZWxzZQorc3RhdGljIGludCBwYXJwb3J0X25yW1BBUlBPUlRfTUFYXSBfX2luaXRkYXRhID0KKwl7WzAgLi4uIFBBUlBPUlRfTUFYIC0gMV0gPSBQUENQSUFfUEFSUE9SVF9VTlNQRUN9Oworc3RhdGljIGludCBwYXJwb3J0X3B0ciA9IDA7CisjZW5kaWYKKworc3RydWN0IHBwX2NhbV9lbnRyeSB7CisJc3RydWN0IHBhcmRldmljZSAqcGRldjsKKwlzdHJ1Y3QgcGFycG9ydCAqcG9ydDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2JfdGFzazsKKwlpbnQgb3Blbl9jb3VudDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cV9zdHJlYW07CisJLyogaW1hZ2Ugc3RhdGUgZmxhZ3MgKi8KKwlpbnQgaW1hZ2VfcmVhZHk7CS8qIHdlIGdvdCBhbiBpbnRlcnJ1cHQgKi8KKwlpbnQgaW1hZ2VfY29tcGxldGU7CS8qIHdlIGhhdmUgc2VlbiA0IEVPSSAqLworCisJaW50IHN0cmVhbWluZzsgLyogd2UgYXJlIGluIHN0cmVhbWluZyBtb2RlICovCisJaW50IHN0cmVhbV9pcnE7Cit9OworCitzdGF0aWMgc3RydWN0IGNwaWFfY2FtZXJhX29wcyBjcGlhX3BwX29wcyA9IAoreworCWNwaWFfcHBfb3BlbiwKKwljcGlhX3BwX3JlZ2lzdGVyQ2FsbGJhY2ssCisJY3BpYV9wcF90cmFuc2ZlckNtZCwKKwljcGlhX3BwX3N0cmVhbVN0YXJ0LAorCWNwaWFfcHBfc3RyZWFtU3RvcCwKKwljcGlhX3BwX3N0cmVhbVJlYWQsCisJY3BpYV9wcF9jbG9zZSwKKwkxLAorCVRISVNfTU9EVUxFCit9OworCitzdGF0aWMgTElTVF9IRUFEKGNhbV9saXN0KTsKK3N0YXRpYyBzcGlubG9ja190IGNhbV9saXN0X2xvY2tfcHA7CisKKy8qIEZJWE1FICovCitzdGF0aWMgdm9pZCBjcGlhX3BhcnBvcnRfZW5hYmxlX2lycSggc3RydWN0IHBhcnBvcnQgKnBvcnQgKSB7CisJcGFycG9ydF9lbmFibGVfaXJxKHBvcnQpOworCW1kZWxheSgxMCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjcGlhX3BhcnBvcnRfZGlzYWJsZV9pcnEoIHN0cnVjdCBwYXJwb3J0ICpwb3J0ICkgeworCXBhcnBvcnRfZGlzYWJsZV9pcnEocG9ydCk7CisJbWRlbGF5KDEwKTsKKwlyZXR1cm47Cit9CisKKy8qIFNwZWNpYWwgQ1BpQSBQUEMgbW9kZXM6IFRoZXNlIGFyZSBpbnZva2VkIGJ5IHVzaW5nIHRoZSAxMjg0IEV4dGVuc2liaWxpdHkKKyAqIExpbmsgRmxhZyBkdXJpbmcgbmVnb3RpYXRpb24gKi8gIAorI2RlZmluZSBVUExPQURfRkxBRyAgMHgwOAorI2RlZmluZSBOSUJCTEVfVFJBTlNGRVIgMHgwMQorI2RlZmluZSBFQ1BfVFJBTlNGRVIgMHgwMworCisjZGVmaW5lIFBBUlBPUlRfQ0hVTktfU0laRQlQQUdFX1NJWkUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBDUGlBLXNwZWNpZmljICBsb3ctbGV2ZWwgcGFycG9ydCBmdW5jdGlvbnMgZm9yIG5pYmJsZSB1cGxvYWRzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBDUGlBIG5vbnN0YW5kYXJkICJOaWJibGUiIG1vZGUgKG5vIG5EYXRhQXZhaWwgc2lnbmFsIGFmdGVyIGVhY2ggYnl0ZSkuICovCisvKiBUaGUgc3RhbmRhcmQga2VybmVsIHBhcnBvcnRfaWVlZTEyODRfcmVhZF9uaWJibGUoKSBmYWlscyB3aXRoIHRoZSBDUGlBLi4uICovCisKK3N0YXRpYyBzaXplX3QgY3BpYV9yZWFkX25pYmJsZSAoc3RydWN0IHBhcnBvcnQgKnBvcnQsIAorCQkJIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbiwgCisJCQkgaW50IGZsYWdzKQoreworCS8qIGFkYXB0ZWQgdmVyYmF0aW0sIHdpdGggb25lIGNoYW5nZSwgZnJvbSAKKwkgICBwYXJwb3J0X2llZWUxMjg0X3JlYWRfbmliYmxlKCkgaW4gZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LW9wcy5jICovCisKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBidWZmZXI7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBieXRlID0gMDsKKwkKKwlsZW4gKj0gMjsgLyogaW4gbmliYmxlcyAqLworCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciBuaWJibGU7CisKKwkJLyogVGhlIENQaUEgZmlybXdhcmUgc3VwcHJlc3NlcyB0aGUgdXNlIG9mIG5EYXRhQXZhaWwgKG5GYXVsdCBMTykKKwkJICogYWZ0ZXIgZXZlcnkgc2Vjb25kIG5pYmJsZSB0byBzaWduYWwgdGhhdCBtb3JlCisJCSAqIGRhdGEgaXMgYXZhaWxhYmxlLiAgKHRoZSB0b3RhbCBudW1iZXIgb2YgQnl0ZXMgdGhhdAorCQkgKiBzaG91bGQgYmUgc2VudCBpcyBrbm93bjsgaWYgdG9vIGZldyBhcmUgcmVjZWl2ZWQsIGFuIGVycm9yCisJCSAqIHdpbGwgYmUgcmVjb3JkZWQgYWZ0ZXIgYSB0aW1lb3V0KS4gIAorCQkgKiBUaGlzIGlzIGluY29tcGF0aWJsZSB3aXRoIHBhcnBvcnRfaWVlZTEyODRfcmVhZF9uaWJibGUoKSwKKwkJICogd2hpY2ggZXhwZWN0cyB0byBmaW5kIG5GYXVsdCBMTyBhZnRlciBldmVyeSBzZWNvbmQgbmliYmxlLgorCQkgKi8KKworCQkvKiBTb2x1dGlvbjogbW9kaWZ5IGNwaWFfcmVhZF9uaWJibGUgdG8gb25seSBjaGVjayBmb3IgCisJCSAqIG5EYXRhQXZhaWwgYmVmb3JlIHRoZSBmaXJzdCBuaWJibGUgaXMgc2VudC4KKwkJICovCisKKwkJLyogRG9lcyB0aGUgZXJyb3IgbGluZSBpbmRpY2F0ZSBlbmQgb2YgZGF0YT8gKi8KKwkJaWYgKCgoaSAvKiYgMSovKSA9PSAwKSAmJgorCQkgICAgKHBhcnBvcnRfcmVhZF9zdGF0dXMocG9ydCkgJiBQQVJQT1JUX1NUQVRVU19FUlJPUikpIHsKKwkJCXBvcnQtPnBoeXNwb3J0LT5pZWVlMTI4NC5waGFzZSA9IElFRUUxMjg0X1BIX0hCVVNZX0ROQTsKKwkJCQlEQkcoIiVzOiBObyBtb3JlIG5pYmJsZSBkYXRhICglZCBieXRlcylcbiIsCisJCQkJcG9ydC0+bmFtZSwgaS8yKTsKKworCQkJLyogR28gdG8gcmV2ZXJzZSBpZGxlIHBoYXNlLiAqLworCQkJcGFycG9ydF9mcm9iX2NvbnRyb2wgKHBvcnQsCisJCQkJCSAgICAgIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQsCisJCQkJCSAgICAgIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQpOworCQkJcG9ydC0+cGh5c3BvcnQtPmllZWUxMjg0LnBoYXNlID0gSUVFRTEyODRfUEhfUkVWX0lETEU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEV2ZW50IDc6IFNldCBuQXV0b0ZkIGxvdy4gKi8KKwkJcGFycG9ydF9mcm9iX2NvbnRyb2wgKHBvcnQsCisJCQkJICAgICAgUEFSUE9SVF9DT05UUk9MX0FVVE9GRCwKKwkJCQkgICAgICBQQVJQT1JUX0NPTlRST0xfQVVUT0ZEKTsKKworCQkvKiBFdmVudCA5OiBuQWNrIGdvZXMgbG93LiAqLworCQlwb3J0LT5pZWVlMTI4NC5waGFzZSA9IElFRUUxMjg0X1BIX1JFVl9EQVRBOworCQlpZiAocGFycG9ydF93YWl0X3BlcmlwaGVyYWwgKHBvcnQsCisJCQkJCSAgICAgUEFSUE9SVF9TVEFUVVNfQUNLLCAwKSkgeworCQkJLyogVGltZW91dCAtLSBubyBtb3JlIGRhdGE/ICovCisJCQkJIERCRygiJXM6IE5pYmJsZSB0aW1lb3V0IGF0IGV2ZW50IDkgKCVkIGJ5dGVzKVxuIiwKKwkJCQkgcG9ydC0+bmFtZSwgaS8yKTsKKwkJCXBhcnBvcnRfZnJvYl9jb250cm9sIChwb3J0LCBQQVJQT1JUX0NPTlRST0xfQVVUT0ZELCAwKTsKKwkJCWJyZWFrOworCQl9CisKKworCQkvKiBSZWFkIGEgbmliYmxlLiAqLworCQluaWJibGUgPSBwYXJwb3J0X3JlYWRfc3RhdHVzIChwb3J0KSA+PiAzOworCQluaWJibGUgJj0gfjg7CisJCWlmICgobmliYmxlICYgMHgxMCkgPT0gMCkKKwkJCW5pYmJsZSB8PSA4OworCQluaWJibGUgJj0gMHhmOworCisJCS8qIEV2ZW50IDEwOiBTZXQgbkF1dG9GZCBoaWdoLiAqLworCQlwYXJwb3J0X2Zyb2JfY29udHJvbCAocG9ydCwgUEFSUE9SVF9DT05UUk9MX0FVVE9GRCwgMCk7CisKKwkJLyogRXZlbnQgMTE6IG5BY2sgZ29lcyBoaWdoLiAqLworCQlpZiAocGFycG9ydF93YWl0X3BlcmlwaGVyYWwgKHBvcnQsCisJCQkJCSAgICAgUEFSUE9SVF9TVEFUVVNfQUNLLAorCQkJCQkgICAgIFBBUlBPUlRfU1RBVFVTX0FDSykpIHsKKwkJCS8qIFRpbWVvdXQgLS0gbm8gbW9yZSBkYXRhPyAqLworCQkJREJHKCIlczogTmliYmxlIHRpbWVvdXQgYXQgZXZlbnQgMTFcbiIsCisJCQkJIHBvcnQtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSAmIDEpIHsKKwkJCS8qIFNlY29uZCBuaWJibGUgKi8KKwkJCWJ5dGUgfD0gbmliYmxlIDw8IDQ7CisJCQkqYnVmKysgPSBieXRlOworCQl9IGVsc2UgCisJCQlieXRlID0gbmliYmxlOworCX0KKworCWkgLz0gMjsgLyogaSBpcyBub3cgaW4gYnl0ZXMgKi8KKworCWlmIChpID09IGxlbikgeworCQkvKiBSZWFkIHRoZSBsYXN0IG5pYmJsZSB3aXRob3V0IGNoZWNraW5nIGRhdGEgYXZhaWwuICovCisJCXBvcnQgPSBwb3J0LT5waHlzcG9ydDsKKwkJaWYgKHBhcnBvcnRfcmVhZF9zdGF0dXMgKHBvcnQpICYgUEFSUE9SVF9TVEFUVVNfRVJST1IpCisJCQlwb3J0LT5pZWVlMTI4NC5waGFzZSA9IElFRUUxMjg0X1BIX0hCVVNZX0ROQTsKKwkJZWxzZQorCQkJcG9ydC0+aWVlZTEyODQucGhhc2UgPSBJRUVFMTI4NF9QSF9IQlVTWV9EQVZBSUw7CisJfQorCisJcmV0dXJuIGk7Cit9CisKKy8qIENQaUEgbm9uc3RhbmRhcmQgIk5pYmJsZSBTdHJlYW0iIG1vZGUgKDIgbmliYmxlcyBwZXIgY3ljbGUsIGluc3RlYWQgb2YgMSkKKyAqIChTZWUgQ1BpQSBEYXRhIHNoZWV0IHAuIDMxKSAKKyAqIAorICogIk5pYmJsZSBTdHJlYW0iIG1vZGUgdXNlZCBieSBDUGlBIGZvciB1cGxvYWRzIHRvIG5vbi1FQ1AgcG9ydHMgaXMgYSAKKyAqIG5vbnN0YW5kYXJkIHZhcmlhbnQgb2YgbmliYmxlIG1vZGUgd2hpY2ggYWxsb3dzIHRoZSBzYW1lIChtZWRpb2NyZSkgCisgKiBkYXRhIGZsb3cgb2YgOCBiaXRzIHBlciBjeWNsZSBhcyBzb2Z0d2FyZS1lbmFibGVkIEVDUCBieSBUUklTVEFURS1jYXBhYmxlIAorICogcGFyYWxsZWwgcG9ydHMsIGJ1dCB3b3JrcyBhbHNvIGZvciAgbm9uLVRSSVNUQVRFLWNhcGFibGUgcG9ydHMuCisgKiAoU3RhbmRhcmQgbmliYmxlIG1vZGUgb25seSBzZW5kIDQgYml0cyBwZXIgY3ljbGUpCisgKgorICovCisKK3N0YXRpYyBzaXplX3QgY3BpYV9yZWFkX25pYmJsZV9zdHJlYW0oc3RydWN0IHBhcnBvcnQgKnBvcnQsIAorCQkJICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbiwgCisJCQkgICAgICAgaW50IGZsYWdzKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGJ1ZmZlcjsKKwlpbnQgZW5kc2VlbiA9IDA7CisKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgbmliYmxlWzJdLCBieXRlID0gMDsKKwkJaW50IGo7CisKKwkJLyogSW1hZ2UgRGF0YSBpcyBjb21wbGV0ZSB3aGVuIDQgY29uc2VjdXRpdmUgRU9JIGJ5dGVzICgweGZmKSBhcmUgc2VlbiAqLyAKKwkJaWYgKGVuZHNlZW4gPiAzICkKKwkJCWJyZWFrOworCisJCS8qIEV2ZW50IDc6IFNldCBuQXV0b0ZkIGxvdy4gKi8KKwkJcGFycG9ydF9mcm9iX2NvbnRyb2wgKHBvcnQsCisJCQkJICAgICAgUEFSUE9SVF9DT05UUk9MX0FVVE9GRCwKKwkJCQkgICAgICBQQVJQT1JUX0NPTlRST0xfQVVUT0ZEKTsKKwkJCisJCS8qIEV2ZW50IDk6IG5BY2sgZ29lcyBsb3cuICovCisJCXBvcnQtPmllZWUxMjg0LnBoYXNlID0gSUVFRTEyODRfUEhfUkVWX0RBVEE7CisJCWlmIChwYXJwb3J0X3dhaXRfcGVyaXBoZXJhbCAocG9ydCwKKwkJCQkJICAgICBQQVJQT1JUX1NUQVRVU19BQ0ssIDApKSB7CisJCQkvKiBUaW1lb3V0IC0tIG5vIG1vcmUgZGF0YT8gKi8KKwkJCQkgREJHKCIlczogTmliYmxlIHRpbWVvdXQgYXQgZXZlbnQgOSAoJWQgYnl0ZXMpXG4iLAorCQkJCSBwb3J0LT5uYW1lLCBpLzIpOworCQkJcGFycG9ydF9mcm9iX2NvbnRyb2wgKHBvcnQsIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQsIDApOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBSZWFkIGxvd2VyIG5pYmJsZSAqLworCQluaWJibGVbMF0gPSBwYXJwb3J0X3JlYWRfc3RhdHVzIChwb3J0KSA+PjM7CisJCQorCQkvKiBFdmVudCAxMDogU2V0IG5BdXRvRmQgaGlnaC4gKi8KKwkJcGFycG9ydF9mcm9iX2NvbnRyb2wgKHBvcnQsIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQsIDApOworCisJCS8qIEV2ZW50IDExOiBuQWNrIGdvZXMgaGlnaC4gKi8KKwkJaWYgKHBhcnBvcnRfd2FpdF9wZXJpcGhlcmFsIChwb3J0LAorCQkJCQkgICAgIFBBUlBPUlRfU1RBVFVTX0FDSywKKwkJCQkJICAgICBQQVJQT1JUX1NUQVRVU19BQ0spKSB7CisJCQkvKiBUaW1lb3V0IC0tIG5vIG1vcmUgZGF0YT8gKi8KKwkJCURCRygiJXM6IE5pYmJsZSB0aW1lb3V0IGF0IGV2ZW50IDExXG4iLAorCQkJCSBwb3J0LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJCQorCQkvKiBSZWFkIHVwcGVyIG5pYmJsZSAqLworCQluaWJibGVbMV0gPSBwYXJwb3J0X3JlYWRfc3RhdHVzIChwb3J0KSA+PjM7CisJCQorCQkvKiByZWFzc2VtYmxlIHRoZSBieXRlICovCisJCWZvciAoaiA9IDA7IGogPCAyIDsgaisrICkgeworCQkJbmliYmxlW2pdICY9IH44OworCQkJaWYgKChuaWJibGVbal0gJiAweDEwKSA9PSAwKQorCQkJCW5pYmJsZVtqXSB8PSA4OworCQkJbmliYmxlW2pdICY9IDB4ZjsKKwkJfQorCQlieXRlID0gKG5pYmJsZVswXSB8KG5pYmJsZVsxXSA8PCA0KSk7CisJCSpidWYrKyA9IGJ5dGU7CisKKwkJaWYoYnl0ZSA9PSBFT0kpCisJCSAgZW5kc2VlbisrOworCQllbHNlCisJCSAgZW5kc2VlbiA9IDA7CisJfQorCXJldHVybiBpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBFbmRUcmFuc2Zlck1vZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgRW5kVHJhbnNmZXJNb2RlKHN0cnVjdCBwcF9jYW1fZW50cnkgKmNhbSkKK3sKKwlwYXJwb3J0X25lZ290aWF0ZShjYW0tPnBvcnQsIElFRUUxMjg0X01PREVfQ09NUEFUKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRm9yd2FyZFNldHVwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgRm9yd2FyZFNldHVwKHN0cnVjdCBwcF9jYW1fZW50cnkgKmNhbSkKK3sKKwlpbnQgcmV0cnk7CisJCisJLyogVGhlIENQaUEgdXNlcyBFQ1AgcHJvdG9jb2wgZm9yIERvd25sb2FkcyBmcm9tIHRoZSBIb3N0IHRvIHRoZSBjYW1lcmEuIAorCSAqIFRoaXMgd2lsbCBiZSBzb2Z0d2FyZS1lbXVsYXRlZCBpZiBFQ1AgaGFyZHdhcmUgaXMgbm90IHByZXNlbnQKKwkgKi8KKworCS8qIHRoZSB1c3VhbCBjYW1lcmEgbWF4aW11bSByZXNwb25zZSB0aW1lIGlzIDEwbXMsIGJ1dCBhZnRlciByZWNlaXZpbmcKKwkgKiBzb21lIGNvbW1hbmRzLCBpdCBuZWVkcyB1cCB0byA0MG1zLiAoRGF0YSBTaGVldCBwLiAzMikqLworCisJZm9yKHJldHJ5ID0gMDsgcmV0cnkgPCA0OyArK3JldHJ5KSB7CisJCWlmKCFwYXJwb3J0X25lZ290aWF0ZShjYW0tPnBvcnQsIElFRUUxMjg0X01PREVfRUNQKSkgeworCQkJYnJlYWs7CisJCX0KKwkJbWRlbGF5KDEwKTsKKwl9CisJaWYocmV0cnkgPT0gNCkgeworCQlEQkcoIlVuYWJsZSB0byBuZWdvdGlhdGUgSUVFRTEyODQgRUNQIERvd25sb2FkIG1vZGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgUmV2ZXJzZVNldHVwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgUmV2ZXJzZVNldHVwKHN0cnVjdCBwcF9jYW1fZW50cnkgKmNhbSwgaW50IGV4dGVuc2liaWxpdHkpCit7CisJaW50IHJldHJ5OworCWludCB1cGxvYWRfbW9kZSwgbW9kZSA9IElFRUUxMjg0X01PREVfRUNQOworCWludCB0cmFuc2Zlcl9tb2RlID0gRUNQX1RSQU5TRkVSOworCisJaWYgKCEoY2FtLT5wb3J0LT5tb2RlcyAmIFBBUlBPUlRfTU9ERV9FQ1ApICYmCisJICAgICAhKGNhbS0+cG9ydC0+bW9kZXMgJiBQQVJQT1JUX01PREVfVFJJU1RBVEUpKSB7CisJCW1vZGUgPSBJRUVFMTI4NF9NT0RFX05JQkJMRTsKKwkJdHJhbnNmZXJfbW9kZSA9IE5JQkJMRV9UUkFOU0ZFUjsKKwl9CisKKwl1cGxvYWRfbW9kZSA9IG1vZGU7CisJaWYoZXh0ZW5zaWJpbGl0eSkgbW9kZSA9IFVQTE9BRF9GTEFHfHRyYW5zZmVyX21vZGV8SUVFRTEyODRfRVhUX0xJTks7CisKKwkvKiB0aGUgdXN1YWwgY2FtZXJhIG1heGltdW0gcmVzcG9uc2UgdGltZSBpcyAxMG1zLCBidXQgYWZ0ZXIgCisJICogcmVjZWl2aW5nIHNvbWUgY29tbWFuZHMsIGl0IG5lZWRzIHVwIHRvIDQwbXMuICovCisJCQorCWZvcihyZXRyeSA9IDA7IHJldHJ5IDwgNDsgKytyZXRyeSkgeworCQlpZighcGFycG9ydF9uZWdvdGlhdGUoY2FtLT5wb3J0LCBtb2RlKSkgeworCQkJYnJlYWs7CisJCX0KKwkJbWRlbGF5KDEwKTsKKwl9CisJaWYocmV0cnkgPT0gNCkgeworCQlpZihleHRlbnNpYmlsaXR5KQorCQkJREJHKCJVbmFibGUgdG8gbmVnb3RpYXRlIHVwbG9hZCBleHRlbnNpYmlsaXR5IG1vZGVcbiIpOworCQllbHNlCisJCQlEQkcoIlVuYWJsZSB0byBuZWdvdGlhdGUgdXBsb2FkIG1vZGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmKGV4dGVuc2liaWxpdHkpIGNhbS0+cG9ydC0+aWVlZTEyODQubW9kZSA9IHVwbG9hZF9tb2RlOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBXcml0ZVBhY2tldAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFdyaXRlUGFja2V0KHN0cnVjdCBwcF9jYW1fZW50cnkgKmNhbSwgY29uc3QgdTggKnBhY2tldCwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldHZhbD0wOworCWludCBzaXplX3dyaXR0ZW47CisKKwlpZiAocGFja2V0ID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChGb3J3YXJkU2V0dXAoY2FtKSkgeworCQlEQkcoIldyaXRlIGZhaWxlZCBpbiBzZXR1cFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlzaXplX3dyaXR0ZW4gPSBwYXJwb3J0X3dyaXRlKGNhbS0+cG9ydCwgcGFja2V0LCBzaXplKTsKKwlpZihzaXplX3dyaXR0ZW4gIT0gc2l6ZSkgeworCQlEQkcoIldyaXRlIGZhaWxlZCwgd3JvdGUgJWQvJWRcbiIsIHNpemVfd3JpdHRlbiwgc2l6ZSk7CisJCXJldHZhbCA9IC1FSU87CisJfQorCUVuZFRyYW5zZmVyTW9kZShjYW0pOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFJlYWRQYWNrZXQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBSZWFkUGFja2V0KHN0cnVjdCBwcF9jYW1fZW50cnkgKmNhbSwgdTggKnBhY2tldCwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldHZhbD0wOworCisJaWYgKHBhY2tldCA9PSBOVUxMKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoUmV2ZXJzZVNldHVwKGNhbSwgMCkpIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogc3VwcG9ydCBmb3IgQ1BpQSB2YXJpYW50IG5pYmJsZSByZWFkcyAqLworCWlmKGNhbS0+cG9ydC0+aWVlZTEyODQubW9kZSA9PSBJRUVFMTI4NF9NT0RFX05JQkJMRSkgeworCQlpZihjcGlhX3JlYWRfbmliYmxlKGNhbS0+cG9ydCwgcGFja2V0LCBzaXplLCAwKSAhPSBzaXplKSAKKwkJCXJldHZhbCA9IC1FSU87CQkJCisJfSBlbHNlIHsKKwkJaWYocGFycG9ydF9yZWFkKGNhbS0+cG9ydCwgcGFja2V0LCBzaXplKSAhPSBzaXplKSAKKwkJCXJldHZhbCA9IC1FSU87CisJfQorCUVuZFRyYW5zZmVyTW9kZShjYW0pOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIGNwaWFfcHBfc3RyZWFtU3RhcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBjcGlhX3BwX3N0cmVhbVN0YXJ0KHZvaWQgKnByaXZkYXRhKQoreworCXN0cnVjdCBwcF9jYW1fZW50cnkgKmNhbSA9IHByaXZkYXRhOworCURCRygiXG4iKTsKKwljYW0tPnN0cmVhbWluZz0xOworCWNhbS0+aW1hZ2VfcmVhZHk9MDsKKwkvL2lmIChSZXZlcnNlU2V0dXAoY2FtLDEpKSByZXR1cm4gLUVJTzsKKwlpZihjYW0tPnN0cmVhbV9pcnEpIGNwaWFfcGFycG9ydF9lbmFibGVfaXJxKGNhbS0+cG9ydCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIGNwaWFfcHBfc3RyZWFtU3RvcAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGNwaWFfcHBfc3RyZWFtU3RvcCh2b2lkICpwcml2ZGF0YSkKK3sKKwlzdHJ1Y3QgcHBfY2FtX2VudHJ5ICpjYW0gPSBwcml2ZGF0YTsKKworCURCRygiXG4iKTsKKwljYW0tPnN0cmVhbWluZz0wOworCWNwaWFfcGFycG9ydF9kaXNhYmxlX2lycShjYW0tPnBvcnQpOworCS8vRW5kVHJhbnNmZXJNb2RlKGNhbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgY3BpYV9wcF9zdHJlYW1SZWFkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgY3BpYV9wcF9yZWFkKHN0cnVjdCBwYXJwb3J0ICpwb3J0LCB1OCAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBieXRlc19yZWFkOworCisJLyogc3VwcG9ydCBmb3IgQ1BpQSB2YXJpYW50ICJuaWJibGUgc3RyZWFtIiByZWFkcyAqLworCWlmKHBvcnQtPmllZWUxMjg0Lm1vZGUgPT0gSUVFRTEyODRfTU9ERV9OSUJCTEUpCisJCWJ5dGVzX3JlYWQgPSBjcGlhX3JlYWRfbmliYmxlX3N0cmVhbShwb3J0LGJ1ZmZlcixsZW4sMCk7CisJZWxzZSB7CisJCWludCBuZXdfYnl0ZXM7CisJCWZvcihieXRlc19yZWFkPTA7IGJ5dGVzX3JlYWQ8bGVuOyBieXRlc19yZWFkICs9IG5ld19ieXRlcykgeworCQkJbmV3X2J5dGVzID0gcGFycG9ydF9yZWFkKHBvcnQsIGJ1ZmZlcitieXRlc19yZWFkLAorCQkJCQkJIGxlbi1ieXRlc19yZWFkKTsKKwkJCWlmKG5ld19ieXRlcyA8IDApIGJyZWFrOworCQl9CisJfQorCXJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgaW50IGNwaWFfcHBfc3RyZWFtUmVhZCh2b2lkICpwcml2ZGF0YSwgdTggKmJ1ZmZlciwgaW50IG5vYmxvY2spCit7CisJc3RydWN0IHBwX2NhbV9lbnRyeSAqY2FtID0gcHJpdmRhdGE7CisJaW50IHJlYWRfYnl0ZXMgPSAwOworCWludCBpLCBlbmRzZWVuLCBibG9ja19zaXplLCBuZXdfYnl0ZXM7CisKKwlpZihjYW0gPT0gTlVMTCkgeworCQlEQkcoIkludGVybmFsIGRyaXZlciBlcnJvcjogY2FtIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYoYnVmZmVyID09IE5VTEwpIHsKKwkJREJHKCJJbnRlcm5hbCBkcml2ZXIgZXJyb3I6IGJ1ZmZlciBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8vaWYoY2FtLT5zdHJlYW1pbmcpIERCRygiJWQgLyAlZFxuIiwgY2FtLT5pbWFnZV9yZWFkeSwgbm9ibG9jayk7CisJaWYoIGNhbS0+c3RyZWFtX2lycSApIHsKKwkJREJHKCIlZFxuIiwgY2FtLT5pbWFnZV9yZWFkeSk7CisJCWNhbS0+aW1hZ2VfcmVhZHktLTsKKwl9CisJY2FtLT5pbWFnZV9jb21wbGV0ZT0wOworCWlmICgwLypjYW0tPnN0cmVhbWluZyovKSB7CisJCWlmKCFjYW0tPmltYWdlX3JlYWR5KSB7CisJCQlpZihub2Jsb2NrKSByZXR1cm4gLUVXT1VMREJMT0NLOworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2FtLT53cV9zdHJlYW0pOworCQkJaWYoIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICkgcmV0dXJuIC1FSU5UUjsKKwkJCURCRygiJWRcbiIsIGNhbS0+aW1hZ2VfcmVhZHkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKFJldmVyc2VTZXR1cChjYW0sIDEpKSB7CisJCQlEQkcoInVuYWJsZSB0byBSZXZlcnNlU2V0dXBcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJZW5kc2VlbiA9IDA7CisJYmxvY2tfc2l6ZSA9IFBBUlBPUlRfQ0hVTktfU0laRTsKKwl3aGlsZSggIWNhbS0+aW1hZ2VfY29tcGxldGUgKSB7CisJCWNvbmRfcmVzY2hlZCgpOworCQkKKwkJbmV3X2J5dGVzID0gY3BpYV9wcF9yZWFkKGNhbS0+cG9ydCwgYnVmZmVyLCBibG9ja19zaXplICk7CisJCWlmKCBuZXdfYnl0ZXMgPD0gMCApIHsKKwkJCWJyZWFrOworCQl9CisJCWk9LTE7CisJCXdoaWxlKCsraTxuZXdfYnl0ZXMgJiYgZW5kc2Vlbjw0KSB7CisJICAgICAgICAJaWYoKmJ1ZmZlcj09RU9JKSB7CisJICAgICAgICAgICAgICAgIAllbmRzZWVuKys7CisJICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJICAgICAgICAgICAgICAgIAllbmRzZWVuPTA7CisJICAgICAgICAgICAgICAgIH0KKwkJCWJ1ZmZlcisrOworCQl9CisJCXJlYWRfYnl0ZXMgKz0gaTsKKwkJaWYoIGVuZHNlZW49PTQgKSB7CisJCQljYW0tPmltYWdlX2NvbXBsZXRlPTE7CisJCQlicmVhazsKKwkJfQorCQlpZiggQ1BJQV9NQVhfSU1BR0VfU0laRS1yZWFkX2J5dGVzIDw9IFBBUlBPUlRfQ0hVTktfU0laRSApIHsKKwkJCWJsb2NrX3NpemU9Q1BJQV9NQVhfSU1BR0VfU0laRS1yZWFkX2J5dGVzOworCQl9CisJfQorCUVuZFRyYW5zZmVyTW9kZShjYW0pOworCXJldHVybiBjYW0tPmltYWdlX2NvbXBsZXRlID8gcmVhZF9ieXRlcyA6IC1FSU87Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBjcGlhX3BwX3RyYW5zZmVyQ21kCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgY3BpYV9wcF90cmFuc2ZlckNtZCh2b2lkICpwcml2ZGF0YSwgdTggKmNvbW1hbmQsIHU4ICpkYXRhKQoreworCWludCBlcnI7CisJaW50IHJldHZhbD0wOworCWludCBkYXRhYnl0ZXM7CisJc3RydWN0IHBwX2NhbV9lbnRyeSAqY2FtID0gcHJpdmRhdGE7CisKKwlpZihjYW0gPT0gTlVMTCkgeworCQlEQkcoIkludGVybmFsIGRyaXZlciBlcnJvcjogY2FtIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYoY29tbWFuZCA9PSBOVUxMKSB7CisJCURCRygiSW50ZXJuYWwgZHJpdmVyIGVycm9yOiBjb21tYW5kIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGF0YWJ5dGVzID0gKCgoaW50KWNvbW1hbmRbN10pPDw4KSB8IGNvbW1hbmRbNl07CisJaWYgKChlcnIgPSBXcml0ZVBhY2tldChjYW0sIGNvbW1hbmQsIFBBQ0tFVF9MRU5HVEgpKSA8IDApIHsKKwkJREJHKCJFcnJvciB3cml0aW5nIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZihjb21tYW5kWzBdID09IERBVEFfSU4pIHsKKwkJdTggYnVmZmVyWzhdOworCQlpZihkYXRhID09IE5VTEwpIHsKKwkJCURCRygiSW50ZXJuYWwgZHJpdmVyIGVycm9yOiBkYXRhIGlzIE5VTExcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYoKGVyciA9IFJlYWRQYWNrZXQoY2FtLCBidWZmZXIsIDgpKSA8IDApIHsKKwkJCURCRygiRXJyb3IgcmVhZGluZyBjb21tYW5kIHJlc3VsdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisJCX0KKwkJbWVtY3B5KGRhdGEsIGJ1ZmZlciwgZGF0YWJ5dGVzKTsKKwl9IGVsc2UgaWYoY29tbWFuZFswXSA9PSBEQVRBX09VVCkgeworCQlpZihkYXRhYnl0ZXMgPiAwKSB7CisJCQlpZihkYXRhID09IE5VTEwpIHsKKwkJCQlEQkcoIkludGVybmFsIGRyaXZlciBlcnJvcjogZGF0YSBpcyBOVUxMXG4iKTsKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQlpZigoZXJyPVdyaXRlUGFja2V0KGNhbSwgZGF0YSwgZGF0YWJ5dGVzKSkgPCAwKXsKKwkJCQkJREJHKCJFcnJvciB3cml0aW5nIGNvbW1hbmQgZGF0YVxuIik7CisJCQkJCXJldHVybiBlcnI7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJREJHKCJVbmV4cGVjdGVkIGZpcnN0IGJ5dGUgb2YgY29tbWFuZDogJXhcbiIsIGNvbW1hbmRbMF0pOworCQlyZXR2YWwgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBjcGlhX3BwX29wZW4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBjcGlhX3BwX29wZW4odm9pZCAqcHJpdmRhdGEpCit7CisJc3RydWN0IHBwX2NhbV9lbnRyeSAqY2FtID0gKHN0cnVjdCBwcF9jYW1fZW50cnkgKilwcml2ZGF0YTsKKwkKKwlpZiAoY2FtID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCQorCWlmKGNhbS0+b3Blbl9jb3VudCA9PSAwKSB7CisJCWlmIChwYXJwb3J0X2NsYWltKGNhbS0+cGRldikpIHsKKwkJCURCRygiZmFpbGVkIHRvIGNsYWltIHRoZSBwb3J0XG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJcGFycG9ydF9uZWdvdGlhdGUoY2FtLT5wb3J0LCBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJCXBhcnBvcnRfZGF0YV9mb3J3YXJkKGNhbS0+cG9ydCk7CisJCXBhcnBvcnRfd3JpdGVfY29udHJvbChjYW0tPnBvcnQsIFBBUlBPUlRfQ09OVFJPTF9TRUxFQ1QpOworCQl1ZGVsYXkoNTApOworCQlwYXJwb3J0X3dyaXRlX2NvbnRyb2woY2FtLT5wb3J0LAorCQkgICAgICAgICAgICAgICAgICAgICAgUEFSUE9SVF9DT05UUk9MX1NFTEVDVAorCQkgICAgICAgICAgICAgICAgICAgICAgfCBQQVJQT1JUX0NPTlRST0xfSU5JVCk7CisJfQorCQorCSsrY2FtLT5vcGVuX2NvdW50OworCQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBjcGlhX3BwX3JlZ2lzdGVyQ2FsbGJhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBjcGlhX3BwX3JlZ2lzdGVyQ2FsbGJhY2sodm9pZCAqcHJpdmRhdGEsIHZvaWQgKCpjYikodm9pZCAqY2JkYXRhKSwgdm9pZCAqY2JkYXRhKQoreworCXN0cnVjdCBwcF9jYW1fZW50cnkgKmNhbSA9IHByaXZkYXRhOworCWludCByZXR2YWwgPSAwOworCQorCWlmKGNhbS0+cG9ydC0+aXJxICE9IFBBUlBPUlRfSVJRX05PTkUpIHsKKwkJSU5JVF9XT1JLKCZjYW0tPmNiX3Rhc2ssIGNiLCBjYmRhdGEpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IC0xOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBjcGlhX3BwX2Nsb3NlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgY3BpYV9wcF9jbG9zZSh2b2lkICpwcml2ZGF0YSkKK3sKKwlzdHJ1Y3QgcHBfY2FtX2VudHJ5ICpjYW0gPSBwcml2ZGF0YTsKKwlpZiAoLS1jYW0tPm9wZW5fY291bnQgPT0gMCkgeworCQlwYXJwb3J0X3JlbGVhc2UoY2FtLT5wZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIGNwaWFfcHBfcmVnaXN0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBjcGlhX3BwX3JlZ2lzdGVyKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCXN0cnVjdCBwYXJkZXZpY2UgKnBkZXYgPSBOVUxMOworCXN0cnVjdCBwcF9jYW1fZW50cnkgKmNhbTsKKwlzdHJ1Y3QgY2FtX2RhdGEgKmNwaWE7CisKKwlpZiAoIShwb3J0LT5tb2RlcyAmIFBBUlBPUlRfTU9ERV9QQ1NQUCkpIHsKKwkJTE9HKCJwb3J0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgQ1BpQSBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWNhbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcF9jYW1fZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FtID09IE5VTEwpIHsKKwkJTE9HKCJmYWlsZWQgdG8gYWxsb2NhdGUgY2FtZXJhIHN0cnVjdHVyZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2FtLDAsc2l6ZW9mKHN0cnVjdCBwcF9jYW1fZW50cnkpKTsKKwkKKwlwZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgImNwaWFfcHAiLCBOVUxMLCBOVUxMLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBjYW0pOworCisJaWYgKCFwZGV2KSB7CisJCUxPRygiZmFpbGVkIHRvIHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlXG4iKTsKKwkJa2ZyZWUoY2FtKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwljYW0tPnBkZXYgPSBwZGV2OworCWNhbS0+cG9ydCA9IHBvcnQ7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FtLT53cV9zdHJlYW0pOworCisJY2FtLT5zdHJlYW1pbmcgPSAwOworCWNhbS0+c3RyZWFtX2lycSA9IDA7CisKKwlpZigoY3BpYSA9IGNwaWFfcmVnaXN0ZXJfY2FtZXJhKCZjcGlhX3BwX29wcywgY2FtKSkgPT0gTlVMTCkgeworCQlMT0coImZhaWxlZCB0byBjcGlhX3JlZ2lzdGVyX2NhbWVyYVxuIik7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocGRldik7CisJCWtmcmVlKGNhbSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCXNwaW5fbG9jayggJmNhbV9saXN0X2xvY2tfcHAgKTsKKwlsaXN0X2FkZCggJmNwaWEtPmNhbV9kYXRhX2xpc3QsICZjYW1fbGlzdCApOworCXNwaW5fdW5sb2NrKCAmY2FtX2xpc3RfbG9ja19wcCApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNwaWFfcHBfZGV0YWNoIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGNhbV9kYXRhICpjcGlhID0gTlVMTDsKKwlzdHJ1Y3QgcHBfY2FtX2VudHJ5ICpjYW07CisKKwlzcGluX2xvY2soICZjYW1fbGlzdF9sb2NrX3BwICk7CisJbGlzdF9mb3JfZWFjaCAodG1wLCAmY2FtX2xpc3QpIHsKKwkJY3BpYSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2FtX2RhdGEsIGNhbV9kYXRhX2xpc3QpOworCQljYW0gPSAoc3RydWN0IHBwX2NhbV9lbnRyeSAqKSBjcGlhLT5sb3dsZXZlbF9kYXRhOworCQlpZiAoY2FtICYmIGNhbS0+cG9ydC0+bnVtYmVyID09IHBvcnQtPm51bWJlcikgeworCQkJbGlzdF9kZWwoJmNwaWEtPmNhbV9kYXRhX2xpc3QpOworCQkJYnJlYWs7CisJCX0KKwkJY3BpYSA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrKCAmY2FtX2xpc3RfbG9ja19wcCApOwkJCQorCisJaWYgKCFjcGlhKSB7CisJCURCRygiY3BpYV9wcF9kZXRhY2ggZmFpbGVkIHRvIGZpbmQgY2FtX2RhdGEgaW4gY2FtX2xpc3RcbiIpOworCQlyZXR1cm47CisJfQorCQorCWNhbSA9IChzdHJ1Y3QgcHBfY2FtX2VudHJ5ICopIGNwaWEtPmxvd2xldmVsX2RhdGE7CQorCWNwaWFfdW5yZWdpc3Rlcl9jYW1lcmEoY3BpYSk7CisJaWYoY2FtLT5vcGVuX2NvdW50ID4gMCkgCisJCWNwaWFfcHBfY2xvc2UoY2FtKTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGNhbS0+cGRldik7CisJY3BpYS0+bG93bGV2ZWxfZGF0YSA9IE5VTEw7CQorCWtmcmVlKGNhbSk7Cit9CisKK3N0YXRpYyB2b2lkIGNwaWFfcHBfYXR0YWNoIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXN3aXRjaCAocGFycG9ydF9uclswXSkKKwl7CisJY2FzZSBQUENQSUFfUEFSUE9SVF9VTlNQRUM6CisJY2FzZSBQUENQSUFfUEFSUE9SVF9BVVRPOgorCQlpZiAocG9ydC0+cHJvYmVfaW5mb1swXS5jbGFzcyAhPSBQQVJQT1JUX0NMQVNTX01FRElBIHx8CisJCSAgICBwb3J0LT5wcm9iZV9pbmZvWzBdLmNtZHNldCA9PSBOVUxMIHx8CisJCSAgICBzdHJuY21wKHBvcnQtPnByb2JlX2luZm9bMF0uY21kc2V0LCAiQ1BJQV8xIiwgNikgIT0gMCkKKwkJCXJldHVybjsKKworCQljcGlhX3BwX3JlZ2lzdGVyKHBvcnQpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZm9yIChpID0gMDsgaSA8IFBBUlBPUlRfTUFYOyArK2kpIHsKKwkJCWlmIChwb3J0LT5udW1iZXIgPT0gcGFycG9ydF9ucltpXSkgeworCQkJCWNwaWFfcHBfcmVnaXN0ZXIocG9ydCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIGNwaWFfcHBfZHJpdmVyID0geworCS5uYW1lID0gImNwaWFfcHAiLAorCS5hdHRhY2ggPSBjcGlhX3BwX2F0dGFjaCwKKwkuZGV0YWNoID0gY3BpYV9wcF9kZXRhY2gsCit9OworCitpbnQgY3BpYV9wcF9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiVkLiVkLiVkXG4iLEFCT1VULCAKKwkgICAgICAgQ1BJQV9QUF9NQUpfVkVSLENQSUFfUFBfTUlOX1ZFUixDUElBX1BQX1BBVENIX1ZFUik7CisKKwlpZihwYXJwb3J0X25yWzBdID09IFBQQ1BJQV9QQVJQT1JUX09GRikgeworCQlwcmludGsoIiAgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJCisJc3Bpbl9sb2NrX2luaXQoICZjYW1fbGlzdF9sb2NrX3BwICk7CisKKwlpZiAocGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIgKCZjcGlhX3BwX2RyaXZlcikpIHsKKwkJTE9HICgidW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggcGFycG9ydFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQoraW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaWYgKHBhcnBvcnRbMF0pIHsKKwkJLyogVGhlIHVzZXIgZ2F2ZSBzb21lIHBhcmFtZXRlcnMuICBMZXQncyBzZWUgd2hhdCB0aGV5IHdlcmUuICovCisJCWlmICghc3RybmNtcChwYXJwb3J0WzBdLCAiYXV0byIsIDQpKSB7CisJCQlwYXJwb3J0X25yWzBdID0gUFBDUElBX1BBUlBPUlRfQVVUTzsKKwkJfSBlbHNlIHsKKwkJCWludCBuOworCQkJZm9yIChuID0gMDsgbiA8IFBBUlBPUlRfTUFYICYmIHBhcnBvcnRbbl07IG4rKykgeworCQkJCWlmICghc3RybmNtcChwYXJwb3J0W25dLCAibm9uZSIsIDQpKSB7CisJCQkJCXBhcnBvcnRfbnJbbl0gPSBQUENQSUFfUEFSUE9SVF9OT05FOworCQkJCX0gZWxzZSB7CisJCQkJCWNoYXIgKmVwOworCQkJCQl1bnNpZ25lZCBsb25nIHIgPSBzaW1wbGVfc3RydG91bChwYXJwb3J0W25dLCAmZXAsIDApOworCQkJCQlpZiAoZXAgIT0gcGFycG9ydFtuXSkgeworCQkJCQkJcGFycG9ydF9ucltuXSA9IHI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlMT0coImJhZCBwb3J0IHNwZWNpZmllciBgJXMnXG4iLCBwYXJwb3J0W25dKTsKKwkJCQkJCXJldHVybiAtRU5PREVWOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBjcGlhX3BwX2luaXQoKTsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIgKCZjcGlhX3BwX2RyaXZlcik7CisJcmV0dXJuOworfQorCisjZWxzZSAvKiAhTU9EVUxFICovCisKK3N0YXRpYyBpbnQgX19pbml0IGNwaWFfcHBfc2V0dXAoY2hhciAqc3RyKQoreworCWlmICghc3RybmNtcChzdHIsICJwYXJwb3J0IiwgNykpIHsKKwkJaW50IG4gPSBzaW1wbGVfc3RydG91bChzdHIgKyA3LCBOVUxMLCAxMCk7CisJCWlmIChwYXJwb3J0X3B0ciA8IFBBUlBPUlRfTUFYKSB7CisJCQlwYXJwb3J0X25yW3BhcnBvcnRfcHRyKytdID0gbjsKKwkJfSBlbHNlIHsKKwkJCUxPRygidG9vIG1hbnkgcG9ydHMsICVzIGlnbm9yZWQuXG4iLCBzdHIpOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgImF1dG8iKSkgeworCQlwYXJwb3J0X25yWzBdID0gUFBDUElBX1BBUlBPUlRfQVVUTzsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibm9uZSIpKSB7CisJCXBhcnBvcnRfbnJbcGFycG9ydF9wdHIrK10gPSBQUENQSUFfUEFSUE9SVF9OT05FOworCX0KKworCXJldHVybiAwOworfQorCitfX3NldHVwKCJjcGlhX3BwPSIsIGNwaWFfcHBfc2V0dXApOworCisjZW5kaWYgLyogIU1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZGE0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfdXNiLmMKQEAgLTAsMCArMSw2NjIgQEAKKy8qCisgKiBjcGlhX3VzYiBDUGlBIFVTQiBkcml2ZXIKKyAqCisgKiBTdXBwb3J0cyBDUGlBIGJhc2VkIHBhcmFsbGVsIHBvcnQgVmlkZW8gQ2FtZXJhJ3MuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICAgICAgICBKb2NoZW4gU2NoYXJybGFjaCA8Sm9jaGVuLlNjaGFycmxhY2hAc2Nod2FiZW4uZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgIEpvaGFubmVzIEVyZGZlbHQgPGpvaGFubmVzQGVyZGZlbHQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIGRlZmluZSBfQ1BJQV9ERUJVR18gZm9yIHZlcmJvc2UgZGVidWcgb3V0cHV0IChzZWUgY3BpYS5oKSAqLworLyogI2RlZmluZSBfQ1BJQV9ERUJVR18gIDEgKi8gIAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgImNwaWEuaCIKKworI2RlZmluZSBVU0JfUkVRX0NQSUFfR1JBQl9GUkFNRQkJCTB4QzEKKyNkZWZpbmUgVVNCX1JFUV9DUElBX1VQTE9BRF9GUkFNRQkJMHhDMgorI2RlZmluZSAgV0FJVF9GT1JfTkVYVF9GUkFNRQkJCTAKKyNkZWZpbmUgIEZPUkNFX0ZSQU1FX1VQTE9BRAkJCTEKKworI2RlZmluZSBGUkFNRVNfUEVSX0RFU0MJCTEwCisjZGVmaW5lIEZSQU1FX1NJWkVfUEVSX0RFU0MJOTYwCS8qIFNob3VsZG4ndCBiZSBoYXJkY29kZWQgKi8KKyNkZWZpbmUgQ1BJQV9OVU1TQlVGCQkyCisjZGVmaW5lIFNUUkVBTV9CVUZfU0laRQkJKFBBR0VfU0laRSAqIDQpCisjZGVmaW5lIFNDUkFUQ0hfQlVGX1NJWkUJKFNUUkVBTV9CVUZfU0laRSAqIDIpCisKK3N0cnVjdCBjcGlhX3NidWYgeworCWNoYXIgKmRhdGE7CisJc3RydWN0IHVyYiAqdXJiOworfTsKKworI2RlZmluZSBGUkFNRUJVRl9MRU4gKENQSUFfTUFYX0ZSQU1FX1NJWkUrMTAwKQorZW51bSBmcmFtZWJ1Zl9zdGF0dXMgeworCUZSQU1FX0VNUFRZLAorCUZSQU1FX1JFQURJTkcsCisJRlJBTUVfUkVBRFksCisJRlJBTUVfRVJST1IsCit9OworCitzdHJ1Y3QgZnJhbWVidWYgeworCWludCBsZW5ndGg7CisJZW51bSBmcmFtZWJ1Zl9zdGF0dXMgc3RhdHVzOworCXU4IGRhdGFbRlJBTUVCVUZfTEVOXTsKKwlzdHJ1Y3QgZnJhbWVidWYgKm5leHQ7Cit9OworCitzdHJ1Y3QgdXNiX2NwaWEgeworCS8qIERldmljZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OworCisJdW5zaWduZWQgY2hhciBpZmFjZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cV9zdHJlYW07CisKKwlpbnQgY3Vyc2J1ZjsJCS8qIEN1cnJlbnQgcmVjZWl2aW5nIHNidWYgKi8KKwlzdHJ1Y3QgY3BpYV9zYnVmIHNidWZbQ1BJQV9OVU1TQlVGXTsJCS8qIERvdWJsZSBidWZmZXJpbmcgKi8KKworCWludCBzdHJlYW1pbmc7CisJaW50IG9wZW47CisJaW50IHByZXNlbnQ7CisJc3RydWN0IGZyYW1lYnVmICpidWZmZXJzWzNdOworCXN0cnVjdCBmcmFtZWJ1ZiAqY3VyYnVmZiwgKndvcmtidWZmOworfTsKKworc3RhdGljIGludCBjcGlhX3VzYl9vcGVuKHZvaWQgKnByaXZkYXRhKTsKK3N0YXRpYyBpbnQgY3BpYV91c2JfcmVnaXN0ZXJDYWxsYmFjayh2b2lkICpwcml2ZGF0YSwgdm9pZCAoKmNiKSAodm9pZCAqY2JkYXRhKSwKKwkJCSAgICAgICAgICAgICB2b2lkICpjYmRhdGEpOworc3RhdGljIGludCBjcGlhX3VzYl90cmFuc2ZlckNtZCh2b2lkICpwcml2ZGF0YSwgdTggKmNvbW1hbmQsIHU4ICpkYXRhKTsKK3N0YXRpYyBpbnQgY3BpYV91c2Jfc3RyZWFtU3RhcnQodm9pZCAqcHJpdmRhdGEpOworc3RhdGljIGludCBjcGlhX3VzYl9zdHJlYW1TdG9wKHZvaWQgKnByaXZkYXRhKTsKK3N0YXRpYyBpbnQgY3BpYV91c2Jfc3RyZWFtUmVhZCh2b2lkICpwcml2ZGF0YSwgdTggKmZyYW1lLCBpbnQgbm9ibG9jayk7CitzdGF0aWMgaW50IGNwaWFfdXNiX2Nsb3NlKHZvaWQgKnByaXZkYXRhKTsKKworI2RlZmluZSBBQk9VVCAiVVNCIGRyaXZlciBmb3IgVmlzaW9uIENQaUEgYmFzZWQgY2FtZXJhcyIKKworc3RhdGljIHN0cnVjdCBjcGlhX2NhbWVyYV9vcHMgY3BpYV91c2Jfb3BzID0geworCWNwaWFfdXNiX29wZW4sCisJY3BpYV91c2JfcmVnaXN0ZXJDYWxsYmFjaywKKwljcGlhX3VzYl90cmFuc2ZlckNtZCwKKwljcGlhX3VzYl9zdHJlYW1TdGFydCwKKwljcGlhX3VzYl9zdHJlYW1TdG9wLAorCWNwaWFfdXNiX3N0cmVhbVJlYWQsCisJY3BpYV91c2JfY2xvc2UsCisJMCwKKwlUSElTX01PRFVMRQorfTsKKworc3RhdGljIExJU1RfSEVBRChjYW1fbGlzdCk7CitzdGF0aWMgc3BpbmxvY2tfdCBjYW1fbGlzdF9sb2NrX3VzYjsKKworc3RhdGljIHZvaWQgY3BpYV91c2JfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwljaGFyICpjZGF0YTsKKwlzdHJ1Y3QgdXNiX2NwaWEgKnVjcGlhOworCisJaWYgKCF1cmIgfHwgIXVyYi0+Y29udGV4dCkKKwkJcmV0dXJuOworCisJdWNwaWEgPSAoc3RydWN0IHVzYl9jcGlhICopIHVyYi0+Y29udGV4dDsKKworCWlmICghdWNwaWEtPmRldiB8fCAhdWNwaWEtPnN0cmVhbWluZyB8fCAhdWNwaWEtPnByZXNlbnQgfHwgIXVjcGlhLT5vcGVuKQorCQlyZXR1cm47CisKKwlpZiAodWNwaWEtPndvcmtidWZmLT5zdGF0dXMgPT0gRlJBTUVfRU1QVFkpIHsKKwkJdWNwaWEtPndvcmtidWZmLT5zdGF0dXMgPSBGUkFNRV9SRUFESU5HOworCQl1Y3BpYS0+d29ya2J1ZmYtPmxlbmd0aCA9IDA7CisJfQorIAkJICAKKwlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJCWludCBuID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOworCQlpbnQgc3QgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKKworCQljZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQ7CisKKwkJaWYgKHN0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImNwaWEgZGF0YSBlcnJvcjogWyVkXSBsZW49JWQsIHN0YXR1cz0lWFxuIiwgaSwgbiwgc3QpOworCisJCWlmIChGUkFNRUJVRl9MRU4gPCB1Y3BpYS0+d29ya2J1ZmYtPmxlbmd0aCArIG4pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJjcGlhOiBzY3JhdGNoIGJ1ZiBvdmVyZmxvdyFzY3JfbGVuOiAlZCwgbjogJWRcbiIsIHVjcGlhLT53b3JrYnVmZi0+bGVuZ3RoLCBuKTsKKwkJCXJldHVybjsKKwkJfQorCSAgICAKKwkJaWYgKG4pIHsKKwkJCWlmICgodWNwaWEtPndvcmtidWZmLT5sZW5ndGggPiAwKSB8fCAKKwkJCSAgICAoMHgxOSA9PSBjZGF0YVswXSAmJiAweDY4ID09IGNkYXRhWzFdKSkgeworCQkJCW1lbWNweSh1Y3BpYS0+d29ya2J1ZmYtPmRhdGEgKyB1Y3BpYS0+d29ya2J1ZmYtPmxlbmd0aCwgY2RhdGEsIG4pOworCQkJCXVjcGlhLT53b3JrYnVmZi0+bGVuZ3RoICs9IG47CisJCQl9IGVsc2UKKwkJCQlEQkcoIklnbm9yaW5nIHBhY2tldCFcbiIpOworCQl9IGVsc2UgeworCQkJaWYgKHVjcGlhLT53b3JrYnVmZi0+bGVuZ3RoID4gNCAmJgorCQkJICAgIDB4ZmYgPT0gdWNwaWEtPndvcmtidWZmLT5kYXRhW3VjcGlhLT53b3JrYnVmZi0+bGVuZ3RoLTFdICYmCisJCQkgICAgMHhmZiA9PSB1Y3BpYS0+d29ya2J1ZmYtPmRhdGFbdWNwaWEtPndvcmtidWZmLT5sZW5ndGgtMl0gJiYKKwkJCSAgICAweGZmID09IHVjcGlhLT53b3JrYnVmZi0+ZGF0YVt1Y3BpYS0+d29ya2J1ZmYtPmxlbmd0aC0zXSAmJgorCQkJICAgIDB4ZmYgPT0gdWNwaWEtPndvcmtidWZmLT5kYXRhW3VjcGlhLT53b3JrYnVmZi0+bGVuZ3RoLTRdKSB7CisJCQkJdWNwaWEtPndvcmtidWZmLT5zdGF0dXMgPSBGUkFNRV9SRUFEWTsKKwkJCQl1Y3BpYS0+Y3VyYnVmZiA9IHVjcGlhLT53b3JrYnVmZjsKKwkJCQl1Y3BpYS0+d29ya2J1ZmYgPSB1Y3BpYS0+d29ya2J1ZmYtPm5leHQ7CisJCQkJdWNwaWEtPndvcmtidWZmLT5zdGF0dXMgPSBGUkFNRV9FTVBUWTsKKwkJCQl1Y3BpYS0+d29ya2J1ZmYtPmxlbmd0aCA9IDA7CisJCSAgCisJCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnVjcGlhLT53cV9zdHJlYW0pKQorCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnVjcGlhLT53cV9zdHJlYW0pOworCQkJfQorCQl9CisJfQorCisJLyogcmVzdWJtaXQgKi8KKwl1cmItPmRldiA9IHVjcGlhLT5kZXY7CisJaWYgKChpID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdXNiX3N1Ym1pdF91cmIgcmV0ICVkXG4iLCBfX0ZVTkNUSU9OX18sICBpKTsKK30KKworc3RhdGljIGludCBjcGlhX3VzYl9vcGVuKHZvaWQgKnByaXZkYXRhKQoreworCXN0cnVjdCB1c2JfY3BpYSAqdWNwaWEgPSAoc3RydWN0IHVzYl9jcGlhICopIHByaXZkYXRhOworCXN0cnVjdCB1cmIgKnVyYjsKKwlpbnQgcmV0LCByZXR2YWwgPSAwLCBmeCwgZXJyOworICAKKwlpZiAoIXVjcGlhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXVjcGlhLT5zYnVmWzBdLmRhdGEgPSBrbWFsbG9jKEZSQU1FU19QRVJfREVTQyAqIEZSQU1FX1NJWkVfUEVSX0RFU0MsIEdGUF9LRVJORUwpOworCWlmICghdWNwaWEtPnNidWZbMF0uZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl1Y3BpYS0+c2J1ZlsxXS5kYXRhID0ga21hbGxvYyhGUkFNRVNfUEVSX0RFU0MgKiBGUkFNRV9TSVpFX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVjcGlhLT5zYnVmWzFdLmRhdGEpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcl8wOworCX0KKwkKKwlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZSh1Y3BpYS0+ZGV2LCB1Y3BpYS0+aWZhY2UsIDMpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3BpYV91c2Jfb3BlbjogdXNiX3NldF9pbnRlcmZhY2UgZXJyb3IgKHJldCA9ICVkKVxuIiwgcmV0KTsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIGVycm9yXzE7CisJfQorCisJdWNwaWEtPmJ1ZmZlcnNbMF0tPnN0YXR1cyA9IEZSQU1FX0VNUFRZOworCXVjcGlhLT5idWZmZXJzWzBdLT5sZW5ndGggPSAwOworCXVjcGlhLT5idWZmZXJzWzFdLT5zdGF0dXMgPSBGUkFNRV9FTVBUWTsKKwl1Y3BpYS0+YnVmZmVyc1sxXS0+bGVuZ3RoID0gMDsKKwl1Y3BpYS0+YnVmZmVyc1syXS0+c3RhdHVzID0gRlJBTUVfRU1QVFk7CisJdWNwaWEtPmJ1ZmZlcnNbMl0tPmxlbmd0aCA9IDA7CisJdWNwaWEtPmN1cmJ1ZmYgPSB1Y3BpYS0+YnVmZmVyc1swXTsKKwl1Y3BpYS0+d29ya2J1ZmYgPSB1Y3BpYS0+YnVmZmVyc1sxXTsKKworCS8qIFdlIGRvdWJsZSBidWZmZXIgdGhlIElzbyBsaXN0cywgYW5kIGFsc28ga25vdyB0aGUgcG9sbGluZworCSAqIGludGVydmFsIGlzIGV2ZXJ5IGZyYW1lICgxID09ICgxIDw8IChiSW50ZXJ2YWwgLTEpKSkuCisJICovCisJdXJiID0gdXNiX2FsbG9jX3VyYihGUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOworCWlmICghdXJiKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3BpYV9pbml0X2lzb2M6IHVzYl9hbGxvY191cmIgMFxuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfMTsKKwl9CisKKwl1Y3BpYS0+c2J1ZlswXS51cmIgPSB1cmI7CisJdXJiLT5kZXYgPSB1Y3BpYS0+ZGV2OworCXVyYi0+Y29udGV4dCA9IHVjcGlhOworCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZSh1Y3BpYS0+ZGV2LCAxKTsKKwl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdWNwaWEtPnNidWZbMF0uZGF0YTsKKwl1cmItPmNvbXBsZXRlID0gY3BpYV91c2JfY29tcGxldGU7CisJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IEZSQU1FU19QRVJfREVTQzsKKwl1cmItPmludGVydmFsID0gMTsKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBGUkFNRV9TSVpFX1BFUl9ERVNDICogRlJBTUVTX1BFUl9ERVNDOworCWZvciAoZnggPSAwOyBmeCA8IEZSQU1FU19QRVJfREVTQzsgZngrKykgeworCQl1cmItPmlzb19mcmFtZV9kZXNjW2Z4XS5vZmZzZXQgPSBGUkFNRV9TSVpFX1BFUl9ERVNDICogZng7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbZnhdLmxlbmd0aCA9IEZSQU1FX1NJWkVfUEVSX0RFU0M7CisJfQorCisJdXJiID0gdXNiX2FsbG9jX3VyYihGUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOworCWlmICghdXJiKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3BpYV9pbml0X2lzb2M6IHVzYl9hbGxvY191cmIgMVxuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfdXJiMDsKKwl9CisKKwl1Y3BpYS0+c2J1ZlsxXS51cmIgPSB1cmI7CisJdXJiLT5kZXYgPSB1Y3BpYS0+ZGV2OworCXVyYi0+Y29udGV4dCA9IHVjcGlhOworCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZSh1Y3BpYS0+ZGV2LCAxKTsKKwl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdWNwaWEtPnNidWZbMV0uZGF0YTsKKwl1cmItPmNvbXBsZXRlID0gY3BpYV91c2JfY29tcGxldGU7CisJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IEZSQU1FU19QRVJfREVTQzsKKwl1cmItPmludGVydmFsID0gMTsKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBGUkFNRV9TSVpFX1BFUl9ERVNDICogRlJBTUVTX1BFUl9ERVNDOworCWZvciAoZnggPSAwOyBmeCA8IEZSQU1FU19QRVJfREVTQzsgZngrKykgeworCQl1cmItPmlzb19mcmFtZV9kZXNjW2Z4XS5vZmZzZXQgPSBGUkFNRV9TSVpFX1BFUl9ERVNDICogZng7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbZnhdLmxlbmd0aCA9IEZSQU1FX1NJWkVfUEVSX0RFU0M7CisJfQorCisJLyogcXVldWUgdGhlIElTTyB1cmJzLCBhbmQgcmVzdWJtaXQgaW4gdGhlIGNvbXBsZXRpb24gaGFuZGxlciAqLworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVjcGlhLT5zYnVmWzBdLnVyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImNwaWFfaW5pdF9pc29jOiB1c2Jfc3VibWl0X3VyYiAwIHJldCAlZFxuIiwKKwkJCWVycik7CisJCWdvdG8gZXJyb3JfdXJiMTsKKwl9CisJZXJyID0gdXNiX3N1Ym1pdF91cmIodWNwaWEtPnNidWZbMV0udXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3BpYV9pbml0X2lzb2M6IHVzYl9zdWJtaXRfdXJiIDEgcmV0ICVkXG4iLAorCQkJZXJyKTsKKwkJZ290byBlcnJvcl91cmIxOworCX0KKworCXVjcGlhLT5zdHJlYW1pbmcgPSAxOworCXVjcGlhLT5vcGVuID0gMTsKKworCXJldHVybiAwOworCitlcnJvcl91cmIxOgkJLyogZnJlZSB1cmIgMSAqLworCXVzYl9mcmVlX3VyYih1Y3BpYS0+c2J1ZlsxXS51cmIpOworCXVjcGlhLT5zYnVmWzFdLnVyYiA9IE5VTEw7CitlcnJvcl91cmIwOgkJLyogZnJlZSB1cmIgMCAqLworCXVzYl9mcmVlX3VyYih1Y3BpYS0+c2J1ZlswXS51cmIpOworCXVjcGlhLT5zYnVmWzBdLnVyYiA9IE5VTEw7CitlcnJvcl8xOgorCWtmcmVlICh1Y3BpYS0+c2J1ZlsxXS5kYXRhKTsKKwl1Y3BpYS0+c2J1ZlsxXS5kYXRhID0gTlVMTDsKK2Vycm9yXzA6CisJa2ZyZWUgKHVjcGlhLT5zYnVmWzBdLmRhdGEpOworCXVjcGlhLT5zYnVmWzBdLmRhdGEgPSBOVUxMOworCQorCXJldHVybiByZXR2YWw7Cit9CisKKy8vCisvLyBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKy8vCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFdyaXRlUGFja2V0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgV3JpdGVQYWNrZXQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGNvbnN0IHU4ICpwYWNrZXQsIHU4ICpidWYsIHNpemVfdCBzaXplKQoreworCWlmICghcGFja2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJIHBhY2tldFsxXSArIChwYWNrZXRbMF0gPDwgOCksCisJCQkgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSBwYWNrZXRbMl0gKyAocGFja2V0WzNdIDw8IDgpLCAKKwkJCSBwYWNrZXRbNF0gKyAocGFja2V0WzVdIDw8IDgpLCBidWYsIHNpemUsIDEwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBSZWFkUGFja2V0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgUmVhZFBhY2tldChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggKnBhY2tldCwgdTggKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaWYgKCFwYWNrZXQgfHwgc2l6ZSA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAorCQkJIHBhY2tldFsxXSArIChwYWNrZXRbMF0gPDwgOCksCisJCQkgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgcGFja2V0WzJdICsgKHBhY2tldFszXSA8PCA4KSwgCisJCQkgcGFja2V0WzRdICsgKHBhY2tldFs1XSA8PCA4KSwgYnVmLCBzaXplLCAxMDAwKTsKK30KKworc3RhdGljIGludCBjcGlhX3VzYl90cmFuc2ZlckNtZCh2b2lkICpwcml2ZGF0YSwgdTggKmNvbW1hbmQsIHU4ICpkYXRhKQoreworCWludCBlcnIgPSAwOworCWludCBkYXRhYnl0ZXM7CisJc3RydWN0IHVzYl9jcGlhICp1Y3BpYSA9IChzdHJ1Y3QgdXNiX2NwaWEgKilwcml2ZGF0YTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHVjcGlhLT5kZXY7CisKKwlpZiAoIXVkZXYpIHsKKwkJREJHKCJJbnRlcm5hbCBkcml2ZXIgZXJyb3I6IHVkZXYgaXMgTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghY29tbWFuZCkgeworCQlEQkcoIkludGVybmFsIGRyaXZlciBlcnJvcjogY29tbWFuZCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YWJ5dGVzID0gKCgoaW50KWNvbW1hbmRbN10pPDw4KSB8IGNvbW1hbmRbNl07CisKKwlpZiAoY29tbWFuZFswXSA9PSBEQVRBX0lOKSB7CisJCXU4IGJ1ZmZlcls4XTsKKworCQlpZiAoIWRhdGEpIHsKKwkJCURCRygiSW50ZXJuYWwgZHJpdmVyIGVycm9yOiBkYXRhIGlzIE5VTExcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQllcnIgPSBSZWFkUGFja2V0KHVkZXYsIGNvbW1hbmQsIGJ1ZmZlciwgOCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQltZW1jcHkoZGF0YSwgYnVmZmVyLCBkYXRhYnl0ZXMpOworCX0gZWxzZSBpZihjb21tYW5kWzBdID09IERBVEFfT1VUKQorCQlXcml0ZVBhY2tldCh1ZGV2LCBjb21tYW5kLCBkYXRhLCBkYXRhYnl0ZXMpOworCWVsc2UgeworCQlEQkcoIlVuZXhwZWN0ZWQgZmlyc3QgYnl0ZSBvZiBjb21tYW5kOiAleFxuIiwgY29tbWFuZFswXSk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3BpYV91c2JfcmVnaXN0ZXJDYWxsYmFjayh2b2lkICpwcml2ZGF0YSwgdm9pZCAoKmNiKSAodm9pZCAqY2JkYXRhKSwKKwl2b2lkICpjYmRhdGEpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgY3BpYV91c2Jfc3RyZWFtU3RhcnQodm9pZCAqcHJpdmRhdGEpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgY3BpYV91c2Jfc3RyZWFtU3RvcCh2b2lkICpwcml2ZGF0YSkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBjcGlhX3VzYl9zdHJlYW1SZWFkKHZvaWQgKnByaXZkYXRhLCB1OCAqZnJhbWUsIGludCBub2Jsb2NrKQoreworCXN0cnVjdCB1c2JfY3BpYSAqdWNwaWEgPSAoc3RydWN0IHVzYl9jcGlhICopIHByaXZkYXRhOworCXN0cnVjdCBmcmFtZWJ1ZiAqbXlidWZmOworCisJaWYgKCF1Y3BpYSB8fCAhdWNwaWEtPnByZXNlbnQpCisJCXJldHVybiAtMTsKKyAgCisJaWYgKHVjcGlhLT5jdXJidWZmLT5zdGF0dXMgIT0gRlJBTUVfUkVBRFkpCisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnVjcGlhLT53cV9zdHJlYW0pOworCWVsc2UKKwkJREJHKCJGcmFtZSBhbHJlYWR5IHdhaXRpbmchXG4iKTsKKworCW15YnVmZiA9IHVjcGlhLT5jdXJidWZmOworCisJaWYgKCFteWJ1ZmYpCisJCXJldHVybiAtMTsKKyAgCisJaWYgKG15YnVmZi0+c3RhdHVzICE9IEZSQU1FX1JFQURZIHx8IG15YnVmZi0+bGVuZ3RoIDwgNCkgeworCQlEQkcoIlNvbWV0aGluZyB3ZW50IHdyb25nIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1jcHkoZnJhbWUsIG15YnVmZi0+ZGF0YSwgbXlidWZmLT5sZW5ndGgpOworCW15YnVmZi0+c3RhdHVzID0gRlJBTUVfRU1QVFk7CisgIAorLyogICBEQkcoInJlYWQgZG9uZSwgJWQgYnl0ZXMsIEhlYWRlcjogJXgvJXgsIEZvb3RlcjogJXgleCV4JXhcbiIsICAqLworLyogICAgICAgbXlidWZmLT5sZW5ndGgsIGZyYW1lWzBdLCBmcmFtZVsxXSwgKi8KKy8qICAgICAgIGZyYW1lW215YnVmZi0+bGVuZ3RoLTRdLCBmcmFtZVtteWJ1ZmYtPmxlbmd0aC0zXSwgICovCisvKiAgICAgICBmcmFtZVtteWJ1ZmYtPmxlbmd0aC0yXSwgZnJhbWVbbXlidWZmLT5sZW5ndGgtMV0pOyAqLworCisJcmV0dXJuIG15YnVmZi0+bGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBjcGlhX3VzYl9mcmVlX3Jlc291cmNlcyhzdHJ1Y3QgdXNiX2NwaWEgKnVjcGlhLCBpbnQgdHJ5KQoreworCWlmICghdWNwaWEtPnN0cmVhbWluZykKKwkJcmV0dXJuOworCisJdWNwaWEtPnN0cmVhbWluZyA9IDA7CisKKwkvKiBTZXQgcGFja2V0IHNpemUgdG8gMCAqLworCWlmICh0cnkpIHsKKwkJaW50IHJldDsKKworCQlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZSh1Y3BpYS0+ZGV2LCB1Y3BpYS0+aWZhY2UsIDApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ1c2Jfc2V0X2ludGVyZmFjZSBlcnJvciAocmV0ID0gJWQpXG4iLCByZXQpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogVW5zY2hlZHVsZSBhbGwgb2YgdGhlIGlzbyB0ZCdzICovCisJaWYgKHVjcGlhLT5zYnVmWzFdLnVyYikgeworCQl1c2Jfa2lsbF91cmIodWNwaWEtPnNidWZbMV0udXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHVjcGlhLT5zYnVmWzFdLnVyYik7CisJCXVjcGlhLT5zYnVmWzFdLnVyYiA9IE5VTEw7CisJfQorCisJaWYgKHVjcGlhLT5zYnVmWzFdLmRhdGEpIHsKKwkJa2ZyZWUodWNwaWEtPnNidWZbMV0uZGF0YSk7CisJCXVjcGlhLT5zYnVmWzFdLmRhdGEgPSBOVUxMOworCX0KKyAKKwlpZiAodWNwaWEtPnNidWZbMF0udXJiKSB7CisJCXVzYl9raWxsX3VyYih1Y3BpYS0+c2J1ZlswXS51cmIpOworCQl1c2JfZnJlZV91cmIodWNwaWEtPnNidWZbMF0udXJiKTsKKwkJdWNwaWEtPnNidWZbMF0udXJiID0gTlVMTDsKKwl9CisKKwlpZiAodWNwaWEtPnNidWZbMF0uZGF0YSkgeworCQlrZnJlZSh1Y3BpYS0+c2J1ZlswXS5kYXRhKTsKKwkJdWNwaWEtPnNidWZbMF0uZGF0YSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGNwaWFfdXNiX2Nsb3NlKHZvaWQgKnByaXZkYXRhKQoreworCXN0cnVjdCB1c2JfY3BpYSAqdWNwaWEgPSAoc3RydWN0IHVzYl9jcGlhICopIHByaXZkYXRhOworCisJaWYoIXVjcGlhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXVjcGlhLT5vcGVuID0gMDsKKworCS8qIHVjcGlhLT5wcmVzZW50ID0gMCBwcm90ZWN0cyBhZ2FpbnN0IHRyeWluZyB0byByZXNldCB0aGUKKwkgKiBhbHQgc2V0dGluZyBpZiBjYW1lcmEgaXMgcGh5c2ljYWxseSBkaXNjb25uZWN0ZWQgd2hpbGUgb3BlbiAqLworCWNwaWFfdXNiX2ZyZWVfcmVzb3VyY2VzKHVjcGlhLCB1Y3BpYS0+cHJlc2VudCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNwaWFfdXNiX2luaXQodm9pZCkKK3sKKwkvKiByZXR1cm4gLUVOT0RFVjsgKi8KKwlyZXR1cm4gMDsKK30KKworLyogUHJvYmluZyBhbmQgaW5pdGlhbGl6aW5nICovCisKK3N0YXRpYyBpbnQgY3BpYV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IHVzYl9jcGlhICp1Y3BpYTsKKwlzdHJ1Y3QgY2FtX2RhdGEgKmNhbTsKKwlpbnQgcmV0OworICAKKwkvKiBBIG11bHRpLWNvbmZpZyBDUGlBIGNhbWVyYT8gKi8KKwlpZiAodWRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCXByaW50ayhLRVJOX0lORk8gIlVTQiBDUGlBIGNhbWVyYSBmb3VuZFxuIik7CisKKwl1Y3BpYSA9IGttYWxsb2Moc2l6ZW9mKCp1Y3BpYSksIEdGUF9LRVJORUwpOworCWlmICghdWNwaWEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZG4ndCBrbWFsbG9jIGNwaWEgc3RydWN0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHVjcGlhLCAwLCBzaXplb2YoKnVjcGlhKSk7CisKKwl1Y3BpYS0+ZGV2ID0gdWRldjsKKwl1Y3BpYS0+aWZhY2UgPSBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1Y3BpYS0+d3Ffc3RyZWFtKTsKKworCXVjcGlhLT5idWZmZXJzWzBdID0gdm1hbGxvYyhzaXplb2YoKnVjcGlhLT5idWZmZXJzWzBdKSk7CisJaWYgKCF1Y3BpYS0+YnVmZmVyc1swXSkgeworCQlwcmludGsoS0VSTl9FUlIgImNvdWxkbid0IHZtYWxsb2MgZnJhbWUgYnVmZmVyIDBcbiIpOworCQlnb3RvIGZhaWxfYWxsb2NfMDsKKwl9CisKKwl1Y3BpYS0+YnVmZmVyc1sxXSA9IHZtYWxsb2Moc2l6ZW9mKCp1Y3BpYS0+YnVmZmVyc1sxXSkpOworCWlmICghdWNwaWEtPmJ1ZmZlcnNbMV0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZG4ndCB2bWFsbG9jIGZyYW1lIGJ1ZmZlciAxXG4iKTsKKwkJZ290byBmYWlsX2FsbG9jXzE7CisJfQorCisJdWNwaWEtPmJ1ZmZlcnNbMl0gPSB2bWFsbG9jKHNpemVvZigqdWNwaWEtPmJ1ZmZlcnNbMl0pKTsKKwlpZiAoIXVjcGlhLT5idWZmZXJzWzJdKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY291bGRuJ3Qgdm1hbGxvYyBmcmFtZSBidWZmZXIgMlxuIik7CisJCWdvdG8gZmFpbF9hbGxvY18yOworCX0KKworCXVjcGlhLT5idWZmZXJzWzBdLT5uZXh0ID0gdWNwaWEtPmJ1ZmZlcnNbMV07CisJdWNwaWEtPmJ1ZmZlcnNbMV0tPm5leHQgPSB1Y3BpYS0+YnVmZmVyc1syXTsKKwl1Y3BpYS0+YnVmZmVyc1syXS0+bmV4dCA9IHVjcGlhLT5idWZmZXJzWzBdOworCisJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UodWRldiwgdWNwaWEtPmlmYWNlLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNwaWFfcHJvYmU6IHVzYl9zZXRfaW50ZXJmYWNlIGVycm9yIChyZXQgPSAlZClcbiIsIHJldCk7CisJCS8qIGdvdG8gZmFpbF9hbGw7ICovCisJfQorCisJLyogQmVmb3JlIHJlZ2lzdGVyX2NhbWVyYSwgaW1wb3J0YW50ICovCisJdWNwaWEtPnByZXNlbnQgPSAxOworICAKKwljYW0gPSBjcGlhX3JlZ2lzdGVyX2NhbWVyYSgmY3BpYV91c2Jfb3BzLCB1Y3BpYSk7CisJaWYgKCFjYW0pIHsKKwkJTE9HKCJmYWlsZWQgdG8gY3BpYV9yZWdpc3Rlcl9jYW1lcmFcbiIpOworCQlnb3RvIGZhaWxfYWxsOworCX0KKworCXNwaW5fbG9jayggJmNhbV9saXN0X2xvY2tfdXNiICk7CisJbGlzdF9hZGQoICZjYW0tPmNhbV9kYXRhX2xpc3QsICZjYW1fbGlzdCApOworCXNwaW5fdW5sb2NrKCAmY2FtX2xpc3RfbG9ja191c2IgKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2FtKTsKKwlyZXR1cm4gMDsKKworZmFpbF9hbGw6CisJdmZyZWUodWNwaWEtPmJ1ZmZlcnNbMl0pOworCXVjcGlhLT5idWZmZXJzWzJdID0gTlVMTDsKK2ZhaWxfYWxsb2NfMjoKKwl2ZnJlZSh1Y3BpYS0+YnVmZmVyc1sxXSk7CisJdWNwaWEtPmJ1ZmZlcnNbMV0gPSBOVUxMOworZmFpbF9hbGxvY18xOgorCXZmcmVlKHVjcGlhLT5idWZmZXJzWzBdKTsKKwl1Y3BpYS0+YnVmZmVyc1swXSA9IE5VTEw7CitmYWlsX2FsbG9jXzA6CisJa2ZyZWUodWNwaWEpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBjcGlhX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgY3BpYV9pZF90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHgwNTUzLCAweDAwMDIpIH0sCisJeyBVU0JfREVWSUNFKDB4MDgxMywgMHgwMDAxKSB9LAorCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgY3BpYV9pZF90YWJsZSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGNwaWFfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiY3BpYSIsCisJLnByb2JlCQk9IGNwaWFfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSBjcGlhX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gY3BpYV9pZF90YWJsZSwKK307CisKK3N0YXRpYyB2b2lkIGNwaWFfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgY2FtX2RhdGEgKmNhbSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVzYl9jcGlhICp1Y3BpYTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKyAgCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwlpZiAoIWNhbSkKKwkJcmV0dXJuOworCisJdWNwaWEgPSAoc3RydWN0IHVzYl9jcGlhICopIGNhbS0+bG93bGV2ZWxfZGF0YTsKKwlzcGluX2xvY2soICZjYW1fbGlzdF9sb2NrX3VzYiApOworCWxpc3RfZGVsKCZjYW0tPmNhbV9kYXRhX2xpc3QpOworCXNwaW5fdW5sb2NrKCAmY2FtX2xpc3RfbG9ja191c2IgKTsKKwkKKwl1Y3BpYS0+cHJlc2VudCA9IDA7CisKKwljcGlhX3VucmVnaXN0ZXJfY2FtZXJhKGNhbSk7CisJaWYodWNwaWEtPm9wZW4pCisJCWNwaWFfdXNiX2Nsb3NlKGNhbS0+bG93bGV2ZWxfZGF0YSk7CisKKwl1Y3BpYS0+Y3VyYnVmZi0+c3RhdHVzID0gRlJBTUVfRVJST1I7CisKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdWNwaWEtPndxX3N0cmVhbSkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdWNwaWEtPndxX3N0cmVhbSk7CisKKwl1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKworCXVjcGlhLT5jdXJidWZmID0gdWNwaWEtPndvcmtidWZmID0gTlVMTDsKKworCWlmICh1Y3BpYS0+YnVmZmVyc1syXSkgeworCQl2ZnJlZSh1Y3BpYS0+YnVmZmVyc1syXSk7CisJCXVjcGlhLT5idWZmZXJzWzJdID0gTlVMTDsKKwl9CisKKwlpZiAodWNwaWEtPmJ1ZmZlcnNbMV0pIHsKKwkJdmZyZWUodWNwaWEtPmJ1ZmZlcnNbMV0pOworCQl1Y3BpYS0+YnVmZmVyc1sxXSA9IE5VTEw7CisJfQorCisJaWYgKHVjcGlhLT5idWZmZXJzWzBdKSB7CisJCXZmcmVlKHVjcGlhLT5idWZmZXJzWzBdKTsKKwkJdWNwaWEtPmJ1ZmZlcnNbMF0gPSBOVUxMOworCX0KKworCWNhbS0+bG93bGV2ZWxfZGF0YSA9IE5VTEw7CisJa2ZyZWUodWNwaWEpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB1c2JfY3BpYV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiVkLiVkLiVkXG4iLEFCT1VULCAKKwkgICAgICAgQ1BJQV9VU0JfTUFKX1ZFUixDUElBX1VTQl9NSU5fVkVSLENQSUFfVVNCX1BBVENIX1ZFUik7CisKKwlzcGluX2xvY2tfaW5pdCgmY2FtX2xpc3RfbG9ja191c2IpOworCXJldHVybiB1c2JfcmVnaXN0ZXIoJmNwaWFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVzYl9jcGlhX2NsZWFudXAodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmY3BpYV9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0ICh1c2JfY3BpYV9pbml0KTsKK21vZHVsZV9leGl0ICh1c2JfY3BpYV9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jczg0MjAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3M4NDIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyMmYzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3M4NDIwLmgKQEAgLTAsMCArMSw1MCBAQAorLyogY3M4NDIwLmggLSBjczg0MjAgaW5pdGlhbGl6YXRpb25zCisgICBDb3B5cmlnaHQgKEMpIDE5OTkgTmF0aGFuIExhcmVkbyAobGFyZWRvQGdudS5vcmcpCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqLworI2lmbmRlZiBfX0NTODQyMF9IX18KKyNkZWZpbmUgX19DUzg0MjBfSF9fCisKKy8qIEluaXRpYWxpemF0aW9uIFNlcXVlbmNlICovCisJIAorc3RhdGljIF9fdTggaW5pdDg0MjBbXSA9IHsKKwkxLCAweDAxLAkyLCAweDAyLAkzLCAweDAwLAk0LCAweDQ2LAorCTUsIDB4MjQsCTYsIDB4ODQsCTE4LCAweDE4LAkxOSwgMHgxMywKK307CisKKyNkZWZpbmUgSU5JVDg0MjBMRU4JKHNpemVvZihpbml0ODQyMCkvMikKKworc3RhdGljIF9fdTggbW9kZTg0MjBwcm9bXSA9IHsJLyogcHJvZmVzc2lvbmFsIG91dHB1dCBtb2RlICovCisJMzIsIDB4YTEsCTMzLCAweDAwLAkzNCwgMHgwMCwJMzUsIDB4MDAsCisJMzYsIDB4MDAsCTM3LCAweDAwLAkzOCwgMHgwMCwJMzksIDB4MDAsCisJNDAsIDB4MDAsCTQxLCAweDAwLAk0MiwgMHgwMCwJNDMsIDB4MDAsCisJNDQsIDB4MDAsCTQ1LCAweDAwLAk0NiwgMHgwMCwJNDcsIDB4MDAsCisJNDgsIDB4MDAsCTQ5LCAweDAwLAk1MCwgMHgwMCwJNTEsIDB4MDAsCisJNTIsIDB4MDAsCTUzLCAweDAwLAk1NCwgMHgwMCwJNTUsIDB4MDAsCit9OworI2RlZmluZSBNT0RFODQyMExFTgkoc2l6ZW9mKG1vZGU4NDIwcHJvKS8yKQorCitzdGF0aWMgX191OCBtb2RlODQyMGNvbltdID0gewkvKiBjb25zdW1lciBvdXRwdXQgbW9kZSAqLworCTMyLCAweDIwLAkzMywgMHgwMCwJMzQsIDB4MDAsCTM1LCAweDQ4LAorCTM2LCAweDAwLAkzNywgMHgwMCwJMzgsIDB4MDAsCTM5LCAweDAwLAorCTQwLCAweDAwLAk0MSwgMHgwMCwJNDIsIDB4MDAsCTQzLCAweDAwLAorCTQ0LCAweDAwLAk0NSwgMHgwMCwJNDYsIDB4MDAsCTQ3LCAweDAwLAorCTQ4LCAweDAwLAk0OSwgMHgwMCwJNTAsIDB4MDAsCTUxLCAweDAwLAorCTUyLCAweDAwLAk1MywgMHgwMCwJNTQsIDB4MDAsCTU1LCAweDAwLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2ZDAzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACitjeDg4eHgtb2Jqcwk6PSBjeDg4LWNhcmRzLm8gY3g4OC1jb3JlLm8gY3g4OC1pMmMubyBjeDg4LXR2YXVkaW8ubyBcCisJCSAgIGN4ODgtaW5wdXQubworY3g4ODAwLW9ianMJOj0gY3g4OC12aWRlby5vIGN4ODgtdmJpLm8KK2N4ODgwMi1vYmpzCTo9IGN4ODgtbXBlZy5vCisKK29iai0kKENPTkZJR19WSURFT19DWDg4KSArPSBjeDg4eHgubyBjeDg4MDAubyBjeDg4MDIubyBjeDg4LWJsYWNrYmlyZC5vCitvYmotJChDT05GSUdfVklERU9fQ1g4OF9EVkIpICs9IGN4ODgtZHZiLm8KKworRVhUUkFfQ0ZMQUdTICs9IC1JJChzcmMpLy4uCitFWFRSQV9DRkxBR1MgKz0gLUkkKHNyY3RyZWUpL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitFWFRSQV9DRkxBR1MgKz0gLUkkKHNyY3RyZWUpL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ2Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKQEAgLTAsMCArMSw5MTEgQEAKKy8qCisgKiAkSWQ6IGN4ODgtYmxhY2tiaXJkLmMsdiAxLjI2IDIwMDUvMDMvMDcgMTU6NTg6MDUga3JheGVsIEV4cCAkCisgKgorICogIFN1cHBvcnQgZm9yIGEgY3gyMzQxNiBtcGVnIGVuY29kZXIgdmlhIGN4MjM4OHggaG9zdCBwb3J0LgorICogICJibGFja2JpcmQiIHJlZmVyZW5jZSBkZXNpZ24uCisgKgorICogICAgKGMpIDIwMDQgSmVsbGUgRm9rcyA8amVsbGVAZm9rcy44bS5jb20+CisgKiAgICAoYykgMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+CisgKgorICogIEluY2x1ZGVzIHBhcnRzIGZyb20gdGhlIGl2dHYgZHJpdmVyKCBodHRwOi8vaXZ0di5zb3VyY2Vmb3JnZS5uZXQvKSwKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImN4ODguaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGN4MjM4OHgvY3gyMzQxNiBiYXNlZCBtcGVnIGVuY29kZXIgY2FyZHMiKTsKK01PRFVMRV9BVVRIT1IoIkplbGxlIEZva3MgPGplbGxlQGZva3MuOG0uY29tPiIpOworTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IG1wZWdidWZzID0gODsKK21vZHVsZV9wYXJhbShtcGVnYnVmcyxpbnQsMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1wZWdidWZzLCJudW1iZXIgb2YgbXBlZyBidWZmZXJzLCByYW5nZSAyLTMyIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLGludCwwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbYmxhY2tiaXJkXSIpOworCisjZGVmaW5lIGRwcmludGsobGV2ZWwsZm10LCBhcmcuLi4pCWlmIChkZWJ1ZyA+PSBsZXZlbCkgXAorCXByaW50ayhLRVJOX0RFQlVHICIlcy8yLWJiOiAiIGZtdCwgZGV2LT5jb3JlLT5uYW1lICwgIyMgYXJnKQorCitzdGF0aWMgTElTVF9IRUFEKGN4ODgwMl9kZXZsaXN0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQkxBQ0tCSVJEX0ZJUk1fRU5DX0ZJTEVOQU1FICJibGFja2JpcmQtZnctZW5jLmJpbiIKKyNkZWZpbmUgQkxBQ0tCSVJEX0ZJUk1fSU1BR0VfU0laRSAyNTYqMTAyNAorCisvKiBkZWZpbmVzIGJlbG93IGFyZSBmcm9tIGl2dHYtZHJpdmVyLmggKi8KKworI2RlZmluZSBJVlRWX0NNRF9IV19CTE9DS1NfUlNUIDB4RkZGRkZGRkYKKworLypGaXJtd2FyZSBBUEkgY29tbWFuZHMqLworI2RlZmluZSBJVlRWX0FQSV9FTkNfUElOR19GVyAweDAwMDAwMDgwCisjZGVmaW5lIElWVFZfQVBJX0VOQ19HRVRWRVIgMHgwMDAwMDBDNAorI2RlZmluZSBJVlRWX0FQSV9FTkNfSEFMVF9GVyAweDAwMDAwMEMzCisjZGVmaW5lIElWVFZfQVBJX1NURF9USU1FT1VUIDB4MDAwMTAwMDAgLyp1bml0cz8/Ki8KKy8vI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fUEdNX0lOREVYX0lORk8gMHgwMDAwMDBjNworI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fU1RSRUFNX1RZUEUgMHgwMDAwMDBiOQorI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fT1VUUFVUX1BPUlQgMHgwMDAwMDBiYgorI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fRlJBTUVSQVRFIDB4MDAwMDAwOGYKKyNkZWZpbmUgSVZUVl9BUElfQVNTSUdOX0ZSQU1FX1NJWkUgMHgwMDAwMDA5MQorI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fQVNQRUNUX1JBVElPIDB4MDAwMDAwOTkKKyNkZWZpbmUgSVZUVl9BUElfQVNTSUdOX0JJVFJBVEVTIDB4MDAwMDAwOTUKKyNkZWZpbmUgSVZUVl9BUElfQVNTSUdOX0dPUF9QUk9QRVJUSUVTIDB4MDAwMDAwOTcKKyNkZWZpbmUgSVZUVl9BUElfQVNTSUdOXzNfMl9QVUxMRE9XTiAweDAwMDAwMGIxCisjZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9HT1BfQ0xPU1VSRSAweDAwMDAwMGM1CisjZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9BVURJT19QUk9QRVJUSUVTIDB4MDAwMDAwYmQKKyNkZWZpbmUgSVZUVl9BUElfQVNTSUdOX0ROUl9GSUxURVJfTU9ERSAweDAwMDAwMDliCisjZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9ETlJfRklMVEVSX1BST1BTIDB4MDAwMDAwOWQKKyNkZWZpbmUgSVZUVl9BUElfQVNTSUdOX0NPUklOR19MRVZFTFMgMHgwMDAwMDA5ZgorI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fU1BBVElBTF9GSUxURVJfVFlQRSAweDAwMDAwMGExCisjZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9GUkFNRV9EUk9QX1JBVEUgMHgwMDAwMDBkMAorI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fUExBQ0VIT0xERVIgMHgwMDAwMDBkOAorI2RlZmluZSBJVlRWX0FQSV9NVVRFX1ZJREVPIDB4MDAwMDAwZDkKKyNkZWZpbmUgSVZUVl9BUElfTVVURV9BVURJTyAweDAwMDAwMGRhCisjZGVmaW5lIElWVFZfQVBJX0lOSVRJQUxJWkVfSU5QVVQgMHgwMDAwMDBjZAorI2RlZmluZSBJVlRWX0FQSV9SRUZSRVNIX0lOUFVUIDB4MDAwMDAwZDMKKyNkZWZpbmUgSVZUVl9BUElfQVNTSUdOX05VTV9WU1lOQ19MSU5FUyAweDAwMDAwMGQ2CisjZGVmaW5lIElWVFZfQVBJX0JFR0lOX0NBUFRVUkUgMHgwMDAwMDA4MQorLy8jZGVmaW5lIElWVFZfQVBJX1BBVVNFX0VOQ09ERVIgMHgwMDAwMDBkMgorLy8jZGVmaW5lIElWVFZfQVBJX0VWRU5UX05PVElGSUNBVElPTiAweDAwMDAwMGQ1CisjZGVmaW5lIElWVFZfQVBJX0VORF9DQVBUVVJFIDB4MDAwMDAwODIKKworLyogUmVnaXN0ZXJzICovCisjZGVmaW5lIElWVFZfUkVHX0VOQ19TRFJBTV9SRUZSRVNIICgweDA3RjggLyp8IElWVFZfUkVHX09GRlNFVCovKQorI2RlZmluZSBJVlRWX1JFR19FTkNfU0RSQU1fUFJFQ0hBUkdFICgweDA3RkMgLyp8IElWVFZfUkVHX09GRlNFVCovKQorI2RlZmluZSBJVlRWX1JFR19TUFUgKDB4OTA1MCAvKnwgSVZUVl9SRUdfT0ZGU0VUKi8pCisjZGVmaW5lIElWVFZfUkVHX0hXX0JMT0NLUyAoMHg5MDU0IC8qfCBJVlRWX1JFR19PRkZTRVQqLykKKyNkZWZpbmUgSVZUVl9SRUdfVlBVICgweDkwNTggLyp8IElWVFZfUkVHX09GRlNFVCovKQorI2RlZmluZSBJVlRWX1JFR19BUFUgKDB4QTA2NCAvKnwgSVZUVl9SRUdfT0ZGU0VUKi8pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBob3N0X3NldHVwKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpCit7CisJLyogdG9nZ2xlIHJlc2V0IG9mIHRoZSBob3N0ICovCisJY3hfd3JpdGUoTU9fR1BIU1RfU09GVF9SU1QsIDEpOworCXVkZWxheSgxMDApOworCWN4X3dyaXRlKE1PX0dQSFNUX1NPRlRfUlNULCAwKTsKKwl1ZGVsYXkoMTAwKTsKKworCS8qIGhvc3QgcG9ydCBzZXR1cCAqLworCWN4X3dyaXRlKE1PX0dQSFNUX1dTQywgMHg0NDQ0NDQ0NFUpOworCWN4X3dyaXRlKE1PX0dQSFNUX1hGUiwgMCk7CisJY3hfd3JpdGUoTU9fR1BIU1RfV0RUSCwgMTUpOworCWN4X3dyaXRlKE1PX0dQSFNUX0hEU0hLLCAwKTsKKwljeF93cml0ZShNT19HUEhTVF9NVVgxNiwgMHg0NDQ0ODg4OFUpOworCWN4X3dyaXRlKE1PX0dQSFNUX01PREUsIDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBQMV9NREFUQTAgMHgzOTAwMDAKKyNkZWZpbmUgUDFfTURBVEExIDB4MzkwMDAxCisjZGVmaW5lIFAxX01EQVRBMiAweDM5MDAwMgorI2RlZmluZSBQMV9NREFUQTMgMHgzOTAwMDMKKyNkZWZpbmUgUDFfTUFERFIyIDB4MzkwMDA0CisjZGVmaW5lIFAxX01BRERSMSAweDM5MDAwNQorI2RlZmluZSBQMV9NQUREUjAgMHgzOTAwMDYKKyNkZWZpbmUgUDFfUkRBVEEwIDB4MzkwMDA4CisjZGVmaW5lIFAxX1JEQVRBMSAweDM5MDAwOQorI2RlZmluZSBQMV9SREFUQTIgMHgzOTAwMEEKKyNkZWZpbmUgUDFfUkRBVEEzIDB4MzkwMDBCCisjZGVmaW5lIFAxX1JBRERSMCAweDM5MDAwQworI2RlZmluZSBQMV9SQUREUjEgMHgzOTAwMEQKKyNkZWZpbmUgUDFfUlJEV1IgIDB4MzkwMDBFCisKK3N0YXRpYyBpbnQgd2FpdF9yZWFkeV9ncGlvMF9iaXQxKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHUzMiBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKTsKKwl1MzIgZ3BpbzAsbmVlZDsKKworCW5lZWQgPSBzdGF0ZSA/IDIgOiAwOworCWZvciAoOzspIHsKKwkJZ3BpbzAgPSBjeF9yZWFkKE1PX0dQMF9JTykgJiAyOworCQlpZiAobmVlZCA9PSBncGlvMCkKKwkJCXJldHVybiAwOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLHRpbWVvdXQpKQorCQkJcmV0dXJuIC0xOworCQl1ZGVsYXkoMSk7CisJfQorfQorCitzdGF0aWMgaW50IG1lbW9yeV93cml0ZShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1MzIgYWRkcmVzcywgdTMyIHZhbHVlKQoreworCS8qIFdhcm5pbmc6IGFkZHJlc3MgaXMgZHdvcmQgYWRkcmVzcyAoNCBieXRlcykgKi8KKwljeF93cml0ZWIoUDFfTURBVEEwLCAodW5zaWduZWQgaW50KXZhbHVlKTsKKwljeF93cml0ZWIoUDFfTURBVEExLCAodW5zaWduZWQgaW50KSh2YWx1ZSA+PiA4KSk7CisJY3hfd3JpdGViKFAxX01EQVRBMiwgKHVuc2lnbmVkIGludCkodmFsdWUgPj4gMTYpKTsKKwljeF93cml0ZWIoUDFfTURBVEEzLCAodW5zaWduZWQgaW50KSh2YWx1ZSA+PiAyNCkpOworCWN4X3dyaXRlYihQMV9NQUREUjIsICh1bnNpZ25lZCBpbnQpKGFkZHJlc3MgPj4gMTYpIHwgMHg0MCk7CisJY3hfd3JpdGViKFAxX01BRERSMSwgKHVuc2lnbmVkIGludCkoYWRkcmVzcyA+PiA4KSk7CisJY3hfd3JpdGViKFAxX01BRERSMCwgKHVuc2lnbmVkIGludClhZGRyZXNzKTsKKwljeF9yZWFkKFAxX01EQVRBMCk7CisJY3hfcmVhZChQMV9NQUREUjApOworCisJcmV0dXJuIHdhaXRfcmVhZHlfZ3BpbzBfYml0MShjb3JlLDEpOworfQorCitzdGF0aWMgaW50IG1lbW9yeV9yZWFkKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHUzMiBhZGRyZXNzLCB1MzIgKnZhbHVlKQoreworICAgICAgICBpbnQgcmV0dmFsOworCXUzMiB2YWw7CisKKwkvKiBXYXJuaW5nOiBhZGRyZXNzIGlzIGR3b3JkIGFkZHJlc3MgKDQgYnl0ZXMpICovCisJY3hfd3JpdGViKFAxX01BRERSMiwgKHVuc2lnbmVkIGludCkoYWRkcmVzcyA+PiAxNikgJiB+MHhDMCk7CisJY3hfd3JpdGViKFAxX01BRERSMSwgKHVuc2lnbmVkIGludCkoYWRkcmVzcyA+PiA4KSk7CisJY3hfd3JpdGViKFAxX01BRERSMCwgKHVuc2lnbmVkIGludClhZGRyZXNzKTsKKwljeF9yZWFkKFAxX01BRERSMCk7CisKKwlyZXR2YWwgPSB3YWl0X3JlYWR5X2dwaW8wX2JpdDEoY29yZSwxKTsKKworCWN4X3dyaXRlYihQMV9NREFUQTMsIDApOworCXZhbCAgICAgPSAodW5zaWduZWQgY2hhciljeF9yZWFkKFAxX01EQVRBMykgPDwgMjQ7CisJY3hfd3JpdGViKFAxX01EQVRBMiwgMCk7CisJdmFsICAgIHw9ICh1bnNpZ25lZCBjaGFyKWN4X3JlYWQoUDFfTURBVEEyKSA8PCAxNjsKKwljeF93cml0ZWIoUDFfTURBVEExLCAwKTsKKwl2YWwgICAgfD0gKHVuc2lnbmVkIGNoYXIpY3hfcmVhZChQMV9NREFUQTEpIDw8IDg7CisJY3hfd3JpdGViKFAxX01EQVRBMCwgMCk7CisJdmFsICAgIHw9ICh1bnNpZ25lZCBjaGFyKWN4X3JlYWQoUDFfTURBVEEwKTsKKworCSp2YWx1ZSAgPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCByZWdpc3Rlcl93cml0ZShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1MzIgYWRkcmVzcywgdTMyIHZhbHVlKQoreworCWN4X3dyaXRlYihQMV9SREFUQTAsICh1bnNpZ25lZCBpbnQpdmFsdWUpOworCWN4X3dyaXRlYihQMV9SREFUQTEsICh1bnNpZ25lZCBpbnQpKHZhbHVlID4+IDgpKTsKKwljeF93cml0ZWIoUDFfUkRBVEEyLCAodW5zaWduZWQgaW50KSh2YWx1ZSA+PiAxNikpOworCWN4X3dyaXRlYihQMV9SREFUQTMsICh1bnNpZ25lZCBpbnQpKHZhbHVlID4+IDI0KSk7CisJY3hfd3JpdGViKFAxX1JBRERSMCwgKHVuc2lnbmVkIGludClhZGRyZXNzKTsKKwljeF93cml0ZWIoUDFfUkFERFIxLCAodW5zaWduZWQgaW50KShhZGRyZXNzID4+IDgpKTsKKwljeF93cml0ZWIoUDFfUlJEV1IsIDEpOworCWN4X3JlYWQoUDFfUkRBVEEwKTsKKwljeF9yZWFkKFAxX1JBRERSMCk7CisKKwlyZXR1cm4gd2FpdF9yZWFkeV9ncGlvMF9iaXQxKGNvcmUsMSk7Cit9CisKKworc3RhdGljIGludCByZWdpc3Rlcl9yZWFkKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHUzMiBhZGRyZXNzLCB1MzIgKnZhbHVlKQoreworCWludCByZXR2YWw7CisJdTMyIHZhbDsKKworCWN4X3dyaXRlYihQMV9SQUREUjAsICh1bnNpZ25lZCBpbnQpYWRkcmVzcyk7CisJY3hfd3JpdGViKFAxX1JBRERSMSwgKHVuc2lnbmVkIGludCkoYWRkcmVzcyA+PiA4KSk7CisJY3hfd3JpdGViKFAxX1JSRFdSLCAwKTsKKwljeF9yZWFkKFAxX1JBRERSMCk7CisKKwlyZXR2YWwgID0gd2FpdF9yZWFkeV9ncGlvMF9iaXQxKGNvcmUsMSk7CisJdmFsICAgICA9ICh1bnNpZ25lZCBjaGFyKWN4X3JlYWQoUDFfUkRBVEEwKTsKKwl2YWwgICAgfD0gKHVuc2lnbmVkIGNoYXIpY3hfcmVhZChQMV9SREFUQTEpIDw8IDg7CisJdmFsICAgIHw9ICh1bnNpZ25lZCBjaGFyKWN4X3JlYWQoUDFfUkRBVEEyKSA8PCAxNjsKKwl2YWwgICAgfD0gKHVuc2lnbmVkIGNoYXIpY3hfcmVhZChQMV9SREFUQTMpIDw8IDI0OworCisJKnZhbHVlICA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogV2UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoZSBBUEkgb2Z0ZW4sIHNvIHVzaW5nIGp1c3Qgb25lIG1haWxib3ggd2lsbCBwcm9iYWJseSBzdWZmaWNlICovCitzdGF0aWMgaW50IGJsYWNrYmlyZF9hcGlfY21kKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYsIHUzMiBjb21tYW5kLAorCQkJICAgICB1MzIgaW5wdXRjbnQsIHUzMiBvdXRwdXRjbnQsIC4uLikKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdTMyIHZhbHVlLCBmbGFnLCByZXR2YWw7CisJaW50IGk7CisJdmFfbGlzdCBhcmdzOworCXZhX3N0YXJ0KGFyZ3MsIG91dHB1dGNudCk7CisKKwlkcHJpbnRrKDEsIiVzOiAweCVYXG4iLCBfX0ZVTkNUSU9OX18sIGNvbW1hbmQpOworCisJLyogdGhpcyBtYXkgbm90IGJlIDEwMCUgc2FmZSBpZiB3ZSBjYW4ndCByZWFkIGFueSBtZW1vcnkgbG9jYXRpb24KKwkgICB3aXRob3V0IHNpZGUgZWZmZWN0cyAqLworCW1lbW9yeV9yZWFkKGRldi0+Y29yZSwgZGV2LT5tYWlsYm94IC0gNCwgJnZhbHVlKTsKKwlpZiAodmFsdWUgIT0gMHgxMjM0NTY3OCkgeworCQlkcHJpbnRrKDAsICJGaXJtd2FyZSBhbmQvb3IgbWFpbGJveCBwb2ludGVyIG5vdCBpbml0aWFsaXplZCBvciBjb3JydXB0ZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtb3J5X3JlYWQoZGV2LT5jb3JlLCBkZXYtPm1haWxib3gsICZmbGFnKTsKKwlpZiAoZmxhZykgeworCQlkcHJpbnRrKDAsICJFUlJPUjogTWFpbGJveCBhcHBlYXJzIHRvIGJlIGluIHVzZSAoJXgpXG4iLCBmbGFnKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZsYWcgfD0gMTsgLyogdGVsbCAnZW0gd2UncmUgd29ya2luZyBvbiBpdCAqLworCW1lbW9yeV93cml0ZShkZXYtPmNvcmUsIGRldi0+bWFpbGJveCwgZmxhZyk7CisKKwkvKiB3cml0ZSBjb21tYW5kICsgYXJncyArIGZpbGwgcmVtYWluaW5nIHdpdGggemVyb3MgKi8KKwltZW1vcnlfd3JpdGUoZGV2LT5jb3JlLCBkZXYtPm1haWxib3ggKyAxLCBjb21tYW5kKTsgLyogY29tbWFuZCBjb2RlICovCisJbWVtb3J5X3dyaXRlKGRldi0+Y29yZSwgZGV2LT5tYWlsYm94ICsgMywgSVZUVl9BUElfU1REX1RJTUVPVVQpOyAvKiB0aW1lb3V0ICovCisJZm9yIChpID0gMDsgaSA8IGlucHV0Y250IDsgaSsrKSB7CisJCXZhbHVlID0gdmFfYXJnKGFyZ3MsIGludCk7CisJCW1lbW9yeV93cml0ZShkZXYtPmNvcmUsIGRldi0+bWFpbGJveCArIDQgKyBpLCB2YWx1ZSk7CisJCWRwcmludGsoMSwgIkFQSSBJbnB1dCAlZCA9ICVkXG4iLCBpLCB2YWx1ZSk7CisJfQorCWZvciAoOyBpIDwgMTYgOyBpKyspCisJCW1lbW9yeV93cml0ZShkZXYtPmNvcmUsIGRldi0+bWFpbGJveCArIDQgKyBpLCAwKTsKKworCWZsYWcgfD0gMzsgLyogdGVsbCAnZW0gd2UncmUgZG9uZSB3cml0aW5nICovCisJbWVtb3J5X3dyaXRlKGRldi0+Y29yZSwgZGV2LT5tYWlsYm94LCBmbGFnKTsKKworCS8qIHdhaXQgZm9yIGZpcm13YXJlIHRvIGhhbmRsZSB0aGUgQVBJIGNvbW1hbmQgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTApOworCWZvciAoOzspIHsKKwkJbWVtb3J5X3JlYWQoZGV2LT5jb3JlLCBkZXYtPm1haWxib3gsICZmbGFnKTsKKwkJaWYgKDAgIT0gKGZsYWcgJiA0KSkKKwkJCWJyZWFrOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLHRpbWVvdXQpKSB7CisJCQlkcHJpbnRrKDAsICJFUlJPUjogQVBJIE1haWxib3ggdGltZW91dFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKiByZWFkIG91dHB1dCB2YWx1ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgb3V0cHV0Y250IDsgaSsrKSB7CisJCWludCAqdnB0ciA9IHZhX2FyZyhhcmdzLCBpbnQgKik7CisJCW1lbW9yeV9yZWFkKGRldi0+Y29yZSwgZGV2LT5tYWlsYm94ICsgNCArIGksIHZwdHIpOworCQlkcHJpbnRrKDEsICJBUEkgT3V0cHV0ICVkID0gJWRcbiIsIGksICp2cHRyKTsKKwl9CisJdmFfZW5kKGFyZ3MpOworCisJbWVtb3J5X3JlYWQoZGV2LT5jb3JlLCBkZXYtPm1haWxib3ggKyAyLCAmcmV0dmFsKTsKKwlkcHJpbnRrKDEsICJBUEkgcmVzdWx0ID0gJWRcbiIscmV0dmFsKTsKKworCWZsYWcgPSAwOworCW1lbW9yeV93cml0ZShkZXYtPmNvcmUsIGRldi0+bWFpbGJveCwgZmxhZyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgaW50IGJsYWNrYmlyZF9maW5kX21haWxib3goc3RydWN0IGN4ODgwMl9kZXYgKmRldikKK3sKKwl1MzIgc2lnbmF0dXJlWzRdPXsweDEyMzQ1Njc4LCAweDM0NTY3ODEyLCAweDU2NzgxMjM0LCAweDc4MTIzNDU2fTsKKwlpbnQgc2lnbmF0dXJlY250PTA7CisJdTMyIHZhbHVlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJMQUNLQklSRF9GSVJNX0lNQUdFX1NJWkU7IGkrKykgeworCQltZW1vcnlfcmVhZChkZXYtPmNvcmUsIGksICZ2YWx1ZSk7CisJCWlmICh2YWx1ZSA9PSBzaWduYXR1cmVbc2lnbmF0dXJlY250XSkKKwkJCXNpZ25hdHVyZWNudCsrOworCQllbHNlCisJCQlzaWduYXR1cmVjbnQgPSAwOworCQlpZiAoNCA9PSBzaWduYXR1cmVjbnQpIHsKKwkJCWRwcmludGsoMSwgIk1haWxib3ggc2lnbmF0dXJlIGZvdW5kXG4iKTsKKwkJCXJldHVybiBpKzE7CisJCX0KKwl9CisJZHByaW50aygwLCAiTWFpbGJveCBzaWduYXR1cmUgdmFsdWVzIG5vdCBmb3VuZCFcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBibGFja2JpcmRfbG9hZF9maXJtd2FyZShzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1hZ2ljWzhdID0geworCQkweGE3LCAweDBkLCAweDAwLCAweDAwLCAweDY2LCAweGJiLCAweDU1LCAweGFhCisJfTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOworCWludCBpLCByZXR2YWwgPSAwOworCXUzMiB2YWx1ZSA9IDA7CisJdTMyIGNoZWNrc3VtID0gMDsKKwl1MzIgKmRhdGFwdHI7CisKKwlyZXR2YWwgID0gcmVnaXN0ZXJfd3JpdGUoZGV2LT5jb3JlLCBJVlRWX1JFR19WUFUsIDB4RkZGRkZGRUQpOworICAgICAgICByZXR2YWwgfD0gcmVnaXN0ZXJfd3JpdGUoZGV2LT5jb3JlLCBJVlRWX1JFR19IV19CTE9DS1MsIElWVFZfQ01EX0hXX0JMT0NLU19SU1QpOworICAgICAgICByZXR2YWwgfD0gcmVnaXN0ZXJfd3JpdGUoZGV2LT5jb3JlLCBJVlRWX1JFR19FTkNfU0RSQU1fUkVGUkVTSCwgMHg4MDAwMDY0MCk7CisgICAgICAgIHJldHZhbCB8PSByZWdpc3Rlcl93cml0ZShkZXYtPmNvcmUsIElWVFZfUkVHX0VOQ19TRFJBTV9QUkVDSEFSR0UsIDB4MUEpOworCW1zbGVlcCgxKTsKKyAgICAgICAgcmV0dmFsIHw9IHJlZ2lzdGVyX3dyaXRlKGRldi0+Y29yZSwgSVZUVl9SRUdfQVBVLCAwKTsKKworCWlmIChyZXR2YWwgPCAwKQorCQlkcHJpbnRrKDAsICJFcnJvciB3aXRoIHJlZ2lzdGVyX3dyaXRlXG4iKTsKKworCXJldHZhbCA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBCTEFDS0JJUkRfRklSTV9FTkNfRklMRU5BTUUsCisJCQkJICAmZGV2LT5wY2ktPmRldik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCWRwcmludGsoMCwgIkVSUk9SOiBIb3RwbHVnIGZpcm13YXJlIHJlcXVlc3QgZmFpbGVkICglcykuXG4iLAorCQkJQkxBQ0tCSVJEX0ZJUk1fRU5DX0ZJTEVOQU1FKTsKKwkJZHByaW50aygwLCAiUGxlYXNlIGZpeCB5b3VyIGhvdHBsdWcgc2V0dXAsIHRoZSBib2FyZCB3aWxsICIKKwkJCSJub3Qgd29yayB3aXRob3V0IGZpcm13YXJlIGxvYWRlZCFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpcm13YXJlLT5zaXplICE9IEJMQUNLQklSRF9GSVJNX0lNQUdFX1NJWkUpIHsKKwkJZHByaW50aygwLCAiRVJST1I6IEZpcm13YXJlIHNpemUgbWlzbWF0Y2ggKGhhdmUgJXpkLCBleHBlY3RlZCAlZClcbiIsCisJCQlmaXJtd2FyZS0+c2l6ZSwgQkxBQ0tCSVJEX0ZJUk1fSU1BR0VfU0laRSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoMCAhPSBtZW1jbXAoZmlybXdhcmUtPmRhdGEsIG1hZ2ljLCA4KSkgeworCQlkcHJpbnRrKDAsICJFUlJPUjogRmlybXdhcmUgbWFnaWMgbWlzbWF0Y2gsIHdyb25nIGZpbGU/XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHRyYW5zZmVyIHRvIHRoZSBjaGlwICovCisJZHByaW50aygxLCJMb2FkaW5nIGZpcm13YXJlIC4uLlxuIik7CisJZGF0YXB0ciA9ICh1MzIqKWZpcm13YXJlLT5kYXRhOworCWZvciAoaSA9IDA7IGkgPCAoZmlybXdhcmUtPnNpemUgPj4gMik7IGkrKykgeworCQl2YWx1ZSA9ICpkYXRhcHRyOworCQljaGVja3N1bSArPSB+dmFsdWU7CisJCW1lbW9yeV93cml0ZShkZXYtPmNvcmUsIGksIHZhbHVlKTsKKwkJZGF0YXB0cisrOworCX0KKworCS8qIHJlYWQgYmFjayB0byB2ZXJpZnkgd2l0aCB0aGUgY2hlY2tzdW0gKi8KKwlmb3IgKGktLTsgaSA+PSAwOyBpLS0pIHsKKwkJbWVtb3J5X3JlYWQoZGV2LT5jb3JlLCBpLCAmdmFsdWUpOworCQljaGVja3N1bSAtPSB+dmFsdWU7CisJfQorCWlmIChjaGVja3N1bSkgeworCQlkcHJpbnRrKDAsICJFUlJPUjogRmlybXdhcmUgbG9hZCBmYWlsZWQgKGNoZWNrc3VtIG1pc21hdGNoKS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworCWRwcmludGsoMCwgIkZpcm13YXJlIHVwbG9hZCBzdWNjZXNzZnVsLlxuIik7CisKKyAgICAgICAgcmV0dmFsIHw9IHJlZ2lzdGVyX3dyaXRlKGRldi0+Y29yZSwgSVZUVl9SRUdfSFdfQkxPQ0tTLCBJVlRWX0NNRF9IV19CTE9DS1NfUlNUKTsKKyAgICAgICAgcmV0dmFsIHw9IHJlZ2lzdGVyX3JlYWQoZGV2LT5jb3JlLCBJVlRWX1JFR19TUFUsICZ2YWx1ZSk7CisgICAgICAgIHJldHZhbCB8PSByZWdpc3Rlcl93cml0ZShkZXYtPmNvcmUsIElWVFZfUkVHX1NQVSwgdmFsdWUgJiAweEZGRkZGRkZFKTsKKwltc2xlZXAoMSk7CisKKwlyZXR2YWwgfD0gcmVnaXN0ZXJfcmVhZChkZXYtPmNvcmUsIElWVFZfUkVHX1ZQVSwgJnZhbHVlKTsKKyAgICAgICAgcmV0dmFsIHw9IHJlZ2lzdGVyX3dyaXRlKGRldi0+Y29yZSwgSVZUVl9SRUdfVlBVLCB2YWx1ZSAmIDB4RkZGRkZGRTgpOworCisJaWYgKHJldHZhbCA8IDApCisJCWRwcmludGsoMCwgIkVycm9yIHdpdGggcmVnaXN0ZXJfd3JpdGVcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibGFja2JpcmRfY29kZWNfc2V0dGluZ3Moc3RydWN0IGN4ODgwMl9kZXYgKmRldikKK3sKKwlpbnQgYml0cmF0ZV9tb2RlID0gMTsKKwlpbnQgYml0cmF0ZSA9IDc1MDAwMDA7CisJaW50IGJpdHJhdGVfcGVhayA9IDc1MDAwMDA7CisKKwkvKiBhc3NpZ24gc3RyZWFtIHR5cGUgKi8KKyAgICAgICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fU1RSRUFNX1RZUEUsIDEsIDAsIDApOyAvKiBwcm9ncmFtIHN0cmVhbSAqLworICAgICAgICAvL2JsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX1NUUkVBTV9UWVBFLCAxLCAwLCAyKTsgLyogTVBFRzEgc3RyZWFtICovCisgICAgICAgIC8vYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fU1RSRUFNX1RZUEUsIDEsIDAsIDMpOyAvKiBQRVMgQS9WICovCisgICAgICAgIC8vYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fU1RSRUFNX1RZUEUsIDEsIDAsIDEwKTsgLyogRFZEIHN0cmVhbSAqLworCisgICAgICAgIC8qIGFzc2lnbiBvdXRwdXQgcG9ydCAqLworICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9PVVRQVVRfUE9SVCwgMSwgMCwgMSk7IC8qIDEgPSBIb3N0ICovCisKKyAgICAgICAgLyogYXNzaWduIGZyYW1lcmF0ZSAqLworICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9GUkFNRVJBVEUsIDEsIDAsIDApOworCisgICAgICAgIC8qIGFzc2lnbiBmcmFtZSBzaXplICovCisgICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0ZSQU1FX1NJWkUsIDIsIDAsCisJCQkgIGRldi0+aGVpZ2h0LCBkZXYtPndpZHRoKTsKKworICAgICAgICAvKiBhc3NpZ24gYXNwZWN0IHJhdGlvICovCisgICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0FTUEVDVF9SQVRJTywgMSwgMCwgMik7CisKKyAgICAgICAgLyogYXNzaWduIGJpdHJhdGVzICovCisgICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0JJVFJBVEVTLCA1LCAwLAorCQkJIGJpdHJhdGVfbW9kZSwgICAgICAgICAvKiBtb2RlICovCisJCQkgYml0cmF0ZSwgICAgICAgICAgICAgIC8qIGJwcyAqLworCQkJIGJpdHJhdGVfcGVhayAvIDQwMCwgICAvKiBwZWFrLzQwMCAqLworCQkJIDAsIDB4NzApOyAgICAgICAgICAgICAvKiBlbmNvZGluZyBidWZmZXIsIGNrZW5uZWR5ICovCisKKyAgICAgICAgLyogYXNzaWduIGdvcCBwcm9wZXJ0aWVzICovCisgICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0dPUF9QUk9QRVJUSUVTLCAyLCAwLCAxNSwgMyk7CisgICAgICAgIC8vYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fR09QX1BST1BFUlRJRVMsIDIsIDAsIDIsIDEpOworCisgICAgICAgIC8qIGFzc2lnbiAzIDIgcHVsbGRvd24gKi8KKyAgICAgICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fM18yX1BVTExET1dOLCAxLCAwLCAwKTsKKworICAgICAgICAvKiBub3RlOiBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gc2V0IHRoZSBzYW1wbGVyYXRlLCB0aGUgbXBlZyBlbmNvZGVyIHNlZW1zIHRvIGF1dG9kZXRlY3QvYWRqdXN0ICovCisJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fQVVESU9fUFJPUEVSVElFUywgMSwgMCwgKDI8PDIpIHwgKDg8PDQpKTsKKworCS8qIGFzc2lnbiBnb3AgY2xvc3VyZSAqLworICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9HT1BfQ0xPU1VSRSwgMSwgMCwgMCk7CisKKyAgICAgICAgLyogYXNzaWduIGF1ZGlvIHByb3BlcnRpZXMgKi8KKyAgICAgICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fQVVESU9fUFJPUEVSVElFUywgMSwgMCwgMCB8ICgyIDw8IDIpIHwgKDE0IDw8IDQpKTsKKworICAgICAgICAvKiBhc3NpZ24gZG5yIGZpbHRlciBtb2RlICovCisgICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0ROUl9GSUxURVJfTU9ERSwgMiwgMCwgMCwgMCk7CisKKyAgICAgICAgLyogYXNzaWduIGRuciBmaWx0ZXIgcHJvcHMqLworICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9ETlJfRklMVEVSX1BST1BTLCAyLCAwLCAwLCAwKTsKKworICAgICAgICAvKiBhc3NpZ24gY29yaW5nIGxldmVscyAobHVtYV9oLCBsdW1hX2wsIGNocm9tYV9oLCBjaHJvbWFfbCkgKi8KKyAgICAgICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fQ09SSU5HX0xFVkVMUywgNCwgMCwgMCwgMjU1LCAwLCAyNTUpOworCisJLyogYXNzaWduIHNwYXRpYWwgZmlsdGVyIHR5cGU6IGx1bWFfdDogMSA9IGhvcml6X29ubHksIGNocm9tYV90OiAxID0gaG9yaXpfb25seSAqLworICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9TUEFUSUFMX0ZJTFRFUl9UWVBFLCAyLCAwLCAxLCAxKTsKKworICAgICAgICAvKiBhc3NpZ24gZnJhbWUgZHJvcCByYXRlICovCisgICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0ZSQU1FX0RST1BfUkFURSwgMSwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYmxhY2tiaXJkX2luaXRpYWxpemVfY29kZWMoc3RydWN0IGN4ODgwMl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCWludCB2ZXJzaW9uOworCWludCByZXR2YWw7CisKKwlkcHJpbnRrKDEsIkluaXRpYWxpemUgY29kZWNcbiIpOworCXJldHZhbCA9IGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfRU5DX1BJTkdfRlcsIDAsIDApOyAvKiBwaW5nICovCisJaWYgKHJldHZhbCA8IDApIHsKKwkJLyogcGluZyB3YXMgbm90IHN1Y2Nlc3NmdWwsIHJlc2V0IGFuZCB1cGxvYWQgZmlybXdhcmUgKi8KKwkJY3hfd3JpdGUoTU9fU1JTVF9JTywgMCk7IC8qIFNZU19SU1RPPTAgKi8KKwkJbXNsZWVwKDEpOworCQljeF93cml0ZShNT19TUlNUX0lPLCAxKTsgLyogU1lTX1JTVE89MSAqLworCQltc2xlZXAoMSk7CisJCXJldHZhbCA9IGJsYWNrYmlyZF9sb2FkX2Zpcm13YXJlKGRldik7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJcmV0dXJuIHJldHZhbDsKKworCQlkZXYtPm1haWxib3ggPSBibGFja2JpcmRfZmluZF9tYWlsYm94KGRldik7CisJCWlmIChkZXYtPm1haWxib3ggPCAwKQorCQkJcmV0dXJuIC0xOworCisJCXJldHZhbCA9IGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfRU5DX1BJTkdfRlcsIDAsIDApOyAvKiBwaW5nICovCisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlkcHJpbnRrKDAsICJFUlJPUjogRmlybXdhcmUgcGluZyBmYWlsZWQhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXJldHZhbCA9IGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfRU5DX0dFVFZFUiwgMCwgMSwgJnZlcnNpb24pOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZHByaW50aygwLCAiRVJST1I6IEZpcm13YXJlIGdldCBlbmNvZGVyIHZlcnNpb24gZmFpbGVkIVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZHByaW50aygwLCAiRmlybXdhcmUgdmVyc2lvbiBpcyAweCUwOHhcbiIsIHZlcnNpb24pOworCX0KKwltc2xlZXAoMSk7CisKKwljeF93cml0ZShNT19QSU5NVVhfSU8sIDB4ODgpOyAvKiA2NTYtOGJpdCBJTyBhbmQgZW5hYmxlIE1QRUcgcGFyYWxsZWwgSU8gKi8KKwljeF9jbGVhcihNT19JTlBVVF9GT1JNQVQsIDB4MTAwKTsgLyogY2hyb21hIHN1YmNhcnJpZXIgbG9jayB0byBub3JtYWw/ICovCisJY3hfd3JpdGUoTU9fVkJPU19DT05UUk9MLCAweDg0QTAwKTsgLyogbm8gNjU2IG1vZGUsIDgtYml0IHBpeGVscywgZGlzYWJsZSBWQkkgKi8KKwljeF9jbGVhcihNT19PVVRQVVRfRk9STUFULCAweDAwMDgpOyAvKiBOb3JtYWwgWS1saW1pdHMgdG8gbGV0IHRoZSBtcGVnIGVuY29kZXIgc3luYyAqLworCisjaWYgMCAvKiBGSVhNRSAqLworCXNldF9zY2FsZShkZXYsIDcyMCwgNDgwLCBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpOworI2VuZGlmCisJYmxhY2tiaXJkX2NvZGVjX3NldHRpbmdzKGRldik7CisJbXNsZWVwKDEpOworCisJLy9ibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9OVU1fVlNZTkNfTElORVMsIDQsIDAsIDB4ZWYsIDB4ZWYpOworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX05VTV9WU1lOQ19MSU5FUywgNCwgMCwgMHhmMCwgMHhmMCk7CisJLy9ibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9OVU1fVlNZTkNfTElORVMsIDQsIDAsIDB4MTgwLCAweDE4MCk7CisgICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX1BMQUNFSE9MREVSLCAxMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisKKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0lOSVRJQUxJWkVfSU5QVVQsIDAsIDApOyAvKiBpbml0aWFsaXplIHRoZSB2aWRlbyBpbnB1dCAqLworCisJbXNsZWVwKDEpOworCisgICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfTVVURV9WSURFTywgMSwgMCwgMCk7CisJbXNsZWVwKDEpOworICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX01VVEVfQVVESU8sIDEsIDAsIDApOworCW1zbGVlcCgxKTsKKworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQkVHSU5fQ0FQVFVSRSwgMiwgMCwgMCwgMHgxMyk7IC8qIHN0YXJ0IGNhcHR1cmluZyB0byB0aGUgaG9zdCBpbnRlcmZhY2UgKi8KKwkvL2JsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQkVHSU5fQ0FQVFVSRSwgMiwgMCwgMCwgMCk7IC8qIHN0YXJ0IGNhcHR1cmluZyB0byB0aGUgaG9zdCBpbnRlcmZhY2UgKi8KKwltc2xlZXAoMSk7CisKKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX1JFRlJFU0hfSU5QVVQsIDAsMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJiX2J1Zl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQl1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKnNpemUpCit7CisJc3RydWN0IGN4ODgwMl9maCAqZmggPSBxLT5wcml2X2RhdGE7CisKKwlmaC0+ZGV2LT50c19wYWNrZXRfc2l6ZSAgPSA1MTI7CisJZmgtPmRldi0+dHNfcGFja2V0X2NvdW50ID0gMTAwOworCisJKnNpemUgPSBmaC0+ZGV2LT50c19wYWNrZXRfc2l6ZSAqIGZoLT5kZXYtPnRzX3BhY2tldF9jb3VudDsKKwlpZiAoMCA9PSAqY291bnQpCisJCSpjb3VudCA9IG1wZWdidWZzOworCWlmICgqY291bnQgPCAyKQorCQkqY291bnQgPSAyOworCWlmICgqY291bnQgPiAzMikKKwkJKmNvdW50ID0gMzI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JiX2J1Zl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCisJICAgICAgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKK3sKKwlzdHJ1Y3QgY3g4ODAyX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlyZXR1cm4gY3g4ODAyX2J1Zl9wcmVwYXJlKGZoLT5kZXYsIChzdHJ1Y3QgY3g4OF9idWZmZXIqKXZiKTsKK30KKworc3RhdGljIHZvaWQKK2JiX2J1Zl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBjeDg4MDJfZmggKmZoID0gcS0+cHJpdl9kYXRhOworCWN4ODgwMl9idWZfcXVldWUoZmgtPmRldiwgKHN0cnVjdCBjeDg4X2J1ZmZlciopdmIpOworfQorCitzdGF0aWMgdm9pZAorYmJfYnVmX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgY3g4ODAyX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwljeDg4X2ZyZWVfYnVmZmVyKGZoLT5kZXYtPnBjaSwgKHN0cnVjdCBjeDg4X2J1ZmZlciopdmIpOworfQorCitzdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyBibGFja2JpcmRfcW9wcyA9IHsKKwkuYnVmX3NldHVwICAgID0gYmJfYnVmX3NldHVwLAorCS5idWZfcHJlcGFyZSAgPSBiYl9idWZfcHJlcGFyZSwKKwkuYnVmX3F1ZXVlICAgID0gYmJfYnVmX3F1ZXVlLAorCS5idWZfcmVsZWFzZSAgPSBiYl9idWZfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG1wZWdfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBjeDg4MDJfZmggICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAoZGVidWcgPiAxKQorCQljeDg4X3ByaW50X2lvY3RsKGRldi0+Y29yZS0+bmFtZSxjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKworCS8qIC0tLSBjYXB0dXJlIGlvY3RscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfRU5VTV9GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmID0gYXJnOworCQlpbnQgaW5kZXg7CisKKwkJaW5kZXggPSBmLT5pbmRleDsKKwkJaWYgKGluZGV4ICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQltZW1zZXQoZiwwLHNpemVvZigqZikpOworCQlmLT5pbmRleCA9IGluZGV4OworCQlzdHJsY3B5KGYtPmRlc2NyaXB0aW9uLCAiTVBFRyBUUyIsIHNpemVvZihmLT5kZXNjcmlwdGlvbikpOworCQlmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQlmLT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NUEVHOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19GTVQ6CisJY2FzZSBWSURJT0NfU19GTVQ6CisJY2FzZSBWSURJT0NfVFJZX0ZNVDoKKwl7CisJCS8qIEZJWE1FIC0tIHF1aWNrJ24nZGlydHkgZm9yIGV4YWN0bHkgb25lIHNpemUgLi4uICovCisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZiA9IGFyZzsKKworCQltZW1zZXQoZiwwLHNpemVvZigqZikpOworCQlmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQlmLT5mbXQucGl4LndpZHRoICAgICAgICA9IGRldi0+d2lkdGg7CisJCWYtPmZtdC5waXguaGVpZ2h0ICAgICAgID0gZGV2LT5oZWlnaHQ7CisJCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgID0gVjRMMl9QSVhfRk1UX01QRUc7CisJCWYtPmZtdC5waXguc2l6ZWltYWdlICAgID0gMTAyNCAqIDUxMiAvKiBGSVhNRTogQlVGRkVSX1NJWkUgKi87CisJfQorCisJLyogLS0tIHN0cmVhbWluZyBjYXB0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwljYXNlIFZJRElPQ19SRVFCVUZTOgorCQlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcygmZmgtPm1wZWdxLCBhcmcpOworCisJY2FzZSBWSURJT0NfUVVFUllCVUY6CisJCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1ZigmZmgtPm1wZWdxLCBhcmcpOworCisJY2FzZSBWSURJT0NfUUJVRjoKKwkJcmV0dXJuIHZpZGVvYnVmX3FidWYoJmZoLT5tcGVncSwgYXJnKTsKKworCWNhc2UgVklESU9DX0RRQlVGOgorCQlyZXR1cm4gdmlkZW9idWZfZHFidWYoJmZoLT5tcGVncSwgYXJnLAorCQkJCSAgICAgIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworCWNhc2UgVklESU9DX1NUUkVBTU9OOgorCQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb24oJmZoLT5tcGVncSk7CisKKwljYXNlIFZJRElPQ19TVFJFQU1PRkY6CisJCXJldHVybiB2aWRlb2J1Zl9zdHJlYW1vZmYoJmZoLT5tcGVncSk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBlZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIG1wZWdfZG9faW9jdGwpOworfQorCitzdGF0aWMgaW50IG1wZWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBjeDg4MDJfZGV2ICpoLCpkZXYgPSBOVUxMOworCXN0cnVjdCBjeDg4MDJfZmggKmZoOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsJmN4ODgwMl9kZXZsaXN0KSB7CisJCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjeDg4MDJfZGV2LCBkZXZsaXN0KTsKKwkJaWYgKGgtPm1wZWdfZGV2LT5taW5vciA9PSBtaW5vcikKKwkJCWRldiA9IGg7CisJfQorCWlmIChOVUxMID09IGRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYmxhY2tiaXJkX2luaXRpYWxpemVfY29kZWMoZGV2KSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWRwcmludGsoMSwib3BlbiBtaW5vcj0lZFxuIixtaW5vcik7CisKKwkvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLworCWZoID0ga21hbGxvYyhzaXplb2YoKmZoKSxHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBmaCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGZoLDAsc2l6ZW9mKCpmaCkpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOworCWZoLT5kZXYgICAgICA9IGRldjsKKworCS8qIEZJWE1FOiBsb2NraW5nIGFnYWluc3Qgb3RoZXIgdmlkZW8gZGV2aWNlICovCisJY3g4OF9zZXRfc2NhbGUoZGV2LT5jb3JlLCBkZXYtPndpZHRoLCBkZXYtPmhlaWdodCwKKwkJICAgICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCk7CisKKwl2aWRlb2J1Zl9xdWV1ZV9pbml0KCZmaC0+bXBlZ3EsICZibGFja2JpcmRfcW9wcywKKwkJCSAgICBkZXYtPnBjaSwgJmRldi0+c2xvY2ssCisJCQkgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkJICAgIFY0TDJfRklFTERfVE9QLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgY3g4OF9idWZmZXIpLAorCQkJICAgIGZoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVnX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGN4ODgwMl9maCAgKmZoICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWJsYWNrYmlyZF9hcGlfY21kKGZoLT5kZXYsIElWVFZfQVBJX0VORF9DQVBUVVJFLCAzLCAwLCAxLCAwLCAweDEzKTsKKworCS8qIHN0b3AgbXBlZyBjYXB0dXJlICovCisJaWYgKGZoLT5tcGVncS5zdHJlYW1pbmcpCisJCXZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPm1wZWdxKTsKKwlpZiAoZmgtPm1wZWdxLnJlYWRpbmcpCisJCXZpZGVvYnVmX3JlYWRfc3RvcCgmZmgtPm1wZWdxKTsKKworCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPm1wZWdxKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWtmcmVlKGZoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK21wZWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBjeDg4MDJfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHZpZGVvYnVmX3JlYWRfc3RyZWFtKCZmaC0+bXBlZ3EsIGRhdGEsIGNvdW50LCBwcG9zLCAwLAorCQkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK21wZWdfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBjeDg4MDJfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHZpZGVvYnVmX3BvbGxfc3RyZWFtKGZpbGUsICZmaC0+bXBlZ3EsIHdhaXQpOworfQorCitzdGF0aWMgaW50CittcGVnX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKK3sKKwlzdHJ1Y3QgY3g4ODAyX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2aWRlb2J1Zl9tbWFwX21hcHBlcigmZmgtPm1wZWdxLCB2bWEpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtcGVnX2ZvcHMgPQoreworCS5vd25lcgkgICAgICAgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgICAgICAgPSBtcGVnX29wZW4sCisJLnJlbGVhc2UgICAgICAgPSBtcGVnX3JlbGVhc2UsCisJLnJlYWQJICAgICAgID0gbXBlZ19yZWFkLAorCS5wb2xsICAgICAgICAgID0gbXBlZ19wb2xsLAorCS5tbWFwCSAgICAgICA9IG1wZWdfbW1hcCwKKwkuaW9jdGwJICAgICAgID0gbXBlZ19pb2N0bCwKKwkubGxzZWVrICAgICAgICA9IG5vX2xsc2VlaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4ODgwMl9tcGVnX3RlbXBsYXRlID0KK3sKKwkubmFtZSAgICAgICAgICA9ICJjeDg4MDIiLAorCS50eXBlICAgICAgICAgID0gVklEX1RZUEVfQ0FQVFVSRXxWSURfVFlQRV9UVU5FUnxWSURfVFlQRV9TQ0FMRVN8VklEX1RZUEVfTVBFR19FTkNPREVSLAorCS5oYXJkd2FyZSAgICAgID0gMCwKKwkuZm9wcyAgICAgICAgICA9ICZtcGVnX2ZvcHMsCisJLm1pbm9yICAgICAgICAgPSAtMSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBibGFja2JpcmRfdW5yZWdpc3Rlcl92aWRlbyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQoreworCWlmIChkZXYtPm1wZWdfZGV2KSB7CisJCWlmICgtMSAhPSBkZXYtPm1wZWdfZGV2LT5taW5vcikKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+bXBlZ19kZXYpOworCQllbHNlCisJCQl2aWRlb19kZXZpY2VfcmVsZWFzZShkZXYtPm1wZWdfZGV2KTsKKwkJZGV2LT5tcGVnX2RldiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGJsYWNrYmlyZF9yZWdpc3Rlcl92aWRlbyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQoreworCWludCBlcnI7CisKKwlkZXYtPm1wZWdfZGV2ID0gY3g4OF92ZGV2X2luaXQoZGV2LT5jb3JlLGRldi0+cGNpLAorCQkJCSAgICAgICAmY3g4ODAyX21wZWdfdGVtcGxhdGUsIm1wZWciKTsKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT5tcGVnX2RldixWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogY2FuJ3QgcmVnaXN0ZXIgbXBlZyBkZXZpY2VcbiIsCisJCSAgICAgICBkZXYtPmNvcmUtPm5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlcy8yOiByZWdpc3RlcmVkIGRldmljZSB2aWRlbyVkIFttcGVnXVxuIiwKKwkgICAgICAgZGV2LT5jb3JlLT5uYW1lLGRldi0+bXBlZ19kZXYtPm1pbm9yICYgMHgxZik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJsYWNrYmlyZF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldjsKKwlzdHJ1Y3QgY3g4OF9jb3JlICAqY29yZTsKKwlpbnQgZXJyOworCisJLyogZ2VuZXJhbCBzZXR1cCAqLworCWNvcmUgPSBjeDg4X2NvcmVfZ2V0KHBjaV9kZXYpOworCWlmIChOVUxMID09IGNvcmUpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5ibGFja2JpcmQpCisJCWdvdG8gZmFpbF9jb3JlOworCisJZXJyID0gLUVOT01FTTsKKwlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSxHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBkZXYpCisJCWdvdG8gZmFpbF9jb3JlOworCW1lbXNldChkZXYsMCxzaXplb2YoKmRldikpOworCWRldi0+cGNpID0gcGNpX2RldjsKKwlkZXYtPmNvcmUgPSBjb3JlOworCWRldi0+d2lkdGggPSA3MjA7CisJZGV2LT5oZWlnaHQgPSA0ODA7CisKKwllcnIgPSBjeDg4MDJfaW5pdF9jb21tb24oZGV2KTsKKwlpZiAoMCAhPSBlcnIpCisJCWdvdG8gZmFpbF9mcmVlOworCisJLyogYmxhY2tiaXJkIHN0dWZmICovCisJcHJpbnRrKCIlcy8yOiBjeDIzNDE2IGJhc2VkIG1wZWcgZW5jb2RlciAoYmxhY2tiaXJkIHJlZmVyZW5jZSBkZXNpZ24pXG4iLAorCSAgICAgICBjb3JlLT5uYW1lKTsKKwlob3N0X3NldHVwKGRldi0+Y29yZSk7CisKKwlsaXN0X2FkZF90YWlsKCZkZXYtPmRldmxpc3QsJmN4ODgwMl9kZXZsaXN0KTsKKwlibGFja2JpcmRfcmVnaXN0ZXJfdmlkZW8oZGV2KTsKKwlyZXR1cm4gMDsKKworIGZhaWxfZnJlZToKKwlrZnJlZShkZXYpOworIGZhaWxfY29yZToKKwljeDg4X2NvcmVfcHV0KGNvcmUscGNpX2Rldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGJsYWNrYmlyZF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisgICAgICAgIHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisKKwkvKiBibGFja2JpcmQgKi8KKwlibGFja2JpcmRfdW5yZWdpc3Rlcl92aWRlbyhkZXYpOworCWxpc3RfZGVsKCZkZXYtPmRldmxpc3QpOworCisJLyogY29tbW9uICovCisJY3g4ODAyX2ZpbmlfY29tbW9uKGRldik7CisJY3g4OF9jb3JlX3B1dChkZXYtPmNvcmUsZGV2LT5wY2kpOworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeDg4MDJfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvciAgICAgICA9IDB4MTRmMSwKKwkJLmRldmljZSAgICAgICA9IDB4ODgwMiwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwl9LHsKKwkJLyogLS0tIGVuZCBvZiBsaXN0IC0tLSAqLworCX0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY3g4ODAyX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYmxhY2tiaXJkX3BjaV9kcml2ZXIgPSB7CisgICAgICAgIC5uYW1lICAgICA9ICJjeDg4LWJsYWNrYmlyZCIsCisgICAgICAgIC5pZF90YWJsZSA9IGN4ODgwMl9wY2lfdGJsLAorICAgICAgICAucHJvYmUgICAgPSBibGFja2JpcmRfcHJvYmUsCisgICAgICAgIC5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGJsYWNrYmlyZF9yZW1vdmUpLAorCS5zdXNwZW5kICA9IGN4ODgwMl9zdXNwZW5kX2NvbW1vbiwKKwkucmVzdW1lICAgPSBjeDg4MDJfcmVzdW1lX2NvbW1vbiwKK307CisKK3N0YXRpYyBpbnQgYmxhY2tiaXJkX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4IGJsYWNrYmlyZCBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCisJICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAorCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gIDgpICYgMHhmZiwKKwkgICAgICAgQ1g4OF9WRVJTSU9OX0NPREUgJiAweGZmKTsKKyNpZmRlZiBTTkFQU0hPVAorCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHg6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCisJICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7CisjZW5kaWYKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYmxhY2tiaXJkX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBibGFja2JpcmRfZmluaSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYmxhY2tiaXJkX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChibGFja2JpcmRfaW5pdCk7Cittb2R1bGVfZXhpdChibGFja2JpcmRfZmluaSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3NjI0OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKQEAgLTAsMCArMSw5MzggQEAKKy8qCisgKiAkSWQ6IGN4ODgtY2FyZHMuYyx2IDEuNjYgMjAwNS8wMy8wNCAwOToxMjoyMyBrcmF4ZWwgRXhwICQKKyAqCisgKiBkZXZpY2UgZHJpdmVyIGZvciBDb25leGFudCAyMzg4eCBiYXNlZCBUViBjYXJkcworICogY2FyZC1zcGVjaWZpYyBzdHVmZi4KKyAqCisgKiAoYykgMjAwMyBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJjeDg4LmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogYm9hcmQgY29uZmlnIGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0cnVjdCBjeDg4X2JvYXJkIGN4ODhfYm9hcmRzW10gPSB7CisJW0NYODhfQk9BUkRfVU5LTk9XTl0gPSB7CisJCS5uYW1lCQk9ICJVTktOT1dOL0dFTkVSSUMiLAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAwLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMiwKKwkJCS52bXV4ICAgPSAxLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMywKKwkJCS52bXV4ICAgPSAyLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFNCwKKwkJCS52bXV4ICAgPSAzLAorCQl9fSwKKwl9LAorCVtDWDg4X0JPQVJEX0hBVVBQQVVHRV0gPSB7CisJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luVFYgMzR4eHggbW9kZWxzIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmdwaW8wICA9IDB4ZmYwMCwgIC8vIGludGVybmFsIGRlY29kZXIKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0RFQlVHLAorCQkJLnZtdXggICA9IDAsCisJCQkuZ3BpbzAgID0gMHhmZjAxLCAgLy8gbW9ubyBmcm9tIHR1bmVyIGNoaXAKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCAgID0gMSwKKwkJCS5ncGlvMCAgPSAweGZmMDIsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweGZmMDIsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkudHlwZSAgID0gQ1g4OF9SQURJTywKKwkJCS5ncGlvMCAgPSAweGZmMDEsCisJCX0sCisJfSwKKwlbQ1g4OF9CT0FSRF9HREldID0geworCQkubmFtZQkJPSAiR0RJIEJsYWNrIEdvbGQiLAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQl9fSwKKwl9LAorCVtDWDg4X0JPQVJEX1BJWEVMVklFV10gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJQaXhlbFZpZXciLAorCQkudHVuZXJfdHlwZSAgICAgPSA1LAorCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXggICA9IDAsCisJCQkuZ3BpbzAgID0gMHhmZjAwLCAgLy8gaW50ZXJuYWwgZGVjb2RlcgorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkgLnR5cGUgID0gQ1g4OF9SQURJTywKKwkJCSAuZ3BpbzAgPSAweGZmMTAsCisJCSB9LAorCX0sCisJW0NYODhfQk9BUkRfQVRJX1dPTkRFUl9QUk9dID0geworCQkubmFtZSAgICAgICAgICAgPSAiQVRJIFRWIFdvbmRlciBQcm8iLAorCQkudHVuZXJfdHlwZSAgICAgPSA0NCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19JTlRFUkNBUlJJRVIsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDAzZmYsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwM2ZlLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwM2ZlLAorCQl9fSwKKwl9LAorICAgICAgICBbQ1g4OF9CT0FSRF9XSU5GQVNUMjAwMFhQX0VYUEVSVF0gPSB7CisgICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkxlYWR0ZWsgV2luZmFzdCAyMDAwWFAgRXhwZXJ0IiwKKyAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA0NCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorICAgICAgICAgICAgICAgIC5pbnB1dCAgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKKwkJCS5ncGlvMAk9IDB4MDBGNWU3MDAsCisJCQkuZ3BpbzEgID0gMHgwMDAwMzAwNCwKKwkJCS5ncGlvMiAgPSAweDAwRjVlNzAwLAorCQkJLmdwaW8zICA9IDB4MDIwMDAwMDAsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICA9IDEsCisJCQkuZ3BpbzAJPSAweDAwRjVjNzAwLAorCQkJLmdwaW8xICA9IDB4MDAwMDMwMDQsCisJCQkuZ3BpbzIgID0gMHgwMEY1YzcwMCwKKwkJCS5ncGlvMyAgPSAweDAyMDAwMDAwLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAJPSAweDAwRjVjNzAwLAorCQkJLmdwaW8xICA9IDB4MDAwMDMwMDQsCisJCQkuZ3BpbzIgID0gMHgwMEY1YzcwMCwKKwkJCS5ncGlvMyAgPSAweDAyMDAwMDAwLAorICAgICAgICAgICAgICAgIH19LAorICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1JBRElPLAorCQkJLmdwaW8wCT0gMHgwMEY1ZDcwMCwKKwkJCS5ncGlvMSAgPSAweDAwMDAzMDA0LAorCQkJLmdwaW8yICA9IDB4MDBGNWQ3MDAsCisJCQkuZ3BpbzMgID0gMHgwMjAwMDAwMCwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICB9LAorCVtDWDg4X0JPQVJEX0FWRVJUVl8zMDNdID0geworCQkubmFtZSAgICAgICAgICAgPSAiQXZlclRWIFN0dWRpbyAzMDMgKE0xMjYpIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gMzgsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmdwaW8xICA9IDB4MzA5ZiwKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCAgID0gMSwKKwkJCS5ncGlvMSAgPSAweDMwNWYsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMSAgPSAweDMwNWYsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkudHlwZSAgID0gQ1g4OF9SQURJTywKKwkJfSwKKwl9LAorCVtDWDg4X0JPQVJEX01TSV9UVkFOWVdIRVJFX01BU1RFUl0gPSB7CisJCS8vIGFkZGVkIGdwaW8gdmFsdWVzIHRoYW5rcyB0byBNaWNoYWwKKwkJLy8gdmFsdWVzIGZvciBQQUwgZnJvbSBEU2NhbGVyCisJCS5uYW1lICAgICAgICAgICA9ICJNU0kgVFYtQG55d2hlcmUgTWFzdGVyIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gMzMsCisJCS50ZGE5ODg3X2NvbmYJPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweDAwMDA0MGJmLAorCQkJLmdwaW8xICA9IDB4MDAwMDgwYzAsCisJCQkuZ3BpbzIgID0gMHgwMDAwZmY0MCwKKwkJfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMSwKKwkJCS5ncGlvMCAgPSAweDAwMDA0MGJmLAorCQkJLmdwaW8xICA9IDB4MDAwMDgwYzAsCisJCQkuZ3BpbzIgID0gMHgwMDAwZmY0MCwKKwkJfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAyLAorCQkJLmdwaW8wICA9IDB4MDAwMDQwYmYsCisJCQkuZ3BpbzEgID0gMHgwMDAwODBjMCwKKwkJCS5ncGlvMiAgPSAweDAwMDBmZjQwLAorICAgICAgICAgICAgICAgIH19LAorICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKKwkJCSAudHlwZSAgID0gQ1g4OF9SQURJTywKKyAgICAgICAgICAgICAgICB9LAorCX0sCisJW0NYODhfQk9BUkRfV0lORkFTVF9EVjIwMDBdID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJMZWFkdGVrIFdpbmZhc3QgRFYyMDAwIiwKKyAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAzOCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorICAgICAgICAgICAgICAgIC5pbnB1dCAgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweDAwMzVlNzAwLAorCQkJLmdwaW8xICA9IDB4MDAwMDMwMDQsCisJCQkuZ3BpbzIgID0gMHgwMDM1ZTcwMCwKKwkJCS5ncGlvMyAgPSAweDAyMDAwMDAwLAorCQl9LHsKKworCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICA9IDEsCisJCQkuZ3BpbzAgID0gMHgwMDM1YzcwMCwKKwkJCS5ncGlvMSAgPSAweDAwMDAzMDA0LAorCQkJLmdwaW8yICA9IDB4MDAzNWM3MDAsCisJCQkuZ3BpbzMgID0gMHgwMjAwMDAwMCwKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKKwkJCS52bXV4ICAgPSAyLAorCQkJLmdwaW8wICA9IDB4MDAzNWM3MDAsCisJCQkuZ3BpbzEgID0gMHgwMDM1YzcwMCwKKwkJCS5ncGlvMiAgPSAweDAyMDAwMDAwLAorCQkJLmdwaW8zICA9IDB4MDIwMDAwMDAsCisJCX19LAorICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKKwkJCS50eXBlICAgPSBDWDg4X1JBRElPLAorCQkJLmdwaW8wICA9IDB4MDAzNWQ3MDAsCisJCQkuZ3BpbzEgID0gMHgwMDAwNzAwNCwKKwkJCS5ncGlvMiAgPSAweDAwMzVkNzAwLAorCQkJLmdwaW8zICA9IDB4MDIwMDAwMDAsCisJCSB9LAorICAgICAgICB9LAorICAgICAgICBbQ1g4OF9CT0FSRF9MRUFEVEVLX1BWUjIwMDBdID0geworCQkvLyBncGlvIHZhbHVlcyBmb3IgUEFMIHZlcnNpb24gZnJvbSByZWdzcHkgYnkgRFNjYWxlcgorICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJMZWFkdGVrIFBWUiAyMDAwIiwKKyAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAzOCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorICAgICAgICAgICAgICAgIC5pbnB1dCAgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDAwMDBiZGU2LAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwMDAwYmRlNiwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwMDAwYmRlNiwKKyAgICAgICAgICAgICAgICB9fSwKKyAgICAgICAgICAgICAgICAucmFkaW8gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9SQURJTywKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDAwMDBiZDYyLAorICAgICAgICAgICAgICAgIH0sCisJCS5ibGFja2JpcmQgPSAxLAorICAgICAgICB9LAorCVtDWDg4X0JPQVJEX0lPREFUQV9HVlZDUDNQQ0ldID0geworIAkJLm5hbWUJCT0gIklPREFUQSBHVi1WQ1AzL1BDSSIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKyAJCS5pbnB1dCAgICAgICAgICA9IHt7CisgCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorIAkJCS52bXV4ICAgPSAwLAorIAkJfSx7CisgCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUyLAorIAkJCS52bXV4ICAgPSAxLAorIAkJfSx7CisgCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisgCQkJLnZtdXggICA9IDIsCisgCQl9fSwKKyAJfSwKKwlbQ1g4OF9CT0FSRF9QUk9MSU5LX1BMQVlUVlBWUl0gPSB7CisgICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGxheVRWIFBWUiIsCisgICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNDMsCisJCS50ZGE5ODg3X2NvbmYJPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweGZmMDAsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICA9IDEsCisJCQkuZ3BpbzAgID0gMHhmZjAzLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAgID0gMHhmZjAzLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLnR5cGUgICA9IENYODhfUkFESU8sCisJCQkuZ3BpbzAgID0gMHhmZjAwLAorCQl9LAorCX0sCisJW0NYODhfQk9BUkRfQVNVU19QVlJfNDE2XSA9IHsKKwkJLm5hbWUJCT0gIkFTVVMgUFZSLTQxNiIsCisJCS50dW5lcl90eXBlICAgICA9IDQzLAorICAgICAgICAgICAgICAgIC50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmdwaW8wICA9IDB4MDAwMGZkZTYsCisgCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAgID0gMHgwMDAwZmRlNiwgLy8gMHgwMDAwZmRhNiBMLFIgUkNBIGF1ZGlvIGluPworCQl9fSwKKyAgICAgICAgICAgICAgICAucmFkaW8gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9SQURJTywKKwkJCS5ncGlvMCAgPSAweDAwMDBmZGUyLAorICAgICAgICAgICAgICAgIH0sCisJCS5ibGFja2JpcmQgPSAxLAorCX0sCisJW0NYODhfQk9BUkRfTVNJX1RWQU5ZV0hFUkVdID0geworCQkubmFtZSAgICAgICAgICAgPSAiTVNJIFRWLUBueXdoZXJlIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gMzMsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmdwaW8wICA9IDB4MDAwMDBmYmYsCisJCQkuZ3BpbzIgID0gMHgwMDAwZmMwOCwKKwkJfSx7CisgIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKyAgCQkJLnZtdXggICA9IDEsCisJCQkuZ3BpbzAgID0gMHgwMDAwMGZiZiwKKwkJCS5ncGlvMiAgPSAweDAwMDBmYzY4LAorCQl9LHsKKyAgCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisgIAkJCS52bXV4ICAgPSAyLAorCQkJLmdwaW8wICA9IDB4MDAwMDBmYmYsCisJCQkuZ3BpbzIgID0gMHgwMDAwZmM2OCwKKyAgCQl9fSwKKwl9LAorICAgICAgICBbQ1g4OF9CT0FSRF9LV09STERfRFZCX1RdID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJLV29ybGQvVlN0cmVhbSBYUGVydCBEVkItVCIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKyAgICAgICAgICAgICAgICAuaW5wdXQgICAgICAgICAgPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCisJCQkuZ3BpbzAgID0gMHgwNzAwLAorCQkJLmdwaW8yICA9IDB4MDEwMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDIsCisJCQkuZ3BpbzAgID0gMHgwNzAwLAorCQkJLmdwaW8yICA9IDB4MDEwMSwKKyAgICAgICAgICAgICAgICB9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKKwl9LAorCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1QxXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkRWSUNPIEZ1c2lvbkhEVFYgRFZCLVQxIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULCAvKiBObyBhbmFsb2cgdHVuZXIgKi8KKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wICA9IDB4MDAwMDI3ZGYsCisJCSB9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAgID0gMHgwMDAwMjdkZiwKKwkJfX0sCisJCS5kdmIgICAgICAgICAgICA9IDEsCisJfSwKKwlbQ1g4OF9CT0FSRF9LV09STERfTFRWODgzXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIktXb3JsZCBMVFY4ODNSRiIsCisgICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNDgsCisgICAgICAgICAgICAgICAgLmlucHV0ICAgICAgICAgID0ge3sKKyAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4MDdmOCwKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0RFQlVHLAorCQkJLnZtdXggICA9IDAsCisJCQkuZ3BpbzAgID0gMHgwN2Y5LCAgLy8gbW9ubyBmcm9tIHR1bmVyIGNoaXAKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4MDAwMDA3ZmEsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4MDAwMDA3ZmEsCisgICAgICAgICAgICAgICAgfX0sCisgICAgICAgICAgICAgICAgLnJhZGlvID0geworICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfUkFESU8sCisgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwMDAwMDdmOCwKKyAgICAgICAgICAgICAgICB9LAorCX0sCisJW0NYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERdID0geworCQkubmFtZQkJPSAiRFZpQ08gLSBGdXNpb25IRFRWIDMgR29sZCIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX01JQ1JPVFVORV80MDQyRkk1LAorCQkvKgorCQkgICBHUElPWzBdIHJlc2V0cyBEVDMzMDIgRFRWIHJlY2VpdmVyCisJCSAgICAwIC0gcmVzZXQgYXNzZXJ0ZWQKKwkJICAgIDEgLSBub3JtYWwgb3BlcmF0aW9uCisJCSAgIEdQSU9bMV0gbXV0ZXMgYW5hbG9nIGF1ZGlvIG91dHB1dCBjb25uZWN0b3IKKwkJICAgIDAgLSBlbmFibGUgc2VsZWN0ZWQgc291cmNlCisJCSAgICAxIC0gbXV0ZQorCQkgICBHUElPWzJdIHNlbGVjdHMgc291cmNlIGZvciBhbmFsb2cgYXVkaW8gb3V0cHV0IGNvbm5lY3RvcgorCQkgICAgMCAtIGFuYWxvZyBhdWRpbyBpbnB1dCBjb25uZWN0b3Igb24gdGFiCisJCSAgICAxIC0gYW5hbG9nIERBQyBvdXRwdXQgZnJvbSBDWDIzODgxIGNoaXAKKwkJICAgR1BJT1szXSBzZWxlY3RzIFJGIGlucHV0IGNvbm5lY3RvciBvbiB0dW5lciBtb2R1bGUKKwkJICAgIDAgLSBSRiBjb25uZWN0b3IgbGFiZWxlZCBDQUJMRQorCQkgICAgMSAtIFJGIGNvbm5lY3RvciBsYWJlbGVkIEFOVAorCQkqLworCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXggICA9IDAsCisJCQkuZ3BpbzAJPSAweDBmMGQsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9DQUJMRSwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmdwaW8wCT0gMHgwZjA1LAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wCT0gMHgwZjAwLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAJPSAweDBmMDAsCisJCX19LAorI2lmIDAKKwkJLnRzICAgICAgICAgICAgID0geworCQkJIC50eXBlICAgPSBDWDg4X1RTLAorCQkJIC5ncGlvMCAgPSAweDAwMDAwZjAxLCAgIC8qIEhvb2tlZCB0byB0dW5lciByZXNldCBiaXQgKi8KKwkJIH0KKyNlbmRpZgorCX0sCisgICAgICAgIFtDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDFdID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJIYXVwcGF1Z2UgTm92YS1UIERWQi1UIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorICAgICAgICAgICAgICAgIC5pbnB1dCAgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX0RWQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAwLAorICAgICAgICAgICAgICAgIH19LAorCQkuZHZiICAgICAgICAgICAgPSAxLAorCX0sCisgICAgICAgIFtDWDg4X0JPQVJEX0NPTkVYQU5UX0RWQl9UMV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJDb25leGFudCBEVkItVCByZWZlcmVuY2UgZGVzaWduIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorICAgICAgICAgICAgICAgIC5pbnB1dCAgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX0RWQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAwLAorICAgICAgICAgICAgICAgIH19LAorCQkuZHZiICAgICAgICAgICAgPSAxLAorCX0sCisJW0NYODhfQk9BUkRfUFJPVklERU9fUFYyNTldID0geworCQkubmFtZQkJPSAiUHJvdmlkZW8gUFYyNTkiLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZRMTIxNk1FLAorCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXggICA9IDAsCisJCX19LAorCQkuYmxhY2tiaXJkID0gMSwKKwl9LAorCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfUExVU10gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJEVklDTyBGdXNpb25IRFRWIERWQi1UIFBsdXMiLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsIC8qIE5vIGFuYWxvZyB0dW5lciAqLworCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICA9IDEsCisJCQkuZ3BpbzAgID0gMHgwMDAwMjdkZiwKKwkJIH0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweDAwMDAyN2RmLAorCQl9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKKwl9LAorCVtDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVF0gPSB7CisJCS5uYW1lCSAgICAgICAgPSAiZGlnaXRhbG5vdyBETlRWIExpdmUhIERWQi1UIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCQkuaW5wdXQJICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCAgID0gMSwKKwkJCS5ncGlvMCAgPSAweDAwMDAwNzAwLAorCQkJLmdwaW8yICA9IDB4MDAwMDAxMDEsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweDAwMDAwNzAwLAorCQkJLmdwaW8yICA9IDB4MDAwMDAxMDEsCisJCX19LAorCQkuZHZiICAgICAgICAgICAgPSAxLAorCX0sCisJW0NYODhfQk9BUkRfUENIRFRWX0hEMzAwMF0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJwY0hEVFYgSEQzMDAwIEhEVFYiLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9USE9NU09OX0RUVDc2MTAsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweDAwMDA4NDg0LAorCQkJLmdwaW8xICA9IDB4MDAwMDAwMDAsCisJCQkuZ3BpbzIgID0gMHgwMDAwMDAwMCwKKwkJCS5ncGlvMyAgPSAweDAwMDAwMDAwLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wICA9IDB4MDAwMDg0MDAsCisJCQkuZ3BpbzEgID0gMHgwMDAwMDAwMCwKKwkJCS5ncGlvMiAgPSAweDAwMDAwMDAwLAorCQkJLmdwaW8zICA9IDB4MDAwMDAwMDAsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweDAwMDA4NDAwLAorCQkJLmdwaW8xICA9IDB4MDAwMDAwMDAsCisJCQkuZ3BpbzIgID0gMHgwMDAwMDAwMCwKKwkJCS5ncGlvMyAgPSAweDAwMDAwMDAwLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLnR5cGUgICA9IENYODhfUkFESU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweDAwMDA4NDAwLAorCQkJLmdwaW8xICA9IDB4MDAwMDAwMDAsCisJCQkuZ3BpbzIgID0gMHgwMDAwMDAwMCwKKwkJCS5ncGlvMyAgPSAweDAwMDAwMDAwLAorCQl9LAorCQkuZHZiICAgICAgICAgICAgPSAxLAorCX0sCisJW0NYODhfQk9BUkRfSEFVUFBBVUdFX1JPU0xZTl0gPSB7CisJCS8vIGVudHJ5IGFkZGVkIGJ5IEthdXN0dWJoIEQuIEJoYWxlcmFvIDxiaGFsZXJhby4xQG9zdS5lZHU+CisJCS8vIEdQSU8gdmFsdWVzIG9idGFpbmVkIGZyb20gcmVnc3B5LCBjb3VydGVzeSBTZWFuIENvdmVsCisJCS5uYW1lICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYgMjh4eHggKFJvc2x5bikgbW9kZWxzIiwKKwkJLnR1bmVyX3R5cGUgID0gVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweGVkMTIsICAvLyBpbnRlcm5hbCBkZWNvZGVyCisJCQkuZ3BpbzIgID0gMHgwMGZmLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfREVCVUcsCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweGZmMDEsICAvLyBtb25vIGZyb20gdHVuZXIgY2hpcAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wICA9IDB4ZmYwMiwKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKKwkJCS52bXV4ICAgPSAyLAorCQkJLmdwaW8wICA9IDB4ZWQ5MiwKKwkJCS5ncGlvMiAgPSAweDAwZmYsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkgLnR5cGUgICA9IENYODhfUkFESU8sCisJCQkgLmdwaW8wICA9IDB4ZWQ5NiwKKwkJCSAuZ3BpbzIgID0gMHgwMGZmLAorCQkgfSwKKwkJLmJsYWNrYmlyZCA9IDEsCisJfSwKKwlbQ1g4OF9CT0FSRF9ESUdJVEFMTE9HSUNfTUVDXSA9IHsKKwkJLyogcGFyYW1zIGNvcGllZCBvdmVyIGZyb20gTGVhZHRlayBQVlIgMjAwMCAqLworCQkubmFtZSAgICAgICAgICAgPSAiRGlnaXRhbC1Mb2dpYyBNSUNST1NQQUNFIEVudGVydGFpbm1lbnQgQ2VudGVyIChNRUMpIiwKKwkJLyogbm90IHN1cmUgeWV0IGFib3V0IHRoZSB0dW5lciB0eXBlICovCisJCS50dW5lcl90eXBlICAgICA9IDM4LAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweDAwMDBiZGU2LAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wICA9IDB4MDAwMGJkZTYsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweDAwMDBiZGU2LAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLnR5cGUgICA9IENYODhfUkFESU8sCisJCQkuZ3BpbzAgID0gMHgwMDAwYmQ2MiwKKwkJfSwKKwkJLmJsYWNrYmlyZCA9IDEsCisJfSwKKwlbQ1g4OF9CT0FSRF9JT0RBVEFfR1ZCQ1RWN0VdID0geworCQkubmFtZSAgICAgICAgICAgPSAiSU9EQVRBIEdWL0JDVFY3RSIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRlExMjg2LAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMSwKKwkJCS5ncGlvMSAgPSAweDAwMDBlMDNmLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAyLAorCQkJLmdwaW8xICA9IDB4MDAwMGUwN2YsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMywKKwkJCS5ncGlvMSAgPSAweDAwMDBlMDdmLAorCQl9fQorCX0sCit9OworY29uc3QgdW5zaWduZWQgaW50IGN4ODhfYmNvdW50ID0gQVJSQVlfU0laRShjeDg4X2JvYXJkcyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUENJIHN1YnN5c3RlbSBJRHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0cnVjdCBjeDg4X3N1YmlkIGN4ODhfc3ViaWRzW10gPSB7CisJeworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHgzNDAwLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9IQVVQUEFVR0UsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDM0MDEsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0hBVVBQQVVHRSwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MTRjNywKKwkJLnN1YmRldmljZSA9IDB4MDEwNiwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfR0RJLAorCX0seworCQkuc3VidmVuZG9yID0gMHgxNGM3LAorCQkuc3ViZGV2aWNlID0gMHgwMTA3LCAvKiB3aXRoIG1wZWcgZW5jb2RlciAqLworCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9HREksCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0FUSSwKKwkJLnN1YmRldmljZSA9IDB4MDBmOCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfQVRJX1dPTkRFUl9QUk8sCisJfSx7CisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciA9IDB4MTA3ZCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlID0gMHg2NjExLAorICAgICAgICAgICAgICAgIC5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1dJTkZBU1QyMDAwWFBfRVhQRVJULAorCX0seworICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgPSAweDEwN2QsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IDB4NjYxMywJLyogTlRTQyAqLworICAgICAgICAgICAgICAgIC5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1dJTkZBU1QyMDAwWFBfRVhQRVJULAorCX0seworCQkuc3VidmVuZG9yID0gMHgxMDdkLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgPSAweDY2MjAsCisgICAgICAgICAgICAgICAgLmNhcmQgICAgICA9IENYODhfQk9BUkRfV0lORkFTVF9EVjIwMDAsCisgICAgICAgIH0seworICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgPSAweDEwN2QsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IDB4NjYzYiwKKyAgICAgICAgICAgICAgICAuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9MRUFEVEVLX1BWUjIwMDAsCisgICAgICAgIH0seworICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgPSAweDEwN2QsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IDB4NjYzQywKKyAgICAgICAgICAgICAgICAuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9MRUFEVEVLX1BWUjIwMDAsCisgICAgICAgIH0seworCQkuc3VidmVuZG9yID0gMHgxNDYxLAorCQkuc3ViZGV2aWNlID0gMHgwMDBiLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9BVkVSVFZfMzAzLAorCX0seworCQkuc3VidmVuZG9yID0gMHgxNDYyLAorCQkuc3ViZGV2aWNlID0gMHg4NjA2LAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9NU0lfVFZBTllXSEVSRV9NQVNURVIsCisJfSx7CisgCQkuc3VidmVuZG9yID0gMHgxMGZjLAorIAkJLnN1YmRldmljZSA9IDB4ZDAwMywKKyAJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0lPREFUQV9HVlZDUDNQQ0ksCisJfSx7CisgCQkuc3VidmVuZG9yID0gMHgxMDQzLAorIAkJLnN1YmRldmljZSA9IDB4NDgyMywgIC8qIHdpdGggbXBlZyBlbmNvZGVyICovCisgCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9BU1VTX1BWUl80MTYsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE3ZGUsCisJCS5zdWJkZXZpY2UgPSAweDA4YTYsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJfVCwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MThhYywKKwkJLnN1YmRldmljZSA9IDB4ZDgxMCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTEQsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE4QUMsCisJCS5zdWJkZXZpY2UgPSAweERCMDAsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1QxLAorIAl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4OTAwMiwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSEFVUFBBVUdFX0RWQl9UMSwKKyAJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE0ZjEsCisJCS5zdWJkZXZpY2UgPSAweDAxODcsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0NPTkVYQU5UX0RWQl9UMSwKKyAJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE1NDAsCisJCS5zdWJkZXZpY2UgPSAweDI1ODAsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1BST1ZJREVPX1BWMjU5LAorCX0seworCQkuc3VidmVuZG9yID0gMHgxOEFDLAorCQkuc3ViZGV2aWNlID0gMHhEQjEwLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BMVVMsCisJfSx7CisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciA9IDB4MTU1NCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlID0gMHg0ODExLAorICAgICAgICAgICAgICAgIC5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1BJWEVMVklFVywKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4NzA2MywKKwkJLnN1YmRldmljZSA9IDB4MzAwMCwgLyogSEQtMzAwMCBjYXJkICovCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1BDSERUVl9IRDMwMDAsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE3REUsCisJCS5zdWJkZXZpY2UgPSAweEE4QTYsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVCwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4MjgwMSwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSEFVUFBBVUdFX1JPU0xZTiwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MTRGMSwKKwkJLnN1YmRldmljZSA9IDB4MDM0MiwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfRElHSVRBTExPR0lDX01FQywKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MTBmYywKKwkJLnN1YmRldmljZSA9IDB4ZDAzNSwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSU9EQVRBX0dWQkNUVjdFLAorCX0KK307Citjb25zdCB1bnNpZ25lZCBpbnQgY3g4OF9pZGNvdW50ID0gQVJSQVlfU0laRShjeDg4X3N1Ymlkcyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBzb21lIGxlYWR0ZWsgc3BlY2lmaWMgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgbGVhZHRla19lZXByb20oc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdTggKmVlcHJvbV9kYXRhKQoreworCS8qIFRoaXMgaXMganVzdCBmb3IgdGhlICJXaW5mYXN0IDIwMDBYUCBFeHBlcnQiIGJvYXJkIEFUTTsgSSBkb24ndCBoYXZlIGRhdGEgb24KKwkgKiBhbnkgb3RoZXJzLgorCSAqCisJICogQnl0ZSAwIGlzIDEgb24gdGhlIE5UU0MgYm9hcmQuCisJICovCisKKwlpZiAoZWVwcm9tX2RhdGFbNF0gIT0gMHg3ZCB8fAorCSAgICBlZXByb21fZGF0YVs1XSAhPSAweDEwIHx8CisJICAgIGVlcHJvbV9kYXRhWzddICE9IDB4NjYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IExlYWR0ZWsgZWVwcm9tIGludmFsaWQuXG4iLAorCQkgICAgICAgY29yZS0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwljb3JlLT5oYXNfcmFkaW8gID0gMTsKKwljb3JlLT50dW5lcl90eXBlID0gKGVlcHJvbV9kYXRhWzZdID09IDB4MTMpID8gNDMgOiAzODsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBMZWFkdGVrIFdpbmZhc3QgMjAwMFhQIEV4cGVydCBjb25maWc6ICIKKwkgICAgICAgInR1bmVyPSVkLCBlZXByb21bMF09MHglMDJ4XG4iLAorCSAgICAgICBjb3JlLT5uYW1lLCBjb3JlLT50dW5lcl90eXBlLCBlZXByb21fZGF0YVswXSk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1OCAqZWVwcm9tX2RhdGEpCit7CisJc3RydWN0IHR2ZWVwcm9tIHR2OworCisJdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmdHYsIGVlcHJvbV9kYXRhKTsKKwljb3JlLT50dW5lcl90eXBlID0gdHYudHVuZXJfdHlwZTsKKwljb3JlLT5oYXNfcmFkaW8gID0gdHYuaGFzX3JhZGlvOworfQorCitzdGF0aWMgaW50IGhhdXBwYXVnZV9lZXByb21fZHZiKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHU4ICplZSkKK3sKKwlpbnQgbW9kZWw7CisJaW50IHR1bmVyOworCisJLyogTWFrZSBzdXJlIHdlIHN1cHBvcnQgdGhlIGJvYXJkIG1vZGVsICovCisJbW9kZWwgPSBlZVsweDFmXSA8PCAyNCB8IGVlWzB4MWVdIDw8IDE2IHwgZWVbMHgxZF0gPDwgOCB8IGVlWzB4MWNdOworCXN3aXRjaChtb2RlbCkgeworCWNhc2UgOTAwMDI6CisJY2FzZSA5MDUwMDoKKwljYXNlIDkwNTAxOgorCQkvKiBrbm93biAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIiVzOiB3YXJuaW5nOiB1bmtub3duIGhhdXBwYXVnZSBtb2RlbCAjJWRcbiIsCisJCSAgICAgICBjb3JlLT5uYW1lLCBtb2RlbCk7CisJCWJyZWFrOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBzdXBwb3J0IHRoZSB0dW5lciAqLworCXR1bmVyID0gZWVbMHgyZF07CisJc3dpdGNoKHR1bmVyKSB7CisJY2FzZSAweDRCOiAvKiBkdHQgNzU5NSAqLworCWNhc2UgMHg0QzogLyogZHR0IDc1OTIgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCIlczogZXJyb3I6IHVua25vd24gaGF1cHBhdWdlIHR1bmVyIDB4JTAyeFxuIiwKKwkJICAgICAgIGNvcmUtPm5hbWUsIHR1bmVyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBoYXVwcGF1Z2UgZWVwcm9tOiBtb2RlbD0lZCwgdHVuZXI9JWRcbiIsCisJICAgICAgIGNvcmUtPm5hbWUsIG1vZGVsLCB0dW5lcik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBzb21lIEdESSAod2FzOiBNb2R1bGFyIFRlY2hub2xvZ3kpIHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgIGlkOworCWludCAgZm07CisJY2hhciAqbmFtZTsKK30gZ2RpX3R1bmVyW10gPSB7CisJWyAweDAxIF0gPSB7IC5pZCAgID0gVFVORVJfQUJTRU5ULAorCQkgICAgIC5uYW1lID0gIk5UU0NfTSIgfSwKKwlbIDB4MDIgXSA9IHsgLmlkICAgPSBUVU5FUl9BQlNFTlQsCisJCSAgICAgLm5hbWUgPSAiUEFMX0IiIH0sCisJWyAweDAzIF0gPSB7IC5pZCAgID0gVFVORVJfQUJTRU5ULAorCQkgICAgIC5uYW1lID0gIlBBTF9JIiB9LAorCVsgMHgwNCBdID0geyAuaWQgICA9IFRVTkVSX0FCU0VOVCwKKwkJICAgICAubmFtZSA9ICJQQUxfRCIgfSwKKwlbIDB4MDUgXSA9IHsgLmlkICAgPSBUVU5FUl9BQlNFTlQsCisJCSAgICAgLm5hbWUgPSAiU0VDQU0iIH0sCisKKwlbIDB4MTAgXSA9IHsgLmlkICAgPSBUVU5FUl9BQlNFTlQsCisJCSAgICAgLmZtICAgPSAxLAorCQkgICAgIC5uYW1lID0gIlRFTUlDXzQwNDkiIH0sCisJWyAweDExIF0gPSB7IC5pZCAgID0gVFVORVJfVEVNSUNfNDEzNkZZNSwKKwkJICAgICAubmFtZSA9ICJURU1JQ180MTM2IiB9LAorCVsgMHgxMiBdID0geyAuaWQgICA9IFRVTkVSX0FCU0VOVCwKKwkJICAgICAubmFtZSA9ICJURU1JQ180MTQ2IiB9LAorCisJWyAweDIwIF0gPSB7IC5pZCAgID0gVFVORVJfUEhJTElQU19GUTEyMTZNRSwKKwkJICAgICAuZm0gICA9IDEsCisJCSAgICAgLm5hbWUgPSAiUEhJTElQU19GUTEyMTZfTUszIiB9LAorCVsgMHgyMSBdID0geyAuaWQgICA9IFRVTkVSX0FCU0VOVCwgLmZtID0gMSwKKwkJICAgICAubmFtZSA9ICJQSElMSVBTX0ZRMTIzNl9NSzMiIH0sCisJWyAweDIyIF0gPSB7IC5pZCAgID0gVFVORVJfQUJTRU5ULAorCQkgICAgIC5uYW1lID0gIlBISUxJUFNfRkkxMjM2X01LMyIgfSwKKwlbIDB4MjMgXSA9IHsgLmlkICAgPSBUVU5FUl9BQlNFTlQsCisJCSAgICAgLm5hbWUgPSAiUEhJTElQU19GSTEyMTZfTUszIiB9LAorfTsKKworc3RhdGljIHZvaWQgZ2RpX2VlcHJvbShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1OCAqZWVwcm9tX2RhdGEpCit7CisJY2hhciAqbmFtZSA9IChlZXByb21fZGF0YVsweDBkXSA8IEFSUkFZX1NJWkUoZ2RpX3R1bmVyKSkKKwkJPyBnZGlfdHVuZXJbZWVwcm9tX2RhdGFbMHgwZF1dLm5hbWUgOiBOVUxMOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdESTogdHVuZXI9JXNcbiIsIGNvcmUtPm5hbWUsCisJICAgICAgIG5hbWUgPyBuYW1lIDogInVua25vd24iKTsKKwlpZiAoTlVMTCA9PSBuYW1lKQorCQlyZXR1cm47CisJY29yZS0+dHVuZXJfdHlwZSA9IGdkaV90dW5lcltlZXByb21fZGF0YVsweDBkXV0uaWQ7CisJY29yZS0+aGFzX3JhZGlvICA9IGdkaV90dW5lcltlZXByb21fZGF0YVsweDBkXV0uZm07Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgY3g4OF9jYXJkX2xpc3Qoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlpbnQgaTsKKworCWlmICgwID09IHBjaS0+c3Vic3lzdGVtX3ZlbmRvciAmJgorCSAgICAwID09IHBjaS0+c3Vic3lzdGVtX2RldmljZSkgeworCQlwcmludGsoIiVzOiBZb3VyIGJvYXJkIGhhcyBubyB2YWxpZCBQQ0kgU3Vic3lzdGVtIElEIGFuZCB0aHVzIGNhbid0XG4iCisJCSAgICAgICAiJXM6IGJlIGF1dG9kZXRlY3RlZC4gIFBsZWFzZSBwYXNzIGNhcmQ9PG4+IGluc21vZCBvcHRpb24gdG9cbiIKKwkJICAgICAgICIlczogd29ya2Fyb3VuZCB0aGF0LiAgUmVkaXJlY3QgY29tcGxhaW50cyB0byB0aGUgdmVuZG9yIG9mXG4iCisJCSAgICAgICAiJXM6IHRoZSBUViBjYXJkLiAgQmVzdCByZWdhcmRzLFxuIgorCQkgICAgICAgIiVzOiAgICAgICAgIC0tIHR1eFxuIiwKKwkJICAgICAgIGNvcmUtPm5hbWUsY29yZS0+bmFtZSxjb3JlLT5uYW1lLGNvcmUtPm5hbWUsY29yZS0+bmFtZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIlczogWW91ciBib2FyZCBpc24ndCBrbm93biAoeWV0KSB0byB0aGUgZHJpdmVyLiAgWW91IGNhblxuIgorCQkgICAgICAgIiVzOiB0cnkgdG8gcGljayBvbmUgb2YgdGhlIGV4aXN0aW5nIGNhcmQgY29uZmlncyB2aWFcbiIKKwkJICAgICAgICIlczogY2FyZD08bj4gaW5zbW9kIG9wdGlvbi4gIFVwZGF0aW5nIHRvIHRoZSBsYXRlc3RcbiIKKwkJICAgICAgICIlczogdmVyc2lvbiBtaWdodCBoZWxwIGFzIHdlbGwuXG4iLAorCQkgICAgICAgY29yZS0+bmFtZSxjb3JlLT5uYW1lLGNvcmUtPm5hbWUsY29yZS0+bmFtZSk7CisJfQorCXByaW50aygiJXM6IEhlcmUgaXMgYSBsaXN0IG9mIHZhbGlkIGNob2ljZXMgZm9yIHRoZSBjYXJkPTxuPiBpbnNtb2Qgb3B0aW9uOlxuIiwKKwkgICAgICAgY29yZS0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IGN4ODhfYmNvdW50OyBpKyspCisJCXByaW50aygiJXM6ICAgIGNhcmQ9JWQgLT4gJXNcbiIsCisJCSAgICAgICBjb3JlLT5uYW1lLCBpLCBjeDg4X2JvYXJkc1tpXS5uYW1lKTsKK30KKwordm9pZCBjeDg4X2NhcmRfc2V0dXAoc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3sKKwlzdGF0aWMgdTggZWVwcm9tWzEyOF07CisKKwlpZiAoMCA9PSBjb3JlLT5pMmNfcmMpIHsKKwkJY29yZS0+aTJjX2NsaWVudC5hZGRyID0gMHhhMCA+PiAxOworCQl0dmVlcHJvbV9yZWFkKCZjb3JlLT5pMmNfY2xpZW50LGVlcHJvbSxzaXplb2YoZWVwcm9tKSk7CisJfQorCisJc3dpdGNoIChjb3JlLT5ib2FyZCkgeworCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0U6CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9ST1NMWU46CisJCWlmICgwID09IGNvcmUtPmkyY19yYykKKwkJCWhhdXBwYXVnZV9lZXByb20oY29yZSxlZXByb20rOCk7CisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9HREk6CisJCWlmICgwID09IGNvcmUtPmkyY19yYykKKwkJCWdkaV9lZXByb20oY29yZSxlZXByb20pOworCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVDIwMDBYUF9FWFBFUlQ6CisJCWlmICgwID09IGNvcmUtPmkyY19yYykKKwkJCWxlYWR0ZWtfZWVwcm9tKGNvcmUsZWVwcm9tKTsKKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6CisJCWlmICgwID09IGNvcmUtPmkyY19yYykKKwkJCWhhdXBwYXVnZV9lZXByb21fZHZiKGNvcmUsZWVwcm9tKTsKKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1QxOgorCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BMVVM6CisJCS8qIEdQSU8wOjAgaXMgaG9va2VkIHRvIG10MzUyIHJlc2V0IHBpbiAqLworCQljeF9zZXQoTU9fR1AwX0lPLCAweDAwMDAwMTAxKTsKKwkJY3hfY2xlYXIoTU9fR1AwX0lPLCAweDAwMDAwMDAxKTsKKwkJbXNsZWVwKDEpOworCQljeF9zZXQoTU9fR1AwX0lPLCAweDAwMDAwMTAxKTsKKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJfVDoKKwljYXNlIENYODhfQk9BUkRfRE5UVl9MSVZFX0RWQl9UOgorCQljeF9zZXQoTU9fR1AwX0lPLCAweDAwMDAwNzA3KTsKKwkJY3hfc2V0KE1PX0dQMl9JTywgMHgwMDAwMDEwMSk7CisJCWN4X2NsZWFyKE1PX0dQMl9JTywgMHgwMDAwMDAwMSk7CisJCW1zbGVlcCgxKTsKKwkJY3hfY2xlYXIoTU9fR1AwX0lPLCAweDAwMDAwMDA3KTsKKwkJY3hfc2V0KE1PX0dQMl9JTywgMHgwMDAwMDEwMSk7CisJCWJyZWFrOworCX0KKwlpZiAoY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLnJhZGlvLnR5cGUgPT0gQ1g4OF9SQURJTykKKwkJY29yZS0+aGFzX3JhZGlvID0gMTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0VYUE9SVF9TWU1CT0woY3g4OF9ib2FyZHMpOworRVhQT1JUX1NZTUJPTChjeDg4X2Jjb3VudCk7CitFWFBPUlRfU1lNQk9MKGN4ODhfc3ViaWRzKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9pZGNvdW50KTsKK0VYUE9SVF9TWU1CT0woY3g4OF9jYXJkX2xpc3QpOworRVhQT1JUX1NZTUJPTChjeDg4X2NhcmRfc2V0dXApOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YTYxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKQEAgLTAsMCArMSwxMjM5IEBACisvKgorICogJElkOiBjeDg4LWNvcmUuYyx2IDEuMjQgMjAwNS8wMS8xOSAxMjowMTo1NSBrcmF4ZWwgRXhwICQKKyAqCisgKiBkZXZpY2UgZHJpdmVyIGZvciBDb25leGFudCAyMzg4eCBiYXNlZCBUViBjYXJkcworICogZHJpdmVyIGNvcmUKKyAqCisgKiAoYykgMjAwMyBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisKKyNpbmNsdWRlICJjeDg4LmgiCisKK01PRFVMRV9ERVNDUklQVElPTigidjRsMiBkcml2ZXIgbW9kdWxlIGZvciBjeDIzODh4IGJhc2VkIFRWIGNhcmRzIik7CitNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGNvcmVfZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGNvcmVfZGVidWcsaW50LDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjb3JlX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2NvcmVdIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeSA9IFVOU0VUOworbW9kdWxlX3BhcmFtKGxhdGVuY3ksaW50LDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhsYXRlbmN5LCJwY2kgbGF0ZW5jeSB0aW1lciIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHR1bmVyW10gPSB7WzAgLi4uIChDWDg4X01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07CitzdGF0aWMgdW5zaWduZWQgaW50IGNhcmRbXSAgPSB7WzAgLi4uIChDWDg4X01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07CisKK21vZHVsZV9wYXJhbV9hcnJheSh0dW5lciwgaW50LCBOVUxMLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShjYXJkLCAgaW50LCBOVUxMLCAwNDQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyh0dW5lciwidHVuZXIgdHlwZSIpOworTU9EVUxFX1BBUk1fREVTQyhjYXJkLCJjYXJkIHR5cGUiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBuaWNhbSA9IDA7Cittb2R1bGVfcGFyYW0obmljYW0saW50LDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhuaWNhbSwidHYgYXVkaW8gaXMgbmljYW0iKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBub2NvbWIgPSAwOworbW9kdWxlX3BhcmFtKG5vY29tYixpbnQsMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vY29tYiwiZGlzYWJsZSBjb21iIGZpbHRlciIpOworCisjZGVmaW5lIGRwcmludGsobGV2ZWwsZm10LCBhcmcuLi4pCWlmIChjb3JlX2RlYnVnID49IGxldmVsKQlcCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZtdCwgY29yZS0+bmFtZSAsICMjIGFyZykKKworc3RhdGljIHVuc2lnbmVkIGludCBjeDg4X2RldmNvdW50Oworc3RhdGljIExJU1RfSEVBRChjeDg4X2Rldmxpc3QpOworc3RhdGljIERFQ0xBUkVfTVVURVgoZGV2bGlzdCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZGVidWcgaGVscCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBjb25zdCBjaGFyICp2NGwxX2lvY3Rsc1tdID0geworCSIwIiwgIkNHQVAiLCAiR0NIQU4iLCAiU0NIQU4iLCAiR1RVTkVSIiwgIlNUVU5FUiIsICJHUElDVCIsICJTUElDVCIsCisJIkNDQVBUVVJFIiwgIkdXSU4iLCAiU1dJTiIsICJHRkJVRiIsICJTRkJVRiIsICJLRVkiLCAiR0ZSRVEiLAorCSJTRlJFUSIsICJHQVVESU8iLCAiU0FVRElPIiwgIlNZTkMiLCAiTUNBUFRVUkUiLCAiR01CVUYiLCAiR1VOSVQiLAorCSJHQ0FQVFVSRSIsICJTQ0FQVFVSRSIsICJTUExBWU1PREUiLCAiU1dSSVRFTU9ERSIsICJHUExBWUlORk8iLAorCSJTTUlDUk9DT0RFIiwgIkdWQklGTVQiLCAiU1ZCSUZNVCIgfTsKKyNkZWZpbmUgVjRMMV9JT0NUTFMgQVJSQVlfU0laRSh2NGwxX2lvY3RscykKKworc3RhdGljIGNvbnN0IGNoYXIgKnY0bDJfaW9jdGxzW10gPSB7CisJIlFVRVJZQ0FQIiwgIjEiLCAiRU5VTV9QSVhGTVQiLCAiRU5VTV9GQlVGRk1UIiwgIkdfRk1UIiwgIlNfRk1UIiwKKwkiR19DT01QIiwgIlNfQ09NUCIsICJSRVFCVUZTIiwgIlFVRVJZQlVGIiwgIkdfRkJVRiIsICJTX0ZCVUYiLAorCSJHX1dJTiIsICJTX1dJTiIsICJQUkVWSUVXIiwgIlFCVUYiLCAiMTYiLCAiRFFCVUYiLCAiU1RSRUFNT04iLAorCSJTVFJFQU1PRkYiLCAiR19QRVJGIiwgIkdfUEFSTSIsICJTX1BBUk0iLCAiR19TVEQiLCAiU19TVEQiLAorCSJFTlVNU1REIiwgIkVOVU1JTlBVVCIsICJHX0NUUkwiLCAiU19DVFJMIiwgIkdfVFVORVIiLCAiU19UVU5FUiIsCisJIkdfRlJFUSIsICJTX0ZSRVEiLCAiR19BVURJTyIsICJTX0FVRElPIiwgIjM1IiwgIlFVRVJZQ1RSTCIsCisJIlFVRVJZTUVOVSIsICJHX0lOUFVUIiwgIlNfSU5QVVQiLCAiRU5VTUNWVCIsICI0MSIsICI0MiIsICI0MyIsCisJIjQ0IiwgIjQ1IiwgICJHX09VVFBVVCIsICJTX09VVFBVVCIsICJFTlVNT1VUUFVUIiwgIkdfQVVET1VUIiwKKwkiU19BVURPVVQiLCAiRU5VTUZYIiwgIkdfRUZGRUNUIiwgIlNfRUZGRUNUIiwgIkdfTU9EVUxBVE9SIiwKKwkiU19NT0RVTEFUT1IiCit9OworI2RlZmluZSBWNEwyX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDJfaW9jdGxzKQorCit2b2lkIGN4ODhfcHJpbnRfaW9jdGwoY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGNtZCkKK3sKKwljaGFyICpkaXI7CisKKwlzd2l0Y2ggKF9JT0NfRElSKGNtZCkpIHsKKwljYXNlIF9JT0NfTk9ORTogICAgICAgICAgICAgIGRpciA9ICItLSI7IGJyZWFrOworCWNhc2UgX0lPQ19SRUFEOiAgICAgICAgICAgICAgZGlyID0gInItIjsgYnJlYWs7CisJY2FzZSBfSU9DX1dSSVRFOiAgICAgICAgICAgICBkaXIgPSAiLXciOyBicmVhazsKKwljYXNlIF9JT0NfUkVBRCB8IF9JT0NfV1JJVEU6IGRpciA9ICJydyI7IGJyZWFrOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgZGlyID0gIj8/IjsgYnJlYWs7CisJfQorCXN3aXRjaCAoX0lPQ19UWVBFKGNtZCkpIHsKKwljYXNlICd2JzoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKHY0bDEsICVzLCBWSURJT0MlcylcbiIsCisJCSAgICAgICBuYW1lLCBjbWQsIGRpciwgKF9JT0NfTlIoY21kKSA8IFY0TDFfSU9DVExTKSA/CisJCSAgICAgICB2NGwxX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIj8/PyIpOworCQlicmVhazsKKwljYXNlICdWJzoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKHY0bDIsICVzLCBWSURJT0NfJXMpXG4iLAorCQkgICAgICAgbmFtZSwgY21kLCBkaXIsIChfSU9DX05SKGNtZCkgPCBWNEwyX0lPQ1RMUykgPworCQkgICAgICAgdjRsMl9pb2N0bHNbX0lPQ19OUihjbWQpXSA6ICI/Pz8iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKD8/PywgJXMsICMlZClcbiIsCisJCSAgICAgICBuYW1lLCBjbWQsIGRpciwgX0lPQ19OUihjbWQpKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBOT19TWU5DX0xJTkUgKC0xVSkKKworc3RhdGljIHUzMiogY3g4OF9yaXNjX2ZpZWxkKHUzMiAqcnAsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkJICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHUzMiBzeW5jX2xpbmUsCisJCQkgICAgdW5zaWduZWQgaW50IGJwbCwgdW5zaWduZWQgaW50IHBhZGRpbmcsCisJCQkgICAgdW5zaWduZWQgaW50IGxpbmVzKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdW5zaWduZWQgaW50IGxpbmUsdG9kbzsKKworCS8qIHN5bmMgaW5zdHJ1Y3Rpb24gKi8KKwlpZiAoc3luY19saW5lICE9IE5PX1NZTkNfTElORSkKKwkJKihycCsrKSA9IGNwdV90b19sZTMyKFJJU0NfUkVTWU5DIHwgc3luY19saW5lKTsKKworCS8qIHNjYW4gbGluZXMgKi8KKwlzZyA9IHNnbGlzdDsKKwlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgbGluZXM7IGxpbmUrKykgeworCQl3aGlsZSAob2Zmc2V0ICYmIG9mZnNldCA+PSBzZ19kbWFfbGVuKHNnKSkgeworCQkJb2Zmc2V0IC09IHNnX2RtYV9sZW4oc2cpOworCQkJc2crKzsKKwkJfQorCQlpZiAoYnBsIDw9IHNnX2RtYV9sZW4oc2cpLW9mZnNldCkgeworCQkJLyogZml0cyBpbnRvIGN1cnJlbnQgY2h1bmsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICoocnArKyk9Y3B1X3RvX2xlMzIoUklTQ19XUklURXxSSVNDX1NPTHxSSVNDX0VPTHxicGwpOworICAgICAgICAgICAgICAgICAgICAgICAgKihycCsrKT1jcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzZykrb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCs9YnBsOworCQl9IGVsc2UgeworCQkJLyogc2NhbmxpbmUgbmVlZHMgdG8gYmUgc3BsaXR0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRvZG8gPSBicGw7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHJwKyspPWNwdV90b19sZTMyKFJJU0NfV1JJVEV8UklTQ19TT0x8CisJCQkJCSAgICAoc2dfZG1hX2xlbihzZyktb2Zmc2V0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHJwKyspPWNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKHNnKStvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgdG9kbyAtPSAoc2dfZG1hX2xlbihzZyktb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzZysrOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRvZG8gPiBzZ19kbWFfbGVuKHNnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJwKyspPWNwdV90b19sZTMyKFJJU0NfV1JJVEV8CisJCQkJCQkgICAgc2dfZG1hX2xlbihzZykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJwKyspPWNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCQkJdG9kbyAtPSBzZ19kbWFfbGVuKHNnKTsKKwkJCQlzZysrOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgKihycCsrKT1jcHVfdG9fbGUzMihSSVNDX1dSSVRFfFJJU0NfRU9MfHRvZG8pOworCQkJKihycCsrKT1jcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzZykpOworCQkJb2Zmc2V0ICs9IHRvZG87CisJCX0KKwkJb2Zmc2V0ICs9IHBhZGRpbmc7CisJfQorCisJcmV0dXJuIHJwOworfQorCitpbnQgY3g4OF9yaXNjX2J1ZmZlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkgICAgIHVuc2lnbmVkIGludCB0b3Bfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgYm90dG9tX29mZnNldCwKKwkJICAgICB1bnNpZ25lZCBpbnQgYnBsLCB1bnNpZ25lZCBpbnQgcGFkZGluZywgdW5zaWduZWQgaW50IGxpbmVzKQoreworCXUzMiBpbnN0cnVjdGlvbnMsZmllbGRzOworCXUzMiAqcnA7CisJaW50IHJjOworCisJZmllbGRzID0gMDsKKwlpZiAoVU5TRVQgIT0gdG9wX29mZnNldCkKKwkJZmllbGRzKys7CisJaWYgKFVOU0VUICE9IGJvdHRvbV9vZmZzZXQpCisJCWZpZWxkcysrOworCisJLyogZXN0aW1hdGUgcmlzYyBtZW06IHdvcnN0IGNhc2UgaXMgb25lIHdyaXRlIHBlciBwYWdlIGJvcmRlciArCisJICAgb25lIHdyaXRlIHBlciBzY2FuIGxpbmUgKyBzeW5jcyArIGp1bXAgKGFsbCAyIGR3b3JkcykgKi8KKwlpbnN0cnVjdGlvbnMgID0gKGJwbCAqIGxpbmVzICogZmllbGRzKSAvIFBBR0VfU0laRSArIGxpbmVzICogZmllbGRzOworCWluc3RydWN0aW9ucyArPSAzICsgNDsKKwlpZiAoKHJjID0gYnRjeF9yaXNjbWVtX2FsbG9jKHBjaSxyaXNjLGluc3RydWN0aW9ucyo4KSkgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiB3cml0ZSByaXNjIGluc3RydWN0aW9ucyAqLworCXJwID0gcmlzYy0+Y3B1OworCWlmIChVTlNFVCAhPSB0b3Bfb2Zmc2V0KQorCQlycCA9IGN4ODhfcmlzY19maWVsZChycCwgc2dsaXN0LCB0b3Bfb2Zmc2V0LCAwLAorCQkJCSAgICAgYnBsLCBwYWRkaW5nLCBsaW5lcyk7CisJaWYgKFVOU0VUICE9IGJvdHRvbV9vZmZzZXQpCisJCXJwID0gY3g4OF9yaXNjX2ZpZWxkKHJwLCBzZ2xpc3QsIGJvdHRvbV9vZmZzZXQsIDB4MjAwLAorCQkJCSAgICAgYnBsLCBwYWRkaW5nLCBsaW5lcyk7CisKKwkvKiBzYXZlIHBvaW50ZXIgdG8gam1wIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KKwlyaXNjLT5qbXAgPSBycDsKKwlCVUdfT04oKHJpc2MtPmptcCAtIHJpc2MtPmNwdSArIDIpIC8gNCA+IHJpc2MtPnNpemUpOworCXJldHVybiAwOworfQorCitpbnQgY3g4OF9yaXNjX2RhdGFidWZmZXIoc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IGJ0Y3hfcmlzY21lbSAqcmlzYywKKwkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgdW5zaWduZWQgaW50IGJwbCwKKwkJCSB1bnNpZ25lZCBpbnQgbGluZXMpCit7CisJdTMyIGluc3RydWN0aW9uczsKKwl1MzIgKnJwOworCWludCByYzsKKworCS8qIGVzdGltYXRlIHJpc2MgbWVtOiB3b3JzdCBjYXNlIGlzIG9uZSB3cml0ZSBwZXIgcGFnZSBib3JkZXIgKworCSAgIG9uZSB3cml0ZSBwZXIgc2NhbiBsaW5lICsgc3luY3MgKyBqdW1wIChhbGwgMiBkd29yZHMpICovCisJaW5zdHJ1Y3Rpb25zICA9IChicGwgKiBsaW5lcykgLyBQQUdFX1NJWkUgKyBsaW5lczsKKwlpbnN0cnVjdGlvbnMgKz0gMyArIDQ7CisJaWYgKChyYyA9IGJ0Y3hfcmlzY21lbV9hbGxvYyhwY2kscmlzYyxpbnN0cnVjdGlvbnMqOCkpIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogd3JpdGUgcmlzYyBpbnN0cnVjdGlvbnMgKi8KKwlycCA9IHJpc2MtPmNwdTsKKwlycCA9IGN4ODhfcmlzY19maWVsZChycCwgc2dsaXN0LCAwLCBOT19TWU5DX0xJTkUsIGJwbCwgMCwgbGluZXMpOworCisJLyogc2F2ZSBwb2ludGVyIHRvIGptcCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCisJcmlzYy0+am1wID0gcnA7CisJQlVHX09OKChyaXNjLT5qbXAgLSByaXNjLT5jcHUgKyAyKSAvIDQgPiByaXNjLT5zaXplKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGN4ODhfcmlzY19zdG9wcGVyKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCisJCSAgICAgIHUzMiByZWcsIHUzMiBtYXNrLCB1MzIgdmFsdWUpCit7CisJdTMyICpycDsKKwlpbnQgcmM7CisKKwlpZiAoKHJjID0gYnRjeF9yaXNjbWVtX2FsbG9jKHBjaSwgcmlzYywgNCoxNikpIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogd3JpdGUgcmlzYyBpbnN0cnVjdGlvbnMgKi8KKwlycCA9IHJpc2MtPmNwdTsKKwkqKHJwKyspID0gY3B1X3RvX2xlMzIoUklTQ19XUklURUNSICB8IFJJU0NfSVJRMiB8IFJJU0NfSU1NKTsKKwkqKHJwKyspID0gY3B1X3RvX2xlMzIocmVnKTsKKwkqKHJwKyspID0gY3B1X3RvX2xlMzIodmFsdWUpOworCSoocnArKykgPSBjcHVfdG9fbGUzMihtYXNrKTsKKwkqKHJwKyspID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QKTsKKwkqKHJwKyspID0gY3B1X3RvX2xlMzIocmlzYy0+ZG1hKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorY3g4OF9mcmVlX2J1ZmZlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZikKK3sKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCUJVRygpOworCXZpZGVvYnVmX3dhaXRvbigmYnVmLT52YiwwLDApOworCXZpZGVvYnVmX2RtYV9wY2lfdW5tYXAocGNpLCAmYnVmLT52Yi5kbWEpOworCXZpZGVvYnVmX2RtYV9mcmVlKCZidWYtPnZiLmRtYSk7CisJYnRjeF9yaXNjbWVtX2ZyZWUocGNpLCAmYnVmLT5yaXNjKTsKKwlidWYtPnZiLnN0YXRlID0gU1RBVEVfTkVFRFNfSU5JVDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBvdXIgU1JBTSBtZW1vcnkgbGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogd2UgYXJlIGdvaW5nIHRvIHB1dCBhbGwgdGhyIHJpc2MgcHJvZ3JhbXMgaW50byBob3N0IG1lbW9yeSwgc28gd2UKKyAqIGNhbiB1c2UgdGhlIHdob2xlIFNEUkFNIGZvciB0aGUgRE1BIGZpZm9zLiAgVG8gc2ltcGxpZnkgdGhpbmdzLCB3ZQorICogdXNlIGEgc3RhdGljIG1lbW9yeSBsYXlvdXQuICBUaGF0IHN1cmVseSB3aWxsIHdhc3RlIG1lbW9yeSBpbiBjYXNlCisgKiB3ZSBkb24ndCB1c2UgYWxsIERNQSBjaGFubmVscyBhdCB0aGUgc2FtZSB0aW1lICh3aGljaCB3aWxsIGJlIHRoZQorICogY2FzZSBtb3N0IG9mIHRoZSB0aW1lKS4gIEJ1dCB0aGF0IHN0aWxsIGdpdmVzIHVzIGVub3VndGggRklGTyBzcGFjZQorICogdG8gYmUgYWJsZSB0byBkZWFsIHdpdGggaW5zYW5lIGxvbmcgcGNpIGxhdGVuY2llcyAuLi4KKyAqCisgKiBGSUZPIHNwYWNlIGFsbG9jYXRpb25zOgorICogICAgY2hhbm5lbCAgMjEgICAgKHkgdmlkZW8pICAtIDEwLjBrCisgKiAgICBjaGFubmVsICAyMiAgICAodSB2aWRlbykgIC0gIDIuMGsKKyAqICAgIGNoYW5uZWwgIDIzICAgICh2IHZpZGVvKSAgLSAgMi4waworICogICAgY2hhbm5lbCAgMjQgICAgKHZiaSkgICAgICAtICA0LjBrCisgKiAgICBjaGFubmVscyAyNSsyNiAoYXVkaW8pICAgIC0gIDAuNWsKKyAqICAgIGNoYW5uZWwgIDI4ICAgIChtcGVnKSAgICAgLSAgNC4waworICogICAgVE9UQUwgICAgICAgICAgICAgICAgICAgICA9IDI1LjVrCisgKgorICogRXZlcnkgY2hhbm5lbCBoYXMgMTYwIGJ5dGVzIGNvbnRyb2wgZGF0YSAoNjQgYnl0ZXMgaW5zdHJ1Y3Rpb24KKyAqIHF1ZXVlIGFuZCA2IENEVCBlbnRyaWVzKSwgd2hpY2ggaXMgY2xvc2UgdG8gMmsgdG90YWwuCisgKgorICogQWRkcmVzcyBsYXlvdXQ6CisgKiAgICAweDAwMDAgLSAweDAzZmYgICAgQ01EcyAvIHJlc2VydmVkCisgKiAgICAweDA0MDAgLSAweDBiZmYgICAgaW5zdHJ1Y3Rpb24gcXVldWVzICsgQ0RzCisgKiAgICAweDBjMDAgLSAgICAgICAgICAgRklGT3MKKyAqLworCitzdHJ1Y3Qgc3JhbV9jaGFubmVsIGN4ODhfc3JhbV9jaGFubmVsc1tdID0geworCVtTUkFNX0NIMjFdID0geworCQkubmFtZSAgICAgICA9ICJ2aWRlbyB5IC8gcGFja2VkIiwKKwkJLmNtZHNfc3RhcnQgPSAweDE4MDA0MCwKKwkJLmN0cmxfc3RhcnQgPSAweDE4MDQwMCwKKwkgICAgICAgIC5jZHQgICAgICAgID0gMHgxODA0MDAgKyA2NCwKKwkJLmZpZm9fc3RhcnQgPSAweDE4MGMwMCwKKwkJLmZpZm9fc2l6ZSAgPSAweDAwMjgwMCwKKwkJLnB0cjFfcmVnICAgPSBNT19ETUEyMV9QVFIxLAorCQkucHRyMl9yZWcgICA9IE1PX0RNQTIxX1BUUjIsCisJCS5jbnQxX3JlZyAgID0gTU9fRE1BMjFfQ05UMSwKKwkJLmNudDJfcmVnICAgPSBNT19ETUEyMV9DTlQyLAorCX0sCisJW1NSQU1fQ0gyMl0gPSB7CisJCS5uYW1lICAgICAgID0gInZpZGVvIHUiLAorCQkuY21kc19zdGFydCA9IDB4MTgwMDgwLAorCQkuY3RybF9zdGFydCA9IDB4MTgwNGEwLAorCSAgICAgICAgLmNkdCAgICAgICAgPSAweDE4MDRhMCArIDY0LAorCQkuZmlmb19zdGFydCA9IDB4MTgzNDAwLAorCQkuZmlmb19zaXplICA9IDB4MDAwODAwLAorCQkucHRyMV9yZWcgICA9IE1PX0RNQTIyX1BUUjEsCisJCS5wdHIyX3JlZyAgID0gTU9fRE1BMjJfUFRSMiwKKwkJLmNudDFfcmVnICAgPSBNT19ETUEyMl9DTlQxLAorCQkuY250Ml9yZWcgICA9IE1PX0RNQTIyX0NOVDIsCisJfSwKKwlbU1JBTV9DSDIzXSA9IHsKKwkJLm5hbWUgICAgICAgPSAidmlkZW8gdiIsCisJCS5jbWRzX3N0YXJ0ID0gMHgxODAwYzAsCisJCS5jdHJsX3N0YXJ0ID0gMHgxODA1NDAsCisJICAgICAgICAuY2R0ICAgICAgICA9IDB4MTgwNTQwICsgNjQsCisJCS5maWZvX3N0YXJ0ID0gMHgxODNjMDAsCisJCS5maWZvX3NpemUgID0gMHgwMDA4MDAsCisJCS5wdHIxX3JlZyAgID0gTU9fRE1BMjNfUFRSMSwKKwkJLnB0cjJfcmVnICAgPSBNT19ETUEyM19QVFIyLAorCQkuY250MV9yZWcgICA9IE1PX0RNQTIzX0NOVDEsCisJCS5jbnQyX3JlZyAgID0gTU9fRE1BMjNfQ05UMiwKKwl9LAorCVtTUkFNX0NIMjRdID0geworCQkubmFtZSAgICAgICA9ICJ2YmkiLAorCQkuY21kc19zdGFydCA9IDB4MTgwMTAwLAorCQkuY3RybF9zdGFydCA9IDB4MTgwNWUwLAorCSAgICAgICAgLmNkdCAgICAgICAgPSAweDE4MDVlMCArIDY0LAorCQkuZmlmb19zdGFydCA9IDB4MTg0NDAwLAorCQkuZmlmb19zaXplICA9IDB4MDAxMDAwLAorCQkucHRyMV9yZWcgICA9IE1PX0RNQTI0X1BUUjEsCisJCS5wdHIyX3JlZyAgID0gTU9fRE1BMjRfUFRSMiwKKwkJLmNudDFfcmVnICAgPSBNT19ETUEyNF9DTlQxLAorCQkuY250Ml9yZWcgICA9IE1PX0RNQTI0X0NOVDIsCisJfSwKKwlbU1JBTV9DSDI1XSA9IHsKKwkJLm5hbWUgICAgICAgPSAiYXVkaW8gZnJvbSIsCisJCS5jbWRzX3N0YXJ0ID0gMHgxODAxNDAsCisJCS5jdHJsX3N0YXJ0ID0gMHgxODA2ODAsCisJICAgICAgICAuY2R0ICAgICAgICA9IDB4MTgwNjgwICsgNjQsCisJCS5maWZvX3N0YXJ0ID0gMHgxODU0MDAsCisJCS5maWZvX3NpemUgID0gMHgwMDAyMDAsCisJCS5wdHIxX3JlZyAgID0gTU9fRE1BMjVfUFRSMSwKKwkJLnB0cjJfcmVnICAgPSBNT19ETUEyNV9QVFIyLAorCQkuY250MV9yZWcgICA9IE1PX0RNQTI1X0NOVDEsCisJCS5jbnQyX3JlZyAgID0gTU9fRE1BMjVfQ05UMiwKKwl9LAorCVtTUkFNX0NIMjZdID0geworCQkubmFtZSAgICAgICA9ICJhdWRpbyB0byIsCisJCS5jbWRzX3N0YXJ0ID0gMHgxODAxODAsCisJCS5jdHJsX3N0YXJ0ID0gMHgxODA3MjAsCisJICAgICAgICAuY2R0ICAgICAgICA9IDB4MTgwNjgwICsgNjQsICAvKiBzYW1lIGFzIGF1ZGlvIElOICovCisJCS5maWZvX3N0YXJ0ID0gMHgxODU0MDAsICAgICAgIC8qIHNhbWUgYXMgYXVkaW8gSU4gKi8KKwkJLmZpZm9fc2l6ZSAgPSAweDAwMDIwMCwgICAgICAgLyogc2FtZSBhcyBhdWRpbyBJTiAqLworCQkucHRyMV9yZWcgICA9IE1PX0RNQTI2X1BUUjEsCisJCS5wdHIyX3JlZyAgID0gTU9fRE1BMjZfUFRSMiwKKwkJLmNudDFfcmVnICAgPSBNT19ETUEyNl9DTlQxLAorCQkuY250Ml9yZWcgICA9IE1PX0RNQTI2X0NOVDIsCisJfSwKKwlbU1JBTV9DSDI4XSA9IHsKKwkJLm5hbWUgICAgICAgPSAibXBlZyIsCisJCS5jbWRzX3N0YXJ0ID0gMHgxODAyMDAsCisJCS5jdHJsX3N0YXJ0ID0gMHgxODA3QzAsCisJCS5jZHQgICAgICAgID0gMHgxODA3QzAgKyA2NCwKKwkJLmZpZm9fc3RhcnQgPSAweDE4NTYwMCwKKwkJLmZpZm9fc2l6ZSAgPSAweDAwMTAwMCwKKwkJLnB0cjFfcmVnICAgPSBNT19ETUEyOF9QVFIxLAorCQkucHRyMl9yZWcgICA9IE1PX0RNQTI4X1BUUjIsCisJCS5jbnQxX3JlZyAgID0gTU9fRE1BMjhfQ05UMSwKKwkJLmNudDJfcmVnICAgPSBNT19ETUEyOF9DTlQyLAorCX0sCit9OworCitpbnQgY3g4OF9zcmFtX2NoYW5uZWxfc2V0dXAoc3RydWN0IGN4ODhfY29yZSAqY29yZSwKKwkJCSAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgYnBsLCB1MzIgcmlzYykKK3sKKwl1bnNpZ25lZCBpbnQgaSxsaW5lczsKKwl1MzIgY2R0OworCisJYnBsICAgPSAoYnBsICsgNykgJiB+NzsgLyogYWxpZ25tZW50ICovCisJY2R0ICAgPSBjaC0+Y2R0OworCWxpbmVzID0gY2gtPmZpZm9fc2l6ZSAvIGJwbDsKKwlpZiAobGluZXMgPiA2KQorCQlsaW5lcyA9IDY7CisJQlVHX09OKGxpbmVzIDwgMik7CisKKwkvKiB3cml0ZSBDRFQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGluZXM7IGkrKykKKwkJY3hfd3JpdGUoY2R0ICsgMTYqaSwgY2gtPmZpZm9fc3RhcnQgKyBicGwqaSk7CisKKwkvKiB3cml0ZSBDTURTICovCisJY3hfd3JpdGUoY2gtPmNtZHNfc3RhcnQgKyAgMCwgcmlzYyk7CisJY3hfd3JpdGUoY2gtPmNtZHNfc3RhcnQgKyAgNCwgY2R0KTsKKwljeF93cml0ZShjaC0+Y21kc19zdGFydCArICA4LCAobGluZXMqMTYpID4+IDMpOworCWN4X3dyaXRlKGNoLT5jbWRzX3N0YXJ0ICsgMTIsIGNoLT5jdHJsX3N0YXJ0KTsKKwljeF93cml0ZShjaC0+Y21kc19zdGFydCArIDE2LCA2NCA+PiAyKTsKKwlmb3IgKGkgPSAyMDsgaSA8IDY0OyBpICs9IDQpCisJCWN4X3dyaXRlKGNoLT5jbWRzX3N0YXJ0ICsgaSwgMCk7CisKKwkvKiBmaWxsIHJlZ2lzdGVycyAqLworCWN4X3dyaXRlKGNoLT5wdHIxX3JlZywgY2gtPmZpZm9fc3RhcnQpOworCWN4X3dyaXRlKGNoLT5wdHIyX3JlZywgY2R0KTsKKwljeF93cml0ZShjaC0+Y250MV9yZWcsIChicGwgPj4gMykgLTEpOworCWN4X3dyaXRlKGNoLT5jbnQyX3JlZywgKGxpbmVzKjE2KSA+PiAzKTsKKworCWRwcmludGsoMiwic3JhbSBzZXR1cCAlczogYnBsPSVkIGxpbmVzPSVkXG4iLCBjaC0+bmFtZSwgYnBsLCBsaW5lcyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZGVidWcgaGVscGVyIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2ludCBjeDg4X3Jpc2NfZGVjb2RlKHUzMiByaXNjKQoreworCXN0YXRpYyBjaGFyICppbnN0clsxNl0gPSB7CisJCVsgUklTQ19TWU5DICAgID4+IDI4IF0gPSAic3luYyIsCisJCVsgUklTQ19XUklURSAgID4+IDI4IF0gPSAid3JpdGUiLAorCQlbIFJJU0NfV1JJVEVDICA+PiAyOCBdID0gIndyaXRlYyIsCisJCVsgUklTQ19SRUFEICAgID4+IDI4IF0gPSAicmVhZCIsCisJCVsgUklTQ19SRUFEQyAgID4+IDI4IF0gPSAicmVhZGMiLAorCQlbIFJJU0NfSlVNUCAgICA+PiAyOCBdID0gImp1bXAiLAorCQlbIFJJU0NfU0tJUCAgICA+PiAyOCBdID0gInNraXAiLAorCQlbIFJJU0NfV1JJVEVSTSA+PiAyOCBdID0gIndyaXRlcm0iLAorCQlbIFJJU0NfV1JJVEVDTSA+PiAyOCBdID0gIndyaXRlY20iLAorCQlbIFJJU0NfV1JJVEVDUiA+PiAyOCBdID0gIndyaXRlY3IiLAorCX07CisJc3RhdGljIGludCBpbmNyWzE2XSA9IHsKKwkJWyBSSVNDX1dSSVRFICAgPj4gMjggXSA9IDIsCisJCVsgUklTQ19KVU1QICAgID4+IDI4IF0gPSAyLAorCQlbIFJJU0NfV1JJVEVSTSA+PiAyOCBdID0gMywKKwkJWyBSSVNDX1dSSVRFQ00gPj4gMjggXSA9IDMsCisJCVsgUklTQ19XUklURUNSID4+IDI4IF0gPSA0LAorCX07CisJc3RhdGljIGNoYXIgKmJpdHNbXSA9IHsKKwkJIjEyIiwgICAiMTMiLCAgICIxNCIsICAgInJlc3luYyIsCisJCSJjbnQwIiwgImNudDEiLCAiMTgiLCAgICIxOSIsCisJCSIyMCIsICAgIjIxIiwgICAiMjIiLCAgICIyMyIsCisJCSJpcnExIiwgImlycTIiLCAiZW9sIiwgICJzb2wiLAorCX07CisJaW50IGk7CisKKwlwcmludGsoIjB4JTA4eCBbICVzIiwgcmlzYywKKwkgICAgICAgaW5zdHJbcmlzYyA+PiAyOF0gPyBpbnN0cltyaXNjID4+IDI4XSA6ICJJTlZBTElEIik7CisJZm9yIChpID0gQVJSQVlfU0laRShiaXRzKS0xOyBpID49IDA7IGktLSkKKwkJaWYgKHJpc2MgJiAoMSA8PCAoaSArIDEyKSkpCisJCQlwcmludGsoIiAlcyIsYml0c1tpXSk7CisJcHJpbnRrKCIgY291bnQ9JWQgXVxuIiwgcmlzYyAmIDB4ZmZmKTsKKwlyZXR1cm4gaW5jcltyaXNjID4+IDI4XSA/IGluY3JbcmlzYyA+PiAyOF0gOiAxOworfQorCisjaWYgMCAvKiBjdXJyZW50bHkgdW51c2VkLCBidXQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgKi8KK3ZvaWQgY3g4OF9yaXNjX2Rpc2FzbShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLAorCQkgICAgICBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjKQoreworCXVuc2lnbmVkIGludCBpLGosbjsKKworCXByaW50aygiJXM6IHJpc2MgZGlzYXNtOiAlcCBbZG1hPTB4JTA4bHhdXG4iLAorCSAgICAgICBjb3JlLT5uYW1lLCByaXNjLT5jcHUsICh1bnNpZ25lZCBsb25nKXJpc2MtPmRtYSk7CisJZm9yIChpID0gMDsgaSA8IChyaXNjLT5zaXplID4+IDIpOyBpICs9IG4pIHsKKwkJcHJpbnRrKCIlczogICAlMDRkOiAiLCBjb3JlLT5uYW1lLCBpKTsKKwkJbiA9IGN4ODhfcmlzY19kZWNvZGUocmlzYy0+Y3B1W2ldKTsKKwkJZm9yIChqID0gMTsgaiA8IG47IGorKykKKwkJCXByaW50aygiJXM6ICAgJTA0ZDogMHglMDh4IFsgYXJnICMlZCBdXG4iLAorCQkJICAgICAgIGNvcmUtPm5hbWUsIGkraiwgcmlzYy0+Y3B1W2kral0sIGopOworCQlpZiAocmlzYy0+Y3B1W2ldID09IFJJU0NfSlVNUCkKKwkJCWJyZWFrOworCX0KK30KKyNlbmRpZgorCit2b2lkIGN4ODhfc3JhbV9jaGFubmVsX2R1bXAoc3RydWN0IGN4ODhfY29yZSAqY29yZSwKKwkJCSAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaCkKK3sKKwlzdGF0aWMgY2hhciAqbmFtZVtdID0geworCQkiaW5pdGlhbCByaXNjIiwKKwkJImNkdCBiYXNlIiwKKwkJImNkdCBzaXplIiwKKwkJImlxIGJhc2UiLAorCQkiaXEgc2l6ZSIsCisJCSJyaXNjIHBjIiwKKwkJImlxIHdyIHB0ciIsCisJCSJpcSByZCBwdHIiLAorCQkiY2R0IGN1cnJlbnQiLAorCQkicGNpIHRhcmdldCIsCisJCSJsaW5lIC8gYnl0ZSIsCisJfTsKKwl1MzIgcmlzYzsKKwl1bnNpZ25lZCBpbnQgaSxqLG47CisKKwlwcmludGsoIiVzOiAlcyAtIGRtYSBjaGFubmVsIHN0YXR1cyBkdW1wXG4iLAorCSAgICAgICBjb3JlLT5uYW1lLGNoLT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuYW1lKTsgaSsrKQorCQlwcmludGsoIiVzOiAgIGNtZHM6ICUtMTJzOiAweCUwOHhcbiIsCisJCSAgICAgICBjb3JlLT5uYW1lLG5hbWVbaV0sCisJCSAgICAgICBjeF9yZWFkKGNoLT5jbWRzX3N0YXJ0ICsgNCppKSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlyaXNjID0gY3hfcmVhZChjaC0+Y21kc19zdGFydCArIDQgKiAoaSsxMSkpOworCQlwcmludGsoIiVzOiAgIHJpc2MlZDogIiwgY29yZS0+bmFtZSwgaSk7CisJCWN4ODhfcmlzY19kZWNvZGUocmlzYyk7CisJfQorCWZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSBuKSB7CisJCXJpc2MgPSBjeF9yZWFkKGNoLT5jdHJsX3N0YXJ0ICsgNCAqIGkpOworCQlwcmludGsoIiVzOiAgIGlxICV4OiAiLCBjb3JlLT5uYW1lLCBpKTsKKwkJbiA9IGN4ODhfcmlzY19kZWNvZGUocmlzYyk7CisJCWZvciAoaiA9IDE7IGogPCBuOyBqKyspIHsKKwkJCXJpc2MgPSBjeF9yZWFkKGNoLT5jdHJsX3N0YXJ0ICsgNCAqIChpK2opKTsKKwkJCXByaW50aygiJXM6ICAgaXEgJXg6IDB4JTA4eCBbIGFyZyAjJWQgXVxuIiwKKwkJCSAgICAgICBjb3JlLT5uYW1lLCBpK2osIHJpc2MsIGopOworCQl9CisJfQorCisJcHJpbnRrKCIlczogZmlmbzogMHglMDh4IC0+IDB4JXhcbiIsCisJICAgICAgIGNvcmUtPm5hbWUsIGNoLT5maWZvX3N0YXJ0LCBjaC0+Zmlmb19zdGFydCtjaC0+Zmlmb19zaXplKTsKKwlwcmludGsoIiVzOiBjdHJsOiAweCUwOHggLT4gMHgleFxuIiwKKwkgICAgICAgY29yZS0+bmFtZSwgY2gtPmN0cmxfc3RhcnQsIGNoLT5jdHJsX3N0YXJ0KzYqMTYpOworCXByaW50aygiJXM6ICAgcHRyMV9yZWc6IDB4JTA4eFxuIiwKKwkgICAgICAgY29yZS0+bmFtZSxjeF9yZWFkKGNoLT5wdHIxX3JlZykpOworCXByaW50aygiJXM6ICAgcHRyMl9yZWc6IDB4JTA4eFxuIiwKKwkgICAgICAgY29yZS0+bmFtZSxjeF9yZWFkKGNoLT5wdHIyX3JlZykpOworCXByaW50aygiJXM6ICAgY250MV9yZWc6IDB4JTA4eFxuIiwKKwkgICAgICAgY29yZS0+bmFtZSxjeF9yZWFkKGNoLT5jbnQxX3JlZykpOworCXByaW50aygiJXM6ICAgY250Ml9yZWc6IDB4JTA4eFxuIiwKKwkgICAgICAgY29yZS0+bmFtZSxjeF9yZWFkKGNoLT5jbnQyX3JlZykpOworfQorCitjaGFyICpjeDg4X3BjaV9pcnFzWzMyXSA9IHsKKwkidmlkIiwgImF1ZCIsICJ0cyIsICJ2aXAiLCAiaHN0IiwgIjUiLCAiNiIsICJ0bTEiLAorCSJzcmNfZG1hIiwgImRzdF9kbWEiLCAicmlzY19yZF9lcnIiLCAicmlzY193cl9lcnIiLAorCSJicmRnX2VyciIsICJzcmNfZG1hX2VyciIsICJkc3RfZG1hX2VyciIsICJpcGJfZG1hX2VyciIsCisJImkyYyIsICJpMmNfcmFjayIsICJpcl9zbXAiLCAiZ3BpbzAiLCAiZ3BpbzEiCit9OworY2hhciAqY3g4OF92aWRfaXJxc1szMl0gPSB7CisJInlfcmlzY2kxIiwgInVfcmlzY2kxIiwgInZfcmlzY2kxIiwgInZiaV9yaXNjMSIsCisJInlfcmlzY2kyIiwgInVfcmlzY2kyIiwgInZfcmlzY2kyIiwgInZiaV9yaXNjMiIsCisJInlfb2Zsb3ciLCAgInVfb2Zsb3ciLCAgInZfb2Zsb3ciLCAgInZiaV9vZmxvdyIsCisJInlfc3luYyIsICAgInVfc3luYyIsICAgInZfc3luYyIsICAgInZiaV9zeW5jIiwKKwkib3BjX2VyciIsICAicGFyX2VyciIsICAicmlwX2VyciIsICAicGNpX2Fib3J0IiwKK307CitjaGFyICpjeDg4X21wZWdfaXJxc1szMl0gPSB7CisJInRzX3Jpc2NpMSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJInRzX3Jpc2NpMiIsIE5VTEwsIE5VTEwsIE5VTEwsCisJInRzX29mbG93IiwgIE5VTEwsIE5VTEwsIE5VTEwsCisJInRzX3N5bmMiLCAgIE5VTEwsIE5VTEwsIE5VTEwsCisJIm9wY19lcnIiLCAicGFyX2VyciIsICJyaXBfZXJyIiwgInBjaV9hYm9ydCIsCisJInRzX2Vycj8iLAorfTsKKwordm9pZCBjeDg4X3ByaW50X2lycWJpdHMoY2hhciAqbmFtZSwgY2hhciAqdGFnLCBjaGFyICoqc3RyaW5ncywKKwkJCXUzMiBiaXRzLCB1MzIgbWFzaykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgWzB4JXhdIiwgbmFtZSwgdGFnLCBiaXRzKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlpZiAoIShiaXRzICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisJCWlmIChzdHJpbmdzW2ldKQorCQkJcHJpbnRrKCIgJXMiLCBzdHJpbmdzW2ldKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIgJWQiLCBpKTsKKwkJaWYgKCEobWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlwcmludGsoIioiKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGN4ODhfY29yZV9pcnEoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdTMyIHN0YXR1cykKK3sKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoc3RhdHVzICYgKDE8PDE4KSkgeworCQljeDg4X2lyX2lycShjb3JlKTsKKwkJaGFuZGxlZCsrOworCX0KKwlpZiAoIWhhbmRsZWQpCisJCWN4ODhfcHJpbnRfaXJxYml0cyhjb3JlLT5uYW1lLCAiaXJxIHBjaSIsCisJCQkJICAgY3g4OF9wY2lfaXJxcywgc3RhdHVzLAorCQkJCSAgIGNvcmUtPnBjaV9pcnFtYXNrKTsKKwlyZXR1cm4gaGFuZGxlZDsKK30KKwordm9pZCBjeDg4X3dha2V1cChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLAorCQkgc3RydWN0IGN4ODhfZG1hcXVldWUgKnEsIHUzMiBjb3VudCkKK3sKKwlzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZjsKKwlpbnQgYmM7CisKKwlmb3IgKGJjID0gMDs7IGJjKyspIHsKKwkJaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpCisJCQlicmVhazsKKwkJYnVmID0gbGlzdF9lbnRyeShxLT5hY3RpdmUubmV4dCwKKwkJCQkgc3RydWN0IGN4ODhfYnVmZmVyLCB2Yi5xdWV1ZSk7CisjaWYgMAorCQlpZiAoYnVmLT5jb3VudCA+IGNvdW50KQorCQkJYnJlYWs7CisjZWxzZQorCQkvKiBjb3VudCBjb21lcyBmcm9tIHRoZSBodyBhbmQgaXMgaXMgMTZiaXQgd2lkZSAtLQorCQkgKiB0aGlzIHRyaWNrIGhhbmRsZXMgd3JhcC1hcm91bmRzIGNvcnJlY3RseSBmb3IKKwkJICogdXAgdG8gMzI3NjcgYnVmZmVycyBpbiBmbGlnaHQuLi4gKi8KKwkJaWYgKChzMTYpIChjb3VudCAtIGJ1Zi0+Y291bnQpIDwgMCkKKwkJCWJyZWFrOworI2VuZGlmCisJCWRvX2dldHRpbWVvZmRheSgmYnVmLT52Yi50cyk7CisJCWRwcmludGsoMiwiWyVwLyVkXSB3YWtldXAgcmVnPSVkIGJ1Zj0lZFxuIixidWYsYnVmLT52Yi5pLAorCQkJY291bnQsIGJ1Zi0+Y291bnQpOworCQlidWYtPnZiLnN0YXRlID0gU1RBVEVfRE9ORTsKKwkJbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOworCQl3YWtlX3VwKCZidWYtPnZiLmRvbmUpOworCX0KKwlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQlkZWxfdGltZXIoJnEtPnRpbWVvdXQpOworCX0gZWxzZSB7CisJCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7CisJfQorCWlmIChiYyAhPSAxKQorCQlwcmludGsoIiVzOiAlZCBidWZmZXJzIGhhbmRsZWQgKHNob3VsZCBiZSAxKVxuIixfX0ZVTkNUSU9OX18sYmMpOworfQorCit2b2lkIGN4ODhfc2h1dGRvd24oc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3sKKwkvKiBkaXNhYmxlIFJJU0MgY29udHJvbGxlciArIElSUXMgKi8KKwljeF93cml0ZShNT19ERVZfQ05UUkwyLCAwKTsKKworCS8qIHN0b3AgZG1hIHRyYW5zZmVycyAqLworCWN4X3dyaXRlKE1PX1ZJRF9ETUFDTlRSTCwgMHgwKTsKKwljeF93cml0ZShNT19BVURfRE1BQ05UUkwsIDB4MCk7CisJY3hfd3JpdGUoTU9fVFNfRE1BQ05UUkwsIDB4MCk7CisJY3hfd3JpdGUoTU9fVklQX0RNQUNOVFJMLCAweDApOworCWN4X3dyaXRlKE1PX0dQSFNUX0RNQUNOVFJMLCAweDApOworCisJLyogc3RvcCBpbnRlcnJ1cHRzICovCisJY3hfd3JpdGUoTU9fUENJX0lOVE1TSywgMHgwKTsKKwljeF93cml0ZShNT19WSURfSU5UTVNLLCAweDApOworCWN4X3dyaXRlKE1PX0FVRF9JTlRNU0ssIDB4MCk7CisJY3hfd3JpdGUoTU9fVFNfSU5UTVNLLCAweDApOworCWN4X3dyaXRlKE1PX1ZJUF9JTlRNU0ssIDB4MCk7CisJY3hfd3JpdGUoTU9fR1BIU1RfSU5UTVNLLCAweDApOworCisJLyogc3RvcCBjYXB0dXJpbmcgKi8KKwljeF93cml0ZShWSURfQ0FQVFVSRV9DT05UUk9MLCAwKTsKK30KKworaW50IGN4ODhfcmVzZXQoc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3sKKwlkcHJpbnRrKDEsIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisJY3g4OF9zaHV0ZG93bihjb3JlKTsKKworCS8qIGNsZWFyIGlycSBzdGF0dXMgKi8KKwljeF93cml0ZShNT19WSURfSU5UU1RBVCwgMHhGRkZGRkZGRik7IC8vIENsZWFyIFBJViBpbnQKKwljeF93cml0ZShNT19QQ0lfSU5UU1RBVCwgMHhGRkZGRkZGRik7IC8vIENsZWFyIFBDSSBpbnQKKwljeF93cml0ZShNT19JTlQxX1NUQVQsICAgMHhGRkZGRkZGRik7IC8vIENsZWFyIFJJU0MgaW50CisKKwkvKiB3YWl0IGEgYml0ICovCisJbXNsZWVwKDEwMCk7CisKKwkvKiBpbml0IHNyYW0gKi8KKwljeDg4X3NyYW1fY2hhbm5lbF9zZXR1cChjb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyMV0sIDcyMCo0LCAwKTsKKwljeDg4X3NyYW1fY2hhbm5lbF9zZXR1cChjb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyMl0sIDEyOCwgMCk7CisJY3g4OF9zcmFtX2NoYW5uZWxfc2V0dXAoY29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjNdLCAxMjgsIDApOworCWN4ODhfc3JhbV9jaGFubmVsX3NldHVwKGNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDI0XSwgMTI4LCAwKTsKKwljeDg4X3NyYW1fY2hhbm5lbF9zZXR1cChjb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyNV0sIDEyOCwgMCk7CisJY3g4OF9zcmFtX2NoYW5uZWxfc2V0dXAoY29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjZdLCAxMjgsIDApOworCWN4ODhfc3JhbV9jaGFubmVsX3NldHVwKGNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDI4XSwgMTg4KjQsIDApOworCisJLyogbWlzYyBpbml0IC4uLiAqLworCWN4X3dyaXRlKE1PX0lOUFVUX0ZPUk1BVCwgKCgxIDw8IDEzKSB8ICAgLy8gYWdjIGVuYWJsZQorCQkJCSAgICgxIDw8IDEyKSB8ICAgLy8gYWdjIGdhaW4KKwkJCQkgICAoMSA8PCAxMSkgfCAgIC8vIGFkYXB0aWJlIGFnYworCQkJCSAgICgwIDw8IDEwKSB8ICAgLy8gY2hyb21hIGFnYworCQkJCSAgICgwIDw8ICA5KSB8ICAgLy8gY2tpbGxlbgorCQkJCSAgICg3KSkpOworCisJLyogc2V0dXAgaW1hZ2UgZm9ybWF0ICovCisJY3hfYW5kb3IoTU9fQ09MT1JfQ1RSTCwgMHg0MDAwLCAweDQwMDApOworCisJLyogc2V0dXAgRklGTyBUaHJlc2hob2xkcyAqLworCWN4X3dyaXRlKE1PX1BETUFfU1RIUlNILCAgIDB4MDgwNyk7CisJY3hfd3JpdGUoTU9fUERNQV9EVEhSU0gsICAgMHgwODA3KTsKKworCS8qIGZpeGVzIGZsYXNoaW5nIG9mIGltYWdlICovCisJY3hfd3JpdGUoTU9fQUdDX1NZTkNfVElQMSwgMHgwMzgwMDAwRik7CisJY3hfd3JpdGUoTU9fQUdDX0JBQ0tfVkJJLCAgMHgwMEUwMDU1NSk7CisKKwljeF93cml0ZShNT19WSURfSU5UU1RBVCwgICAweEZGRkZGRkZGKTsgLy8gQ2xlYXIgUElWIGludAorCWN4X3dyaXRlKE1PX1BDSV9JTlRTVEFULCAgIDB4RkZGRkZGRkYpOyAvLyBDbGVhciBQQ0kgaW50CisJY3hfd3JpdGUoTU9fSU5UMV9TVEFULCAgICAgMHhGRkZGRkZGRik7IC8vIENsZWFyIFJJU0MgaW50CisKKwkvKiBSZXNldCBvbi1ib2FyZCBwYXJ0cyAqLworCWN4X3dyaXRlKE1PX1NSU1RfSU8sIDApOworCW1zbGVlcCgxMCk7CisJY3hfd3JpdGUoTU9fU1JTVF9JTywgMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5saW5lIG5vcm1fc3dpZHRoKHN0cnVjdCBjeDg4X3R2bm9ybSAqbm9ybSkKK3sKKwlyZXR1cm4gKG5vcm0tPmlkICYgVjRMMl9TVERfNjI1XzUwKSA/IDkyMiA6IDc1NDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpbmxpbmUgbm9ybV9oZGVsYXkoc3RydWN0IGN4ODhfdHZub3JtICpub3JtKQoreworCXJldHVybiAobm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApID8gMTg2IDogMTM1OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlubGluZSBub3JtX3ZkZWxheShzdHJ1Y3QgY3g4OF90dm5vcm0gKm5vcm0pCit7CisJcmV0dXJuIChub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgPyAweDI0IDogMHgxODsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpbmxpbmUgbm9ybV9mc2M4KHN0cnVjdCBjeDg4X3R2bm9ybSAqbm9ybSkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG50c2MgPSAyODYzNjM2MDsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBhbCAgPSAzNTQ2ODk1MDsKKworCXJldHVybiAobm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApID8gcGFsIDogbnRzYzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpbmxpbmUgbm9ybV9ub3RjaGZpbHRlcihzdHJ1Y3QgY3g4OF90dm5vcm0gKm5vcm0pCit7CisJcmV0dXJuIChub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkKKwkJPyBITE5vdGNoRmlsdGVyMTM1UEFMCisJCTogSExOb3RjaEZpbHRlcjEzNU5UU0M7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5saW5lIG5vcm1faHRvdGFsKHN0cnVjdCBjeDg4X3R2bm9ybSAqbm9ybSkKK3sKKwlyZXR1cm4gKG5vcm0tPmlkICYgVjRMMl9TVERfNjI1XzUwKSA/IDExMzUgOiA5MTA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5saW5lIG5vcm1fdmJpcGFjayhzdHJ1Y3QgY3g4OF90dm5vcm0gKm5vcm0pCit7CisJcmV0dXJuIChub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgPyA1MTEgOiAyODg7Cit9CisKK2ludCBjeDg4X3NldF9zY2FsZShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCSAgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKK3sKKwl1bnNpZ25lZCBpbnQgc3dpZHRoICA9IG5vcm1fc3dpZHRoKGNvcmUtPnR2bm9ybSk7CisJdW5zaWduZWQgaW50IHNoZWlnaHQgPSBub3JtX21heGgoY29yZS0+dHZub3JtKTsKKwl1MzIgdmFsdWU7CisKKwlkcHJpbnRrKDEsInNldF9zY2FsZTogJWR4JWQgWyVzJXMsJXNdXG4iLCB3aWR0aCwgaGVpZ2h0LAorCQlWNEwyX0ZJRUxEX0hBU19UT1AoZmllbGQpICAgID8gIlQiIDogIiIsCisJCVY0TDJfRklFTERfSEFTX0JPVFRPTShmaWVsZCkgPyAiQiIgOiAiIiwKKwkJY29yZS0+dHZub3JtLT5uYW1lKTsKKwlpZiAoIVY0TDJfRklFTERfSEFTX0JPVEgoZmllbGQpKQorCQloZWlnaHQgKj0gMjsKKworCS8vIHJlY2FsYyBIIGRlbGF5IGFuZCBzY2FsZSByZWdpc3RlcnMKKwl2YWx1ZSA9ICh3aWR0aCAqIG5vcm1faGRlbGF5KGNvcmUtPnR2bm9ybSkpIC8gc3dpZHRoOworCXZhbHVlICY9IDB4M2ZlOworCWN4X3dyaXRlKE1PX0hERUxBWV9FVkVOLCAgdmFsdWUpOworCWN4X3dyaXRlKE1PX0hERUxBWV9PREQsICAgdmFsdWUpOworCWRwcmludGsoMSwic2V0X3NjYWxlOiBoZGVsYXkgIDB4JTA0eFxuIiwgdmFsdWUpOworCisJdmFsdWUgPSAoc3dpZHRoICogNDA5NiAvIHdpZHRoKSAtIDQwOTY7CisJY3hfd3JpdGUoTU9fSFNDQUxFX0VWRU4sICB2YWx1ZSk7CisJY3hfd3JpdGUoTU9fSFNDQUxFX09ERCwgICB2YWx1ZSk7CisJZHByaW50aygxLCJzZXRfc2NhbGU6IGhzY2FsZSAgMHglMDR4XG4iLCB2YWx1ZSk7CisKKwljeF93cml0ZShNT19IQUNUSVZFX0VWRU4sIHdpZHRoKTsKKwljeF93cml0ZShNT19IQUNUSVZFX09ERCwgIHdpZHRoKTsKKwlkcHJpbnRrKDEsInNldF9zY2FsZTogaGFjdGl2ZSAweCUwNHhcbiIsIHdpZHRoKTsKKworCS8vIHJlY2FsYyBWIHNjYWxlIFJlZ2lzdGVyIChkZWxheSBpcyBjb25zdGFudCkKKwljeF93cml0ZShNT19WREVMQVlfRVZFTiwgbm9ybV92ZGVsYXkoY29yZS0+dHZub3JtKSk7CisJY3hfd3JpdGUoTU9fVkRFTEFZX09ERCwgIG5vcm1fdmRlbGF5KGNvcmUtPnR2bm9ybSkpOworCWRwcmludGsoMSwic2V0X3NjYWxlOiB2ZGVsYXkgIDB4JTA0eFxuIiwgbm9ybV92ZGVsYXkoY29yZS0+dHZub3JtKSk7CisKKwl2YWx1ZSA9ICgweDEwMDAwIC0gKHNoZWlnaHQgKiA1MTIgLyBoZWlnaHQgLSA1MTIpKSAmIDB4MWZmZjsKKwljeF93cml0ZShNT19WU0NBTEVfRVZFTiwgIHZhbHVlKTsKKwljeF93cml0ZShNT19WU0NBTEVfT0RELCAgIHZhbHVlKTsKKwlkcHJpbnRrKDEsInNldF9zY2FsZTogdnNjYWxlICAweCUwNHhcbiIsIHZhbHVlKTsKKworCWN4X3dyaXRlKE1PX1ZBQ1RJVkVfRVZFTiwgc2hlaWdodCk7CisJY3hfd3JpdGUoTU9fVkFDVElWRV9PREQsICBzaGVpZ2h0KTsKKwlkcHJpbnRrKDEsInNldF9zY2FsZTogdmFjdGl2ZSAweCUwNHhcbiIsIHNoZWlnaHQpOworCisJLy8gc2V0dXAgZmlsdGVycworCXZhbHVlID0gMDsKKwl2YWx1ZSB8PSAoMSA8PCAxOSk7ICAgICAgICAvLyBDRklMVCAoZGVmYXVsdCkKKwlpZiAoY29yZS0+dHZub3JtLT5pZCAmIFY0TDJfU1REX1NFQ0FNKSB7CisJCXZhbHVlIHw9ICgxIDw8IDE1KTsKKwkJdmFsdWUgfD0gKDEgPDwgMTYpOworCX0KKwlpZiAoSU5QVVQoY29yZS0+aW5wdXQpLT50eXBlID09IENYODhfVk1VWF9TVklERU8pCisJCXZhbHVlIHw9ICgxIDw8IDEzKSB8ICgxIDw8IDUpOworCWlmIChWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgPT0gZmllbGQpCisJCXZhbHVlIHw9ICgxIDw8IDMpOyAvLyBWSU5UIChpbnRlcmxhY2VkIHZlcnRpY2FsIHNjYWxpbmcpCisJaWYgKHdpZHRoIDwgMzg1KQorCQl2YWx1ZSB8PSAoMSA8PCAwKTsgLy8gMy10YXAgaW50ZXJwb2xhdGlvbgorCWlmICh3aWR0aCA8IDE5MykKKwkJdmFsdWUgfD0gKDEgPDwgMSk7IC8vIDUtdGFwIGludGVycG9sYXRpb24KKwlpZiAobm9jb21iKQorCQl2YWx1ZSB8PSAoMyA8PCA1KTsgLy8gZGlzYWJsZSBjb21iIGZpbHRlcgorCisJY3hfd3JpdGUoTU9fRklMVEVSX0VWRU4sICB2YWx1ZSk7CisJY3hfd3JpdGUoTU9fRklMVEVSX09ERCwgICB2YWx1ZSk7CisJZHByaW50aygxLCJzZXRfc2NhbGU6IGZpbHRlciAgMHglMDR4XG4iLCB2YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHUzMiB4dGFsID0gMjg2MzYzNjM7CisKK3N0YXRpYyBpbnQgc2V0X3BsbChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCBpbnQgcHJlc2NhbGUsIHUzMiBvZnJlcSkKK3sKKwlzdGF0aWMgdTMyIHByZVtdID0geyAwLCAwLCAwLCAzLCAyLCAxIH07CisJdTY0IHBsbDsKKwl1MzIgcmVnOworCWludCBpOworCisJaWYgKHByZXNjYWxlIDwgMikKKwkJcHJlc2NhbGUgPSAyOworCWlmIChwcmVzY2FsZSA+IDUpCisJCXByZXNjYWxlID0gNTsKKworCXBsbCA9IG9mcmVxICogOCAqIHByZXNjYWxlICogKHU2NCkoMSA8PCAyMCk7CisJZG9fZGl2KHBsbCx4dGFsKTsKKwlyZWcgPSAocGxsICYgMHgzZmZmZmZmKSB8IChwcmVbcHJlc2NhbGVdIDw8IDI2KTsKKwlpZiAoKChyZWcgPj4gMjApICYgMHgzZikgPCAxNCkgeworCQlwcmludGsoIiVzLzA6IHBsbCBvdXQgb2YgcmFuZ2VcbiIsY29yZS0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlkcHJpbnRrKDEsInNldF9wbGw6ICAgIE1PX1BMTF9SRUcgICAgICAgMHglMDh4IFtvbGQ9MHglMDh4LGZyZXE9JWRdXG4iLAorCQlyZWcsIGN4X3JlYWQoTU9fUExMX1JFRyksIG9mcmVxKTsKKwljeF93cml0ZShNT19QTExfUkVHLCByZWcpOworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlyZWcgPSBjeF9yZWFkKE1PX0RFVklDRV9TVEFUVVMpOworCQlpZiAocmVnICYgKDE8PDIpKSB7CisJCQlkcHJpbnRrKDEsInBsbCBsb2NrZWQgW3ByZT0lZCxvZnJlcT0lZF1cbiIsCisJCQkJcHJlc2NhbGUsb2ZyZXEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZHByaW50aygxLCJwbGwgbm90IGxvY2tlZCB5ZXQsIHdhaXRpbmcgLi4uXG4iKTsKKwkJbXNsZWVwKDEwKTsKKwl9CisJZHByaW50aygxLCJwbGwgTk9UIGxvY2tlZCBbcHJlPSVkLG9mcmVxPSVkXVxuIixwcmVzY2FsZSxvZnJlcSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNldF90dmF1ZGlvKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpCit7CisJc3RydWN0IGN4ODhfdHZub3JtICpub3JtID0gY29yZS0+dHZub3JtOworCisJaWYgKENYODhfVk1VWF9URUxFVklTSU9OICE9IElOUFVUKGNvcmUtPmlucHV0KS0+dHlwZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoVjRMMl9TVERfUEFMX0JHICYgbm9ybS0+aWQpIHsKKwkJY29yZS0+dHZhdWRpbyA9IG5pY2FtID8gV1dfTklDQU1fQkdES0wgOiBXV19BMl9CRzsKKworCX0gZWxzZSBpZiAoVjRMMl9TVERfUEFMX0RLICYgbm9ybS0+aWQpIHsKKwkJY29yZS0+dHZhdWRpbyA9IG5pY2FtID8gV1dfTklDQU1fQkdES0wgOiBXV19BMl9ESzsKKworCX0gZWxzZSBpZiAoVjRMMl9TVERfUEFMX0kgJiBub3JtLT5pZCkgeworCQljb3JlLT50dmF1ZGlvID0gV1dfTklDQU1fSTsKKworCX0gZWxzZSBpZiAoVjRMMl9TVERfU0VDQU1fTCAmIG5vcm0tPmlkKSB7CisJCWNvcmUtPnR2YXVkaW8gPSBXV19TWVNURU1fTF9BTTsKKworCX0gZWxzZSBpZiAoVjRMMl9TVERfU0VDQU1fREsgJiBub3JtLT5pZCkgeworCQljb3JlLT50dmF1ZGlvID0gV1dfQTJfREs7CisKKwl9IGVsc2UgaWYgKChWNEwyX1NURF9OVFNDX00gJiBub3JtLT5pZCkgfHwKKwkJICAgKFY0TDJfU1REX1BBTF9NICAmIG5vcm0tPmlkKSkgeworCQljb3JlLT50dmF1ZGlvID0gV1dfQlRTQzsKKworCX0gZWxzZSBpZiAoVjRMMl9TVERfTlRTQ19NX0pQICYgbm9ybS0+aWQpIHsKKwkJY29yZS0+dHZhdWRpbyA9IFdXX0VJQUo7CisKKwl9IGVsc2UgeworCQlwcmludGsoIiVzLzA6IHR2YXVkaW8gc3VwcG9ydCBuZWVkcyB3b3JrIGZvciB0aGlzIHR2IG5vcm0gWyVzXSwgc29ycnlcbiIsCisJCSAgICAgICBjb3JlLT5uYW1lLCBub3JtLT5uYW1lKTsKKwkJY29yZS0+dHZhdWRpbyA9IDA7CisJCXJldHVybiAwOworCX0KKworCWN4X2FuZG9yKE1PX0FGRUNGR19JTywgMHgxZiwgMHgwKTsKKwljeDg4X3NldF90dmF1ZGlvKGNvcmUpOworCS8vIGN4ODhfc2V0X3N0ZXJlbyhkZXYsVjRMMl9UVU5FUl9NT0RFX1NURVJFTyk7CisKKwljeF93cml0ZShNT19BVUREX0xOR1RILCAgICAxMjgpOyAvKiBmaWZvIHNpemUgKi8KKwljeF93cml0ZShNT19BVURSX0xOR1RILCAgICAxMjgpOyAvKiBmaWZvIHNpemUgKi8KKwljeF93cml0ZShNT19BVURfRE1BQ05UUkwsIDB4MDMpOyAvKiBuZWVkIGF1ZGlvIGZpZm8gKi8KKwlyZXR1cm4gMDsKK30KKworaW50IGN4ODhfc2V0X3R2bm9ybShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCBzdHJ1Y3QgY3g4OF90dm5vcm0gKm5vcm0pCit7CisJdTMyIGZzYzg7CisJdTMyIGFkY19jbG9jazsKKwl1MzIgdmRlY19jbG9jazsKKwl1MzIgc3RlcF9kYixzdGVwX2RyOworCXU2NCB0bXA2NDsKKwl1MzIgYmRlbGF5LGFnY2RlbGF5LGh0b3RhbDsKKworCWNvcmUtPnR2bm9ybSA9IG5vcm07CisJZnNjOCAgICAgICA9IG5vcm1fZnNjOChub3JtKTsKKwlhZGNfY2xvY2sgID0geHRhbDsKKwl2ZGVjX2Nsb2NrID0gZnNjODsKKwlzdGVwX2RiICAgID0gZnNjODsKKwlzdGVwX2RyICAgID0gZnNjODsKKworCWlmIChub3JtLT5pZCAmIFY0TDJfU1REX1NFQ0FNKSB7CisJCXN0ZXBfZGIgPSA0MjUwMDAwICogODsKKwkJc3RlcF9kciA9IDQ0MDYyNTAgKiA4OworCX0KKworCWRwcmludGsoMSwic2V0X3R2bm9ybTogXCIlc1wiIGZzYzg9JWQgYWRjPSVkIHZkZWM9JWQgZGIvZHI9JWQvJWRcbiIsCisJCW5vcm0tPm5hbWUsIGZzYzgsIGFkY19jbG9jaywgdmRlY19jbG9jaywgc3RlcF9kYiwgc3RlcF9kcik7CisJc2V0X3BsbChjb3JlLDIsdmRlY19jbG9jayk7CisKKwlkcHJpbnRrKDEsInNldF90dm5vcm06IE1PX0lOUFVUX0ZPUk1BVCAgMHglMDh4IFtvbGQ9MHglMDh4XVxuIiwKKwkJbm9ybS0+Y3hpZm9ybWF0LCBjeF9yZWFkKE1PX0lOUFVUX0ZPUk1BVCkgJiAweDBmKTsKKwljeF9hbmRvcihNT19JTlBVVF9GT1JNQVQsIDB4Ziwgbm9ybS0+Y3hpZm9ybWF0KTsKKworI2lmIDEKKwkvLyBGSVhNRTogYXMtaXMgZnJvbSBEU2NhbGVyCisJZHByaW50aygxLCJzZXRfdHZub3JtOiBNT19PVVRQVVRfRk9STUFUIDB4JTA4eCBbb2xkPTB4JTA4eF1cbiIsCisJCW5vcm0tPmN4b2Zvcm1hdCwgY3hfcmVhZChNT19PVVRQVVRfRk9STUFUKSk7CisJY3hfd3JpdGUoTU9fT1VUUFVUX0ZPUk1BVCwgbm9ybS0+Y3hvZm9ybWF0KTsKKyNlbmRpZgorCisJLy8gTU9fU0NPTlZfUkVHID0gYWRjIGNsb2NrIC8gdmlkZW8gZGVjIGNsb2NrICogMl4xNworCXRtcDY0ICA9IGFkY19jbG9jayAqICh1NjQpKDEgPDwgMTcpOworCWRvX2Rpdih0bXA2NCwgdmRlY19jbG9jayk7CisJZHByaW50aygxLCJzZXRfdHZub3JtOiBNT19TQ09OVl9SRUcgICAgIDB4JTA4eCBbb2xkPTB4JTA4eF1cbiIsCisJCSh1MzIpdG1wNjQsIGN4X3JlYWQoTU9fU0NPTlZfUkVHKSk7CisJY3hfd3JpdGUoTU9fU0NPTlZfUkVHLCAodTMyKXRtcDY0KTsKKworCS8vIE1PX1NVQl9TVEVQID0gOCAqIGZzYyAvIHZpZGVvIGRlYyBjbG9jayAqIDJeMjIKKwl0bXA2NCAgPSBzdGVwX2RiICogKHU2NCkoMSA8PCAyMik7CisJZG9fZGl2KHRtcDY0LCB2ZGVjX2Nsb2NrKTsKKwlkcHJpbnRrKDEsInNldF90dm5vcm06IE1PX1NVQl9TVEVQICAgICAgMHglMDh4IFtvbGQ9MHglMDh4XVxuIiwKKwkJKHUzMil0bXA2NCwgY3hfcmVhZChNT19TVUJfU1RFUCkpOworCWN4X3dyaXRlKE1PX1NVQl9TVEVQLCAodTMyKXRtcDY0KTsKKworCS8vIE1PX1NVQl9TVEVQX0RSID0gOCAqIDQ0MDYyNTAgLyB2aWRlbyBkZWMgY2xvY2sgKiAyXjIyCisJdG1wNjQgID0gc3RlcF9kciAqICh1NjQpKDEgPDwgMjIpOworCWRvX2Rpdih0bXA2NCwgdmRlY19jbG9jayk7CisJZHByaW50aygxLCJzZXRfdHZub3JtOiBNT19TVUJfU1RFUF9EUiAgIDB4JTA4eCBbb2xkPTB4JTA4eF1cbiIsCisJCSh1MzIpdG1wNjQsIGN4X3JlYWQoTU9fU1VCX1NURVBfRFIpKTsKKwljeF93cml0ZShNT19TVUJfU1RFUF9EUiwgKHUzMil0bXA2NCk7CisKKwkvLyBiZGVsYXkgKyBhZ2NkZWxheQorCWJkZWxheSAgID0gdmRlY19jbG9jayAqIDY1IC8gMjAwMDAwMDAgKyAyMTsKKwlhZ2NkZWxheSA9IHZkZWNfY2xvY2sgKiA2OCAvIDIwMDAwMDAwICsgMTU7CisJZHByaW50aygxLCJzZXRfdHZub3JtOiBNT19BR0NfQlVSU1QgICAgIDB4JTA4eCBbb2xkPTB4JTA4eCxiZGVsYXk9JWQsYWdjZGVsYXk9JWRdXG4iLAorCQkoYmRlbGF5IDw8IDgpIHwgYWdjZGVsYXksIGN4X3JlYWQoTU9fQUdDX0JVUlNUKSwgYmRlbGF5LCBhZ2NkZWxheSk7CisJY3hfd3JpdGUoTU9fQUdDX0JVUlNULCAoYmRlbGF5IDw8IDgpIHwgYWdjZGVsYXkpOworCisJLy8gaHRvdGFsCisJdG1wNjQgPSBub3JtX2h0b3RhbChub3JtKSAqICh1NjQpdmRlY19jbG9jazsKKwlkb19kaXYodG1wNjQsIGZzYzgpOworCWh0b3RhbCA9ICh1MzIpdG1wNjQgfCAobm9ybV9ub3RjaGZpbHRlcihub3JtKSA8PCAxMSk7CisJZHByaW50aygxLCJzZXRfdHZub3JtOiBNT19IVE9UQUwgICAgICAgIDB4JTA4eCBbb2xkPTB4JTA4eCxodG90YWw9JWRdXG4iLAorCQlodG90YWwsIGN4X3JlYWQoTU9fSFRPVEFMKSwgKHUzMil0bXA2NCk7CisJY3hfd3JpdGUoTU9fSFRPVEFMLCBodG90YWwpOworCisJLy8gdmJpIHN0dWZmCisJY3hfd3JpdGUoTU9fVkJJX1BBQ0tFVCwgKCgxIDw8IDExKSB8IC8qIChub3JtX3ZkZWxheShub3JtKSAgIDw8IDExKSB8ICovCisJCQkJIG5vcm1fdmJpcGFjayhub3JtKSkpOworCisJLy8gdGhpcyBpcyBuZWVkZWQgYXMgd2VsbCB0byBzZXQgYWxsIHR2bm9ybSBwYXJhbWV0ZXIKKwljeDg4X3NldF9zY2FsZShjb3JlLCAzMjAsIDI0MCwgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEKTsKKworCS8vIGF1ZGlvCisJc2V0X3R2YXVkaW8oY29yZSk7CisKKwkvLyB0ZWxsIGkyYyBjaGlwcworI2lmZGVmIFY0TDJfSTJDX0NMSUVOVFMKKwljeDg4X2NhbGxfaTJjX2NsaWVudHMoY29yZSxWSURJT0NfU19TVEQsJm5vcm0tPmlkKTsKKyNlbHNlCisJeworCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCBjOworCQltZW1zZXQoJmMsMCxzaXplb2YoYykpOworCQljLmNoYW5uZWwgPSBjb3JlLT5pbnB1dDsKKwkJYy5ub3JtID0gVklERU9fTU9ERV9QQUw7CisJCWlmICgobm9ybS0+aWQgJiAoVjRMMl9TVERfTlRTQ19NfFY0TDJfU1REX05UU0NfTV9KUCkpKQorCQkJYy5ub3JtID0gVklERU9fTU9ERV9OVFNDOworCQlpZiAobm9ybS0+aWQgJiBWNEwyX1NURF9TRUNBTSkKKwkJCWMubm9ybSA9IFZJREVPX01PREVfU0VDQU07CisJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhjb3JlLFZJRElPQ1NDSEFOLCZjKTsKKwl9CisjZW5kaWYKKworCS8vIGRvbmUKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgY3g4OF9wY2lfcXVpcmtzKGNoYXIgKm5hbWUsIHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJdW5zaWduZWQgaW50IGxhdCA9IFVOU0VUOworCXU4IGN0cmwgPSAwOworCXU4IHZhbHVlOworCisJLyogY2hlY2sgcGNpIHF1aXJrcyAqLworCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX1RSSVRPTikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogcXVpcms6IFBDSVBDSV9UUklUT04gLS0gc2V0IFRCRlhcbiIsCisJCSAgICAgICBuYW1lKTsKKwkJY3RybCB8PSBDWDg4WF9FTl9UQkZYOworCX0KKwlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9OQVRPTUEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHF1aXJrOiBQQ0lQQ0lfTkFUT01BIC0tIHNldCBUQkZYXG4iLAorCQkgICAgICAgbmFtZSk7CisJCWN0cmwgfD0gQ1g4OFhfRU5fVEJGWDsKKwl9CisJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfVklBRVRCRikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogcXVpcms6IFBDSVBDSV9WSUFFVEJGIC0tIHNldCBUQkZYXG4iLAorCQkgICAgICAgbmFtZSk7CisJCWN0cmwgfD0gQ1g4OFhfRU5fVEJGWDsKKwl9CisJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfVlNGWCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogcXVpcms6IFBDSVBDSV9WU0ZYIC0tIHNldCBWU0ZYXG4iLAorCQkgICAgICAgbmFtZSk7CisJCWN0cmwgfD0gQ1g4OFhfRU5fVlNGWDsKKwl9CisjaWZkZWYgUENJUENJX0FMSU1BR0lLCisJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfQUxJTUFHSUspIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHF1aXJrOiBQQ0lQQ0lfQUxJTUFHSUsgLS0gbGF0ZW5jeSBmaXh1cFxuIiwKKwkJICAgICAgIG5hbWUpOworCQlsYXQgPSAweDBBOworCX0KKyNlbmRpZgorCisJLyogY2hlY2sgaW5zbW9kIG9wdGlvbnMgKi8KKwlpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKKwkJbGF0ID0gbGF0ZW5jeTsKKworCS8qIGFwcGx5IHN0dWZmICovCisJaWYgKGN0cmwpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBDWDg4WF9ERVZDVFJMLCAmdmFsdWUpOworCQl2YWx1ZSB8PSBjdHJsOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCBDWDg4WF9ERVZDVFJMLCB2YWx1ZSk7CisJfQorCWlmIChVTlNFVCAhPSBsYXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNldHRpbmcgcGNpIGxhdGVuY3kgdGltZXIgdG8gJWRcbiIsCisJCSAgICAgICBuYW1lLCBsYXRlbmN5KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaSwgUENJX0xBVEVOQ1lfVElNRVIsIGxhdGVuY3kpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCB2aWRlb19kZXZpY2UgKmN4ODhfdmRldl9pbml0KHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsCisJCQkJICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgIHN0cnVjdCB2aWRlb19kZXZpY2UgKnRlbXBsYXRlLAorCQkJCSAgICBjaGFyICp0eXBlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKKworCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmIChOVUxMID09IHZmZCkKKwkJcmV0dXJuIE5VTEw7CisJKnZmZCA9ICp0ZW1wbGF0ZTsKKwl2ZmQtPm1pbm9yICAgPSAtMTsKKwl2ZmQtPmRldiAgICAgPSAmcGNpLT5kZXY7CisJdmZkLT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CisJc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwgIiVzICVzICglcykiLAorCQkgY29yZS0+bmFtZSwgdHlwZSwgY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLm5hbWUpOworCXJldHVybiB2ZmQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3Jlc3NvdXJjZXMoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2ksMCksCisJCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihwY2ksMCksCisJCQkgICAgICAgY29yZS0+bmFtZSkpCisJCXJldHVybiAwOworCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGdldCBNTUlPIG1lbW9yeSBAIDB4JWx4XG4iLAorCSAgICAgICBjb3JlLT5uYW1lLHBjaV9yZXNvdXJjZV9zdGFydChwY2ksMCkpOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0cnVjdCBjeDg4X2NvcmUqIGN4ODhfY29yZV9nZXQoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlOworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisJaW50IGk7CisKKwlkb3duKCZkZXZsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoKGl0ZW0sJmN4ODhfZGV2bGlzdCkgeworCQljb3JlID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgY3g4OF9jb3JlLCBkZXZsaXN0KTsKKwkJaWYgKHBjaS0+YnVzLT5udW1iZXIgIT0gY29yZS0+cGNpX2J1cykKKwkJCWNvbnRpbnVlOworCQlpZiAoUENJX1NMT1QocGNpLT5kZXZmbikgIT0gY29yZS0+cGNpX3Nsb3QpCisJCQljb250aW51ZTsKKworCQlpZiAoMCAhPSBnZXRfcmVzc291cmNlcyhjb3JlLHBjaSkpCisJCQlnb3RvIGZhaWxfdW5sb2NrOworCQlhdG9taWNfaW5jKCZjb3JlLT5yZWZjb3VudCk7CisJCXVwKCZkZXZsaXN0KTsKKwkJcmV0dXJuIGNvcmU7CisJfQorCWNvcmUgPSBrbWFsbG9jKHNpemVvZigqY29yZSksR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gY29yZSkKKwkJZ290byBmYWlsX3VubG9jazsKKworCW1lbXNldChjb3JlLDAsc2l6ZW9mKCpjb3JlKSk7CisJYXRvbWljX2luYygmY29yZS0+cmVmY291bnQpOworCWNvcmUtPnBjaV9idXMgID0gcGNpLT5idXMtPm51bWJlcjsKKwljb3JlLT5wY2lfc2xvdCA9IFBDSV9TTE9UKHBjaS0+ZGV2Zm4pOworCWNvcmUtPnBjaV9pcnFtYXNrID0gMHgwMGZjMDA7CisKKwljb3JlLT5uciA9IGN4ODhfZGV2Y291bnQrKzsKKwlzcHJpbnRmKGNvcmUtPm5hbWUsImN4ODhbJWRdIixjb3JlLT5ucik7CisJaWYgKDAgIT0gZ2V0X3Jlc3NvdXJjZXMoY29yZSxwY2kpKSB7CisJCWN4ODhfZGV2Y291bnQtLTsKKwkJZ290byBmYWlsX2ZyZWU7CisJfQorCWxpc3RfYWRkX3RhaWwoJmNvcmUtPmRldmxpc3QsJmN4ODhfZGV2bGlzdCk7CisKKwkvKiBQQ0kgc3R1ZmYgKi8KKwljeDg4X3BjaV9xdWlya3MoY29yZS0+bmFtZSwgcGNpKTsKKwljb3JlLT5sbW1pbyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwwKSwKKwkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpLDApKTsKKwljb3JlLT5ibW1pbyA9ICh1OCBfX2lvbWVtICopY29yZS0+bG1taW87CisKKwkvKiBib2FyZCBjb25maWcgKi8KKwljb3JlLT5ib2FyZCA9IFVOU0VUOworCWlmIChjYXJkW2NvcmUtPm5yXSA8IGN4ODhfYmNvdW50KQorCQljb3JlLT5ib2FyZCA9IGNhcmRbY29yZS0+bnJdOworCWZvciAoaSA9IDA7IFVOU0VUID09IGNvcmUtPmJvYXJkICAmJiAgaSA8IGN4ODhfaWRjb3VudDsgaSsrKQorCQlpZiAocGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IGN4ODhfc3ViaWRzW2ldLnN1YnZlbmRvciAmJgorCQkgICAgcGNpLT5zdWJzeXN0ZW1fZGV2aWNlID09IGN4ODhfc3ViaWRzW2ldLnN1YmRldmljZSkKKwkJCWNvcmUtPmJvYXJkID0gY3g4OF9zdWJpZHNbaV0uY2FyZDsKKwlpZiAoVU5TRVQgPT0gY29yZS0+Ym9hcmQpIHsKKwkJY29yZS0+Ym9hcmQgPSBDWDg4X0JPQVJEX1VOS05PV047CisJCWN4ODhfY2FyZF9saXN0KGNvcmUscGNpKTsKKwl9CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBzdWJzeXN0ZW06ICUwNHg6JTA0eCwgYm9hcmQ6ICVzIFtjYXJkPSVkLCVzXVxuIiwKKwkgICAgICAgY29yZS0+bmFtZSxwY2ktPnN1YnN5c3RlbV92ZW5kb3IsCisJICAgICAgIHBjaS0+c3Vic3lzdGVtX2RldmljZSxjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ubmFtZSwKKwkgICAgICAgY29yZS0+Ym9hcmQsIGNhcmRbY29yZS0+bnJdID09IGNvcmUtPmJvYXJkID8KKwkgICAgICAgImluc21vZCBvcHRpb24iIDogImF1dG9kZXRlY3RlZCIpOworCisJY29yZS0+dHVuZXJfdHlwZSA9IHR1bmVyW2NvcmUtPm5yXTsKKwlpZiAoVU5TRVQgPT0gY29yZS0+dHVuZXJfdHlwZSkKKwkJY29yZS0+dHVuZXJfdHlwZSA9IGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS50dW5lcl90eXBlOworCWNvcmUtPnRkYTk4ODdfY29uZiA9IGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS50ZGE5ODg3X2NvbmY7CisKKwkvKiBpbml0IGhhcmR3YXJlICovCisJY3g4OF9yZXNldChjb3JlKTsKKwljeDg4X2kyY19pbml0KGNvcmUscGNpKTsKKwljeDg4X2NhcmRfc2V0dXAoY29yZSk7CisJY3g4OF9pcl9pbml0KGNvcmUscGNpKTsKKworCXVwKCZkZXZsaXN0KTsKKwlyZXR1cm4gY29yZTsKKworZmFpbF9mcmVlOgorCWtmcmVlKGNvcmUpOworZmFpbF91bmxvY2s6CisJdXAoJmRldmxpc3QpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIGN4ODhfY29yZV9wdXQoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwwKSwKKwkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpLDApKTsKKworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmY29yZS0+cmVmY291bnQpKQorCQlyZXR1cm47CisKKwlkb3duKCZkZXZsaXN0KTsKKwljeDg4X2lyX2ZpbmkoY29yZSk7CisJaWYgKDAgPT0gY29yZS0+aTJjX3JjKQorCQlpMmNfYml0X2RlbF9idXMoJmNvcmUtPmkyY19hZGFwKTsKKwlsaXN0X2RlbCgmY29yZS0+ZGV2bGlzdCk7CisJaW91bm1hcChjb3JlLT5sbW1pbyk7CisJY3g4OF9kZXZjb3VudC0tOworCXVwKCZkZXZsaXN0KTsKKwlrZnJlZShjb3JlKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0VYUE9SVF9TWU1CT0woY3g4OF9wcmludF9pb2N0bCk7CitFWFBPUlRfU1lNQk9MKGN4ODhfcGNpX2lycXMpOworRVhQT1JUX1NZTUJPTChjeDg4X3ZpZF9pcnFzKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9tcGVnX2lycXMpOworRVhQT1JUX1NZTUJPTChjeDg4X3ByaW50X2lycWJpdHMpOworCitFWFBPUlRfU1lNQk9MKGN4ODhfY29yZV9pcnEpOworRVhQT1JUX1NZTUJPTChjeDg4X3dha2V1cCk7CitFWFBPUlRfU1lNQk9MKGN4ODhfcmVzZXQpOworRVhQT1JUX1NZTUJPTChjeDg4X3NodXRkb3duKTsKKworRVhQT1JUX1NZTUJPTChjeDg4X3Jpc2NfYnVmZmVyKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9yaXNjX2RhdGFidWZmZXIpOworRVhQT1JUX1NZTUJPTChjeDg4X3Jpc2Nfc3RvcHBlcik7CitFWFBPUlRfU1lNQk9MKGN4ODhfZnJlZV9idWZmZXIpOworCitFWFBPUlRfU1lNQk9MKGN4ODhfc3JhbV9jaGFubmVscyk7CitFWFBPUlRfU1lNQk9MKGN4ODhfc3JhbV9jaGFubmVsX3NldHVwKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9zcmFtX2NoYW5uZWxfZHVtcCk7CisKK0VYUE9SVF9TWU1CT0woY3g4OF9zZXRfdHZub3JtKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9zZXRfc2NhbGUpOworCitFWFBPUlRfU1lNQk9MKGN4ODhfdmRldl9pbml0KTsKK0VYUE9SVF9TWU1CT0woY3g4OF9jb3JlX2dldCk7CitFWFBPUlRfU1lNQk9MKGN4ODhfY29yZV9wdXQpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzZmMThjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiAkSWQ6IGN4ODgtZHZiLmMsdiAxLjMxIDIwMDUvMDMvMDcgMTU6NTg6MDUga3JheGVsIEV4cCAkCisgKgorICogZGV2aWNlIGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYgY2FyZHMKKyAqIE1QRUcgVHJhbnNwb3J0IFN0cmVhbSAoRFZCKSByb3V0aW5lcworICoKKyAqIChjKSAyMDA0IENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+CisgKiAoYykgMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisKKy8qIHRob3NlIHR3byBmcm9udGVuZHMgbmVlZCBtZXJnaW5nIHZpYSBsaW51eHR2IGN2cyAuLi4gKi8KKyNkZWZpbmUgSEFWRV9DWDIyNzAyIDAKKyNkZWZpbmUgSEFWRV9PUjUxMTMyIDEKKworI2luY2x1ZGUgImN4ODguaCIKKyNpbmNsdWRlICJkdmItcGxsLmgiCisjaW5jbHVkZSAibXQzNTIuaCIKKyNpbmNsdWRlICJtdDM1Ml9wcml2LmgiCisjaWYgSEFWRV9DWDIyNzAyCisjIGluY2x1ZGUgImN4MjI3MDIuaCIKKyNlbmRpZgorI2lmIEhBVkVfT1I1MTEzMgorIyBpbmNsdWRlICJvcjUxMTMyLmgiCisjZW5kaWYKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGN4MjM4OHggYmFzZWQgRFZCIGNhcmRzIik7CitNT0RVTEVfQVVUSE9SKCJDaHJpcyBQYXNjb2UgPGMucGFzY29lQGl0ZWUudXEuZWR1LmF1PiIpOworTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbZHZiXSIpOworCisjZGVmaW5lIGRwcmludGsobGV2ZWwsZm10LCBhcmcuLi4pCWlmIChkZWJ1ZyA+PSBsZXZlbCkgXAorCXByaW50ayhLRVJOX0RFQlVHICIlcy8yLWR2YjogIiBmbXQsIGRldi0+Y29yZS0+bmFtZSAsICMjIGFyZykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHZiX2J1Zl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkgdW5zaWduZWQgaW50ICpjb3VudCwgdW5zaWduZWQgaW50ICpzaXplKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBxLT5wcml2X2RhdGE7CisKKwlkZXYtPnRzX3BhY2tldF9zaXplICA9IDE4OCAqIDQ7CisJZGV2LT50c19wYWNrZXRfY291bnQgPSAzMjsKKworCSpzaXplICA9IGRldi0+dHNfcGFja2V0X3NpemUgKiBkZXYtPnRzX3BhY2tldF9jb3VudDsKKwkqY291bnQgPSAzMjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdmJfYnVmX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkJCSAgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKK3sKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2ID0gcS0+cHJpdl9kYXRhOworCXJldHVybiBjeDg4MDJfYnVmX3ByZXBhcmUoZGV2LCAoc3RydWN0IGN4ODhfYnVmZmVyKil2Yik7Cit9CisKK3N0YXRpYyB2b2lkIGR2Yl9idWZfcXVldWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2ID0gcS0+cHJpdl9kYXRhOworCWN4ODgwMl9idWZfcXVldWUoZGV2LCAoc3RydWN0IGN4ODhfYnVmZmVyKil2Yik7Cit9CisKK3N0YXRpYyB2b2lkIGR2Yl9idWZfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBxLT5wcml2X2RhdGE7CisJY3g4OF9mcmVlX2J1ZmZlcihkZXYtPnBjaSwgKHN0cnVjdCBjeDg4X2J1ZmZlciopdmIpOworfQorCitzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGR2Yl9xb3BzID0geworCS5idWZfc2V0dXAgICAgPSBkdmJfYnVmX3NldHVwLAorCS5idWZfcHJlcGFyZSAgPSBkdmJfYnVmX3ByZXBhcmUsCisJLmJ1Zl9xdWV1ZSAgICA9IGR2Yl9idWZfcXVldWUsCisJLmJ1Zl9yZWxlYXNlICA9IGR2Yl9idWZfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGR2aWNvX2Z1c2lvbmhkdHZfZGVtb2RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdGF0aWMgdTggY2xvY2tfY29uZmlnIFtdICA9IHsgQ0xPQ0tfQ1RMLCAgMHgzOCwgMHgzOSB9OworCXN0YXRpYyB1OCByZXNldCBbXSAgICAgICAgID0geyBSRVNFVCwgICAgICAweDgwIH07CisJc3RhdGljIHU4IGFkY19jdGxfMV9jZmcgW10gPSB7IEFEQ19DVExfMSwgIDB4NDAgfTsKKwlzdGF0aWMgdTggYWdjX2NmZyBbXSAgICAgICA9IHsgQUdDX1RBUkdFVCwgMHgyNCwgMHgyMCB9OworCXN0YXRpYyB1OCBncHBfY3RsX2NmZyBbXSAgID0geyBHUFBfQ1RMLCAgICAweDMzIH07CisJc3RhdGljIHU4IGNhcHRfcmFuZ2VfY2ZnW10gPSB7IENBUFRfUkFOR0UsIDB4MzIgfTsKKworCW10MzUyX3dyaXRlKGZlLCBjbG9ja19jb25maWcsICAgc2l6ZW9mKGNsb2NrX2NvbmZpZykpOworCXVkZWxheSgyMDApOworCW10MzUyX3dyaXRlKGZlLCByZXNldCwgICAgICAgICAgc2l6ZW9mKHJlc2V0KSk7CisJbXQzNTJfd3JpdGUoZmUsIGFkY19jdGxfMV9jZmcsICBzaXplb2YoYWRjX2N0bF8xX2NmZykpOworCisJbXQzNTJfd3JpdGUoZmUsIGFnY19jZmcsICAgICAgICBzaXplb2YoYWdjX2NmZykpOworCW10MzUyX3dyaXRlKGZlLCBncHBfY3RsX2NmZywgICAgc2l6ZW9mKGdwcF9jdGxfY2ZnKSk7CisJbXQzNTJfd3JpdGUoZmUsIGNhcHRfcmFuZ2VfY2ZnLCBzaXplb2YoY2FwdF9yYW5nZV9jZmcpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbnR2X2xpdmVfZHZidF9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXN0YXRpYyB1OCBjbG9ja19jb25maWcgW10gID0geyAweDg5LCAweDM4LCAweDM5IH07CisJc3RhdGljIHU4IHJlc2V0IFtdICAgICAgICAgPSB7IDB4NTAsIDB4ODAgfTsKKwlzdGF0aWMgdTggYWRjX2N0bF8xX2NmZyBbXSA9IHsgMHg4RSwgMHg0MCB9OworCXN0YXRpYyB1OCBhZ2NfY2ZnIFtdICAgICAgID0geyAweDY3LCAweDEwLCAweDIzLCAweDAwLCAweEZGLCAweEZGLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweEZGLCAweDAwLCAweDQwLCAweDQwIH07CisJc3RhdGljIHU4IGRudHZfZXh0cmFbXSAgICAgPSB7IDB4QjUsIDB4N0EgfTsKKwlzdGF0aWMgdTggY2FwdF9yYW5nZV9jZmdbXSA9IHsgMHg3NSwgMHgzMiB9OworCisJbXQzNTJfd3JpdGUoZmUsIGNsb2NrX2NvbmZpZywgICBzaXplb2YoY2xvY2tfY29uZmlnKSk7CisJdWRlbGF5KDIwMDApOworCW10MzUyX3dyaXRlKGZlLCByZXNldCwgICAgICAgICAgc2l6ZW9mKHJlc2V0KSk7CisJbXQzNTJfd3JpdGUoZmUsIGFkY19jdGxfMV9jZmcsICBzaXplb2YoYWRjX2N0bF8xX2NmZykpOworCisJbXQzNTJfd3JpdGUoZmUsIGFnY19jZmcsICAgICAgICBzaXplb2YoYWdjX2NmZykpOworCXVkZWxheSgyMDAwKTsKKwltdDM1Ml93cml0ZShmZSwgZG50dl9leHRyYSwgICAgIHNpemVvZihkbnR2X2V4dHJhKSk7CisJbXQzNTJfd3JpdGUoZmUsIGNhcHRfcmFuZ2VfY2ZnLCBzaXplb2YoY2FwdF9yYW5nZV9jZmcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10MzUyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsCisJCQkgdTgqIHBsbGJ1ZikKK3sKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OworCisJcGxsYnVmWzBdID0gZGV2LT5jb3JlLT5wbGxfYWRkciA8PCAxOworCWR2Yl9wbGxfY29uZmlndXJlKGRldi0+Y29yZS0+cGxsX2Rlc2MsIHBsbGJ1ZisxLAorCQkJICBwYXJhbXMtPmZyZXF1ZW5jeSwKKwkJCSAgcGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgZHZpY29fZnVzaW9uaGR0diA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MEYsCisJLmRlbW9kX2luaXQgICAgPSBkdmljb19mdXNpb25oZHR2X2RlbW9kX2luaXQsCisJLnBsbF9zZXQgICAgICAgPSBtdDM1Ml9wbGxfc2V0LAorfTsKKworc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgZG50dl9saXZlX2R2YnRfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKKwkuZGVtb2RfaW5pdCAgICA9IGRudHZfbGl2ZV9kdmJ0X2RlbW9kX2luaXQsCisJLnBsbF9zZXQgICAgICAgPSBtdDM1Ml9wbGxfc2V0LAorfTsKKworI2lmIEhBVkVfQ1gyMjcwMgorc3RhdGljIHN0cnVjdCBjeDIyNzAyX2NvbmZpZyBjb25uZXhhbnRfcmVmYm9hcmRfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg0MywKKwkucGxsX2FkZHJlc3MgICA9IDB4NjAsCisJLnBsbF9kZXNjICAgICAgPSAmZHZiX3BsbF90aG9tc29uX2R0dDc1NzksCit9OworCitzdGF0aWMgc3RydWN0IGN4MjI3MDJfY29uZmlnIGhhdXBwYXVnZV9ub3ZhdF9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDQzLAorCS5wbGxfYWRkcmVzcyAgID0gMHg2MSwKKwkucGxsX2Rlc2MgICAgICA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzU5eCwKK307CisjZW5kaWYKKworI2lmIEhBVkVfT1I1MTEzMgorc3RhdGljIGludCBvcjUxMTMyX3NldF90c19wYXJhbShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQlpbnQgaXNfcHVuY3R1cmVkKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY9IGZlLT5kdmItPnByaXY7CisJZGV2LT50c19nZW5fY250cmwgPSBpc19wdW5jdHVyZWQgPyAweDA0IDogMHgwMDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG9yNTExMzJfY29uZmlnIHBjaGR0dl9oZDMwMDAgPSB7CisJLmRlbW9kX2FkZHJlc3MgICAgPSAweDE1LAorCS5wbGxfYWRkcmVzcyAgICAgID0gMHg2MSwKKwkucGxsX2Rlc2MgICAgICAgICA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzYxMCwKKwkuc2V0X3RzX3BhcmFtcyAgICA9IG9yNTExMzJfc2V0X3RzX3BhcmFtLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGR2Yl9yZWdpc3RlcihzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQoreworCS8qIGluaXQgc3RydWN0IHZpZGVvYnVmX2R2YiAqLworCWRldi0+ZHZiLm5hbWUgPSBkZXYtPmNvcmUtPm5hbWU7CisJZGV2LT50c19nZW5fY250cmwgPSAweDBjOworCisJLyogaW5pdCBmcm9udGVuZCAqLworCXN3aXRjaCAoZGV2LT5jb3JlLT5ib2FyZCkgeworI2lmIEhBVkVfQ1gyMjcwMgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxOgorCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGN4MjI3MDJfYXR0YWNoKCZoYXVwcGF1Z2Vfbm92YXRfY29uZmlnLAorCQkJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfQ09ORVhBTlRfRFZCX1QxOgorCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGN4MjI3MDJfYXR0YWNoKCZjb25uZXhhbnRfcmVmYm9hcmRfY29uZmlnLAorCQkJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UMToKKwkJZGV2LT5jb3JlLT5wbGxfYWRkciA9IDB4NjE7CisJCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9sZ196MjAxOworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0diwKKwkJCQkJCSAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BMVVM6CisJCWRldi0+Y29yZS0+cGxsX2FkZHIgPSAweDYwOworCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTc5OworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0diwKKwkJCQkJCSAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfRFZCX1Q6CisJY2FzZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVDoKKwkJZGV2LT5jb3JlLT5wbGxfYWRkciA9IDB4NjE7CisJCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF91bmtub3duXzE7CisJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZkbnR2X2xpdmVfZHZidF9jb25maWcsCisJCQkJCQkgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlicmVhazsKKyNpZiBIQVZFX09SNTExMzIKKwljYXNlIENYODhfQk9BUkRfUENIRFRWX0hEMzAwMDoKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSBvcjUxMTMyX2F0dGFjaCgmcGNoZHR2X2hkMzAwMCwKKwkJCQkJCSAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcHJpbnRrKCIlczogVGhlIGZyb250ZW5kIG9mIHlvdXIgRFZCL0FUU0MgY2FyZCBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iCisJCSAgICAgICAiJXM6IHlvdSBtaWdodCB3YW50IHRvIGxvb2sgb3V0IGZvciBwYXRjaGVzIGhlcmU6XG4iCisJCSAgICAgICAiJXM6ICAgICBodHRwOi8vZGwuYnl0ZXNleC5vcmcvcGF0Y2hlcy9cbiIsCisJCSAgICAgICBkZXYtPmNvcmUtPm5hbWUsIGRldi0+Y29yZS0+bmFtZSwgZGV2LT5jb3JlLT5uYW1lKTsKKwkJYnJlYWs7CisJfQorCWlmIChOVUxMID09IGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCXByaW50aygiJXM6IGZyb250ZW5kIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIixkZXYtPmNvcmUtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGRldi0+Y29yZS0+cGxsX2Rlc2MpIHsKKwkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWluID0gZGV2LT5jb3JlLT5wbGxfZGVzYy0+bWluOworCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9tYXggPSBkZXYtPmNvcmUtPnBsbF9kZXNjLT5tYXg7CisJfQorCisJLyogQ29weSB0aGUgYm9hcmQgbmFtZSBpbnRvIHRoZSBEVkIgc3RydWN0dXJlICovCisJc3RybGNweShkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLm5hbWUsCisJCWN4ODhfYm9hcmRzW2Rldi0+Y29yZS0+Ym9hcmRdLm5hbWUsCisJCXNpemVvZihkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLm5hbWUpKTsKKworCS8qIHJlZ2lzdGVyIGV2ZXJ5dGhpbmcgKi8KKwlyZXR1cm4gdmlkZW9idWZfZHZiX3JlZ2lzdGVyKCZkZXYtPmR2YiwgVEhJU19NT0RVTEUsIGRldik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGR2Yl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY7CisJc3RydWN0IGN4ODhfY29yZSAgKmNvcmU7CisJaW50IGVycjsKKworCS8qIGdlbmVyYWwgc2V0dXAgKi8KKwljb3JlID0gY3g4OF9jb3JlX2dldChwY2lfZGV2KTsKKwlpZiAoTlVMTCA9PSBjb3JlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0uZHZiKQorCQlnb3RvIGZhaWxfY29yZTsKKworCWVyciA9IC1FTk9NRU07CisJZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gZGV2KQorCQlnb3RvIGZhaWxfY29yZTsKKwltZW1zZXQoZGV2LDAsc2l6ZW9mKCpkZXYpKTsKKwlkZXYtPnBjaSA9IHBjaV9kZXY7CisJZGV2LT5jb3JlID0gY29yZTsKKworCWVyciA9IGN4ODgwMl9pbml0X2NvbW1vbihkZXYpOworCWlmICgwICE9IGVycikKKwkJZ290byBmYWlsX2ZyZWU7CisKKwkvKiBkdmIgc3R1ZmYgKi8KKwlwcmludGsoIiVzLzI6IGN4MjM4OHggYmFzZWQgZHZiIGNhcmRcbiIsIGNvcmUtPm5hbWUpOworCXZpZGVvYnVmX3F1ZXVlX2luaXQoJmRldi0+ZHZiLmR2YnEsICZkdmJfcW9wcywKKwkJCSAgICBkZXYtPnBjaSwgJmRldi0+c2xvY2ssCisJCQkgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkJICAgIFY0TDJfRklFTERfVE9QLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgY3g4OF9idWZmZXIpLAorCQkJICAgIGRldik7CisJZXJyID0gZHZiX3JlZ2lzdGVyKGRldik7CisJaWYgKDAgIT0gZXJyKQorCQlnb3RvIGZhaWxfZnJlZTsKKwlyZXR1cm4gMDsKKworIGZhaWxfZnJlZToKKwlrZnJlZShkZXYpOworIGZhaWxfY29yZToKKwljeDg4X2NvcmVfcHV0KGNvcmUscGNpX2Rldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGR2Yl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisgICAgICAgIHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisKKwkvKiBkdmIgKi8KKwl2aWRlb2J1Zl9kdmJfdW5yZWdpc3RlcigmZGV2LT5kdmIpOworCisJLyogY29tbW9uICovCisJY3g4ODAyX2ZpbmlfY29tbW9uKGRldik7CisJY3g4OF9jb3JlX3B1dChkZXYtPmNvcmUsZGV2LT5wY2kpOworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeDg4MDJfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvciAgICAgICA9IDB4MTRmMSwKKwkJLmRldmljZSAgICAgICA9IDB4ODgwMiwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwl9LHsKKwkJLyogLS0tIGVuZCBvZiBsaXN0IC0tLSAqLworCX0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY3g4ODAyX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHZiX3BjaV9kcml2ZXIgPSB7CisgICAgICAgIC5uYW1lICAgICA9ICJjeDg4LWR2YiIsCisgICAgICAgIC5pZF90YWJsZSA9IGN4ODgwMl9wY2lfdGJsLAorICAgICAgICAucHJvYmUgICAgPSBkdmJfcHJvYmUsCisgICAgICAgIC5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGR2Yl9yZW1vdmUpLAorCS5zdXNwZW5kICA9IGN4ODgwMl9zdXNwZW5kX2NvbW1vbiwKKwkucmVzdW1lICAgPSBjeDg4MDJfcmVzdW1lX2NvbW1vbiwKK307CisKK3N0YXRpYyBpbnQgZHZiX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4IGR2YiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCisJICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAorCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gIDgpICYgMHhmZiwKKwkgICAgICAgQ1g4OF9WRVJTSU9OX0NPREUgJiAweGZmKTsKKyNpZmRlZiBTTkFQU0hPVAorCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHg6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCisJICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7CisjZW5kaWYKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHZiX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBkdmJfZmluaSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHZiX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkdmJfaW5pdCk7Cittb2R1bGVfZXhpdChkdmJfZmluaSk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogY29tcGlsZS1jb21tYW5kOiAibWFrZSBEVkI9MSIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDgwMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgICAgJElkOiBjeDg4LWkyYy5jLHYgMS4yMCAyMDA1LzAyLzE1IDE1OjU5OjM1IGtyYXhlbCBFeHAgJAorCisgICAgY3g4OC1pMmMuYyAgLS0gIGFsbCB0aGUgaTJjIGNvZGUgaXMgaGVyZQorCisgICAgQ29weXJpZ2h0IChDKSAxOTk2LDk3LDk4IFJhbHBoICBNZXR6bGVyIChyamttQHRocC51bmkta29lbG4uZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIChtb2NtQHRocC51bmkta29lbG4uZGUpCisgICAgKGMpIDIwMDIgWXVyaWogU3lzb2V2IDx5dXJpakBuYXR1cmVzb2Z0Lm5ldD4KKyAgICAoYykgMTk5OS0yMDAzIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImN4ODguaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBpMmNfZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGkyY19kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaTJjX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2kyY10iKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBpMmNfc2NhbiA9IDA7Cittb2R1bGVfcGFyYW0oaTJjX3NjYW4sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGkyY19zY2FuLCJzY2FuIGkyYyBidXMgYXQgaW5zbW9kIHRpbWUiKTsKKworI2RlZmluZSBkcHJpbnRrKGxldmVsLGZtdCwgYXJnLi4uKQlpZiAoaTJjX2RlYnVnID49IGxldmVsKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZtdCwgY29yZS0+bmFtZSAsICMjIGFyZykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBjeDg4MDBfYml0X3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRhdGE7CisKKwlpZiAoc3RhdGUpCisJCWNvcmUtPmkyY19zdGF0ZSB8PSAweDAyOworCWVsc2UKKwkJY29yZS0+aTJjX3N0YXRlICY9IH4weDAyOworCWN4X3dyaXRlKE1PX0kyQywgY29yZS0+aTJjX3N0YXRlKTsKKwljeF9yZWFkKE1PX0kyQyk7Cit9CisKK3ZvaWQgY3g4ODAwX2JpdF9zZXRzZGEodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkYXRhOworCisJaWYgKHN0YXRlKQorCQljb3JlLT5pMmNfc3RhdGUgfD0gMHgwMTsKKwllbHNlCisJCWNvcmUtPmkyY19zdGF0ZSAmPSB+MHgwMTsKKwljeF93cml0ZShNT19JMkMsIGNvcmUtPmkyY19zdGF0ZSk7CisJY3hfcmVhZChNT19JMkMpOworfQorCitzdGF0aWMgaW50IGN4ODgwMF9iaXRfZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRhdGE7CisJdTMyIHN0YXRlOworCisJc3RhdGUgPSBjeF9yZWFkKE1PX0kyQyk7CisJcmV0dXJuIHN0YXRlICYgMHgwMiA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IGN4ODgwMF9iaXRfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRhdGE7CisJdTMyIHN0YXRlOworCisJc3RhdGUgPSBjeF9yZWFkKE1PX0kyQyk7CisJcmV0dXJuIHN0YXRlICYgMHgwMTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBhdHRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKworCWRwcmludGsoMSwgImkyYyBhdHRhY2ggW2FkZHI9MHgleCxjbGllbnQ9JXNdXG4iLAorCQljbGllbnQtPmFkZHIsIGkyY19jbGllbnRuYW1lKGNsaWVudCkpOworCWlmICghY2xpZW50LT5kcml2ZXItPmNvbW1hbmQpCisJCXJldHVybiAwOworCisJaWYgKGNvcmUtPnR1bmVyX3R5cGUgIT0gVU5TRVQpCisJCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCwgVFVORVJfU0VUX1RZUEUsICZjb3JlLT50dW5lcl90eXBlKTsKKwlpZiAoY29yZS0+dGRhOTg4N19jb25mKQorCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsIFREQTk4ODdfU0VUX0NPTkZJRywgJmNvcmUtPnRkYTk4ODdfY29uZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGV0YWNoX2luZm9ybShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBpMmNfZ2V0X2FkYXBkYXRhKGNsaWVudC0+YWRhcHRlcik7CisKKwlkcHJpbnRrKDEsICJpMmMgZGV0YWNoIFtjbGllbnQ9JXNdXG4iLCBpMmNfY2xpZW50bmFtZShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjeDg4X2NhbGxfaTJjX2NsaWVudHMoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWlmICgwICE9IGNvcmUtPmkyY19yYykKKwkJcmV0dXJuOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmNvcmUtPmkyY19hZGFwLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgY3g4ODAwX2kyY19hbGdvX3RlbXBsYXRlID0geworCS5zZXRzZGEgID0gY3g4ODAwX2JpdF9zZXRzZGEsCisJLnNldHNjbCAgPSBjeDg4MDBfYml0X3NldHNjbCwKKwkuZ2V0c2RhICA9IGN4ODgwMF9iaXRfZ2V0c2RhLAorCS5nZXRzY2wgID0gY3g4ODAwX2JpdF9nZXRzY2wsCisJLnVkZWxheSAgPSAxNiwKKwkubWRlbGF5ICA9IDEwLAorCS50aW1lb3V0ID0gMjAwLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBjeDg4MDBfaTJjX2FkYXBfdGVtcGxhdGUgPSB7CisJSTJDX0RFVk5BTUUoImN4MjM4OHgiKSwKKwkub3duZXIgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkuaWQgICAgICAgICAgICAgICAgPSBJMkNfSFdfQl9DWDIzODh4LAorCS5jbGllbnRfcmVnaXN0ZXIgICA9IGF0dGFjaF9pbmZvcm0sCisJLmNsaWVudF91bnJlZ2lzdGVyID0gZGV0YWNoX2luZm9ybSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjeDg4MDBfaTJjX2NsaWVudF90ZW1wbGF0ZSA9IHsKKyAgICAgICAgSTJDX0RFVk5BTUUoImN4ODh4eCBpbnRlcm5hbCIpLAorfTsKKworc3RhdGljIGNoYXIgKmkyY19kZXZzWzEyOF0gPSB7CisJWyAweDg2ID4+IDEgXSA9ICJ0ZGE5ODg3L2N4MjI3MDIiLAorCVsgMHhhMCA+PiAxIF0gPSAiZWVwcm9tIiwKKwlbIDB4YzAgPj4gMSBdID0gInR1bmVyIChhbmFsb2cpIiwKKwlbIDB4YzIgPj4gMSBdID0gInR1bmVyIChhbmFsb2cvZHZiKSIsCit9OworCitzdGF0aWMgdm9pZCBkb19pMmNfc2NhbihjaGFyICpuYW1lLCBzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgaSxyYzsKKworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQljLT5hZGRyID0gaTsKKwkJcmMgPSBpMmNfbWFzdGVyX3JlY3YoYywmYnVmLDApOworCQlpZiAocmMgPCAwKQorCQkJY29udGludWU7CisJCXByaW50aygiJXM6IGkyYyBzY2FuOiBmb3VuZCBkZXZpY2UgQCAweCV4ICBbJXNdXG4iLAorCQkgICAgICAgbmFtZSwgaSA8PCAxLCBpMmNfZGV2c1tpXSA/IGkyY19kZXZzW2ldIDogIj8/PyIpOworCX0KK30KKworLyogaW5pdCArIHJlZ2lzdGVyIGkyYyBhbGdvLWJpdCBhZGFwdGVyICovCitpbnQgY3g4OF9pMmNfaW5pdChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCBzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCW1lbWNweSgmY29yZS0+aTJjX2FkYXAsICZjeDg4MDBfaTJjX2FkYXBfdGVtcGxhdGUsCisJICAgICAgIHNpemVvZihjb3JlLT5pMmNfYWRhcCkpOworCW1lbWNweSgmY29yZS0+aTJjX2FsZ28sICZjeDg4MDBfaTJjX2FsZ29fdGVtcGxhdGUsCisJICAgICAgIHNpemVvZihjb3JlLT5pMmNfYWxnbykpOworCW1lbWNweSgmY29yZS0+aTJjX2NsaWVudCwgJmN4ODgwMF9pMmNfY2xpZW50X3RlbXBsYXRlLAorCSAgICAgICBzaXplb2YoY29yZS0+aTJjX2NsaWVudCkpOworCisJaWYgKGNvcmUtPnR1bmVyX3R5cGUgIT0gVFVORVJfQUJTRU5UKQorCQljb3JlLT5pMmNfYWRhcC5jbGFzcyB8PSBJMkNfQ0xBU1NfVFZfQU5BTE9HOworCWlmIChjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0uZHZiKQorCQljb3JlLT5pMmNfYWRhcC5jbGFzcyB8PSBJMkNfQ0xBU1NfVFZfRElHSVRBTDsKKworCWNvcmUtPmkyY19hZGFwLmRldi5wYXJlbnQgPSAmcGNpLT5kZXY7CisJc3RybGNweShjb3JlLT5pMmNfYWRhcC5uYW1lLGNvcmUtPm5hbWUsc2l6ZW9mKGNvcmUtPmkyY19hZGFwLm5hbWUpKTsKKyAgICAgICAgY29yZS0+aTJjX2FsZ28uZGF0YSA9IGNvcmU7CisgICAgICAgIGkyY19zZXRfYWRhcGRhdGEoJmNvcmUtPmkyY19hZGFwLGNvcmUpOworICAgICAgICBjb3JlLT5pMmNfYWRhcC5hbGdvX2RhdGEgPSAmY29yZS0+aTJjX2FsZ287CisgICAgICAgIGNvcmUtPmkyY19jbGllbnQuYWRhcHRlciA9ICZjb3JlLT5pMmNfYWRhcDsKKworCWN4ODgwMF9iaXRfc2V0c2NsKGNvcmUsMSk7CisJY3g4ODAwX2JpdF9zZXRzZGEoY29yZSwxKTsKKworCWNvcmUtPmkyY19yYyA9IGkyY19iaXRfYWRkX2J1cygmY29yZS0+aTJjX2FkYXApOworCWlmICgwID09IGNvcmUtPmkyY19yYykgeworCQlkcHJpbnRrKDEsICJpMmMgcmVnaXN0ZXIgb2tcbiIpOworCQlpZiAoaTJjX3NjYW4pCisJCQlkb19pMmNfc2Nhbihjb3JlLT5uYW1lLCZjb3JlLT5pMmNfY2xpZW50KTsKKwl9IGVsc2UKKwkJcHJpbnRrKCIlczogaTJjIHJlZ2lzdGVyIEZBSUxFRFxuIiwgY29yZS0+bmFtZSk7CisJcmV0dXJuIGNvcmUtPmkyY19yYzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworRVhQT1JUX1NZTUJPTChjeDg4X2NhbGxfaTJjX2NsaWVudHMpOworRVhQT1JUX1NZTUJPTChjeDg4X2kyY19pbml0KTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNmFkOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogJElkOiBjeDg4LWlucHV0LmMsdiAxLjkgMjAwNS8wMy8wNCAwOToxMjoyMyBrcmF4ZWwgRXhwICQKKyAqCisgKiBEZXZpY2UgZHJpdmVyIGZvciBHUElPIGF0dGFjaGVkIHJlbW90ZSBjb250cm9sIGludGVyZmFjZXMKKyAqIG9uIENvbmV4YW50IDIzODh4IGJhc2VkIFRWL0RWQiBjYXJkcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUGF2ZWwgTWFjaGVrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgR2VyZCBLbm9ycgorICogQ29weXJpZ2h0IChjKSAyMDA0IENocmlzIFBhc2NvZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgPG1lZGlhL2lyLWNvbW1vbi5oPgorCisjaW5jbHVkZSAiY3g4OC5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIERpZ2l0YWxOb3cgRE5UViBMaXZlIERWQi1UIFJlbW90ZSAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2RudHZfbGl2ZV9kdmJfdFtJUl9LRVlUQUJfU0laRV0gPSB7CisJWyAweDAwIF0gPSBLRVlfRVNDLCAgICAgICAgIC8vICdnbyB1cCBhIGxldmVsPycKKwlbIDB4MDEgXSA9IEtFWV9LUDEsICAgICAgICAgLy8gJzEnCisJWyAweDAyIF0gPSBLRVlfS1AyLCAgICAgICAgIC8vICcyJworCVsgMHgwMyBdID0gS0VZX0tQMywgICAgICAgICAvLyAnMycKKwlbIDB4MDQgXSA9IEtFWV9LUDQsICAgICAgICAgLy8gJzQnCisJWyAweDA1IF0gPSBLRVlfS1A1LCAgICAgICAgIC8vICc1JworCVsgMHgwNiBdID0gS0VZX0tQNiwgICAgICAgICAvLyAnNicKKwlbIDB4MDcgXSA9IEtFWV9LUDcsICAgICAgICAgLy8gJzcnCisJWyAweDA4IF0gPSBLRVlfS1A4LCAgICAgICAgIC8vICc4JworCVsgMHgwOSBdID0gS0VZX0tQOSwgICAgICAgICAvLyAnOScKKwlbIDB4MGEgXSA9IEtFWV9LUDAsICAgICAgICAgLy8gJzAnCisJWyAweDBiIF0gPSBLRVlfVFVORVIsICAgICAgIC8vICd0di9mbScKKwlbIDB4MGMgXSA9IEtFWV9TRUFSQ0gsICAgICAgLy8gJ3NjYW4nCisJWyAweDBkIF0gPSBLRVlfU1RPUCwgICAgICAgIC8vICdzdG9wJworCVsgMHgwZSBdID0gS0VZX1BBVVNFLCAgICAgICAvLyAncGF1c2UnCisJWyAweDBmIF0gPSBLRVlfTElTVCwgICAgICAgIC8vICdzb3VyY2UnCisKKwlbIDB4MTAgXSA9IEtFWV9NVVRFLCAgICAgICAgLy8gJ211dGUnCisJWyAweDExIF0gPSBLRVlfUkVXSU5ELCAgICAgIC8vICdiYWNrd2FyZCA8PCcKKwlbIDB4MTIgXSA9IEtFWV9QT1dFUiwgICAgICAgLy8gJ3Bvd2VyJworCVsgMHgxMyBdID0gS0VZX1MsICAgICAgICAgICAvLyAnc25hcCcKKwlbIDB4MTQgXSA9IEtFWV9BVURJTywgICAgICAgLy8gJ3N0ZXJlbycKKwlbIDB4MTUgXSA9IEtFWV9DTEVBUiwgICAgICAgLy8gJ3Jlc2V0JworCVsgMHgxNiBdID0gS0VZX1BMQVksICAgICAgICAvLyAncGxheScKKwlbIDB4MTcgXSA9IEtFWV9FTlRFUiwgICAgICAgLy8gJ2VudGVyJworCVsgMHgxOCBdID0gS0VZX1pPT00sICAgICAgICAvLyAnZnVsbCBzY3JlZW4nCisJWyAweDE5IF0gPSBLRVlfRkFTVEZPUldBUkQsIC8vICdmb3J3YXJkID4+JworCVsgMHgxYSBdID0gS0VZX0NIQU5ORUxVUCwgICAvLyAnY2hhbm5lbCArJworCVsgMHgxYiBdID0gS0VZX1ZPTFVNRVVQLCAgICAvLyAndm9sdW1lICsnCisJWyAweDFjIF0gPSBLRVlfSU5GTywgICAgICAgIC8vICdwcmV2aWV3JworCVsgMHgxZCBdID0gS0VZX1JFQ09SRCwgICAgICAvLyAncmVjb3JkJworCVsgMHgxZSBdID0gS0VZX0NIQU5ORUxET1dOLCAvLyAnY2hhbm5lbCAtJworCVsgMHgxZiBdID0gS0VZX1ZPTFVNRURPV04sICAvLyAndm9sdW1lIC0nCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIElPLURBVEEgQkNUVjdFIFJlbW90ZSAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2lvZGF0YV9iY3R2N2VbSVJfS0VZVEFCX1NJWkVdID0geworCVsgMHg0MCBdID0gS0VZX1RWLCAgICAgICAgICAgICAgLy8gVFYKKwlbIDB4MjAgXSA9IEtFWV9SQURJTywgICAgICAgICAgIC8vIEZNCisJWyAweDYwIF0gPSBLRVlfRVBHLCAgICAgICAgICAgICAvLyBFUEcKKwlbIDB4MDAgXSA9IEtFWV9QT1dFUiwgICAgICAgICAgIC8vIHBvd2VyCisKKwlbIDB4NTAgXSA9IEtFWV9LUDEsICAgICAgICAgICAgIC8vIDEKKwlbIDB4MzAgXSA9IEtFWV9LUDIsICAgICAgICAgICAgIC8vIDIKKwlbIDB4NzAgXSA9IEtFWV9LUDMsICAgICAgICAgICAgIC8vIDMKKwlbIDB4MTAgXSA9IEtFWV9MLCAgICAgICAgICAgICAgIC8vIExpdmUKKworCVsgMHg0OCBdID0gS0VZX0tQNCwgICAgICAgICAgICAgLy8gNAorCVsgMHgyOCBdID0gS0VZX0tQNSwgICAgICAgICAgICAgLy8gNQorCVsgMHg2OCBdID0gS0VZX0tQNiwgICAgICAgICAgICAgLy8gNgorCVsgMHgwOCBdID0gS0VZX1QsICAgICAgICAgICAgICAgLy8gVGltZSBTaGlmdAorCisJWyAweDU4IF0gPSBLRVlfS1A3LCAgICAgICAgICAgICAvLyA3CisJWyAweDM4IF0gPSBLRVlfS1A4LCAgICAgICAgICAgICAvLyA4CisJWyAweDc4IF0gPSBLRVlfS1A5LCAgICAgICAgICAgICAvLyA5CisJWyAweDE4IF0gPSBLRVlfUExBWVBBVVNFLCAgICAgICAvLyBQbGF5CisKKwlbIDB4NDQgXSA9IEtFWV9LUDAsICAgICAgICAgICAgIC8vIDEwCisJWyAweDI0IF0gPSBLRVlfRU5URVIsICAgICAgICAgICAvLyAxMQorCVsgMHg2NCBdID0gS0VZX0VTQywgICAgICAgICAgICAgLy8gMTIKKwlbIDB4MDQgXSA9IEtFWV9NLCAgICAgICAgICAgICAgIC8vIE11bHRpCisKKwlbIDB4NTQgXSA9IEtFWV9WSURFTywgICAgICAgICAgIC8vIFZJREVPCisJWyAweDM0IF0gPSBLRVlfQ0hBTk5FTFVQLCAgICAgICAvLyBjaGFubmVsICsKKwlbIDB4NzQgXSA9IEtFWV9WT0xVTUVVUCwgICAgICAgIC8vIHZvbHVtZSArCisJWyAweDE0IF0gPSBLRVlfTVVURSwgICAgICAgICAgICAvLyBNdXRlCisKKwlbIDB4NGMgXSA9IEtFWV9TLCAgICAgICAgICAgICAgIC8vIFNWSURFTworCVsgMHgyYyBdID0gS0VZX0NIQU5ORUxET1dOLCAgICAgLy8gY2hhbm5lbCAtCisJWyAweDZjIF0gPSBLRVlfVk9MVU1FRE9XTiwgICAgICAvLyB2b2x1bWUgLQorCVsgMHgwYyBdID0gS0VZX1pPT00sICAgICAgICAgICAgLy8gWm9vbQorCisJWyAweDVjIF0gPSBLRVlfUEFVU0UsICAgICAgICAgICAvLyBwYXVzZQorCVsgMHgzYyBdID0gS0VZX0MsICAgICAgICAgICAgICAgLy8gfHwgKHJlZCkKKwlbIDB4N2MgXSA9IEtFWV9SRUNPUkQsICAgICAgICAgIC8vIHJlY29yZGluZworCVsgMHgxYyBdID0gS0VZX1NUT1AsICAgICAgICAgICAgLy8gc3RvcAorCisJWyAweDQxIF0gPSBLRVlfUkVXSU5ELCAgICAgICAgICAvLyBiYWNrd2FyZCA8PAorCVsgMHgyMSBdID0gS0VZX1BMQVksICAgICAgICAgICAgLy8gcGxheQorCVsgMHg2MSBdID0gS0VZX0ZBU1RGT1JXQVJELCAgICAgLy8gZm9yd2FyZCA+PgorCVsgMHgwMSBdID0gS0VZX05FWFQsICAgICAgICAgICAgLy8gc2tpcCA+fAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgY3g4OF9JUiB7CisJc3RydWN0IGN4ODhfY29yZQkqY29yZTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICAgICAgICBpbnB1dDsKKwlzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgICBpcjsKKwljaGFyICAgICAgICAgICAgICAgICAgICBuYW1lWzMyXTsKKwljaGFyICAgICAgICAgICAgICAgICAgICBwaHlzWzMyXTsKKworCS8qIHNhbXBsZSBmcm9tIGdwaW8gcGluIDE2ICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmc7CisJdTMyICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1sxNl07CisJaW50ICAgICAgICAgICAgICAgICAgICAgc2NvdW50OworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHJlbGVhc2U7CisKKwkvKiBwb2xsIGV4dGVybmFsIGRlY29kZXIgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBwb2xsaW5nOworCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIHdvcms7CisJc3RydWN0IHRpbWVyX2xpc3QgICAgICAgdGltZXI7CisJdTMyCQkJZ3Bpb19hZGRyOworCXUzMiAgICAgICAgICAgICAgICAgICAgIGxhc3RfZ3BpbzsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBtYXNrX2tleWNvZGU7CisJdTMyICAgICAgICAgICAgICAgICAgICAgbWFza19rZXlkb3duOworCXUzMiAgICAgICAgICAgICAgICAgICAgIG1hc2tfa2V5dXA7Cit9OworCitzdGF0aWMgaW50IGlyX2RlYnVnID0gMDsKK21vZHVsZV9wYXJhbShpcl9kZWJ1ZywgaW50LCAwNjQ0KTsgICAgLyogZGVidWcgbGV2ZWwgW0lSXSAqLworTU9EVUxFX1BBUk1fREVTQyhpcl9kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbSVJdIik7CisKKyNkZWZpbmUgaXJfZHByaW50ayhmbXQsIGFyZy4uLikJaWYgKGlyX2RlYnVnKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIElSOiAiIGZtdCAsIGlyLT5jb3JlLT5uYW1lLCAjIyBhcmcpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgY3g4OF9pcl9oYW5kbGVfa2V5KHN0cnVjdCBjeDg4X0lSICppcikKK3sKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gaXItPmNvcmU7CisJdTMyIGdwaW8sIGRhdGE7CisKKwkvKiByZWFkIGdwaW8gdmFsdWUgKi8KKwlncGlvID0gY3hfcmVhZChpci0+Z3Bpb19hZGRyKTsKKwlpZiAoaXItPnBvbGxpbmcpIHsKKwkJaWYgKGlyLT5sYXN0X2dwaW8gPT0gZ3BpbykKKwkJCXJldHVybjsKKwkJaXItPmxhc3RfZ3BpbyA9IGdwaW87CisJfQorCisJLyogZXh0cmFjdCBkYXRhICovCisJZGF0YSA9IGlyX2V4dHJhY3RfYml0cyhncGlvLCBpci0+bWFza19rZXljb2RlKTsKKwlpcl9kcHJpbnRrKCJpcnEgZ3Bpbz0weCV4IGNvZGU9JWQgfCAlcyVzJXNcbiIsCisJCWdwaW8sIGRhdGEsCisJCWlyLT5wb2xsaW5nICAgICAgICAgICAgICAgPyAicG9sbCIgIDogImlycSIsCisJCShncGlvICYgaXItPm1hc2tfa2V5ZG93bikgPyAiIGRvd24iIDogIiIsCisJCShncGlvICYgaXItPm1hc2tfa2V5dXApICAgPyAiIHVwIiAgIDogIiIpOworCisJaWYgKGlyLT5tYXNrX2tleWRvd24pIHsKKwkJLyogYml0IHNldCBvbiBrZXlkb3duICovCisJCWlmIChncGlvICYgaXItPm1hc2tfa2V5ZG93bikgeworCQkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCZpci0+aXIsZGF0YSxkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJCX0KKworCX0gZWxzZSBpZiAoaXItPm1hc2tfa2V5dXApIHsKKwkJLyogYml0IGNsZWFyZWQgb24ga2V5ZG93biAqLworCQlpZiAoMCA9PSAoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSkgeworCQkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCZpci0+aXIsZGF0YSxkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJCX0KKworCX0gZWxzZSB7CisJCS8qIGNhbid0IGRpc3Rpbmd1aXNoIGtleWRvd24vdXAgOi0vICovCisJCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwmaXItPmlyLGRhdGEsZGF0YSk7CisJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBpcl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGN4ODhfSVIgKmlyID0gKHN0cnVjdCBjeDg4X0lSKilkYXRhOworCisJc2NoZWR1bGVfd29yaygmaXItPndvcmspOworfQorCitzdGF0aWMgdm9pZCBjeDg4X2lyX3dvcmsodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY3g4OF9JUiAqaXIgPSBkYXRhOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWN4ODhfaXJfaGFuZGxlX2tleShpcik7CisJdGltZW91dCA9IGppZmZpZXMgKyAoaXItPnBvbGxpbmcgKiBIWiAvIDEwMDApOworCW1vZF90aW1lcigmaXItPnRpbWVyLCB0aW1lb3V0KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgY3g4OF9pcl9pbml0KHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc3RydWN0IGN4ODhfSVIgKmlyOworCUlSX0tFWVRBQl9UWVBFICppcl9jb2RlcyA9IE5VTEw7CisJaW50IGlyX3R5cGUgPSBJUl9UWVBFX09USEVSOworCisJaXIgPSBrbWFsbG9jKHNpemVvZigqaXIpLEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGlyKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoaXIsMCxzaXplb2YoKmlyKSk7CisKKwkvKiBkZXRlY3QgJiBjb25maWd1cmUgKi8KKwlzd2l0Y2ggKGNvcmUtPmJvYXJkKSB7CisJY2FzZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVDoKKwkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX2RudHZfbGl2ZV9kdmJfdDsKKwkJaXItPmdwaW9fYWRkciAgICA9IE1PX0dQMV9JTzsKKwkJaXItPm1hc2tfa2V5Y29kZSA9IDB4MWY7CisJCWlyLT5tYXNrX2tleXVwICAgPSAweDYwOworCQlpci0+cG9sbGluZyAgICAgID0gNTA7IC8vIG1zCisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0U6CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3OworCQlpcl90eXBlICAgICAgICAgID0gSVJfVFlQRV9SQzU7CisJCWlyLT5zYW1wbGluZyAgICAgPSAxOworCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVDIwMDBYUF9FWFBFUlQ6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc193aW5mYXN0OworCQlpci0+Z3Bpb19hZGRyICAgID0gTU9fR1AwX0lPOworCQlpci0+bWFza19rZXljb2RlID0gMHg4Zjg7CisJCWlyLT5tYXNrX2tleXVwICAgPSAweDEwMDsKKwkJaXItPnBvbGxpbmcgICAgICA9IDE7IC8vIG1zCisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9JT0RBVEFfR1ZCQ1RWN0U6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19pb2RhdGFfYmN0djdlOworCQlpci0+Z3Bpb19hZGRyICAgID0gTU9fR1AwX0lPOworCQlpci0+bWFza19rZXljb2RlID0gMHhmZDsKKwkJaXItPm1hc2tfa2V5ZG93biA9IDB4MDI7CisJCWlyLT5wb2xsaW5nICAgICAgPSA1OyAvLyBtcworCQlicmVhazsKKwl9CisJaWYgKE5VTEwgPT0gaXJfY29kZXMpIHsKKwkJa2ZyZWUoaXIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBpbml0IGlucHV0IGRldmljZSAqLworCXNucHJpbnRmKGlyLT5uYW1lLCBzaXplb2YoaXItPm5hbWUpLCAiY3g4OCBJUiAoJXMpIiwKKwkJIGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5uYW1lKTsKKwlzbnByaW50Zihpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSwgInBjaS0lcy9pcjAiLAorCQkgcGNpX25hbWUocGNpKSk7CisKKwlpcl9pbnB1dF9pbml0KCZpci0+aW5wdXQsICZpci0+aXIsIGlyX3R5cGUsIGlyX2NvZGVzKTsKKwlpci0+aW5wdXQubmFtZSA9IGlyLT5uYW1lOworCWlyLT5pbnB1dC5waHlzID0gaXItPnBoeXM7CisJaXItPmlucHV0LmlkLmJ1c3R5cGUgPSBCVVNfUENJOworCWlyLT5pbnB1dC5pZC52ZXJzaW9uID0gMTsKKwlpZiAocGNpLT5zdWJzeXN0ZW1fdmVuZG9yKSB7CisJCWlyLT5pbnB1dC5pZC52ZW5kb3IgID0gcGNpLT5zdWJzeXN0ZW1fdmVuZG9yOworCQlpci0+aW5wdXQuaWQucHJvZHVjdCA9IHBjaS0+c3Vic3lzdGVtX2RldmljZTsKKwl9IGVsc2UgeworCQlpci0+aW5wdXQuaWQudmVuZG9yICA9IHBjaS0+dmVuZG9yOworCQlpci0+aW5wdXQuaWQucHJvZHVjdCA9IHBjaS0+ZGV2aWNlOworCX0KKworCS8qIHJlY29yZCBoYW5kbGVzIHRvIG91cnNlbGYgKi8KKwlpci0+Y29yZSA9IGNvcmU7CisJY29yZS0+aXIgPSBpcjsKKworCWlmIChpci0+cG9sbGluZykgeworCQlJTklUX1dPUksoJmlyLT53b3JrLCBjeDg4X2lyX3dvcmssIGlyKTsKKwkJaW5pdF90aW1lcigmaXItPnRpbWVyKTsKKwkJaXItPnRpbWVyLmZ1bmN0aW9uID0gaXJfdGltZXI7CisJCWlyLT50aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKWlyOworCQlzY2hlZHVsZV93b3JrKCZpci0+d29yayk7CisJfQorCWlmIChpci0+c2FtcGxpbmcpIHsKKwkJY29yZS0+cGNpX2lycW1hc2sgfD0gKDE8PDE4KTsgICAvLyBJUl9TTVBfSU5UCisJCWN4X3dyaXRlKE1PX0REU19JTywgMHhhODBhODApOyAgLy8gNCBrSHogc2FtcGxlIHJhdGUKKwkJY3hfd3JpdGUoTU9fRERTQ0ZHX0lPLCAgIDB4NSk7ICAvLyBlbmFibGUKKwl9CisKKwkvKiBhbGwgZG9uZSAqLworCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmaXItPmlucHV0KTsKKwlwcmludGsoIiVzOiByZWdpc3RlcmVkIElSIHJlbW90ZSBjb250cm9sXG4iLCBjb3JlLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCitpbnQgY3g4OF9pcl9maW5pKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpCit7CisJc3RydWN0IGN4ODhfSVIgKmlyID0gY29yZS0+aXI7CisKKwkvKiBza2lwIGRldGFjaCBvbiBub24gYXR0YWNoZWQgYm9hcmRzICovCisJaWYgKE5VTEwgPT0gaXIpCisJCXJldHVybiAwOworCisJaWYgKGlyLT5wb2xsaW5nKSB7CisJCWRlbF90aW1lcigmaXItPnRpbWVyKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmaXItPmlucHV0KTsKKwlrZnJlZShpcik7CisKKwkvKiBkb25lICovCisJY29yZS0+aXIgPSBOVUxMOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgY3g4OF9pcl9pcnEoc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3sKKwlzdHJ1Y3QgY3g4OF9JUiAqaXIgPSBjb3JlLT5pcjsKKwl1MzIgc2FtcGxlcyxyYzU7CisJaW50IGk7CisKKwlpZiAoTlVMTCA9PSBpcikKKwkJcmV0dXJuOworCWlmICghaXItPnNhbXBsaW5nKQorCQlyZXR1cm47CisKKwlzYW1wbGVzID0gY3hfcmVhZChNT19TQU1QTEVfSU8pOworCWlmICgwICE9IHNhbXBsZXMgICYmICAweGZmZmZmZmZmICE9IHNhbXBsZXMpIHsKKwkJLyogcmVjb3JkIHNhbXBsZSBkYXRhICovCisJCWlmIChpci0+c2NvdW50IDwgQVJSQVlfU0laRShpci0+c2FtcGxlcykpCisJCQlpci0+c2FtcGxlc1tpci0+c2NvdW50KytdID0gc2FtcGxlczsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWlyLT5zY291bnQpIHsKKwkJLyogbm90aGluZyB0byBzYW1wbGUgKi8KKwkJaWYgKGlyLT5pci5rZXlwcmVzc2VkICYmIHRpbWVfYWZ0ZXIoamlmZmllcyxpci0+cmVsZWFzZSkpCisJCQlpcl9pbnB1dF9ub2tleSgmaXItPmlucHV0LCZpci0+aXIpOworCQlyZXR1cm47CisJfQorCisJLyogaGF2ZSBhIGNvbXBsZXRlIHNhbXBsZSAqLworCWlmIChpci0+c2NvdW50IDwgQVJSQVlfU0laRShpci0+c2FtcGxlcykpCisJCWlyLT5zYW1wbGVzW2lyLT5zY291bnQrK10gPSBzYW1wbGVzOworCWZvciAoaSA9IDA7IGkgPCBpci0+c2NvdW50OyBpKyspCisJCWlyLT5zYW1wbGVzW2ldID0gfmlyLT5zYW1wbGVzW2ldOworCWlmIChpcl9kZWJ1ZykKKwkJaXJfZHVtcF9zYW1wbGVzKGlyLT5zYW1wbGVzLGlyLT5zY291bnQpOworCisJLyogZGVjb2RlIGl0ICovCisJc3dpdGNoIChjb3JlLT5ib2FyZCkgeworCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0U6CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6CisJCXJjNSA9IGlyX2RlY29kZV9iaXBoYXNlKGlyLT5zYW1wbGVzLGlyLT5zY291bnQsNSw3KTsKKwkJaXJfZHByaW50aygiYmlwaGFzZSBkZWNvZGVkOiAleFxuIixyYzUpOworCQlpZiAoKHJjNSAmIDB4ZmZmZmYwMDApICE9IDB4MzAwMCkKKwkJCWJyZWFrOworCQlpcl9pbnB1dF9rZXlkb3duKCZpci0+aW5wdXQsICZpci0+aXIsIHJjNSAmIDB4M2YsIHJjNSk7CisJCWlyLT5yZWxlYXNlID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTIwKTsKKwkJYnJlYWs7CisJfQorCisJaXItPnNjb3VudCA9IDA7CisJcmV0dXJuOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK01PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIsIFBhdmVsIE1hY2hlaywgQ2hyaXMgUGFzY29lIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlucHV0IGRyaXZlciBmb3IgY3g4OCBHUElPLWJhc2VkIElSIHJlbW90ZSBjb250cm9scyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWFlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKQEAgLTAsMCArMSw0NjYgQEAKKy8qCisgKiAkSWQ6IGN4ODgtbXBlZy5jLHYgMS4yNSAyMDA1LzAzLzA3IDE0OjE4OjAwIGtyYXhlbCBFeHAgJAorICoKKyAqICBTdXBwb3J0IGZvciB0aGUgbXBlZyB0cmFuc3BvcnQgc3RyZWFtIHRyYW5zZmVycworICogIFBDSSBmdW5jdGlvbiAjMiBvZiB0aGUgY3gyMzg4eC4KKyAqCisgKiAgICAoYykgMjAwNCBKZWxsZSBGb2tzIDxqZWxsZUBmb2tzLjhtLmNvbT4KKyAqICAgIChjKSAyMDA0IENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+CisgKiAgICAoYykgMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisKKyNpbmNsdWRlICJjeDg4LmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitNT0RVTEVfREVTQ1JJUFRJT04oIm1wZWcgZHJpdmVyIGZvciBjeDIzODh4IGJhc2VkIFRWIGNhcmRzIik7CitNT0RVTEVfQVVUSE9SKCJKZWxsZSBGb2tzIDxqZWxsZUBmb2tzLjhtLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkNocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+Iik7CitNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLGludCwwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbbXBlZ10iKTsKKworI2RlZmluZSBkcHJpbnRrKGxldmVsLGZtdCwgYXJnLi4uKQlpZiAoZGVidWcgPj0gbGV2ZWwpIFwKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMvMjogIiBmbXQsIGRldi0+Y29yZS0+bmFtZSAsICMjIGFyZykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgY3g4ODAyX3N0YXJ0X2RtYShzdHJ1Y3QgY3g4ODAyX2RldiAgICAqZGV2LAorCQkJICAgIHN0cnVjdCBjeDg4X2RtYXF1ZXVlICpxLAorCQkJICAgIHN0cnVjdCBjeDg4X2J1ZmZlciAgICpidWYpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKworCWRwcmludGsoMSwgImN4ODgwMl9zdGFydF9tcGVncG9ydF9kbWEgJWRcbiIsIGJ1Zi0+dmIud2lkdGgpOworCisJLyogc2V0dXAgZmlmbyArIGZvcm1hdCAqLworCWN4ODhfc3JhbV9jaGFubmVsX3NldHVwKGNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDI4XSwKKwkJCQlkZXYtPnRzX3BhY2tldF9zaXplLCBidWYtPnJpc2MuZG1hKTsKKworCS8qIHdyaXRlIFRTIGxlbmd0aCB0byBjaGlwICovCisJY3hfd3JpdGUoTU9fVFNfTE5HVEgsIGJ1Zi0+dmIud2lkdGgpOworCisjaWYgMQorCS8qIEZJWE1FOiB0aGlzIG5lZWRzIGEgcmV2aWV3LgorCSAqIGFsc286IG1vdmUgdG8gY3g4OC1ibGFja2JpcmQgKyBjeDg4LWR2YiBzb3VyY2UgZmlsZXM/ICovCisKKwlpZiAoY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLmR2YikgeworCQkvKiBuZWdlZGdlIGRyaXZlbiAmIHNvZnR3YXJlIHJlc2V0ICovCisJCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgMHg0MCk7CisJCXVkZWxheSgxMDApOworCQljeF93cml0ZShNT19QSU5NVVhfSU8sIDB4MDApOworCQljeF93cml0ZShUU19IV19TT1BfQ05UUkwsNDc8PDE2fDE4ODw8NHwweDAwKTsKKwkJY3hfd3JpdGUoVFNfU09QX1NUQVQsMHgwMCk7CisJCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgZGV2LT50c19nZW5fY250cmwpOworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwlpZiAoY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLmJsYWNrYmlyZCkgeworCQljeF93cml0ZShNT19QSU5NVVhfSU8sIDB4ODgpOyAvKiBlbmFibGUgTVBFRyBwYXJhbGxlbCBJTyAqLworCisJCS8vIGN4X3dyaXRlKFRTX0YyX0NNRF9TVEFUX01NLCAweDI5MDAxMDYpOyAvKiBGMl9DTURfU1RBVF9NTSBkZWZhdWx0cyArIG1hc3RlciArIG1lbW9yeSBzcGFjZSAqLworCQljeF93cml0ZShUU19HRU5fQ05UUkwsIDB4NDYpOyAvKiBwdW5jdHVyZWQgY2xvY2sgVFMgJiBwb3NlZGdlIGRyaXZlbiAmIHNvZnR3YXJlIHJlc2V0ICovCisJCXVkZWxheSgxMDApOworCisJCWN4X3dyaXRlKFRTX0hXX1NPUF9DTlRSTCwgMHg0MDgpOyAvKiBtcGVnIHN0YXJ0IGJ5dGUgKi8KKwkJLy9jeF93cml0ZShUU19IV19TT1BfQ05UUkwsIDB4MkYwQkMwKTsgLyogbXBlZyBzdGFydCBieXRlIHRzOiAweDJGMEJDMCA/ICovCisJCWN4X3dyaXRlKFRTX1ZBTEVSUl9DTlRSTCwgMHgyMDAwKTsKKworCQljeF93cml0ZShUU19HRU5fQ05UUkwsIDB4MDYpOyAvKiBwdW5jdHVyZWQgY2xvY2sgVFMgJiBwb3NlZGdlIGRyaXZlbiAqLworCQl1ZGVsYXkoMTAwKTsKKwl9CisjZW5kaWYKKworCS8qIHJlc2V0IGNvdW50ZXIgKi8KKwljeF93cml0ZShNT19UU19HUENOVFJMLCBHUF9DT1VOVF9DT05UUk9MX1JFU0VUKTsKKwlxLT5jb3VudCA9IDE7CisKKwkvKiBlbmFibGUgaXJxcyAqLworCWN4X3NldChNT19QQ0lfSU5UTVNLLCBjb3JlLT5wY2lfaXJxbWFzayB8IDB4MDQpOworCWN4X3dyaXRlKE1PX1RTX0lOVE1TSywgIDB4MWYwMDExKTsKKworCS8qIHN0YXJ0IGRtYSAqLworCWN4X3dyaXRlKE1PX0RFVl9DTlRSTDIsICgxPDw1KSk7IC8qIEZJWE1FOiBzL3dyaXRlL3NldC8gPz8/ICovCisJY3hfd3JpdGUoTU9fVFNfRE1BQ05UUkwsIDB4MTEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4ODgwMl9zdG9wX2RtYShzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisKKwkvKiBzdG9wIGRtYSAqLworCWN4X2NsZWFyKE1PX1RTX0RNQUNOVFJMLCAweDExKTsKKworCS8qIGRpc2FibGUgaXJxcyAqLworCWN4X2NsZWFyKE1PX1BDSV9JTlRNU0ssIDB4MDAwMDA0KTsKKwljeF9jbGVhcihNT19UU19JTlRNU0ssIDB4MWYwMDExKTsKKworCS8qIFJlc2V0IHRoZSBjb250cm9sbGVyICovCisJY3hfd3JpdGUoVFNfR0VOX0NOVFJMLCAweGNkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDg4MDJfcmVzdGFydF9xdWV1ZShzdHJ1Y3QgY3g4ODAyX2RldiAgICAqZGV2LAorCQkJCXN0cnVjdCBjeDg4X2RtYXF1ZXVlICpxKQoreworCXN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmOworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkKKwkJcmV0dXJuIDA7CisKKwlidWYgPSBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5uZXh0LCBzdHJ1Y3QgY3g4OF9idWZmZXIsIHZiLnF1ZXVlKTsKKwlkcHJpbnRrKDIsInJlc3RhcnRfcXVldWUgWyVwLyVkXTogcmVzdGFydCBkbWFcbiIsCisJCWJ1ZiwgYnVmLT52Yi5pKTsKKwljeDg4MDJfc3RhcnRfZG1hKGRldiwgcSwgYnVmKTsKKwlsaXN0X2Zvcl9lYWNoKGl0ZW0sJnEtPmFjdGl2ZSkgeworCQlidWYgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBjeDg4X2J1ZmZlciwgdmIucXVldWUpOworCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKKwl9CisJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBjeDg4MDJfYnVmX3ByZXBhcmUoc3RydWN0IGN4ODgwMl9kZXYgKmRldiwgc3RydWN0IGN4ODhfYnVmZmVyICpidWYpCit7CisJaW50IHNpemUgPSBkZXYtPnRzX3BhY2tldF9zaXplICogZGV2LT50c19wYWNrZXRfY291bnQ7CisJaW50IHJjOworCisJZHByaW50aygxLCAiJXM6ICVwXG4iLCBfX0ZVTkNUSU9OX18sIGJ1Zik7CisJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBzaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChTVEFURV9ORUVEU19JTklUID09IGJ1Zi0+dmIuc3RhdGUpIHsKKwkJYnVmLT52Yi53aWR0aCAgPSBkZXYtPnRzX3BhY2tldF9zaXplOworCQlidWYtPnZiLmhlaWdodCA9IGRldi0+dHNfcGFja2V0X2NvdW50OworCQlidWYtPnZiLnNpemUgICA9IHNpemU7CisJCWJ1Zi0+dmIuZmllbGQgID0gVjRMMl9GSUVMRF9UT1A7CisKKwkJaWYgKDAgIT0gKHJjID0gdmlkZW9idWZfaW9sb2NrKGRldi0+cGNpLCZidWYtPnZiLE5VTEwpKSkKKwkJCWdvdG8gZmFpbDsKKwkJY3g4OF9yaXNjX2RhdGFidWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCQkJICAgICBidWYtPnZiLmRtYS5zZ2xpc3QsCisJCQkJICAgICBidWYtPnZiLndpZHRoLCBidWYtPnZiLmhlaWdodCk7CisJfQorCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJY3g4OF9mcmVlX2J1ZmZlcihkZXYtPnBjaSxidWYpOworCXJldHVybiByYzsKK30KKwordm9pZCBjeDg4MDJfYnVmX3F1ZXVlKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYsIHN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBjeDg4X2J1ZmZlciAgICAqcHJldjsKKwlzdHJ1Y3QgY3g4OF9kbWFxdWV1ZSAgKnEgICAgPSAmZGV2LT5tcGVncTsKKworCS8qIGFkZCBqdW1wIHRvIHN0b3BwZXIgKi8KKwlidWYtPnJpc2Muam1wWzBdID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QIHwgUklTQ19JUlExIHwgUklTQ19DTlRfSU5DKTsKKwlidWYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIocS0+c3RvcHBlci5kbWEpOworCisJaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwmcS0+YWN0aXZlKTsKKwkJY3g4ODAyX3N0YXJ0X2RtYShkZXYsIHEsIGJ1Zik7CisJCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CisJCWJ1Zi0+Y291bnQgICAgPSBxLT5jb3VudCsrOworCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMrQlVGRkVSX1RJTUVPVVQpOworCQlkcHJpbnRrKDIsIlslcC8lZF0gJXMgLSBmaXJzdCBhY3RpdmVcbiIsCisJCQlidWYsIGJ1Zi0+dmIuaSwgX19GVU5DVElPTl9fKTsKKworCX0gZWxzZSB7CisJCXByZXYgPSBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3g4OF9idWZmZXIsIHZiLnF1ZXVlKTsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwmcS0+YWN0aXZlKTsKKwkJYnVmLT52Yi5zdGF0ZSA9IFNUQVRFX0FDVElWRTsKKwkJYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7CisJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7CisJCWRwcmludGsoMiwiWyVwLyVkXSAlcyAtIGFwcGVuZCB0byBhY3RpdmVcbiIsCisJCQlidWYsIGJ1Zi0+dmIuaSwgX19GVU5DVElPTl9fKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGRvX2NhbmNlbF9idWZmZXJzKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYsIGNoYXIgKnJlYXNvbiwgaW50IHJlc3RhcnQpCit7CisJc3RydWN0IGN4ODhfZG1hcXVldWUgKnEgPSAmZGV2LT5tcGVncTsKKwlzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQlidWYgPSBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5uZXh0LCBzdHJ1Y3QgY3g4OF9idWZmZXIsIHZiLnF1ZXVlKTsKKwkJbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOworCQlidWYtPnZiLnN0YXRlID0gU1RBVEVfRVJST1I7CisJCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7CisJCWRwcmludGsoMSwiWyVwLyVkXSAlcyAtIGRtYT0weCUwOGx4XG4iLAorCQkJYnVmLCBidWYtPnZiLmksIHJlYXNvbiwgKHVuc2lnbmVkIGxvbmcpYnVmLT5yaXNjLmRtYSk7CisJfQorCWlmIChyZXN0YXJ0KQorCQljeDg4MDJfcmVzdGFydF9xdWV1ZShkZXYscSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jayxmbGFncyk7Cit9CisKK3ZvaWQgY3g4ODAyX2NhbmNlbF9idWZmZXJzKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCit7CisJc3RydWN0IGN4ODhfZG1hcXVldWUgKnEgPSAmZGV2LT5tcGVncTsKKworCWRlbF90aW1lcl9zeW5jKCZxLT50aW1lb3V0KTsKKwljeDg4MDJfc3RvcF9kbWEoZGV2KTsKKwlkb19jYW5jZWxfYnVmZmVycyhkZXYsImNhbmNlbCIsMCk7Cit9CisKK3N0YXRpYyB2b2lkIGN4ODgwMl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2ID0gKHN0cnVjdCBjeDg4MDJfZGV2KilkYXRhOworCisJZHByaW50aygxLCAiJXNcbiIsX19GVU5DVElPTl9fKTsKKworCWlmIChkZWJ1ZykKKwkJY3g4OF9zcmFtX2NoYW5uZWxfZHVtcChkZXYtPmNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDI4XSk7CisJY3g4ODAyX3N0b3BfZG1hKGRldik7CisJZG9fY2FuY2VsX2J1ZmZlcnMoZGV2LCJ0aW1lb3V0IiwxKTsKK30KKworc3RhdGljIHZvaWQgY3g4ODAyX21wZWdfaXJxKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKwl1MzIgc3RhdHVzLCBtYXNrLCBjb3VudDsKKworCXN0YXR1cyA9IGN4X3JlYWQoTU9fVFNfSU5UU1RBVCk7CisJbWFzayAgID0gY3hfcmVhZChNT19UU19JTlRNU0spOworCWlmICgwID09IChzdGF0dXMgJiBtYXNrKSkKKwkJcmV0dXJuOworCisJY3hfd3JpdGUoTU9fVFNfSU5UU1RBVCwgc3RhdHVzKTsKKwlpZiAoZGVidWcgfHwgKHN0YXR1cyAmIG1hc2sgJiB+MHhmZikpCisJCWN4ODhfcHJpbnRfaXJxYml0cyhjb3JlLT5uYW1lLCAiaXJxIG1wZWcgIiwKKwkJCQkgICBjeDg4X21wZWdfaXJxcywgc3RhdHVzLCBtYXNrKTsKKworCS8qIHJpc2Mgb3AgY29kZSBlcnJvciAqLworCWlmIChzdGF0dXMgJiAoMSA8PCAxNikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1wZWcgcmlzYyBvcCBjb2RlIGVycm9yXG4iLGNvcmUtPm5hbWUpOworCQljeF9jbGVhcihNT19UU19ETUFDTlRSTCwgMHgxMSk7CisJCWN4ODhfc3JhbV9jaGFubmVsX2R1bXAoZGV2LT5jb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyOF0pOworCX0KKworCS8qIHJpc2MxIHkgKi8KKwlpZiAoc3RhdHVzICYgMHgwMSkgeworCQlzcGluX2xvY2soJmRldi0+c2xvY2spOworCQljb3VudCA9IGN4X3JlYWQoTU9fVFNfR1BDTlQpOworCQljeDg4X3dha2V1cChkZXYtPmNvcmUsICZkZXYtPm1wZWdxLCBjb3VudCk7CisJCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKKwl9CisKKwkvKiByaXNjMiB5ICovCisJaWYgKHN0YXR1cyAmIDB4MTApIHsKKwkJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwkJY3g4ODAyX3Jlc3RhcnRfcXVldWUoZGV2LCZkZXYtPm1wZWdxKTsKKwkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworCX0KKworICAgICAgICAvKiBvdGhlciBnZW5lcmFsIGVycm9ycyAqLworICAgICAgICBpZiAoc3RhdHVzICYgMHgxZjAxMDApIHsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2soJmRldi0+c2xvY2spOworCQljeDg4MDJfc3RvcF9kbWEoZGV2KTsKKyAgICAgICAgICAgICAgICBjeDg4MDJfcmVzdGFydF9xdWV1ZShkZXYsJmRldi0+bXBlZ3EpOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgY3g4ODAyX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKwl1MzIgc3RhdHVzOworCWludCBsb29wLCBoYW5kbGVkID0gMDsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAxMDsgbG9vcCsrKSB7CisJCXN0YXR1cyA9IGN4X3JlYWQoTU9fUENJX0lOVFNUQVQpICYgKGNvcmUtPnBjaV9pcnFtYXNrIHwgMHgwNCk7CisJCWlmICgwID09IHN0YXR1cykKKwkJCWdvdG8gb3V0OworCQloYW5kbGVkID0gMTsKKwkJY3hfd3JpdGUoTU9fUENJX0lOVFNUQVQsIHN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyAmIGNvcmUtPnBjaV9pcnFtYXNrKQorCQkJY3g4OF9jb3JlX2lycShjb3JlLHN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiAweDA0KQorCQkJY3g4ODAyX21wZWdfaXJxKGRldik7CisJfTsKKwlpZiAoMTAgPT0gbG9vcCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy8wOiBpcnEgbG9vcCAtLSBjbGVhcmluZyBtYXNrXG4iLAorCQkgICAgICAgY29yZS0+bmFtZSk7CisJCWN4X3dyaXRlKE1PX1BDSV9JTlRNU0ssMCk7CisJfQorCisgb3V0OgorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZXhwb3J0ZWQgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IGN4ODgwMl9pbml0X2NvbW1vbihzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisJaW50IGVycjsKKworCS8qIHBjaSBpbml0ICovCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldi0+cGNpKSkKKwkJcmV0dXJuIC1FSU87CisJcGNpX3NldF9tYXN0ZXIoZGV2LT5wY2kpOworCWlmICghcGNpX2RtYV9zdXBwb3J0ZWQoZGV2LT5wY2ksMHhmZmZmZmZmZikpIHsKKwkJcHJpbnRrKCIlcy8yOiBPb3BzOiBubyAzMmJpdCBQQ0kgRE1BID8/P1xuIixkZXYtPmNvcmUtPm5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYtPnBjaSwgUENJX0NMQVNTX1JFVklTSU9OLCAmZGV2LT5wY2lfcmV2KTsKKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LT5wY2ksIFBDSV9MQVRFTkNZX1RJTUVSLCAgJmRldi0+cGNpX2xhdCk7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzLzI6IGZvdW5kIGF0ICVzLCByZXY6ICVkLCBpcnE6ICVkLCAiCisJICAgICAgICJsYXRlbmN5OiAlZCwgbW1pbzogMHglbHhcbiIsIGRldi0+Y29yZS0+bmFtZSwKKwkgICAgICAgcGNpX25hbWUoZGV2LT5wY2kpLCBkZXYtPnBjaV9yZXYsIGRldi0+cGNpLT5pcnEsCisJICAgICAgIGRldi0+cGNpX2xhdCxwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wY2ksMCkpOworCisJLyogaW5pdGlhbGl6ZSBkcml2ZXIgc3RydWN0ICovCisgICAgICAgIGluaXRfTVVURVgoJmRldi0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+c2xvY2spOworCisJLyogaW5pdCBkbWEgcXVldWUgKi8KKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5tcGVncS5hY3RpdmUpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPm1wZWdxLnF1ZXVlZCk7CisJZGV2LT5tcGVncS50aW1lb3V0LmZ1bmN0aW9uID0gY3g4ODAyX3RpbWVvdXQ7CisJZGV2LT5tcGVncS50aW1lb3V0LmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWluaXRfdGltZXIoJmRldi0+bXBlZ3EudGltZW91dCk7CisJY3g4OF9yaXNjX3N0b3BwZXIoZGV2LT5wY2ksJmRldi0+bXBlZ3Euc3RvcHBlciwKKwkJCSAgTU9fVFNfRE1BQ05UUkwsMHgxMSwweDAwKTsKKworCS8qIGdldCBpcnEgKi8KKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPnBjaS0+aXJxLCBjeDg4MDJfaXJxLAorCQkJICBTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCwgZGV2LT5jb3JlLT5uYW1lLCBkZXYpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGdldCBJUlEgJWRcbiIsCisJCSAgICAgICBkZXYtPmNvcmUtPm5hbWUsIGRldi0+cGNpLT5pcnEpOworCQlyZXR1cm4gZXJyOworCX0KKwljeF9zZXQoTU9fUENJX0lOVE1TSywgY29yZS0+cGNpX2lycW1hc2spOworCisJLyogZXZlcnl0aGluZyB3b3JrZWQgKi8KKwlwY2lfc2V0X2RydmRhdGEoZGV2LT5wY2ksZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjeDg4MDJfZmluaV9jb21tb24oc3RydWN0IGN4ODgwMl9kZXYgKmRldikKK3sKKwljeDg4MDJfc3RvcF9kbWEoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2LT5wY2kpOworCisJLyogdW5yZWdpc3RlciBzdHVmZiAqLworCWZyZWVfaXJxKGRldi0+cGNpLT5pcnEsIGRldik7CisJcGNpX3NldF9kcnZkYXRhKGRldi0+cGNpLCBOVUxMKTsKKworCS8qIGZyZWUgbWVtb3J5ICovCisJYnRjeF9yaXNjbWVtX2ZyZWUoZGV2LT5wY2ksJmRldi0+bXBlZ3Euc3RvcHBlcik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBjeDg4MDJfc3VzcGVuZF9jb21tb24oc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKyAgICAgICAgc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCisJLyogc3RvcCBtcGVnIGRtYSAqLworCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPm1wZWdxLmFjdGl2ZSkpIHsKKwkJcHJpbnRrKCIlczogc3VzcGVuZCBtcGVnXG4iLCBjb3JlLT5uYW1lKTsKKwkJY3g4ODAyX3N0b3BfZG1hKGRldik7CisJCWRlbF90aW1lcigmZGV2LT5tcGVncS50aW1lb3V0KTsKKwl9CisJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworCisjaWYgMQorCS8qIEZJWE1FIC0tIHNodXRkb3duIGRldmljZSAqLworCWN4ODhfc2h1dGRvd24oZGV2LT5jb3JlKTsKKyNlbmRpZgorCisJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CisJaWYgKDAgIT0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSkpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCQlkZXYtPnN0YXRlLmRpc2FibGVkID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDg4MDJfcmVzdW1lX2NvbW1vbihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKyAgICAgICAgc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCisJaWYgKGRldi0+c3RhdGUuZGlzYWJsZWQpIHsKKwkJcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCWRldi0+c3RhdGUuZGlzYWJsZWQgPSAwOworCX0KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CisKKyNpZiAxCisJLyogRklYTUU6IHJlLWluaXRpYWxpemUgaGFyZHdhcmUgKi8KKwljeDg4X3Jlc2V0KGRldi0+Y29yZSk7CisjZW5kaWYKKworCS8qIHJlc3RhcnQgdmlkZW8rdmJpIGNhcHR1cmUgKi8KKwlzcGluX2xvY2soJmRldi0+c2xvY2spOworCWlmICghbGlzdF9lbXB0eSgmZGV2LT5tcGVncS5hY3RpdmUpKSB7CisJCXByaW50aygiJXM6IHJlc3VtZSBtcGVnXG4iLCBjb3JlLT5uYW1lKTsKKwkJY3g4ODAyX3Jlc3RhcnRfcXVldWUoZGV2LCZkZXYtPm1wZWdxKTsKKwl9CisJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0VYUE9SVF9TWU1CT0woY3g4ODAyX2J1Zl9wcmVwYXJlKTsKK0VYUE9SVF9TWU1CT0woY3g4ODAyX2J1Zl9xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKGN4ODgwMl9jYW5jZWxfYnVmZmVycyk7CisKK0VYUE9SVF9TWU1CT0woY3g4ODAyX2luaXRfY29tbW9uKTsKK0VYUE9SVF9TWU1CT0woY3g4ODAyX2ZpbmlfY29tbW9uKTsKKworRVhQT1JUX1NZTUJPTChjeDg4MDJfc3VzcGVuZF9jb21tb24pOworRVhQT1JUX1NZTUJPTChjeDg4MDJfcmVzdW1lX2NvbW1vbik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjM4Y2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtcmVnLmgKQEAgLTAsMCArMSw3ODcgQEAKKy8qCisgICAgJElkOiBjeDg4LXJlZy5oLHYgMS42IDIwMDQvMTAvMTMgMTA6Mzk6MDAga3JheGVsIEV4cCAkCisKKyAgICBjeDg4eC1ody5oIC0gQ1gyMzg4eCByZWdpc3RlciBvZmZzZXRzCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggTWV0emxlciAocmprbUB0aHAudW5pLWtvZWxuLmRlKQorICAgICAgICAgICAgICAgICAgMjAwMSBNaWNoYWVsIEVza2luCisgICAgICAgICAgICAgICAgICAyMDAyIFl1cmlqIFN5c29ldiA8eXVyaWpAbmF0dXJlc29mdC5uZXQ+CisgICAgICAgICAgICAgICAgICAyMDAzIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBfQ1g4OF9SRUdfSF8KKyNkZWZpbmUgX0NYODhfUkVHX0hfCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFBDSSBJRHMgYW5kIGNvbmZpZyBzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0NPTkVYQU5UCisjIGRlZmluZSBQQ0lfVkVORE9SX0lEX0NPTkVYQU5UCQkweDE0RjEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NYMjMwMF9WSUQKKyMgZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1gyMzAwX1ZJRAkweDg4MDAKKyNlbmRpZgorCisjZGVmaW5lIENYODhYX0RFVkNUUkwgMHg0MAorI2RlZmluZSBDWDg4WF9FTl9UQkZYIDB4MDIKKyNkZWZpbmUgQ1g4OFhfRU5fVlNGWCAweDA0CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRE1BIENvbnRyb2xsZXIgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1PX1BETUFfU1RIUlNIICAgICAgMHgyMDAwMDAgLy8gU291cmNlIHRocmVzaG9sZAorI2RlZmluZSBNT19QRE1BX1NUQURSUyAgICAgIDB4MjAwMDA0IC8vIFNvdXJjZSB0YXJnZXQgYWRkcmVzcworI2RlZmluZSBNT19QRE1BX1NJQURSUyAgICAgIDB4MjAwMDA4IC8vIFNvdXJjZSBpbnRlcm5hbCBhZGRyZXNzCisjZGVmaW5lIE1PX1BETUFfU0NOVFJMICAgICAgMHgyMDAwMEMgLy8gU291cmNlIGNvbnRyb2wKKyNkZWZpbmUgTU9fUERNQV9EVEhSU0ggICAgICAweDIwMDAxMCAvLyBEZXN0aW5hdGlvbiB0aHJlc2hvbGQKKyNkZWZpbmUgTU9fUERNQV9EVEFEUlMgICAgICAweDIwMDAxNCAvLyBEZXN0aW5hdGlvbiB0YXJnZXQgYWRkcmVzcworI2RlZmluZSBNT19QRE1BX0RJQURSUyAgICAgIDB4MjAwMDE4IC8vIERlc3RpbmF0aW9uIGludGVybmFsIGFkZHJlc3MKKyNkZWZpbmUgTU9fUERNQV9EQ05UUkwgICAgICAweDIwMDAxQyAvLyBEZXN0aW5hdGlvbiBjb250cm9sCisjZGVmaW5lIE1PX0xEX1NTSUQgICAgICAgICAgMHgyMDAwMzAgLy8gTG9hZCBzdWJzeXN0ZW0gSUQKKyNkZWZpbmUgTU9fREVWX0NOVFJMMiAgICAgICAweDIwMDAzNCAvLyBEZXZpY2UgY29udHJvbAorI2RlZmluZSBNT19QQ0lfSU5UTVNLICAgICAgIDB4MjAwMDQwIC8vIFBDSSBpbnRlcnJ1cHQgbWFzaworI2RlZmluZSBNT19QQ0lfSU5UU1RBVCAgICAgIDB4MjAwMDQ0IC8vIFBDSSBpbnRlcnJ1cHQgc3RhdHVzCisjZGVmaW5lIE1PX1BDSV9JTlRNU1RBVCAgICAgMHgyMDAwNDggLy8gUENJIGludGVycnVwdCBtYXNrZWQgc3RhdHVzCisjZGVmaW5lIE1PX1ZJRF9JTlRNU0sgICAgICAgMHgyMDAwNTAgLy8gVmlkZW8gaW50ZXJydXB0IG1hc2sKKyNkZWZpbmUgTU9fVklEX0lOVFNUQVQgICAgICAweDIwMDA1NCAvLyBWaWRlbyBpbnRlcnJ1cHQgc3RhdHVzCisjZGVmaW5lIE1PX1ZJRF9JTlRNU1RBVCAgICAgMHgyMDAwNTggLy8gVmlkZW8gaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMKKyNkZWZpbmUgTU9fVklEX0lOVFNTVEFUICAgICAweDIwMDA1QyAvLyBWaWRlbyBpbnRlcnJ1cHQgc2V0IHN0YXR1cworI2RlZmluZSBNT19BVURfSU5UTVNLICAgICAgIDB4MjAwMDYwIC8vIEF1ZGlvIGludGVycnVwdCBtYXNrCisjZGVmaW5lIE1PX0FVRF9JTlRTVEFUICAgICAgMHgyMDAwNjQgLy8gQXVkaW8gaW50ZXJydXB0IHN0YXR1cworI2RlZmluZSBNT19BVURfSU5UTVNUQVQgICAgIDB4MjAwMDY4IC8vIEF1ZGlvIGludGVycnVwdCBtYXNrZWQgc3RhdHVzCisjZGVmaW5lIE1PX0FVRF9JTlRTU1RBVCAgICAgMHgyMDAwNkMgLy8gQXVkaW8gaW50ZXJydXB0IHNldCBzdGF0dXMKKyNkZWZpbmUgTU9fVFNfSU5UTVNLICAgICAgICAweDIwMDA3MCAvLyBUcmFuc3BvcnQgc3RyZWFtIGludGVycnVwdCBtYXNrCisjZGVmaW5lIE1PX1RTX0lOVFNUQVQgICAgICAgMHgyMDAwNzQgLy8gVHJhbnNwb3J0IHN0cmVhbSBpbnRlcnJ1cHQgc3RhdHVzCisjZGVmaW5lIE1PX1RTX0lOVE1TVEFUICAgICAgMHgyMDAwNzggLy8gVHJhbnNwb3J0IHN0cmVhbSBpbnRlcnJ1cHQgbWFzayBzdGF0dXMKKyNkZWZpbmUgTU9fVFNfSU5UU1NUQVQgICAgICAweDIwMDA3QyAvLyBUcmFuc3BvcnQgc3RyZWFtIGludGVycnVwdCBzZXQgc3RhdHVzCisjZGVmaW5lIE1PX1ZJUF9JTlRNU0sgICAgICAgMHgyMDAwODAgLy8gVklQIGludGVycnVwdCBtYXNrCisjZGVmaW5lIE1PX1ZJUF9JTlRTVEFUICAgICAgMHgyMDAwODQgLy8gVklQIGludGVycnVwdCBzdGF0dXMKKyNkZWZpbmUgTU9fVklQX0lOVE1TVEFUICAgICAweDIwMDA4OCAvLyBWSVAgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMKKyNkZWZpbmUgTU9fVklQX0lOVFNTVEFUICAgICAweDIwMDA4QyAvLyBWSVAgaW50ZXJydXB0IHNldCBzdGF0dXMKKyNkZWZpbmUgTU9fR1BIU1RfSU5UTVNLICAgICAweDIwMDA5MCAvLyBIb3N0IGludGVycnVwdCBtYXNrCisjZGVmaW5lIE1PX0dQSFNUX0lOVFNUQVQgICAgMHgyMDAwOTQgLy8gSG9zdCBpbnRlcnJ1cHQgc3RhdHVzCisjZGVmaW5lIE1PX0dQSFNUX0lOVE1TVEFUICAgMHgyMDAwOTggLy8gSG9zdCBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cworI2RlZmluZSBNT19HUEhTVF9JTlRTU1RBVCAgIDB4MjAwMDlDIC8vIEhvc3QgaW50ZXJydXB0IHNldCBzdGF0dXMKKworLy8gRE1BIENoYW5uZWxzIDEtNiBiZWxvbmcgdG8gU1BJUEUKKyNkZWZpbmUgTU9fRE1BN19QVFIxICAgICAgICAweDMwMDAxOCAvLyB7MjR9UlcqIERNQSBDdXJyZW50IFB0ciA6IENoIzcKKyNkZWZpbmUgTU9fRE1BOF9QVFIxICAgICAgICAweDMwMDAxQyAvLyB7MjR9UlcqIERNQSBDdXJyZW50IFB0ciA6IENoIzgKKworLy8gRE1BIENoYW5uZWxzIDktMjAgYmVsb25nIHRvIFNQSVBFCisjZGVmaW5lIE1PX0RNQTIxX1BUUjEgICAgICAgMHgzMDAwODAgLy8gezI0fVIwKiBETUEgQ3VycmVudCBQdHIgOiBDaCMyMQorI2RlZmluZSBNT19ETUEyMl9QVFIxICAgICAgIDB4MzAwMDg0IC8vIHsyNH1SMCogRE1BIEN1cnJlbnQgUHRyIDogQ2gjMjIKKyNkZWZpbmUgTU9fRE1BMjNfUFRSMSAgICAgICAweDMwMDA4OCAvLyB7MjR9UjAqIERNQSBDdXJyZW50IFB0ciA6IENoIzIzCisjZGVmaW5lIE1PX0RNQTI0X1BUUjEgICAgICAgMHgzMDAwOEMgLy8gezI0fVIwKiBETUEgQ3VycmVudCBQdHIgOiBDaCMyNAorI2RlZmluZSBNT19ETUEyNV9QVFIxICAgICAgIDB4MzAwMDkwIC8vIHsyNH1SMCogRE1BIEN1cnJlbnQgUHRyIDogQ2gjMjUKKyNkZWZpbmUgTU9fRE1BMjZfUFRSMSAgICAgICAweDMwMDA5NCAvLyB7MjR9UjAqIERNQSBDdXJyZW50IFB0ciA6IENoIzI2CisjZGVmaW5lIE1PX0RNQTI3X1BUUjEgICAgICAgMHgzMDAwOTggLy8gezI0fVIwKiBETUEgQ3VycmVudCBQdHIgOiBDaCMyNworI2RlZmluZSBNT19ETUEyOF9QVFIxICAgICAgIDB4MzAwMDlDIC8vIHsyNH1SMCogRE1BIEN1cnJlbnQgUHRyIDogQ2gjMjgKKyNkZWZpbmUgTU9fRE1BMjlfUFRSMSAgICAgICAweDMwMDBBMCAvLyB7MjR9UjAqIERNQSBDdXJyZW50IFB0ciA6IENoIzI5CisjZGVmaW5lIE1PX0RNQTMwX1BUUjEgICAgICAgMHgzMDAwQTQgLy8gezI0fVIwKiBETUEgQ3VycmVudCBQdHIgOiBDaCMzMAorI2RlZmluZSBNT19ETUEzMV9QVFIxICAgICAgIDB4MzAwMEE4IC8vIHsyNH1SMCogRE1BIEN1cnJlbnQgUHRyIDogQ2gjMzEKKyNkZWZpbmUgTU9fRE1BMzJfUFRSMSAgICAgICAweDMwMDBBQyAvLyB7MjR9UjAqIERNQSBDdXJyZW50IFB0ciA6IENoIzMyCisKKyNkZWZpbmUgTU9fRE1BMjFfUFRSMiAgICAgICAweDMwMDBDMCAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMjEKKyNkZWZpbmUgTU9fRE1BMjJfUFRSMiAgICAgICAweDMwMDBDNCAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMjIKKyNkZWZpbmUgTU9fRE1BMjNfUFRSMiAgICAgICAweDMwMDBDOCAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMjMKKyNkZWZpbmUgTU9fRE1BMjRfUFRSMiAgICAgICAweDMwMDBDQyAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMjQKKyNkZWZpbmUgTU9fRE1BMjVfUFRSMiAgICAgICAweDMwMDBEMCAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMjUKKyNkZWZpbmUgTU9fRE1BMjZfUFRSMiAgICAgICAweDMwMDBENCAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMjYKKyNkZWZpbmUgTU9fRE1BMjdfUFRSMiAgICAgICAweDMwMDBEOCAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMjcKKyNkZWZpbmUgTU9fRE1BMjhfUFRSMiAgICAgICAweDMwMDBEQyAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMjgKKyNkZWZpbmUgTU9fRE1BMjlfUFRSMiAgICAgICAweDMwMDBFMCAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMjkKKyNkZWZpbmUgTU9fRE1BMzBfUFRSMiAgICAgICAweDMwMDBFNCAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMzAKKyNkZWZpbmUgTU9fRE1BMzFfUFRSMiAgICAgICAweDMwMDBFOCAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMzEKKyNkZWZpbmUgTU9fRE1BMzJfUFRSMiAgICAgICAweDMwMDBFQyAvLyB7MjR9UlcqIERNQSBUYWIgUHRyIDogQ2gjMzIKKworI2RlZmluZSBNT19ETUEyMV9DTlQxICAgICAgIDB4MzAwMTAwIC8vIHsxMX1SVyogRE1BIEJ1ZmZlciBTaXplIDogQ2gjMjEKKyNkZWZpbmUgTU9fRE1BMjJfQ05UMSAgICAgICAweDMwMDEwNCAvLyB7MTF9UlcqIERNQSBCdWZmZXIgU2l6ZSA6IENoIzIyCisjZGVmaW5lIE1PX0RNQTIzX0NOVDEgICAgICAgMHgzMDAxMDggLy8gezExfVJXKiBETUEgQnVmZmVyIFNpemUgOiBDaCMyMworI2RlZmluZSBNT19ETUEyNF9DTlQxICAgICAgIDB4MzAwMTBDIC8vIHsxMX1SVyogRE1BIEJ1ZmZlciBTaXplIDogQ2gjMjQKKyNkZWZpbmUgTU9fRE1BMjVfQ05UMSAgICAgICAweDMwMDExMCAvLyB7MTF9UlcqIERNQSBCdWZmZXIgU2l6ZSA6IENoIzI1CisjZGVmaW5lIE1PX0RNQTI2X0NOVDEgICAgICAgMHgzMDAxMTQgLy8gezExfVJXKiBETUEgQnVmZmVyIFNpemUgOiBDaCMyNgorI2RlZmluZSBNT19ETUEyN19DTlQxICAgICAgIDB4MzAwMTE4IC8vIHsxMX1SVyogRE1BIEJ1ZmZlciBTaXplIDogQ2gjMjcKKyNkZWZpbmUgTU9fRE1BMjhfQ05UMSAgICAgICAweDMwMDExQyAvLyB7MTF9UlcqIERNQSBCdWZmZXIgU2l6ZSA6IENoIzI4CisjZGVmaW5lIE1PX0RNQTI5X0NOVDEgICAgICAgMHgzMDAxMjAgLy8gezExfVJXKiBETUEgQnVmZmVyIFNpemUgOiBDaCMyOQorI2RlZmluZSBNT19ETUEzMF9DTlQxICAgICAgIDB4MzAwMTI0IC8vIHsxMX1SVyogRE1BIEJ1ZmZlciBTaXplIDogQ2gjMzAKKyNkZWZpbmUgTU9fRE1BMzFfQ05UMSAgICAgICAweDMwMDEyOCAvLyB7MTF9UlcqIERNQSBCdWZmZXIgU2l6ZSA6IENoIzMxCisjZGVmaW5lIE1PX0RNQTMyX0NOVDEgICAgICAgMHgzMDAxMkMgLy8gezExfVJXKiBETUEgQnVmZmVyIFNpemUgOiBDaCMzMgorCisjZGVmaW5lIE1PX0RNQTIxX0NOVDIgICAgICAgMHgzMDAxNDAgLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzIxCisjZGVmaW5lIE1PX0RNQTIyX0NOVDIgICAgICAgMHgzMDAxNDQgLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzIyCisjZGVmaW5lIE1PX0RNQTIzX0NOVDIgICAgICAgMHgzMDAxNDggLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzIzCisjZGVmaW5lIE1PX0RNQTI0X0NOVDIgICAgICAgMHgzMDAxNEMgLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzI0CisjZGVmaW5lIE1PX0RNQTI1X0NOVDIgICAgICAgMHgzMDAxNTAgLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzI1CisjZGVmaW5lIE1PX0RNQTI2X0NOVDIgICAgICAgMHgzMDAxNTQgLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzI2CisjZGVmaW5lIE1PX0RNQTI3X0NOVDIgICAgICAgMHgzMDAxNTggLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzI3CisjZGVmaW5lIE1PX0RNQTI4X0NOVDIgICAgICAgMHgzMDAxNUMgLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzI4CisjZGVmaW5lIE1PX0RNQTI5X0NOVDIgICAgICAgMHgzMDAxNjAgLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzI5CisjZGVmaW5lIE1PX0RNQTMwX0NOVDIgICAgICAgMHgzMDAxNjQgLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzMwCisjZGVmaW5lIE1PX0RNQTMxX0NOVDIgICAgICAgMHgzMDAxNjggLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzMxCisjZGVmaW5lIE1PX0RNQTMyX0NOVDIgICAgICAgMHgzMDAxNkMgLy8gezExfVJXKiBETUEgVGFibGUgU2l6ZSA6IENoIzMyCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVmlkZW8gcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1PX1ZJRFlfRE1BICAgICAgICAgMHgzMTAwMDAgLy8gezY0fVJXcCBWaWRlbyBZCisjZGVmaW5lIE1PX1ZJRFVfRE1BICAgICAgICAgMHgzMTAwMDggLy8gezY0fVJXcCBWaWRlbyBVCisjZGVmaW5lIE1PX1ZJRFZfRE1BICAgICAgICAgMHgzMTAwMTAgLy8gezY0fVJXcCBWaWRlbyBWCisjZGVmaW5lIE1PX1ZCSV9ETUEgICAgICAgICAgMHgzMTAwMTggLy8gezY0fVJXcCBWQkkgKFZlcnRpY2FsIGJsYW5raW5nIGludGVydmFsKQorCisjZGVmaW5lIE1PX0RFVklDRV9TVEFUVVMgICAgMHgzMTAxMDAKKyNkZWZpbmUgTU9fSU5QVVRfRk9STUFUICAgICAweDMxMDEwNAorI2RlZmluZSBNT19BR0NfQlVSU1QgICAgICAgIDB4MzEwMTBjCisjZGVmaW5lIE1PX0NPTlRSX0JSSUdIVCAgICAgMHgzMTAxMTAKKyNkZWZpbmUgTU9fVVZfU0FUVVJBVElPTiAgICAweDMxMDExNAorI2RlZmluZSBNT19IVUUgICAgICAgICAgICAgIDB4MzEwMTE4CisjZGVmaW5lIE1PX0hUT1RBTCAgICAgICAgICAgMHgzMTAxMjAKKyNkZWZpbmUgTU9fSERFTEFZX0VWRU4gICAgICAweDMxMDEyNAorI2RlZmluZSBNT19IREVMQVlfT0REICAgICAgIDB4MzEwMTI4CisjZGVmaW5lIE1PX1ZERUxBWV9PREQgICAgICAgMHgzMTAxMmMKKyNkZWZpbmUgTU9fVkRFTEFZX0VWRU4gICAgICAweDMxMDEzMAorI2RlZmluZSBNT19IQUNUSVZFX0VWRU4gICAgIDB4MzEwMTNjCisjZGVmaW5lIE1PX0hBQ1RJVkVfT0REICAgICAgMHgzMTAxNDAKKyNkZWZpbmUgTU9fVkFDVElWRV9FVkVOICAgICAweDMxMDE0NAorI2RlZmluZSBNT19WQUNUSVZFX09ERCAgICAgIDB4MzEwMTQ4CisjZGVmaW5lIE1PX0hTQ0FMRV9FVkVOICAgICAgMHgzMTAxNGMKKyNkZWZpbmUgTU9fSFNDQUxFX09ERCAgICAgICAweDMxMDE1MAorI2RlZmluZSBNT19WU0NBTEVfRVZFTiAgICAgIDB4MzEwMTU0CisjZGVmaW5lIE1PX0ZJTFRFUl9FVkVOICAgICAgMHgzMTAxNWMKKyNkZWZpbmUgTU9fVlNDQUxFX09ERCAgICAgICAweDMxMDE1OAorI2RlZmluZSBNT19GSUxURVJfT0REICAgICAgIDB4MzEwMTYwCisjZGVmaW5lIE1PX09VVFBVVF9GT1JNQVQgICAgMHgzMTAxNjQKKworI2RlZmluZSBNT19QTExfUkVHICAgICAgICAgIDB4MzEwMTY4IC8vIFBMTCByZWdpc3RlcgorI2RlZmluZSBNT19QTExfQURKX0NUUkwgICAgIDB4MzEwMTZjIC8vIFBMTCBhZGp1c3QgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBNT19TQ09OVl9SRUcgICAgICAgIDB4MzEwMTcwIC8vIHNhbXBsZSByYXRlIGNvbnZlcnNpb24gcmVnaXN0ZXIKKyNkZWZpbmUgTU9fU0NPTlZfRklGTyAgICAgICAweDMxMDE3NCAvLyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIGZpZm8KKyNkZWZpbmUgTU9fU1VCX1NURVAgICAgICAgICAweDMxMDE3OCAvLyBzdWJjYXJyaWVyIHN0ZXAgc2l6ZQorI2RlZmluZSBNT19TVUJfU1RFUF9EUiAgICAgIDB4MzEwMTdjIC8vIHN1YmNhcnJpZXIgc3RlcCBzaXplIGZvciBEUiBsaW5lCisKKyNkZWZpbmUgTU9fQ0FQVFVSRV9DVFJMICAgICAweDMxMDE4MCAvLyBjYXB0dXJlIGNvbnRyb2wKKyNkZWZpbmUgTU9fQ09MT1JfQ1RSTCAgICAgICAweDMxMDE4NAorI2RlZmluZSBNT19WQklfUEFDS0VUICAgICAgIDB4MzEwMTg4IC8vIHZiaSBwYWNrZXQgc2l6ZSAvIGRlbGF5CisjZGVmaW5lIE1PX0ZJRUxEX0NPVU5UICAgICAgMHgzMTAxOTAgLy8gZmllbGQgY291bnRlcgorI2RlZmluZSBNT19WSVBfQ09ORklHICAgICAgIDB4MzEwMTk0CisjZGVmaW5lIE1PX1ZCT1NfQ09OVFJPTAkgICAgMHgzMTAxYTgKKworI2RlZmluZSBNT19BR0NfQkFDS19WQkkgICAgIDB4MzEwMjAwCisjZGVmaW5lIE1PX0FHQ19TWU5DX1RJUDEgICAgMHgzMTAyMDgKKworI2RlZmluZSBNT19WSURZX0dQQ05UICAgICAgIDB4MzFDMDIwIC8vIHsxNn1STyBWaWRlbyBZIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyCisjZGVmaW5lIE1PX1ZJRFVfR1BDTlQgICAgICAgMHgzMUMwMjQgLy8gezE2fVJPIFZpZGVvIFUgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKKyNkZWZpbmUgTU9fVklEVl9HUENOVCAgICAgICAweDMxQzAyOCAvLyB7MTZ9Uk8gVmlkZW8gViBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgorI2RlZmluZSBNT19WQklfR1BDTlQgICAgICAgIDB4MzFDMDJDIC8vIHsxNn1STyBWQkkgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKKyNkZWZpbmUgTU9fVklEWV9HUENOVFJMICAgICAweDMxQzAzMCAvLyB7Mn1XTyBWaWRlbyBZIGdlbmVyYWwgcHVycG9zZSBjb250cm9sCisjZGVmaW5lIE1PX1ZJRFVfR1BDTlRSTCAgICAgMHgzMUMwMzQgLy8gezJ9V08gVmlkZW8gVSBnZW5lcmFsIHB1cnBvc2UgY29udHJvbAorI2RlZmluZSBNT19WSURWX0dQQ05UUkwgICAgIDB4MzFDMDM4IC8vIHsyfVdPIFZpZGVvIFYgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wKKyNkZWZpbmUgTU9fVkJJX0dQQ05UUkwgICAgICAweDMxQzAzQyAvLyB7Mn1XTyBWQkkgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKKyNkZWZpbmUgTU9fVklEX0RNQUNOVFJMICAgICAweDMxQzA0MCAvLyB7OH1SVyBWaWRlbyBETUEgY29udHJvbAorI2RlZmluZSBNT19WSURfWEZSX1NUQVQgICAgIDB4MzFDMDQ0IC8vIHsxfVJPIFZpZGVvIHRyYW5zZmVyIHN0YXR1cworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGF1ZGlvIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNT19BVUREX0RNQSAgICAgICAgIDB4MzIwMDAwIC8vIHs2NH1SV3AgQXVkaW8gZG93bnN0cmVhbQorI2RlZmluZSBNT19BVURVX0RNQSAgICAgICAgIDB4MzIwMDA4IC8vIHs2NH1SV3AgQXVkaW8gdXBzdHJlYW0KKyNkZWZpbmUgTU9fQVVEUl9ETUEgICAgICAgICAweDMyMDAxMCAvLyB7NjR9UldwIEF1ZGlvIFJEUyAoZG93bnN0cmVhbSkKKyNkZWZpbmUgTU9fQVVERF9HUENOVCAgICAgICAweDMyQzAyMCAvLyB7MTZ9Uk8gQXVkaW8gZG93biBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgorI2RlZmluZSBNT19BVURVX0dQQ05UICAgICAgIDB4MzJDMDI0IC8vIHsxNn1STyBBdWRpbyB1cCBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgorI2RlZmluZSBNT19BVURSX0dQQ05UICAgICAgIDB4MzJDMDI4IC8vIHsxNn1STyBBdWRpbyBSRFMgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKKyNkZWZpbmUgTU9fQVVERF9HUENOVFJMICAgICAweDMyQzAzMCAvLyB7Mn1XTyBBdWRpbyBkb3duIGdlbmVyYWwgcHVycG9zZSBjb250cm9sCisjZGVmaW5lIE1PX0FVRFVfR1BDTlRSTCAgICAgMHgzMkMwMzQgLy8gezJ9V08gQXVkaW8gdXAgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wKKyNkZWZpbmUgTU9fQVVEUl9HUENOVFJMICAgICAweDMyQzAzOCAvLyB7Mn1XTyBBdWRpbyBSRFMgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wKKyNkZWZpbmUgTU9fQVVEX0RNQUNOVFJMICAgICAweDMyQzA0MCAvLyB7Nn1SVyBBdWRpbyBETUEgY29udHJvbAorI2RlZmluZSBNT19BVURfWEZSX1NUQVQgICAgIDB4MzJDMDQ0IC8vIHsxfVJPIEF1ZGlvIHRyYW5zZmVyIHN0YXR1cworI2RlZmluZSBNT19BVUREX0xOR1RIICAgICAgIDB4MzJDMDQ4IC8vIHsxMn1SVyBBdWRpbyBkb3duIGxpbmUgbGVuZ3RoCisjZGVmaW5lIE1PX0FVRFJfTE5HVEggICAgICAgMHgzMkMwNEMgLy8gezEyfVJXIEF1ZGlvIFJEUyBsaW5lIGxlbmd0aAorCisjZGVmaW5lIEFVRF9JTklUICAgICAgICAgICAgICAgICAweDMyMDEwMAorI2RlZmluZSBBVURfSU5JVF9MRCAgICAgICAgICAgICAgMHgzMjAxMDQKKyNkZWZpbmUgQVVEX1NPRlRfUkVTRVQgICAgICAgICAgIDB4MzIwMTA4CisjZGVmaW5lIEFVRF9JMlNJTlBVVENOVEwgICAgICAgICAweDMyMDEyMAorI2RlZmluZSBBVURfQkFVRFJBVEUgICAgICAgICAgICAgMHgzMjAxMjQKKyNkZWZpbmUgQVVEX0kyU09VVFBVVENOVEwgICAgICAgIDB4MzIwMTI4CisjZGVmaW5lIEFBR0NfSFlTVCAgICAgICAgICAgICAgICAweDMyMDEzNAorI2RlZmluZSBBQUdDX0dBSU4gICAgICAgICAgICAgICAgMHgzMjAxMzgKKyNkZWZpbmUgQUFHQ19ERUYgICAgICAgICAgICAgICAgIDB4MzIwMTNjCisjZGVmaW5lIEFVRF9JSVIxXzBfU0VMICAgICAgICAgICAweDMyMDE1MAorI2RlZmluZSBBVURfSUlSMV8wX1NISUZUICAgICAgICAgMHgzMjAxNTQKKyNkZWZpbmUgQVVEX0lJUjFfMV9TRUwgICAgICAgICAgIDB4MzIwMTU4CisjZGVmaW5lIEFVRF9JSVIxXzFfU0hJRlQgICAgICAgICAweDMyMDE1YworI2RlZmluZSBBVURfSUlSMV8yX1NFTCAgICAgICAgICAgMHgzMjAxNjAKKyNkZWZpbmUgQVVEX0lJUjFfMl9TSElGVCAgICAgICAgIDB4MzIwMTY0CisjZGVmaW5lIEFVRF9JSVIxXzNfU0VMICAgICAgICAgICAweDMyMDE2OAorI2RlZmluZSBBVURfSUlSMV8zX1NISUZUICAgICAgICAgMHgzMjAxNmMKKyNkZWZpbmUgQVVEX0lJUjFfNF9TRUwgICAgICAgICAgIDB4MzIwMTcwCisjZGVmaW5lIEFVRF9JSVIxXzRfU0hJRlQgICAgICAgICAweDMyMDE3YworI2RlZmluZSBBVURfSUlSMV81X1NFTCAgICAgICAgICAgMHgzMjAxODAKKyNkZWZpbmUgQVVEX0lJUjFfNV9TSElGVCAgICAgICAgIDB4MzIwMTg0CisjZGVmaW5lIEFVRF9JSVIyXzBfU0VMICAgICAgICAgICAweDMyMDE5MAorI2RlZmluZSBBVURfSUlSMl8wX1NISUZUICAgICAgICAgMHgzMjAxOTQKKyNkZWZpbmUgQVVEX0lJUjJfMV9TRUwgICAgICAgICAgIDB4MzIwMTk4CisjZGVmaW5lIEFVRF9JSVIyXzFfU0hJRlQgICAgICAgICAweDMyMDE5YworI2RlZmluZSBBVURfSUlSMl8yX1NFTCAgICAgICAgICAgMHgzMjAxYTAKKyNkZWZpbmUgQVVEX0lJUjJfMl9TSElGVCAgICAgICAgIDB4MzIwMWE0CisjZGVmaW5lIEFVRF9JSVIyXzNfU0VMICAgICAgICAgICAweDMyMDFhOAorI2RlZmluZSBBVURfSUlSMl8zX1NISUZUICAgICAgICAgMHgzMjAxYWMKKyNkZWZpbmUgQVVEX0lJUjNfMF9TRUwgICAgICAgICAgIDB4MzIwMWMwCisjZGVmaW5lIEFVRF9JSVIzXzBfU0hJRlQgICAgICAgICAweDMyMDFjNAorI2RlZmluZSBBVURfSUlSM18xX1NFTCAgICAgICAgICAgMHgzMjAxYzgKKyNkZWZpbmUgQVVEX0lJUjNfMV9TSElGVCAgICAgICAgIDB4MzIwMWNjCisjZGVmaW5lIEFVRF9JSVIzXzJfU0VMICAgICAgICAgICAweDMyMDFkMAorI2RlZmluZSBBVURfSUlSM18yX1NISUZUICAgICAgICAgMHgzMjAxZDQKKyNkZWZpbmUgQVVEX0lJUjRfMF9TRUwgICAgICAgICAgIDB4MzIwMWUwCisjZGVmaW5lIEFVRF9JSVI0XzBfU0hJRlQgICAgICAgICAweDMyMDFlNAorI2RlZmluZSBBVURfSUlSNF8xX1NFTCAgICAgICAgICAgMHgzMjAxZTgKKyNkZWZpbmUgQVVEX0lJUjRfMV9TSElGVCAgICAgICAgIDB4MzIwMWVjCisjZGVmaW5lIEFVRF9JSVI0XzJfU0VMICAgICAgICAgICAweDMyMDFmMAorI2RlZmluZSBBVURfSUlSNF8yX1NISUZUICAgICAgICAgMHgzMjAxZjQKKyNkZWZpbmUgQVVEX0lJUjRfMF9DQTAgICAgICAgICAgIDB4MzIwMjAwCisjZGVmaW5lIEFVRF9JSVI0XzBfQ0ExICAgICAgICAgICAweDMyMDIwNAorI2RlZmluZSBBVURfSUlSNF8wX0NBMiAgICAgICAgICAgMHgzMjAyMDgKKyNkZWZpbmUgQVVEX0lJUjRfMF9DQjAgICAgICAgICAgIDB4MzIwMjBjCisjZGVmaW5lIEFVRF9JSVI0XzBfQ0IxICAgICAgICAgICAweDMyMDIxMAorI2RlZmluZSBBVURfSUlSNF8xX0NBMCAgICAgICAgICAgMHgzMjAyMTQKKyNkZWZpbmUgQVVEX0lJUjRfMV9DQTEgICAgICAgICAgIDB4MzIwMjE4CisjZGVmaW5lIEFVRF9JSVI0XzFfQ0EyICAgICAgICAgICAweDMyMDIxYworI2RlZmluZSBBVURfSUlSNF8xX0NCMCAgICAgICAgICAgMHgzMjAyMjAKKyNkZWZpbmUgQVVEX0lJUjRfMV9DQjEgICAgICAgICAgIDB4MzIwMjI0CisjZGVmaW5lIEFVRF9JSVI0XzJfQ0EwICAgICAgICAgICAweDMyMDIyOAorI2RlZmluZSBBVURfSUlSNF8yX0NBMSAgICAgICAgICAgMHgzMjAyMmMKKyNkZWZpbmUgQVVEX0lJUjRfMl9DQTIgICAgICAgICAgIDB4MzIwMjMwCisjZGVmaW5lIEFVRF9JSVI0XzJfQ0IwICAgICAgICAgICAweDMyMDIzNAorI2RlZmluZSBBVURfSUlSNF8yX0NCMSAgICAgICAgICAgMHgzMjAyMzgKKyNkZWZpbmUgQVVEX0hQX01EX0lJUjRfMSAgICAgICAgIDB4MzIwMjUwCisjZGVmaW5lIEFVRF9IUF9QUk9HX0lJUjRfMSAgICAgICAweDMyMDI1NAorI2RlZmluZSBBVURfRk1fTU9ERV9FTkFCTEUgICAgICAgMHgzMjAyNTgKKyNkZWZpbmUgQVVEX1BPTFkwX0REU19DT05TVEFOVCAgIDB4MzIwMjcwCisjZGVmaW5lIEFVRF9ETjBfRlJFUSAgICAgICAgICAgICAweDMyMDI3NAorI2RlZmluZSBBVURfRE4xX0ZSRVEgICAgICAgICAgICAgMHgzMjAyNzgKKyNkZWZpbmUgQVVEX0ROMV9GUkVRX1NISUZUICAgICAgIDB4MzIwMjdjCisjZGVmaW5lIEFVRF9ETjFfQUZDICAgICAgICAgICAgICAweDMyMDI4MAorI2RlZmluZSBBVURfRE4xX1NSQ19TRUwgICAgICAgICAgMHgzMjAyODQKKyNkZWZpbmUgQVVEX0ROMV9TSEZUICAgICAgICAgICAgIDB4MzIwMjg4CisjZGVmaW5lIEFVRF9ETjJfRlJFUSAgICAgICAgICAgICAweDMyMDI4YworI2RlZmluZSBBVURfRE4yX0ZSRVFfU0hJRlQgICAgICAgMHgzMjAyOTAKKyNkZWZpbmUgQVVEX0ROMl9BRkMgICAgICAgICAgICAgIDB4MzIwMjk0CisjZGVmaW5lIEFVRF9ETjJfU1JDX1NFTCAgICAgICAgICAweDMyMDI5OAorI2RlZmluZSBBVURfRE4yX1NIRlQgICAgICAgICAgICAgMHgzMjAyOWMKKyNkZWZpbmUgQVVEX0NSREMwX1NSQ19TRUwgICAgICAgIDB4MzIwMzAwCisjZGVmaW5lIEFVRF9DUkRDMF9TSElGVCAgICAgICAgICAweDMyMDMwNAorI2RlZmluZSBBVURfQ09SRElDX1NISUZUXzAgICAgICAgMHgzMjAzMDgKKyNkZWZpbmUgQVVEX0NSREMxX1NSQ19TRUwgICAgICAgIDB4MzIwMzBjCisjZGVmaW5lIEFVRF9DUkRDMV9TSElGVCAgICAgICAgICAweDMyMDMxMAorI2RlZmluZSBBVURfQ09SRElDX1NISUZUXzEgICAgICAgMHgzMjAzMTQKKyNkZWZpbmUgQVVEX0RDT0NfMF9TUkMgICAgICAgICAgIDB4MzIwMzIwCisjZGVmaW5lIEFVRF9EQ09DMF9TSElGVCAgICAgICAgICAweDMyMDMyNAorI2RlZmluZSBBVURfRENPQ18wX1NISUZUX0lOMCAgICAgMHgzMjAzMjgKKyNkZWZpbmUgQVVEX0RDT0NfMF9TSElGVF9JTjEgICAgIDB4MzIwMzJjCisjZGVmaW5lIEFVRF9EQ09DXzFfU1JDICAgICAgICAgICAweDMyMDMzMAorI2RlZmluZSBBVURfRENPQzFfU0hJRlQgICAgICAgICAgMHgzMjAzMzQKKyNkZWZpbmUgQVVEX0RDT0NfMV9TSElGVF9JTjAgICAgIDB4MzIwMzM4CisjZGVmaW5lIEFVRF9EQ09DXzFfU0hJRlRfSU4xICAgICAweDMyMDMzYworI2RlZmluZSBBVURfRENPQ18yX1NSQyAgICAgICAgICAgMHgzMjAzNDAKKyNkZWZpbmUgQVVEX0RDT0MyX1NISUZUICAgICAgICAgIDB4MzIwMzQ0CisjZGVmaW5lIEFVRF9EQ09DXzJfU0hJRlRfSU4wICAgICAweDMyMDM0OAorI2RlZmluZSBBVURfRENPQ18yX1NISUZUX0lOMSAgICAgMHgzMjAzNGMKKyNkZWZpbmUgQVVEX0RDT0NfUEFTU19JTiAgICAgICAgIDB4MzIwMzUwCisjZGVmaW5lIEFVRF9QREVUX1NSQyAgICAgICAgICAgICAweDMyMDM3MAorI2RlZmluZSBBVURfUERFVF9TSElGVCAgICAgICAgICAgMHgzMjAzNzQKKyNkZWZpbmUgQVVEX1BJTE9UX0JRRF8xX0swICAgICAgIDB4MzIwMzgwCisjZGVmaW5lIEFVRF9QSUxPVF9CUURfMV9LMSAgICAgICAweDMyMDM4NAorI2RlZmluZSBBVURfUElMT1RfQlFEXzFfSzIgICAgICAgMHgzMjAzODgKKyNkZWZpbmUgQVVEX1BJTE9UX0JRRF8xX0szICAgICAgIDB4MzIwMzhjCisjZGVmaW5lIEFVRF9QSUxPVF9CUURfMV9LNCAgICAgICAweDMyMDM5MAorI2RlZmluZSBBVURfUElMT1RfQlFEXzJfSzAgICAgICAgMHgzMjAzOTQKKyNkZWZpbmUgQVVEX1BJTE9UX0JRRF8yX0sxICAgICAgIDB4MzIwMzk4CisjZGVmaW5lIEFVRF9QSUxPVF9CUURfMl9LMiAgICAgICAweDMyMDM5YworI2RlZmluZSBBVURfUElMT1RfQlFEXzJfSzMgICAgICAgMHgzMjAzYTAKKyNkZWZpbmUgQVVEX1BJTE9UX0JRRF8yX0s0ICAgICAgIDB4MzIwM2E0CisjZGVmaW5lIEFVRF9USFJfRlIgICAgICAgICAgICAgICAweDMyMDNjMAorI2RlZmluZSBBVURfWF9QUk9HICAgICAgICAgICAgICAgMHgzMjAzYzQKKyNkZWZpbmUgQVVEX1lfUFJPRyAgICAgICAgICAgICAgIDB4MzIwM2M4CisjZGVmaW5lIEFVRF9IQVJNT05JQ19NVUxUICAgICAgICAweDMyMDNjYworI2RlZmluZSBBVURfQzFfVVBfVEhSICAgICAgICAgICAgMHgzMjAzZDAKKyNkZWZpbmUgQVVEX0MxX0xPX1RIUiAgICAgICAgICAgIDB4MzIwM2Q0CisjZGVmaW5lIEFVRF9DMl9VUF9USFIgICAgICAgICAgICAweDMyMDNkOAorI2RlZmluZSBBVURfQzJfTE9fVEhSICAgICAgICAgICAgMHgzMjAzZGMKKyNkZWZpbmUgQVVEX1BMTF9FTiAgICAgICAgICAgICAgIDB4MzIwNDAwCisjZGVmaW5lIEFVRF9QTExfU1JDICAgICAgICAgICAgICAweDMyMDQwNAorI2RlZmluZSBBVURfUExMX1NISUZUICAgICAgICAgICAgMHgzMjA0MDgKKyNkZWZpbmUgQVVEX1BMTF9JRl9TRUwgICAgICAgICAgIDB4MzIwNDBjCisjZGVmaW5lIEFVRF9QTExfSUZfU0hJRlQgICAgICAgICAweDMyMDQxMAorI2RlZmluZSBBVURfQklRVUFEX1BMTF9LMCAgICAgICAgMHgzMjA0MTQKKyNkZWZpbmUgQVVEX0JJUVVBRF9QTExfSzEgICAgICAgIDB4MzIwNDE4CisjZGVmaW5lIEFVRF9CSVFVQURfUExMX0syICAgICAgICAweDMyMDQxYworI2RlZmluZSBBVURfQklRVUFEX1BMTF9LMyAgICAgICAgMHgzMjA0MjAKKyNkZWZpbmUgQVVEX0JJUVVBRF9QTExfSzQgICAgICAgIDB4MzIwNDI0CisjZGVmaW5lIEFVRF9ERUVNUEgwX1NSQ19TRUwgICAgICAweDMyMDQ0MAorI2RlZmluZSBBVURfREVFTVBIMF9TSElGVCAgICAgICAgMHgzMjA0NDQKKyNkZWZpbmUgQVVEX0RFRU1QSDBfRzAgICAgICAgICAgIDB4MzIwNDQ4CisjZGVmaW5lIEFVRF9ERUVNUEgwX0EwICAgICAgICAgICAweDMyMDQ0YworI2RlZmluZSBBVURfREVFTVBIMF9CMCAgICAgICAgICAgMHgzMjA0NTAKKyNkZWZpbmUgQVVEX0RFRU1QSDBfQTEgICAgICAgICAgIDB4MzIwNDU0CisjZGVmaW5lIEFVRF9ERUVNUEgwX0IxICAgICAgICAgICAweDMyMDQ1OAorI2RlZmluZSBBVURfREVFTVBIMV9TUkNfU0VMICAgICAgMHgzMjA0NWMKKyNkZWZpbmUgQVVEX0RFRU1QSDFfU0hJRlQgICAgICAgIDB4MzIwNDYwCisjZGVmaW5lIEFVRF9ERUVNUEgxX0cwICAgICAgICAgICAweDMyMDQ2NAorI2RlZmluZSBBVURfREVFTVBIMV9BMCAgICAgICAgICAgMHgzMjA0NjgKKyNkZWZpbmUgQVVEX0RFRU1QSDFfQjAgICAgICAgICAgIDB4MzIwNDZjCisjZGVmaW5lIEFVRF9ERUVNUEgxX0ExICAgICAgICAgICAweDMyMDQ3MAorI2RlZmluZSBBVURfREVFTVBIMV9CMSAgICAgICAgICAgMHgzMjA0NzQKKyNkZWZpbmUgQVVEX09VVDBfU0VMICAgICAgICAgICAgIDB4MzIwNDkwCisjZGVmaW5lIEFVRF9PVVQwX1NISUZUICAgICAgICAgICAweDMyMDQ5NAorI2RlZmluZSBBVURfT1VUMV9TRUwgICAgICAgICAgICAgMHgzMjA0OTgKKyNkZWZpbmUgQVVEX09VVDFfU0hJRlQgICAgICAgICAgIDB4MzIwNDljCisjZGVmaW5lIEFVRF9SRFNJX1NFTCAgICAgICAgICAgICAweDMyMDRhMAorI2RlZmluZSBBVURfUkRTSV9TSElGVCAgICAgICAgICAgMHgzMjA0YTQKKyNkZWZpbmUgQVVEX1JEU1FfU0VMICAgICAgICAgICAgIDB4MzIwNGE4CisjZGVmaW5lIEFVRF9SRFNRX1NISUZUICAgICAgICAgICAweDMyMDRhYworI2RlZmluZSBBVURfREJYX0lOX0dBSU4gICAgICAgICAgMHgzMjA1MDAKKyNkZWZpbmUgQVVEX0RCWF9XQkVfR0FJTiAgICAgICAgIDB4MzIwNTA0CisjZGVmaW5lIEFVRF9EQlhfU0VfR0FJTiAgICAgICAgICAweDMyMDUwOAorI2RlZmluZSBBVURfREJYX1JNU19XQkUgICAgICAgICAgMHgzMjA1MGMKKyNkZWZpbmUgQVVEX0RCWF9STVNfU0UgICAgICAgICAgIDB4MzIwNTEwCisjZGVmaW5lIEFVRF9EQlhfU0VfQllQQVNTICAgICAgICAweDMyMDUxNAorI2RlZmluZSBBVURfRkFXREVUQ1RMICAgICAgICAgICAgMHgzMjA1MzAKKyNkZWZpbmUgQVVEX0ZBV0RFVFdJTkNUTCAgICAgICAgIDB4MzIwNTM0CisjZGVmaW5lIEFVRF9ERUVNUEhHQUlOX1IgICAgICAgICAweDMyMDUzOAorI2RlZmluZSBBVURfREVFTVBITlVNRVIxX1IgICAgICAgMHgzMjA1M2MKKyNkZWZpbmUgQVVEX0RFRU1QSE5VTUVSMl9SICAgICAgIDB4MzIwNTQwCisjZGVmaW5lIEFVRF9ERUVNUEhERU5PTTFfUiAgICAgICAweDMyMDU0NAorI2RlZmluZSBBVURfREVFTVBIREVOT00yX1IgICAgICAgMHgzMjA1NDgKKyNkZWZpbmUgQVVEX0VSUkxPR1BFUklPRF9SICAgICAgIDB4MzIwNTRjCisjZGVmaW5lIEFVRF9FUlJJTlRSUFRUSFNITEQxX1IgICAweDMyMDU1MAorI2RlZmluZSBBVURfRVJSSU5UUlBUVEhTSExEMl9SICAgMHgzMjA1NTQKKyNkZWZpbmUgQVVEX0VSUklOVFJQVFRIU0hMRDNfUiAgIDB4MzIwNTU4CisjZGVmaW5lIEFVRF9OSUNBTV9TVEFUVVMxICAgICAgICAweDMyMDU1YworI2RlZmluZSBBVURfTklDQU1fU1RBVFVTMiAgICAgICAgMHgzMjA1NjAKKyNkZWZpbmUgQVVEX0VSUkxPRzEgICAgICAgICAgICAgIDB4MzIwNTY0CisjZGVmaW5lIEFVRF9FUlJMT0cyICAgICAgICAgICAgICAweDMyMDU2OAorI2RlZmluZSBBVURfRVJSTE9HMyAgICAgICAgICAgICAgMHgzMjA1NmMKKyNkZWZpbmUgQVVEX0RBQ19CWVBBU1NfTCAgICAgICAgIDB4MzIwNTgwCisjZGVmaW5lIEFVRF9EQUNfQllQQVNTX1IgICAgICAgICAweDMyMDU4NAorI2RlZmluZSBBVURfREFDX0JZUEFTU19DVEwgICAgICAgMHgzMjA1ODgKKyNkZWZpbmUgQVVEX0NUTCAgICAgICAgICAgICAgICAgIDB4MzIwNThjCisjZGVmaW5lIEFVRF9TVEFUVVMgICAgICAgICAgICAgICAweDMyMDU5MAorI2RlZmluZSBBVURfVk9MX0NUTCAgICAgICAgICAgICAgMHgzMjA1OTQKKyNkZWZpbmUgQVVEX0JBTF9DVEwgICAgICAgICAgICAgIDB4MzIwNTk4CisjZGVmaW5lIEFVRF9TVEFSVF9USU1FUiAgICAgICAgICAweDMyMDViMAorI2RlZmluZSBBVURfTU9ERV9DSEdfVElNRVIgICAgICAgMHgzMjA1YjQKKyNkZWZpbmUgQVVEX1BPTFlQSDgwU0NBTEVGQUMgICAgIDB4MzIwNWI4CisjZGVmaW5lIEFVRF9ETURfUkFfRERTICAgICAgICAgICAweDMyMDViYworI2RlZmluZSBBVURfSTJTX1JBX0REUyAgICAgICAgICAgMHgzMjA1YzAKKyNkZWZpbmUgQVVEX1JBVEVfVEhSRVNfRE1EICAgICAgIDB4MzIwNWQwCisjZGVmaW5lIEFVRF9SQVRFX1RIUkVTX0kyUyAgICAgICAweDMyMDVkNAorI2RlZmluZSBBVURfUkFURV9BREoxICAgICAgICAgICAgMHgzMjA1ZDgKKyNkZWZpbmUgQVVEX1JBVEVfQURKMiAgICAgICAgICAgIDB4MzIwNWRjCisjZGVmaW5lIEFVRF9SQVRFX0FESjMgICAgICAgICAgICAweDMyMDVlMAorI2RlZmluZSBBVURfUkFURV9BREo0ICAgICAgICAgICAgMHgzMjA1ZTQKKyNkZWZpbmUgQVVEX1JBVEVfQURKNSAgICAgICAgICAgIDB4MzIwNWU4CisjZGVmaW5lIEFVRF9BUEJfSU5fUkFURV9BREogICAgICAweDMyMDVlYworI2RlZmluZSBBVURfUEhBU0VfRklYX0NUTCAgICAgICAgMHgzMjA1ZjAKKyNkZWZpbmUgQVVEX1BMTF9QUkVTQ0FMRSAgICAgICAgIDB4MzIwNjAwCisjZGVmaW5lIEFVRF9QTExfRERTICAgICAgICAgICAgICAweDMyMDYwNAorI2RlZmluZSBBVURfUExMX0lOVCAgICAgICAgICAgICAgMHgzMjA2MDgKKyNkZWZpbmUgQVVEX1BMTF9GUkFDICAgICAgICAgICAgIDB4MzIwNjBjCisjZGVmaW5lIEFVRF9QTExfSlRBRyAgICAgICAgICAgICAweDMyMDYyMAorI2RlZmluZSBBVURfUExMX1NQTVAgICAgICAgICAgICAgMHgzMjA2MjQKKyNkZWZpbmUgQVVEX0FGRV8xMkRCX0VOICAgICAgICAgIDB4MzIwNjI4CisKKy8vIEF1ZGlvIFFBTSBSZWdpc3RlciBBZGRyZXNzZXMKKyNkZWZpbmUgQVVEX1BERl9ERFNfQ05TVF9CWVRFMiAgIDB4MzIwZDAxCisjZGVmaW5lIEFVRF9QREZfRERTX0NOU1RfQllURTEgICAweDMyMGQwMgorI2RlZmluZSBBVURfUERGX0REU19DTlNUX0JZVEUwICAgMHgzMjBkMDMKKyNkZWZpbmUgQVVEX1BIQUNDX0ZSRVFfOE1TQiAgICAgIDB4MzIwZDJhCisjZGVmaW5lIEFVRF9QSEFDQ19GUkVRXzhMU0IgICAgICAweDMyMGQyYgorI2RlZmluZSBBVURfUUFNX01PREUgICAgICAgICAgICAgMHgzMjBkMDQKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0cmFuc3BvcnQgc3RyZWFtIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTU9fVFNfRE1BICAgICAgICAgICAweDMzMDAwMCAvLyB7NjR9UldwIFRyYW5zcG9ydCBzdHJlYW0gZG93bnN0cmVhbQorI2RlZmluZSBNT19UU19HUENOVCAgICAgICAgIDB4MzNDMDIwIC8vIHsxNn1STyBUUyBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgorI2RlZmluZSBNT19UU19HUENOVFJMICAgICAgIDB4MzNDMDMwIC8vIHsyfVdPIFRTIGdlbmVyYWwgcHVycG9zZSBjb250cm9sCisjZGVmaW5lIE1PX1RTX0RNQUNOVFJMICAgICAgMHgzM0MwNDAgLy8gezZ9UlcgVFMgRE1BIGNvbnRyb2wKKyNkZWZpbmUgTU9fVFNfWEZSX1NUQVQgICAgICAweDMzQzA0NCAvLyB7MX1STyBUUyB0cmFuc2ZlciBzdGF0dXMKKyNkZWZpbmUgTU9fVFNfTE5HVEggICAgICAgICAweDMzQzA0OCAvLyB7MTJ9UlcgVFMgbGluZSBsZW5ndGgKKworI2RlZmluZSBUU19IV19TT1BfQ05UUkwgICAgIDB4MzNDMDRDCisjZGVmaW5lIFRTX0dFTl9DTlRSTCAgICAgICAgMHgzM0MwNTAKKyNkZWZpbmUgVFNfQkRfUEtUX1NUQVQgICAgICAweDMzQzA1NAorI2RlZmluZSBUU19TT1BfU1RBVCAgICAgICAgIDB4MzNDMDU4CisjZGVmaW5lIFRTX0ZJRk9fT1ZGTF9TVEFUICAgMHgzM0MwNUMKKyNkZWZpbmUgVFNfVkFMRVJSX0NOVFJMICAgICAweDMzQzA2MAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFZJUCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNT19WSVBEX0RNQSAgICAgICAgIDB4MzQwMDAwIC8vIHs2NH1SV3AgVklQIGRvd25zdHJlYW0KKyNkZWZpbmUgTU9fVklQVV9ETUEgICAgICAgICAweDM0MDAwOCAvLyB7NjR9UldwIFZJUCB1cHN0cmVhbQorI2RlZmluZSBNT19WSVBEX0dQQ05UICAgICAgIDB4MzRDMDIwIC8vIHsxNn1STyBWSVAgZG93biBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgorI2RlZmluZSBNT19WSVBVX0dQQ05UICAgICAgIDB4MzRDMDI0IC8vIHsxNn1STyBWSVAgdXAgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKKyNkZWZpbmUgTU9fVklQRF9HUENOVFJMICAgICAweDM0QzAzMCAvLyB7Mn1XTyBWSVAgZG93biBnZW5lcmFsIHB1cnBvc2UgY29udHJvbAorI2RlZmluZSBNT19WSVBVX0dQQ05UUkwgICAgIDB4MzRDMDM0IC8vIHsyfVdPIFZJUCB1cCBnZW5lcmFsIHB1cnBvc2UgY29udHJvbAorI2RlZmluZSBNT19WSVBfRE1BQ05UUkwgICAgIDB4MzRDMDQwIC8vIHs2fVJXIFZJUCBETUEgY29udHJvbAorI2RlZmluZSBNT19WSVBfWEZSX1NUQVQgICAgIDB4MzRDMDQ0IC8vIHsxfVJPIFZJUCB0cmFuc2ZlciBzdGF0dXMKKyNkZWZpbmUgTU9fVklQX0NGRyAgICAgICAgICAweDM0MDA0OCAvLyBWSVAgY29uZmlndXJhdGlvbgorI2RlZmluZSBNT19WSVBVX0NOVFJMICAgICAgIDB4MzQwMDRDIC8vIFZJUCB1cHN0cmVhbSBjb250cm9sICMxCisjZGVmaW5lIE1PX1ZJUERfQ05UUkwgICAgICAgMHgzNDAwNTAgLy8gVklQIGRvd25zdHJlYW0gY29udHJvbCAjMgorI2RlZmluZSBNT19WSVBEX0xOR1RIICAgICAgIDB4MzQwMDU0IC8vIFZJUCBkb3duc3RyZWFtIGxpbmUgbGVuZ3RoCisjZGVmaW5lIE1PX1ZJUF9CUlNUTE4gICAgICAgMHgzNDAwNTggLy8gVklQIGJ1cnN0IGxlbmd0aAorI2RlZmluZSBNT19WSVBfSU5UQ05UUkwgICAgIDB4MzRDMDVDIC8vIFZJUCBJbnRlcnJ1cHQgQ29udHJvbAorI2RlZmluZSBNT19WSVBfWEZURVJNICAgICAgIDB4MzQwMDYwIC8vIFZJUCB0cmFuc2ZlciB0ZXJtaW5hdGUKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBtaXNjIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTU9fTTJNX0RNQSAgICAgICAgICAweDM1MDAwMCAvLyB7NjR9UldwIE1lbTJNZW0gRE1BIEJmcgorI2RlZmluZSBNT19HUDBfSU8gICAgICAgICAgIDB4MzUwMDEwIC8vIHszMn1SVyogR1BJT291dHB1dCBlbmFibGVzZGF0YSBJL08KKyNkZWZpbmUgTU9fR1AxX0lPICAgICAgICAgICAweDM1MDAxNCAvLyB7MzJ9UlcqIEdQSU9vdXRwdXQgZW5hYmxlc2RhdGEgSS9PCisjZGVmaW5lIE1PX0dQMl9JTyAgICAgICAgICAgMHgzNTAwMTggLy8gezMyfVJXKiBHUElPb3V0cHV0IGVuYWJsZXNkYXRhIEkvTworI2RlZmluZSBNT19HUDNfSU8gICAgICAgICAgIDB4MzUwMDFDIC8vIHszMn1SVyogR1BJTyBNb2RlL0N0cmxvdXRwdXQgZW5hYmxlcworI2RlZmluZSBNT19HUElPICAgICAgICAgICAgIDB4MzUwMDIwIC8vIHszMn1SVyogR1BJTyBJMkMgQ3RybGRhdGEgSS9PCisjZGVmaW5lIE1PX0dQT0UgICAgICAgICAgICAgMHgzNTAwMjQgLy8gezMyfVJXICBHUElPIEkyQyBDdHJsb3V0cHV0IGVuYWJsZXMKKyNkZWZpbmUgTU9fR1BfSVNNICAgICAgICAgICAweDM1MDAyOCAvLyB7MTZ9V08gIEdQSU8gSW50ciBTZW5zL1BvbAorCisjZGVmaW5lIE1PX1BMTF9CICAgICAgICAgICAgMHgzNUMwMDggLy8gezMyfVJXKiBQTEwgQ29udHJvbCBmb3IgQVNCIGJ1cyBjbGtzCisjZGVmaW5lIE1PX00yTV9DTlQgICAgICAgICAgMHgzNUMwMjQgLy8gezMyfVJXICBNZW0yTWVtIERNQSBDbnQKKyNkZWZpbmUgTU9fTTJNX1hTVU0gICAgICAgICAweDM1QzAyOCAvLyB7MzJ9Uk8gIE0yTSBYT1ItQ2hlY2tzdW0KKyNkZWZpbmUgTU9fQ1JDICAgICAgICAgICAgICAweDM1QzAyQyAvLyB7MTZ9UlcgIENSQzE2IGluaXQvcmVzdWx0CisjZGVmaW5lIE1PX0NSQ19EICAgICAgICAgICAgMHgzNUMwMzAgLy8gezMyfVdPICBDUkMxNiBuZXcgZGF0YSBpbgorI2RlZmluZSBNT19UTV9DTlRfTERXICAgICAgIDB4MzVDMDM0IC8vIHszMn1STyAgVGltZXIgOiBDb3VudGVyIGxvdyBkd29yZAorI2RlZmluZSBNT19UTV9DTlRfVVcgICAgICAgIDB4MzVDMDM4IC8vIHsxNn1STyAgVGltZXIgOiBDb3VudGVyIGhpZ2ggd29yZAorI2RlZmluZSBNT19UTV9MTVRfTERXICAgICAgIDB4MzVDMDNDIC8vIHszMn1SVyAgVGltZXIgOiBMaW1pdCBsb3cgZHdvcmQKKyNkZWZpbmUgTU9fVE1fTE1UX1VXICAgICAgICAweDM1QzA0MCAvLyB7MzJ9UlcgIFRpbWVyIDogTGltaXQgaGlnaCB3b3JkCisjZGVmaW5lIE1PX1BJTk1VWF9JTyAgICAgICAgMHgzNUMwNDQgLy8gezh9UlcgIFBpbiBNdXggQ29udHJvbAorI2RlZmluZSBNT19UU1RTRUxfSU8gICAgICAgIDB4MzVDMDQ4IC8vIHsyfVJXICBQaW4gTXV4IENvbnRyb2wKKyNkZWZpbmUgTU9fQUZFQ0ZHX0lPICAgICAgICAweDM1QzA0QyAvLyBBRkUgY29uZmlndXJhdGlvbiByZWcKKyNkZWZpbmUgTU9fRERTX0lPICAgICAgICAgICAweDM1QzA1MCAvLyBERFMgSW5jcmVtZW50IHJlZworI2RlZmluZSBNT19ERFNDRkdfSU8gICAgICAgIDB4MzVDMDU0IC8vIEREUyBDb25maWd1cmF0aW9uIHJlZworI2RlZmluZSBNT19TQU1QTEVfSU8gICAgICAgIDB4MzVDMDU4IC8vIElSSW4gc2FtcGxlIHJlZworI2RlZmluZSBNT19TUlNUX0lPICAgICAgICAgIDB4MzVDMDVDIC8vIE91dHB1dCBzeXN0ZW0gcmVzZXQgcmVnCisKKyNkZWZpbmUgTU9fSU5UMV9NU0sgICAgICAgICAweDM1QzA2MCAvLyBETUEgUklTQyBpbnRlcnJ1cHQgbWFzaworI2RlZmluZSBNT19JTlQxX1NUQVQgICAgICAgIDB4MzVDMDY0IC8vIERNQSBSSVNDIGludGVycnVwdCBzdGF0dXMKKyNkZWZpbmUgTU9fSU5UMV9NU1RBVCAgICAgICAweDM1QzA2OCAvLyBETUEgUklTQyBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGkyYyBidXMgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNT19JMkMgICAgICAgICAgICAgIDB4MzY4MDAwIC8vIEkyQyBkYXRhL2NvbnRyb2wKKyNkZWZpbmUgTU9fSTJDX0RJViAgICAgICAgICAoMHhmPDw0KQorI2RlZmluZSBNT19JMkNfU1lOQyAgICAgICAgICgxPDwzKQorI2RlZmluZSBNT19JMkNfVzNCICAgICAgICAgICgxPDwyKQorI2RlZmluZSBNT19JMkNfU0NMICAgICAgICAgICgxPDwxKQorI2RlZmluZSBNT19JMkNfU0RBICAgICAgICAgICgxPDwwKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGdlbmVyYWwgcHVycG9zZSBob3N0IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZJWE1FOiB0eW9wcz8gIHMvMHgzNS8weDM4LyA/PyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNT19HUEhTVERfRE1BICAgICAgIDB4MzUwMDAwIC8vIHs2NH1SV3AgSG9zdCBkb3duc3RyZWFtCisjZGVmaW5lIE1PX0dQSFNUVV9ETUEgICAgICAgMHgzNTAwMDggLy8gezY0fVJXcCBIb3N0IHVwc3RyZWFtCisjZGVmaW5lIE1PX0dQSFNUVV9DTlRSTCAgICAgMHgzODAwNDggLy8gSG9zdCB1cHN0cmVhbSBjb250cm9sICMxCisjZGVmaW5lIE1PX0dQSFNURF9DTlRSTCAgICAgMHgzODAwNEMgLy8gSG9zdCBkb3duc3RyZWFtIGNvbnRyb2wgIzIKKyNkZWZpbmUgTU9fR1BIU1REX0xOR1RIICAgICAweDM4MDA1MCAvLyBIb3N0IGRvd25zdHJlYW0gbGluZSBsZW5ndGgKKyNkZWZpbmUgTU9fR1BIU1RfV1NDICAgICAgICAweDM4MDA1NCAvLyBIb3N0IHdhaXQgc3RhdGUgY29udHJvbAorI2RlZmluZSBNT19HUEhTVF9YRlIgICAgICAgIDB4MzgwMDU4IC8vIEhvc3QgdHJhbnNmZXIgY29udHJvbAorI2RlZmluZSBNT19HUEhTVF9XRFRIICAgICAgIDB4MzgwMDVDIC8vIEhvc3QgaW50ZXJmYWNlIHdpZHRoCisjZGVmaW5lIE1PX0dQSFNUX0hEU0hLICAgICAgMHgzODAwNjAgLy8gSG9zdCBwZXJpcGhlcmFsIGhhbmRzaGFrZQorI2RlZmluZSBNT19HUEhTVF9NVVgxNiAgICAgIDB4MzgwMDY0IC8vIEhvc3QgbXV4ZWQgMTYtYml0IHRyYW5zZmVyIHBhcmFtZXRlcnMKKyNkZWZpbmUgTU9fR1BIU1RfTU9ERSAgICAgICAweDM4MDA2OCAvLyBIb3N0IG1vZGUgc2VsZWN0CisKKyNkZWZpbmUgTU9fR1BIU1REX0dQQ05UICAgICAweDM1QzAyMCAvLyBIb3N0IGRvd24gZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKKyNkZWZpbmUgTU9fR1BIU1RVX0dQQ05UICAgICAweDM1QzAyNCAvLyBIb3N0IHVwIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyCisjZGVmaW5lIE1PX0dQSFNURF9HUENOVFJMICAgMHgzOEMwMzAgLy8gSG9zdCBkb3duIGdlbmVyYWwgcHVycG9zZSBjb250cm9sCisjZGVmaW5lIE1PX0dQSFNUVV9HUENOVFJMICAgMHgzOEMwMzQgLy8gSG9zdCB1cCBnZW5lcmFsIHB1cnBvc2UgY29udHJvbAorI2RlZmluZSBNT19HUEhTVF9ETUFDTlRSTCAgIDB4MzhDMDQwIC8vIEhvc3QgRE1BIGNvbnRyb2wKKyNkZWZpbmUgTU9fR1BIU1RfWEZSX1NUQVQgICAweDM4QzA0NCAvLyBIb3N0IHRyYW5zZmVyIHN0YXR1cworI2RlZmluZSBNT19HUEhTVF9TT0ZUX1JTVCAgIDB4MzhDMDZDIC8vIEhvc3Qgc29mdHdhcmUgcmVzZXQKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSSVNDIGluc3RydWN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUklTQ19TWU5DCQkgMHg4MDAwMDAwMAorI2RlZmluZSBSSVNDX1NZTkNfT0RECQkgMHg4MDAwMDAwMAorI2RlZmluZSBSSVNDX1NZTkNfRVZFTgkJIDB4ODAwMDAyMDAKKyNkZWZpbmUgUklTQ19SRVNZTkMJCSAweDgwMDA4MDAwCisjZGVmaW5lIFJJU0NfUkVTWU5DX09ERAkJIDB4ODAwMDgwMDAKKyNkZWZpbmUgUklTQ19SRVNZTkNfRVZFTgkgMHg4MDAwODIwMAorI2RlZmluZSBSSVNDX1dSSVRFCQkgMHgxMDAwMDAwMAorI2RlZmluZSBSSVNDX1dSSVRFQwkJIDB4NTAwMDAwMDAKKyNkZWZpbmUgUklTQ19SRUFECQkgMHg5MDAwMDAwMAorI2RlZmluZSBSSVNDX1JFQURDCQkgMHhBMDAwMDAwMAorI2RlZmluZSBSSVNDX0pVTVAJCSAweDcwMDAwMDAwCisjZGVmaW5lIFJJU0NfU0tJUAkJIDB4MjAwMDAwMDAKKyNkZWZpbmUgUklTQ19XUklURVJNCQkgMHhCMDAwMDAwMAorI2RlZmluZSBSSVNDX1dSSVRFQ00JCSAweEMwMDAwMDAwCisjZGVmaW5lIFJJU0NfV1JJVEVDUgkJIDB4RDAwMDAwMDAKKyNkZWZpbmUgUklTQ19JTU0JCSAweDAwMDAwMDAxCisKKyNkZWZpbmUgUklTQ19TT0wJCSAweDA4MDAwMDAwCisjZGVmaW5lIFJJU0NfRU9MCQkgMHgwNDAwMDAwMAorCisjZGVmaW5lIFJJU0NfSVJRMgkJIDB4MDIwMDAwMDAKKyNkZWZpbmUgUklTQ19JUlExCQkgMHgwMTAwMDAwMAorCisjZGVmaW5lIFJJU0NfQ05UX05PTkUJCSAweDAwMDAwMDAwCisjZGVmaW5lIFJJU0NfQ05UX0lOQwkJIDB4MDAwMTAwMDAKKyNkZWZpbmUgUklTQ19DTlRfUlNWUgkJIDB4MDAwMjAwMDAKKyNkZWZpbmUgUklTQ19DTlRfUkVTRVQJCSAweDAwMDMwMDAwCisjZGVmaW5lIFJJU0NfSk1QX1NSUCAgICAgICAgIAkgMHgwMQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHZhcmlvdXMgY29uc3RhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBTRUxfQlRTQyAgICAgMHgwMQorI2RlZmluZSBTRUxfRUlBSiAgICAgMHgwMgorI2RlZmluZSBTRUxfQTIgICAgICAgMHgwNAorI2RlZmluZSBTRUxfU0FQICAgICAgMHgwOAorI2RlZmluZSBTRUxfTklDQU0gICAgMHgxMAorI2RlZmluZSBTRUxfRk1SQURJTyAgMHgyMAorCisvLyBBVURfQ1RMCisjZGVmaW5lIEVOX0JUU0NfRk9SQ0VfTU9OTyAgICAgIDAKKyNkZWZpbmUgRU5fQlRTQ19GT1JDRV9TVEVSRU8gICAgMQorI2RlZmluZSBFTl9CVFNDX0ZPUkNFX1NBUCAgICAgICAyCisjZGVmaW5lIEVOX0JUU0NfQVVUT19TVEVSRU8gICAgIDMKKyNkZWZpbmUgRU5fQlRTQ19BVVRPX1NBUCAgICAgICAgNAorCisjZGVmaW5lIEVOX0EyX0ZPUkNFX01PTk8xICAgICAgIDgKKyNkZWZpbmUgRU5fQTJfRk9SQ0VfTU9OTzIgICAgICAgOQorI2RlZmluZSBFTl9BMl9GT1JDRV9TVEVSRU8gICAgICAxMAorI2RlZmluZSBFTl9BMl9BVVRPX01PTk8yICAgICAgICAxMQorI2RlZmluZSBFTl9BMl9BVVRPX1NURVJFTyAgICAgICAxMgorCisjZGVmaW5lIEVOX0VJQUpfRk9SQ0VfTU9OTzEgICAgIDE2CisjZGVmaW5lIEVOX0VJQUpfRk9SQ0VfTU9OTzIgICAgIDE3CisjZGVmaW5lIEVOX0VJQUpfRk9SQ0VfU1RFUkVPICAgIDE4CisjZGVmaW5lIEVOX0VJQUpfQVVUT19NT05PMiAgICAgIDE5CisjZGVmaW5lIEVOX0VJQUpfQVVUT19TVEVSRU8gICAgIDIwCisKKyNkZWZpbmUgRU5fTklDQU1fRk9SQ0VfTU9OTzEgICAgMzIKKyNkZWZpbmUgRU5fTklDQU1fRk9SQ0VfTU9OTzIgICAgMzMKKyNkZWZpbmUgRU5fTklDQU1fRk9SQ0VfU1RFUkVPICAgMzQKKyNkZWZpbmUgRU5fTklDQU1fQVVUT19NT05PMiAgICAgMzUKKyNkZWZpbmUgRU5fTklDQU1fQVVUT19TVEVSRU8gICAgMzYKKworI2RlZmluZSBFTl9GTVJBRElPX0ZPUkNFX01PTk8gICAyNAorI2RlZmluZSBFTl9GTVJBRElPX0ZPUkNFX1NURVJFTyAyNQorI2RlZmluZSBFTl9GTVJBRElPX0FVVE9fU1RFUkVPICAyNgorCisjZGVmaW5lIEVOX05JQ0FNX0FVVE9fRkFMTEJBQ0sgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRU5fRk1SQURJT19FTl9SRFMgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBFTl9OSUNBTV9UUllfQUdBSU5fQklUICAweDAwMDAwNDAwCisjZGVmaW5lIEVOX0RBQ19FTkFCTEUgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRU5fSTJTT1VUX0VOQUJMRSAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBFTl9JMlNJTl9TVFIyREFDICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEVOX0kyU0lOX0VOQUJMRSAgICAgICAgIDB4MDAwMDgwMDAKKworI2lmIDAKKy8qIG9sZCAqLworI2RlZmluZSBFTl9ETVRSWF9TVU1ESUZGICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEVOX0RNVFJYX1NVTVIgICAgICAgICAgIDB4MDAwMDA4ODAKKyNkZWZpbmUgRU5fRE1UUlhfTFIgICAgICAgICAgICAgMHgwMDAwMDkwMAorI2RlZmluZSBFTl9ETVRSWF9NT05PICAgICAgICAgICAweDAwMDAwOTgwCisjZWxzZQorLyogZHNjYWxlciBjdnMgKi8KKyNkZWZpbmUgRU5fRE1UUlhfU1VNRElGRiAgICAgICAgKDAgPDwgNykKKyNkZWZpbmUgRU5fRE1UUlhfU1VNUiAgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgRU5fRE1UUlhfTFIgICAgICAgICAgICAgKDIgPDwgNykKKyNkZWZpbmUgRU5fRE1UUlhfTU9OTyAgICAgICAgICAgKDMgPDwgNykKKyNkZWZpbmUgRU5fRE1UUlhfQllQQVNTICAgICAgICAgKDEgPDwgMTEpCisjZW5kaWYKKworLy8gVmlkZW8KKyNkZWZpbmUgVklEX0NBUFRVUkVfQ09OVFJPTAkJMHgzMTAxODAKKworI2RlZmluZSBDWDIzODgwX0NBUF9DVExfQ0FQVFVSRV9WQklfT0REICAoMTw8MykKKyNkZWZpbmUgQ1gyMzg4MF9DQVBfQ1RMX0NBUFRVUkVfVkJJX0VWRU4gKDE8PDIpCisjZGVmaW5lIENYMjM4ODBfQ0FQX0NUTF9DQVBUVVJFX09ERCAgICAgICgxPDwxKQorI2RlZmluZSBDWDIzODgwX0NBUF9DVExfQ0FQVFVSRV9FVkVOICAgICAoMTw8MCkKKworI2RlZmluZSBWaWRlb0lucHV0TXV4MAkJIDB4MAorI2RlZmluZSBWaWRlb0lucHV0TXV4MQkJIDB4MQorI2RlZmluZSBWaWRlb0lucHV0TXV4MgkJIDB4MgorI2RlZmluZSBWaWRlb0lucHV0TXV4MwkJIDB4MworI2RlZmluZSBWaWRlb0lucHV0VHVuZXIJCSAweDAKKyNkZWZpbmUgVmlkZW9JbnB1dENvbXBvc2l0ZQkgMHgxCisjZGVmaW5lIFZpZGVvSW5wdXRTVmlkZW8JIDB4MgorI2RlZmluZSBWaWRlb0lucHV0T3RoZXIJCSAweDMKKworI2RlZmluZSBYdGFsMAkJIDB4MQorI2RlZmluZSBYdGFsMQkJIDB4MgorI2RlZmluZSBYdGFsQXV0bwkgMHgzCisKKyNkZWZpbmUgVmlkZW9Gb3JtYXRBdXRvCQkgMHgwCisjZGVmaW5lIFZpZGVvRm9ybWF0TlRTQwkJIDB4MQorI2RlZmluZSBWaWRlb0Zvcm1hdE5UU0NKYXBhbgkgMHgyCisjZGVmaW5lIFZpZGVvRm9ybWF0TlRTQzQ0MwkgMHgzCisjZGVmaW5lIFZpZGVvRm9ybWF0UEFMCQkgMHg0CisjZGVmaW5lIFZpZGVvRm9ybWF0UEFMQgkJIDB4NAorI2RlZmluZSBWaWRlb0Zvcm1hdFBBTEQJCSAweDQKKyNkZWZpbmUgVmlkZW9Gb3JtYXRQQUxHCQkgMHg0CisjZGVmaW5lIFZpZGVvRm9ybWF0UEFMSAkJIDB4NAorI2RlZmluZSBWaWRlb0Zvcm1hdFBBTEkJCSAweDQKKyNkZWZpbmUgVmlkZW9Gb3JtYXRQQUxCREdISQkgMHg0CisjZGVmaW5lIFZpZGVvRm9ybWF0UEFMTQkJIDB4NQorI2RlZmluZSBWaWRlb0Zvcm1hdFBBTE4JCSAweDYKKyNkZWZpbmUgVmlkZW9Gb3JtYXRQQUxOQwkgMHg3CisjZGVmaW5lIFZpZGVvRm9ybWF0UEFMNjAJIDB4OAorI2RlZmluZSBWaWRlb0Zvcm1hdFNFQ0FNCSAweDkKKworI2RlZmluZSBWaWRlb0Zvcm1hdEF1dG8yN01IegkJIDB4MTAKKyNkZWZpbmUgVmlkZW9Gb3JtYXROVFNDMjdNSHoJCSAweDExCisjZGVmaW5lIFZpZGVvRm9ybWF0TlRTQ0phcGFuMjdNSHoJIDB4MTIKKyNkZWZpbmUgVmlkZW9Gb3JtYXROVFNDNDQzMjdNSHoJCSAweDEzCisjZGVmaW5lIFZpZGVvRm9ybWF0UEFMMjdNSHoJCSAweDE0CisjZGVmaW5lIFZpZGVvRm9ybWF0UEFMQjI3TUh6CQkgMHgxNAorI2RlZmluZSBWaWRlb0Zvcm1hdFBBTEQyN01IegkJIDB4MTQKKyNkZWZpbmUgVmlkZW9Gb3JtYXRQQUxHMjdNSHoJCSAweDE0CisjZGVmaW5lIFZpZGVvRm9ybWF0UEFMSDI3TUh6CQkgMHgxNAorI2RlZmluZSBWaWRlb0Zvcm1hdFBBTEkyN01IegkJIDB4MTQKKyNkZWZpbmUgVmlkZW9Gb3JtYXRQQUxCREdISTI3TUh6CSAweDE0CisjZGVmaW5lIFZpZGVvRm9ybWF0UEFMTTI3TUh6CQkgMHgxNQorI2RlZmluZSBWaWRlb0Zvcm1hdFBBTE4yN01IegkJIDB4MTYKKyNkZWZpbmUgVmlkZW9Gb3JtYXRQQUxOQzI3TUh6CQkgMHgxNworI2RlZmluZSBWaWRlb0Zvcm1hdFBBTDYwMjdNSHoJCSAweDE4CisjZGVmaW5lIFZpZGVvRm9ybWF0U0VDQU0yN01IegkJIDB4MTkKKworI2RlZmluZSBOb21pbmFsVVNFQ0FNCSAweDg3CisjZGVmaW5lIE5vbWluYWxWU0VDQU0JIDB4ODUKKyNkZWZpbmUgTm9taW5hbFVOVFNDCSAweEZFCisjZGVmaW5lIE5vbWluYWxWTlRTQwkgMHhCNAorCisjZGVmaW5lIE5vbWluYWxDb250cmFzdCAgMHhEOAorCisjZGVmaW5lIEhGaWx0ZXJBdXRvRm9ybWF0CSAweDAKKyNkZWZpbmUgSEZpbHRlckNJRgkJIDB4MQorI2RlZmluZSBIRmlsdGVyUUNJRgkJIDB4MgorI2RlZmluZSBIRmlsdGVySUNPTgkJIDB4MworCisjZGVmaW5lIFZGaWx0ZXIyVGFwSW50ZXJwb2xhdGUgIDAKKyNkZWZpbmUgVkZpbHRlcjNUYXBJbnRlcnBvbGF0ZSAgMQorI2RlZmluZSBWRmlsdGVyNFRhcEludGVycG9sYXRlICAyCisjZGVmaW5lIFZGaWx0ZXI1VGFwSW50ZXJwb2xhdGUgIDMKKyNkZWZpbmUgVkZpbHRlcjJUYXBOb0ludGVycG9sYXRlICA0CisjZGVmaW5lIFZGaWx0ZXIzVGFwTm9JbnRlcnBvbGF0ZSAgNQorI2RlZmluZSBWRmlsdGVyNFRhcE5vSW50ZXJwb2xhdGUgIDYKKyNkZWZpbmUgVkZpbHRlcjVUYXBOb0ludGVycG9sYXRlICA3CisKKyNkZWZpbmUgQ29sb3JGb3JtYXRSR0IzMgkgMHgwMDAwCisjZGVmaW5lIENvbG9yRm9ybWF0UkdCMjQJIDB4MDAxMQorI2RlZmluZSBDb2xvckZvcm1hdFJHQjE2CSAweDAwMjIKKyNkZWZpbmUgQ29sb3JGb3JtYXRSR0IxNQkgMHgwMDMzCisjZGVmaW5lIENvbG9yRm9ybWF0WVVZMgkJIDB4MDA0NAorI2RlZmluZSBDb2xvckZvcm1hdEJUWVVWCSAweDAwNTUKKyNkZWZpbmUgQ29sb3JGb3JtYXRZOAkJIDB4MDA2NgorI2RlZmluZSBDb2xvckZvcm1hdFJHQjgJCSAweDAwNzcKKyNkZWZpbmUgQ29sb3JGb3JtYXRQTDQyMgkgMHgwMDg4CisjZGVmaW5lIENvbG9yRm9ybWF0UEw0MTEJIDB4MDA5OQorI2RlZmluZSBDb2xvckZvcm1hdFlVVjEyCSAweDAwQUEKKyNkZWZpbmUgQ29sb3JGb3JtYXRZVVY5CQkgMHgwMEJCCisjZGVmaW5lIENvbG9yRm9ybWF0UkFXCQkgMHgwMEVFCisjZGVmaW5lIENvbG9yRm9ybWF0QlNXQVAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgQ29sb3JGb3JtYXRXU1dBUCAgICAgICAgIDB4MGMwMAorI2RlZmluZSBDb2xvckZvcm1hdEV2ZW5NYXNrICAgICAgMHgwNTBmCisjZGVmaW5lIENvbG9yRm9ybWF0T2RkTWFzayAgICAgICAweDBhZjAKKyNkZWZpbmUgQ29sb3JGb3JtYXRHYW1tYSAgICAgICAgIDB4MTAwMAorCisjZGVmaW5lIEludGVybGFjZWQJCSAweDEKKyNkZWZpbmUgTm9uSW50ZXJsYWNlZAkgCSAweDAKKworI2RlZmluZSBGaWVsZEV2ZW4JCSAweDEKKyNkZWZpbmUgRmllbGRPZGQJCSAweDAKKworI2RlZmluZSBUR1JlYWRXcml0ZU1vZGUJIAkgMHgwCisjZGVmaW5lIFRHRW5hYmxlTW9kZQkgCSAweDEKKworI2RlZmluZSBEVl9DYkFsaWduCQkgMHgwCisjZGVmaW5lIERWX1kwQWxpZ24JCSAweDEKKyNkZWZpbmUgRFZfQ3JBbGlnbgkJIDB4MgorI2RlZmluZSBEVl9ZMUFsaWduCQkgMHgzCisKKyNkZWZpbmUgRFZGX0FuYWxvZwkJIDB4MAorI2RlZmluZSBEVkZfQ0NJUjY1NgkJIDB4MQorI2RlZmluZSBEVkZfQnl0ZVN0cmVhbQkJIDB4MgorI2RlZmluZSBEVkZfRXh0VlNZTkMJCSAweDQKKyNkZWZpbmUgRFZGX0V4dEZpZWxkCQkgMHg1CisKKyNkZWZpbmUgQ0hBTk5FTF9WSURfWQkJIDB4MQorI2RlZmluZSBDSEFOTkVMX1ZJRF9VCQkgMHgyCisjZGVmaW5lIENIQU5ORUxfVklEX1YJCSAweDMKKyNkZWZpbmUgQ0hBTk5FTF9WSURfVkJJCQkgMHg0CisjZGVmaW5lIENIQU5ORUxfQVVEX0ROCQkgMHg1CisjZGVmaW5lIENIQU5ORUxfQVVEX1VQCQkgMHg2CisjZGVmaW5lIENIQU5ORUxfQVVEX1JEU19ETgkgMHg3CisjZGVmaW5lIENIQU5ORUxfTVBFR19ETgkJIDB4OAorI2RlZmluZSBDSEFOTkVMX1ZJUF9ETgkJIDB4OQorI2RlZmluZSBDSEFOTkVMX1ZJUF9VUAkJIDB4QQorI2RlZmluZSBDSEFOTkVMX0hPU1RfRE4JCSAweEIKKyNkZWZpbmUgQ0hBTk5FTF9IT1NUX1VQCQkgMHhDCisjZGVmaW5lIENIQU5ORUxfRklSU1QJCSAweDEKKyNkZWZpbmUgQ0hBTk5FTF9MQVNUCQkgMHhDCisKKyNkZWZpbmUgR1BfQ09VTlRfQ09OVFJPTF9OT05FCQkgMHgwCisjZGVmaW5lIEdQX0NPVU5UX0NPTlRST0xfSU5DCQkgMHgxCisjZGVmaW5lIEdQX0NPVU5UX0NPTlRST0xfUkVTRVJWRUQJIDB4MgorI2RlZmluZSBHUF9DT1VOVF9DT05UUk9MX1JFU0VUCQkgMHgzCisKKyNkZWZpbmUgUExMX1BSRVNDQUxFX0JZXzIgIDIKKyNkZWZpbmUgUExMX1BSRVNDQUxFX0JZXzMgIDMKKyNkZWZpbmUgUExMX1BSRVNDQUxFX0JZXzQgIDQKKyNkZWZpbmUgUExMX1BSRVNDQUxFX0JZXzUgIDUKKworI2RlZmluZSBITE5vdGNoRmlsdGVyNHhGc2MJIDAKKyNkZWZpbmUgSExOb3RjaEZpbHRlclNxdWFyZQkgMQorI2RlZmluZSBITE5vdGNoRmlsdGVyMTM1TlRTQwkgMgorI2RlZmluZSBITE5vdGNoRmlsdGVyMTM1UEFMCSAzCisKKyNkZWZpbmUgTlRTQ184eF9TVUJfQ0FSUklFUiAgMjguNjM2MzZFNgorI2RlZmluZSBQQUxfOHhfU1VCX0NBUlJJRVIgIDM1LjQ2ODk1RTYKKworLy8gRGVmYXVsdCBhbmFsb2cgc2V0dGluZ3MKKyNkZWZpbmUgREVGQVVMVF9IVUVfTlRTQwkJCTB4MDAKKyNkZWZpbmUgREVGQVVMVF9CUklHSFRORVNTX05UU0MJCQkweDAwCisjZGVmaW5lIERFRkFVTFRfQ09OVFJBU1RfTlRTQwkJCTB4MzkKKyNkZWZpbmUgREVGQVVMVF9TQVRfVV9OVFNDCQkJMHg3RgorI2RlZmluZSBERUZBVUxUX1NBVF9WX05UU0MJCQkweDVBCisKK3R5cGVkZWYgZW51bQoreworCVNPVVJDRV9UVU5FUiA9IDAsCisJU09VUkNFX0NPTVBPU0lURSwKKwlTT1VSQ0VfU1ZJREVPLAorCVNPVVJDRV9PVEhFUjEsCisJU09VUkNFX09USEVSMiwKKwlTT1VSQ0VfQ09NUFZJQVNWSURFTywKKwlTT1VSQ0VfQ0NJUjY1NgorfSBWSURFT1NPVVJDRVRZUEU7CisKKyNlbmRpZiAvKiBfQ1g4OF9SRUdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmE5NDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCkBAIC0wLDAgKzEsMTAzMiBAQAorLyoKKyAgICAkSWQ6IGN4ODgtdHZhdWRpby5jLHYgMS4zNCAyMDA1LzAzLzA3IDE2OjEwOjUxIGtyYXhlbCBFeHAgJAorCisgICAgY3g4OHgtYXVkaW8uYyAtIENvbmV4YW50IENYMjM4ODAvMjM4ODEgYXVkaW8gZG93bnN0cmVhbSBkcml2ZXIgZHJpdmVyCisKKyAgICAgKGMpIDIwMDEgTWljaGFlbCBFc2tpbiwgVG9tIFpha3JhanNlayBbV2luZG93cyB2ZXJzaW9uXQorICAgICAoYykgMjAwMiBZdXJpaiBTeXNvZXYgPHl1cmlqQG5hdHVyZXNvZnQubmV0PgorICAgICAoYykgMjAwMyBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+CisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTG90IG9mIHZvb2RvbyBoZXJlLiAgRXZlbiB0aGUgZGF0YSBzaGVldCBkb2Vzbid0IGhlbHAgdG8KKyAgICB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24gaGVyZSwgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBhdWRpbworICAgIHBhcnQgb2YgdGhlIGN4MjM4OHggY2hpcCBpcyAqdmVyeSogYmFkLgorCisgICAgU29tZSBvZiB0aGlzIGNvbWVzIGZyb20gcGFydHkgZG9uZSBsaW51eCBkcml2ZXIgc291cmNlcyBJIGdvdCBmcm9tCisgICAgW3VuZG9jdW1lbnRlZF0uCisKKyAgICBTb21lIGNvbWVzIGZyb20gdGhlIGRzY2FsZXIgc291cmNlcywgb25lIG9mIHRoZSBkc2NhbGVyIGRyaXZlciBndXkgd29ya3MKKyAgICBmb3IgQ29uZXhhbnQgLi4uCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorCisjaW5jbHVkZSAiY3g4OC5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvX2RlYnVnID0gMDsKK21vZHVsZV9wYXJhbShhdWRpb19kZWJ1ZyxpbnQsMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1ZGlvX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2F1ZGlvXSIpOworCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pCWlmIChhdWRpb19kZWJ1ZykgXAorCXByaW50ayhLRVJOX0RFQlVHICIlcy8wOiAiIGZtdCwgY29yZS0+bmFtZSAsICMjIGFyZykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNoYXIgKmF1ZF9jdGxfbmFtZXNbNjRdID0KK3sKKwlbIEVOX0JUU0NfRk9SQ0VfTU9OTyAgICAgICBdID0gIkJUU0NfRk9SQ0VfTU9OTyIsCisJWyBFTl9CVFNDX0ZPUkNFX1NURVJFTyAgICAgXSA9ICJCVFNDX0ZPUkNFX1NURVJFTyIsCisJWyBFTl9CVFNDX0ZPUkNFX1NBUCAgICAgICAgXSA9ICJCVFNDX0ZPUkNFX1NBUCIsCisJWyBFTl9CVFNDX0FVVE9fU1RFUkVPICAgICAgXSA9ICJCVFNDX0FVVE9fU1RFUkVPIiwKKwlbIEVOX0JUU0NfQVVUT19TQVAgICAgICAgICBdID0gIkJUU0NfQVVUT19TQVAiLAorCVsgRU5fQTJfRk9SQ0VfTU9OTzEgICAgICAgIF0gPSAiQTJfRk9SQ0VfTU9OTzEiLAorCVsgRU5fQTJfRk9SQ0VfTU9OTzIgICAgICAgIF0gPSAiQTJfRk9SQ0VfTU9OTzIiLAorCVsgRU5fQTJfRk9SQ0VfU1RFUkVPICAgICAgIF0gPSAiQTJfRk9SQ0VfU1RFUkVPIiwKKwlbIEVOX0EyX0FVVE9fTU9OTzIgICAgICAgICBdID0gIkEyX0FVVE9fTU9OTzIiLAorCVsgRU5fQTJfQVVUT19TVEVSRU8gICAgICAgIF0gPSAiQTJfQVVUT19TVEVSRU8iLAorCVsgRU5fRUlBSl9GT1JDRV9NT05PMSAgICAgIF0gPSAiRUlBSl9GT1JDRV9NT05PMSIsCisJWyBFTl9FSUFKX0ZPUkNFX01PTk8yICAgICAgXSA9ICJFSUFKX0ZPUkNFX01PTk8yIiwKKwlbIEVOX0VJQUpfRk9SQ0VfU1RFUkVPICAgICBdID0gIkVJQUpfRk9SQ0VfU1RFUkVPIiwKKwlbIEVOX0VJQUpfQVVUT19NT05PMiAgICAgICBdID0gIkVJQUpfQVVUT19NT05PMiIsCisJWyBFTl9FSUFKX0FVVE9fU1RFUkVPICAgICAgXSA9ICJFSUFKX0FVVE9fU1RFUkVPIiwKKwlbIEVOX05JQ0FNX0ZPUkNFX01PTk8xICAgICBdID0gIk5JQ0FNX0ZPUkNFX01PTk8xIiwKKwlbIEVOX05JQ0FNX0ZPUkNFX01PTk8yICAgICBdID0gIk5JQ0FNX0ZPUkNFX01PTk8yIiwKKwlbIEVOX05JQ0FNX0ZPUkNFX1NURVJFTyAgICBdID0gIk5JQ0FNX0ZPUkNFX1NURVJFTyIsCisJWyBFTl9OSUNBTV9BVVRPX01PTk8yICAgICAgXSA9ICJOSUNBTV9BVVRPX01PTk8yIiwKKwlbIEVOX05JQ0FNX0FVVE9fU1RFUkVPICAgICBdID0gIk5JQ0FNX0FVVE9fU1RFUkVPIiwKKwlbIEVOX0ZNUkFESU9fRk9SQ0VfTU9OTyAgICBdID0gIkZNUkFESU9fRk9SQ0VfTU9OTyIsCisJWyBFTl9GTVJBRElPX0ZPUkNFX1NURVJFTyAgXSA9ICJGTVJBRElPX0ZPUkNFX1NURVJFTyIsCisJWyBFTl9GTVJBRElPX0FVVE9fU1RFUkVPICAgXSA9ICJGTVJBRElPX0FVVE9fU1RFUkVPIiwKK307CisKK3N0cnVjdCBybGlzdCB7CisJdTMyIHJlZzsKKwl1MzIgdmFsOworfTsKKworc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3JlZ2lzdGVycyhzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLAorCQkJCWNvbnN0IHN0cnVjdCBybGlzdCAqbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGxbaV0ucmVnOyBpKyspIHsKKwkJc3dpdGNoIChsW2ldLnJlZykgeworCQljYXNlIEFVRF9QREZfRERTX0NOU1RfQllURTI6CisJCWNhc2UgQVVEX1BERl9ERFNfQ05TVF9CWVRFMToKKwkJY2FzZSBBVURfUERGX0REU19DTlNUX0JZVEUwOgorCQljYXNlIEFVRF9RQU1fTU9ERToKKwkJY2FzZSBBVURfUEhBQ0NfRlJFUV84TVNCOgorCQljYXNlIEFVRF9QSEFDQ19GUkVRXzhMU0I6CisJCQljeF93cml0ZWIobFtpXS5yZWcsIGxbaV0udmFsKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY3hfd3JpdGUobFtpXS5yZWcsIGxbaV0udmFsKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhcnQoc3RydWN0IGN4ODhfY29yZSAqY29yZSwKKwkJCSAgICB1MzIgbW9kZSwgdTMyIGN0bCkKK3sKKwkvLyBtdXRlCisJY3hfd3JpdGUoQVVEX1ZPTF9DVEwsICAgICAgICgxIDw8IDYpKTsKKworCS8vICBpbmNyZWFzZSBsZXZlbCBvZiBpbnB1dCBieSAxMmRCCisJY3hfd3JpdGUoQVVEX0FGRV8xMkRCX0VOLCAgIDB4MDAwMSk7CisKKwkvLyBzdGFydCBwcm9ncmFtbWluZworCWN4X3dyaXRlKEFVRF9DVEwsICAgICAgICAgICAweDAwMDApOworCWN4X3dyaXRlKEFVRF9JTklULCAgICAgICAgICBtb2RlKTsKKwljeF93cml0ZShBVURfSU5JVF9MRCwgICAgICAgMHgwMDAxKTsKKwljeF93cml0ZShBVURfU09GVF9SRVNFVCwgICAgMHgwMDAxKTsKKworCWN4X3dyaXRlKEFVRF9DVEwsICAgICAgICAgICBjdGwpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYXVkaW9fZmluaXNoKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpCit7CisJdTMyIHZvbHVtZTsKKworCWlmIChjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0uYmxhY2tiaXJkKSB7CisJCS8vICdwYXNzLXRocnUgbW9kZSc6IHRoaXMgZW5hYmxlcyB0aGUgaTJzIG91dHB1dCB0byB0aGUgbXBlZyBlbmNvZGVyCisJCWN4X3NldChBVURfQ1RMLCAweDIwMDApOworCQljeF93cml0ZShBVURfSTJTT1VUUFVUQ05UTCwgMSk7CisJCS8vY3hfd3JpdGUoQVVEX0FQQl9JTl9SQVRFX0FESiwgMCk7CisJfQorCisJLy8gZmluaXNoIHByb2dyYW1taW5nCisJY3hfd3JpdGUoQVVEX1NPRlRfUkVTRVQsIDB4MDAwMCk7CisKKwkvLyBzdGFydCBhdWRpbyBwcm9jZXNzaW5nCisJY3hfc2V0KEFVRF9DVEwsIEVOX0RBQ19FTkFCTEUpOworCisJLy8gdW5tdXRlCisJdm9sdW1lID0gY3hfc3JlYWQoU0hBRE9XX0FVRF9WT0xfQ1RMKTsKKwljeF9zd3JpdGUoU0hBRE9XX0FVRF9WT0xfQ1RMLCBBVURfVk9MX0NUTCwgdm9sdW1lKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3N0YW5kYXJkX0JUU0Moc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdW5zaWduZWQgaW50IHNhcCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IGJ0c2NbXSA9IHsKKwkJLyogZnJvbSBkc2NhbGVyICovCisJCXsgQVVEX09VVDFfU0VMLCAgICAgICAgICAgICAgICAweDAwMDAwMDEzIH0sCisJCXsgQVVEX09VVDFfU0hJRlQsICAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCisJCXsgQVVEX1BPTFkwX0REU19DT05TVEFOVCwgICAgICAweDAwMTIwMTBjIH0sCisJCXsgQVVEX0RNRF9SQV9ERFMsICAgICAgICAgICAgICAweDAwYzNlN2FhIH0sCisJCXsgQVVEX0RCWF9JTl9HQUlOLCAgICAgICAgICAgICAweDAwMDA0NzM0IH0sCisJCXsgQVVEX0RCWF9XQkVfR0FJTiwgICAgICAgICAgICAweDAwMDA0NjQwIH0sCisJCXsgQVVEX0RCWF9TRV9HQUlOLCAgICAgICAgICAgICAweDAwMDA4ZDMxIH0sCisJCXsgQVVEX0RDT0NfMF9TUkMsICAgICAgICAgICAgICAweDAwMDAwMDFhIH0sCisJCXsgQVVEX0lJUjFfNF9TRUwsICAgICAgICAgICAgICAweDAwMDAwMDIxIH0sCisJCXsgQVVEX0RDT0NfUEFTU19JTiwgICAgICAgICAgICAweDAwMDAwMDAzIH0sCisJCXsgQVVEX0RDT0NfMF9TSElGVF9JTjAsICAgICAgICAweDAwMDAwMDBhIH0sCisJCXsgQVVEX0RDT0NfMF9TSElGVF9JTjEsICAgICAgICAweDAwMDAwMDA4IH0sCisJCXsgQVVEX0RDT0NfMV9TSElGVF9JTjAsICAgICAgICAweDAwMDAwMDBhIH0sCisJCXsgQVVEX0RDT0NfMV9TSElGVF9JTjEsICAgICAgICAweDAwMDAwMDA4IH0sCisJCXsgQVVEX0ROMF9GUkVRLCAgICAgICAgICAgICAgICAweDAwMDAyODNiIH0sCisJCXsgQVVEX0ROMl9TUkNfU0VMLCAgICAgICAgICAgICAweDAwMDAwMDA4IH0sCisJCXsgQVVEX0ROMl9GUkVRLCAgICAgICAgICAgICAgICAweDAwMDAzMDAwIH0sCisJCXsgQVVEX0ROMl9BRkMsICAgICAgICAgICAgICAgICAweDAwMDAwMDAyIH0sCisJCXsgQVVEX0ROMl9TSEZULCAgICAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCisJCXsgQVVEX0lJUjJfMl9TRUwsICAgICAgICAgICAgICAweDAwMDAwMDIwIH0sCisJCXsgQVVEX0lJUjJfMl9TSElGVCwgICAgICAgICAgICAweDAwMDAwMDAwIH0sCisJCXsgQVVEX0lJUjJfM19TRUwsICAgICAgICAgICAgICAweDAwMDAwMDFmIH0sCisJCXsgQVVEX0lJUjJfM19TSElGVCwgICAgICAgICAgICAweDAwMDAwMDAwIH0sCisJCXsgQVVEX0NSREMxX1NSQ19TRUwsICAgICAgICAgICAweDAwMDAwM2NlIH0sCisJCXsgQVVEX0NSREMxX1NISUZULCAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCisJCXsgQVVEX0NPUkRJQ19TSElGVF8xLCAgICAgICAgICAweDAwMDAwMDA3IH0sCisJCXsgQVVEX0RDT0NfMV9TUkMsICAgICAgICAgICAgICAweDAwMDAwMDFiIH0sCisJCXsgQVVEX0RDT0MxX1NISUZULCAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCisJCXsgQVVEX1JEU0lfU0VMLCAgICAgICAgICAgICAgICAweDAwMDAwMDA4IH0sCisJCXsgQVVEX1JEU1FfU0VMLCAgICAgICAgICAgICAgICAweDAwMDAwMDA4IH0sCisJCXsgQVVEX1JEU0lfU0hJRlQsICAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCisJCXsgQVVEX1JEU1FfU0hJRlQsICAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCisJCXsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsICAgICAgICAweDAwMDAwMDAzIH0sCisgICAgICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBidHNjX3NhcFtdID0geworCQl7IEFVRF9EQlhfSU5fR0FJTiwgICAgICAgICAgICAgMHgwMDAwNzIwMCB9LAorCQl7IEFVRF9EQlhfV0JFX0dBSU4sICAgICAgICAgICAgMHgwMDAwNjIwMCB9LAorCQl7IEFVRF9EQlhfU0VfR0FJTiwgICAgICAgICAgICAgMHgwMDAwNjIwMCB9LAorCQl7IEFVRF9JSVIxXzFfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9JSVIxXzNfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAwMSB9LAorCQl7IEFVRF9ETjFfU1JDX1NFTCwgICAgICAgICAgICAgMHgwMDAwMDAwNyB9LAorCQl7IEFVRF9JSVIxXzRfU0hJRlQsICAgICAgICAgICAgMHgwMDAwMDAwNiB9LAorCQl7IEFVRF9JSVIyXzFfU0hJRlQsICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9JSVIyXzJfU0hJRlQsICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9JSVIzXzBfU0hJRlQsICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9JSVIzXzFfU0hJRlQsICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9JSVIzXzBfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAwZCB9LAorCQl7IEFVRF9JSVIzXzFfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAwZSB9LAorCQl7IEFVRF9ERUVNUEgxX1NSQ19TRUwsICAgICAgICAgMHgwMDAwMDAxNCB9LAorCQl7IEFVRF9ERUVNUEgxX1NISUZULCAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9ERUVNUEgxX0cwLCAgICAgICAgICAgICAgMHgwMDAwNDAwMCB9LAorCQl7IEFVRF9ERUVNUEgxX0EwLCAgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9ERUVNUEgxX0IwLCAgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9ERUVNUEgxX0ExLCAgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9ERUVNUEgxX0IxLCAgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9PVVQwX1NFTCwgICAgICAgICAgICAgICAgMHgwMDAwMDAzZiB9LAorCQl7IEFVRF9PVVQxX1NFTCwgICAgICAgICAgICAgICAgMHgwMDAwMDAzZiB9LAorCQl7IEFVRF9ETjFfQUZDLCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiB9LAorCQl7IEFVRF9EQ09DXzBfU0hJRlRfSU4wLCAgICAgICAgMHgwMDAwMDAwYSB9LAorCQl7IEFVRF9EQ09DXzBfU0hJRlRfSU4xLCAgICAgICAgMHgwMDAwMDAwOCB9LAorCQl7IEFVRF9EQ09DXzFfU0hJRlRfSU4wLCAgICAgICAgMHgwMDAwMDAwYSB9LAorCQl7IEFVRF9EQ09DXzFfU0hJRlRfSU4xLCAgICAgICAgMHgwMDAwMDAwOCB9LAorCQl7IEFVRF9JSVIxXzBfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAxZCB9LAorCQl7IEFVRF9JSVIxXzJfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAxZSB9LAorCQl7IEFVRF9JSVIyXzFfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAwMiB9LAorCQl7IEFVRF9JSVIyXzJfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAwNCB9LAorCQl7IEFVRF9JSVIzXzJfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAwZiB9LAorCQl7IEFVRF9EQ09DMl9TSElGVCwgICAgICAgICAgICAgMHgwMDAwMDAwMSB9LAorCQl7IEFVRF9JSVIzXzJfU0hJRlQsICAgICAgICAgICAgMHgwMDAwMDAwMSB9LAorCQl7IEFVRF9ERUVNUEgwX1NSQ19TRUwsICAgICAgICAgMHgwMDAwMDAxNCB9LAorCQl7IEFVRF9DT1JESUNfU0hJRlRfMSwgICAgICAgICAgMHgwMDAwMDAwNiB9LAorCQl7IEFVRF9QT0xZMF9ERFNfQ09OU1RBTlQsICAgICAgMHgwMDBlNGRiMiB9LAorCQl7IEFVRF9ETURfUkFfRERTLCAgICAgICAgICAgICAgMHgwMGY2OTZlNiB9LAorCQl7IEFVRF9JSVIyXzNfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAyNSB9LAorCQl7IEFVRF9JSVIxXzRfU0VMLCAgICAgICAgICAgICAgMHgwMDAwMDAyMSB9LAorCQl7IEFVRF9ETjFfRlJFUSwgICAgICAgICAgICAgICAgMHgwMDAwYzk2NSB9LAorCQl7IEFVRF9EQ09DX1BBU1NfSU4sICAgICAgICAgICAgMHgwMDAwMDAwMyB9LAorCQl7IEFVRF9EQ09DXzBfU1JDLCAgICAgICAgICAgICAgMHgwMDAwMDAxYSB9LAorCQl7IEFVRF9EQ09DXzFfU1JDLCAgICAgICAgICAgICAgMHgwMDAwMDAxYiB9LAorCQl7IEFVRF9EQ09DMV9TSElGVCwgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9SRFNJX1NFTCwgICAgICAgICAgICAgICAgMHgwMDAwMDAwOSB9LAorCQl7IEFVRF9SRFNRX1NFTCwgICAgICAgICAgICAgICAgMHgwMDAwMDAwOSB9LAorCQl7IEFVRF9SRFNJX1NISUZULCAgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9SRFNRX1NISUZULCAgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAgICAgICAgMHgwMDAwMDAwMyB9LAorICAgICAgICAgICAgICAgIHsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwl9OworCisJLy8gZHNjYWxlcjogZXhhY3RseSB0YWtlbiBmcm9tIGRyaXZlciwKKwkvLyBkc2NhbGVyOiBkb24ndCBrbm93IHdoeSB0byBzZXQgRU5fRk1SQURJT19FTl9SRFMKKwlpZiAoc2FwKSB7CisJCWRwcmludGsoIiVzIFNBUCAoc3RhdHVzOiB1bmtub3duKVxuIixfX0ZVTkNUSU9OX18pOworCQlzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDAxLAorCQkJCUVOX0ZNUkFESU9fRU5fUkRTIHwgRU5fQlRTQ19GT1JDRV9TQVApOworCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGJ0c2Nfc2FwKTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKCIlcyAoc3RhdHVzOiBrbm93bi1nb29kKVxuIixfX0ZVTkNUSU9OX18pOworCQlzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDAxLAorCQkJCUVOX0ZNUkFESU9fRU5fUkRTIHwgRU5fQlRTQ19BVVRPX1NURVJFTyk7CisJCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgYnRzYyk7CisJfQorCXNldF9hdWRpb19maW5pc2goY29yZSk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfTklDQU0oc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IG5pY2FtX2NvbW1vbltdID0geworCQkvKiBmcm9tIGRzY2FsZXIgKi8KKyAgICAJCXsgQVVEX1JBVEVfQURKMSwgICAgICAgICAgIDB4MDAwMDAwMTAgfSwKKyAgICAJCXsgQVVEX1JBVEVfQURKMiwgICAgICAgICAgIDB4MDAwMDAwNDAgfSwKKyAgICAJCXsgQVVEX1JBVEVfQURKMywgICAgICAgICAgIDB4MDAwMDAxMDAgfSwKKyAgICAJCXsgQVVEX1JBVEVfQURKNCwgICAgICAgICAgIDB4MDAwMDA0MDAgfSwKKyAgICAJCXsgQVVEX1JBVEVfQURKNSwgICAgICAgICAgIDB4MDAwMDEwMDAgfSwKKyAgICAvLwkJeyBBVURfRE1EX1JBX0REUywgICAgICAgICAgMHgwMGMwZDVjZSB9LAorCisJCS8vIERlZW1waGFzaXMgMToKKwkJeyBBVURfREVFTVBIR0FJTl9SLCAgICAgICAgMHgwMDAwMjNjMiB9LAorCQl7IEFVRF9ERUVNUEhOVU1FUjFfUiwgICAgICAweDAwMDJhN2JjIH0sCisJCXsgQVVEX0RFRU1QSE5VTUVSMl9SLCAgICAgIDB4MDAwMzAyM2UgfSwKKwkJeyBBVURfREVFTVBIREVOT00xX1IsICAgICAgMHgwMDAwZjNkMCB9LAorCQl7IEFVRF9ERUVNUEhERU5PTTJfUiwgICAgICAweDAwMDAwMDAwIH0sCisKKyNpZiAwCisJCS8vIERlZW1waGFzaXMgMjogKG90aGVyIHR2IG5vcm0/KQorCQl7IEFVRF9ERUVNUEhHQUlOX1IsICAgICAgICAweDAwMDBjNjAwIH0sCisJCXsgQVVEX0RFRU1QSE5VTUVSMV9SLCAgICAgIDB4MDAwNjY3MzggfSwKKwkJeyBBVURfREVFTVBITlVNRVIyX1IsICAgICAgMHgwMDA2NjczOSB9LAorCQl7IEFVRF9ERUVNUEhERU5PTTFfUiwgICAgICAweDAwMDFlODhjIH0sCisJCXsgQVVEX0RFRU1QSERFTk9NMl9SLCAgICAgIDB4MDAwMWU4OGMgfSwKKyNlbmRpZgorCisJCXsgQVVEX0RFRU1QSERFTk9NMl9SLCAgICAgIDB4MDAwMDAwMDAgfSwKKwkJeyBBVURfRVJSTE9HUEVSSU9EX1IsICAgICAgMHgwMDAwMGZmZiB9LAorCQl7IEFVRF9FUlJJTlRSUFRUSFNITEQxX1IsICAweDAwMDAwM2ZmIH0sCisJCXsgQVVEX0VSUklOVFJQVFRIU0hMRDJfUiwgIDB4MDAwMDAwZmYgfSwKKwkJeyBBVURfRVJSSU5UUlBUVEhTSExEM19SLCAgMHgwMDAwMDAzZiB9LAorCQl7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAgICAweDAwMDAwMDAzIH0sCisKKwkJLy8gc2V0dXAgUUFNIHJlZ2lzdGVycworCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTIsICAweDA2IH0sCisJCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgIDB4ODIgfSwKKwkJeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAgMHgxNiB9LAorCQl7IEFVRF9RQU1fTU9ERSwgICAgICAgICAgICAweDA1IH0sCisKKyAgICAgICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCisgICAgICAgIH07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBuaWNhbV9wYWxfaVtdID0geworCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTAsICAweDEyIH0sCisJCXsgQVVEX1BIQUNDX0ZSRVFfOE1TQiwgICAgIDB4M2EgfSwKKwkJeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAgMHg5MyB9LAorCisgICAgICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBuaWNhbV9kZWZhdWx0W10gPSB7CisJCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgIDB4MTYgfSwKKwkJeyBBVURfUEhBQ0NfRlJFUV84TVNCLCAgICAgMHgzNCB9LAorCQl7IEFVRF9QSEFDQ19GUkVRXzhMU0IsICAgICAweDRjIH0sCisKKyAgICAgICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCisJfTsKKworICAgICAgICBzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDEwLAorCQkJRU5fRE1UUlhfTFIgfCBFTl9ETVRSWF9CWVBBU1MgfCBFTl9OSUNBTV9BVVRPX1NURVJFTyk7CisgICAgICAgIHNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fY29tbW9uKTsKKwlzd2l0Y2ggKGNvcmUtPnR2YXVkaW8pIHsKKwljYXNlIFdXX05JQ0FNX0k6CisJCWRwcmludGsoIiVzIFBBTC1JIE5JQ0FNIChzdGF0dXM6IHVua25vd24pXG4iLF9fRlVOQ1RJT05fXyk7CisJCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fcGFsX2kpOworCQlicmVhazsKKwljYXNlIFdXX05JQ0FNX0JHREtMOgorCQlkcHJpbnRrKCIlcyBQQUwtQkdESyBOSUNBTSAoc3RhdHVzOiB1bmtub3duKVxuIixfX0ZVTkNUSU9OX18pOworCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIG5pY2FtX2RlZmF1bHQpOworCQlicmVhazsKKwl9OworICAgICAgICBzZXRfYXVkaW9fZmluaXNoKGNvcmUpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9OSUNBTV9MKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIGludCBzdGVyZW8pCit7CisgICAgICAgIC8qIFRoaXMgaXMgcHJvYmFibHkgd2VpcmQuLgorICAgICAgICAgKiBMZXQncyBvcGVyYXRlIGFuZCBmaW5kIG91dC4gKi8KKworICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IG5pY2FtX2xfbW9ub1tdID0geworICAgICAgICAgICAgICAgIHsgQVVEX0VSUkxPR1BFUklPRF9SLCAgICAgMHgwMDAwMDA2NCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDFfUiwgMHgwMDAwMEZGRiB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDJfUiwgMHgwMDAwMDAxRiB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgMHgwMDAwMDAwRiB9LAorCisgICAgICAgICAgICAgICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUyLCAweDQ4IH0sCisgICAgICAgICAgICAgICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUxLCAweDNEIH0sCisgICAgICAgICAgICAgICAgeyBBVURfUUFNX01PREUsICAgICAgICAgICAweDAwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAweGY1IH0sCisgICAgICAgICAgICAgICAgeyBBVURfUEhBQ0NfRlJFUV84TVNCLCAgICAweDNhIH0sCisgICAgICAgICAgICAgICAgeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAweDRhIH0sCisKKyAgICAgICAgICAgICAgICB7IEFVRF9ERUVNUEhHQUlOX1IsIDB4NjY4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSE5VTUVSMV9SLCAweDM1M0RFIH0sCisgICAgICAgICAgICAgICAgeyBBVURfREVFTVBITlVNRVIyX1IsIDB4MUIxIH0sCisgICAgICAgICAgICAgICAgeyBBVURfREVFTVBIREVOT00xX1IsIDB4MEYzRDAgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9ERUVNUEhERU5PTTJfUiwgMHgwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfRk1fTU9ERV9FTkFCTEUsIDB4NyB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsIDB4MyB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0FGRV8xMkRCX0VOLCAweDEgfSwKKyAgICAgICAgICAgICAgICB7IEFBR0NfR0FJTiwgMHgwIH0sCisgICAgICAgICAgICAgICAgeyBBQUdDX0hZU1QsIDB4MTggfSwKKyAgICAgICAgICAgICAgICB7IEFBR0NfREVGLCAweDIwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfRE4wX0ZSRVEsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1BPTFkwX0REU19DT05TVEFOVCwgMHgwRTREQjIgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9EQ09DXzBfU1JDLCAweDIxIH0sCisgICAgICAgICAgICAgICAgeyBBVURfSUlSMV8wX1NFTCwgMHgwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfSUlSMV8wX1NISUZULCAweDcgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9JSVIxXzFfU0VMLCAweDIgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9JSVIxXzFfU0hJRlQsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RDT0NfMV9TUkMsIDB4MyB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RDT0MxX1NISUZULCAweDAgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9EQ09DX1BBU1NfSU4sIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0lJUjFfMl9TRUwsIDB4MjMgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9JSVIxXzJfU0hJRlQsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0lJUjFfM19TRUwsIDB4NCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0lJUjFfM19TSElGVCwgMHg3IH0sCisgICAgICAgICAgICAgICAgeyBBVURfSUlSMV80X1NFTCwgMHg1IH0sCisgICAgICAgICAgICAgICAgeyBBVURfSUlSMV80X1NISUZULCAweDcgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9JSVIzXzBfU0VMLCAweDcgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9JSVIzXzBfU0hJRlQsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfU1JDX1NFTCwgMHgxMSB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfU0hJRlQsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfRzAsIDB4NzAwMCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfQTAsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfQjAsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfQTEsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfQjEsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfU1JDX1NFTCwgMHgxMSB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfU0hJRlQsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfRzAsIDB4NzAwMCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfQTAsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfQjAsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfQTEsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfQjEsIDB4MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX09VVDBfU0VMLCAweDNGIH0sCisgICAgICAgICAgICAgICAgeyBBVURfT1VUMV9TRUwsIDB4M0YgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9ETURfUkFfRERTLCAweDBGNUMyODUgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9QTExfSU5ULCAweDFFIH0sCisgICAgICAgICAgICAgICAgeyBBVURfUExMX0REUywgMHgwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfUExMX0ZSQUMsIDB4MEU1NDIgfSwKKworICAgICAgICAgICAgICAgIC8vIHNldHVwIFFBTSByZWdpc3RlcnMKKyAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjEsICAgICAgMHgwMDAwMDEwMCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKMiwgICAgICAweDAwMDAwMjAwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfUkFURV9BREozLCAgICAgIDB4MDAwMDAzMDAgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjQsICAgICAgMHgwMDAwMDQwMCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKNSwgICAgICAweDAwMDAwNTAwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfUkFURV9USFJFU19ETUQsIDB4MDAwMDAwQzAgfSwKKyAgICAgICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBuaWNhbV9sW10gPSB7CisgICAgICAgICAgICAgICAgLy8gc2V0dXAgUUFNIHJlZ2lzdGVycworICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKMSwgMHgwMDAwMDA2MCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKMiwgMHgwMDAwMDBGOSB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKMywgMHgwMDAwMDFDQyB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKNCwgMHgwMDAwMDJCMyB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKNSwgMHgwMDAwMDcyNiB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSERFTk9NMV9SLCAweDAwMDBGM0QwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfREVFTVBIREVOT00yX1IsIDB4MDAwMDAwMDAgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9FUlJMT0dQRVJJT0RfUiwgMHgwMDAwMDA2NCB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDFfUiwgMHgwMDAwMEZGRiB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDJfUiwgMHgwMDAwMDAxRiB9LAorICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgMHgwMDAwMDAwRiB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsIDB4MDAwMDAwMDMgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9ETURfUkFfRERTLCAweDAwQzAwMDAwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfUExMX0lOVCwgMHgwMDAwMDAxRSB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1BMTF9ERFMsIDB4MDAwMDAwMDAgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9QTExfRlJBQywgMHgwMDAwRTU0MiB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1NUQVJUX1RJTUVSLCAweDAwMDAwMDAwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfREVFTVBITlVNRVIxX1IsIDB4MDAwMzUzREUgfSwKKyAgICAgICAgICAgICAgICB7IEFVRF9ERUVNUEhOVU1FUjJfUiwgMHgwMDAwMDFCMSB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMiwgMHgwNiB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgMHg4MiB9LAorICAgICAgICAgICAgICAgIHsgQVVEX1FBTV9NT0RFLCAweDA1IH0sCisgICAgICAgICAgICAgICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAweDEyIH0sCisgICAgICAgICAgICAgICAgeyBBVURfUEhBQ0NfRlJFUV84TVNCLCAweDM0IH0sCisgICAgICAgICAgICAgICAgeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAweDRDIH0sCisgICAgICAgICAgICAgICAgeyBBVURfREVFTVBIR0FJTl9SLCAweDAwMDA2NjgwIH0sCisgICAgICAgICAgICAgICAgeyBBVURfUkFURV9USFJFU19ETUQsIDB4MDAwMDAwQzAgIH0sCisgICAgICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorICAgICAgICB9IDsKKyAgICAgICAgZHByaW50aygiJXMgKHN0YXR1czogZGV2ZWwpLCBzdGVyZW8gOiAlZFxuIixfX0ZVTkNUSU9OX18sc3RlcmVvKTsKKworICAgICAgICBpZiAoIXN0ZXJlbykgeworCQkvKiBBTSBtb25vIHNvdW5kICovCisgICAgICAgICAgICAgICAgc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIDB4MDAwNCwKKwkJCQkweDEwMGMgLyogRklYTUUgYWdhaW4gKi8pOworICAgICAgICAgICAgICAgIHNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fbF9tb25vKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDEwLAorCQkJCTB4MTkyNCAvKiBGSVhNRSBhZ2FpbiAqLyk7CisgICAgICAgICAgICAgICAgc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBuaWNhbV9sKTsKKyAgICAgICAgfQorICAgICAgICBzZXRfYXVkaW9fZmluaXNoKGNvcmUpOworCit9CisKK3N0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9QQUxfSShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCBpbnQgc3RlcmVvKQoreworICAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgcGFsX2lfZm1fbW9ub1tdID0geworICAgICAgICAgICAge0FVRF9FUlJMT0dQRVJJT0RfUiwgICAgICAgMHgwMDAwMDA2NH0sCisgICAgICAgICAgICB7QVVEX0VSUklOVFJQVFRIU0hMRDFfUiwgICAweDAwMDAwZmZmfSwKKyAgICAgICAgICAgIHtBVURfRVJSSU5UUlBUVEhTSExEMl9SLCAgIDB4MDAwMDAwMWZ9LAorICAgICAgICAgICAge0FVRF9FUlJJTlRSUFRUSFNITEQzX1IsICAgMHgwMDAwMDAwZn0sCisgICAgICAgICAgICB7QVVEX1BERl9ERFNfQ05TVF9CWVRFMiwgICAweDA2fSwKKyAgICAgICAgICAgIHtBVURfUERGX0REU19DTlNUX0JZVEUxLCAgIDB4ODJ9LAorICAgICAgICAgICAge0FVRF9QREZfRERTX0NOU1RfQllURTAsICAgMHgxMn0sCisgICAgICAgICAgICB7QVVEX1FBTV9NT0RFLCAgICAgICAgICAgICAweDA1fSwKKyAgICAgICAgICAgIHtBVURfUEhBQ0NfRlJFUV84TVNCLCAgICAgIDB4M2F9LAorICAgICAgICAgICAge0FVRF9QSEFDQ19GUkVRXzhMU0IsICAgICAgMHg5M30sCisgICAgICAgICAgICB7QVVEX0RNRF9SQV9ERFMsICAgICAgICAgICAweDAwMmE0ZjJmfSwKKyAgICAgICAgICAgIHtBVURfUExMX0lOVCwgICAgICAgICAgICAgIDB4MDAwMDAwMWV9LAorICAgICAgICAgICAge0FVRF9QTExfRERTLCAgICAgICAgICAgICAgMHgwMDAwMDAwNH0sCisgICAgICAgICAgICB7QVVEX1BMTF9GUkFDLCAgICAgICAgICAgICAweDAwMDBlNTQyfSwKKyAgICAgICAgICAgIHtBVURfUkFURV9BREoxLCAgICAgICAgICAgIDB4MDAwMDAxMDB9LAorICAgICAgICAgICAge0FVRF9SQVRFX0FESjIsICAgICAgICAgICAgMHgwMDAwMDIwMH0sCisgICAgICAgICAgICB7QVVEX1JBVEVfQURKMywgICAgICAgICAgICAweDAwMDAwMzAwfSwKKyAgICAgICAgICAgIHtBVURfUkFURV9BREo0LCAgICAgICAgICAgIDB4MDAwMDA0MDB9LAorICAgICAgICAgICAge0FVRF9SQVRFX0FESjUsICAgICAgICAgICAgMHgwMDAwMDUwMH0sCisgICAgICAgICAgICB7QVVEX1RIUl9GUiwgICAgICAgICAgICAgICAweDAwMDAwMDAwfSwKKyAgICAgICAgICAgIHtBVURfUElMT1RfQlFEXzFfSzAsICAgICAgIDB4MDAwMDc1NWJ9LAorICAgICAgICAgICAge0FVRF9QSUxPVF9CUURfMV9LMSwgICAgICAgMHgwMDU1MTM0MH0sCisgICAgICAgICAgICB7QVVEX1BJTE9UX0JRRF8xX0syLCAgICAgICAweDAwNmQzMGJlfSwKKyAgICAgICAgICAgIHtBVURfUElMT1RfQlFEXzFfSzMsICAgICAgIDB4ZmZkMzk0YWZ9LAorICAgICAgICAgICAge0FVRF9QSUxPVF9CUURfMV9LNCwgICAgICAgMHgwMDQwMDAwMH0sCisgICAgICAgICAgICB7QVVEX1BJTE9UX0JRRF8yX0swLCAgICAgICAweDAwMDQwMDAwfSwKKyAgICAgICAgICAgIHtBVURfUElMT1RfQlFEXzJfSzEsICAgICAgIDB4MDAyYTQ4NDF9LAorICAgICAgICAgICAge0FVRF9QSUxPVF9CUURfMl9LMiwgICAgICAgMHgwMDQwMDAwMH0sCisgICAgICAgICAgICB7QVVEX1BJTE9UX0JRRF8yX0szLCAgICAgICAweDAwMDAwMDAwfSwKKyAgICAgICAgICAgIHtBVURfUElMT1RfQlFEXzJfSzQsICAgICAgIDB4MDAwMDAwMDB9LAorICAgICAgICAgICAge0FVRF9NT0RFX0NIR19USU1FUiwgICAgICAgMHgwMDAwMDA2MH0sCisgICAgICAgICAgICB7QVVEX0FGRV8xMkRCX0VOLCAgICAgICAgICAweDAwMDAwMDAxfSwKKyAgICAgICAgICAgIHtBQUdDX0hZU1QsICAgICAgICAgICAgICAgIDB4MDAwMDAwMGF9LAorICAgICAgICAgICAge0FVRF9DT1JESUNfU0hJRlRfMCwgICAgICAgMHgwMDAwMDAwN30sCisgICAgICAgICAgICB7QVVEX0NPUkRJQ19TSElGVF8xLCAgICAgICAweDAwMDAwMDA3fSwKKyAgICAgICAgICAgIHtBVURfQzFfVVBfVEhSLCAgICAgICAgICAgIDB4MDAwMDcwMDB9LAorICAgICAgICAgICAge0FVRF9DMV9MT19USFIsICAgICAgICAgICAgMHgwMDAwNTQwMH0sCisgICAgICAgICAgICB7QVVEX0MyX1VQX1RIUiwgICAgICAgICAgICAweDAwMDA1NDAwfSwKKyAgICAgICAgICAgIHtBVURfQzJfTE9fVEhSLCAgICAgICAgICAgIDB4MDAwMDMwMDB9LAorICAgICAgICAgICAge0FVRF9EQ09DXzBfU1JDLCAgICAgICAgICAgMHgwMDAwMDAxYX0sCisgICAgICAgICAgICB7QVVEX0RDT0MwX1NISUZULCAgICAgICAgICAweDAwMDAwMDAwfSwKKyAgICAgICAgICAgIHtBVURfRENPQ18wX1NISUZUX0lOMCwgICAgIDB4MDAwMDAwMGF9LAorICAgICAgICAgICAge0FVRF9EQ09DXzBfU0hJRlRfSU4xLCAgICAgMHgwMDAwMDAwOH0sCisgICAgICAgICAgICB7QVVEX0RDT0NfUEFTU19JTiwgICAgICAgICAweDAwMDAwMDAzfSwKKyAgICAgICAgICAgIHtBVURfSUlSM18wX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMjF9LAorICAgICAgICAgICAge0FVRF9ETjJfQUZDLCAgICAgICAgICAgICAgMHgwMDAwMDAwMn0sCisgICAgICAgICAgICB7QVVEX0RDT0NfMV9TUkMsICAgICAgICAgICAweDAwMDAwMDFifSwKKyAgICAgICAgICAgIHtBVURfRENPQzFfU0hJRlQsICAgICAgICAgIDB4MDAwMDAwMDB9LAorICAgICAgICAgICAge0FVRF9EQ09DXzFfU0hJRlRfSU4wLCAgICAgMHgwMDAwMDAwYX0sCisgICAgICAgICAgICB7QVVEX0RDT0NfMV9TSElGVF9JTjEsICAgICAweDAwMDAwMDA4fSwKKyAgICAgICAgICAgIHtBVURfSUlSM18xX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMjN9LAorICAgICAgICAgICAge0FVRF9ETjBfRlJFUSwgICAgICAgICAgICAgMHgwMDAwMzVhM30sCisgICAgICAgICAgICB7QVVEX0ROMl9GUkVRLCAgICAgICAgICAgICAweDAwMDAyOWM3fSwKKyAgICAgICAgICAgIHtBVURfQ1JEQzBfU1JDX1NFTCwgICAgICAgIDB4MDAwMDA1MTF9LAorICAgICAgICAgICAge0FVRF9JSVIxXzBfU0VMLCAgICAgICAgICAgMHgwMDAwMDAwMX0sCisgICAgICAgICAgICB7QVVEX0lJUjFfMV9TRUwsICAgICAgICAgICAweDAwMDAwMDAwfSwKKyAgICAgICAgICAgIHtBVURfSUlSM18yX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMDN9LAorICAgICAgICAgICAge0FVRF9JSVIzXzJfU0hJRlQsICAgICAgICAgMHgwMDAwMDAwMH0sCisgICAgICAgICAgICB7QVVEX0lJUjNfMF9TRUwsICAgICAgICAgICAweDAwMDAwMDAyfSwKKyAgICAgICAgICAgIHtBVURfSUlSMl8wX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMjF9LAorICAgICAgICAgICAge0FVRF9JSVIyXzBfU0hJRlQsICAgICAgICAgMHgwMDAwMDAwMn0sCisgICAgICAgICAgICB7QVVEX0RFRU1QSDBfU1JDX1NFTCwgICAgICAweDAwMDAwMDBifSwKKyAgICAgICAgICAgIHtBVURfREVFTVBIMV9TUkNfU0VMLCAgICAgIDB4MDAwMDAwMGJ9LAorICAgICAgICAgICAge0FVRF9QT0xZUEg4MFNDQUxFRkFDLCAgICAgMHgwMDAwMDAwMX0sCisgICAgICAgICAgICB7QVVEX1NUQVJUX1RJTUVSLCAgICAgICAgICAweDAwMDAwMDAwfSwKKyAgICAgICAgICAgIHsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKyAgICAgICB9OworCisgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBwYWxfaV9uaWNhbVtdID0geworICAgICAgICAgICB7IEFVRF9SQVRFX0FESjEsICAgICAgICAgICAweDAwMDAwMDEwIH0sCisgICAgICAgICAgIHsgQVVEX1JBVEVfQURKMiwgICAgICAgICAgIDB4MDAwMDAwNDAgfSwKKyAgICAgICAgICAgeyBBVURfUkFURV9BREozLCAgICAgICAgICAgMHgwMDAwMDEwMCB9LAorICAgICAgICAgICB7IEFVRF9SQVRFX0FESjQsICAgICAgICAgICAweDAwMDAwNDAwIH0sCisgICAgICAgICAgIHsgQVVEX1JBVEVfQURKNSwgICAgICAgICAgIDB4MDAwMDEwMDAgfSwKKwkgICAvLyAgICAgeyBBVURfRE1EX1JBX0REUywgICAgICAgICAgMHgwMGMwZDVjZSB9LAorCSAgIHsgQVVEX0RFRU1QSEdBSU5fUiwgICAgICAgIDB4MDAwMDIzYzIgfSwKKwkgICB7IEFVRF9ERUVNUEhOVU1FUjFfUiwgICAgICAweDAwMDJhN2JjIH0sCisJICAgeyBBVURfREVFTVBITlVNRVIyX1IsICAgICAgMHgwMDAzMDIzZSB9LAorCSAgIHsgQVVEX0RFRU1QSERFTk9NMV9SLCAgICAgIDB4MDAwMGYzZDAgfSwKKwkgICB7IEFVRF9ERUVNUEhERU5PTTJfUiwgICAgICAweDAwMDAwMDAwIH0sCisJICAgeyBBVURfREVFTVBIREVOT00yX1IsICAgICAgMHgwMDAwMDAwMCB9LAorCSAgIHsgQVVEX0VSUkxPR1BFUklPRF9SLCAgICAgIDB4MDAwMDBmZmYgfSwKKwkgICB7IEFVRF9FUlJJTlRSUFRUSFNITEQxX1IsICAweDAwMDAwM2ZmIH0sCisJICAgeyBBVURfRVJSSU5UUlBUVEhTSExEMl9SLCAgMHgwMDAwMDBmZiB9LAorCSAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgIDB4MDAwMDAwM2YgfSwKKwkgICB7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAgICAweDAwMDAwMDAzIH0sCisJICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUyLCAgMHgwNiB9LAorCSAgIHsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgIDB4ODIgfSwKKwkgICB7IEFVRF9QREZfRERTX0NOU1RfQllURTAsICAweDE2IH0sCisJICAgeyBBVURfUUFNX01PREUsICAgICAgICAgICAgMHgwNSB9LAorCSAgIHsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgIDB4MTIgfSwKKwkgICB7IEFVRF9QSEFDQ19GUkVRXzhNU0IsICAgICAweDNhIH0sCisJICAgeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAgMHg5MyB9LAorICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorICAgICAgICB9OworCisgICAgICAgIGRwcmludGsoIiVzIChzdGF0dXM6IGRldmVsKSwgc3RlcmVvIDogJWRcbiIsX19GVU5DVElPTl9fLHN0ZXJlbyk7CisKKyAgICAgICAgaWYgKCFzdGVyZW8pIHsKKwkJLy8gRk0gbW9ubworCQlzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDA0LCBFTl9ETVRSWF9TVU1ESUZGIHwgRU5fQTJfRk9SQ0VfTU9OTzEpOworCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIHBhbF9pX2ZtX21vbm8pOworICAgICAgICB9IGVsc2UgeworCQkvLyBOaWNhbSBTdGVyZW8KKwkJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIDB4MDAxMCwgRU5fRE1UUlhfTFIgfCBFTl9ETVRSWF9CWVBBU1MgfCBFTl9OSUNBTV9BVVRPX1NURVJFTyk7CisJCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgcGFsX2lfbmljYW0pOworICAgICAgICB9CisgICAgICAgIHNldF9hdWRpb19maW5pc2goY29yZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9BMihzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlKQoreworCS8qIGZyb20gZHNjYWxlciBjdnMgKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IGEyX2NvbW1vbltdID0geworCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTIsICAgICAweDA2IH0sCisJCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgICAgIDB4ODIgfSwKKwkJeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAgICAgMHgxMiB9LAorCQl7IEFVRF9RQU1fTU9ERSwJCSAgICAgIDB4MDUgfSwKKwkJeyBBVURfUEhBQ0NfRlJFUV84TVNCLAkgICAgICAweDM0IH0sCisJCXsgQVVEX1BIQUNDX0ZSRVFfOExTQiwJICAgICAgMHg0YyB9LAorCisJCXsgQVVEX1JBVEVfQURKMSwJMHgwMDAwMTAwMCB9LAorCQl7IEFVRF9SQVRFX0FESjIsCTB4MDAwMDIwMDAgfSwKKwkJeyBBVURfUkFURV9BREozLAkweDAwMDAzMDAwIH0sCisJCXsgQVVEX1JBVEVfQURKNCwJMHgwMDAwNDAwMCB9LAorCQl7IEFVRF9SQVRFX0FESjUsCTB4MDAwMDUwMDAgfSwKKwkJeyBBVURfVEhSX0ZSLAkJMHgwMDAwMDAwMCB9LAorCQl7IEFBR0NfSFlTVCwJCTB4MDAwMDAwMWEgfSwKKwkJeyBBVURfUElMT1RfQlFEXzFfSzAsCTB4MDAwMDc1NWIgfSwKKwkJeyBBVURfUElMT1RfQlFEXzFfSzEsCTB4MDA1NTEzNDAgfSwKKwkJeyBBVURfUElMT1RfQlFEXzFfSzIsCTB4MDA2ZDMwYmUgfSwKKwkJeyBBVURfUElMT1RfQlFEXzFfSzMsCTB4ZmZkMzk0YWYgfSwKKwkJeyBBVURfUElMT1RfQlFEXzFfSzQsCTB4MDA0MDAwMDAgfSwKKwkJeyBBVURfUElMT1RfQlFEXzJfSzAsCTB4MDAwNDAwMDAgfSwKKwkJeyBBVURfUElMT1RfQlFEXzJfSzEsCTB4MDAyYTQ4NDEgfSwKKwkJeyBBVURfUElMT1RfQlFEXzJfSzIsCTB4MDA0MDAwMDAgfSwKKwkJeyBBVURfUElMT1RfQlFEXzJfSzMsCTB4MDAwMDAwMDAgfSwKKwkJeyBBVURfUElMT1RfQlFEXzJfSzQsCTB4MDAwMDAwMDAgfSwKKwkJeyBBVURfTU9ERV9DSEdfVElNRVIsCTB4MDAwMDAwNDAgfSwKKwkJeyBBVURfU1RBUlRfVElNRVIsCTB4MDAwMDAyMDAgfSwKKwkJeyBBVURfQUZFXzEyREJfRU4sCTB4MDAwMDAwMDAgfSwKKwkJeyBBVURfQ09SRElDX1NISUZUXzAsCTB4MDAwMDAwMDcgfSwKKwkJeyBBVURfQ09SRElDX1NISUZUXzEsCTB4MDAwMDAwMDcgfSwKKwkJeyBBVURfREVFTVBIMF9HMCwJMHgwMDAwMDM4MCB9LAorCQl7IEFVRF9ERUVNUEgxX0cwLAkweDAwMDAwMzgwIH0sCisJCXsgQVVEX0RDT0NfMF9TUkMsCTB4MDAwMDAwMWEgfSwKKwkJeyBBVURfRENPQzBfU0hJRlQsCTB4MDAwMDAwMDAgfSwKKwkJeyBBVURfRENPQ18wX1NISUZUX0lOMCwJMHgwMDAwMDAwYSB9LAorCQl7IEFVRF9EQ09DXzBfU0hJRlRfSU4xLAkweDAwMDAwMDA4IH0sCisJCXsgQVVEX0RDT0NfUEFTU19JTiwJMHgwMDAwMDAwMyB9LAorCQl7IEFVRF9JSVIzXzBfU0VMLAkweDAwMDAwMDIxIH0sCisJCXsgQVVEX0ROMl9BRkMsCQkweDAwMDAwMDAyIH0sCisJCXsgQVVEX0RDT0NfMV9TUkMsCTB4MDAwMDAwMWIgfSwKKwkJeyBBVURfRENPQzFfU0hJRlQsCTB4MDAwMDAwMDAgfSwKKwkJeyBBVURfRENPQ18xX1NISUZUX0lOMCwJMHgwMDAwMDAwYSB9LAorCQl7IEFVRF9EQ09DXzFfU0hJRlRfSU4xLAkweDAwMDAwMDA4IH0sCisJCXsgQVVEX0lJUjNfMV9TRUwsCTB4MDAwMDAwMjMgfSwKKwkJeyBBVURfUkRTSV9TRUwsCQkweDAwMDAwMDE3IH0sCisJCXsgQVVEX1JEU0lfU0hJRlQsCTB4MDAwMDAwMDAgfSwKKwkJeyBBVURfUkRTUV9TRUwsCQkweDAwMDAwMDE3IH0sCisJCXsgQVVEX1JEU1FfU0hJRlQsCTB4MDAwMDAwMDAgfSwKKwkJeyBBVURfUE9MWVBIODBTQ0FMRUZBQywJMHgwMDAwMDAwMSB9LAorCisJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwl9OworCisJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBhMl90YWJsZTFbXSA9IHsKKwkJLy8gUEFMLUJHCisJCXsgQVVEX0RNRF9SQV9ERFMsCTB4MDAyYTczYmQgfSwKKwkJeyBBVURfQzFfVVBfVEhSLAkweDAwMDA3MDAwIH0sCisJCXsgQVVEX0MxX0xPX1RIUiwJMHgwMDAwNTQwMCB9LAorCQl7IEFVRF9DMl9VUF9USFIsCTB4MDAwMDU0MDAgfSwKKwkJeyBBVURfQzJfTE9fVEhSLAkweDAwMDAzMDAwIH0sCisJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYTJfdGFibGUyW10gPSB7CisJCS8vIFBBTC1ESworCQl7IEFVRF9ETURfUkFfRERTLAkweDAwMmE3M2JkIH0sCisJCXsgQVVEX0MxX1VQX1RIUiwJMHgwMDAwNzAwMCB9LAorCQl7IEFVRF9DMV9MT19USFIsCTB4MDAwMDU0MDAgfSwKKwkJeyBBVURfQzJfVVBfVEhSLAkweDAwMDA1NDAwIH0sCisJCXsgQVVEX0MyX0xPX1RIUiwJMHgwMDAwMzAwMCB9LAorCQl7IEFVRF9ETjBfRlJFUSwJCTB4MDAwMDNhMWMgfSwKKwkJeyBBVURfRE4yX0ZSRVEsCQkweDAwMDBkMmUwIH0sCisJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYTJfdGFibGUzW10gPSB7CisJCS8vIHVua25vd24sIHByb2JhYmx5IE5UU0MtTQorCQl7IEFVRF9ETURfUkFfRERTLAkweDAwMmEyODczIH0sCisJCXsgQVVEX0MxX1VQX1RIUiwJMHgwMDAwM2MwMCB9LAorCQl7IEFVRF9DMV9MT19USFIsCTB4MDAwMDMwMDAgfSwKKwkJeyBBVURfQzJfVVBfVEhSLAkweDAwMDA2MDAwIH0sCisJCXsgQVVEX0MyX0xPX1RIUiwJMHgwMDAwM2MwMCB9LAorCQl7IEFVRF9ETjBfRlJFUSwJCTB4MDAwMDI4MzYgfSwKKwkJeyBBVURfRE4xX0ZSRVEsCQkweDAwMDAzNDE4IH0sCisJCXsgQVVEX0ROMl9GUkVRLAkJMHgwMDAwMjljNyB9LAorCQl7IEFVRF9QT0xZMF9ERFNfQ09OU1RBTlQsIDB4MDAwYTc1NDAgfSwKKwkJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCX07CisKKwlzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDA0LCBFTl9ETVRSWF9TVU1ESUZGIHwgRU5fQTJfQVVUT19TVEVSRU8pOworCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgYTJfY29tbW9uKTsKKwlzd2l0Y2ggKGNvcmUtPnR2YXVkaW8pIHsKKwljYXNlIFdXX0EyX0JHOgorCQlkcHJpbnRrKCIlcyBQQUwtQkcgQTIgKHN0YXR1czoga25vd24tZ29vZClcbiIsX19GVU5DVElPTl9fKTsKKwkJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBhMl90YWJsZTEpOworCQlicmVhazsKKwljYXNlIFdXX0EyX0RLOgorCQlkcHJpbnRrKCIlcyBQQUwtREsgQTIgKHN0YXR1czoga25vd24tZ29vZClcbiIsX19GVU5DVElPTl9fKTsKKwkJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBhMl90YWJsZTIpOworCQlicmVhazsKKwljYXNlIFdXX0EyX006CisJCWRwcmludGsoIiVzIE5UU0MtTSBBMiAoc3RhdHVzOiB1bmtub3duKVxuIixfX0ZVTkNUSU9OX18pOworCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGEyX3RhYmxlMyk7CisJCWJyZWFrOworCX07CisJc2V0X2F1ZGlvX2ZpbmlzaChjb3JlKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3N0YW5kYXJkX0VJQUooc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IGVpYWpbXSA9IHsKKwkJLyogVE9ETzogZWlhaiByZWdpc3RlciBzZXR0aW5ncyBhcmUgbm90IHRoZXJlIHlldCAuLi4gKi8KKworCQl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCisJfTsKKwlkcHJpbnRrKCIlcyAoc3RhdHVzOiB1bmtub3duKVxuIixfX0ZVTkNUSU9OX18pOworCisJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIDB4MDAwMiwgRU5fRUlBSl9BVVRPX1NURVJFTyk7CisJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBlaWFqKTsKKwlzZXRfYXVkaW9fZmluaXNoKGNvcmUpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfRk0oc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3sKKyNpZiAwIC8qIEZJWE1FICovCisJc3dpdGNoIChkZXYtPmF1ZGlvX3Byb3BlcnRpZXMuRk1fZGVlbXBoYXNpcykKKwl7CisJCWNhc2UgV1dfRk1fREVFTVBIXzUwOgorCQkJLy9TZXQgRGUtZW1waGFzaXMgZmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgNTAgdXNlYworCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDBfRzAsIDB4MEM0NSk7CisJCQljeF93cml0ZShBVURfREVFTVBIMF9BMCwgMHg2MjYyKTsKKwkJCWN4X3dyaXRlKEFVRF9ERUVNUEgwX0IwLCAweDFDMjkpOworCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDBfQTEsIDB4M0ZDNjYpOworCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDBfQjEsIDB4Mzk5QSk7CisKKwkJCWN4X3dyaXRlKEFVRF9ERUVNUEgxX0cwLCAweDBEODApOworCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDFfQTAsIDB4NjI2Mik7CisJCQljeF93cml0ZShBVURfREVFTVBIMV9CMCwgMHgxQzI5KTsKKwkJCWN4X3dyaXRlKEFVRF9ERUVNUEgxX0ExLCAweDNGQzY2KTsKKwkJCWN4X3dyaXRlKEFVRF9ERUVNUEgxX0IxLCAweDM5OUEpOworCisJCQlicmVhazsKKworCQljYXNlIFdXX0ZNX0RFRU1QSF83NToKKwkJCS8vU2V0IERlLWVtcGhhc2lzIGZpbHRlciBjb2VmZmljaWVudHMgZm9yIDc1IHVzZWMKKwkJCWN4X3dyaXRlKEFVRF9ERUVNUEgwX0cwLCAweDkxQiApOworCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDBfQTAsIDB4NkI2OCk7CisJCQljeF93cml0ZShBVURfREVFTVBIMF9CMCwgMHgxMUVDKTsKKwkJCWN4X3dyaXRlKEFVRF9ERUVNUEgwX0ExLCAweDNGQzY2KTsKKwkJCWN4X3dyaXRlKEFVRF9ERUVNUEgwX0IxLCAweDM5OUEpOworCisJCQljeF93cml0ZShBVURfREVFTVBIMV9HMCwgMHhBQTAgKTsKKwkJCWN4X3dyaXRlKEFVRF9ERUVNUEgxX0EwLCAweDZCNjgpOworCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDFfQjAsIDB4MTFFQyk7CisJCQljeF93cml0ZShBVURfREVFTVBIMV9BMSwgMHgzRkM2Nik7CisJCQljeF93cml0ZShBVURfREVFTVBIMV9CMSwgMHgzOTlBKTsKKworCQkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlkcHJpbnRrKCIlcyAoc3RhdHVzOiB1bmtub3duKVxuIixfX0ZVTkNUSU9OX18pOworCXNldF9hdWRpb19zdGFydChjb3JlLCAweDAwMjAsIEVOX0ZNUkFESU9fQVVUT19TVEVSRU8pOworCisJLy8gQUI6IDEwLzIvMDE6IHRoaXMgcmVnaXN0ZXIgaXMgbm90IGJlaW5nIHJlc2V0IGFwcHJvcHJpYXRlbHkgb24gb2NjYXNpb24uCisJY3hfd3JpdGUoQVVEX1BPTFlQSDgwU0NBTEVGQUMsMyk7CisKKwlzZXRfYXVkaW9fZmluaXNoKGNvcmUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGN4ODhfc2V0X3R2YXVkaW8oc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3sKKwlzd2l0Y2ggKGNvcmUtPnR2YXVkaW8pIHsKKwljYXNlIFdXX0JUU0M6CisJCXNldF9hdWRpb19zdGFuZGFyZF9CVFNDKGNvcmUsMCk7CisJCWJyZWFrOworCWNhc2UgV1dfTklDQU1fQkdES0w6CisJCXNldF9hdWRpb19zdGFuZGFyZF9OSUNBTV9MKGNvcmUsMCk7CisJCWJyZWFrOworCWNhc2UgV1dfTklDQU1fSToKKwkJc2V0X2F1ZGlvX3N0YW5kYXJkX1BBTF9JKGNvcmUsMCk7CisJCWJyZWFrOworCWNhc2UgV1dfQTJfQkc6CisJY2FzZSBXV19BMl9ESzoKKwljYXNlIFdXX0EyX006CisJCXNldF9hdWRpb19zdGFuZGFyZF9BMihjb3JlKTsKKwkJYnJlYWs7CisJY2FzZSBXV19FSUFKOgorCQlzZXRfYXVkaW9fc3RhbmRhcmRfRUlBSihjb3JlKTsKKwkJYnJlYWs7CisJY2FzZSBXV19GTToKKwkJc2V0X2F1ZGlvX3N0YW5kYXJkX0ZNKGNvcmUpOworCQlicmVhazsKKwljYXNlIFdXX1NZU1RFTV9MX0FNOgorCQlzZXRfYXVkaW9fc3RhbmRhcmRfTklDQU1fTChjb3JlLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBXV19OT05FOgorCWRlZmF1bHQ6CisJCXByaW50aygiJXMvMDogdW5rbm93biB0diBhdWRpbyBtb2RlIFslZF1cbiIsCisJCSAgICAgICBjb3JlLT5uYW1lLCBjb3JlLT50dmF1ZGlvKTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKwordm9pZCBjeDg4X25ld3N0YXRpb24oc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3sKKwljb3JlLT5hdWRpb21vZGVfbWFudWFsID0gVU5TRVQ7CisKKwlzd2l0Y2ggKGNvcmUtPnR2YXVkaW8pIHsKKwljYXNlIFdXX1NZU1RFTV9MX0FNOgorCQkvKiB0cnkgbmljYW0gLi4uICovCisJCWNvcmUtPmF1ZGlvbW9kZV9jdXJyZW50ID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKKwkJc2V0X2F1ZGlvX3N0YW5kYXJkX05JQ0FNX0woY29yZSwgMSk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBjeDg4X2dldF9zdGVyZW8oc3RydWN0IGN4ODhfY29yZSAqY29yZSwgc3RydWN0IHY0bDJfdHVuZXIgKnQpCit7CisJc3RhdGljIGNoYXIgKm1bXSA9IHsic3RlcmVvIiwgImR1YWwgbW9ubyIsICJtb25vIiwgInNhcCJ9OworCXN0YXRpYyBjaGFyICpwW10gPSB7Im5vIHBpbG90IiwgInBpbG90IGMxIiwgInBpbG90IGMyIiwgIj8ifTsKKwl1MzIgcmVnLG1vZGUscGlsb3Q7CisKKwlyZWcgICA9IGN4X3JlYWQoQVVEX1NUQVRVUyk7CisJbW9kZSAgPSByZWcgJiAweDAzOworCXBpbG90ID0gKHJlZyA+PiAyKSAmIDB4MDM7CisKKwlpZiAoY29yZS0+YXN0YXQgIT0gcmVnKQorCQlkcHJpbnRrKCJBVURfU1RBVFVTOiAweCV4IFslcy8lc10gY3RsPSVzXG4iLAorCQkJcmVnLCBtW21vZGVdLCBwW3BpbG90XSwKKwkJCWF1ZF9jdGxfbmFtZXNbY3hfcmVhZChBVURfQ1RMKSAmIDYzXSk7CisJY29yZS0+YXN0YXQgPSByZWc7CisKKwl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfU1RFUkVPIHwgVjRMMl9UVU5FUl9DQVBfU0FQIHwKKwkJVjRMMl9UVU5FUl9DQVBfTEFORzEgfCBWNEwyX1RVTkVSX0NBUF9MQU5HMjsKKwl0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwl0LT5hdWRtb2RlICAgID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisKKwlzd2l0Y2ggKGNvcmUtPnR2YXVkaW8pIHsKKwljYXNlIFdXX0JUU0M6CisJCXQtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfAorCQkJVjRMMl9UVU5FUl9DQVBfU0FQOworCQl0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworIAkJaWYgKDEgPT0gcGlsb3QpIHsKKwkJCS8qIFNBUCAqLworCQkJdC0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9TQVA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXV19BMl9CRzoKKwljYXNlIFdXX0EyX0RLOgorCWNhc2UgV1dfQTJfTToKKyAJCWlmICgxID09IHBpbG90KSB7CisJCQkvKiBzdGVyZW8gKi8KKwkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05PIHwgVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworCQkJaWYgKDAgPT0gbW9kZSkKKwkJCQl0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKKwkJfQorIAkJaWYgKDIgPT0gcGlsb3QpIHsKKwkJCS8qIGR1YWwgbGFuZ3VhZ2UgLS0gRklYTUUgKi8KKwkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8IFY0TDJfVFVORVJfU1VCX0xBTkcyOworCQkJdC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdXX05JQ0FNX0JHREtMOgorCQlpZiAoMCA9PSBtb2RlKSB7CisJCQl0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKKwkJCXQtPnJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworCQl9CisJCWJyZWFrOworICAgICAgICBjYXNlIFdXX1NZU1RFTV9MX0FNOgorICAgICAgICAgICAgICAgIGlmICgweDAgPT0gbW9kZSAmJiAhKGN4X3JlYWQoQVVEX0lOSVQpICYgMHgwNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCQkJdC0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJCX0KKyAgICAgICAgICAgICAgICBicmVhayA7CisJZGVmYXVsdDoKKwkJLyogbm90aGluZyAqLworCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCit2b2lkIGN4ODhfc2V0X3N0ZXJlbyhzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1MzIgbW9kZSwgaW50IG1hbnVhbCkKK3sKKwl1MzIgY3RsICA9IFVOU0VUOworCXUzMiBtYXNrID0gVU5TRVQ7CisKKwlpZiAobWFudWFsKSB7CisJCWNvcmUtPmF1ZGlvbW9kZV9tYW51YWwgPSBtb2RlOworCX0gZWxzZSB7CisJCWlmIChVTlNFVCAhPSBjb3JlLT5hdWRpb21vZGVfbWFudWFsKQorCQkJcmV0dXJuOworCX0KKwljb3JlLT5hdWRpb21vZGVfY3VycmVudCA9IG1vZGU7CisKKwlzd2l0Y2ggKGNvcmUtPnR2YXVkaW8pIHsKKwljYXNlIFdXX0JUU0M6CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgorCQkJY3RsICA9IEVOX0JUU0NfRk9SQ0VfTU9OTzsKKwkJCW1hc2sgPSAweDNmOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NBUDoKKwkJCWN0bCAgPSBFTl9CVFNDX0ZPUkNFX1NBUDsKKwkJCW1hc2sgPSAweDNmOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKKwkJCWN0bCAgPSBFTl9CVFNDX0FVVE9fU1RFUkVPOworCQkJbWFzayA9IDB4M2Y7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFdXX0EyX0JHOgorCWNhc2UgV1dfQTJfREs6CisJY2FzZSBXV19BMl9NOgorCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzoKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzE6CisJCQljdGwgID0gRU5fQTJfRk9SQ0VfTU9OTzE7CisJCQltYXNrID0gMHgzZjsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMjoKKwkJCWN0bCAgPSBFTl9BMl9BVVRPX01PTk8yOworCQkJbWFzayA9IDB4M2Y7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgorCQkJY3RsICA9IEVOX0EyX0FVVE9fU1RFUkVPIHwgRU5fRE1UUlhfU1VNUjsKKwkJCW1hc2sgPSAweDhiZjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgV1dfTklDQU1fQkdES0w6CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgorCQkJY3RsICA9IEVOX05JQ0FNX0ZPUkNFX01PTk8xOworCQkJbWFzayA9IDB4M2Y7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzE6CisJCQljdGwgID0gRU5fTklDQU1fQVVUT19NT05PMjsKKwkJCW1hc2sgPSAweDNmOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKKwkJCWN0bCAgPSBFTl9OSUNBTV9GT1JDRV9TVEVSRU8gfCBFTl9ETVRSWF9MUjsKKwkJCW1hc2sgPSAweDkzZjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgV1dfU1lTVEVNX0xfQU06CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgorCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMTogIC8qIEZJWE1FICovCisJCQlzZXRfYXVkaW9fc3RhbmRhcmRfTklDQU1fTChjb3JlLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9TVEVSRU86CisJCQlzZXRfYXVkaW9fc3RhbmRhcmRfTklDQU1fTChjb3JlLCAxKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgV1dfTklDQU1fSToKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxOgorCQkJc2V0X2F1ZGlvX3N0YW5kYXJkX1BBTF9JKGNvcmUsIDApOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKKwkJCXNldF9hdWRpb19zdGFuZGFyZF9QQUxfSShjb3JlLCAxKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgV1dfRk06CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgorCQkJY3RsICA9IEVOX0ZNUkFESU9fRk9SQ0VfTU9OTzsKKwkJCW1hc2sgPSAweDNmOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKKwkJCWN0bCAgPSBFTl9GTVJBRElPX0FVVE9fU1RFUkVPOworCQkJbWFzayA9IDB4M2Y7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoVU5TRVQgIT0gY3RsKSB7CisJCWRwcmludGsoImN4ODhfc2V0X3N0ZXJlbzogbWFzayAweCV4LCBjdGwgMHgleCAiCisJCQkiW3N0YXR1cz0weCV4LGN0bD0weCV4LHZvbD0weCV4XVxuIiwKKwkJCW1hc2ssIGN0bCwgY3hfcmVhZChBVURfU1RBVFVTKSwKKwkJCWN4X3JlYWQoQVVEX0NUTCksIGN4X3NyZWFkKFNIQURPV19BVURfVk9MX0NUTCkpOworCQljeF9hbmRvcihBVURfQ1RMLCBtYXNrLCBjdGwpOworCX0KKwlyZXR1cm47Cit9CisKK2ludCBjeDg4X2F1ZGlvX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkYXRhOworCXN0cnVjdCB2NGwyX3R1bmVyIHQ7CisJdTMyIG1vZGUgPSAwOworCisJZHByaW50aygiY3g4ODogdHZhdWRpbyB0aHJlYWQgc3RhcnRlZFxuIik7CisJZm9yICg7OykgeworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKTsKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCisJCS8qIGp1c3QgbW9uaXRvciB0aGUgYXVkaW8gc3RhdHVzIGZvciBub3cgLi4uICovCisJCW1lbXNldCgmdCwwLHNpemVvZih0KSk7CisJCWN4ODhfZ2V0X3N0ZXJlbyhjb3JlLCZ0KTsKKworCQlpZiAoVU5TRVQgIT0gY29yZS0+YXVkaW9tb2RlX21hbnVhbCkKKwkJCS8qIG1hbnVhbGx5IHNldCwgZG9uJ3QgZG8gYW55dGhpbmcuICovCisJCQljb250aW51ZTsKKworCQkvKiBtb25pdG9yIHNpZ25hbCAqLworCQlpZiAodC5yeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfU1RFUkVPKQorCQkJbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJCWVsc2UKKwkJCW1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKKwkJaWYgKG1vZGUgPT0gY29yZS0+YXVkaW9tb2RlX2N1cnJlbnQpCisJCQljb250aW51ZTsKKworCQkvKiBhdXRvbWF0aWNhbGx5IHN3aXRjaCB0byBiZXN0IGF2YWlsYWJsZSBtb2RlICovCisJCWN4ODhfc2V0X3N0ZXJlbyhjb3JlLCBtb2RlLCAwKTsKKwl9CisKKwlkcHJpbnRrKCJjeDg4OiB0dmF1ZGlvIHRocmVhZCBleGl0aW5nXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworRVhQT1JUX1NZTUJPTChjeDg4X3NldF90dmF1ZGlvKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9uZXdzdGF0aW9uKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9zZXRfc3RlcmVvKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9nZXRfc3RlcmVvKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9hdWRpb190aHJlYWQpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12YmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzFlNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiAkSWQ6IGN4ODgtdmJpLmMsdiAxLjE2IDIwMDQvMTIvMTAgMTI6MzM6Mzkga3JheGVsIEV4cCAkCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJjeDg4LmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmJpYnVmcyA9IDQ7Cittb2R1bGVfcGFyYW0odmJpYnVmcyxpbnQsMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZiaWJ1ZnMsIm51bWJlciBvZiB2YmkgYnVmZmVycywgcmFuZ2UgMi0zMiIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHZiaV9kZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0odmJpX2RlYnVnLGludCwwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModmJpX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW3ZiaV0iKTsKKworI2RlZmluZSBkcHJpbnRrKGxldmVsLGZtdCwgYXJnLi4uKQlpZiAodmJpX2RlYnVnID49IGxldmVsKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZtdCwgZGV2LT5jb3JlLT5uYW1lICwgIyMgYXJnKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBjeDg4MDBfdmJpX2ZtdChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJbWVtc2V0KCZmLT5mbXQudmJpLDAsc2l6ZW9mKGYtPmZtdC52YmkpKTsKKworCWYtPmZtdC52Ymkuc2FtcGxlc19wZXJfbGluZSA9IFZCSV9MSU5FX0xFTkdUSDsKKwlmLT5mbXQudmJpLnNhbXBsZV9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfR1JFWTsKKwlmLT5mbXQudmJpLm9mZnNldCA9IDI0NDsKKwlmLT5mbXQudmJpLmNvdW50WzBdID0gVkJJX0xJTkVfQ09VTlQ7CisJZi0+Zm10LnZiaS5jb3VudFsxXSA9IFZCSV9MSU5FX0NPVU5UOworCisJaWYgKGRldi0+Y29yZS0+dHZub3JtLT5pZCAmIFY0TDJfU1REXzUyNV82MCkgeworCQkvKiBudHNjICovCisJCWYtPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSA9IDI4NjM2MzYzOworCQlmLT5mbXQudmJpLnN0YXJ0WzBdID0gMTAgLTE7CisJCWYtPmZtdC52Ymkuc3RhcnRbMV0gPSAyNzMgLTE7CisKKwl9IGVsc2UgaWYgKGRldi0+Y29yZS0+dHZub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgeworCQkvKiBwYWwgKi8KKwkJZi0+Zm10LnZiaS5zYW1wbGluZ19yYXRlID0gMzU0Njg5NTA7CisJCWYtPmZtdC52Ymkuc3RhcnRbMF0gPSA3IC0xOworCQlmLT5mbXQudmJpLnN0YXJ0WzFdID0gMzE5IC0xOworCX0KK30KKworaW50IGN4ODgwMF9zdGFydF92YmlfZG1hKHN0cnVjdCBjeDg4MDBfZGV2ICAgICpkZXYsCisJCQkgc3RydWN0IGN4ODhfZG1hcXVldWUgKnEsCisJCQkgc3RydWN0IGN4ODhfYnVmZmVyICAgKmJ1ZikKK3sKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCisJLyogc2V0dXAgZmlmbyArIGZvcm1hdCAqLworCWN4ODhfc3JhbV9jaGFubmVsX3NldHVwKGRldi0+Y29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjRdLAorCQkJCWJ1Zi0+dmIud2lkdGgsIGJ1Zi0+cmlzYy5kbWEpOworCisJY3hfd3JpdGUoTU9fVkJPU19DT05UUk9MLCAoICgxIDw8IDE4KSB8ICAvLyBjb21iIGZpbHRlciBkZWxheSBmaXh1cAorCQkJCSAgICAoMSA8PCAxNSkgfCAgLy8gZW5hYmxlIHZiaSBjYXB0dXJlCisJCQkJICAgICgxIDw8IDExKSApKTsKKworCS8qIHJlc2V0IGNvdW50ZXIgKi8KKwljeF93cml0ZShNT19WQklfR1BDTlRSTCwgR1BfQ09VTlRfQ09OVFJPTF9SRVNFVCk7CisJcS0+Y291bnQgPSAxOworCisJLyogZW5hYmxlIGlycXMgKi8KKwljeF9zZXQoTU9fUENJX0lOVE1TSywgY29yZS0+cGNpX2lycW1hc2sgfCAweDAxKTsKKwljeF9zZXQoTU9fVklEX0lOVE1TSywgMHgwZjAwODgpOworCisJLyogZW5hYmxlIGNhcHR1cmUgKi8KKwljeF9zZXQoVklEX0NBUFRVUkVfQ09OVFJPTCwweDE4KTsKKworCS8qIHN0YXJ0IGRtYSAqLworCWN4X3NldChNT19ERVZfQ05UUkwyLCAoMTw8NSkpOworCWN4X3NldChNT19WSURfRE1BQ05UUkwsIDB4ODgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDg4MDBfc3RvcF92YmlfZG1hKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKworCS8qIHN0b3AgZG1hICovCisJY3hfY2xlYXIoTU9fVklEX0RNQUNOVFJMLCAweDg4KTsKKworCS8qIGRpc2FibGUgY2FwdHVyZSAqLworCWN4X2NsZWFyKFZJRF9DQVBUVVJFX0NPTlRST0wsMHgxOCk7CisKKwkvKiBkaXNhYmxlIGlycXMgKi8KKwljeF9jbGVhcihNT19QQ0lfSU5UTVNLLCAweDAwMDAwMSk7CisJY3hfY2xlYXIoTU9fVklEX0lOVE1TSywgMHgwZjAwODgpOworCXJldHVybiAwOworfQorCitpbnQgY3g4ODAwX3Jlc3RhcnRfdmJpX3F1ZXVlKHN0cnVjdCBjeDg4MDBfZGV2ICAgICpkZXYsCisJCQkgICAgIHN0cnVjdCBjeDg4X2RtYXF1ZXVlICpxKQoreworCXN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmOworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkKKwkJcmV0dXJuIDA7CisKKwlidWYgPSBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5uZXh0LCBzdHJ1Y3QgY3g4OF9idWZmZXIsIHZiLnF1ZXVlKTsKKwlkcHJpbnRrKDIsInJlc3RhcnRfcXVldWUgWyVwLyVkXTogcmVzdGFydCBkbWFcbiIsCisJCWJ1ZiwgYnVmLT52Yi5pKTsKKwljeDg4MDBfc3RhcnRfdmJpX2RtYShkZXYsIHEsIGJ1Zik7CisJbGlzdF9mb3JfZWFjaChpdGVtLCZxLT5hY3RpdmUpIHsKKwkJYnVmID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgY3g4OF9idWZmZXIsIHZiLnF1ZXVlKTsKKwkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7CisJfQorCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY3g4ODAwX3ZiaV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2ID0gKHN0cnVjdCBjeDg4MDBfZGV2KilkYXRhOworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisJc3RydWN0IGN4ODhfZG1hcXVldWUgKnEgPSAmZGV2LT52YmlxOworCXN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljeDg4X3NyYW1fY2hhbm5lbF9kdW1wKGRldi0+Y29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjRdKTsKKworCWN4X2NsZWFyKE1PX1ZJRF9ETUFDTlRSTCwgMHg4OCk7CisJY3hfY2xlYXIoVklEX0NBUFRVUkVfQ09OVFJPTCwgMHgxOCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jayxmbGFncyk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7CisJCWJ1ZiA9IGxpc3RfZW50cnkocS0+YWN0aXZlLm5leHQsIHN0cnVjdCBjeDg4X2J1ZmZlciwgdmIucXVldWUpOworCQlsaXN0X2RlbCgmYnVmLT52Yi5xdWV1ZSk7CisJCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJd2FrZV91cCgmYnVmLT52Yi5kb25lKTsKKwkJcHJpbnRrKCIlcy8wOiBbJXAvJWRdIHRpbWVvdXQgLSBkbWE9MHglMDhseFxuIiwgZGV2LT5jb3JlLT5uYW1lLAorCQkgICAgICAgYnVmLCBidWYtPnZiLmksICh1bnNpZ25lZCBsb25nKWJ1Zi0+cmlzYy5kbWEpOworCX0KKwljeDg4MDBfcmVzdGFydF92YmlfcXVldWUoZGV2LHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAordmJpX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50ICpjb3VudCwgdW5zaWduZWQgaW50ICpzaXplKQoreworCSpzaXplID0gVkJJX0xJTkVfQ09VTlQgKiBWQklfTElORV9MRU5HVEggKiAyOworCWlmICgwID09ICpjb3VudCkKKwkJKmNvdW50ID0gdmJpYnVmczsKKwlpZiAoKmNvdW50IDwgMikKKwkJKmNvdW50ID0gMjsKKwlpZiAoKmNvdW50ID4gMzIpCisJCSpjb3VudCA9IDMyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit2YmlfcHJlcGFyZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAorCSAgICBlbnVtIHY0bDJfZmllbGQgZmllbGQpCit7CisJc3RydWN0IGN4ODgwMF9maCAgICpmaCAgPSBxLT5wcml2X2RhdGE7CisJc3RydWN0IGN4ODgwMF9kZXYgICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBjeDg4X2J1ZmZlcix2Yik7CisJdW5zaWduZWQgaW50IHNpemU7CisJaW50IHJjOworCisJc2l6ZSA9IFZCSV9MSU5FX0NPVU5UICogVkJJX0xJTkVfTEVOR1RIICogMjsKKwlpZiAoMCAhPSBidWYtPnZiLmJhZGRyICAmJiAgYnVmLT52Yi5ic2l6ZSA8IHNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKFNUQVRFX05FRURTX0lOSVQgPT0gYnVmLT52Yi5zdGF0ZSkgeworCQlidWYtPnZiLndpZHRoICA9IFZCSV9MSU5FX0xFTkdUSDsKKwkJYnVmLT52Yi5oZWlnaHQgPSBWQklfTElORV9DT1VOVDsKKwkJYnVmLT52Yi5zaXplICAgPSBzaXplOworCQlidWYtPnZiLmZpZWxkICA9IFY0TDJfRklFTERfU0VRX1RCOworCisJCWlmICgwICE9IChyYyA9IHZpZGVvYnVmX2lvbG9jayhkZXYtPnBjaSwmYnVmLT52YixOVUxMKSkpCisJCQlnb3RvIGZhaWw7CisJCWN4ODhfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCQkJIGJ1Zi0+dmIuZG1hLnNnbGlzdCwKKwkJCQkgMCwgYnVmLT52Yi53aWR0aCAqIGJ1Zi0+dmIuaGVpZ2h0LAorCQkJCSBidWYtPnZiLndpZHRoLCAwLAorCQkJCSBidWYtPnZiLmhlaWdodCk7CisJfQorCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJY3g4OF9mcmVlX2J1ZmZlcihkZXYtPnBjaSxidWYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK3ZiaV9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgY3g4OF9idWZmZXIgICAgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2YixzdHJ1Y3QgY3g4OF9idWZmZXIsdmIpOworCXN0cnVjdCBjeDg4X2J1ZmZlciAgICAqcHJldjsKKwlzdHJ1Y3QgY3g4ODAwX2ZoICAgICAgKmZoICAgPSB2cS0+cHJpdl9kYXRhOworCXN0cnVjdCBjeDg4MDBfZGV2ICAgICAqZGV2ICA9IGZoLT5kZXY7CisJc3RydWN0IGN4ODhfZG1hcXVldWUgICpxICAgID0gJmRldi0+dmJpcTsKKworCS8qIGFkZCBqdW1wIHRvIHN0b3BwZXIgKi8KKwlidWYtPnJpc2Muam1wWzBdID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QIHwgUklTQ19JUlExIHwgUklTQ19DTlRfSU5DKTsKKwlidWYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIocS0+c3RvcHBlci5kbWEpOworCisJaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwmcS0+YWN0aXZlKTsKKwkJY3g4ODAwX3N0YXJ0X3ZiaV9kbWEoZGV2LCBxLCBidWYpOworCQlidWYtPnZiLnN0YXRlID0gU1RBVEVfQUNUSVZFOworCQlidWYtPmNvdW50ICAgID0gcS0+Y291bnQrKzsKKwkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKwkJZHByaW50aygyLCJbJXAvJWRdIHZiaV9xdWV1ZSAtIGZpcnN0IGFjdGl2ZVxuIiwKKwkJCWJ1ZiwgYnVmLT52Yi5pKTsKKworCX0gZWxzZSB7CisJCXByZXYgPSBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3g4OF9idWZmZXIsIHZiLnF1ZXVlKTsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwmcS0+YWN0aXZlKTsKKwkJYnVmLT52Yi5zdGF0ZSA9IFNUQVRFX0FDVElWRTsKKwkJYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7CisJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7CisJCWRwcmludGsoMiwiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBhcHBlbmQgdG8gYWN0aXZlXG4iLAorCQkJYnVmLCBidWYtPnZiLmkpOworCX0KK30KKworc3RhdGljIHZvaWQgdmJpX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2YixzdHJ1Y3QgY3g4OF9idWZmZXIsdmIpOworCXN0cnVjdCBjeDg4MDBfZmggICAqZmggID0gcS0+cHJpdl9kYXRhOworCisJY3g4OF9mcmVlX2J1ZmZlcihmaC0+ZGV2LT5wY2ksYnVmKTsKK30KKworc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyBjeDg4MDBfdmJpX3FvcHMgPSB7CisJLmJ1Zl9zZXR1cCAgICA9IHZiaV9zZXR1cCwKKwkuYnVmX3ByZXBhcmUgID0gdmJpX3ByZXBhcmUsCisJLmJ1Zl9xdWV1ZSAgICA9IHZiaV9xdWV1ZSwKKwkuYnVmX3JlbGVhc2UgID0gdmJpX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDFmNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwpAQCAtMCwwICsxLDIyNzcgQEAKKy8qCisgKiAkSWQ6IGN4ODgtdmlkZW8uYyx2IDEuNTggMjAwNS8wMy8wNyAxNTo1ODowNSBrcmF4ZWwgRXhwICQKKyAqCisgKiBkZXZpY2UgZHJpdmVyIGZvciBDb25leGFudCAyMzg4eCBiYXNlZCBUViBjYXJkcworICogdmlkZW80bGludXggdmlkZW8gaW50ZXJmYWNlCisgKgorICogKGMpIDIwMDMtMDQgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAiY3g4OC5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oInY0bDIgZHJpdmVyIG1vZHVsZSBmb3IgY3gyMzg4eCBiYXNlZCBUViBjYXJkcyIpOworTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19ucltdID0ge1swIC4uLiAoQ1g4OF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9Oworc3RhdGljIHVuc2lnbmVkIGludCB2YmlfbnJbXSAgID0ge1swIC4uLiAoQ1g4OF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9Oworc3RhdGljIHVuc2lnbmVkIGludCByYWRpb19ucltdID0ge1swIC4uLiAoQ1g4OF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9OworCittb2R1bGVfcGFyYW1fYXJyYXkodmlkZW9fbnIsIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkodmJpX25yLCAgIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocmFkaW9fbnIsIGludCwgTlVMTCwgMDQ0NCk7CisKK01PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsInZpZGVvIGRldmljZSBudW1iZXJzIik7CitNT0RVTEVfUEFSTV9ERVNDKHZiaV9uciwidmJpIGRldmljZSBudW1iZXJzIik7CitNT0RVTEVfUEFSTV9ERVNDKHJhZGlvX25yLCJyYWRpbyBkZXZpY2UgbnVtYmVycyIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX2RlYnVnID0gMDsKK21vZHVsZV9wYXJhbSh2aWRlb19kZWJ1ZyxpbnQsMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW3ZpZGVvXSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGlycV9kZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oaXJxX2RlYnVnLGludCwwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW0lSUSBoYW5kbGVyXSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHZpZF9saW1pdCA9IDE2OworbW9kdWxlX3BhcmFtKHZpZF9saW1pdCxpbnQsMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZF9saW1pdCwiY2FwdHVyZSBtZW1vcnkgbGltaXQgaW4gbWVnYWJ5dGVzIik7CisKKyNkZWZpbmUgZHByaW50ayhsZXZlbCxmbXQsIGFyZy4uLikJaWYgKHZpZGVvX2RlYnVnID49IGxldmVsKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzLzA6ICIgZm10LCBkZXYtPmNvcmUtPm5hbWUgLCAjIyBhcmcpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgTElTVF9IRUFEKGN4ODgwMF9kZXZsaXN0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc3RhdGljIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgc3RydWN0IGN4ODhfdHZub3JtIHR2bm9ybXNbXSA9IHsKKwl7CisJCS5uYW1lICAgICAgPSAiTlRTQy1NIiwKKwkJLmlkICAgICAgICA9IFY0TDJfU1REX05UU0NfTSwKKwkJLmN4aWZvcm1hdCA9IFZpZGVvRm9ybWF0TlRTQywKKwkJLmN4b2Zvcm1hdCA9IDB4MTgxZjAwMDgsCisJfSx7CisJCS5uYW1lICAgICAgPSAiTlRTQy1KUCIsCisJCS5pZCAgICAgICAgPSBWNEwyX1NURF9OVFNDX01fSlAsCisJCS5jeGlmb3JtYXQgPSBWaWRlb0Zvcm1hdE5UU0NKYXBhbiwKKwkJLmN4b2Zvcm1hdCA9IDB4MTgxZjAwMDgsCisjaWYgMAorCX0seworCQkubmFtZSAgICAgID0gIk5UU0MtNC40MyIsCisJCS5pZCAgICAgICAgPSBGSVhNRSwKKwkJLmN4aWZvcm1hdCA9IFZpZGVvRm9ybWF0TlRTQzQ0MywKKwkJLmN4b2Zvcm1hdCA9IDB4MTgxZjAwMDgsCisjZW5kaWYKKwl9LHsKKwkJLm5hbWUgICAgICA9ICJQQUwtQkciLAorCQkuaWQgICAgICAgID0gVjRMMl9TVERfUEFMX0JHLAorCQkuY3hpZm9ybWF0ID0gVmlkZW9Gb3JtYXRQQUwsCisJCS5jeG9mb3JtYXQgPSAweDE4MWYwMDA4LAorCX0seworCQkubmFtZSAgICAgID0gIlBBTC1ESyIsCisJCS5pZCAgICAgICAgPSBWNEwyX1NURF9QQUxfREssCisJCS5jeGlmb3JtYXQgPSBWaWRlb0Zvcm1hdFBBTCwKKwkJLmN4b2Zvcm1hdCA9IDB4MTgxZjAwMDgsCisJfSx7CisJCS5uYW1lICAgICAgPSAiUEFMLUkiLAorCQkuaWQgICAgICAgID0gVjRMMl9TVERfUEFMX0ksCisJCS5jeGlmb3JtYXQgPSBWaWRlb0Zvcm1hdFBBTCwKKwkJLmN4b2Zvcm1hdCA9IDB4MTgxZjAwMDgsCisgICAgICAgIH0seworCQkubmFtZSAgICAgID0gIlBBTC1NIiwKKwkJLmlkICAgICAgICA9IFY0TDJfU1REX1BBTF9NLAorCQkuY3hpZm9ybWF0ID0gVmlkZW9Gb3JtYXRQQUxNLAorCQkuY3hvZm9ybWF0ID0gMHgxYzFmMDAwOCwKKwl9LHsKKwkJLm5hbWUgICAgICA9ICJQQUwtTiIsCisJCS5pZCAgICAgICAgPSBWNEwyX1NURF9QQUxfTiwKKwkJLmN4aWZvcm1hdCA9IFZpZGVvRm9ybWF0UEFMTiwKKwkJLmN4b2Zvcm1hdCA9IDB4MWMxZjAwMDgsCisJfSx7CisJCS5uYW1lICAgICAgPSAiUEFMLU5jIiwKKwkJLmlkICAgICAgICA9IFY0TDJfU1REX1BBTF9OYywKKwkJLmN4aWZvcm1hdCA9IFZpZGVvRm9ybWF0UEFMTkMsCisJCS5jeG9mb3JtYXQgPSAweDFjMWYwMDA4LAorCX0seworCQkubmFtZSAgICAgID0gIlBBTC02MCIsCisJCS5pZCAgICAgICAgPSBWNEwyX1NURF9QQUxfNjAsCisJCS5jeGlmb3JtYXQgPSBWaWRlb0Zvcm1hdFBBTDYwLAorCQkuY3hvZm9ybWF0ID0gMHgxODFmMDAwOCwKKwl9LHsKKwkJLm5hbWUgICAgICA9ICJTRUNBTS1MIiwKKwkJLmlkICAgICAgICA9IFY0TDJfU1REX1NFQ0FNX0wsCisJCS5jeGlmb3JtYXQgPSBWaWRlb0Zvcm1hdFNFQ0FNLAorCQkuY3hvZm9ybWF0ID0gMHgxODFmMDAwOCwKKwl9LHsKKwkJLm5hbWUgICAgICA9ICJTRUNBTS1ESyIsCisJCS5pZCAgICAgICAgPSBWNEwyX1NURF9TRUNBTV9ESywKKwkJLmN4aWZvcm1hdCA9IFZpZGVvRm9ybWF0U0VDQU0sCisJCS5jeG9mb3JtYXQgPSAweDE4MWYwMDA4LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3g4ODAwX2ZtdCBmb3JtYXRzW10gPSB7CisJeworCQkubmFtZSAgICAgPSAiOCBicHAsIGdyYXkiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfR1JFWSwKKwkJLmN4Zm9ybWF0ID0gQ29sb3JGb3JtYXRZOCwKKwkJLmRlcHRoICAgID0gOCwKKwkJLmZsYWdzICAgID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKKwl9LHsKKwkJLm5hbWUgICAgID0gIjE1IGJwcCBSR0IsIGxlIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1JHQjU1NSwKKwkJLmN4Zm9ybWF0ID0gQ29sb3JGb3JtYXRSR0IxNSwKKwkJLmRlcHRoICAgID0gMTYsCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSx7CisJCS5uYW1lICAgICA9ICIxNSBicHAgUkdCLCBiZSIsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9SR0I1NTVYLAorCQkuY3hmb3JtYXQgPSBDb2xvckZvcm1hdFJHQjE1IHwgQ29sb3JGb3JtYXRCU1dBUCwKKwkJLmRlcHRoICAgID0gMTYsCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSx7CisJCS5uYW1lICAgICA9ICIxNiBicHAgUkdCLCBsZSIsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9SR0I1NjUsCisJCS5jeGZvcm1hdCA9IENvbG9yRm9ybWF0UkdCMTYsCisJCS5kZXB0aCAgICA9IDE2LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0seworCQkubmFtZSAgICAgPSAiMTYgYnBwIFJHQiwgYmUiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfUkdCNTY1WCwKKwkJLmN4Zm9ybWF0ID0gQ29sb3JGb3JtYXRSR0IxNiB8IENvbG9yRm9ybWF0QlNXQVAsCisJCS5kZXB0aCAgICA9IDE2LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0seworCQkubmFtZSAgICAgPSAiMjQgYnBwIFJHQiwgbGUiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfQkdSMjQsCisJCS5jeGZvcm1hdCA9IENvbG9yRm9ybWF0UkdCMjQsCisJCS5kZXB0aCAgICA9IDI0LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0seworCQkubmFtZSAgICAgPSAiMzIgYnBwIFJHQiwgbGUiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfQkdSMzIsCisJCS5jeGZvcm1hdCA9IENvbG9yRm9ybWF0UkdCMzIsCisJCS5kZXB0aCAgICA9IDMyLAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0seworCQkubmFtZSAgICAgPSAiMzIgYnBwIFJHQiwgYmUiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfUkdCMzIsCisJCS5jeGZvcm1hdCA9IENvbG9yRm9ybWF0UkdCMzIgfCBDb2xvckZvcm1hdEJTV0FQIHwgQ29sb3JGb3JtYXRXU1dBUCwKKwkJLmRlcHRoICAgID0gMzIsCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSx7CisJCS5uYW1lICAgICA9ICI0OjI6MiwgcGFja2VkLCBZVVlWIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1lVWVYsCisJCS5jeGZvcm1hdCA9IENvbG9yRm9ybWF0WVVZMiwKKwkJLmRlcHRoICAgID0gMTYsCisJCS5mbGFncyAgICA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSx7CisJCS5uYW1lICAgICA9ICI0OjI6MiwgcGFja2VkLCBVWVZZIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1VZVlksCisJCS5jeGZvcm1hdCA9IENvbG9yRm9ybWF0WVVZMiB8IENvbG9yRm9ybWF0QlNXQVAsCisJCS5kZXB0aCAgICA9IDE2LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGN4ODgwMF9mbXQqIGZvcm1hdF9ieV9mb3VyY2ModW5zaWduZWQgaW50IGZvdXJjYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdHMpOyBpKyspCisJCWlmIChmb3JtYXRzW2ldLmZvdXJjYyA9PSBmb3VyY2MpCisJCQlyZXR1cm4gZm9ybWF0cytpOworCXJldHVybiBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbm9fY3RsID0geworCS5uYW1lICA9ICI0MiIsCisJLmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCit9OworCitzdGF0aWMgc3RydWN0IGN4ODhfY3RybCBjeDg4MDBfY3Rsc1tdID0geworCS8qIC0tLSB2aWRlbyAtLS0gKi8KKwl7CisJCS52ID0geworCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCQkJLm5hbWUgICAgICAgICAgPSAiQnJpZ2h0bmVzcyIsCisJCQkubWluaW11bSAgICAgICA9IDB4MDAsCisJCQkubWF4aW11bSAgICAgICA9IDB4ZmYsCisJCQkuc3RlcCAgICAgICAgICA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCX0sCisJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAxMjgsCisJCS5yZWcgICAgICAgICAgICAgICAgICAgPSBNT19DT05UUl9CUklHSFQsCisJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAweDAwZmYsCisJCS5zaGlmdCAgICAgICAgICAgICAgICAgPSAwLAorCX0seworCQkudiA9IHsKKwkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQ09OVFJBU1QsCisJCQkubmFtZSAgICAgICAgICA9ICJDb250cmFzdCIsCisJCQkubWluaW11bSAgICAgICA9IDAsCisJCQkubWF4aW11bSAgICAgICA9IDB4ZmYsCisJCQkuc3RlcCAgICAgICAgICA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCX0sCisJCS5yZWcgICAgICAgICAgICAgICAgICAgPSBNT19DT05UUl9CUklHSFQsCisJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAweGZmMDAsCisJCS5zaGlmdCAgICAgICAgICAgICAgICAgPSA4LAorCX0seworCQkudiA9IHsKKwkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfSFVFLAorCQkJLm5hbWUgICAgICAgICAgPSAiSHVlIiwKKwkJCS5taW5pbXVtICAgICAgID0gMCwKKwkJCS5tYXhpbXVtICAgICAgID0gMHhmZiwKKwkJCS5zdGVwICAgICAgICAgID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJfSwKKwkJLm9mZiAgICAgICAgICAgICAgICAgICA9IDAsCisJCS5yZWcgICAgICAgICAgICAgICAgICAgPSBNT19IVUUsCisJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAweDAwZmYsCisJCS5zaGlmdCAgICAgICAgICAgICAgICAgPSAwLAorCX0seworCQkvKiBzdHJpY3RseSwgdGhpcyBvbmx5IGRlc2NyaWJlcyBvbmx5IFUgc2F0dXJhdGlvbi4KKwkJICogViBzYXR1cmF0aW9uIGlzIGhhbmRsZWQgc3BlY2lhbGx5IHRocm91Z2ggY29kZS4KKwkJICovCisJCS52ID0geworCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAorCQkJLm5hbWUgICAgICAgICAgPSAiU2F0dXJhdGlvbiIsCisJCQkubWluaW11bSAgICAgICA9IDAsCisJCQkubWF4aW11bSAgICAgICA9IDB4ZmYsCisJCQkuc3RlcCAgICAgICAgICA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCX0sCisJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAwLAorCQkucmVnICAgICAgICAgICAgICAgICAgID0gTU9fVVZfU0FUVVJBVElPTiwKKwkJLm1hc2sgICAgICAgICAgICAgICAgICA9IDB4MDBmZiwKKwkJLnNoaWZ0ICAgICAgICAgICAgICAgICA9IDAsCisJfSx7CisJLyogLS0tIGF1ZGlvIC0tLSAqLworCQkudiA9IHsKKwkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKKwkJCS5uYW1lICAgICAgICAgID0gIk11dGUiLAorCQkJLm1pbmltdW0gICAgICAgPSAwLAorCQkJLm1heGltdW0gICAgICAgPSAxLAorCQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQl9LAorCQkucmVnICAgICAgICAgICAgICAgICAgID0gQVVEX1ZPTF9DVEwsCisJCS5zcmVnICAgICAgICAgICAgICAgICAgPSBTSEFET1dfQVVEX1ZPTF9DVEwsCisJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAoMSA8PCA2KSwKKwkJLnNoaWZ0ICAgICAgICAgICAgICAgICA9IDYsCisJfSx7CisJCS52ID0geworCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19WT0xVTUUsCisJCQkubmFtZSAgICAgICAgICA9ICJWb2x1bWUiLAorCQkJLm1pbmltdW0gICAgICAgPSAwLAorCQkJLm1heGltdW0gICAgICAgPSAweDNmLAorCQkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQl9LAorCQkucmVnICAgICAgICAgICAgICAgICAgID0gQVVEX1ZPTF9DVEwsCisJCS5zcmVnICAgICAgICAgICAgICAgICAgPSBTSEFET1dfQVVEX1ZPTF9DVEwsCisJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAweDNmLAorCQkuc2hpZnQgICAgICAgICAgICAgICAgID0gMCwKKwl9LHsKKwkJLnYgPSB7CisJCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UsCisJCQkubmFtZSAgICAgICAgICA9ICJCYWxhbmNlIiwKKwkJCS5taW5pbXVtICAgICAgID0gMCwKKwkJCS5tYXhpbXVtICAgICAgID0gMHg3ZiwKKwkJCS5zdGVwICAgICAgICAgID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHg0MCwKKwkJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJfSwKKwkJLnJlZyAgICAgICAgICAgICAgICAgICA9IEFVRF9CQUxfQ1RMLAorCQkuc3JlZyAgICAgICAgICAgICAgICAgID0gU0hBRE9XX0FVRF9CQUxfQ1RMLAorCQkubWFzayAgICAgICAgICAgICAgICAgID0gMHg3ZiwKKwkJLnNoaWZ0ICAgICAgICAgICAgICAgICA9IDAsCisJfQorfTsKK2NvbnN0IGludCBDWDg4MDBfQ1RMUyA9IEFSUkFZX1NJWkUoY3g4ODAwX2N0bHMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiByZXNvdXJjZSBtYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBpbnQgcmVzX2dldChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgY3g4ODAwX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlpZiAoZmgtPnJlc291cmNlcyAmIGJpdCkKKwkJLyogaGF2ZSBpdCBhbHJlYWR5IGFsbG9jYXRlZCAqLworCQlyZXR1cm4gMTsKKworCS8qIGlzIGl0IGZyZWU/ICovCisJZG93bigmZGV2LT5sb2NrKTsKKwlpZiAoZGV2LT5yZXNvdXJjZXMgJiBiaXQpIHsKKwkJLyogbm8sIHNvbWVvbmUgZWxzZSB1c2VzIGl0ICovCisJCXVwKCZkZXYtPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisJLyogaXQncyBmcmVlLCBncmFiIGl0ICovCisJZmgtPnJlc291cmNlcyAgfD0gYml0OworCWRldi0+cmVzb3VyY2VzIHw9IGJpdDsKKwlkcHJpbnRrKDEsInJlczogZ2V0ICVkXG4iLGJpdCk7CisJdXAoJmRldi0+bG9jayk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYworaW50IHJlc19jaGVjayhzdHJ1Y3QgY3g4ODAwX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlyZXR1cm4gKGZoLT5yZXNvdXJjZXMgJiBiaXQpOworfQorCitzdGF0aWMKK2ludCByZXNfbG9ja2VkKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBiaXQpCit7CisJcmV0dXJuIChkZXYtPnJlc291cmNlcyAmIGJpdCk7Cit9CisKK3N0YXRpYwordm9pZCByZXNfZnJlZShzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgY3g4ODAwX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJaWYgKChmaC0+cmVzb3VyY2VzICYgYml0cykgIT0gYml0cykKKwkJQlVHKCk7CisKKwlkb3duKCZkZXYtPmxvY2spOworCWZoLT5yZXNvdXJjZXMgICY9IH5iaXRzOworCWRldi0+cmVzb3VyY2VzICY9IH5iaXRzOworCWRwcmludGsoMSwicmVzOiBwdXQgJWRcbiIsYml0cyk7CisJdXAoJmRldi0+bG9jayk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHZpZGVvX211eChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKworCWRwcmludGsoMSwidmlkZW9fbXV4OiAlZCBbdm11eD0lZCxncGlvPTB4JXgsMHgleCwweCV4LDB4JXhdXG4iLAorCQlpbnB1dCwgSU5QVVQoaW5wdXQpLT52bXV4LAorCQlJTlBVVChpbnB1dCktPmdwaW8wLElOUFVUKGlucHV0KS0+Z3BpbzEsCisJCUlOUFVUKGlucHV0KS0+Z3BpbzIsSU5QVVQoaW5wdXQpLT5ncGlvMyk7CisJZGV2LT5jb3JlLT5pbnB1dCA9IGlucHV0OworCWN4X2FuZG9yKE1PX0lOUFVUX0ZPUk1BVCwgMHgwMyA8PCAxNCwgSU5QVVQoaW5wdXQpLT52bXV4IDw8IDE0KTsKKwljeF93cml0ZShNT19HUDNfSU8sIElOUFVUKGlucHV0KS0+Z3BpbzMpOworCWN4X3dyaXRlKE1PX0dQMF9JTywgSU5QVVQoaW5wdXQpLT5ncGlvMCk7CisJY3hfd3JpdGUoTU9fR1AxX0lPLCBJTlBVVChpbnB1dCktPmdwaW8xKTsKKwljeF93cml0ZShNT19HUDJfSU8sIElOUFVUKGlucHV0KS0+Z3BpbzIpOworCisJc3dpdGNoIChJTlBVVChpbnB1dCktPnR5cGUpIHsKKwljYXNlIENYODhfVk1VWF9TVklERU86CisJCWN4X3NldChNT19BRkVDRkdfSU8sICAgIDB4MDAwMDAwMDEpOworCQljeF9zZXQoTU9fSU5QVVRfRk9STUFULCAweDAwMDEwMDEwKTsKKwkJY3hfc2V0KE1PX0ZJTFRFUl9FVkVOLCAgMHgwMDAwMjAyMCk7CisJCWN4X3NldChNT19GSUxURVJfT0RELCAgIDB4MDAwMDIwMjApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljeF9jbGVhcihNT19BRkVDRkdfSU8sICAgIDB4MDAwMDAwMDEpOworCQljeF9jbGVhcihNT19JTlBVVF9GT1JNQVQsIDB4MDAwMTAwMTApOworCQljeF9jbGVhcihNT19GSUxURVJfRVZFTiwgIDB4MDAwMDIwMjApOworCQljeF9jbGVhcihNT19GSUxURVJfT0RELCAgIDB4MDAwMDIwMjApOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHN0YXJ0X3ZpZGVvX2RtYShzdHJ1Y3QgY3g4ODAwX2RldiAgICAqZGV2LAorCQkJICAgc3RydWN0IGN4ODhfZG1hcXVldWUgKnEsCisJCQkgICBzdHJ1Y3QgY3g4OF9idWZmZXIgICAqYnVmKQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisKKwkvKiBzZXR1cCBmaWZvICsgZm9ybWF0ICovCisJY3g4OF9zcmFtX2NoYW5uZWxfc2V0dXAoZGV2LT5jb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyMV0sCisJCQkJYnVmLT5icGwsIGJ1Zi0+cmlzYy5kbWEpOworCWN4ODhfc2V0X3NjYWxlKGRldi0+Y29yZSwgYnVmLT52Yi53aWR0aCwgYnVmLT52Yi5oZWlnaHQsIGJ1Zi0+dmIuZmllbGQpOworCWN4X3dyaXRlKE1PX0NPTE9SX0NUUkwsIGJ1Zi0+Zm10LT5jeGZvcm1hdCB8IENvbG9yRm9ybWF0R2FtbWEpOworCisJLyogcmVzZXQgY291bnRlciAqLworCWN4X3dyaXRlKE1PX1ZJRFlfR1BDTlRSTCxHUF9DT1VOVF9DT05UUk9MX1JFU0VUKTsKKwlxLT5jb3VudCA9IDE7CisKKwkvKiBlbmFibGUgaXJxcyAqLworCWN4X3NldChNT19QQ0lfSU5UTVNLLCBjb3JlLT5wY2lfaXJxbWFzayB8IDB4MDEpOworCWN4X3NldChNT19WSURfSU5UTVNLLCAweDBmMDAxMSk7CisKKwkvKiBlbmFibGUgY2FwdHVyZSAqLworCWN4X3NldChWSURfQ0FQVFVSRV9DT05UUk9MLDB4MDYpOworCisJLyogc3RhcnQgZG1hICovCisJY3hfc2V0KE1PX0RFVl9DTlRSTDIsICgxPDw1KSk7CisJY3hfc2V0KE1PX1ZJRF9ETUFDTlRSTCwgMHgxMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdG9wX3ZpZGVvX2RtYShzdHJ1Y3QgY3g4ODAwX2RldiAgICAqZGV2KQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisKKwkvKiBzdG9wIGRtYSAqLworCWN4X2NsZWFyKE1PX1ZJRF9ETUFDTlRSTCwgMHgxMSk7CisKKwkvKiBkaXNhYmxlIGNhcHR1cmUgKi8KKwljeF9jbGVhcihWSURfQ0FQVFVSRV9DT05UUk9MLDB4MDYpOworCisJLyogZGlzYWJsZSBpcnFzICovCisJY3hfY2xlYXIoTU9fUENJX0lOVE1TSywgMHgwMDAwMDEpOworCWN4X2NsZWFyKE1PX1ZJRF9JTlRNU0ssIDB4MGYwMDExKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXN0YXJ0X3ZpZGVvX3F1ZXVlKHN0cnVjdCBjeDg4MDBfZGV2ICAgICpkZXYsCisJCQkgICAgICAgc3RydWN0IGN4ODhfZG1hcXVldWUgKnEpCit7CisJc3RydWN0IGN4ODhfYnVmZmVyICpidWYsICpwcmV2OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlpZiAoIWxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKKwkgICAgICAgIGJ1ZiA9IGxpc3RfZW50cnkocS0+YWN0aXZlLm5leHQsIHN0cnVjdCBjeDg4X2J1ZmZlciwgdmIucXVldWUpOworCQlkcHJpbnRrKDIsInJlc3RhcnRfcXVldWUgWyVwLyVkXTogcmVzdGFydCBkbWFcbiIsCisJCQlidWYsIGJ1Zi0+dmIuaSk7CisJCXN0YXJ0X3ZpZGVvX2RtYShkZXYsIHEsIGJ1Zik7CisJCWxpc3RfZm9yX2VhY2goaXRlbSwmcS0+YWN0aXZlKSB7CisJCQlidWYgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBjeDg4X2J1ZmZlciwgdmIucXVldWUpOworCQkJYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7CisJCX0KKwkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJldiA9IE5VTEw7CisJZm9yICg7OykgeworCQlpZiAobGlzdF9lbXB0eSgmcS0+cXVldWVkKSkKKwkJCXJldHVybiAwOworCSAgICAgICAgYnVmID0gbGlzdF9lbnRyeShxLT5xdWV1ZWQubmV4dCwgc3RydWN0IGN4ODhfYnVmZmVyLCB2Yi5xdWV1ZSk7CisJCWlmIChOVUxMID09IHByZXYpIHsKKwkJCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsJnEtPmFjdGl2ZSk7CisJCQlzdGFydF92aWRlb19kbWEoZGV2LCBxLCBidWYpOworCQkJYnVmLT52Yi5zdGF0ZSA9IFNUQVRFX0FDVElWRTsKKwkJCWJ1Zi0+Y291bnQgICAgPSBxLT5jb3VudCsrOworCQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKwkJCWRwcmludGsoMiwiWyVwLyVkXSByZXN0YXJ0X3F1ZXVlIC0gZmlyc3QgYWN0aXZlXG4iLAorCQkJCWJ1ZixidWYtPnZiLmkpOworCisJCX0gZWxzZSBpZiAocHJldi0+dmIud2lkdGggID09IGJ1Zi0+dmIud2lkdGggICYmCisJCQkgICBwcmV2LT52Yi5oZWlnaHQgPT0gYnVmLT52Yi5oZWlnaHQgJiYKKwkJCSAgIHByZXYtPmZtdCAgICAgICA9PSBidWYtPmZtdCkgeworCQkJbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOworCQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwmcS0+YWN0aXZlKTsKKwkJCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CisJCQlidWYtPmNvdW50ICAgID0gcS0+Y291bnQrKzsKKwkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7CisJCQlkcHJpbnRrKDIsIlslcC8lZF0gcmVzdGFydF9xdWV1ZSAtIG1vdmUgdG8gYWN0aXZlXG4iLAorCQkJCWJ1ZixidWYtPnZiLmkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJldiA9IGJ1ZjsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50CitidWZmZXJfc2V0dXAoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKnNpemUpCit7CisJc3RydWN0IGN4ODgwMF9maCAqZmggPSBxLT5wcml2X2RhdGE7CisKKwkqc2l6ZSA9IGZoLT5mbXQtPmRlcHRoKmZoLT53aWR0aCpmaC0+aGVpZ2h0ID4+IDM7CisJaWYgKDAgPT0gKmNvdW50KQorCQkqY291bnQgPSAzMjsKKwl3aGlsZSAoKnNpemUgKiAqY291bnQgPiB2aWRfbGltaXQgKiAxMDI0ICogMTAyNCkKKwkJKCpjb3VudCktLTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkgICAgICAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQoreworCXN0cnVjdCBjeDg4MDBfZmggICAqZmggID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBjeDg4MDBfZGV2ICAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2YixzdHJ1Y3QgY3g4OF9idWZmZXIsdmIpOworCWludCByYywgaW5pdF9idWZmZXIgPSAwOworCisJQlVHX09OKE5VTEwgPT0gZmgtPmZtdCk7CisJaWYgKGZoLT53aWR0aCAgPCA0OCB8fCBmaC0+d2lkdGggID4gbm9ybV9tYXh3KGRldi0+Y29yZS0+dHZub3JtKSB8fAorCSAgICBmaC0+aGVpZ2h0IDwgMzIgfHwgZmgtPmhlaWdodCA+IG5vcm1fbWF4aChkZXYtPmNvcmUtPnR2bm9ybSkpCisJCXJldHVybiAtRUlOVkFMOworCWJ1Zi0+dmIuc2l6ZSA9IChmaC0+d2lkdGggKiBmaC0+aGVpZ2h0ICogZmgtPmZtdC0+ZGVwdGgpID4+IDM7CisJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBidWYtPnZiLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJ1Zi0+Zm10ICAgICAgICE9IGZoLT5mbXQgICAgfHwKKwkgICAgYnVmLT52Yi53aWR0aCAgIT0gZmgtPndpZHRoICB8fAorCSAgICBidWYtPnZiLmhlaWdodCAhPSBmaC0+aGVpZ2h0IHx8CisJICAgIGJ1Zi0+dmIuZmllbGQgICE9IGZpZWxkKSB7CisJCWJ1Zi0+Zm10ICAgICAgID0gZmgtPmZtdDsKKwkJYnVmLT52Yi53aWR0aCAgPSBmaC0+d2lkdGg7CisJCWJ1Zi0+dmIuaGVpZ2h0ID0gZmgtPmhlaWdodDsKKwkJYnVmLT52Yi5maWVsZCAgPSBmaWVsZDsKKwkJaW5pdF9idWZmZXIgPSAxOworCX0KKworCWlmIChTVEFURV9ORUVEU19JTklUID09IGJ1Zi0+dmIuc3RhdGUpIHsKKwkJaW5pdF9idWZmZXIgPSAxOworCQlpZiAoMCAhPSAocmMgPSB2aWRlb2J1Zl9pb2xvY2soZGV2LT5wY2ksJmJ1Zi0+dmIsTlVMTCkpKQorCQkJZ290byBmYWlsOworCX0KKworCWlmIChpbml0X2J1ZmZlcikgeworCQlidWYtPmJwbCA9IGJ1Zi0+dmIud2lkdGggKiBidWYtPmZtdC0+ZGVwdGggPj4gMzsKKwkJc3dpdGNoIChidWYtPnZiLmZpZWxkKSB7CisJCWNhc2UgVjRMMl9GSUVMRF9UT1A6CisJCQljeDg4X3Jpc2NfYnVmZmVyKGRldi0+cGNpLCAmYnVmLT5yaXNjLAorCQkJCQkgYnVmLT52Yi5kbWEuc2dsaXN0LCAwLCBVTlNFVCwKKwkJCQkJIGJ1Zi0+YnBsLCAwLCBidWYtPnZiLmhlaWdodCk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTToKKwkJCWN4ODhfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCQkJCSBidWYtPnZiLmRtYS5zZ2xpc3QsIFVOU0VULCAwLAorCQkJCQkgYnVmLT5icGwsIDAsIGJ1Zi0+dmIuaGVpZ2h0KTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKwkJCWN4ODhfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCQkJCSBidWYtPnZiLmRtYS5zZ2xpc3QsIDAsIGJ1Zi0+YnBsLAorCQkJCQkgYnVmLT5icGwsIGJ1Zi0+YnBsLAorCQkJCQkgYnVmLT52Yi5oZWlnaHQgPj4gMSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0ZJRUxEX1NFUV9UQjoKKwkJCWN4ODhfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCQkJCSBidWYtPnZiLmRtYS5zZ2xpc3QsCisJCQkJCSAwLCBidWYtPmJwbCAqIChidWYtPnZiLmhlaWdodCA+PiAxKSwKKwkJCQkJIGJ1Zi0+YnBsLCAwLAorCQkJCQkgYnVmLT52Yi5oZWlnaHQgPj4gMSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0ZJRUxEX1NFUV9CVDoKKwkJCWN4ODhfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCQkJCSBidWYtPnZiLmRtYS5zZ2xpc3QsCisJCQkJCSBidWYtPmJwbCAqIChidWYtPnZiLmhlaWdodCA+PiAxKSwgMCwKKwkJCQkJIGJ1Zi0+YnBsLCAwLAorCQkJCQkgYnVmLT52Yi5oZWlnaHQgPj4gMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJfQorCWRwcmludGsoMiwiWyVwLyVkXSBidWZmZXJfcHJlcGFyZSAtICVkeCVkICVkYnBwIFwiJXNcIiAtIGRtYT0weCUwOGx4XG4iLAorCQlidWYsIGJ1Zi0+dmIuaSwKKwkJZmgtPndpZHRoLCBmaC0+aGVpZ2h0LCBmaC0+Zm10LT5kZXB0aCwgZmgtPmZtdC0+bmFtZSwKKwkJKHVuc2lnbmVkIGxvbmcpYnVmLT5yaXNjLmRtYSk7CisKKwlidWYtPnZiLnN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7CisJcmV0dXJuIDA7CisKKyBmYWlsOgorCWN4ODhfZnJlZV9idWZmZXIoZGV2LT5wY2ksYnVmKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkCitidWZmZXJfcXVldWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IGN4ODhfYnVmZmVyICAgICpidWYgPSBjb250YWluZXJfb2YodmIsc3RydWN0IGN4ODhfYnVmZmVyLHZiKTsKKwlzdHJ1Y3QgY3g4OF9idWZmZXIgICAgKnByZXY7CisJc3RydWN0IGN4ODgwMF9maCAgICAgICpmaCAgID0gdnEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgY3g4ODAwX2RldiAgICAgKmRldiAgPSBmaC0+ZGV2OworCXN0cnVjdCBjeDg4X2RtYXF1ZXVlICAqcSAgICA9ICZkZXYtPnZpZHE7CisKKwkvKiBhZGQganVtcCB0byBzdG9wcGVyICovCisJYnVmLT5yaXNjLmptcFswXSA9IGNwdV90b19sZTMyKFJJU0NfSlVNUCB8IFJJU0NfSVJRMSB8IFJJU0NfQ05UX0lOQyk7CisJYnVmLT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKHEtPnN0b3BwZXIuZG1hKTsKKworCWlmICghbGlzdF9lbXB0eSgmcS0+cXVldWVkKSkgeworCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5xdWV1ZWQpOworCQlidWYtPnZiLnN0YXRlID0gU1RBVEVfUVVFVUVEOworCQlkcHJpbnRrKDIsIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIHF1ZXVlZFxuIiwKKwkJCWJ1ZiwgYnVmLT52Yi5pKTsKKworCX0gZWxzZSBpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5hY3RpdmUpOworCQlzdGFydF92aWRlb19kbWEoZGV2LCBxLCBidWYpOworCQlidWYtPnZiLnN0YXRlID0gU1RBVEVfQUNUSVZFOworCQlidWYtPmNvdW50ICAgID0gcS0+Y291bnQrKzsKKwkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKwkJZHByaW50aygyLCJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IGFjdGl2ZVxuIiwKKwkJCWJ1ZiwgYnVmLT52Yi5pKTsKKworCX0gZWxzZSB7CisJCXByZXYgPSBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3g4OF9idWZmZXIsIHZiLnF1ZXVlKTsKKwkJaWYgKHByZXYtPnZiLndpZHRoICA9PSBidWYtPnZiLndpZHRoICAmJgorCQkgICAgcHJldi0+dmIuaGVpZ2h0ID09IGJ1Zi0+dmIuaGVpZ2h0ICYmCisJCSAgICBwcmV2LT5mbXQgICAgICAgPT0gYnVmLT5mbXQpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsJnEtPmFjdGl2ZSk7CisJCQlidWYtPnZiLnN0YXRlID0gU1RBVEVfQUNUSVZFOworCQkJYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7CisJCQlwcmV2LT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOworCQkJZHByaW50aygyLCJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBhY3RpdmVcbiIsCisJCQkJYnVmLCBidWYtPnZiLmkpOworCisJCX0gZWxzZSB7CisJCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5xdWV1ZWQpOworCQkJYnVmLT52Yi5zdGF0ZSA9IFNUQVRFX1FVRVVFRDsKKwkJCWRwcmludGsoMiwiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBxdWV1ZWRcbiIsCisJCQkJYnVmLCBidWYtPnZiLmkpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBidWZmZXJfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBjeDg4X2J1ZmZlcix2Yik7CisJc3RydWN0IGN4ODgwMF9maCAgICpmaCAgPSBxLT5wcml2X2RhdGE7CisKKwljeDg4X2ZyZWVfYnVmZmVyKGZoLT5kZXYtPnBjaSxidWYpOworfQorCitzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4ODgwMF92aWRlb19xb3BzID0geworCS5idWZfc2V0dXAgICAgPSBidWZmZXJfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlICA9IGJ1ZmZlcl9wcmVwYXJlLAorCS5idWZfcXVldWUgICAgPSBidWZmZXJfcXVldWUsCisJLmJ1Zl9yZWxlYXNlICA9IGJ1ZmZlcl9yZWxlYXNlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAwIC8qIG92ZXJsYXkgc3VwcG9ydCBub3QgZmluaXNoZWQgeWV0ICovCitzdGF0aWMgdTMyKiBvdl9yaXNjX2ZpZWxkKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCBjeDg4MDBfZmggKmZoLAorCQkJICB1MzIgKnJwLCBzdHJ1Y3QgYnRjeF9za2lwbGlzdCAqc2tpcHMsCisJCQkgIHUzMiBzeW5jX2xpbmUsIGludCBza2lwX2V2ZW4sIGludCBza2lwX29kZCkKK3sKKwlpbnQgbGluZSxtYXh5LHN0YXJ0LGVuZCxza2lwLG5za2lwczsKKwl1MzIgcmkscmE7CisJdTMyIGFkZHI7CisKKwkvKiBzeW5jIGluc3RydWN0aW9uICovCisJKihycCsrKSA9IGNwdV90b19sZTMyKFJJU0NfUkVTWU5DIHwgc3luY19saW5lKTsKKworCWFkZHIgID0gKHVuc2lnbmVkIGxvbmcpZGV2LT5mYnVmLmJhc2U7CisJYWRkciArPSBkZXYtPmZidWYuZm10LmJ5dGVzcGVybGluZSAqIGZoLT53aW4udy50b3A7CisJYWRkciArPSAoZmgtPmZtdC0+ZGVwdGggPj4gMykgICAgICAqIGZoLT53aW4udy5sZWZ0OworCisJLyogc2NhbiBsaW5lcyAqLworCWZvciAobWF4eSA9IC0xLCBsaW5lID0gMDsgbGluZSA8IGZoLT53aW4udy5oZWlnaHQ7CisJICAgICBsaW5lKyssIGFkZHIgKz0gZGV2LT5mYnVmLmZtdC5ieXRlc3BlcmxpbmUpIHsKKwkJaWYgKChsaW5lJTIpID09IDAgICYmICBza2lwX2V2ZW4pCisJCQljb250aW51ZTsKKwkJaWYgKChsaW5lJTIpID09IDEgICYmICBza2lwX29kZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGNhbGN1bGF0ZSBjbGlwcGluZyAqLworCQlpZiAobGluZSA+IG1heHkpCisJCQlidGN4X2NhbGNfc2tpcHMobGluZSwgZmgtPndpbi53LndpZHRoLCAmbWF4eSwKKwkJCQkJc2tpcHMsICZuc2tpcHMsIGZoLT5jbGlwcywgZmgtPm5jbGlwcyk7CisKKwkJLyogd3JpdGUgb3V0IHJpc2MgY29kZSAqLworCQlmb3IgKHN0YXJ0ID0gMCwgc2tpcCA9IDA7IHN0YXJ0IDwgZmgtPndpbi53LndpZHRoOyBzdGFydCA9IGVuZCkgeworCQkJaWYgKHNraXAgPj0gbnNraXBzKSB7CisJCQkJcmkgID0gUklTQ19XUklURTsKKwkJCQllbmQgPSBmaC0+d2luLncud2lkdGg7CisJCQl9IGVsc2UgaWYgKHN0YXJ0IDwgc2tpcHNbc2tpcF0uc3RhcnQpIHsKKwkJCQlyaSAgPSBSSVNDX1dSSVRFOworCQkJCWVuZCA9IHNraXBzW3NraXBdLnN0YXJ0OworCQkJfSBlbHNlIHsKKwkJCQlyaSAgPSBSSVNDX1NLSVA7CisJCQkJZW5kID0gc2tpcHNbc2tpcF0uZW5kOworCQkJCXNraXArKzsKKwkJCX0KKwkJCWlmIChSSVNDX1dSSVRFID09IHJpKQorCQkJCXJhID0gYWRkciArIChmaC0+Zm10LT5kZXB0aD4+Mykqc3RhcnQ7CisJCQllbHNlCisJCQkJcmEgPSAwOworCisJCQlpZiAoMCA9PSBzdGFydCkKKwkJCQlyaSB8PSBSSVNDX1NPTDsKKwkJCWlmIChmaC0+d2luLncud2lkdGggPT0gZW5kKQorCQkJCXJpIHw9IFJJU0NfRU9MOworCQkJcmkgfD0gKGZoLT5mbXQtPmRlcHRoPj4zKSAqIChlbmQtc3RhcnQpOworCisJCQkqKHJwKyspPWNwdV90b19sZTMyKHJpKTsKKwkJCWlmICgwICE9IHJhKQorCQkJCSoocnArKyk9Y3B1X3RvX2xlMzIocmEpOworCQl9CisJfQorCWtmcmVlKHNraXBzKTsKKwlyZXR1cm4gcnA7Cit9CisKK3N0YXRpYyBpbnQgb3ZfcmlzY19mcmFtZShzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgY3g4ODAwX2ZoICpmaCwKKwkJCSBzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYnRjeF9za2lwbGlzdCAqc2tpcHM7CisJdTMyIGluc3RydWN0aW9ucyxmaWVsZHM7CisJdTMyICpycDsKKwlpbnQgcmM7CisKKwkvKiBza2lwIGxpc3QgZm9yIHdpbmRvdyBjbGlwcGluZyAqLworCWlmIChOVUxMID09IChza2lwcyA9IGttYWxsb2Moc2l6ZW9mKCpza2lwcykgKiBmaC0+bmNsaXBzLEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmaWVsZHMgPSAwOworCWlmIChWNEwyX0ZJRUxEX0hBU19UT1AoZmgtPndpbi5maWVsZCkpCisJCWZpZWxkcysrOworCWlmIChWNEwyX0ZJRUxEX0hBU19CT1RUT00oZmgtPndpbi5maWVsZCkpCisJCWZpZWxkcysrOworCisgICAgICAgIC8qIGVzdGltYXRlIHJpc2MgbWVtOiB3b3JzdCBjYXNlIGlzIChjbGlwKzEpICogbGluZXMgaW5zdHJ1Y3Rpb25zCisgICAgICAgICAgICsgc3luY3MgKyBqdW1wIChhbGwgMiBkd29yZHMpICovCisJaW5zdHJ1Y3Rpb25zICA9IChmaC0+bmNsaXBzKzEpICogZmgtPndpbi53LmhlaWdodDsKKwlpbnN0cnVjdGlvbnMgKz0gMyArIDQ7CisJaWYgKChyYyA9IGJ0Y3hfcmlzY21lbV9hbGxvYyhkZXYtPnBjaSwmYnVmLT5yaXNjLGluc3RydWN0aW9ucyo4KSkgPCAwKSB7CisJCWtmcmVlKHNraXBzKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIHdyaXRlIHJpc2MgaW5zdHJ1Y3Rpb25zICovCisJcnAgPSBidWYtPnJpc2MuY3B1OworCXN3aXRjaCAoZmgtPndpbi5maWVsZCkgeworCWNhc2UgVjRMMl9GSUVMRF9UT1A6CisJCXJwID0gb3ZfcmlzY19maWVsZChkZXYsIGZoLCBycCwgc2tpcHMsIDAsICAgICAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTToKKwkJcnAgPSBvdl9yaXNjX2ZpZWxkKGRldiwgZmgsIHJwLCBza2lwcywgMHgyMDAsIDAsIDApOworCQlicmVhazsKKwljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKwkJcnAgPSBvdl9yaXNjX2ZpZWxkKGRldiwgZmgsIHJwLCBza2lwcywgMCwgICAgIDAsIDEpOworCQlycCA9IG92X3Jpc2NfZmllbGQoZGV2LCBmaCwgcnAsIHNraXBzLCAweDIwMCwgMSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCS8qIHNhdmUgcG9pbnRlciB0byBqbXAgaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqLworCWJ1Zi0+cmlzYy5qbXAgPSBycDsKKwlrZnJlZShza2lwcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X3dpbmRvdyhzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl93aW5kb3cgKndpbikKK3sKKwllbnVtIHY0bDJfZmllbGQgZmllbGQ7CisJaW50IG1heHcsIG1heGg7CisKKwlpZiAoTlVMTCA9PSBkZXYtPmZidWYuYmFzZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHdpbi0+dy53aWR0aCA8IDQ4IHx8IHdpbi0+dy5oZWlnaHQgPCAgMzIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh3aW4tPmNsaXBjb3VudCA+IDIwNDgpCisJCXJldHVybiAtRUlOVkFMOworCisJZmllbGQgPSB3aW4tPmZpZWxkOworCW1heHcgID0gbm9ybV9tYXh3KGNvcmUtPnR2bm9ybSk7CisJbWF4aCAgPSBub3JtX21heGgoY29yZS0+dHZub3JtKTsKKworCWlmIChWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCkgeworICAgICAgICAgICAgICAgIGZpZWxkID0gKHdpbi0+dy5oZWlnaHQgPiBtYXhoLzIpCisgICAgICAgICAgICAgICAgICAgICAgICA/IFY0TDJfRklFTERfSU5URVJMQUNFRAorICAgICAgICAgICAgICAgICAgICAgICAgOiBWNEwyX0ZJRUxEX1RPUDsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICAgIGNhc2UgVjRMMl9GSUVMRF9UT1A6CisgICAgICAgIGNhc2UgVjRMMl9GSUVMRF9CT1RUT006CisgICAgICAgICAgICAgICAgbWF4aCA9IG1heGggLyAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisJd2luLT5maWVsZCA9IGZpZWxkOworCWlmICh3aW4tPncud2lkdGggPiBtYXh3KQorCQl3aW4tPncud2lkdGggPSBtYXh3OworCWlmICh3aW4tPncuaGVpZ2h0ID4gbWF4aCkKKwkJd2luLT53LmhlaWdodCA9IG1heGg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfd2luZG93KHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCBjeDg4MDBfZmggKmZoLAorCQkJc3RydWN0IHY0bDJfd2luZG93ICp3aW4pCit7CisJc3RydWN0IHY0bDJfY2xpcCAqY2xpcHMgPSBOVUxMOworCWludCBuLHNpemUscmV0dmFsID0gMDsKKworCWlmIChOVUxMID09IGZoLT5mbXQpCisJCXJldHVybiAtRUlOVkFMOworCXJldHZhbCA9IHZlcmlmeV93aW5kb3coZGV2LHdpbik7CisJaWYgKDAgIT0gcmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyogY29weSBjbGlwcyAgLS0gIGx1Y2tpbHkgdjRsMSArIHY0bDIgYXJlIGJpbmFyeQorCSAgIGNvbXBhdGlibGUgaGVyZSAuLi4qLworCW4gPSB3aW4tPmNsaXBjb3VudDsKKwlzaXplID0gc2l6ZW9mKCpjbGlwcykqKG4rNCk7CisJY2xpcHMgPSBrbWFsbG9jKHNpemUsR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gY2xpcHMpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChuID4gMCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoY2xpcHMsd2luLT5jbGlwcyxzaXplb2Yoc3RydWN0IHY0bDJfY2xpcCkqbikpIHsKKwkJCWtmcmVlKGNsaXBzKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJLyogY2xpcCBhZ2FpbnN0IHNjcmVlbiAqLworCWlmIChOVUxMICE9IGRldi0+ZmJ1Zi5iYXNlKQorCQluID0gYnRjeF9zY3JlZW5fY2xpcHMoZGV2LT5mYnVmLmZtdC53aWR0aCwgZGV2LT5mYnVmLmZtdC5oZWlnaHQsCisJCQkJICAgICAgJndpbi0+dywgY2xpcHMsIG4pOworCWJ0Y3hfc29ydF9jbGlwcyhjbGlwcyxuKTsKKworCS8qIDQtYnl0ZSBhbGlnbm1lbnRzICovCisJc3dpdGNoIChmaC0+Zm10LT5kZXB0aCkgeworCWNhc2UgODoKKwljYXNlIDI0OgorCQlidGN4X2FsaWduKCZ3aW4tPncsIGNsaXBzLCBuLCAzKTsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJYnRjeF9hbGlnbigmd2luLT53LCBjbGlwcywgbiwgMSk7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCS8qIG5vIGFsaWdubWVudCBmaXh1cHMgbmVlZGVkICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWRvd24oJmZoLT52aWRxLmxvY2spOworCWlmIChmaC0+Y2xpcHMpCisJCWtmcmVlKGZoLT5jbGlwcyk7CisJZmgtPmNsaXBzICAgID0gY2xpcHM7CisJZmgtPm5jbGlwcyAgID0gbjsKKwlmaC0+d2luICAgICAgPSAqd2luOworI2lmIDAKKwlmaC0+b3Yuc2V0dXBfb2sgPSAxOworI2VuZGlmCisKKwkvKiB1cGRhdGUgb3ZlcmxheSBpZiBuZWVkZWQgKi8KKwlyZXR2YWwgPSAwOworI2lmIDAKKwlpZiAoY2hlY2tfYnRyZXMoZmgsIFJFU09VUkNFX09WRVJMQVkpKSB7CisJCXN0cnVjdCBidHR2X2J1ZmZlciAqbmV3OworCisJCW5ldyA9IHZpZGVvYnVmX2FsbG9jKHNpemVvZigqbmV3KSk7CisJCWJ0dHZfb3ZlcmxheV9yaXNjKGJ0diwgJmZoLT5vdiwgZmgtPm92Zm10LCBuZXcpOworCQlyZXR2YWwgPSBidHR2X3N3aXRjaF9vdmVybGF5KGJ0dixmaCxuZXcpOworCX0KKyNlbmRpZgorCXVwKCZmaC0+dmlkcS5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F1ZXVlKiBnZXRfcXVldWUoc3RydWN0IGN4ODgwMF9maCAqZmgpCit7CisJc3dpdGNoIChmaC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlyZXR1cm4gJmZoLT52aWRxOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRToKKwkJcmV0dXJuICZmaC0+dmJpcTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGdldF9yZXNzb3VyY2Uoc3RydWN0IGN4ODgwMF9maCAqZmgpCit7CisJc3dpdGNoIChmaC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlyZXR1cm4gUkVTT1VSQ0VfVklERU87CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlyZXR1cm4gUkVTT1VSQ0VfVkJJOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBjeDg4MDBfZGV2ICpoLCpkZXYgPSBOVUxMOworCXN0cnVjdCBjeDg4MDBfZmggKmZoOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUgPSAwOworCWludCByYWRpbyA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsJmN4ODgwMF9kZXZsaXN0KSB7CisJCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjeDg4MDBfZGV2LCBkZXZsaXN0KTsKKwkJaWYgKGgtPnZpZGVvX2Rldi0+bWlub3IgPT0gbWlub3IpIHsKKwkJCWRldiAgPSBoOworCQkJdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJfQorCQlpZiAoaC0+dmJpX2Rldi0+bWlub3IgPT0gbWlub3IpIHsKKwkJCWRldiAgPSBoOworCQkJdHlwZSA9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU7CisJCX0KKwkJaWYgKGgtPnJhZGlvX2RldiAmJgorCQkgICAgaC0+cmFkaW9fZGV2LT5taW5vciA9PSBtaW5vcikgeworCQkJcmFkaW8gPSAxOworCQkJZGV2ICAgPSBoOworCQl9CisJfQorCWlmIChOVUxMID09IGRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkcHJpbnRrKDEsIm9wZW4gbWlub3I9JWQgcmFkaW89JWQgdHlwZT0lc1xuIiwKKwkJbWlub3IscmFkaW8sdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKKworCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCisJZmggPSBrbWFsbG9jKHNpemVvZigqZmgpLEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGZoKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmgsMCxzaXplb2YoKmZoKSk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CisJZmgtPmRldiAgICAgID0gZGV2OworCWZoLT5yYWRpbyAgICA9IHJhZGlvOworCWZoLT50eXBlICAgICA9IHR5cGU7CisJZmgtPndpZHRoICAgID0gMzIwOworCWZoLT5oZWlnaHQgICA9IDI0MDsKKwlmaC0+Zm10ICAgICAgPSBmb3JtYXRfYnlfZm91cmNjKFY0TDJfUElYX0ZNVF9CR1IyNCk7CisKKwl2aWRlb2J1Zl9xdWV1ZV9pbml0KCZmaC0+dmlkcSwgJmN4ODgwMF92aWRlb19xb3BzLAorCQkJICAgIGRldi0+cGNpLCAmZGV2LT5zbG9jaywKKwkJCSAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisJCQkgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAorCQkJICAgIHNpemVvZihzdHJ1Y3QgY3g4OF9idWZmZXIpLAorCQkJICAgIGZoKTsKKwl2aWRlb2J1Zl9xdWV1ZV9pbml0KCZmaC0+dmJpcSwgJmN4ODgwMF92YmlfcW9wcywKKwkJCSAgICBkZXYtPnBjaSwgJmRldi0+c2xvY2ssCisJCQkgICAgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSwKKwkJCSAgICBWNEwyX0ZJRUxEX1NFUV9UQiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGN4ODhfYnVmZmVyKSwKKwkJCSAgICBmaCk7CisKKwlpZiAoZmgtPnJhZGlvKSB7CisJCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisJCWludCBib2FyZCA9IGNvcmUtPmJvYXJkOworCQlkcHJpbnRrKDEsInZpZGVvX29wZW46IHNldHRpbmcgcmFkaW8gZGV2aWNlXG4iKTsKKwkJY3hfd3JpdGUoTU9fR1AwX0lPLCBjeDg4X2JvYXJkc1tib2FyZF0ucmFkaW8uZ3BpbzApOworCQljeF93cml0ZShNT19HUDFfSU8sIGN4ODhfYm9hcmRzW2JvYXJkXS5yYWRpby5ncGlvMSk7CisJCWN4X3dyaXRlKE1PX0dQMl9JTywgY3g4OF9ib2FyZHNbYm9hcmRdLnJhZGlvLmdwaW8yKTsKKwkJY3hfd3JpdGUoTU9fR1AzX0lPLCBjeDg4X2JvYXJkc1tib2FyZF0ucmFkaW8uZ3BpbzMpOworCQlkZXYtPmNvcmUtPnR2YXVkaW8gPSBXV19GTTsKKwkJY3g4OF9zZXRfdHZhdWRpbyhjb3JlKTsKKwkJY3g4OF9zZXRfc3RlcmVvKGNvcmUsVjRMMl9UVU5FUl9NT0RFX1NURVJFTywxKTsKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxBVURDX1NFVF9SQURJTyxOVUxMKTsKKwl9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit2aWRlb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgY3g4ODAwX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoZmgtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJaWYgKHJlc19sb2NrZWQoZmgtPmRldixSRVNPVVJDRV9WSURFTykpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gdmlkZW9idWZfcmVhZF9vbmUoJmZoLT52aWRxLCBkYXRhLCBjb3VudCwgcHBvcywKKwkJCQkJIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCWlmICghcmVzX2dldChmaC0+ZGV2LGZoLFJFU09VUkNFX1ZCSSkpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gdmlkZW9idWZfcmVhZF9zdHJlYW0oJmZoLT52YmlxLCBkYXRhLCBjb3VudCwgcHBvcywgMSwKKwkJCQkJICAgIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit2aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGN4ODgwMF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGN4ODhfYnVmZmVyICpidWY7CisKKwlpZiAoVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSA9PSBmaC0+dHlwZSkgeworCQlpZiAoIXJlc19nZXQoZmgtPmRldixmaCxSRVNPVVJDRV9WQkkpKQorCQkJcmV0dXJuIFBPTExFUlI7CisJCXJldHVybiB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxlLCAmZmgtPnZiaXEsIHdhaXQpOworCX0KKworCWlmIChyZXNfY2hlY2soZmgsUkVTT1VSQ0VfVklERU8pKSB7CisJCS8qIHN0cmVhbWluZyBjYXB0dXJlICovCisJCWlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcS5zdHJlYW0pKQorCQkJcmV0dXJuIFBPTExFUlI7CisJCWJ1ZiA9IGxpc3RfZW50cnkoZmgtPnZpZHEuc3RyZWFtLm5leHQsc3RydWN0IGN4ODhfYnVmZmVyLHZiLnN0cmVhbSk7CisJfSBlbHNlIHsKKwkJLyogcmVhZCgpIGNhcHR1cmUgKi8KKwkJYnVmID0gKHN0cnVjdCBjeDg4X2J1ZmZlciopZmgtPnZpZHEucmVhZF9idWY7CisJCWlmIChOVUxMID09IGJ1ZikKKwkJCXJldHVybiBQT0xMRVJSOworCX0KKwlwb2xsX3dhaXQoZmlsZSwgJmJ1Zi0+dmIuZG9uZSwgd2FpdCk7CisJaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gU1RBVEVfRE9ORSB8fAorCSAgICBidWYtPnZiLnN0YXRlID09IFNUQVRFX0VSUk9SKQorCQlyZXR1cm4gUE9MTElOfFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgY3g4ODAwX2ZoICAqZmggID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjeDg4MDBfZGV2ICpkZXYgPSBmaC0+ZGV2OworCisJLyogdHVybiBvZmYgb3ZlcmxheSAqLworCWlmIChyZXNfY2hlY2soZmgsIFJFU09VUkNFX09WRVJMQVkpKSB7CisJCS8qIEZJWE1FICovCisJCXJlc19mcmVlKGRldixmaCxSRVNPVVJDRV9PVkVSTEFZKTsKKwl9CisKKwkvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KKwlpZiAocmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFTykpIHsKKwkJdmlkZW9idWZfcXVldWVfY2FuY2VsKCZmaC0+dmlkcSk7CisJCXJlc19mcmVlKGRldixmaCxSRVNPVVJDRV9WSURFTyk7CisJfQorCWlmIChmaC0+dmlkcS5yZWFkX2J1ZikgeworCQlidWZmZXJfcmVsZWFzZSgmZmgtPnZpZHEsZmgtPnZpZHEucmVhZF9idWYpOworCQlrZnJlZShmaC0+dmlkcS5yZWFkX2J1Zik7CisJfQorCisJLyogc3RvcCB2YmkgY2FwdHVyZSAqLworCWlmIChyZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZCSSkpIHsKKwkJaWYgKGZoLT52YmlxLnN0cmVhbWluZykKKwkJCXZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPnZiaXEpOworCQlpZiAoZmgtPnZiaXEucmVhZGluZykKKwkJCXZpZGVvYnVmX3JlYWRfc3RvcCgmZmgtPnZiaXEpOworCQlyZXNfZnJlZShkZXYsZmgsUkVTT1VSQ0VfVkJJKTsKKwl9CisKKwl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52aWRxKTsKKwl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52YmlxKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWtmcmVlKGZoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordmlkZW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworCXN0cnVjdCBjeDg4MDBfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHZpZGVvYnVmX21tYXBfbWFwcGVyKGdldF9xdWV1ZShmaCksIHZtYSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGdldF9jb250cm9sKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCXN0cnVjdCBjeDg4X2N0cmwgKmMgPSBOVUxMOworCXUzMiB2YWx1ZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDWDg4MDBfQ1RMUzsgaSsrKQorCQlpZiAoY3g4ODAwX2N0bHNbaV0udi5pZCA9PSBjdGwtPmlkKQorCQkJYyA9ICZjeDg4MDBfY3Rsc1tpXTsKKwlpZiAoTlVMTCA9PSBjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhbHVlID0gYy0+c3JlZyA/IGN4X3NyZWFkKGMtPnNyZWcpIDogY3hfcmVhZChjLT5yZWcpOworCXN3aXRjaCAoY3RsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKKwkJY3RsLT52YWx1ZSA9ICh2YWx1ZSAmIDB4NDApID8gKHZhbHVlICYgMHgzZikgOiAoMHg0MCAtICh2YWx1ZSAmIDB4M2YpKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCWN0bC0+dmFsdWUgPSAweDNmIC0gKHZhbHVlICYgMHgzZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWN0bC0+dmFsdWUgPSAoKHZhbHVlICsgKGMtPm9mZiA8PCBjLT5zaGlmdCkpICYgYy0+bWFzaykgPj4gYy0+c2hpZnQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfY29udHJvbChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKwlzdHJ1Y3QgY3g4OF9jdHJsICpjID0gTlVMTDsKKyAgICAgICAgdTMyIHZfc2F0X3ZhbHVlOworCXUzMiB2YWx1ZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDWDg4MDBfQ1RMUzsgaSsrKQorCQlpZiAoY3g4ODAwX2N0bHNbaV0udi5pZCA9PSBjdGwtPmlkKQorCQkJYyA9ICZjeDg4MDBfY3Rsc1tpXTsKKwlpZiAoTlVMTCA9PSBjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjdGwtPnZhbHVlIDwgYy0+di5taW5pbXVtKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlpZiAoY3RsLT52YWx1ZSA+IGMtPnYubWF4aW11bSkKKwkJcmV0dXJuIC1FUkFOR0U7CisJc3dpdGNoIChjdGwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgorCQl2YWx1ZSA9IChjdGwtPnZhbHVlIDwgMHg0MCkgPyAoMHg0MCAtIGN0bC0+dmFsdWUpIDogY3RsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCXZhbHVlID0gMHgzZiAtIChjdGwtPnZhbHVlICYgMHgzZik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJLyogc3BlY2lhbCB2X3NhdCBoYW5kbGluZyAqLworCQl2X3NhdF92YWx1ZSA9IGN0bC0+dmFsdWUgLSAoMHg3ZiAtIDB4NWEpOworCQlpZiAodl9zYXRfdmFsdWUgPiAweGZmKQorCQkJdl9zYXRfdmFsdWUgPSAweGZmOworCQlpZiAodl9zYXRfdmFsdWUgPCAweDAwKQorCQkJdl9zYXRfdmFsdWUgPSAweDAwOworCQljeF9hbmRvcihNT19VVl9TQVRVUkFUSU9OLCAweGZmMDAsIHZfc2F0X3ZhbHVlIDw8IDgpOworCQkvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCByb3V0ZSBmb3IgdV9zYXQgKi8KKwlkZWZhdWx0OgorCQl2YWx1ZSA9ICgoY3RsLT52YWx1ZSAtIGMtPm9mZikgPDwgYy0+c2hpZnQpICYgYy0+bWFzazsKKwkJYnJlYWs7CisJfQorCWRwcmludGsoMSwic2V0X2NvbnRyb2wgaWQ9MHglWCByZWc9MHgleCB2YWw9MHgleCVzXG4iLAorCQljdGwtPmlkLCBjLT5yZWcsIHZhbHVlLCBjLT5zcmVnID8gIiBbc2hhZG93ZWRdIiA6ICIiKTsKKwlpZiAoYy0+c3JlZykgeworCQljeF9zYW5kb3IoYy0+c3JlZywgYy0+cmVnLCBjLT5tYXNrLCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJY3hfYW5kb3IoYy0+cmVnLCBjLT5tYXNrLCB2YWx1ZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X2NvbnRyb2xzKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYpCit7CisJc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgbXV0ZSA9IHsKKwkJLmlkICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKKwkJLnZhbHVlID0gMSwKKwl9OworCXN0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIHZvbHVtZSA9IHsKKwkJLmlkICAgID0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAorCQkudmFsdWUgPSAweDNmLAorCX07CisKKwlzZXRfY29udHJvbChkZXYsJm11dGUpOworCXNldF9jb250cm9sKGRldiwmdm9sdW1lKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgY3g4ODAwX2dfZm10KHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCBjeDg4MDBfZmggKmZoLAorCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN3aXRjaCAoZi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQltZW1zZXQoJmYtPmZtdC5waXgsMCxzaXplb2YoZi0+Zm10LnBpeCkpOworCQlmLT5mbXQucGl4LndpZHRoICAgICAgICA9IGZoLT53aWR0aDsKKwkJZi0+Zm10LnBpeC5oZWlnaHQgICAgICAgPSBmaC0+aGVpZ2h0OworCQlmLT5mbXQucGl4LmZpZWxkICAgICAgICA9IGZoLT52aWRxLmZpZWxkOworCQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ICA9IGZoLT5mbXQtPmZvdXJjYzsKKwkJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPQorCQkJKGYtPmZtdC5waXgud2lkdGggKiBmaC0+Zm10LT5kZXB0aCkgPj4gMzsKKwkJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQkJZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQljeDg4MDBfdmJpX2ZtdChkZXYsIGYpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3g4ODAwX3RyeV9mbXQoc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IGN4ODgwMF9maCAqZmgsCisJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzd2l0Y2ggKGYtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwl7CisJCXN0cnVjdCBjeDg4MDBfZm10ICpmbXQ7CisJCWVudW0gdjRsMl9maWVsZCBmaWVsZDsKKwkJdW5zaWduZWQgaW50IG1heHcsIG1heGg7CisKKwkJZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKwkJaWYgKE5VTEwgPT0gZm10KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOworCQltYXh3ICA9IG5vcm1fbWF4dyhkZXYtPmNvcmUtPnR2bm9ybSk7CisJCW1heGggID0gbm9ybV9tYXhoKGRldi0+Y29yZS0+dHZub3JtKTsKKworCQlpZiAoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHsKKwkJCWZpZWxkID0gKGYtPmZtdC5waXguaGVpZ2h0ID4gbWF4aC8yKQorCQkJCT8gVjRMMl9GSUVMRF9JTlRFUkxBQ0VECisJCQkJOiBWNEwyX0ZJRUxEX0JPVFRPTTsKKwkJfQorCisJCXN3aXRjaCAoZmllbGQpIHsKKwkJY2FzZSBWNEwyX0ZJRUxEX1RPUDoKKwkJY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTToKKwkJCW1heGggPSBtYXhoIC8gMjsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmLT5mbXQucGl4LmZpZWxkID0gZmllbGQ7CisJCWlmIChmLT5mbXQucGl4LmhlaWdodCA8IDMyKQorCQkJZi0+Zm10LnBpeC5oZWlnaHQgPSAzMjsKKwkJaWYgKGYtPmZtdC5waXguaGVpZ2h0ID4gbWF4aCkKKwkJCWYtPmZtdC5waXguaGVpZ2h0ID0gbWF4aDsKKwkJaWYgKGYtPmZtdC5waXgud2lkdGggPCA0OCkKKwkJCWYtPmZtdC5waXgud2lkdGggPSA0ODsKKwkJaWYgKGYtPmZtdC5waXgud2lkdGggPiBtYXh3KQorCQkJZi0+Zm10LnBpeC53aWR0aCA9IG1heHc7CisJCWYtPmZtdC5waXgud2lkdGggJj0gfjB4MDM7CisJCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0KKwkJCShmLT5mbXQucGl4LndpZHRoICogZm10LT5kZXB0aCkgPj4gMzsKKwkJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQkJZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQljeDg4MDBfdmJpX2ZtdChkZXYsIGYpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3g4ODAwX3NfZm10KHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCBjeDg4MDBfZmggKmZoLAorCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCWludCBlcnI7CisKKwlzd2l0Y2ggKGYtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJZXJyID0gY3g4ODAwX3RyeV9mbXQoZGV2LGZoLGYpOworCQlpZiAoMCAhPSBlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWZoLT5mbXQgICAgICAgID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKwkJZmgtPndpZHRoICAgICAgPSBmLT5mbXQucGl4LndpZHRoOworCQlmaC0+aGVpZ2h0ICAgICA9IGYtPmZtdC5waXguaGVpZ2h0OworCQlmaC0+dmlkcS5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRToKKwkJY3g4ODAwX3ZiaV9mbXQoZGV2LCBmKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBfbm90XyBjYWxsZWQgZGlyZWN0bHksIGJ1dCBmcm9tCisgKiB2aWRlb19nZW5lcmljX2lvY3RsIChhbmQgbWF5YmUgb3RoZXJzKS4gIHVzZXJzcGFjZQorICogY29weWluZyBpcyBkb25lIGFscmVhZHksIGFyZyBpcyBhIGtlcm5lbCBwb2ludGVyLgorICovCitzdGF0aWMgaW50IHZpZGVvX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IGN4ODgwMF9maCAgKmZoICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGN4ODgwMF9kZXYgKmRldiAgPSBmaC0+ZGV2OworCXN0cnVjdCBjeDg4X2NvcmUgICpjb3JlID0gZGV2LT5jb3JlOworI2lmIDAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2VuZGlmCisJaW50IGVycjsKKworCWlmICh2aWRlb19kZWJ1ZyA+IDEpCisJCWN4ODhfcHJpbnRfaW9jdGwoY29yZS0+bmFtZSxjbWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJbWVtc2V0KGNhcCwwLHNpemVvZigqY2FwKSk7CisgICAgICAgICAgICAgICAgc3RyY3B5KGNhcC0+ZHJpdmVyLCAiY3g4ODAwIik7CisJCXN0cmxjcHkoY2FwLT5jYXJkLCBjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ubmFtZSwKKwkJCXNpemVvZihjYXAtPmNhcmQpKTsKKwkJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCJQQ0k6JXMiLHBjaV9uYW1lKGRldi0+cGNpKSk7CisJCWNhcC0+dmVyc2lvbiA9IENYODhfVkVSU0lPTl9DT0RFOworCQljYXAtPmNhcGFiaWxpdGllcyA9CisJCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJCVY0TDJfQ0FQX1JFQURXUklURSAgICAgfAorCQkJVjRMMl9DQVBfU1RSRUFNSU5HICAgICB8CisJCQlWNEwyX0NBUF9WQklfQ0FQVFVSRSAgIHwKKyNpZiAwCisJCQlWNEwyX0NBUF9WSURFT19PVkVSTEFZIHwKKyNlbmRpZgorCQkJMDsKKwkJaWYgKFVOU0VUICE9IGNvcmUtPnR1bmVyX3R5cGUpCisJCQljYXAtPmNhcGFiaWxpdGllcyB8PSBWNEwyX0NBUF9UVU5FUjsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogLS0tLS0tLS0tLSB0diBub3JtcyAtLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfRU5VTVNURDoKKwl7CisJCXN0cnVjdCB2NGwyX3N0YW5kYXJkICplID0gYXJnOworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlpID0gZS0+aW5kZXg7CisJCWlmIChpID49IEFSUkFZX1NJWkUodHZub3JtcykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gdjRsMl92aWRlb19zdGRfY29uc3RydWN0KGUsIHR2bm9ybXNbZS0+aW5kZXhdLmlkLAorCQkJCQkgICAgICAgdHZub3Jtc1tlLT5pbmRleF0ubmFtZSk7CisJCWUtPmluZGV4ID0gaTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisKKwkJKmlkID0gY29yZS0+dHZub3JtLT5pZDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1NfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR2bm9ybXMpOyBpKyspCisJCQlpZiAoKmlkICYgdHZub3Jtc1tpXS5pZCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gQVJSQVlfU0laRSh0dm5vcm1zKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRvd24oJmRldi0+bG9jayk7CisJCWN4ODhfc2V0X3R2bm9ybShkZXYtPmNvcmUsJnR2bm9ybXNbaV0pOworCQl1cCgmZGV2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogLS0tLS0tIGlucHV0IHN3aXRjaGluZyAtLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgorCXsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmluYW1lW10gPSB7CisJCQlbIENYODhfVk1VWF9DT01QT1NJVEUxIF0gPSAiQ29tcG9zaXRlMSIsCisJCQlbIENYODhfVk1VWF9DT01QT1NJVEUyIF0gPSAiQ29tcG9zaXRlMiIsCisJCQlbIENYODhfVk1VWF9DT01QT1NJVEUzIF0gPSAiQ29tcG9zaXRlMyIsCisJCQlbIENYODhfVk1VWF9DT01QT1NJVEU0IF0gPSAiQ29tcG9zaXRlNCIsCisJCQlbIENYODhfVk1VWF9TVklERU8gICAgIF0gPSAiUy1WaWRlbyIsCisJCQlbIENYODhfVk1VWF9URUxFVklTSU9OIF0gPSAiVGVsZXZpc2lvbiIsCisJCQlbIENYODhfVk1VWF9DQUJMRSAgICAgIF0gPSAiQ2FibGUgVFYiLAorCQkJWyBDWDg4X1ZNVVhfRFZCICAgICAgICBdID0gIkRWQiIsCisJCQlbIENYODhfVk1VWF9ERUJVRyAgICAgIF0gPSAiZm9yIGRlYnVnIG9ubHkiLAorCQl9OworCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaSA9IGFyZzsKKwkJdW5zaWduZWQgaW50IG47CisKKwkJbiA9IGktPmluZGV4OworCQlpZiAobiA+PSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICgwID09IElOUFVUKG4pLT50eXBlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbXNldChpLDAsc2l6ZW9mKCppKSk7CisJCWktPmluZGV4ID0gbjsKKwkJaS0+dHlwZSAgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCQlzdHJjcHkoaS0+bmFtZSxpbmFtZVtJTlBVVChuKS0+dHlwZV0pOworCQlpZiAoKENYODhfVk1VWF9URUxFVklTSU9OID09IElOUFVUKG4pLT50eXBlKSB8fAorCQkgICAgKENYODhfVk1VWF9DQUJMRSAgICAgID09IElOUFVUKG4pLT50eXBlKSkKKwkJCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7CisJCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKHR2bm9ybXMpOyBuKyspCisJCQlpLT5zdGQgfD0gdHZub3Jtc1tuXS5pZDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJKmkgPSBkZXYtPmNvcmUtPmlucHV0OworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19JTlBVVDoKKwl7CisJCXVuc2lnbmVkIGludCAqaSA9IGFyZzsKKworCQlpZiAoKmkgPj0gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlkb3duKCZkZXYtPmxvY2spOworCQljeDg4X25ld3N0YXRpb24oY29yZSk7CisJCXZpZGVvX211eChkZXYsKmkpOworCQl1cCgmZGV2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKyNpZiAwCisJLyogbmVlZHMgcmV2aWV3ICovCisJY2FzZSBWSURJT0NfR19BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICphID0gYXJnOworCQl1bnNpZ25lZCBpbnQgbiA9IGEtPmluZGV4OworCisJCW1lbXNldChhLDAsc2l6ZW9mKCphKSk7CisJCWEtPmluZGV4ID0gbjsKKwkJc3dpdGNoIChuKSB7CisJCWNhc2UgMDoKKwkJCWlmICgoQ1g4OF9WTVVYX1RFTEVWSVNJT04gPT0gSU5QVVQobiktPnR5cGUpCisJCQkgICAgfHwgKENYODhfVk1VWF9DQUJMRSA9PSBJTlBVVChuKS0+dHlwZSkpIHsKKwkJCQlzdHJjcHkoYS0+bmFtZSwiVGVsZXZpc2lvbiIpOworCQkJCS8vIEZJWE1FIGZpZ3VyZSBvdXQgaWYgc3RlcmVvIHJlY2VpdmVkIGFuZCBzZXQgVjRMMl9BVURDQVBfU1RFUkVPLgorCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmIChDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEID09IGNvcmUtPmJvYXJkKSB7CisJCQkJc3RyY3B5KGEtPm5hbWUsIkxpbmUgSW4iKTsKKwkJCQlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJLy8gQXVkaW8gaW5wdXQgbm90IGF2YWlsYWJsZS4KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmCisKKwkvKiAtLS0gY2FwdHVyZSBpb2N0bHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0VOVU1fRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZiA9IGFyZzsKKwkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlpbmRleCA9IGYtPmluZGV4OworCQl0eXBlICA9IGYtPnR5cGU7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJCWlmIChpbmRleCA+PSBBUlJBWV9TSVpFKGZvcm1hdHMpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJbWVtc2V0KGYsMCxzaXplb2YoKmYpKTsKKwkJCWYtPmluZGV4ID0gaW5kZXg7CisJCQlmLT50eXBlICA9IHR5cGU7CisJCQlzdHJsY3B5KGYtPmRlc2NyaXB0aW9uLGZvcm1hdHNbaW5kZXhdLm5hbWUsc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJCQlmLT5waXhlbGZvcm1hdCA9IGZvcm1hdHNbaW5kZXhdLmZvdXJjYzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOworCQlyZXR1cm4gY3g4ODAwX2dfZm10KGRldixmaCxmKTsKKwl9CisJY2FzZSBWSURJT0NfU19GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSBhcmc7CisJCXJldHVybiBjeDg4MDBfc19mbXQoZGV2LGZoLGYpOworCX0KKwljYXNlIFZJRElPQ19UUllfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOworCQlyZXR1cm4gY3g4ODAwX3RyeV9mbXQoZGV2LGZoLGYpOworCX0KKworCS8qIC0tLSBjb250cm9scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpjID0gYXJnOworCQlpbnQgaTsKKworCQlpZiAoYy0+aWQgPCAgVjRMMl9DSURfQkFTRSB8fAorCQkgICAgYy0+aWQgPj0gVjRMMl9DSURfTEFTVFAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZvciAoaSA9IDA7IGkgPCBDWDg4MDBfQ1RMUzsgaSsrKQorCQkJaWYgKGN4ODgwMF9jdGxzW2ldLnYuaWQgPT0gYy0+aWQpCisJCQkJYnJlYWs7CisJCWlmIChpID09IENYODgwMF9DVExTKSB7CisJCQkqYyA9IG5vX2N0bDsKKwkJCXJldHVybiAwOworCQl9CisJCSpjID0gY3g4ODAwX2N0bHNbaV0udjsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfQ1RSTDoKKwkJcmV0dXJuIGdldF9jb250cm9sKGRldixhcmcpOworCWNhc2UgVklESU9DX1NfQ1RSTDoKKwkJcmV0dXJuIHNldF9jb250cm9sKGRldixhcmcpOworCisJLyogLS0tIHR1bmVyIGlvY3RscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwljYXNlIFZJRElPQ19HX1RVTkVSOgorCXsKKwkJc3RydWN0IHY0bDJfdHVuZXIgKnQgPSBhcmc7CisJCXUzMiByZWc7CisKKwkJaWYgKFVOU0VUID09IGNvcmUtPnR1bmVyX3R5cGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKDAgIT0gdC0+aW5kZXgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQltZW1zZXQodCwwLHNpemVvZigqdCkpOworCQlzdHJjcHkodC0+bmFtZSwgIlRlbGV2aXNpb24iKTsKKwkJdC0+dHlwZSAgICAgICA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCQl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTk9STTsKKwkJdC0+cmFuZ2VoaWdoICA9IDB4ZmZmZmZmZmZVTDsKKworCQljeDg4X2dldF9zdGVyZW8oY29yZSAsdCk7CisJCXJlZyA9IGN4X3JlYWQoTU9fREVWSUNFX1NUQVRVUyk7CisgICAgICAgICAgICAgICAgdC0+c2lnbmFsID0gKHJlZyAmICgxPDw1KSkgPyAweGZmZmYgOiAweDAwMDA7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19TX1RVTkVSOgorCXsKKwkJc3RydWN0IHY0bDJfdHVuZXIgKnQgPSBhcmc7CisKKwkJaWYgKFVOU0VUID09IGNvcmUtPnR1bmVyX3R5cGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKDAgIT0gdC0+aW5kZXgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY3g4OF9zZXRfc3RlcmVvKGNvcmUsIHQtPmF1ZG1vZGUsIDEpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6CisJeworCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CisKKwkJaWYgKFVOU0VUID09IGNvcmUtPnR1bmVyX3R5cGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGYtPnR1bmVyICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVtc2V0KGYsMCxzaXplb2YoKmYpKTsKKwkJZi0+dHlwZSA9IGZoLT5yYWRpbyA/IFY0TDJfVFVORVJfUkFESU8gOiBWNEwyX1RVTkVSX0FOQUxPR19UVjsKKwkJZi0+ZnJlcXVlbmN5ID0gZGV2LT5mcmVxOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CisJeworCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CisKKwkJaWYgKFVOU0VUID09IGNvcmUtPnR1bmVyX3R5cGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGYtPnR1bmVyICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKDAgPT0gZmgtPnJhZGlvICYmIGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKDEgPT0gZmgtPnJhZGlvICYmIGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9SQURJTykKKwkJCXJldHVybiAtRUlOVkFMOworCQlkb3duKCZkZXYtPmxvY2spOworCQlkZXYtPmZyZXEgPSBmLT5mcmVxdWVuY3k7CisJCWN4ODhfbmV3c3RhdGlvbihjb3JlKTsKKyNpZmRlZiBWNEwyX0kyQ19DTElFTlRTCisJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsVklESU9DX1NfRlJFUVVFTkNZLGYpOworI2Vsc2UKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NTRlJFUSwmZGV2LT5mcmVxKTsKKyNlbmRpZgorCQl1cCgmZGV2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogLS0tIHN0cmVhbWluZyBjYXB0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwljYXNlIFZJRElPQ0dNQlVGOgorCXsKKwkJc3RydWN0IHZpZGVvX21idWYgKm1idWYgPSBhcmc7CisJCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcTsKKwkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxOworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlxID0gZ2V0X3F1ZXVlKGZoKTsKKwkJbWVtc2V0KCZyZXEsMCxzaXplb2YocmVxKSk7CisJCXJlcS50eXBlICAgPSBxLT50eXBlOworCQlyZXEuY291bnQgID0gODsKKwkJcmVxLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJCWVyciA9IHZpZGVvYnVmX3JlcWJ1ZnMocSwmcmVxKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQltZW1zZXQobWJ1ZiwwLHNpemVvZigqbWJ1ZikpOworCQltYnVmLT5mcmFtZXMgPSByZXEuY291bnQ7CisJCW1idWYtPnNpemUgICA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBtYnVmLT5mcmFtZXM7IGkrKykgeworCQkJbWJ1Zi0+b2Zmc2V0c1tpXSAgPSBxLT5idWZzW2ldLT5ib2ZmOworCQkJbWJ1Zi0+c2l6ZSAgICAgICArPSBxLT5idWZzW2ldLT5ic2l6ZTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfUkVRQlVGUzoKKwkJcmV0dXJuIHZpZGVvYnVmX3JlcWJ1ZnMoZ2V0X3F1ZXVlKGZoKSwgYXJnKTsKKworCWNhc2UgVklESU9DX1FVRVJZQlVGOgorCQlyZXR1cm4gdmlkZW9idWZfcXVlcnlidWYoZ2V0X3F1ZXVlKGZoKSwgYXJnKTsKKworCWNhc2UgVklESU9DX1FCVUY6CisJCXJldHVybiB2aWRlb2J1Zl9xYnVmKGdldF9xdWV1ZShmaCksIGFyZyk7CisKKwljYXNlIFZJRElPQ19EUUJVRjoKKwkJcmV0dXJuIHZpZGVvYnVmX2RxYnVmKGdldF9xdWV1ZShmaCksIGFyZywKKwkJCQkgICAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisKKwljYXNlIFZJRElPQ19TVFJFQU1PTjoKKwl7CisJCWludCByZXMgPSBnZXRfcmVzc291cmNlKGZoKTsKKworICAgICAgICAgICAgICAgIGlmICghcmVzX2dldChkZXYsZmgscmVzKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldHVybiB2aWRlb2J1Zl9zdHJlYW1vbihnZXRfcXVldWUoZmgpKTsKKwl9CisJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgorCXsKKwkJaW50IHJlcyA9IGdldF9yZXNzb3VyY2UoZmgpOworCisJCWVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlyZXNfZnJlZShkZXYsZmgscmVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKKwkJCQkJCSAgdmlkZW9fZG9faW9jdGwpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRlb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHZpZGVvX2RvX2lvY3RsKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCByYWRpb19kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgY3g4ODAwX2ZoICpmaCAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2ICA9IGZoLT5kZXY7CisJc3RydWN0IGN4ODhfY29yZSAgKmNvcmUgPSBkZXYtPmNvcmU7CisKKwlpZiAodmlkZW9fZGVidWcgPiAxKQorCQljeDg4X3ByaW50X2lvY3RsKGNvcmUtPm5hbWUsY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJbWVtc2V0KGNhcCwwLHNpemVvZigqY2FwKSk7CisgICAgICAgICAgICAgICAgc3RyY3B5KGNhcC0+ZHJpdmVyLCAiY3g4ODAwIik7CisJCXN0cmxjcHkoY2FwLT5jYXJkLCBjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ubmFtZSwKKwkJCXNpemVvZihjYXAtPmNhcmQpKTsKKwkJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCJQQ0k6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOworCQljYXAtPnZlcnNpb24gPSBDWDg4X1ZFUlNJT05fQ09ERTsKKwkJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKKworCQlpZiAodC0+aW5kZXggPiAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtc2V0KHQsMCxzaXplb2YoKnQpKTsKKwkJc3RyY3B5KHQtPm5hbWUsICJSYWRpbyIpOworICAgICAgICAgICAgICAgIHQtPnJhbmdlbG93ICA9IChpbnQpKDY1KjE2KTsKKyAgICAgICAgICAgICAgICB0LT5yYW5nZWhpZ2ggPSAoaW50KSgxMDgqMTYpOworCisjaWZkZWYgVjRMMl9JMkNfQ0xJRU5UUworCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ19HX1RVTkVSLHQpOworI2Vsc2UKKwkJeworCQkJc3RydWN0IHZpZGVvX3R1bmVyIHZ0OworCQkJbWVtc2V0KCZ2dCwwLHNpemVvZih2dCkpOworCQkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldixWSURJT0NHVFVORVIsJnZ0KTsKKwkJCXQtPnNpZ25hbCA9IHZ0LnNpZ25hbDsKKwkJfQorI2VuZGlmCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaSA9IGFyZzsKKworCQlpZiAoaS0+aW5kZXggIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzdHJjcHkoaS0+bmFtZSwiUmFkaW8iKTsKKwkJaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJeworCQlpbnQgKmkgPSBhcmc7CisJCSppID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfQVVESU86CisJeworCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSA9IGFyZzsKKworCQltZW1zZXQoYSwwLHNpemVvZigqYSkpOworCQlzdHJjcHkoYS0+bmFtZSwiUmFkaW8iKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOworCQkqaWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19BVURJTzoKKwljYXNlIFZJRElPQ19TX1RVTkVSOgorCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJY2FzZSBWSURJT0NfU19TVEQ6CisJCXJldHVybiAwOworCisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpjID0gYXJnOworCQlpbnQgaTsKKworCQlpZiAoYy0+aWQgPCAgVjRMMl9DSURfQkFTRSB8fAorCQkgICAgYy0+aWQgPj0gVjRMMl9DSURfTEFTVFAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjLT5pZCA9PSBWNEwyX0NJRF9BVURJT19NVVRFKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgQ1g4ODAwX0NUTFM7IGkrKykKKwkJCQlpZiAoY3g4ODAwX2N0bHNbaV0udi5pZCA9PSBjLT5pZCkKKwkJCQkJYnJlYWs7CisJCQkqYyA9IGN4ODgwMF9jdGxzW2ldLnY7CisJCX0gZWxzZQorCQkJKmMgPSBub19jdGw7CisJCXJldHVybiAwOworCX0KKworCisJY2FzZSBWSURJT0NfR19DVFJMOgorCWNhc2UgVklESU9DX1NfQ1RSTDoKKwljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwkJcmV0dXJuIHZpZGVvX2RvX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gdjRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoaW5vZGUsZmlsZSxjbWQsYXJnLAorCQkJCQkJICByYWRpb19kb19pb2N0bCk7CisJfQorCXJldHVybiAwOworfTsKKworc3RhdGljIGludCByYWRpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHJhZGlvX2RvX2lvY3RsKTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGN4ODgwMF92aWRfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGN4ODgwMF9kZXYgKmRldiA9IChzdHJ1Y3QgY3g4ODAwX2RldiopZGF0YTsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCXN0cnVjdCBjeDg4X2RtYXF1ZXVlICpxID0gJmRldi0+dmlkcTsKKwlzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY3g4OF9zcmFtX2NoYW5uZWxfZHVtcChkZXYtPmNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDIxXSk7CisKKwljeF9jbGVhcihNT19WSURfRE1BQ05UUkwsIDB4MTEpOworCWN4X2NsZWFyKFZJRF9DQVBUVVJFX0NPTlRST0wsIDB4MDYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQlidWYgPSBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5uZXh0LCBzdHJ1Y3QgY3g4OF9idWZmZXIsIHZiLnF1ZXVlKTsKKwkJbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOworCQlidWYtPnZiLnN0YXRlID0gU1RBVEVfRVJST1I7CisJCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7CisJCXByaW50aygiJXMvMDogWyVwLyVkXSB0aW1lb3V0IC0gZG1hPTB4JTA4bHhcbiIsIGNvcmUtPm5hbWUsCisJCSAgICAgICBidWYsIGJ1Zi0+dmIuaSwgKHVuc2lnbmVkIGxvbmcpYnVmLT5yaXNjLmRtYSk7CisJfQorCXJlc3RhcnRfdmlkZW9fcXVldWUoZGV2LHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjeDg4MDBfdmlkX2lycShzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2KQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisJdTMyIHN0YXR1cywgbWFzaywgY291bnQ7CisKKwlzdGF0dXMgPSBjeF9yZWFkKE1PX1ZJRF9JTlRTVEFUKTsKKwltYXNrICAgPSBjeF9yZWFkKE1PX1ZJRF9JTlRNU0spOworCWlmICgwID09IChzdGF0dXMgJiBtYXNrKSkKKwkJcmV0dXJuOworCWN4X3dyaXRlKE1PX1ZJRF9JTlRTVEFULCBzdGF0dXMpOworCWlmIChpcnFfZGVidWcgIHx8ICAoc3RhdHVzICYgbWFzayAmIH4weGZmKSkKKwkJY3g4OF9wcmludF9pcnFiaXRzKGNvcmUtPm5hbWUsICJpcnEgdmlkIiwKKwkJCQkgICBjeDg4X3ZpZF9pcnFzLCBzdGF0dXMsIG1hc2spOworCisJLyogcmlzYyBvcCBjb2RlIGVycm9yICovCisJaWYgKHN0YXR1cyAmICgxIDw8IDE2KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy8wOiB2aWRlbyByaXNjIG9wIGNvZGUgZXJyb3JcbiIsY29yZS0+bmFtZSk7CisJCWN4X2NsZWFyKE1PX1ZJRF9ETUFDTlRSTCwgMHgxMSk7CisJCWN4X2NsZWFyKFZJRF9DQVBUVVJFX0NPTlRST0wsIDB4MDYpOworCQljeDg4X3NyYW1fY2hhbm5lbF9kdW1wKGRldi0+Y29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjFdKTsKKwl9CisKKwkvKiByaXNjMSB5ICovCisJaWYgKHN0YXR1cyAmIDB4MDEpIHsKKwkJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwkJY291bnQgPSBjeF9yZWFkKE1PX1ZJRFlfR1BDTlQpOworCQljeDg4X3dha2V1cChkZXYtPmNvcmUsICZkZXYtPnZpZHEsIGNvdW50KTsKKwkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworCX0KKworCS8qIHJpc2MxIHZiaSAqLworCWlmIChzdGF0dXMgJiAweDA4KSB7CisJCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CisJCWNvdW50ID0gY3hfcmVhZChNT19WQklfR1BDTlQpOworCQljeDg4X3dha2V1cChkZXYtPmNvcmUsICZkZXYtPnZiaXEsIGNvdW50KTsKKwkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworCX0KKworCS8qIHJpc2MyIHkgKi8KKwlpZiAoc3RhdHVzICYgMHgxMCkgeworCQlkcHJpbnRrKDIsInN0b3BwZXIgdmlkZW9cbiIpOworCQlzcGluX2xvY2soJmRldi0+c2xvY2spOworCQlyZXN0YXJ0X3ZpZGVvX3F1ZXVlKGRldiwmZGV2LT52aWRxKTsKKwkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworCX0KKworCS8qIHJpc2MyIHZiaSAqLworCWlmIChzdGF0dXMgJiAweDgwKSB7CisJCWRwcmludGsoMiwic3RvcHBlciB2YmlcbiIpOworCQlzcGluX2xvY2soJmRldi0+c2xvY2spOworCQljeDg4MDBfcmVzdGFydF92YmlfcXVldWUoZGV2LCZkZXYtPnZiaXEpOworCQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgY3g4ODAwX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBjeDg4MDBfZGV2ICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKwl1MzIgc3RhdHVzOworCWludCBsb29wLCBoYW5kbGVkID0gMDsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAxMDsgbG9vcCsrKSB7CisJCXN0YXR1cyA9IGN4X3JlYWQoTU9fUENJX0lOVFNUQVQpICYgKGNvcmUtPnBjaV9pcnFtYXNrIHwgMHgwMSk7CisJCWlmICgwID09IHN0YXR1cykKKwkJCWdvdG8gb3V0OworCQljeF93cml0ZShNT19QQ0lfSU5UU1RBVCwgc3RhdHVzKTsKKwkJaGFuZGxlZCA9IDE7CisKKwkJaWYgKHN0YXR1cyAmIGNvcmUtPnBjaV9pcnFtYXNrKQorCQkJY3g4OF9jb3JlX2lycShjb3JlLHN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiAweDAxKQorCQkJY3g4ODAwX3ZpZF9pcnEoZGV2KTsKKwl9OworCWlmICgxMCA9PSBsb29wKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzLzA6IGlycSBsb29wIC0tIGNsZWFyaW5nIG1hc2tcbiIsCisJCSAgICAgICBjb3JlLT5uYW1lKTsKKwkJY3hfd3JpdGUoTU9fUENJX0lOVE1TSywwKTsKKwl9CisKKyBvdXQ6CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBleHBvcnRlZCBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aWRlb19mb3BzID0KK3sKKwkub3duZXIJICAgICAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4JICAgICAgID0gdmlkZW9fb3BlbiwKKwkucmVsZWFzZSAgICAgICA9IHZpZGVvX3JlbGVhc2UsCisJLnJlYWQJICAgICAgID0gdmlkZW9fcmVhZCwKKwkucG9sbCAgICAgICAgICA9IHZpZGVvX3BvbGwsCisJLm1tYXAJICAgICAgID0gdmlkZW9fbW1hcCwKKwkuaW9jdGwJICAgICAgID0gdmlkZW9faW9jdGwsCisJLmxsc2VlayAgICAgICAgPSBub19sbHNlZWssCit9OworCitzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4ODgwMF92aWRlb190ZW1wbGF0ZSA9Cit7CisJLm5hbWUgICAgICAgICAgPSAiY3g4ODAwLXZpZGVvIiwKKwkudHlwZSAgICAgICAgICA9IFZJRF9UWVBFX0NBUFRVUkV8VklEX1RZUEVfVFVORVJ8VklEX1RZUEVfU0NBTEVTLAorCS5oYXJkd2FyZSAgICAgID0gMCwKKwkuZm9wcyAgICAgICAgICA9ICZ2aWRlb19mb3BzLAorCS5taW5vciAgICAgICAgID0gLTEsCit9OworCitzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4ODgwMF92YmlfdGVtcGxhdGUgPQoreworCS5uYW1lICAgICAgICAgID0gImN4ODgwMC12YmkiLAorCS50eXBlICAgICAgICAgID0gVklEX1RZUEVfVEVMRVRFWFR8VklEX1RZUEVfVFVORVIsCisJLmhhcmR3YXJlICAgICAgPSAwLAorCS5mb3BzICAgICAgICAgID0gJnZpZGVvX2ZvcHMsCisJLm1pbm9yICAgICAgICAgPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhZGlvX2ZvcHMgPQoreworCS5vd25lciAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgPSB2aWRlb19vcGVuLAorCS5yZWxlYXNlICAgICAgID0gdmlkZW9fcmVsZWFzZSwKKwkuaW9jdGwgICAgICAgICA9IHJhZGlvX2lvY3RsLAorCS5sbHNlZWsgICAgICAgID0gbm9fbGxzZWVrLAorfTsKKworc3RydWN0IHZpZGVvX2RldmljZSBjeDg4MDBfcmFkaW9fdGVtcGxhdGUgPQoreworCS5uYW1lICAgICAgICAgID0gImN4ODgwMC1yYWRpbyIsCisJLnR5cGUgICAgICAgICAgPSBWSURfVFlQRV9UVU5FUiwKKwkuaGFyZHdhcmUgICAgICA9IDAsCisJLmZvcHMgICAgICAgICAgPSAmcmFkaW9fZm9wcywKKwkubWlub3IgICAgICAgICA9IC0xLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgY3g4ODAwX3VucmVnaXN0ZXJfdmlkZW8oc3RydWN0IGN4ODgwMF9kZXYgKmRldikKK3sKKwlpZiAoZGV2LT5yYWRpb19kZXYpIHsKKwkJaWYgKC0xICE9IGRldi0+cmFkaW9fZGV2LT5taW5vcikKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+cmFkaW9fZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT5yYWRpb19kZXYpOworCQlkZXYtPnJhZGlvX2RldiA9IE5VTEw7CisJfQorCWlmIChkZXYtPnZiaV9kZXYpIHsKKwkJaWYgKC0xICE9IGRldi0+dmJpX2Rldi0+bWlub3IpCisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnZiaV9kZXYpOworCQllbHNlCisJCQl2aWRlb19kZXZpY2VfcmVsZWFzZShkZXYtPnZiaV9kZXYpOworCQlkZXYtPnZiaV9kZXYgPSBOVUxMOworCX0KKwlpZiAoZGV2LT52aWRlb19kZXYpIHsKKwkJaWYgKC0xICE9IGRldi0+dmlkZW9fZGV2LT5taW5vcikKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmlkZW9fZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT52aWRlb19kZXYpOworCQlkZXYtPnZpZGVvX2RldiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjeDg4MDBfaW5pdGRldihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2OworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmU7CisJaW50IGVycjsKKworCWRldiA9IGttYWxsb2Moc2l6ZW9mKCpkZXYpLEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGRldiwwLHNpemVvZigqZGV2KSk7CisKKwkvKiBwY2kgaW5pdCAqLworCWRldi0+cGNpID0gcGNpX2RldjsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBmYWlsX2ZyZWU7CisJfQorCWNvcmUgPSBjeDg4X2NvcmVfZ2V0KGRldi0+cGNpKTsKKwlpZiAoTlVMTCA9PSBjb3JlKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9mcmVlOworCX0KKwlkZXYtPmNvcmUgPSBjb3JlOworCisJLyogcHJpbnQgcGNpIGluZm8gKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZkZXYtPnBjaV9yZXYpOworICAgICAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgICZkZXYtPnBjaV9sYXQpOworICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlcy8wOiBmb3VuZCBhdCAlcywgcmV2OiAlZCwgaXJxOiAlZCwgIgorCSAgICAgICAibGF0ZW5jeTogJWQsIG1taW86IDB4JWx4XG4iLCBjb3JlLT5uYW1lLAorCSAgICAgICBwY2lfbmFtZShwY2lfZGV2KSwgZGV2LT5wY2lfcmV2LCBwY2lfZGV2LT5pcnEsCisJICAgICAgIGRldi0+cGNpX2xhdCxwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwwKSk7CisKKwlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKwlpZiAoIXBjaV9kbWFfc3VwcG9ydGVkKHBjaV9kZXYsMHhmZmZmZmZmZikpIHsKKwkJcHJpbnRrKCIlcy8wOiBPb3BzOiBubyAzMmJpdCBQQ0kgRE1BID8/P1xuIixjb3JlLT5uYW1lKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBmYWlsX2NvcmU7CisJfQorCisJLyogaW5pdGlhbGl6ZSBkcml2ZXIgc3RydWN0ICovCisgICAgICAgIGluaXRfTVVURVgoJmRldi0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+c2xvY2spOworCWNvcmUtPnR2bm9ybSA9IHR2bm9ybXM7CisKKwkvKiBpbml0IHZpZGVvIGRtYSBxdWV1ZXMgKi8KKwlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxLmFjdGl2ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmlkcS5xdWV1ZWQpOworCWRldi0+dmlkcS50aW1lb3V0LmZ1bmN0aW9uID0gY3g4ODAwX3ZpZF90aW1lb3V0OworCWRldi0+dmlkcS50aW1lb3V0LmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWluaXRfdGltZXIoJmRldi0+dmlkcS50aW1lb3V0KTsKKwljeDg4X3Jpc2Nfc3RvcHBlcihkZXYtPnBjaSwmZGV2LT52aWRxLnN0b3BwZXIsCisJCQkgIE1PX1ZJRF9ETUFDTlRSTCwweDExLDB4MDApOworCisJLyogaW5pdCB2YmkgZG1hIHF1ZXVlcyAqLworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZiaXEuYWN0aXZlKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT52YmlxLnF1ZXVlZCk7CisJZGV2LT52YmlxLnRpbWVvdXQuZnVuY3Rpb24gPSBjeDg4MDBfdmJpX3RpbWVvdXQ7CisJZGV2LT52YmlxLnRpbWVvdXQuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylkZXY7CisJaW5pdF90aW1lcigmZGV2LT52YmlxLnRpbWVvdXQpOworCWN4ODhfcmlzY19zdG9wcGVyKGRldi0+cGNpLCZkZXYtPnZiaXEuc3RvcHBlciwKKwkJCSAgTU9fVklEX0RNQUNOVFJMLDB4ODgsMHgwMCk7CisKKwkvKiBnZXQgaXJxICovCisJZXJyID0gcmVxdWVzdF9pcnEocGNpX2Rldi0+aXJxLCBjeDg4MDBfaXJxLAorCQkJICBTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCwgY29yZS0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBnZXQgSVJRICVkXG4iLAorCQkgICAgICAgY29yZS0+bmFtZSxwY2lfZGV2LT5pcnEpOworCQlnb3RvIGZhaWxfY29yZTsKKwl9CisJY3hfc2V0KE1PX1BDSV9JTlRNU0ssIGNvcmUtPnBjaV9pcnFtYXNrKTsKKworCS8qIGxvYWQgYW5kIGNvbmZpZ3VyZSBoZWxwZXIgbW9kdWxlcyAqLworCWlmIChUVU5FUl9BQlNFTlQgIT0gY29yZS0+dHVuZXJfdHlwZSkKKwkJcmVxdWVzdF9tb2R1bGUoInR1bmVyIik7CisJaWYgKGNvcmUtPnRkYTk4ODdfY29uZikKKwkJcmVxdWVzdF9tb2R1bGUoInRkYTk4ODciKTsKKwlpZiAoY29yZS0+dHVuZXJfdHlwZSAhPSBVTlNFVCkKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxUVU5FUl9TRVRfVFlQRSwmY29yZS0+dHVuZXJfdHlwZSk7CisJaWYgKGNvcmUtPnRkYTk4ODdfY29uZikKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxUREE5ODg3X1NFVF9DT05GSUcsJmNvcmUtPnRkYTk4ODdfY29uZik7CisKKwkvKiByZWdpc3RlciB2NGwgZGV2aWNlcyAqLworCWRldi0+dmlkZW9fZGV2ID0gY3g4OF92ZGV2X2luaXQoY29yZSxkZXYtPnBjaSwKKwkJCQkJJmN4ODgwMF92aWRlb190ZW1wbGF0ZSwidmlkZW8iKTsKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT52aWRlb19kZXYsVkZMX1RZUEVfR1JBQkJFUiwKKwkJCQkgICAgdmlkZW9fbnJbY29yZS0+bnJdKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlXG4iLAorCQkgICAgICAgY29yZS0+bmFtZSk7CisJCWdvdG8gZmFpbF91bnJlZzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMvMDogcmVnaXN0ZXJlZCBkZXZpY2UgdmlkZW8lZCBbdjRsMl1cbiIsCisJICAgICAgIGNvcmUtPm5hbWUsZGV2LT52aWRlb19kZXYtPm1pbm9yICYgMHgxZik7CisKKwlkZXYtPnZiaV9kZXYgPSBjeDg4X3ZkZXZfaW5pdChjb3JlLGRldi0+cGNpLCZjeDg4MDBfdmJpX3RlbXBsYXRlLCJ2YmkiKTsKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT52YmlfZGV2LFZGTF9UWVBFX1ZCSSwKKwkJCQkgICAgdmJpX25yW2NvcmUtPm5yXSk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMvMDogY2FuJ3QgcmVnaXN0ZXIgdmJpIGRldmljZVxuIiwKKwkJICAgICAgIGNvcmUtPm5hbWUpOworCQlnb3RvIGZhaWxfdW5yZWc7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzLzA6IHJlZ2lzdGVyZWQgZGV2aWNlIHZiaSVkXG4iLAorCSAgICAgICBjb3JlLT5uYW1lLGRldi0+dmJpX2Rldi0+bWlub3IgJiAweDFmKTsKKworCWlmIChjb3JlLT5oYXNfcmFkaW8pIHsKKwkJZGV2LT5yYWRpb19kZXYgPSBjeDg4X3ZkZXZfaW5pdChjb3JlLGRldi0+cGNpLAorCQkJCQkJJmN4ODgwMF9yYWRpb190ZW1wbGF0ZSwicmFkaW8iKTsKKwkJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+cmFkaW9fZGV2LFZGTF9UWVBFX1JBRElPLAorCQkJCQkgICAgcmFkaW9fbnJbY29yZS0+bnJdKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzLzA6IGNhbid0IHJlZ2lzdGVyIHJhZGlvIGRldmljZVxuIiwKKwkJCSAgICAgICBjb3JlLT5uYW1lKTsKKwkJCWdvdG8gZmFpbF91bnJlZzsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICIlcy8wOiByZWdpc3RlcmVkIGRldmljZSByYWRpbyVkXG4iLAorCQkgICAgICAgY29yZS0+bmFtZSxkZXYtPnJhZGlvX2Rldi0+bWlub3IgJiAweDFmKTsKKwl9CisKKwkvKiBldmVyeXRoaW5nIHdvcmtlZCAqLworCWxpc3RfYWRkX3RhaWwoJmRldi0+ZGV2bGlzdCwmY3g4ODAwX2Rldmxpc3QpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LGRldik7CisKKwkvKiBpbml0aWFsIGRldmljZSBjb25maWd1cmF0aW9uICovCisJZG93bigmZGV2LT5sb2NrKTsKKwlpbml0X2NvbnRyb2xzKGRldik7CisJY3g4OF9zZXRfdHZub3JtKGRldi0+Y29yZSx0dm5vcm1zKTsKKwl2aWRlb19tdXgoZGV2LDApOworCXVwKCZkZXYtPmxvY2spOworCisJLyogc3RhcnQgdHZhdWRpbyB0aHJlYWQgKi8KKwlpZiAoY29yZS0+dHVuZXJfdHlwZSAhPSBUVU5FUl9BQlNFTlQpCisJCWNvcmUtPmt0aHJlYWQgPSBrdGhyZWFkX3J1bihjeDg4X2F1ZGlvX3RocmVhZCwgY29yZSwgImN4ODggdHZhdWRpbyIpOworCXJldHVybiAwOworCitmYWlsX3VucmVnOgorCWN4ODgwMF91bnJlZ2lzdGVyX3ZpZGVvKGRldik7CisJZnJlZV9pcnEocGNpX2Rldi0+aXJxLCBkZXYpOworZmFpbF9jb3JlOgorCWN4ODhfY29yZV9wdXQoY29yZSxkZXYtPnBjaSk7CitmYWlsX2ZyZWU6CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY3g4ODAwX2ZpbmlkZXYoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisgICAgICAgIHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisKKwkvKiBzdG9wIHRocmVhZCAqLworCWlmIChkZXYtPmNvcmUtPmt0aHJlYWQpIHsKKwkJa3RocmVhZF9zdG9wKGRldi0+Y29yZS0+a3RocmVhZCk7CisJCWRldi0+Y29yZS0+a3RocmVhZCA9IE5VTEw7CisJfQorCisJY3g4OF9zaHV0ZG93bihkZXYtPmNvcmUpOyAvKiBGSVhNRSAqLworCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKworCS8qIHVucmVnaXN0ZXIgc3R1ZmYgKi8KKworCWZyZWVfaXJxKHBjaV9kZXYtPmlycSwgZGV2KTsKKwljeDg4MDBfdW5yZWdpc3Rlcl92aWRlbyhkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKKworCS8qIGZyZWUgbWVtb3J5ICovCisJYnRjeF9yaXNjbWVtX2ZyZWUoZGV2LT5wY2ksJmRldi0+dmlkcS5zdG9wcGVyKTsKKwlsaXN0X2RlbCgmZGV2LT5kZXZsaXN0KTsKKwljeDg4X2NvcmVfcHV0KGRldi0+Y29yZSxkZXYtPnBjaSk7CisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIGludCBjeDg4MDBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworICAgICAgICBzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisKKwkvKiBzdG9wIHZpZGVvK3ZiaSBjYXB0dXJlICovCisJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+dmlkcS5hY3RpdmUpKSB7CisJCXByaW50aygiJXM6IHN1c3BlbmQgdmlkZW9cbiIsIGNvcmUtPm5hbWUpOworCQlzdG9wX3ZpZGVvX2RtYShkZXYpOworCQlkZWxfdGltZXIoJmRldi0+dmlkcS50aW1lb3V0KTsKKwl9CisJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPnZiaXEuYWN0aXZlKSkgeworCQlwcmludGsoIiVzOiBzdXNwZW5kIHZiaVxuIiwgY29yZS0+bmFtZSk7CisJCWN4ODgwMF9zdG9wX3ZiaV9kbWEoZGV2KTsKKwkJZGVsX3RpbWVyKCZkZXYtPnZiaXEudGltZW91dCk7CisJfQorCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKKworI2lmIDEKKwkvKiBGSVhNRSAtLSBzaHV0ZG93biBkZXZpY2UgKi8KKwljeDg4X3NodXRkb3duKGRldi0+Y29yZSk7CisjZW5kaWYKKworCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOworCWlmICgwICE9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgcGNpX2Nob29zZV9zdGF0ZShwY2lfZGV2LCBzdGF0ZSkpKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKwkJZGV2LT5zdGF0ZS5kaXNhYmxlZCA9IDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4ODgwMF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisgICAgICAgIHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKworCWlmIChkZXYtPnN0YXRlLmRpc2FibGVkKSB7CisJCXBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCQlkZXYtPnN0YXRlLmRpc2FibGVkID0gMDsKKwl9CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworCisjaWYgMQorCS8qIEZJWE1FOiByZS1pbml0aWFsaXplIGhhcmR3YXJlICovCisJY3g4OF9yZXNldChkZXYtPmNvcmUpOworI2VuZGlmCisKKwkvKiByZXN0YXJ0IHZpZGVvK3ZiaSBjYXB0dXJlICovCisJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+dmlkcS5hY3RpdmUpKSB7CisJCXByaW50aygiJXM6IHJlc3VtZSB2aWRlb1xuIiwgY29yZS0+bmFtZSk7CisJCXJlc3RhcnRfdmlkZW9fcXVldWUoZGV2LCZkZXYtPnZpZHEpOworCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+dmJpcS5hY3RpdmUpKSB7CisJCXByaW50aygiJXM6IHJlc3VtZSB2YmlcbiIsIGNvcmUtPm5hbWUpOworCQljeDg4MDBfcmVzdGFydF92YmlfcXVldWUoZGV2LCZkZXYtPnZiaXEpOworCX0KKwlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IHBjaV9kZXZpY2VfaWQgY3g4ODAwX3BjaV90YmxbXSA9IHsKKwl7CisJCS52ZW5kb3IgICAgICAgPSAweDE0ZjEsCisJCS5kZXZpY2UgICAgICAgPSAweDg4MDAsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IFBDSV9BTllfSUQsCisJfSx7CisJCS8qIC0tLSBlbmQgb2YgbGlzdCAtLS0gKi8KKwl9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGN4ODgwMF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGN4ODgwMF9wY2lfZHJpdmVyID0geworICAgICAgICAubmFtZSAgICAgPSAiY3g4ODAwIiwKKyAgICAgICAgLmlkX3RhYmxlID0gY3g4ODAwX3BjaV90YmwsCisgICAgICAgIC5wcm9iZSAgICA9IGN4ODgwMF9pbml0ZGV2LAorICAgICAgICAucmVtb3ZlICAgPSBfX2RldmV4aXRfcChjeDg4MDBfZmluaWRldiksCisKKwkuc3VzcGVuZCAgPSBjeDg4MDBfc3VzcGVuZCwKKwkucmVzdW1lICAgPSBjeDg4MDBfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBjeDg4MDBfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHggdjRsMiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCisJICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAorCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gIDgpICYgMHhmZiwKKwkgICAgICAgQ1g4OF9WRVJTSU9OX0NPREUgJiAweGZmKTsKKyNpZmRlZiBTTkFQU0hPVAorCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHg6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCisJICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7CisjZW5kaWYKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3g4ODAwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBjeDg4MDBfZmluaSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3g4ODAwX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjeDg4MDBfaW5pdCk7Cittb2R1bGVfZXhpdChjeDg4MDBfZmluaSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1MWQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKQEAgLTAsMCArMSw1NTEgQEAKKy8qCisgKiAkSWQ6IGN4ODguaCx2IDEuNTYgMjAwNS8wMy8wNCAwOToxMjoyMyBrcmF4ZWwgRXhwICQKKyAqCisgKiB2NGwyIGRldmljZSBkcml2ZXIgZm9yIGN4MjM4OHggYmFzZWQgVFYgY2FyZHMKKyAqCisgKiAoYykgMjAwMywwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTVVNFIExhYnNdCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKworI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvdHZlZXByb20uaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYtZHZiLmg+CisKKyNpbmNsdWRlICJidGN4LXJpc2MuaCIKKyNpbmNsdWRlICJjeDg4LXJlZy5oIgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2RlZmluZSBDWDg4X1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLDAsNCkKKworI2lmbmRlZiBUUlVFCisjIGRlZmluZSBUUlVFICgxPT0xKQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjIGRlZmluZSBGQUxTRSAoMT09MCkKKyNlbmRpZgorI2RlZmluZSBVTlNFVCAoLTFVKQorCisjZGVmaW5lIENYODhfTUFYQk9BUkRTIDgKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGRlZmluZXMgYW5kIGVudW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVjRMMl9JMkNfQ0xJRU5UUyAxCisKKyNkZWZpbmUgRk9STUFUX0ZMQUdTX1BBQ0tFRCAgICAgICAweDAxCisjZGVmaW5lIEZPUk1BVF9GTEFHU19QTEFOQVIgICAgICAgMHgwMgorCisjZGVmaW5lIFZCSV9MSU5FX0NPVU5UICAgICAgICAgICAgICAxNworI2RlZmluZSBWQklfTElORV9MRU5HVEggICAgICAgICAgIDIwNDgKKworLyogbmVlZCAic2hhZG93IiByZWdpc3RlcnMgZm9yIHNvbWUgd3JpdGUtb25seSBvbmVzIC4uLiAqLworI2RlZmluZSBTSEFET1dfQVVEX1ZPTF9DVEwgICAgICAgICAgIDEKKyNkZWZpbmUgU0hBRE9XX0FVRF9CQUxfQ1RMICAgICAgICAgICAyCisjZGVmaW5lIFNIQURPV19NQVggICAgICAgICAgICAgICAgICAgMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdHYgbm9ybXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RydWN0IGN4ODhfdHZub3JtIHsKKwljaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOworCXY0bDJfc3RkX2lkICAgICAgICAgICAgaWQ7CisJdTMyICAgICAgICAgICAgICAgICAgICBjeGlmb3JtYXQ7CisJdTMyICAgICAgICAgICAgICAgICAgICBjeG9mb3JtYXQ7Cit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGlubGluZSBub3JtX21heHcoc3RydWN0IGN4ODhfdHZub3JtICpub3JtKQoreworCXJldHVybiAobm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApID8gNzY4IDogNjQwOworLy8JcmV0dXJuIChub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgPyA3MjAgOiA2NDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5saW5lIG5vcm1fbWF4aChzdHJ1Y3QgY3g4OF90dm5vcm0gKm5vcm0pCit7CisJcmV0dXJuIChub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgPyA1NzYgOiA0ODA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBzdGF0aWMgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdHJ1Y3QgY3g4ODAwX2ZtdCB7CisJY2hhciAgKm5hbWU7CisJdTMyICAgZm91cmNjOyAgICAgICAgICAvKiB2NGwyIGZvcm1hdCBpZCAqLworCWludCAgIGRlcHRoOworCWludCAgIGZsYWdzOworCXUzMiAgIGN4Zm9ybWF0OworfTsKKworc3RydWN0IGN4ODhfY3RybCB7CisJc3RydWN0IHY0bDJfcXVlcnljdHJsICB2OworCXUzMiAgICAgICAgICAgICAgICAgICAgb2ZmOworCXUzMiAgICAgICAgICAgICAgICAgICAgcmVnOworCXUzMiAgICAgICAgICAgICAgICAgICAgc3JlZzsKKwl1MzIgICAgICAgICAgICAgICAgICAgIG1hc2s7CisJdTMyICAgICAgICAgICAgICAgICAgICBzaGlmdDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBTUkFNIG1lbW9yeSBtYW5hZ2VtZW50IGRhdGEgKHNlZSBjeDg4LWNvcmUuYykgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFNSQU1fQ0gyMSAwICAgLyogdmlkZW8gKi8KKyNkZWZpbmUgU1JBTV9DSDIyIDEKKyNkZWZpbmUgU1JBTV9DSDIzIDIKKyNkZWZpbmUgU1JBTV9DSDI0IDMgICAvKiB2YmkgICAqLworI2RlZmluZSBTUkFNX0NIMjUgNCAgIC8qIGF1ZGlvICovCisjZGVmaW5lIFNSQU1fQ0gyNiA1CisjZGVmaW5lIFNSQU1fQ0gyOCA2ICAgLyogbXBlZyAqLworLyogbW9yZSAqLworCitzdHJ1Y3Qgc3JhbV9jaGFubmVsIHsKKwljaGFyICpuYW1lOworCXUzMiAgY21kc19zdGFydDsKKwl1MzIgIGN0cmxfc3RhcnQ7CisJdTMyICBjZHQ7CisJdTMyICBmaWZvX3N0YXJ0OworCXUzMiAgZmlmb19zaXplOworCXUzMiAgcHRyMV9yZWc7CisJdTMyICBwdHIyX3JlZzsKKwl1MzIgIGNudDFfcmVnOworCXUzMiAgY250Ml9yZWc7Cit9OworZXh0ZXJuIHN0cnVjdCBzcmFtX2NoYW5uZWwgY3g4OF9zcmFtX2NoYW5uZWxzW107CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBjYXJkIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIENYODhfQk9BUkRfTk9BVVRPICAgICAgICAgICAgICAgVU5TRVQKKyNkZWZpbmUgQ1g4OF9CT0FSRF9VTktOT1dOICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDWDg4X0JPQVJEX0hBVVBQQVVHRSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENYODhfQk9BUkRfR0RJICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ1g4OF9CT0FSRF9QSVhFTFZJRVcgICAgICAgICAgICAgICAgMworI2RlZmluZSBDWDg4X0JPQVJEX0FUSV9XT05ERVJfUFJPICAgICAgICAgICA0CisjZGVmaW5lIENYODhfQk9BUkRfV0lORkFTVDIwMDBYUF9FWFBFUlQgICAgIDUKKyNkZWZpbmUgQ1g4OF9CT0FSRF9BVkVSVFZfMzAzICAgICAgICAgICAgICAgNgorI2RlZmluZSBDWDg4X0JPQVJEX01TSV9UVkFOWVdIRVJFX01BU1RFUiAgICA3CisjZGVmaW5lIENYODhfQk9BUkRfV0lORkFTVF9EVjIwMDAgICAgICAgICAgIDgKKyNkZWZpbmUgQ1g4OF9CT0FSRF9MRUFEVEVLX1BWUjIwMDAgICAgICAgICAgOQorI2RlZmluZSBDWDg4X0JPQVJEX0lPREFUQV9HVlZDUDNQQ0kgICAgICAgIDEwCisjZGVmaW5lIENYODhfQk9BUkRfUFJPTElOS19QTEFZVFZQVlIgICAgICAgMTEKKyNkZWZpbmUgQ1g4OF9CT0FSRF9BU1VTX1BWUl80MTYgICAgICAgICAgICAxMgorI2RlZmluZSBDWDg4X0JPQVJEX01TSV9UVkFOWVdIRVJFICAgICAgICAgIDEzCisjZGVmaW5lIENYODhfQk9BUkRfS1dPUkxEX0RWQl9UICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UMSAxNQorI2RlZmluZSBDWDg4X0JPQVJEX0tXT1JMRF9MVFY4ODMgICAgICAgICAgIDE2CisjZGVmaW5lIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTEQgMTcKKyNkZWZpbmUgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxICAgICAgICAxOAorI2RlZmluZSBDWDg4X0JPQVJEX0NPTkVYQU5UX0RWQl9UMSAgICAgICAgIDE5CisjZGVmaW5lIENYODhfQk9BUkRfUFJPVklERU9fUFYyNTkgICAgICAgICAgMjAKKyNkZWZpbmUgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BMVVMgMjEKKyNkZWZpbmUgQ1g4OF9CT0FSRF9QQ0hEVFZfSEQzMDAwICAgICAgICAgICAyMgorI2RlZmluZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVCAgICAgICAgIDIzCisjZGVmaW5lIENYODhfQk9BUkRfSEFVUFBBVUdFX1JPU0xZTiAgICAgICAgMjQKKyNkZWZpbmUgQ1g4OF9CT0FSRF9ESUdJVEFMTE9HSUNfTUVDCSAgICAgICAyNQorI2RlZmluZSBDWDg4X0JPQVJEX0lPREFUQV9HVkJDVFY3RSAgICAgICAgIDI2CisKK2VudW0gY3g4OF9pdHlwZSB7CisJQ1g4OF9WTVVYX0NPTVBPU0lURTEgPSAxLAorCUNYODhfVk1VWF9DT01QT1NJVEUyLAorCUNYODhfVk1VWF9DT01QT1NJVEUzLAorCUNYODhfVk1VWF9DT01QT1NJVEU0LAorCUNYODhfVk1VWF9TVklERU8sCisJQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJQ1g4OF9WTVVYX0NBQkxFLAorCUNYODhfVk1VWF9EVkIsCisJQ1g4OF9WTVVYX0RFQlVHLAorCUNYODhfUkFESU8sCit9OworCitzdHJ1Y3QgY3g4OF9pbnB1dCB7CisJZW51bSBjeDg4X2l0eXBlIHR5cGU7CisJdW5zaWduZWQgaW50ICAgIHZtdXg7CisJdTMyICAgICAgICAgICAgIGdwaW8wLCBncGlvMSwgZ3BpbzIsIGdwaW8zOworfTsKKworc3RydWN0IGN4ODhfYm9hcmQgeworCWNoYXIgICAgICAgICAgICAgICAgICAgICpuYW1lOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHR1bmVyX3R5cGU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgdGRhOTg4N19jb25mOworCXN0cnVjdCBjeDg4X2lucHV0ICAgICAgIGlucHV0WzhdOworCXN0cnVjdCBjeDg4X2lucHV0ICAgICAgIHJhZGlvOworCWludCAgICAgICAgICAgICAgICAgICAgIGJsYWNrYmlyZDoxOworCWludCAgICAgICAgICAgICAgICAgICAgIGR2YjoxOworfTsKKworc3RydWN0IGN4ODhfc3ViaWQgeworCXUxNiAgICAgc3VidmVuZG9yOworCXUxNiAgICAgc3ViZGV2aWNlOworCXUzMiAgICAgY2FyZDsKK307CisKKyNkZWZpbmUgSU5QVVQobnIpICgmY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLmlucHV0W25yXSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGRldmljZSAvIGZpbGUgaGFuZGxlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUkVTT1VSQ0VfT1ZFUkxBWSAgICAgICAxCisjZGVmaW5lIFJFU09VUkNFX1ZJREVPICAgICAgICAgMgorI2RlZmluZSBSRVNPVVJDRV9WQkkgICAgICAgICAgIDQKKworI2RlZmluZSBCVUZGRVJfVElNRU9VVCAgICAgKEhaLzIpICAvKiAwLjUgc2Vjb25kcyAqLworLy8jZGVmaW5lIEJVRkZFUl9USU1FT1VUICAgICAoSFoqMikKKworLyogYnVmZmVyIGZvciBvbmUgdmlkZW8gZnJhbWUgKi8KK3N0cnVjdCBjeDg4X2J1ZmZlciB7CisJLyogY29tbW9uIHY0bCBidWZmZXIgc3R1ZmYgLS0gbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgdmI7CisKKwkvKiBjeDg4IHNwZWNpZmljICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICBicGw7CisJc3RydWN0IGJ0Y3hfcmlzY21lbSAgICByaXNjOworCXN0cnVjdCBjeDg4MDBfZm10ICAgICAgKmZtdDsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGNvdW50OworfTsKKworc3RydWN0IGN4ODhfZG1hcXVldWUgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgYWN0aXZlOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgcXVldWVkOworCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgdGltZW91dDsKKwlzdHJ1Y3QgYnRjeF9yaXNjbWVtICAgIHN0b3BwZXI7CisJdTMyICAgICAgICAgICAgICAgICAgICBjb3VudDsKK307CisKK3N0cnVjdCBjeDg4X2NvcmUgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgIGRldmxpc3Q7CisJYXRvbWljX3QgICAgICAgICAgICAgICAgICAgcmVmY291bnQ7CisKKwkvKiBib2FyZCBuYW1lICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgbnI7CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgbmFtZVszMl07CisKKwkvKiBwY2kgc3R1ZmYgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBwY2lfYnVzOworCWludCAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9zbG90OworICAgICAgICB1MzIgICAgICAgICAgICAgICAgICAgICAgICBfX2lvbWVtICpsbW1pbzsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgX19pb21lbSAqYm1taW87CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93W1NIQURPV19NQVhdOworCWludCAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9pcnFtYXNrOworCisJLyogaTJjIGkvbyAqLworCXN0cnVjdCBpMmNfYWRhcHRlciAgICAgICAgIGkyY19hZGFwOworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAgIGkyY19hbGdvOworCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICAgIGkyY19jbGllbnQ7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgaTJjX3N0YXRlLCBpMmNfcmM7CisKKwkvKiBjb25maWcgaW5mbyAtLSBhbmFsb2cgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBib2FyZDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICB0dW5lcl90eXBlOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHRkYTk4ODdfY29uZjsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBoYXNfcmFkaW87CisKKwkvKiBjb25maWcgaW5mbyAtLSBkdmIgKi8KKwlzdHJ1Y3QgZHZiX3BsbF9kZXNjICAgICAgICAqcGxsX2Rlc2M7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgcGxsX2FkZHI7CisKKwkvKiBzdGF0ZSBpbmZvICovCisJc3RydWN0IHRhc2tfc3RydWN0ICAgICAgICAgKmt0aHJlYWQ7CisJc3RydWN0IGN4ODhfdHZub3JtICAgICAgICAgKnR2bm9ybTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICB0dmF1ZGlvOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvbW9kZV9tYW51YWw7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9tb2RlX2N1cnJlbnQ7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgYXN0YXQ7CisKKwkvKiBJUiByZW1vdGUgY29udHJvbCBzdGF0ZSAqLworCXN0cnVjdCBjeDg4X0lSICAgICAgICAgICAgICppcjsKK307CisKK3N0cnVjdCBjeDg4MDBfZGV2Oworc3RydWN0IGN4ODgwMl9kZXY7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBmdW5jdGlvbiAwOiB2aWRlbyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdHJ1Y3QgY3g4ODAwX2ZoIHsKKwlzdHJ1Y3QgY3g4ODAwX2RldiAgICAgICAgICAqZGV2OworCWVudW0gdjRsMl9idWZfdHlwZSAgICAgICAgIHR5cGU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW87CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgcmVzb3VyY2VzOworCisJLyogdmlkZW8gb3ZlcmxheSAqLworCXN0cnVjdCB2NGwyX3dpbmRvdyAgICAgICAgIHdpbjsKKwlzdHJ1Y3QgdjRsMl9jbGlwICAgICAgICAgICAqY2xpcHM7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgbmNsaXBzOworCisJLyogdmlkZW8gY2FwdHVyZSAqLworCXN0cnVjdCBjeDg4MDBfZm10ICAgICAgICAgICpmbXQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgd2lkdGgsaGVpZ2h0OworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAgICAgIHZpZHE7CisKKwkvKiB2YmkgY2FwdHVyZSAqLworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAgICAgIHZiaXE7Cit9OworCitzdHJ1Y3QgY3g4ODAwX3N1c3BlbmRfc3RhdGUgeworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOworfTsKKworc3RydWN0IGN4ODgwMF9kZXYgeworCXN0cnVjdCBjeDg4X2NvcmUgICAgICAgICAgICpjb3JlOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgIGRldmxpc3Q7CisgICAgICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgICAgICAgIGxvY2s7CisgICAgICAgCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgIHNsb2NrOworCisJLyogdmFyaW91cyBkZXZpY2UgaW5mbyAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHJlc291cmNlczsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICAgICAgICAqdmlkZW9fZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgICAgICAgICp2YmlfZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgICAgICAgICpyYWRpb19kZXY7CisKKwkvKiBwY2kgaS9vICovCisJc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgKnBjaTsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICBwY2lfcmV2LHBjaV9sYXQ7CisKKyNpZiAwCisJLyogdmlkZW8gb3ZlcmxheSAqLworCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICAgIGZidWY7CisJc3RydWN0IGN4ODhfYnVmZmVyICAgICAgICAgKnNjcmVlbjsKKyNlbmRpZgorCisJLyogY2FwdHVyZSBxdWV1ZXMgKi8KKwlzdHJ1Y3QgY3g4OF9kbWFxdWV1ZSAgICAgICB2aWRxOworCXN0cnVjdCBjeDg4X2RtYXF1ZXVlICAgICAgIHZiaXE7CisKKwkvKiB2YXJpb3VzIHY0bCBjb250cm9scyAqLworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGZyZXE7CisKKwkvKiBvdGhlciBnbG9iYWwgc3RhdGUgaW5mbyAqLworCXN0cnVjdCBjeDg4MDBfc3VzcGVuZF9zdGF0ZSBzdGF0ZTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBmdW5jdGlvbiAxOiBhdWRpby9hbHNhIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdHJ1Y3QgY3g4ODAxX2RldiB7CisJc3RydWN0IGN4ODhfY29yZSAgICAgICAgICAgKmNvcmU7CisKKwkvKiBwY2kgaS9vICovCisJc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgKnBjaTsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICBwY2lfcmV2LHBjaV9sYXQ7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZnVuY3Rpb24gMjogbXBlZyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RydWN0IGN4ODgwMl9maCB7CisJc3RydWN0IGN4ODgwMl9kZXYgICAgICAgICAgKmRldjsKKwlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgICAgICBtcGVncTsKK307CisKK3N0cnVjdCBjeDg4MDJfc3VzcGVuZF9zdGF0ZSB7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ7Cit9OworCitzdHJ1Y3QgY3g4ODAyX2RldiB7CisJc3RydWN0IGN4ODhfY29yZSAgICAgICAgICAgKmNvcmU7CisgICAgICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgICAgICAgIGxvY2s7CisgICAgICAgCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgIHNsb2NrOworCisJLyogcGNpIGkvbyAqLworCXN0cnVjdCBwY2lfZGV2ICAgICAgICAgICAgICpwY2k7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgcGNpX3JldixwY2lfbGF0OworCisJLyogZG1hIHF1ZXVlcyAqLworCXN0cnVjdCBjeDg4X2RtYXF1ZXVlICAgICAgIG1wZWdxOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIHRzX3BhY2tldF9zaXplOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIHRzX3BhY2tldF9jb3VudDsKKworCS8qIG90aGVyIGdsb2JhbCBzdGF0ZSBpbmZvICovCisJc3RydWN0IGN4ODgwMl9zdXNwZW5kX3N0YXRlIHN0YXRlOworCisJLyogZm9yIGJsYWNrYmlyZCBvbmx5ICovCisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgZGV2bGlzdDsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICAgICAgICAqbXBlZ19kZXY7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgbWFpbGJveDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ7CisKKwkvKiBmb3IgZHZiIG9ubHkgKi8KKwlzdHJ1Y3QgdmlkZW9idWZfZHZiICAgICAgICBkdmI7CisJdm9pZCogICAgICAgICAgICAgICAgICAgICAgZmVfaGFuZGxlOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZmVfcmVsZWFzZSkodm9pZCAqaGFuZGxlKTsKKworCS8qIGZvciBzd2l0Y2hpbmcgbW9kdWxhdGlvbiB0eXBlcyAqLworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgIHRzX2dlbl9jbnRybDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgY3hfcmVhZChyZWcpICAgICAgICAgICAgIHJlYWRsKGNvcmUtPmxtbWlvICsgKChyZWcpPj4yKSkKKyNkZWZpbmUgY3hfd3JpdGUocmVnLHZhbHVlKSAgICAgIHdyaXRlbCgodmFsdWUpLCBjb3JlLT5sbW1pbyArICgocmVnKT4+MikpCisjZGVmaW5lIGN4X3dyaXRlYihyZWcsdmFsdWUpICAgICB3cml0ZWIoKHZhbHVlKSwgY29yZS0+Ym1taW8gKyAocmVnKSkKKworI2RlZmluZSBjeF9hbmRvcihyZWcsbWFzayx2YWx1ZSkgXAorICB3cml0ZWwoKHJlYWRsKGNvcmUtPmxtbWlvKygocmVnKT4+MikpICYgfihtYXNrKSkgfFwKKyAgKCh2YWx1ZSkgJiAobWFzaykpLCBjb3JlLT5sbW1pbysoKHJlZyk+PjIpKQorI2RlZmluZSBjeF9zZXQocmVnLGJpdCkgICAgICAgICAgY3hfYW5kb3IoKHJlZyksKGJpdCksKGJpdCkpCisjZGVmaW5lIGN4X2NsZWFyKHJlZyxiaXQpICAgICAgICBjeF9hbmRvcigocmVnKSwoYml0KSwwKQorCisjZGVmaW5lIGN4X3dhaXQoZCkgeyBpZiAobmVlZF9yZXNjaGVkKCkpIHNjaGVkdWxlKCk7IGVsc2UgdWRlbGF5KGQpOyB9CisKKy8qIHNoYWRvdyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgY3hfc3JlYWQoc3JlZykJCSAgICAoY29yZS0+c2hhZG93W3NyZWddKQorI2RlZmluZSBjeF9zd3JpdGUoc3JlZyxyZWcsdmFsdWUpIFwKKyAgKGNvcmUtPnNoYWRvd1tzcmVnXSA9IHZhbHVlLCBcCisgICB3cml0ZWwoY29yZS0+c2hhZG93W3NyZWddLCBjb3JlLT5sbW1pbyArICgocmVnKT4+MikpKQorI2RlZmluZSBjeF9zYW5kb3Ioc3JlZyxyZWcsbWFzayx2YWx1ZSkgXAorICAoY29yZS0+c2hhZG93W3NyZWddID0gKGNvcmUtPnNoYWRvd1tzcmVnXSAmIH4obWFzaykpIHwgKCh2YWx1ZSkgJiAobWFzaykpLCBcCisgICB3cml0ZWwoY29yZS0+c2hhZG93W3NyZWddLCBjb3JlLT5sbW1pbyArICgocmVnKT4+MikpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogY3g4OC1jb3JlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworZXh0ZXJuIGNoYXIgKmN4ODhfcGNpX2lycXNbMzJdOworZXh0ZXJuIGNoYXIgKmN4ODhfdmlkX2lycXNbMzJdOworZXh0ZXJuIGNoYXIgKmN4ODhfbXBlZ19pcnFzWzMyXTsKK2V4dGVybiB2b2lkIGN4ODhfcHJpbnRfaXJxYml0cyhjaGFyICpuYW1lLCBjaGFyICp0YWcsIGNoYXIgKipzdHJpbmdzLAorCQkJICAgICAgIHUzMiBiaXRzLCB1MzIgbWFzayk7CitleHRlcm4gdm9pZCBjeDg4X3ByaW50X2lvY3RsKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBjbWQpOworCitleHRlcm4gaW50IGN4ODhfY29yZV9pcnEoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdTMyIHN0YXR1cyk7CitleHRlcm4gdm9pZCBjeDg4X3dha2V1cChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLAorCQkJc3RydWN0IGN4ODhfZG1hcXVldWUgKnEsIHUzMiBjb3VudCk7CitleHRlcm4gdm9pZCBjeDg4X3NodXRkb3duKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpOworZXh0ZXJuIGludCBjeDg4X3Jlc2V0KHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpOworCitleHRlcm4gaW50CitjeDg4X3Jpc2NfYnVmZmVyKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCisJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKKwkJIHVuc2lnbmVkIGludCB0b3Bfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgYm90dG9tX29mZnNldCwKKwkJIHVuc2lnbmVkIGludCBicGwsIHVuc2lnbmVkIGludCBwYWRkaW5nLCB1bnNpZ25lZCBpbnQgbGluZXMpOworZXh0ZXJuIGludAorY3g4OF9yaXNjX2RhdGFidWZmZXIoc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IGJ0Y3hfcmlzY21lbSAqcmlzYywKKwkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgdW5zaWduZWQgaW50IGJwbCwKKwkJICAgICB1bnNpZ25lZCBpbnQgbGluZXMpOworZXh0ZXJuIGludAorY3g4OF9yaXNjX3N0b3BwZXIoc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IGJ0Y3hfcmlzY21lbSAqcmlzYywKKwkJICB1MzIgcmVnLCB1MzIgbWFzaywgdTMyIHZhbHVlKTsKK2V4dGVybiB2b2lkCitjeDg4X2ZyZWVfYnVmZmVyKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmKTsKKworZXh0ZXJuIHZvaWQgY3g4OF9yaXNjX2Rpc2FzbShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLAorCQkJICAgICBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjKTsKK2V4dGVybiBpbnQgY3g4OF9zcmFtX2NoYW5uZWxfc2V0dXAoc3RydWN0IGN4ODhfY29yZSAqY29yZSwKKwkJCQkgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgYnBsLCB1MzIgcmlzYyk7CitleHRlcm4gdm9pZCBjeDg4X3NyYW1fY2hhbm5lbF9kdW1wKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsCisJCQkJICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2gpOworCitleHRlcm4gaW50IGN4ODhfc2V0X3NjYWxlKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHVuc2lnbmVkIGludCB3aWR0aCwKKwkJCSAgdW5zaWduZWQgaW50IGhlaWdodCwgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKTsKK2V4dGVybiBpbnQgY3g4OF9zZXRfdHZub3JtKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHN0cnVjdCBjeDg4X3R2bm9ybSAqbm9ybSk7CisKK2V4dGVybiBzdHJ1Y3QgdmlkZW9fZGV2aWNlICpjeDg4X3ZkZXZfaW5pdChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLAorCQkJCQkgICBzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCQkgICBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp0ZW1wbGF0ZSwKKwkJCQkJICAgY2hhciAqdHlwZSk7CitleHRlcm4gc3RydWN0IGN4ODhfY29yZSogY3g4OF9jb3JlX2dldChzdHJ1Y3QgcGNpX2RldiAqcGNpKTsKK2V4dGVybiB2b2lkIGN4ODhfY29yZV9wdXQoc3RydWN0IGN4ODhfY29yZSAqY29yZSwKKwkJCSAgc3RydWN0IHBjaV9kZXYgKnBjaSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBjeDg4LXZiaS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit2b2lkIGN4ODgwMF92YmlfZm10KHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CitpbnQgY3g4ODAwX3N0YXJ0X3ZiaV9kbWEoc3RydWN0IGN4ODgwMF9kZXYgICAgKmRldiwKKwkJCSBzdHJ1Y3QgY3g4OF9kbWFxdWV1ZSAqcSwKKwkJCSBzdHJ1Y3QgY3g4OF9idWZmZXIgICAqYnVmKTsKK2ludCBjeDg4MDBfc3RvcF92YmlfZG1hKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYpOworaW50IGN4ODgwMF9yZXN0YXJ0X3ZiaV9xdWV1ZShzdHJ1Y3QgY3g4ODAwX2RldiAgICAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY3g4OF9kbWFxdWV1ZSAqcSk7Cit2b2lkIGN4ODgwMF92YmlfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOworCitleHRlcm4gc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyBjeDg4MDBfdmJpX3FvcHM7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBjeDg4LWkyYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitleHRlcm4gaW50IGN4ODhfaTJjX2luaXQoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgc3RydWN0IHBjaV9kZXYgKnBjaSk7CitleHRlcm4gdm9pZCBjeDg4X2NhbGxfaTJjX2NsaWVudHMoc3RydWN0IGN4ODhfY29yZSAqY29yZSwKKwkJCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGN4ODgtY2FyZHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2V4dGVybiBzdHJ1Y3QgY3g4OF9ib2FyZCBjeDg4X2JvYXJkc1tdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBjeDg4X2Jjb3VudDsKKworZXh0ZXJuIHN0cnVjdCBjeDg4X3N1YmlkIGN4ODhfc3ViaWRzW107CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IGN4ODhfaWRjb3VudDsKKworZXh0ZXJuIHZvaWQgY3g4OF9jYXJkX2xpc3Qoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgc3RydWN0IHBjaV9kZXYgKnBjaSk7CitleHRlcm4gdm9pZCBjeDg4X2NhcmRfc2V0dXAoc3RydWN0IGN4ODhfY29yZSAqY29yZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBjeDg4LXR2YXVkaW8uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFdXX05PTkUJCSAxCisjZGVmaW5lIFdXX0JUU0MJCSAyCisjZGVmaW5lIFdXX05JQ0FNX0kJIDMKKyNkZWZpbmUgV1dfTklDQU1fQkdES0wJIDQKKyNkZWZpbmUgV1dfQTEJCSA1CisjZGVmaW5lIFdXX0EyX0JHCSA2CisjZGVmaW5lIFdXX0EyX0RLCSA3CisjZGVmaW5lIFdXX0EyX00JCSA4CisjZGVmaW5lIFdXX0VJQUoJCSA5CisjZGVmaW5lIFdXX1NZU1RFTV9MX0FNCTEwCisjZGVmaW5lIFdXX0kyU1BUCTExCisjZGVmaW5lIFdXX0ZNCQkxMgorCit2b2lkIGN4ODhfc2V0X3R2YXVkaW8oc3RydWN0IGN4ODhfY29yZSAqY29yZSk7Cit2b2lkIGN4ODhfbmV3c3RhdGlvbihzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlKTsKK3ZvaWQgY3g4OF9nZXRfc3RlcmVvKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHN0cnVjdCB2NGwyX3R1bmVyICp0KTsKK3ZvaWQgY3g4OF9zZXRfc3RlcmVvKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHUzMiBtb2RlLCBpbnQgbWFudWFsKTsKK2ludCBjeDg4X2F1ZGlvX3RocmVhZCh2b2lkICpkYXRhKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGN4ODgtaW5wdXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2ludCBjeDg4X2lyX2luaXQoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgc3RydWN0IHBjaV9kZXYgKnBjaSk7CitpbnQgY3g4OF9pcl9maW5pKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpOwordm9pZCBjeDg4X2lyX2lycShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGN4ODgtbXBlZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2ludCBjeDg4MDJfYnVmX3ByZXBhcmUoc3RydWN0IGN4ODgwMl9kZXYgKmRldiwgc3RydWN0IGN4ODhfYnVmZmVyICpidWYpOwordm9pZCBjeDg4MDJfYnVmX3F1ZXVlKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYsIHN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmKTsKK3ZvaWQgY3g4ODAyX2NhbmNlbF9idWZmZXJzKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpOworCitpbnQgY3g4ODAyX2luaXRfY29tbW9uKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpOwordm9pZCBjeDg4MDJfZmluaV9jb21tb24oc3RydWN0IGN4ODgwMl9kZXYgKmRldik7CisKK2ludCBjeDg4MDJfc3VzcGVuZF9jb21tb24oc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitpbnQgY3g4ODAyX3Jlc3VtZV9jb21tb24oc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kcGM3MTQ2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RwYzcxNDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTk0ODExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kcGM3MTQ2LmMKQEAgLTAsMCArMSw0MDEgQEAKKy8qCisgICAgZHBjNzE0Ni5jIC0gdjRsMiBkcml2ZXIgZm9yIHRoZSBkcGM3MTQ2IGRlbW9uc3RyYXRpb24gYm9hcmQKKyAgICAKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBNaWNoYWVsIEh1bm9sZCA8bWljaGFlbEBtaWh1LmRlPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjZGVmaW5lIERFQlVHX1ZBUklBQkxFIGRlYnVnCisKKyNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2X3Z2Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgkvKiBmb3Igc2FhNzExMWEgKi8KKworI2RlZmluZSBJMkNfU0FBNzExMUEgICAgICAgICAgICAweDI0CisKKy8qIEFsbCB1bnVzZWQgYnl0ZXMgYXJlIHJlc2VydmVyZC4gKi8KKyNkZWZpbmUgU0FBNzExWF9DSElQX1ZFUlNJT04gICAgICAgICAgICAweDAwCisjZGVmaW5lIFNBQTcxMVhfQU5BTE9HX0lOUFVUX0NPTlRST0xfMSAgMHgwMgorI2RlZmluZSBTQUE3MTFYX0FOQUxPR19JTlBVVF9DT05UUk9MXzIgIDB4MDMKKyNkZWZpbmUgU0FBNzExWF9BTkFMT0dfSU5QVVRfQ09OVFJPTF8zICAweDA0CisjZGVmaW5lIFNBQTcxMVhfQU5BTE9HX0lOUFVUX0NPTlRST0xfNCAgMHgwNQorI2RlZmluZSBTQUE3MTFYX0hPUklaT05UQUxfU1lOQ19TVEFSVCAgIDB4MDYKKyNkZWZpbmUgU0FBNzExWF9IT1JJWk9OVEFMX1NZTkNfU1RPUCAgICAweDA3CisjZGVmaW5lIFNBQTcxMVhfU1lOQ19DT05UUk9MICAgICAgICAgICAgMHgwOAorI2RlZmluZSBTQUE3MTFYX0xVTUlOQU5DRV9DT05UUk9MICAgICAgIDB4MDkKKyNkZWZpbmUgU0FBNzExWF9MVU1JTkFOQ0VfQlJJR0hUTkVTUyAgICAweDBBCisjZGVmaW5lIFNBQTcxMVhfTFVNSU5BTkNFX0NPTlRSQVNUICAgICAgMHgwQgorI2RlZmluZSBTQUE3MTFYX0NIUk9NQV9TQVRVUkFUSU9OICAgICAgIDB4MEMKKyNkZWZpbmUgU0FBNzExWF9DSFJPTUFfSFVFX0NPTlRST0wgICAgICAweDBECisjZGVmaW5lIFNBQTcxMVhfQ0hST01BX0NPTlRST0wgICAgICAgICAgMHgwRQorI2RlZmluZSBTQUE3MTFYX0ZPUk1BVF9ERUxBWV9DT05UUk9MICAgIDB4MTAKKyNkZWZpbmUgU0FBNzExWF9PVVRQVVRfQ09OVFJPTF8xICAgICAgICAweDExCisjZGVmaW5lIFNBQTcxMVhfT1VUUFVUX0NPTlRST0xfMiAgICAgICAgMHgxMgorI2RlZmluZSBTQUE3MTFYX09VVFBVVF9DT05UUk9MXzMgICAgICAgIDB4MTMKKyNkZWZpbmUgU0FBNzExWF9WX0dBVEVfMV9TVEFSVCAgICAgICAgICAweDE1CisjZGVmaW5lIFNBQTcxMVhfVl9HQVRFXzFfU1RPUCAgICAgICAgICAgMHgxNgorI2RlZmluZSBTQUE3MTFYX1ZfR0FURV8xX01TQiAgICAgICAgICAgIDB4MTcKKyNkZWZpbmUgU0FBNzExWF9URVhUX1NMSUNFUl9TVEFUVVMgICAgICAweDFBCisjZGVmaW5lIFNBQTcxMVhfREVDT0RFRF9CWVRFU19PRl9UU18xICAgMHgxQgorI2RlZmluZSBTQUE3MTFYX0RFQ09ERURfQllURVNfT0ZfVFNfMiAgIDB4MUMKKyNkZWZpbmUgU0FBNzExWF9TVEFUVVNfQllURSAgICAgICAgICAgICAweDFGCisKKyNkZWZpbmUgRFBDX0JPQVJEX0NBTl9ET19WQkkoZGV2KSAgIChkZXYtPnJldmlzaW9uICE9IDApIAorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyB2ZXJib3NpdHkiKTsKKworc3RhdGljIGludCBkcGNfbnVtID0gMDsKKworI2RlZmluZSBEUENfSU5QVVRTCTIKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9pbnB1dCBkcGNfaW5wdXRzW0RQQ19JTlBVVFNdID0geworCXsgMCwgIlBvcnQgQSIsCVY0TDJfSU5QVVRfVFlQRV9DQU1FUkEsCTIsIDAsIFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sIDAgfSwKKwl7IDEsICJQb3J0IEIiLAlWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBLAkyLCAwLCBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLCAwIH0sCit9OworCisjZGVmaW5lIERQQ19BVURJT1MJMAorCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uX2lvY3RscyBpb2N0bHNbXSA9IHsKKwl7IFZJRElPQ19HX0lOUFVULAlTQUE3MTQ2X0VYQ0xVU0lWRSB9LAorCXsgVklESU9DX1NfSU5QVVQsCVNBQTcxNDZfRVhDTFVTSVZFIH0sCisJeyBWSURJT0NfRU5VTUlOUFVULCAJU0FBNzE0Nl9FWENMVVNJVkUgfSwKKwl7IFZJRElPQ19TX1NURCwJCVNBQTcxNDZfQUZURVIgfSwKKwl7IDAsCQkJMCB9Cit9OworCitzdHJ1Y3QgZHBjCit7CisJc3RydWN0IHZpZGVvX2RldmljZQkqdmlkZW9fZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UJKnZiaV9kZXY7CisKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJaTJjX2FkYXB0ZXI7CQorCXN0cnVjdCBpMmNfY2xpZW50CSpzYWE3MTExYTsKKwkKKwlpbnQgY3VyX2lucHV0OwkvKiBjdXJyZW50IGlucHV0ICovCit9OworCisvKiBmaXhtZTogYWRkIHZiaSBzdHVmZiBoZXJlICovCitzdGF0aWMgaW50IGRwY19wcm9iZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYqIGRldikKK3sKKwlzdHJ1Y3QgZHBjKiBkcGMgPSBOVUxMOwkKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlkcGMgPSAoc3RydWN0IGRwYyopa21hbGxvYyhzaXplb2Yoc3RydWN0IGRwYyksIEdGUF9LRVJORUwpOworCWlmKCBOVUxMID09IGRwYyApIHsKKwkJcHJpbnRrKCJkcGNfdjRsMi5vOiBkcGNfcHJvYmU6IG5vdCBlbm91Z2gga2VybmVsIG1lbW9yeS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGRwYywgMHgwLCBzaXplb2Yoc3RydWN0IGRwYykpOwkKKworCS8qIEZJWE1FOiBlbmFibGUgaTJjLXBvcnQgcGlucywgdmlkZW8tcG9ydC1waW5zCisJICAgdmlkZW8gcG9ydCBwaW5zIHNob3VsZCBiZSBlbmFibGVkIGhlcmUgPyEgKi8KKwlzYWE3MTQ2X3dyaXRlKGRldiwgTUMxLCAoTUFTS18wOCB8IE1BU0tfMjQgfCBNQVNLXzEwIHwgTUFTS18yNikpOworCisJZHBjLT5pMmNfYWRhcHRlciA9IChzdHJ1Y3QgaTJjX2FkYXB0ZXIpIHsKKwkJLmNsYXNzID0gSTJDX0NMQVNTX1RWX0FOQUxPRywKKwkJLm5hbWUgPSAiZHBjNzE0NiIsCisJfTsKKwlzYWE3MTQ2X2kyY19hZGFwdGVyX3ByZXBhcmUoZGV2LCAmZHBjLT5pMmNfYWRhcHRlciwgU0FBNzE0Nl9JMkNfQlVTX0JJVF9SQVRFXzQ4MCk7CisJaWYoaTJjX2FkZF9hZGFwdGVyKCZkcGMtPmkyY19hZGFwdGVyKSA8IDApIHsKKwkJREVCX1MoKCJjYW5ub3QgcmVnaXN0ZXIgaTJjLWRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCWtmcmVlKGRwYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIGxvb3AgdGhyb3VnaCBhbGwgaTJjLWRldmljZXMgb24gdGhlIGJ1cyBhbmQgbG9vayB3aG8gaXMgdGhlcmUgKi8KKwlsaXN0X2Zvcl9lYWNoKGl0ZW0sJmRwYy0+aTJjX2FkYXB0ZXIuY2xpZW50cykgeworCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfY2xpZW50LCBsaXN0KTsKKwkJaWYoIEkyQ19TQUE3MTExQSA9PSBjbGllbnQtPmFkZHIgKSAKKwkJCWRwYy0+c2FhNzExMWEgPSBjbGllbnQ7CisJfQorCisJLyogY2hlY2sgaWYgYWxsIGRldmljZXMgYXJlIHByZXNlbnQgKi8KKwlpZiggMCA9PSBkcGMtPnNhYTcxMTFhICkgeworCQlERUJfRCgoImRwY192NGwyLm86IGRwY19hdHRhY2ggZmFpbGVkIGZvciB0aGlzIGRldmljZS5cbiIpKTsJCisJCWkyY19kZWxfYWRhcHRlcigmZHBjLT5pMmNfYWRhcHRlcik7CisJCWtmcmVlKGRwYyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkKKwkvKiBhbGwgZGV2aWNlcyBhcmUgcHJlc2VudCwgcHJvYmUgd2FzIHN1Y2Nlc3NmdWwgKi8JCisJREVCX0QoKCJkcGNfdjRsMi5vOiBkcGNfcHJvYmUgc3VjY2VlZGVkIGZvciB0aGlzIGRldmljZS5cbiIpKTsJCisKKwkvKiB3ZSBzdG9yZSB0aGUgcG9pbnRlciBpbiBvdXIgcHJpdmF0ZSBkYXRhIGZpZWxkICovCisJZGV2LT5leHRfcHJpdiA9IGRwYzsKKworCXJldHVybiAwOworfQorCisvKiBicmluZyBoYXJkd2FyZSB0byBhIHNhbmUgc3RhdGUuIHRoaXMgaGFzIHRvIGJlIGRvbmUsIGp1c3QgaW4gY2FzZSBzb21lb25lCisgICB3YW50cyB0byBjYXB0dXJlIGZyb20gdGhpcyBkZXZpY2UgYmVmb3JlIGl0IGhhcyBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkLgorICAgdGhlIGNhcHR1cmUgZW5naW5lIHdvdWxkIGJhZGx5IGZhaWwsIGJlY2F1c2Ugbm8gdmFsaWQgc2lnbmFsIGFycml2ZXMgb24gdGhlCisgICBzYWE3MTQ2LCB0aHVzIGxlYWRpbmcgdG8gdGltZW91dHMgYW5kIHN0dWZmLiAqLworc3RhdGljIGludCBkcGNfaW5pdF9kb25lKHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2KQoreworCXN0cnVjdCBkcGMqIGRwYyA9IChzdHJ1Y3QgZHBjKilkZXYtPmV4dF9wcml2OworCisJREVCX0QoKCJkcGNfdjRsMi5vOiBkcGNfaW5pdF9kb25lIGNhbGxlZC5cbiIpKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGhlbHBlciBpY3MgdG8gdXNlZnVsIHZhbHVlcyAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgwMCwgMHgxMSk7CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MDIsIDB4YzApOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgwMywgMHgzMCk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDA0LCAweDAwKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MDUsIDB4MDApOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgwNiwgMHhkZSk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDA3LCAweGFkKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MDgsIDB4YTgpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgwOSwgMHgwMCk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDBhLCAweDgwKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MGIsIDB4NDcpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgwYywgMHg0MCk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDBkLCAweDAwKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MGUsIDB4MDMpOworCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDEwLCAweGQwKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MTEsIDB4MWMpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgxMiwgMHhjMSk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDEzLCAweDMwKTsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgxZiwgMHg4MSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dF92diB2dl9kYXRhOworCisvKiB0aGlzIGZ1bmN0aW9uIG9ubHkgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgcHJvYmluZyB3YXMgc3VjY2Vzc2Z1bCAqLworc3RhdGljIGludCBkcGNfYXR0YWNoKHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2LCBzdHJ1Y3Qgc2FhNzE0Nl9wY2lfZXh0ZW5zaW9uX2RhdGEgKmluZm8pCit7CisJc3RydWN0IGRwYyogZHBjID0gKHN0cnVjdCBkcGMqKWRldi0+ZXh0X3ByaXY7CisJCisJREVCX0QoKCJkcGNfdjRsMi5vOiBkcGNfYXR0YWNoIGNhbGxlZC5cbiIpKTsKKworCS8qIGNoZWNraW5nIGZvciBpMmMtZGV2aWNlcyBjYW4gYmUgb21pdHRlZCBoZXJlLCBiZWNhdXNlIHdlCisJICAgYWxyZWFkeSBkaWQgdGhpcyBpbiAiZHBjX3ZsNDJfcHJvYmUiICovCisKKwlzYWE3MTQ2X3Z2X2luaXQoZGV2LCZ2dl9kYXRhKTsKKwlpZiggMCAhPSBzYWE3MTQ2X3JlZ2lzdGVyX2RldmljZSgmZHBjLT52aWRlb19kZXYsIGRldiwgImRwYyIsIFZGTF9UWVBFX0dSQUJCRVIpKSB7CisJCUVSUigoImNhbm5vdCByZWdpc3RlciBjYXB0dXJlIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwkvKiBpbml0aWFsaXphdGlvbiBzdHVmZiAodmJpKSAob25seSBmb3IgcmV2aXNpb24gPiAwIGFuZCBmb3IgZXh0ZW5zaW9ucyB3aGljaCB3YW50IGl0KSovCisJaWYoIDAgIT0gRFBDX0JPQVJEX0NBTl9ET19WQkkoZGV2KSkgeworCQlpZiggMCAhPSBzYWE3MTQ2X3JlZ2lzdGVyX2RldmljZSgmZHBjLT52YmlfZGV2LCBkZXYsICJkcGMiLCBWRkxfVFlQRV9WQkkpKSB7CisJCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgdmJpIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpKTsKKwkJfQorCX0KKworCWkyY191c2VfY2xpZW50KGRwYy0+c2FhNzExMWEpOworCisJcHJpbnRrKCJkcGM6IGZvdW5kICdkcGM3MTQ2IGRlbW9uc3RyYXRpb24gYm9hcmQnLSVkLlxuIixkcGNfbnVtKTsKKwlkcGNfbnVtKys7CisJCisJLyogdGhlIHJlc3QgKi8KKwlkcGMtPmN1cl9pbnB1dCA9IDA7CisJZHBjX2luaXRfZG9uZShkZXYpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRwY19kZXRhY2goc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYpCit7CisJc3RydWN0IGRwYyogZHBjID0gKHN0cnVjdCBkcGMqKWRldi0+ZXh0X3ByaXY7CisJCisJREVCX0VFKCgiZGV2OiVwXG4iLGRldikpOworCisJaTJjX3JlbGVhc2VfY2xpZW50KGRwYy0+c2FhNzExMWEpOworCisJc2FhNzE0Nl91bnJlZ2lzdGVyX2RldmljZSgmZHBjLT52aWRlb19kZXYsZGV2KTsKKwlpZiggMCAhPSBEUENfQk9BUkRfQ0FOX0RPX1ZCSShkZXYpKSB7CisJCXNhYTcxNDZfdW5yZWdpc3Rlcl9kZXZpY2UoJmRwYy0+dmJpX2RldixkZXYpOworCX0KKwlzYWE3MTQ2X3Z2X3JlbGVhc2UoZGV2KTsKKworCWRwY19udW0tLTsKKworCWkyY19kZWxfYWRhcHRlcigmZHBjLT5pMmNfYWRhcHRlcik7CisJa2ZyZWUoZHBjKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIGF4YQoraW50IGRwY192YmlfYnlwYXNzKHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2KQoreworCXN0cnVjdCBkcGMqIGRwYyA9IChzdHJ1Y3QgZHBjKilkZXYtPmV4dF9wcml2OworCQorCWludCBpID0gMTsKKworCS8qIHN3aXRjaCBieXBhc3MgaW4gc2FhNzExMWEgKi8KKwlpZiAoIDAgIT0gZHBjLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKGRwYy0+c2FhNzExMWEsU0FBNzExWF9WQklfQllQQVNTLCAmaSkpIHsKKwkJcHJpbnRrKCJkcGNfdjRsMi5vOiBWQklfQllQQVNTOiBjb3VsZCBub3QgYWRkcmVzcyBzYWE3MTExYS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQkJCQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBkcGNfaW9jdGwoc3RydWN0IHNhYTcxNDZfZmggKmZoLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpIAoreworCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgZHBjKiBkcGMgPSAoc3RydWN0IGRwYyopZGV2LT5leHRfcHJpdjsKKy8qCisJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOyAKKyovCisJc3dpdGNoKGNtZCkKKwl7CisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgorCXsKKwkJc3RydWN0IHY0bDJfaW5wdXQgKmkgPSBhcmc7CisJCURFQl9FRSgoIlZJRElPQ19FTlVNSU5QVVQgJWQuXG4iLGktPmluZGV4KSk7CisJCQorCQlpZiggaS0+aW5kZXggPCAwIHx8IGktPmluZGV4ID49IERQQ19JTlBVVFMpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCQorCQltZW1jcHkoaSwgJmRwY19pbnB1dHNbaS0+aW5kZXhdLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKTsKKworCQlERUJfRCgoImRwY192NGwyLm86IHY0bDJfaW9jdGw6IFZJRElPQ19FTlVNSU5QVVQgJWQuXG4iLGktPmluZGV4KSk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19HX0lOUFVUOgorCXsKKwkJaW50ICppbnB1dCA9IChpbnQgKilhcmc7CisJCSppbnB1dCA9IGRwYy0+Y3VyX2lucHV0OworCisJCURFQl9EKCgiZHBjX3Y0bDIubzogVklESU9DX0dfSU5QVVQ6ICVkXG4iLCppbnB1dCkpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19JTlBVVDoKKwl7CisJCWludAlpbnB1dCA9ICooaW50ICopYXJnOworCisJCWlmIChpbnB1dCA8IDAgfHwgaW5wdXQgPj0gRFBDX0lOUFVUUykgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkKKwkJZHBjLT5jdXJfaW5wdXQgPSBpbnB1dDsKKworCQkvKiBmaXhtZTogc3dpdGNoIGlucHV0IGhlcmUsIHN3aXRjaCBhdWRpbywgdG9vISAqLworLy8JCXNhYTcxNDZfc2V0X2hwc19zb3VyY2VfYW5kX3N5bmMoZGV2LCBpbnB1dF9wb3J0X3NlbGVjdGlvbltpbnB1dF0uaHBzX3NvdXJjZSwgaW5wdXRfcG9ydF9zZWxlY3Rpb25baW5wdXRdLmhwc19zeW5jKTsKKwkJcHJpbnRrKCJkcGNfdjRsMi5vOiBWSURJT0NfU19JTlBVVDogZml4bWUgc3dpdGNoIGlucHV0LlxuIik7CisJCQorCQlyZXR1cm4gMDsKKwl9CisJZGVmYXVsdDoKKy8qCisJCURFQl9EKCgiZHBjX3Y0bDIubzogdjRsMl9pb2N0bCBkb2VzIG5vdCBoYW5kbGUgdGhpcyBpb2N0bC5cbiIpKTsKKyovCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0ZF9jYWxsYmFjayhzdHJ1Y3Qgc2FhNzE0Nl9kZXYqIGRldiwgc3RydWN0IHNhYTcxNDZfc3RhbmRhcmQgKnN0ZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X3N0YW5kYXJkIHN0YW5kYXJkW10gPSB7CisJeworCQkubmFtZQk9ICJQQUwiLCAJLmlkCT0gVjRMMl9TVERfUEFMLAorCQkudl9vZmZzZXQJPSAweDE3LAkudl9maWVsZCAJPSAyODgsCisJCS5oX29mZnNldAk9IDB4MTQsCS5oX3BpeGVscyAJPSA2ODAsCisJCS52X21heF9vdXQJPSA1NzYsCS5oX21heF9vdXQJPSA3NjgsCisJfSwgeworCQkubmFtZQk9ICJOVFNDIiwgCS5pZAk9IFY0TDJfU1REX05UU0MsCisJCS52X29mZnNldAk9IDB4MTYsCS52X2ZpZWxkIAk9IDI0MCwKKwkJLmhfb2Zmc2V0CT0gMHgwNiwJLmhfcGl4ZWxzIAk9IDcwOCwKKwkJLnZfbWF4X291dAk9IDQ4MCwJLmhfbWF4X291dAk9IDY0MCwKKwl9LCB7CisJCS5uYW1lCT0gIlNFQ0FNIiwgCS5pZAk9IFY0TDJfU1REX1NFQ0FNLAorCQkudl9vZmZzZXQJPSAweDE0LAkudl9maWVsZCAJPSAyODgsCisJCS5oX29mZnNldAk9IDB4MTQsCS5oX3BpeGVscyAJPSA3MjAsCisJCS52X21heF9vdXQJPSA1NzYsCS5oX21heF9vdXQJPSA3NjgsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBleHRlbnNpb247CisKK3N0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9wY2lfZXh0ZW5zaW9uX2RhdGEgZHBjID0geworICAgICAgICAuZXh0X3ByaXYgPSAiTXVsdGltZWRpYSBlWHRlbnNpb24gQm9hcmQiLAorICAgICAgICAuZXh0ID0gJmV4dGVuc2lvbiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGJsW10gPSB7CisJeworCQkudmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlCSAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxNDYsCisJCS5zdWJ2ZW5kb3IgPSAweDAwMDAsCisJCS5zdWJkZXZpY2UgPSAweDAwMDAsCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZkcGMsCisJfSwgeworCQkudmVuZG9yID0gMCwKKwl9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9leHRfdnYgdnZfZGF0YSA9IHsKKwkuaW5wdXRzCQk9IERQQ19JTlBVVFMsCisJLmNhcGFiaWxpdGllcwk9IFY0TDJfQ0FQX1ZCSV9DQVBUVVJFLAorCS5zdGRzCQk9ICZzdGFuZGFyZFswXSwKKwkubnVtX3N0ZHMJPSBzaXplb2Yoc3RhbmRhcmQpL3NpemVvZihzdHJ1Y3Qgc2FhNzE0Nl9zdGFuZGFyZCksCisJLnN0ZF9jYWxsYmFjawk9ICZzdGRfY2FsbGJhY2ssIAorCS5pb2N0bHMJCT0gJmlvY3Rsc1swXSwKKwkuaW9jdGwJCT0gZHBjX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBleHRlbnNpb24gPSB7CisJLm5hbWUJCT0gImRwYzcxNDYgZGVtb25zdHJhdGlvbiBib2FyZCIsCisJLmZsYWdzCQk9IFNBQTcxNDZfVVNFX0kyQ19JUlEsCisJCisJLnBjaV90YmwJPSAmcGNpX3RibFswXSwKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCisJLnByb2JlCQk9IGRwY19wcm9iZSwKKwkuYXR0YWNoCQk9IGRwY19hdHRhY2gsCisJLmRldGFjaAkJPSBkcGNfZGV0YWNoLAorCisJLmlycV9tYXNrCT0gMCwKKwkuaXJxX2Z1bmMJPSBOVUxMLAorfTsJCisKK3N0YXRpYyBpbnQgX19pbml0IGRwY19pbml0X21vZHVsZSh2b2lkKQoreworCWlmKCAwICE9IHNhYTcxNDZfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZleHRlbnNpb24pKSB7CisJCURFQl9TKCgiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGVuc2lvbi5cbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHBjX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJc2FhNzE0Nl91bnJlZ2lzdGVyX2V4dGVuc2lvbigmZXh0ZW5zaW9uKTsKK30KKworbW9kdWxlX2luaXQoZHBjX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRwY19jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigidmlkZW80bGludXgtMiBkcml2ZXIgZm9yIHRoZSAnZHBjNzE0NiBkZW1vbnN0cmF0aW9uIGJvYXJkJyIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIdW5vbGQgPG1pY2hhZWxAbWlodS5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX2dlbWluaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fZ2VtaW5pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliMDBlYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX2dlbWluaS5jCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICAgIGhleGl1bV9nZW1pbmkuYyAtIHY0bDIgZHJpdmVyIGZvciBIZXhpdW0gR2VtaW5pIGZyYW1lIGdyYWJiZXIgY2FyZHMKKyAgICAgICAgICAgICAgIAorICAgIFZpc2l0IGh0dHA6Ly93d3cubWlodS5kZS9saW51eC9zYWE3MTQ2LyBhbmQgZm9sbG93IHRoZSBsaW5rCisgICAgdG8gImhleGl1bSIgZm9yIGZ1cnRoZXIgZGV0YWlscyBhYm91dCB0aGlzIGNhcmQuCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAyMDAzIE1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNkZWZpbmUgREVCVUdfVkFSSUFCTEUgZGVidWcKKworI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgdmVyYm9zaXR5Iik7CisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBpbnQgaGV4aXVtX251bSA9IDA7CisKKyNkZWZpbmUgSEVYSVVNX0dFTUlOSQkJCTQKKyNkZWZpbmUgSEVYSVVNX0dFTUlOSV9EVUFMCQk1CisKKyNkZWZpbmUgSEVYSVVNX0lOUFVUUwk5CitzdGF0aWMgc3RydWN0IHY0bDJfaW5wdXQgaGV4aXVtX2lucHV0c1tIRVhJVU1fSU5QVVRTXSA9IHsKKwl7IDAsICJDVkJTIDEiLAlWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBLAkyLCAwLCBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLCAwIH0sCisJeyAxLCAiQ1ZCUyAyIiwJVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwJMiwgMCwgVjRMMl9TVERfUEFMX0JHfFY0TDJfU1REX05UU0NfTSwgMCB9LAorCXsgMiwgIkNWQlMgMyIsCVY0TDJfSU5QVVRfVFlQRV9DQU1FUkEsCTIsIDAsIFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sIDAgfSwKKwl7IDMsICJDVkJTIDQiLAlWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBLAkyLCAwLCBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLCAwIH0sCisJeyA0LCAiQ1ZCUyA1IiwJVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwJMiwgMCwgVjRMMl9TVERfUEFMX0JHfFY0TDJfU1REX05UU0NfTSwgMCB9LAorCXsgNSwgIkNWQlMgNiIsCVY0TDJfSU5QVVRfVFlQRV9DQU1FUkEsCTIsIDAsIFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sIDAgfSwKKwl7IDYsICJZL0MgMSIsCVY0TDJfSU5QVVRfVFlQRV9DQU1FUkEsCTIsIDAsIFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sIDAgfSwKKwl7IDcsICJZL0MgMiIsCVY0TDJfSU5QVVRfVFlQRV9DQU1FUkEsCTIsIDAsIFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sIDAgfSwKKwl7IDgsICJZL0MgMyIsCVY0TDJfSU5QVVRfVFlQRV9DQU1FUkEsCTIsIDAsIFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sIDAgfSwKK307CisKKyNkZWZpbmUgSEVYSVVNX0FVRElPUwkwCisKK3N0cnVjdCBoZXhpdW1fZGF0YQoreworCXM4IGFkcjsKKwl1OCBieXRlOworfTsKKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbl9pb2N0bHMgaW9jdGxzW10gPSB7CisJeyBWSURJT0NfR19JTlBVVCwJU0FBNzE0Nl9FWENMVVNJVkUgfSwKKwl7IFZJRElPQ19TX0lOUFVULAlTQUE3MTQ2X0VYQ0xVU0lWRSB9LAorCXsgVklESU9DX1FVRVJZQ1RSTCwgCVNBQTcxNDZfQkVGT1JFIH0sCisJeyBWSURJT0NfRU5VTUlOUFVULCAJU0FBNzE0Nl9FWENMVVNJVkUgfSwKKwl7IFZJRElPQ19TX1NURCwJCVNBQTcxNDZfQUZURVIgfSwKKwl7IFZJRElPQ19HX0NUUkwsCVNBQTcxNDZfQkVGT1JFIH0sCisJeyBWSURJT0NfU19DVFJMLAlTQUE3MTQ2X0JFRk9SRSB9LAorCXsgMCwJCQkwIH0KK307CisKKyNkZWZpbmUgSEVYSVVNX0NPTlRST0xTCTEKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgaGV4aXVtX2NvbnRyb2xzW10gPSB7CisJeyBWNEwyX0NJRF9QUklWQVRFX0JBU0UsIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sICJCL1ciLCAwLCAxLCAxLCAwLCAwIH0sCit9OworCisjZGVmaW5lIEhFWElVTV9HRU1JTklfVl8xXzAJCTEKKyNkZWZpbmUgSEVYSVVNX0dFTUlOSV9EVUFMX1ZfMV8wCTIKKworc3RydWN0IGhleGl1bQoreworCWludCB0eXBlOworCisJc3RydWN0IHZpZGVvX2RldmljZQkqdmlkZW9fZGV2OworCXN0cnVjdCBpMmNfYWRhcHRlcglpMmNfYWRhcHRlcjsKKwkJCisJaW50IAkJY3VyX2lucHV0OwkvKiBjdXJyZW50IGlucHV0ICovCisJdjRsMl9zdGRfaWQgCWN1cl9zdGQ7CS8qIGN1cnJlbnQgc3RhbmRhcmQgKi8KKwlpbnQJCWN1cl9idzsJCS8qIGN1cnJlbnQgYmxhY2svd2hpdGUgc3RhdHVzICovCit9OworCisvKiBTYW1zdW5nIEtTMDEyN0IgZGVjb2RlciBkZWZhdWx0IHJlZ2lzdGVycyAqLworc3RhdGljIHU4IGhleGl1bV9rczAxMjdiWzB4MTAwXT17CisvKjAwKi8gMHgwMCwweDUyLDB4MzAsMHg0MCwweDAxLDB4MEMsMHgyQSwweDEwLAorLyowOCovIDB4MDAsMHgwMCwweDAwLDB4NjAsMHgwMCwweDAwLDB4MEYsMHgwNiwKKy8qMTAqLyAweDAwLDB4MDAsMHhFNCwweEMwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKjE4Ki8gMHgxNCwweDlCLDB4RkUsMHhGRiwweEZDLDB4RkYsMHgwMywweDIyLAorLyoyMCovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qMjgqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyQywweDlCLDB4MDAsCisvKjMwKi8gMHgwMCwweDAwLDB4MTAsMHg4MCwweDgwLDB4MTAsMHg4MCwweDgwLAorLyozOCovIDB4MDEsMHgwNCwweDAwLDB4MDAsMHgwMCwweDI5LDB4QzAsMHgwMCwKKy8qNDAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKjQ4Ki8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyo1MCovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qNTgqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKjYwKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyo2OCovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qNzAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKjc4Ki8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyo4MCovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qODgqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKjkwKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyo5OCovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qQTAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKkE4Ki8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLypCMCovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qQjgqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKkMwKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLypDOCovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qRDAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKkQ4Ki8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLypFMCovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qRTgqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKkYwKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLypGOCovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorfTsKKworc3RhdGljIHN0cnVjdCBoZXhpdW1fZGF0YSBoZXhpdW1fcGFsW10gPSB7CisJeyAweDAxLCAweDUyIH0sIHsgMHgxMiwgMHg2NCB9LCB7IDB4MkQsIDB4MkMgfSwgeyAweDJFLCAweDlCIH0sIHsgLTEgLCAweEZGIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGV4aXVtX2RhdGEgaGV4aXVtX3BhbF9id1tdID0geworCXsgMHgwMSwgMHg1MiB9LAl7IDB4MTIsIDB4NjQgfSwJeyAweDJELCAweDJDIH0sCXsgMHgyRSwgMHg5QiB9LAl7IC0xICwgMHhGRiB9Cit9OworCitzdGF0aWMgc3RydWN0IGhleGl1bV9kYXRhIGhleGl1bV9udHNjW10gPSB7CisJeyAweDAxLCAweDUzIH0sIHsgMHgxMiwgMHgwNCB9LCB7IDB4MkQsIDB4MjMgfSwgeyAweDJFLCAweDgxIH0sIHsgLTEgLCAweEZGIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGV4aXVtX2RhdGEgaGV4aXVtX250c2NfYndbXSA9IHsKKwl7IDB4MDEsIDB4NTMgfSwgeyAweDEyLCAweDA0IH0sIHsgMHgyRCwgMHgyMyB9LCB7IDB4MkUsIDB4ODEgfSwgeyAtMSAsIDB4RkYgfQorfTsKKworc3RhdGljIHN0cnVjdCBoZXhpdW1fZGF0YSBoZXhpdW1fc2VjYW1bXSA9IHsKKwl7IDB4MDEsIDB4NTIgfSwgeyAweDEyLCAweDY0IH0sIHsgMHgyRCwgMHgyQyB9LCB7IDB4MkUsIDB4OUIgfSwgeyAtMSAsIDB4RkYgfQorfTsKKworc3RhdGljIHN0cnVjdCBoZXhpdW1fZGF0YSBoZXhpdW1faW5wdXRfc2VsZWN0W10gPSB7CisJeyAweDAyLCAweDYwIH0sCisJeyAweDAyLCAweDY0IH0sCisJeyAweDAyLCAweDYxIH0sCisJeyAweDAyLCAweDY1IH0sCisJeyAweDAyLCAweDYyIH0sCisJeyAweDAyLCAweDY2IH0sCisJeyAweDAyLCAweDY4IH0sCisJeyAweDAyLCAweDY5IH0sCisJeyAweDAyLCAweDZBIH0sCit9OworCisvKiBmaXhtZTogaF9vZmZzZXQgPSAwIGZvciBIZXhpdW0gR2VtaW5pICpEdWFsKiwgd2hpY2gKKyAgIGFyZSBjdXJyZW50bHkgKm5vdCogc3VwcG9ydGVkKi8KK3N0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9zdGFuZGFyZCBoZXhpdW1fc3RhbmRhcmRzW10gPSB7CisJeworCQkubmFtZQk9ICJQQUwiLCAJLmlkCT0gVjRMMl9TVERfUEFMLAorCQkudl9vZmZzZXQJPSAyOCwJLnZfZmllbGQgCT0gMjg4LAorCQkuaF9vZmZzZXQJPSAxLAkuaF9waXhlbHMgCT0gNjgwLAorCQkudl9tYXhfb3V0CT0gNTc2LAkuaF9tYXhfb3V0CT0gNzY4LAorCX0sIHsKKwkJLm5hbWUJPSAiTlRTQyIsIAkuaWQJPSBWNEwyX1NURF9OVFNDLAorCQkudl9vZmZzZXQJPSAyOCwJLnZfZmllbGQgCT0gMjQwLAorCQkuaF9vZmZzZXQJPSAxLAkuaF9waXhlbHMgCT0gNjQwLAorCQkudl9tYXhfb3V0CT0gNDgwLAkuaF9tYXhfb3V0CT0gNjQwLAorCX0sIHsKKwkJLm5hbWUJPSAiU0VDQU0iLCAJLmlkCT0gVjRMMl9TVERfU0VDQU0sCisJCS52X29mZnNldAk9IDI4LAkudl9maWVsZCAJPSAyODgsCisJCS5oX29mZnNldAk9IDEsCS5oX3BpeGVscyAJPSA3MjAsCisJCS52X21heF9vdXQJPSA1NzYsCS5oX21heF9vdXQJPSA3NjgsCisJfQorfTsJCQorCisvKiBicmluZyBoYXJkd2FyZSB0byBhIHNhbmUgc3RhdGUuIHRoaXMgaGFzIHRvIGJlIGRvbmUsIGp1c3QgaW4gY2FzZSBzb21lb25lCisgICB3YW50cyB0byBjYXB0dXJlIGZyb20gdGhpcyBkZXZpY2UgYmVmb3JlIGl0IGhhcyBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkLgorICAgdGhlIGNhcHR1cmUgZW5naW5lIHdvdWxkIGJhZGx5IGZhaWwsIGJlY2F1c2Ugbm8gdmFsaWQgc2lnbmFsIGFycml2ZXMgb24gdGhlCisgICBzYWE3MTQ2LCB0aHVzIGxlYWRpbmcgdG8gdGltZW91dHMgYW5kIHN0dWZmLiAqLworc3RhdGljIGludCBoZXhpdW1faW5pdF9kb25lKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2KQoreworCXN0cnVjdCBoZXhpdW0gKmhleGl1bSA9IChzdHJ1Y3QgaGV4aXVtICopIGRldi0+ZXh0X3ByaXY7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKwlpbnQgaSA9IDA7CisKKwlERUJfRCgoImhleGl1bV9pbml0X2RvbmUgY2FsbGVkLlxuIikpOworCisJLyogaW5pdGlhbGl6ZSB0aGUgaGVscGVyIGljcyB0byB1c2VmdWwgdmFsdWVzICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihoZXhpdW1fa3MwMTI3Yik7IGkrKykgeworCQlkYXRhLmJ5dGUgPSBoZXhpdW1fa3MwMTI3YltpXTsKKwkJaWYgKDAgIT0gaTJjX3NtYnVzX3hmZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIsIDB4NmMsIDAsIEkyQ19TTUJVU19XUklURSwgaSwgSTJDX1NNQlVTX0JZVEVfREFUQSwgJmRhdGEpKSB7CisJCQlwcmludGsoImhleGl1bV9nZW1pbmk6IGhleGl1bV9pbml0X2RvbmUoKSBmYWlsZWQgZm9yIGFkZHJlc3MgMHglMDJ4XG4iLCBpKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhleGl1bV9zZXRfaW5wdXQoc3RydWN0IGhleGl1bSAqaGV4aXVtLCBpbnQgaW5wdXQpCit7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKworCURFQl9EKCgiLlxuIikpOworCisJZGF0YS5ieXRlID0gaGV4aXVtX2lucHV0X3NlbGVjdFtpbnB1dF0uYnl0ZTsKKwlpZiAoMCAhPSBpMmNfc21idXNfeGZlcigmaGV4aXVtLT5pMmNfYWRhcHRlciwgMHg2YywgMCwgSTJDX1NNQlVTX1dSSVRFLCBoZXhpdW1faW5wdXRfc2VsZWN0W2lucHV0XS5hZHIsIEkyQ19TTUJVU19CWVRFX0RBVEEsICZkYXRhKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGV4aXVtX3NldF9zdGFuZGFyZChzdHJ1Y3QgaGV4aXVtICpoZXhpdW0sIHN0cnVjdCBoZXhpdW1fZGF0YSAqdmRlYykKK3sKKwl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworCWludCBpID0gMDsKKworCURFQl9EKCgiLlxuIikpOworCisJd2hpbGUgKHZkZWNbaV0uYWRyICE9IC0xKSB7CisJCWRhdGEuYnl0ZSA9IHZkZWNbaV0uYnl0ZTsKKwkJaWYgKDAgIT0gaTJjX3NtYnVzX3hmZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIsIDB4NmMsIDAsIEkyQ19TTUJVU19XUklURSwgdmRlY1tpXS5hZHIsIEkyQ19TTUJVU19CWVRFX0RBVEEsICZkYXRhKSkgeworCQkJcHJpbnRrKCJoZXhpdW1faW5pdF9kb25lOiBoZXhpdW1fc2V0X3N0YW5kYXJkKCkgZmFpbGVkIGZvciBhZGRyZXNzIDB4JTAyeFxuIiwgaSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaSsrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dF92diB2dl9kYXRhOworCisvKiB0aGlzIGZ1bmN0aW9uIG9ubHkgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgcHJvYmluZyB3YXMgc3VjY2Vzc2Z1bCAqLworc3RhdGljIGludCBoZXhpdW1fYXR0YWNoKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzE0Nl9wY2lfZXh0ZW5zaW9uX2RhdGEgKmluZm8pCit7CisJc3RydWN0IGhleGl1bSAqaGV4aXVtID0gKHN0cnVjdCBoZXhpdW0gKikgZGV2LT5leHRfcHJpdjsKKworCURFQl9FRSgoIi5cbiIpKTsKKworCWhleGl1bSA9IChzdHJ1Y3QgaGV4aXVtICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoZXhpdW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBoZXhpdW0pIHsKKwkJcHJpbnRrKCJoZXhpdW1fZ2VtaW5pOiBub3QgZW5vdWdoIGtlcm5lbCBtZW1vcnkgaW4gaGV4aXVtX2F0dGFjaCgpLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoaGV4aXVtLCAweDAsIHNpemVvZihzdHJ1Y3QgaGV4aXVtKSk7CisJZGV2LT5leHRfcHJpdiA9IGhleGl1bTsKKworCS8qIGVuYWJsZSBpMmMtcG9ydCBwaW5zICovCisJc2FhNzE0Nl93cml0ZShkZXYsIE1DMSwgKE1BU0tfMDggfCBNQVNLXzI0IHwgTUFTS18xMCB8IE1BU0tfMjYpKTsKKworCWhleGl1bS0+aTJjX2FkYXB0ZXIgPSAoc3RydWN0IGkyY19hZGFwdGVyKSB7CisJCS5jbGFzcyA9IEkyQ19DTEFTU19UVl9BTkFMT0csCisJCS5uYW1lID0gImhleGl1bSBnZW1pbmkiLAorCX07CisJc2FhNzE0Nl9pMmNfYWRhcHRlcl9wcmVwYXJlKGRldiwgJmhleGl1bS0+aTJjX2FkYXB0ZXIsIFNBQTcxNDZfSTJDX0JVU19CSVRfUkFURV80ODApOworCWlmIChpMmNfYWRkX2FkYXB0ZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIpIDwgMCkgeworCQlERUJfUygoImNhbm5vdCByZWdpc3RlciBpMmMtZGV2aWNlLiBza2lwcGluZy5cbiIpKTsKKwkJa2ZyZWUoaGV4aXVtKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogIHNldCBIV0NvbnRyb2wgR1BJTyBudW1iZXIgMiAqLworCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDIsIFNBQTcxNDZfR1BJT19PVVRISSk7CisKKwlzYWE3MTQ2X3dyaXRlKGRldiwgREQxX0lOSVQsIDB4MDcwMDA3MDApOworCXNhYTcxNDZfd3JpdGUoZGV2LCBERDFfU1RSRUFNX0IsIDB4MDAwMDAwMDApOworCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIChNQVNLXzA5IHwgTUFTS18yNSB8IE1BU0tfMTAgfCBNQVNLXzI2KSk7CisKKwkvKiB0aGUgcmVzdCAqLworCWhleGl1bS0+Y3VyX2lucHV0ID0gMDsKKwloZXhpdW1faW5pdF9kb25lKGRldik7CisKKwloZXhpdW1fc2V0X3N0YW5kYXJkKGhleGl1bSwgaGV4aXVtX3BhbCk7CisJaGV4aXVtLT5jdXJfc3RkID0gVjRMMl9TVERfUEFMOworCisJaGV4aXVtX3NldF9pbnB1dChoZXhpdW0sIDApOworCWhleGl1bS0+Y3VyX2lucHV0ID0gMDsKKworCXNhYTcxNDZfdnZfaW5pdChkZXYsICZ2dl9kYXRhKTsKKwlpZiAoMCAhPSBzYWE3MTQ2X3JlZ2lzdGVyX2RldmljZSgmaGV4aXVtLT52aWRlb19kZXYsIGRldiwgImhleGl1bSBnZW1pbmkiLCBWRkxfVFlQRV9HUkFCQkVSKSkgeworCQlwcmludGsoImhleGl1bV9nZW1pbmk6IGNhbm5vdCByZWdpc3RlciBjYXB0dXJlIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJpbnRrKCJoZXhpdW1fZ2VtaW5pOiBmb3VuZCAnaGV4aXVtIGdlbWluaScgZnJhbWUgZ3JhYmJlci0lZC5cbiIsIGhleGl1bV9udW0pOworCWhleGl1bV9udW0rKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhleGl1bV9kZXRhY2goc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYpCit7CisJc3RydWN0IGhleGl1bSAqaGV4aXVtID0gKHN0cnVjdCBoZXhpdW0gKikgZGV2LT5leHRfcHJpdjsKKworCURFQl9FRSgoImRldjolcFxuIiwgZGV2KSk7CisKKwlzYWE3MTQ2X3VucmVnaXN0ZXJfZGV2aWNlKCZoZXhpdW0tPnZpZGVvX2RldiwgZGV2KTsKKwlzYWE3MTQ2X3Z2X3JlbGVhc2UoZGV2KTsKKworCWhleGl1bV9udW0tLTsKKworCWkyY19kZWxfYWRhcHRlcigmaGV4aXVtLT5pMmNfYWRhcHRlcik7CisJa2ZyZWUoaGV4aXVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZXhpdW1faW9jdGwoc3RydWN0IHNhYTcxNDZfZmggKmZoLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBoZXhpdW0gKmhleGl1bSA9IChzdHJ1Y3QgaGV4aXVtICopIGRldi0+ZXh0X3ByaXY7CisvKgorCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsgCisqLworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaSA9IGFyZzsKKwkJCURFQl9FRSgoIlZJRElPQ19FTlVNSU5QVVQgJWQuXG4iLCBpLT5pbmRleCkpOworCisJCQlpZiAoaS0+aW5kZXggPCAwIHx8IGktPmluZGV4ID49IEhFWElVTV9JTlBVVFMpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJbWVtY3B5KGksICZoZXhpdW1faW5wdXRzW2ktPmluZGV4XSwgc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSk7CisKKwkJCURFQl9EKCgidjRsMl9pb2N0bDogVklESU9DX0VOVU1JTlBVVCAlZC5cbiIsIGktPmluZGV4KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJCXsKKwkJCWludCAqaW5wdXQgPSAoaW50ICopIGFyZzsKKwkJCSppbnB1dCA9IGhleGl1bS0+Y3VyX2lucHV0OworCisJCQlERUJfRCgoIlZJRElPQ19HX0lOUFVUOiAlZFxuIiwgKmlucHV0KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJCXsKKwkJCWludCBpbnB1dCA9ICooaW50ICopIGFyZzsKKworCQkJREVCX0VFKCgiVklESU9DX1NfSU5QVVQgJWQuXG4iLCBpbnB1dCkpOworCisJCQlpZiAoaW5wdXQgPCAwIHx8IGlucHV0ID49IEhFWElVTV9JTlBVVFMpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJaGV4aXVtLT5jdXJfaW5wdXQgPSBpbnB1dDsKKwkJCWhleGl1bV9zZXRfaW5wdXQoaGV4aXVtLCBpbnB1dCk7CisKKwkJCXJldHVybiAwOworCQl9CisJCS8qIHRoZSBzYWE3MTQ2IHByb3ZpZGVzIHNvbWUgY29udHJvbHMgKGJyaWdodG5lc3MsIGNvbnRyYXN0LCBzYXR1cmF0aW9uKQorCQkgICB3aGljaCBnZXRzIHJlZ2lzdGVyZWQgKmFmdGVyKiB0aGlzIGZ1bmN0aW9uLiBiZWNhdXNlIG9mIHRoaXMgd2UgaGF2ZQorCQkgICB0byByZXR1cm4gd2l0aCBhIHZhbHVlICE9IDAgZXZlbiBpZiB0aGUgZnVuY3Rpb24gc3VjY2VkZWQuLiAqLworCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwkJeworCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyA9IGFyZzsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSBIRVhJVU1fQ09OVFJPTFMgLSAxOyBpID49IDA7IGktLSkgeworCQkJCWlmIChoZXhpdW1fY29udHJvbHNbaV0uaWQgPT0gcWMtPmlkKSB7CisJCQkJCSpxYyA9IGhleGl1bV9jb250cm9sc1tpXTsKKwkJCQkJREVCX0QoKCJWSURJT0NfUVVFUllDVFJMICVkLlxuIiwgcWMtPmlkKSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJY2FzZSBWSURJT0NfR19DVFJMOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICp2YyA9IGFyZzsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSBIRVhJVU1fQ09OVFJPTFMgLSAxOyBpID49IDA7IGktLSkgeworCQkJCWlmIChoZXhpdW1fY29udHJvbHNbaV0uaWQgPT0gdmMtPmlkKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGkgPCAwKSB7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisKKwkJCXN3aXRjaCAodmMtPmlkKSB7CisJCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRTp7CisJCQkJCXZjLT52YWx1ZSA9IGhleGl1bS0+Y3VyX2J3OworCQkJCQlERUJfRCgoIlZJRElPQ19HX0NUUkwgQlc6JWQuXG4iLCB2Yy0+dmFsdWUpKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCWNhc2UgVklESU9DX1NfQ1RSTDoKKwkJeworCQkJc3RydWN0IHY0bDJfY29udHJvbCAqdmMgPSBhcmc7CisJCQlpbnQgaSA9IDA7CisKKwkJCWZvciAoaSA9IEhFWElVTV9DT05UUk9MUyAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQkJaWYgKGhleGl1bV9jb250cm9sc1tpXS5pZCA9PSB2Yy0+aWQpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoaSA8IDApIHsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKworCQkJc3dpdGNoICh2Yy0+aWQpIHsKKwkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9CQVNFOnsKKwkJCQkJaGV4aXVtLT5jdXJfYncgPSB2Yy0+dmFsdWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJREVCX0QoKCJWSURJT0NfU19DVFJMIEJXOiVkLlxuIiwgaGV4aXVtLT5jdXJfYncpKTsKKworCQkJaWYgKDAgPT0gaGV4aXVtLT5jdXJfYncgJiYgVjRMMl9TVERfUEFMID09IGhleGl1bS0+Y3VyX3N0ZCkgeworCQkJCWhleGl1bV9zZXRfc3RhbmRhcmQoaGV4aXVtLCBoZXhpdW1fcGFsKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICgwID09IGhleGl1bS0+Y3VyX2J3ICYmIFY0TDJfU1REX05UU0MgPT0gaGV4aXVtLT5jdXJfc3RkKSB7CisJCQkJaGV4aXVtX3NldF9zdGFuZGFyZChoZXhpdW0sIGhleGl1bV9udHNjKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICgwID09IGhleGl1bS0+Y3VyX2J3ICYmIFY0TDJfU1REX1NFQ0FNID09IGhleGl1bS0+Y3VyX3N0ZCkgeworCQkJCWhleGl1bV9zZXRfc3RhbmRhcmQoaGV4aXVtLCBoZXhpdW1fc2VjYW0pOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKDEgPT0gaGV4aXVtLT5jdXJfYncgJiYgVjRMMl9TVERfUEFMID09IGhleGl1bS0+Y3VyX3N0ZCkgeworCQkJCWhleGl1bV9zZXRfc3RhbmRhcmQoaGV4aXVtLCBoZXhpdW1fcGFsX2J3KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICgxID09IGhleGl1bS0+Y3VyX2J3ICYmIFY0TDJfU1REX05UU0MgPT0gaGV4aXVtLT5jdXJfc3RkKSB7CisJCQkJaGV4aXVtX3NldF9zdGFuZGFyZChoZXhpdW0sIGhleGl1bV9udHNjX2J3KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICgxID09IGhleGl1bS0+Y3VyX2J3ICYmIFY0TDJfU1REX1NFQ0FNID09IGhleGl1bS0+Y3VyX3N0ZCkgeworCQkJCS8qIGZpeG1lOiBpcyB0aGVyZSBubyBidyBzZWNhbSBtb2RlPyAqLworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWRlZmF1bHQ6CisvKgorCQlERUJfRCgoImhleGl1bV9pb2N0bCgpIGRvZXMgbm90IGhhbmRsZSB0aGlzIGlvY3RsLlxuIikpOworKi8KKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RkX2NhbGxiYWNrKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzE0Nl9zdGFuZGFyZCAqc3RkKQoreworCXN0cnVjdCBoZXhpdW0gKmhleGl1bSA9IChzdHJ1Y3QgaGV4aXVtICopIGRldi0+ZXh0X3ByaXY7CisKKwlpZiAoVjRMMl9TVERfUEFMID09IHN0ZC0+aWQpIHsKKwkJaGV4aXVtX3NldF9zdGFuZGFyZChoZXhpdW0sIGhleGl1bV9wYWwpOworCQloZXhpdW0tPmN1cl9zdGQgPSBWNEwyX1NURF9QQUw7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoVjRMMl9TVERfTlRTQyA9PSBzdGQtPmlkKSB7CisJCWhleGl1bV9zZXRfc3RhbmRhcmQoaGV4aXVtLCBoZXhpdW1fbnRzYyk7CisJCWhleGl1bS0+Y3VyX3N0ZCA9IFY0TDJfU1REX05UU0M7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoVjRMMl9TVERfU0VDQU0gPT0gc3RkLT5pZCkgeworCQloZXhpdW1fc2V0X3N0YW5kYXJkKGhleGl1bSwgaGV4aXVtX3NlY2FtKTsKKwkJaGV4aXVtLT5jdXJfc3RkID0gVjRMMl9TVERfU0VDQU07CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBoZXhpdW1fZXh0ZW5zaW9uOworCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfcGNpX2V4dGVuc2lvbl9kYXRhIGhleGl1bV9nZW1pbmlfNGJuYyA9IHsKKwkuZXh0X3ByaXYgPSAiSGV4aXVtIEdlbWluaSAoNCBCTkMpIiwKKwkuZXh0ID0gJmhleGl1bV9leHRlbnNpb24sCit9OworCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfcGNpX2V4dGVuc2lvbl9kYXRhIGhleGl1bV9nZW1pbmlfZHVhbF80Ym5jID0geworCS5leHRfcHJpdiA9ICJIZXhpdW0gR2VtaW5pIER1YWwgKDQgQk5DKSIsCisJLmV4dCA9ICZoZXhpdW1fZXh0ZW5zaW9uLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKKwl7CisJIC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJIC5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzE0NiwKKwkgLnN1YnZlbmRvciA9IDB4MTdjOCwKKwkgLnN1YmRldmljZSA9IDB4MjQwMSwKKwkgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZoZXhpdW1fZ2VtaW5pXzRibmMsCisJIH0sCisJeworCSAudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCSAuZGV2aWNlID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxNDYsCisJIC5zdWJ2ZW5kb3IgPSAweDE3YzgsCisJIC5zdWJkZXZpY2UgPSAweDI0MDIsCisJIC5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmaGV4aXVtX2dlbWluaV9kdWFsXzRibmMsCisJIH0sCisJeworCSAudmVuZG9yID0gMCwKKwkgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0X3Z2IHZ2X2RhdGEgPSB7CisJLmlucHV0cyA9IEhFWElVTV9JTlBVVFMsCisJLmNhcGFiaWxpdGllcyA9IDAsCisJLnN0ZHMgPSAmaGV4aXVtX3N0YW5kYXJkc1swXSwKKwkubnVtX3N0ZHMgPSBzaXplb2YoaGV4aXVtX3N0YW5kYXJkcykgLyBzaXplb2Yoc3RydWN0IHNhYTcxNDZfc3RhbmRhcmQpLAorCS5zdGRfY2FsbGJhY2sgPSAmc3RkX2NhbGxiYWNrLAorCS5pb2N0bHMgPSAmaW9jdGxzWzBdLAorCS5pb2N0bCA9IGhleGl1bV9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9leHRlbnNpb24gaGV4aXVtX2V4dGVuc2lvbiA9IHsKKwkubmFtZSA9ICJoZXhpdW0gZ2VtaW5pIiwKKwkuZmxhZ3MgPSBTQUE3MTQ2X1VTRV9JMkNfSVJRLAorCisJLnBjaV90YmwgPSAmcGNpX3RibFswXSwKKwkubW9kdWxlID0gVEhJU19NT0RVTEUsCisKKwkuYXR0YWNoID0gaGV4aXVtX2F0dGFjaCwKKwkuZGV0YWNoID0gaGV4aXVtX2RldGFjaCwKKworCS5pcnFfbWFzayA9IDAsCisJLmlycV9mdW5jID0gTlVMTCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhleGl1bV9pbml0X21vZHVsZSh2b2lkKQoreworCWlmICgwICE9IHNhYTcxNDZfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZoZXhpdW1fZXh0ZW5zaW9uKSkgeworCQlERUJfUygoImZhaWxlZCB0byByZWdpc3RlciBleHRlbnNpb24uXG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaGV4aXVtX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJc2FhNzE0Nl91bnJlZ2lzdGVyX2V4dGVuc2lvbigmaGV4aXVtX2V4dGVuc2lvbik7Cit9CisKK21vZHVsZV9pbml0KGhleGl1bV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChoZXhpdW1fY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oInZpZGVvNGxpbnV4LTIgZHJpdmVyIGZvciBIZXhpdW0gR2VtaW5pIGZyYW1lIGdyYWJiZXIgY2FyZHMiKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hleGl1bV9vcmlvbi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fb3Jpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE5NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fb3Jpb24uYwpAQCAtMCwwICsxLDUyMiBAQAorLyoKKyAgICBoZXhpdW1fb3Jpb24uYyAtIHY0bDIgZHJpdmVyIGZvciB0aGUgSGV4aXVtIE9yaW9uIGZyYW1lIGdyYWJiZXIgY2FyZHMKKworICAgIFZpc2l0IGh0dHA6Ly93d3cubWlodS5kZS9saW51eC9zYWE3MTQ2LyBhbmQgZm9sbG93IHRoZSBsaW5rCisgICAgdG8gImhleGl1bSIgZm9yIGZ1cnRoZXIgZGV0YWlscyBhYm91dCB0aGlzIGNhcmQuCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAyMDAzIE1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNkZWZpbmUgREVCVUdfVkFSSUFCTEUgZGVidWcKKworI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgdmVyYm9zaXR5Iik7CisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBpbnQgaGV4aXVtX251bSA9IDA7CisKKyNkZWZpbmUgSEVYSVVNX0hWX1BDSTZfT1JJT04JCTEKKyNkZWZpbmUgSEVYSVVNX09SSU9OXzFTVkhTXzNCTkMJCTIKKyNkZWZpbmUgSEVYSVVNX09SSU9OXzRCTkMJCTMKKworI2RlZmluZSBIRVhJVU1fSU5QVVRTCTkKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9pbnB1dCBoZXhpdW1faW5wdXRzW0hFWElVTV9JTlBVVFNdID0geworCXsgMCwgIkNWQlMgMSIsCVY0TDJfSU5QVVRfVFlQRV9DQU1FUkEsCTIsIDAsIFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sIDAgfSwKKwl7IDEsICJDVkJTIDIiLAlWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBLAkyLCAwLCBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLCAwIH0sCisJeyAyLCAiQ1ZCUyAzIiwJVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwJMiwgMCwgVjRMMl9TVERfUEFMX0JHfFY0TDJfU1REX05UU0NfTSwgMCB9LAorCXsgMywgIkNWQlMgNCIsCVY0TDJfSU5QVVRfVFlQRV9DQU1FUkEsCTIsIDAsIFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sIDAgfSwKKwl7IDQsICJDVkJTIDUiLAlWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBLAkyLCAwLCBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLCAwIH0sCisJeyA1LCAiQ1ZCUyA2IiwJVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwJMiwgMCwgVjRMMl9TVERfUEFMX0JHfFY0TDJfU1REX05UU0NfTSwgMCB9LAorCXsgNiwgIlkvQyAxIiwJVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwJMiwgMCwgVjRMMl9TVERfUEFMX0JHfFY0TDJfU1REX05UU0NfTSwgMCB9LAorCXsgNywgIlkvQyAyIiwJVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwJMiwgMCwgVjRMMl9TVERfUEFMX0JHfFY0TDJfU1REX05UU0NfTSwgMCB9LAorCXsgOCwgIlkvQyAzIiwJVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwJMiwgMCwgVjRMMl9TVERfUEFMX0JHfFY0TDJfU1REX05UU0NfTSwgMCB9LAorfTsKKworI2RlZmluZSBIRVhJVU1fQVVESU9TCTAKKworc3RydWN0IGhleGl1bV9kYXRhCit7CisJczggYWRyOworCXU4IGJ5dGU7Cit9OworCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uX2lvY3RscyBpb2N0bHNbXSA9IHsKKwl7IFZJRElPQ19HX0lOUFVULAlTQUE3MTQ2X0VYQ0xVU0lWRSB9LAorCXsgVklESU9DX1NfSU5QVVQsCVNBQTcxNDZfRVhDTFVTSVZFIH0sCisJeyBWSURJT0NfRU5VTUlOUFVULCAJU0FBNzE0Nl9FWENMVVNJVkUgfSwKKwl7IFZJRElPQ19TX1NURCwJCVNBQTcxNDZfQUZURVIgfSwKKwl7IDAsCQkJMCB9Cit9OworCitzdHJ1Y3QgaGV4aXVtCit7CisJaW50IHR5cGU7CisJc3RydWN0IHZpZGVvX2RldmljZQkqdmlkZW9fZGV2OworCXN0cnVjdCBpMmNfYWRhcHRlcglpMmNfYWRhcHRlcjsJCisKKwlpbnQgY3VyX2lucHV0OwkvKiBjdXJyZW50IGlucHV0ICovCit9OworCisvKiBQaGlsaXBzIFNBQTcxMTAgZGVjb2RlciBkZWZhdWx0IHJlZ2lzdGVycyAqLworc3RhdGljIHU4IGhleGl1bV9zYWE3MTEwWzUzXT17CisvKjAwKi8gMHg0QywweDNDLDB4MEQsMHhFRiwweEJELDB4RjAsMHgwMCwweDAwLAorLyowOCovIDB4RjgsMHhGOCwweDYwLDB4NjAsMHg0MCwweDg2LDB4MTgsMHg5MCwKKy8qMTAqLyAweDAwLDB4MkMsMHg0MCwweDQ2LDB4NDIsMHgxQSwweEZGLDB4REEsCisvKjE4Ki8gMHhGMCwweDhCLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyoyMCovIDB4RDksMHgxNywweDQwLDB4NDEsMHg4MCwweDQxLDB4ODAsMHg0RiwKKy8qMjgqLyAweEZFLDB4MDEsMHgwRiwweDBGLDB4MDMsMHgwMSwweDgxLDB4MDMsCisvKjMwKi8gMHg0NCwweDc1LDB4MDEsMHg4QywweDAzCit9OworCitzdGF0aWMgc3RydWN0IHsKKwlzdHJ1Y3QgaGV4aXVtX2RhdGEgZGF0YVs4XTsJCit9IGhleGl1bV9pbnB1dF9zZWxlY3RbXSA9IHsKK3sKKwl7IC8qIGN2YnMgMSAqLworCQl7IDB4MDYsIDB4MDAgfSwKKwkJeyAweDIwLCAweEQ5IH0sCisJCXsgMHgyMSwgMHgxNyB9LCAvLyAweDE2LAorCQl7IDB4MjIsIDB4NDAgfSwKKwkJeyAweDJDLCAweDAzIH0sCisJCXsgMHgzMCwgMHg0NCB9LAorCQl7IDB4MzEsIDB4NzUgfSwgLy8gPz8KKwkJeyAweDIxLCAweDE2IH0sIC8vIDB4MDMsCisJfQorfSwgeworCXsgLyogY3ZicyAyICovCisJCXsgMHgwNiwgMHgwMCB9LAorCQl7IDB4MjAsIDB4NzggfSwKKwkJeyAweDIxLCAweDA3IH0sIC8vIDB4MDMsCisJCXsgMHgyMiwgMHhEMiB9LAorCQl7IDB4MkMsIDB4ODMgfSwKKwkJeyAweDMwLCAweDYwIH0sCisJCXsgMHgzMSwgMHhCNSB9LCAvLyA/CisJCXsgMHgyMSwgMHgwMyB9LAorCX0KK30sIHsKKwl7IC8qIGN2YnMgMyAqLworCQl7IDB4MDYsIDB4MDAgfSwKKwkJeyAweDIwLCAweEJBIH0sCisJCXsgMHgyMSwgMHgwNyB9LCAvLyAweDA1LAorCQl7IDB4MjIsIDB4OTEgfSwKKwkJeyAweDJDLCAweDAzIH0sCisJCXsgMHgzMCwgMHg2MCB9LAorCQl7IDB4MzEsIDB4QjUgfSwgLy8gPz8KKwkJeyAweDIxLCAweDA1IH0sIC8vIDB4MDMsCisJfQorfSwgeworCXsgLyogY3ZicyA0ICovCisJCXsgMHgwNiwgMHgwMCB9LAorCQl7IDB4MjAsIDB4RDggfSwKKwkJeyAweDIxLCAweDE3IH0sIC8vIDB4MTYsCisJCXsgMHgyMiwgMHg0MCB9LAorCQl7IDB4MkMsIDB4MDMgfSwKKwkJeyAweDMwLCAweDQ0IH0sCisJCXsgMHgzMSwgMHg3NSB9LCAvLyA/PworCQl7IDB4MjEsIDB4MTYgfSwgLy8gMHgwMywKKwl9Cit9LCB7CisJeyAvKiBjdmJzIDUgKi8KKwkJeyAweDA2LCAweDAwIH0sCisJCXsgMHgyMCwgMHhCOCB9LAorCQl7IDB4MjEsIDB4MDcgfSwgLy8gMHgwNSwKKwkJeyAweDIyLCAweDkxIH0sCisJCXsgMHgyQywgMHgwMyB9LAorCQl7IDB4MzAsIDB4NjAgfSwKKwkJeyAweDMxLCAweEI1IH0sIC8vID8/CisJCXsgMHgyMSwgMHgwNSB9LCAvLyAweDAzLAorCX0KK30sIHsKKwl7IC8qIGN2YnMgNiAqLworCQl7IDB4MDYsIDB4MDAgfSwKKwkJeyAweDIwLCAweDdDIH0sCisJCXsgMHgyMSwgMHgwNyB9LCAvLyAweDAzCisJCXsgMHgyMiwgMHhEMiB9LAorCQl7IDB4MkMsIDB4ODMgfSwKKwkJeyAweDMwLCAweDYwIH0sCisJCXsgMHgzMSwgMHhCNSB9LCAvLyA/PworCQl7IDB4MjEsIDB4MDMgfSwKKwl9IAorfSwgeworCXsgLyogeS9jIDEgKi8KKwkJeyAweDA2LCAweDgwIH0sCisJCXsgMHgyMCwgMHg1OSB9LAorCQl7IDB4MjEsIDB4MTcgfSwKKwkJeyAweDIyLCAweDQyIH0sCisJCXsgMHgyQywgMHhBMyB9LAorCQl7IDB4MzAsIDB4NDQgfSwKKwkJeyAweDMxLCAweDc1IH0sCisJCXsgMHgyMSwgMHgxMiB9LAorCX0KK30sIHsKKwl7IC8qIHkvYyAyICovCisJCXsgMHgwNiwgMHg4MCB9LAorCQl7IDB4MjAsIDB4OUEgfSwKKwkJeyAweDIxLCAweDE3IH0sCisJCXsgMHgyMiwgMHhCMSB9LAorCQl7IDB4MkMsIDB4MTMgfSwKKwkJeyAweDMwLCAweDYwIH0sCisJCXsgMHgzMSwgMHhCNSB9LAorCQl7IDB4MjEsIDB4MTQgfSwKKwl9Cit9LCB7CisJeyAvKiB5L2MgMyAqLworCQl7IDB4MDYsIDB4ODAgfSwKKwkJeyAweDIwLCAweDNDIH0sCisJCXsgMHgyMSwgMHgyNyB9LAorCQl7IDB4MjIsIDB4QzEgfSwKKwkJeyAweDJDLCAweDIzIH0sCisJCXsgMHgzMCwgMHg0NCB9LAorCQl7IDB4MzEsIDB4NzUgfSwKKwkJeyAweDIxLCAweDIxIH0sCisJfQorfQkKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9zdGFuZGFyZCBoZXhpdW1fc3RhbmRhcmRzW10gPSB7CisJeworCQkubmFtZQk9ICJQQUwiLCAJLmlkCT0gVjRMMl9TVERfUEFMLAorCQkudl9vZmZzZXQJPSAxNiwJLnZfZmllbGQgCT0gMjg4LAorCQkuaF9vZmZzZXQJPSAxLAkuaF9waXhlbHMgCT0gNjgwLAorCQkudl9tYXhfb3V0CT0gNTc2LAkuaF9tYXhfb3V0CT0gNzY4LAorCX0sIHsKKwkJLm5hbWUJPSAiTlRTQyIsIAkuaWQJPSBWNEwyX1NURF9OVFNDLAorCQkudl9vZmZzZXQJPSAxNiwJLnZfZmllbGQgCT0gMjQwLAorCQkuaF9vZmZzZXQJPSAxLAkuaF9waXhlbHMgCT0gNjQwLAorCQkudl9tYXhfb3V0CT0gNDgwLAkuaF9tYXhfb3V0CT0gNjQwLAorCX0sIHsKKwkJLm5hbWUJPSAiU0VDQU0iLCAJLmlkCT0gVjRMMl9TVERfU0VDQU0sCisJCS52X29mZnNldAk9IDE2LAkudl9maWVsZCAJPSAyODgsCisJCS5oX29mZnNldAk9IDEsCS5oX3BpeGVscyAJPSA3MjAsCisJCS52X21heF9vdXQJPSA1NzYsCS5oX21heF9vdXQJPSA3NjgsCisJfQorfTsJCQorCisvKiB0aGlzIGlzIG9ubHkgY2FsbGVkIGZvciBvbGQgSFYtUENJNi9PcmlvbiBjYXJkcworICAgd2l0aG91dCBlZXByb20gKi8KK3N0YXRpYyBpbnQgaGV4aXVtX3Byb2JlKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2KQoreworCXN0cnVjdCBoZXhpdW0gKmhleGl1bSA9IE5VTEw7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCURFQl9FRSgoIi5cbiIpKTsKKworCS8qIHRoZXJlIGFyZSBubyBoZXhpdW0gb3Jpb24gY2FyZHMgd2l0aCByZXZpc2lvbiAwIHNhYTcxNDZzICovCisJaWYgKDAgPT0gZGV2LT5yZXZpc2lvbikgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwloZXhpdW0gPSAoc3RydWN0IGhleGl1bSAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGV4aXVtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gaGV4aXVtKSB7CisJCXByaW50aygiaGV4aXVtX29yaW9uOiBoZXhpdW1fcHJvYmU6IG5vdCBlbm91Z2gga2VybmVsIG1lbW9yeS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGhleGl1bSwgMHgwLCBzaXplb2Yoc3RydWN0IGhleGl1bSkpOworCisJLyogZW5hYmxlIGkyYy1wb3J0IHBpbnMgKi8KKwlzYWE3MTQ2X3dyaXRlKGRldiwgTUMxLCAoTUFTS18wOCB8IE1BU0tfMjQgfCBNQVNLXzEwIHwgTUFTS18yNikpOworCisJc2FhNzE0Nl93cml0ZShkZXYsIEREMV9JTklULCAweDAxMDAwMTAwKTsKKwlzYWE3MTQ2X3dyaXRlKGRldiwgREQxX1NUUkVBTV9CLCAweDAwMDAwMDAwKTsKKwlzYWE3MTQ2X3dyaXRlKGRldiwgTUMyLCAoTUFTS18wOSB8IE1BU0tfMjUgfCBNQVNLXzEwIHwgTUFTS18yNikpOworCisJaGV4aXVtLT5pMmNfYWRhcHRlciA9IChzdHJ1Y3QgaTJjX2FkYXB0ZXIpIHsKKwkJLmNsYXNzID0gSTJDX0NMQVNTX1RWX0FOQUxPRywKKwkJLm5hbWUgPSAiaGV4aXVtIG9yaW9uIiwKKwl9OworCXNhYTcxNDZfaTJjX2FkYXB0ZXJfcHJlcGFyZShkZXYsICZoZXhpdW0tPmkyY19hZGFwdGVyLCBTQUE3MTQ2X0kyQ19CVVNfQklUX1JBVEVfNDgwKTsKKwlpZiAoaTJjX2FkZF9hZGFwdGVyKCZoZXhpdW0tPmkyY19hZGFwdGVyKSA8IDApIHsKKwkJREVCX1MoKCJjYW5ub3QgcmVnaXN0ZXIgaTJjLWRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCWtmcmVlKGhleGl1bSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIHNldCBTQUE3MTEwIGNvbnRyb2wgR1BJTyAwICovCisJc2FhNzE0Nl9zZXRncGlvKGRldiwgMCwgU0FBNzE0Nl9HUElPX09VVEhJKTsKKwkvKiAgc2V0IEhXQ29udHJvbCBHUElPIG51bWJlciAyICovCisJc2FhNzE0Nl9zZXRncGlvKGRldiwgMiwgU0FBNzE0Nl9HUElPX09VVEhJKTsKKworCW1kZWxheSgxMCk7CisKKwkvKiBkZXRlY3QgbmV3ZXIgSGV4aXVtIE9yaW9uIGNhcmRzIGJ5IHN1YnN5c3RlbSBpZHMgKi8KKwlpZiAoMHgxN2M4ID09IGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yICYmIDB4MDEwMSA9PSBkZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZSkgeworCQlwcmludGsoImhleGl1bV9vcmlvbjogZGV2aWNlIGlzIGEgSGV4aXVtIE9yaW9uIHcvIDEgU1ZIUyArIDMgQk5DIGlucHV0cy5cbiIpOworCQkvKiB3ZSBzdG9yZSB0aGUgcG9pbnRlciBpbiBvdXIgcHJpdmF0ZSBkYXRhIGZpZWxkICovCisJCWRldi0+ZXh0X3ByaXYgPSBoZXhpdW07CisJCWhleGl1bS0+dHlwZSA9IEhFWElVTV9PUklPTl8xU1ZIU18zQk5DOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoMHgxN2M4ID09IGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yICYmIDB4MjEwMSA9PSBkZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZSkgeworCQlwcmludGsoImhleGl1bV9vcmlvbjogZGV2aWNlIGlzIGEgSGV4aXVtIE9yaW9uIHcvIDQgQk5DIGlucHV0cy5cbiIpOworCQkvKiB3ZSBzdG9yZSB0aGUgcG9pbnRlciBpbiBvdXIgcHJpdmF0ZSBkYXRhIGZpZWxkICovCisJCWRldi0+ZXh0X3ByaXYgPSBoZXhpdW07CisJCWhleGl1bS0+dHlwZSA9IEhFWElVTV9PUklPTl80Qk5DOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBjaGVjayBpZiB0aGlzIGlzIGFuIG9sZCBoZXhpdW0gT3Jpb24gY2FyZCBieSBsb29raW5nIGF0IAorCSAgIGEgc2FhNzExMCBhdCBhZGRyZXNzIDB4NGUgKi8KKwlpZiAoMCA9PSAoZXJyID0gaTJjX3NtYnVzX3hmZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIsIDB4NGUsIDAsIEkyQ19TTUJVU19SRUFELCAweDAwLCBJMkNfU01CVVNfQllURV9EQVRBLCAmZGF0YSkpKSB7CisJCXByaW50aygiaGV4aXVtX29yaW9uOiBkZXZpY2UgaXMgYSBIZXhpdW0gSFYtUENJNi9PcmlvbiAob2xkKS5cbiIpOworCQkvKiB3ZSBzdG9yZSB0aGUgcG9pbnRlciBpbiBvdXIgcHJpdmF0ZSBkYXRhIGZpZWxkICovCisJCWRldi0+ZXh0X3ByaXYgPSBoZXhpdW07CisJCWhleGl1bS0+dHlwZSA9IEhFWElVTV9IVl9QQ0k2X09SSU9OOworCQlyZXR1cm4gMDsKKwl9CisKKwlpMmNfZGVsX2FkYXB0ZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIpOworCWtmcmVlKGhleGl1bSk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKy8qIGJyaW5nIGhhcmR3YXJlIHRvIGEgc2FuZSBzdGF0ZS4gdGhpcyBoYXMgdG8gYmUgZG9uZSwganVzdCBpbiBjYXNlIHNvbWVvbmUKKyAgIHdhbnRzIHRvIGNhcHR1cmUgZnJvbSB0aGlzIGRldmljZSBiZWZvcmUgaXQgaGFzIGJlZW4gcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisgICB0aGUgY2FwdHVyZSBlbmdpbmUgd291bGQgYmFkbHkgZmFpbCwgYmVjYXVzZSBubyB2YWxpZCBzaWduYWwgYXJyaXZlcyBvbiB0aGUKKyAgIHNhYTcxNDYsIHRodXMgbGVhZGluZyB0byB0aW1lb3V0cyBhbmQgc3R1ZmYuICovCitzdGF0aWMgaW50IGhleGl1bV9pbml0X2RvbmUoc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYpCit7CisJc3RydWN0IGhleGl1bSAqaGV4aXVtID0gKHN0cnVjdCBoZXhpdW0gKikgZGV2LT5leHRfcHJpdjsKKwl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworCWludCBpID0gMDsKKworCURFQl9EKCgiaGV4aXVtX2luaXRfZG9uZSBjYWxsZWQuXG4iKSk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBoZWxwZXIgaWNzIHRvIHVzZWZ1bCB2YWx1ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGhleGl1bV9zYWE3MTEwKTsgaSsrKSB7CisJCWRhdGEuYnl0ZSA9IGhleGl1bV9zYWE3MTEwW2ldOworCQlpZiAoMCAhPSBpMmNfc21idXNfeGZlcigmaGV4aXVtLT5pMmNfYWRhcHRlciwgMHg0ZSwgMCwgSTJDX1NNQlVTX1dSSVRFLCBpLCBJMkNfU01CVVNfQllURV9EQVRBLCAmZGF0YSkpIHsKKwkJCXByaW50aygiaGV4aXVtX29yaW9uOiBmYWlsZWQgZm9yIGFkZHJlc3MgMHglMDJ4XG4iLCBpKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhleGl1bV9zZXRfaW5wdXQoc3RydWN0IGhleGl1bSAqaGV4aXVtLCBpbnQgaW5wdXQpCit7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKwlpbnQgaSA9IDA7CisJCisJREVCX0QoKCIuXG4iKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWludCBhZHIgPSBoZXhpdW1faW5wdXRfc2VsZWN0W2lucHV0XS5kYXRhW2ldLmFkcjsKKwkJZGF0YS5ieXRlID0gaGV4aXVtX2lucHV0X3NlbGVjdFtpbnB1dF0uZGF0YVtpXS5ieXRlOworCQlpZiAoMCAhPSBpMmNfc21idXNfeGZlcigmaGV4aXVtLT5pMmNfYWRhcHRlciwgMHg0ZSwgMCwgSTJDX1NNQlVTX1dSSVRFLCBhZHIsIEkyQ19TTUJVU19CWVRFX0RBVEEsICZkYXRhKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCXByaW50aygiJWQ6IDB4JTAyeCA9PiAweCUwMnhcbiIsaW5wdXQsIGFkcixkYXRhLmJ5dGUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0X3Z2IHZ2X2RhdGE7CisKKy8qIHRoaXMgZnVuY3Rpb24gb25seSBnZXRzIGNhbGxlZCB3aGVuIHRoZSBwcm9iaW5nIHdhcyBzdWNjZXNzZnVsICovCitzdGF0aWMgaW50IGhleGl1bV9hdHRhY2goc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIHN0cnVjdCBzYWE3MTQ2X3BjaV9leHRlbnNpb25fZGF0YSAqaW5mbykKK3sKKwlzdHJ1Y3QgaGV4aXVtICpoZXhpdW0gPSAoc3RydWN0IGhleGl1bSAqKSBkZXYtPmV4dF9wcml2OworCisJREVCX0VFKCgiLlxuIikpOworCisJc2FhNzE0Nl92dl9pbml0KGRldiwgJnZ2X2RhdGEpOworCWlmICgwICE9IHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZoZXhpdW0tPnZpZGVvX2RldiwgZGV2LCAiaGV4aXVtIG9yaW9uIiwgVkZMX1RZUEVfR1JBQkJFUikpIHsKKwkJcHJpbnRrKCJoZXhpdW1fb3Jpb246IGNhbm5vdCByZWdpc3RlciBjYXB0dXJlIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJpbnRrKCJoZXhpdW1fb3Jpb246IGZvdW5kICdoZXhpdW0gb3Jpb24nIGZyYW1lIGdyYWJiZXItJWQuXG4iLCBoZXhpdW1fbnVtKTsKKwloZXhpdW1fbnVtKys7CisKKwkvKiB0aGUgcmVzdCAqLworCWhleGl1bS0+Y3VyX2lucHV0ID0gMDsKKwloZXhpdW1faW5pdF9kb25lKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZXhpdW1fZGV0YWNoKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2KQoreworCXN0cnVjdCBoZXhpdW0gKmhleGl1bSA9IChzdHJ1Y3QgaGV4aXVtICopIGRldi0+ZXh0X3ByaXY7CisKKwlERUJfRUUoKCJkZXY6JXBcbiIsIGRldikpOworCisJc2FhNzE0Nl91bnJlZ2lzdGVyX2RldmljZSgmaGV4aXVtLT52aWRlb19kZXYsIGRldik7CisJc2FhNzE0Nl92dl9yZWxlYXNlKGRldik7CisKKwloZXhpdW1fbnVtLS07CisKKwlpMmNfZGVsX2FkYXB0ZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIpOworCWtmcmVlKGhleGl1bSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGV4aXVtX2lvY3RsKHN0cnVjdCBzYWE3MTQ2X2ZoICpmaCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgaGV4aXVtICpoZXhpdW0gPSAoc3RydWN0IGhleGl1bSAqKSBkZXYtPmV4dF9wcml2OworLyoKKwlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7IAorKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwkJeworCQkJc3RydWN0IHY0bDJfaW5wdXQgKmkgPSBhcmc7CisJCQlERUJfRUUoKCJWSURJT0NfRU5VTUlOUFVUICVkLlxuIiwgaS0+aW5kZXgpKTsKKworCQkJaWYgKGktPmluZGV4IDwgMCB8fCBpLT5pbmRleCA+PSBIRVhJVU1fSU5QVVRTKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCW1lbWNweShpLCAmaGV4aXVtX2lucHV0c1tpLT5pbmRleF0sIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpOworCisJCQlERUJfRCgoInY0bDJfaW9jdGw6IFZJRElPQ19FTlVNSU5QVVQgJWQuXG4iLCBpLT5pbmRleCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ19HX0lOUFVUOgorCQl7CisJCQlpbnQgKmlucHV0ID0gKGludCAqKSBhcmc7CisJCQkqaW5wdXQgPSBoZXhpdW0tPmN1cl9pbnB1dDsKKworCQkJREVCX0QoKCJWSURJT0NfR19JTlBVVDogJWRcbiIsICppbnB1dCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ19TX0lOUFVUOgorCQl7CisJCQlpbnQgaW5wdXQgPSAqKGludCAqKSBhcmc7CisKKwkJCWlmIChpbnB1dCA8IDAgfHwgaW5wdXQgPj0gSEVYSVVNX0lOUFVUUykgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQloZXhpdW0tPmN1cl9pbnB1dCA9IGlucHV0OworCQkJaGV4aXVtX3NldF9pbnB1dChoZXhpdW0sIGlucHV0KTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwlkZWZhdWx0OgorLyoKKwkJREVCX0QoKCJoZXhpdW1faW9jdGwoKSBkb2VzIG5vdCBoYW5kbGUgdGhpcyBpb2N0bC5cbiIpKTsKKyovCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0ZF9jYWxsYmFjayhzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgc3RydWN0IHNhYTcxNDZfc3RhbmRhcmQgKnN0ZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBleHRlbnNpb247CisKK3N0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9wY2lfZXh0ZW5zaW9uX2RhdGEgaGV4aXVtX2h2X3BjaTYgPSB7CisJLmV4dF9wcml2ID0gIkhleGl1bSBIVi1QQ0k2IC8gT3Jpb24iLAorCS5leHQgPSAmZXh0ZW5zaW9uLAorfTsKKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X3BjaV9leHRlbnNpb25fZGF0YSBoZXhpdW1fb3Jpb25fMXN2aHNfM2JuYyA9IHsKKwkuZXh0X3ByaXYgPSAiSGV4aXVtIEhWLVBDSTYgLyBPcmlvbiAoMSBTVkhTLzMgQk5DKSIsCisJLmV4dCA9ICZleHRlbnNpb24sCit9OworCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfcGNpX2V4dGVuc2lvbl9kYXRhIGhleGl1bV9vcmlvbl80Ym5jID0geworCS5leHRfcHJpdiA9ICJIZXhpdW0gSFYtUENJNiAvIE9yaW9uICg0IEJOQykiLAorCS5leHQgPSAmZXh0ZW5zaW9uLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKKwl7CisJIC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJIC5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzE0NiwKKwkgLnN1YnZlbmRvciA9IDB4MDAwMCwKKwkgLnN1YmRldmljZSA9IDB4MDAwMCwKKwkgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZoZXhpdW1faHZfcGNpNiwKKwkgfSwKKwl7CisJIC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJIC5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzE0NiwKKwkgLnN1YnZlbmRvciA9IDB4MTdjOCwKKwkgLnN1YmRldmljZSA9IDB4MDEwMSwKKwkgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZoZXhpdW1fb3Jpb25fMXN2aHNfM2JuYywKKwkgfSwKKwl7CisJIC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJIC5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzE0NiwKKwkgLnN1YnZlbmRvciA9IDB4MTdjOCwKKwkgLnN1YmRldmljZSA9IDB4MjEwMSwKKwkgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZoZXhpdW1fb3Jpb25fNGJuYywKKwkgfSwKKwl7CisJIC52ZW5kb3IgPSAwLAorCSB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9leHRfdnYgdnZfZGF0YSA9IHsKKwkuaW5wdXRzID0gSEVYSVVNX0lOUFVUUywKKwkuY2FwYWJpbGl0aWVzID0gMCwKKwkuc3RkcyA9ICZoZXhpdW1fc3RhbmRhcmRzWzBdLAorCS5udW1fc3RkcyA9IHNpemVvZihoZXhpdW1fc3RhbmRhcmRzKSAvIHNpemVvZihzdHJ1Y3Qgc2FhNzE0Nl9zdGFuZGFyZCksCisJLnN0ZF9jYWxsYmFjayA9ICZzdGRfY2FsbGJhY2ssCisJLmlvY3RscyA9ICZpb2N0bHNbMF0sCisJLmlvY3RsID0gaGV4aXVtX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBleHRlbnNpb24gPSB7CisJLm5hbWUgPSAiaGV4aXVtIEhWLVBDSTYvT3Jpb24iLAorCS5mbGFncyA9IDAsCQkvLyBTQUE3MTQ2X1VTRV9JMkNfSVJRLAorCisJLnBjaV90YmwgPSAmcGNpX3RibFswXSwKKwkubW9kdWxlID0gVEhJU19NT0RVTEUsCisKKwkucHJvYmUgPSBoZXhpdW1fcHJvYmUsCisJLmF0dGFjaCA9IGhleGl1bV9hdHRhY2gsCisJLmRldGFjaCA9IGhleGl1bV9kZXRhY2gsCisKKwkuaXJxX21hc2sgPSAwLAorCS5pcnFfZnVuYyA9IE5VTEwsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBoZXhpdW1faW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpZiAoMCAhPSBzYWE3MTQ2X3JlZ2lzdGVyX2V4dGVuc2lvbigmZXh0ZW5zaW9uKSkgeworCQlERUJfUygoImZhaWxlZCB0byByZWdpc3RlciBleHRlbnNpb24uXG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaGV4aXVtX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJc2FhNzE0Nl91bnJlZ2lzdGVyX2V4dGVuc2lvbigmZXh0ZW5zaW9uKTsKK30KKworbW9kdWxlX2luaXQoaGV4aXVtX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGhleGl1bV9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigidmlkZW80bGludXgtMiBkcml2ZXIgZm9yIEhleGl1bSBPcmlvbiBmcmFtZSBncmFiYmVyIGNhcmRzIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEh1bm9sZCA8bWljaGFlbEBtaWh1LmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pYm1tcGVnMi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pYm1tcGVnMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTEwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2libW1wZWcyLmgKQEAgLTAsMCArMSw5NCBAQAorLyogaWJtbXBlZzIuaCAtIElCTSBNUEVHQ0QyMSBkZWZpbml0aW9ucyAqLworCisjaWZuZGVmIF9fSUJNX01QRUcyX18KKyNkZWZpbmUgX19JQk1fTVBFRzJfXworCisvKiBEZWZpbmUgYWxsIE1QRUcgRGVjb2RlciByZWdpc3RlcnMgKi8KKy8qIENoaXAgQ29udHJvbCBhbmQgU3RhdHVzICovCisjZGVmaW5lIElCTV9NUDJfQ0hJUF9DT05UUk9MCTB4MjAwKjIKKyNkZWZpbmUgSUJNX01QMl9DSElQX01PREUJMHgyMDEqMgorLyogVGltZXIgQ29udHJvbCBhbmQgU3RhdHVzICovCisjZGVmaW5lIElCTV9NUDJfU1lOQ19TVEMyCTB4MjAyKjIKKyNkZWZpbmUgSUJNX01QMl9TWU5DX1NUQzEJMHgyMDMqMgorI2RlZmluZSBJQk1fTVAyX1NZTkNfU1RDMAkweDIwNCoyCisjZGVmaW5lIElCTV9NUDJfU1lOQ19QVFMyCTB4MjA1KjIKKyNkZWZpbmUgSUJNX01QMl9TWU5DX1BUUzEJMHgyMDYqMgorI2RlZmluZSBJQk1fTVAyX1NZTkNfUFRTMAkweDIwNyoyCisvKiBWaWRlbyBGSUZPIENvbnRyb2wgKi8KKyNkZWZpbmUgSUJNX01QMl9GSUZPCQkweDIwOCoyCisjZGVmaW5lIElCTV9NUDJfRklGT1cJCTB4MTAwKjIKKyNkZWZpbmUgSUJNX01QMl9GSUZPX1NUQVQJMHgyMDkqMgorI2RlZmluZSBJQk1fTVAyX1JCX1RIUkVTSE9MRAkweDIyYioyCisvKiBDb21tYW5kIGJ1ZmZlciAqLworI2RlZmluZSBJQk1fTVAyX0NPTU1BTkQJCTB4MjBhKjIKKyNkZWZpbmUgSUJNX01QMl9DTURfREFUQQkweDIwYioyCisjZGVmaW5lIElCTV9NUDJfQ01EX1NUQVQJMHgyMGMqMgorI2RlZmluZSBJQk1fTVAyX0NNRF9BRERSCTB4MjBkKjIKKy8qIEludGVybmFsIFByb2Nlc3NvciBDb250cm9sIGFuZCBTdGF0dXMgKi8KKyNkZWZpbmUgSUJNX01QMl9QUk9DX0lBRERSCTB4MjBlKjIKKyNkZWZpbmUgSUJNX01QMl9QUk9DX0lEQVRBCTB4MjBmKjIKKyNkZWZpbmUgSUJNX01QMl9XUl9QUk9UCQkweDIzNSoyCisvKiBEUkFNIEFjY2VzcyAqLworI2RlZmluZSBJQk1fTVAyX0RSQU1fQUREUgkweDIxMCoyCisjZGVmaW5lIElCTV9NUDJfRFJBTV9EQVRBCTB4MjEyKjIKKyNkZWZpbmUgSUJNX01QMl9EUkFNX0NNRF9TVEFUCTB4MjEzKjIKKyNkZWZpbmUgSUJNX01QMl9CTE9DS19TSVpFCTB4MjNiKjIKKyNkZWZpbmUgSUJNX01QMl9TUkNfQUREUgkweDIzYyoyCisvKiBPbnNjcmVlbiBEaXNwbGF5ICovCisjZGVmaW5lIElCTV9NUDJfT1NEX0FERFIJMHgyMTQqMgorI2RlZmluZSBJQk1fTVAyX09TRF9EQVRBCTB4MjE1KjIKKyNkZWZpbmUgSUJNX01QMl9PU0RfTU9ERQkweDIxNyoyCisjZGVmaW5lIElCTV9NUDJfT1NEX0xJTktfQUREUgkweDIyOSoyCisjZGVmaW5lIElCTV9NUDJfT1NEX1NJWkUJMHgyMmEqMgorLyogSW50ZXJydXB0IENvbnRyb2wgKi8KKyNkZWZpbmUgSUJNX01QMl9IT1NUX0lOVAkweDIxOCoyCisjZGVmaW5lIElCTV9NUDJfTUFTSzAJCTB4MjE5KjIKKyNkZWZpbmUgSUJNX01QMl9IT1NUX0lOVDEJMHgyM2UqMgorI2RlZmluZSBJQk1fTVAyX01BU0sxCQkweDIzZioyCisvKiBBdWRpbyBDb250cm9sICovCisjZGVmaW5lIElCTV9NUDJfQVVEX0lBRERSCTB4MjFhKjIKKyNkZWZpbmUgSUJNX01QMl9BVURfSURBVEEJMHgyMWIqMgorI2RlZmluZSBJQk1fTVAyX0FVRF9GSUZPCTB4MjFjKjIKKyNkZWZpbmUgSUJNX01QMl9BVURfRklGT1cJMHgxMDEqMgorI2RlZmluZSBJQk1fTVAyX0FVRF9DVEwJCTB4MjFkKjIKKyNkZWZpbmUgSUJNX01QMl9CRUVQX0NUTAkweDIxZSoyCisjZGVmaW5lIElCTV9NUDJfRlJOVF9BVFRFTgkweDIyZCoyCisvKiBEaXNwbGF5IENvbnRyb2wgKi8KKyNkZWZpbmUgSUJNX01QMl9ESVNQX01PREUJMHgyMjAqMgorI2RlZmluZSBJQk1fTVAyX0RJU1BfRExZCTB4MjIxKjIKKyNkZWZpbmUgSUJNX01QMl9WQklfQ1RMCQkweDIyMioyCisjZGVmaW5lIElCTV9NUDJfRElTUF9MQk9SCTB4MjIzKjIKKyNkZWZpbmUgSUJNX01QMl9ESVNQX1RCT1IJMHgyMjQqMgorLyogUG9sYXJpdHkgQ29udHJvbCAqLworI2RlZmluZSBJQk1fTVAyX0lORkNfQ1RMCTB4MjJjKjIKKworLyogY29udHJvbCBjb21tYW5kcyAqLworI2RlZmluZSBJQk1fTVAyX1BMQVkJCTAKKyNkZWZpbmUgSUJNX01QMl9QQVVTRQkJMQorI2RlZmluZSBJQk1fTVAyX1NJTkdMRV9GUkFNRQkyCisjZGVmaW5lIElCTV9NUDJfRkFTVF9GT1JXQVJECTMKKyNkZWZpbmUgSUJNX01QMl9TTE9XX01PVElPTgk0CisjZGVmaW5lIElCTV9NUDJfSU1FRF9OT1JNX1BMQVkJNQorI2RlZmluZSBJQk1fTVAyX1JFU0VUX1dJTkRPVwk2CisjZGVmaW5lIElCTV9NUDJfRlJFRVpFX0ZSQU1FCTcKKyNkZWZpbmUgSUJNX01QMl9SRVNFVF9WSURfUkFURQk4CisjZGVmaW5lIElCTV9NUDJfQ09ORklHX0RFQ09ERVIJOQorI2RlZmluZSBJQk1fTVAyX0NIQU5ORUxfU1dJVENICTEwCisjZGVmaW5lIElCTV9NUDJfUkVTRVRfQVVEX1JBVEUJMTEKKyNkZWZpbmUgSUJNX01QMl9QUkVfT1BfQ0hOX1NXCTEyCisjZGVmaW5lIElCTV9NUDJfU0VUX1NUSUxMX01PREUJMTQKKworLyogRGVmaW5lIFhpbGlueCBGUEdBIEludGVybmFsIFJlZ2lzdGVycyAqLworCisvKiBnZW5lcmFsIGNvbnRyb2wgcmVnaXN0ZXIgMCAqLworI2RlZmluZSBYSUxJTlhfQ1RMMAkJMHg2MDAKKy8qIGdlbmxvY2sgZGVsYXkgcmVzaXN0ZXIgMSAqLworI2RlZmluZSBYSUxJTlhfR0xERUxBWQkJMHg2MDIKKy8qIHNlbmQgMTYgYml0cyB0byBDUzMzMTAgcG9ydCAqLworI2RlZmluZSBYSUxJTlhfQ1MzMzEwCQkweDYwNAorLyogc2VuZCAxNiBiaXRzIHRvIENTMzMxMCBhbmQgY29tcGxldGUgKi8KKyNkZWZpbmUgWElMSU5YX0NTMzMxMF9DTVBMVAkweDYwYworLyogcHVsc2Ugd2lkdGggbW9kdWxhdG9yIGNvbnRyb2wgKi8KKyNkZWZpbmUgWElMSU5YX1BXTQkJMHg2MDYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1ncGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2NjIwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWdwaW8uYwpAQCAtMCwwICsxLDQ0NCBAQAorLyoKKyAqICRJZDogaXIta2JkLWdwaW8uYyx2IDEuMTIgMjAwNS8wMi8yMiAxMjoyODo0MCBrcmF4ZWwgRXhwICQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgR2VyZCBLbm9ycgorICogQ29weXJpZ2h0IChjKSAyMDAzIFBhdmVsIE1hY2hlaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPG1lZGlhL2lyLWNvbW1vbi5oPgorCisjaW5jbHVkZSAiYnR0di5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19hdmVybWVkaWFbSVJfS0VZVEFCX1NJWkVdID0geworCVsgMzQgXSA9IEtFWV9LUDAsCisJWyA0MCBdID0gS0VZX0tQMSwKKwlbIDI0IF0gPSBLRVlfS1AyLAorCVsgNTYgXSA9IEtFWV9LUDMsCisJWyAzNiBdID0gS0VZX0tQNCwKKwlbIDIwIF0gPSBLRVlfS1A1LAorCVsgNTIgXSA9IEtFWV9LUDYsCisJWyA0NCBdID0gS0VZX0tQNywKKwlbIDI4IF0gPSBLRVlfS1A4LAorCVsgNjAgXSA9IEtFWV9LUDksCisKKwlbIDQ4IF0gPSBLRVlfRUpFQ1RDRCwgICAgIC8vIFVubWFya2VkIG9uIG15IGNvbnRyb2xsZXIKKwlbICAwIF0gPSBLRVlfUE9XRVIsCisJWyAxOCBdID0gQlROX0xFRlQsICAgICAgICAvLyBESVNQTEFZL0wKKwlbIDUwIF0gPSBCVE5fUklHSFQsICAgICAgIC8vIExPT1AvUgorCVsgMTAgXSA9IEtFWV9NVVRFLAorCVsgMzggXSA9IEtFWV9SRUNPUkQsCisJWyAyMiBdID0gS0VZX1BBVVNFLAorCVsgNTQgXSA9IEtFWV9TVE9QLAorCVsgMzAgXSA9IEtFWV9WT0xVTUVET1dOLAorCVsgNjIgXSA9IEtFWV9WT0xVTUVVUCwKKworCVsgMzIgXSA9IEtFWV9UVU5FUiwgICAgICAgLy8gVFYvRk0KKwlbIDE2IF0gPSBLRVlfQ0QsCisJWyAgOCBdID0gS0VZX1ZJREVPLAorCVsgIDQgXSA9IEtFWV9BVURJTywKKwlbIDEyIF0gPSBLRVlfWk9PTSwgICAgICAgIC8vIGZ1bGwgc2NyZWVuCisJWyAgMiBdID0gS0VZX0lORk8sICAgICAgICAvLyBwcmV2aWV3CisJWyA0MiBdID0gS0VZX1NFQVJDSCwgICAgICAvLyBhdXRvc2NhbgorCVsgMjYgXSA9IEtFWV9TVE9QLCAgICAgICAgLy8gZnJlZXplCisJWyA1OCBdID0gS0VZX1JFQ09SRCwgICAgICAvLyBjYXB0dXJlCisJWyAgNiBdID0gS0VZX1BMQVksICAgICAgICAvLyB1bm1hcmtlZAorCVsgNDYgXSA9IEtFWV9SRUQsICAgICAgICAgLy8gdW5tYXJrZWQKKwlbIDE0IF0gPSBLRVlfR1JFRU4sICAgICAgIC8vIHVubWFya2VkCisKKwlbIDMzIF0gPSBLRVlfWUVMTE9XLCAgICAgIC8vIHVubWFya2VkCisJWyAxNyBdID0gS0VZX0NIQU5ORUxET1dOLAorCVsgNDkgXSA9IEtFWV9DSEFOTkVMVVAsCisJWyAgMSBdID0gS0VZX0JMVUUsICAgICAgICAvLyB1bm1hcmtlZAorfTsKKworLyogTWF0dCBKZXNzb24gPGR2YkBqZXNzb24uZWNsaXBzZS5jby51ayAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2F2ZXJtZWRpYV9kdmJ0W0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbIDB4MjggXSA9IEtFWV9LUDAsICAgICAgICAgLy8nMCcgLyAnZW50ZXInCisJWyAweDIyIF0gPSBLRVlfS1AxLCAgICAgICAgIC8vJzEnCisJWyAweDEyIF0gPSBLRVlfS1AyLCAgICAgICAgIC8vJzInIC8gJ3VwIGFycm93JworCVsgMHgzMiBdID0gS0VZX0tQMywgICAgICAgICAvLyczJworCVsgMHgyNCBdID0gS0VZX0tQNCwgICAgICAgICAvLyc0JyAvICdsZWZ0IGFycm93JworCVsgMHgxNCBdID0gS0VZX0tQNSwgICAgICAgICAvLyc1JworCVsgMHgzNCBdID0gS0VZX0tQNiwgICAgICAgICAvLyc2JyAvICdyaWdodCBhcnJvdycKKwlbIDB4MjYgXSA9IEtFWV9LUDcsICAgICAgICAgLy8nNycKKwlbIDB4MTYgXSA9IEtFWV9LUDgsICAgICAgICAgLy8nOCcgLyAnZG93biBhcnJvdycKKwlbIDB4MzYgXSA9IEtFWV9LUDksICAgICAgICAgLy8nOScKKworCVsgMHgyMCBdID0gS0VZX0xJU1QsICAgICAgICAvLyAnc291cmNlJworCVsgMHgxMCBdID0gS0VZX1RFWFQsICAgICAgICAvLyAndGVsZXRleHQnCisJWyAweDAwIF0gPSBLRVlfUE9XRVIsICAgICAgIC8vICdwb3dlcicKKwlbIDB4MDQgXSA9IEtFWV9BVURJTywgICAgICAgLy8gJ2F1ZGlvJworCVsgMHgwNiBdID0gS0VZX1pPT00sICAgICAgICAvLyAnZnVsbCBzY3JlZW4nCisJWyAweDE4IF0gPSBLRVlfVklERU8sICAgICAgIC8vICdkaXNwbGF5JworCVsgMHgzOCBdID0gS0VZX1NFQVJDSCwgICAgICAvLyAnbG9vcCcKKwlbIDB4MDggXSA9IEtFWV9JTkZPLCAgICAgICAgLy8gJ3ByZXZpZXcnCisJWyAweDJhIF0gPSBLRVlfUkVXSU5ELCAgICAgIC8vICdiYWNrd2FyZCA8PCcKKwlbIDB4MWEgXSA9IEtFWV9GQVNURk9SV0FSRCwgLy8gJ2ZvcndhcmQgPj4nCisJWyAweDNhIF0gPSBLRVlfUkVDT1JELCAgICAgIC8vICdjYXB0dXJlJworCVsgMHgwYSBdID0gS0VZX01VVEUsICAgICAgICAvLyAnbXV0ZScKKwlbIDB4MmMgXSA9IEtFWV9SRUNPUkQsICAgICAgLy8gJ3JlY29yZCcKKwlbIDB4MWMgXSA9IEtFWV9QQVVTRSwgICAgICAgLy8gJ3BhdXNlJworCVsgMHgzYyBdID0gS0VZX1NUT1AsICAgICAgICAvLyAnc3RvcCcKKwlbIDB4MGMgXSA9IEtFWV9QTEFZLCAgICAgICAgLy8gJ3BsYXknCisJWyAweDJlIF0gPSBLRVlfUkVELCAgICAgICAgIC8vICdyZWQnCisJWyAweDAxIF0gPSBLRVlfQkxVRSwgICAgICAgIC8vICdibHVlJyAvICdjYW5jZWwnCisJWyAweDBlIF0gPSBLRVlfWUVMTE9XLCAgICAgIC8vICd5ZWxsb3cnIC8gJ29rJworCVsgMHgyMSBdID0gS0VZX0dSRUVOLCAgICAgICAvLyAnZ3JlZW4nCisJWyAweDExIF0gPSBLRVlfQ0hBTk5FTERPV04sIC8vICdjaGFubmVsIC0nCisJWyAweDMxIF0gPSBLRVlfQ0hBTk5FTFVQLCAgIC8vICdjaGFubmVsICsnCisJWyAweDFlIF0gPSBLRVlfVk9MVU1FRE9XTiwgIC8vICd2b2x1bWUgLScKKwlbIDB4M2UgXSA9IEtFWV9WT0xVTUVVUCwgICAgLy8gJ3ZvbHVtZSArJworfTsKKworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3BpeGVsdmlld1tJUl9LRVlUQUJfU0laRV0gPSB7CisJWyAgMiBdID0gS0VZX0tQMCwKKwlbICAxIF0gPSBLRVlfS1AxLAorCVsgMTEgXSA9IEtFWV9LUDIsCisJWyAyNyBdID0gS0VZX0tQMywKKwlbICA1IF0gPSBLRVlfS1A0LAorCVsgIDkgXSA9IEtFWV9LUDUsCisJWyAyMSBdID0gS0VZX0tQNiwKKwlbICA2IF0gPSBLRVlfS1A3LAorCVsgMTAgXSA9IEtFWV9LUDgsCisJWyAxOCBdID0gS0VZX0tQOSwKKworCVsgIDMgXSA9IEtFWV9UVU5FUiwgICAgICAgLy8gVFYvRk0KKwlbICA3IF0gPSBLRVlfU0VBUkNILCAgICAgIC8vIHNjYW4KKwlbIDI4IF0gPSBLRVlfWk9PTSwgICAgICAgIC8vIGZ1bGwgc2NyZWVuCisJWyAzMCBdID0gS0VZX1BPV0VSLAorCVsgMjMgXSA9IEtFWV9WT0xVTUVET1dOLAorCVsgMzEgXSA9IEtFWV9WT0xVTUVVUCwKKwlbIDIwIF0gPSBLRVlfQ0hBTk5FTERPV04sCisJWyAyMiBdID0gS0VZX0NIQU5ORUxVUCwKKwlbIDI0IF0gPSBLRVlfTVVURSwKKworCVsgIDAgXSA9IEtFWV9MSVNULCAgICAgICAgLy8gc291cmNlCisJWyAxOSBdID0gS0VZX0lORk8sICAgICAgICAvLyBsb29wCisJWyAxNiBdID0gS0VZX0xBU1QsICAgICAgICAvLyArMTAwCisJWyAxMyBdID0gS0VZX0NMRUFSLCAgICAgICAvLyByZXNldAorCVsgMTIgXSA9IEJUTl9SSUdIVCwgICAgICAgLy8gZnVuKysKKwlbICA0IF0gPSBCVE5fTEVGVCwgICAgICAgIC8vIGZ1bi0tCisJWyAxNCBdID0gS0VZX0dPVE8sICAgICAgICAvLyBmdW5jdGlvbgorCVsgMTUgXSA9IEtFWV9TVE9QLCAgICAgICAgIC8vIGZyZWV6ZQorfTsKKworLyogQXR0aWxhIEtvbmRvcm9zIDxhdHRpbGEua29uZG9yb3NAY2hlbGxvLmh1PiAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2FwYWNfdmlld2NvbXBbSVJfS0VZVEFCX1NJWkVdID0geworCisJWyAgMSBdID0gS0VZX0tQMSwKKwlbICAyIF0gPSBLRVlfS1AyLAorCVsgIDMgXSA9IEtFWV9LUDMsCisJWyAgNCBdID0gS0VZX0tQNCwKKwlbICA1IF0gPSBLRVlfS1A1LAorCVsgIDYgXSA9IEtFWV9LUDYsCisJWyAgNyBdID0gS0VZX0tQNywKKwlbICA4IF0gPSBLRVlfS1A4LAorCVsgIDkgXSA9IEtFWV9LUDksCisJWyAgMCBdID0gS0VZX0tQMCwKKwlbIDIzIF0gPSBLRVlfTEFTVCwgICAgICAgIC8vICsxMDAKKwlbIDEwIF0gPSBLRVlfTElTVCwgICAgICAgIC8vIHJlY2FsbAorCisKKwlbIDI4IF0gPSBLRVlfVFVORVIsICAgICAgIC8vIFRWL0ZNCisJWyAyMSBdID0gS0VZX1NFQVJDSCwgICAgICAvLyBzY2FuCisJWyAxOCBdID0gS0VZX1BPV0VSLCAgICAgICAvLyBwb3dlcgorCVsgMzEgXSA9IEtFWV9WT0xVTUVET1dOLCAgLy8gdm9sIHVwCisJWyAyNyBdID0gS0VZX1ZPTFVNRVVQLCAgICAvLyB2b2wgZG93bgorCVsgMzAgXSA9IEtFWV9DSEFOTkVMRE9XTiwgLy8gY2huIHVwCisJWyAyNiBdID0gS0VZX0NIQU5ORUxVUCwgICAvLyBjaG4gZG93bgorCisJWyAxNyBdID0gS0VZX1ZJREVPLCAgICAgICAvLyB2aWRlbworCVsgMTUgXSA9IEtFWV9aT09NLCAgICAgICAgLy8gZnVsbCBzY3JlZW4KKwlbIDE5IF0gPSBLRVlfTVVURSwgICAgICAgIC8vIG11dGUvdW5tdXRlCisJWyAxNiBdID0gS0VZX1RFWFQsICAgICAgICAvLyBtaW4KKworCVsgMTMgXSA9IEtFWV9TVE9QLCAgICAgICAgLy8gZnJlZXplCisJWyAxNCBdID0gS0VZX1JFQ09SRCwgICAgICAvLyByZWNvcmQKKwlbIDI5IF0gPSBLRVlfUExBWVBBVVNFLCAgIC8vIHN0b3AKKwlbIDI1IF0gPSBLRVlfUExBWSwgICAgICAgIC8vIHBsYXkKKworCVsgMjIgXSA9IEtFWV9HT1RPLCAgICAgICAgLy8gb3NkCisJWyAyMCBdID0gS0VZX1JFRlJFU0gsICAgICAvLyBkZWZhdWx0CisJWyAxMiBdID0gS0VZX0tQUExVUywgICAgICAvLyBmaW5lIHR1bmUgPj4+PgorCVsgMjQgXSA9IEtFWV9LUE1JTlVTICAgICAgLy8gZmluZSB0dW5lIDw8PDwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IElSIHsKKwlzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICAqc3ViOworCXN0cnVjdCBpbnB1dF9kZXYgICAgICAgIGlucHV0OworCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAgIGlyOworCWNoYXIgICAgICAgICAgICAgICAgICAgIG5hbWVbMzJdOworCWNoYXIgICAgICAgICAgICAgICAgICAgIHBoeXNbMzJdOworCXUzMiAgICAgICAgICAgICAgICAgICAgIG1hc2tfa2V5Y29kZTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBtYXNrX2tleWRvd247CisJdTMyICAgICAgICAgICAgICAgICAgICAgbWFza19rZXl1cDsKKworCWludCAgICAgICAgICAgICAgICAgICAgIHBvbGxpbmc7CisJdTMyICAgICAgICAgICAgICAgICAgICAgbGFzdF9ncGlvOworCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIHdvcms7CisJc3RydWN0IHRpbWVyX2xpc3QgICAgICAgdGltZXI7Cit9OworCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOyAgICAvKiBkZWJ1ZyBsZXZlbCAoMCwxLDIpICovCisKKyNkZWZpbmUgREVWTkFNRSAiaXIta2JkLWdwaW8iCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pCWlmIChkZWJ1ZykgXAorCXByaW50ayhLRVJOX0RFQlVHIERFVk5BTUUgIjogIiBmbXQgLCAjIyBhcmcpCisKK3N0YXRpYyB2b2lkIGlyX2lycShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpOworc3RhdGljIGludCBpcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpcl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKKworc3RhdGljIHN0cnVjdCBidHR2X3N1Yl9kcml2ZXIgZHJpdmVyID0geworCS5kcnYgPSB7CisJCS5uYW1lCT0gREVWTkFNRSwKKwkJLnByb2JlCT0gaXJfcHJvYmUsCisJCS5yZW1vdmUJPSBpcl9yZW1vdmUsCisJfSwKKwkuZ3Bpb19pcnEgICAgICAgPSBpcl9pcnEsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGlyX2hhbmRsZV9rZXkoc3RydWN0IElSICppcikKK3sKKwl1MzIgZ3BpbyxkYXRhOworCisJLyogcmVhZCBncGlvIHZhbHVlICovCisJZ3BpbyA9IGJ0dHZfZ3Bpb19yZWFkKGlyLT5zdWItPmNvcmUpOworCWlmIChpci0+cG9sbGluZykgeworCQlpZiAoaXItPmxhc3RfZ3BpbyA9PSBncGlvKQorCQkJcmV0dXJuOworCQlpci0+bGFzdF9ncGlvID0gZ3BpbzsKKwl9CisKKwkvKiBleHRyYWN0IGRhdGEgKi8KKwlkYXRhID0gaXJfZXh0cmFjdF9iaXRzKGdwaW8sIGlyLT5tYXNrX2tleWNvZGUpOworCWRwcmludGsoREVWTkFNRSAiOiBpcnEgZ3Bpbz0weCV4IGNvZGU9JWQgfCAlcyVzJXNcbiIsCisJCWdwaW8sIGRhdGEsCisJCWlyLT5wb2xsaW5nICAgICAgICAgICAgICAgPyAicG9sbCIgIDogImlycSIsCisJCShncGlvICYgaXItPm1hc2tfa2V5ZG93bikgPyAiIGRvd24iIDogIiIsCisJCShncGlvICYgaXItPm1hc2tfa2V5dXApICAgPyAiIHVwIiAgIDogIiIpOworCisJaWYgKGlyLT5tYXNrX2tleWRvd24pIHsKKwkJLyogYml0IHNldCBvbiBrZXlkb3duICovCisJCWlmIChncGlvICYgaXItPm1hc2tfa2V5ZG93bikgeworCQkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCZpci0+aXIsZGF0YSxkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJCX0KKworCX0gZWxzZSBpZiAoaXItPm1hc2tfa2V5dXApIHsKKwkJLyogYml0IGNsZWFyZWQgb24ga2V5ZG93biAqLworCQlpZiAoMCA9PSAoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSkgeworCQkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCZpci0+aXIsZGF0YSxkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJCX0KKworCX0gZWxzZSB7CisJCS8qIGNhbid0IGRpc3R1cmdpc3NoIGtleWRvd24vdXAgOi0vICovCisJCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwmaXItPmlyLGRhdGEsZGF0YSk7CisJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBpcl9pcnEoc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViKQoreworCXN0cnVjdCBJUiAqaXIgPSBkZXZfZ2V0X2RydmRhdGEoJnN1Yi0+ZGV2KTsKKworCWlmICghaXItPnBvbGxpbmcpCisJCWlyX2hhbmRsZV9rZXkoaXIpOworfQorCitzdGF0aWMgdm9pZCBpcl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IElSICppciA9IChzdHJ1Y3QgSVIqKWRhdGE7CisKKwlzY2hlZHVsZV93b3JrKCZpci0+d29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGlyX3dvcmsodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gZGF0YTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlpcl9oYW5kbGVfa2V5KGlyKTsKKwl0aW1lb3V0ID0gamlmZmllcyArIChpci0+cG9sbGluZyAqIEhaIC8gMTAwMCk7CisJbW9kX3RpbWVyKCZpci0+dGltZXIsIHRpbWVvdXQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgaXJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1YiA9IHRvX2J0dHZfc3ViX2RldihkZXYpOworCXN0cnVjdCBJUiAqaXI7CisJSVJfS0VZVEFCX1RZUEUgKmlyX2NvZGVzID0gTlVMTDsKKwlpbnQgaXJfdHlwZSA9IElSX1RZUEVfT1RIRVI7CisKKwlpciA9IGttYWxsb2Moc2l6ZW9mKCppciksR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gaXIpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChpciwwLHNpemVvZigqaXIpKTsKKworCS8qIGRldGVjdCAmIGNvbmZpZ3VyZSAqLworCXN3aXRjaCAoc3ViLT5jb3JlLT50eXBlKSB7CisJY2FzZSBCVFRWX0FWRVJNRURJQToKKwljYXNlIEJUVFZfQVZQSE9ORTk4OgorCWNhc2UgQlRUVl9BVkVSTUVESUE5ODoKKwkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX2F2ZXJtZWRpYTsKKwkJaXItPm1hc2tfa2V5Y29kZSA9IDB4Zjg4MDAwOworCQlpci0+bWFza19rZXlkb3duID0gMHgwMTAwMDA7CisJCWlyLT5wb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKKwkJYnJlYWs7CisKKwljYXNlIEJUVFZfQVZEVkJUXzc2MToKKwljYXNlIEJUVFZfQVZEVkJUXzc3MToKKwkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX2F2ZXJtZWRpYV9kdmJ0OworCQlpci0+bWFza19rZXljb2RlID0gMHgwZjAwYzA7CisJCWlyLT5tYXNrX2tleWRvd24gPSAweDAwMDAyMDsKKwkJaXItPnBvbGxpbmcgICAgICA9IDUwOyAvLyBtcworCQlicmVhazsKKworCWNhc2UgQlRUVl9QWEVMVldQTFRWUEFLOgorCQlpcl9jb2RlcyAgICAgICAgID0gaXJfY29kZXNfcGl4ZWx2aWV3OworCQlpci0+bWFza19rZXljb2RlID0gMHgwMDNlMDA7CisJCWlyLT5tYXNrX2tleXVwICAgPSAweDAxMDAwMDsKKwkJaXItPnBvbGxpbmcgICAgICA9IDUwOyAvLyBtcworICAgICAgICAgICAgICAgIGJyZWFrOworCWNhc2UgQlRUVl9QVl9CVDg3OFBfOUI6CisJY2FzZSBCVFRWX1BWX0JUODc4UF9QTFVTOgorCQlpcl9jb2RlcyAgICAgICAgID0gaXJfY29kZXNfcGl4ZWx2aWV3OworCQlpci0+bWFza19rZXljb2RlID0gMHgwMDFmMDA7CisJCWlyLT5tYXNrX2tleXVwICAgPSAweDAwODAwMDsKKwkJaXItPnBvbGxpbmcgICAgICA9IDUwOyAvLyBtcworICAgICAgICAgICAgICAgIGJyZWFrOworCisJY2FzZSBCVFRWX1dJTkZBU1QyMDAwOgorCQlpcl9jb2RlcyAgICAgICAgID0gaXJfY29kZXNfd2luZmFzdDsKKwkJaXItPm1hc2tfa2V5Y29kZSA9IDB4MWY4OworCQlicmVhazsKKwljYXNlIEJUVFZfTUFHSUNUVklFVzA2MToKKwljYXNlIEJUVFZfTUFHSUNUVklFVzA2MzoKKwkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX3dpbmZhc3Q7CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweDAwMDhlMDAwOworCQlpci0+bWFza19rZXlkb3duID0gMHgwMDIwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBCVFRWX0FQQUNfVklFV0NPTVA6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19hcGFjX3ZpZXdjb21wOworCQlpci0+bWFza19rZXljb2RlID0gMHgwMDFmMDA7CisJCWlyLT5tYXNrX2tleXVwICAgPSAweDAwODAwMDsKKwkJaXItPnBvbGxpbmcgICAgICA9IDUwOyAvLyBtcworCQlicmVhazsKKwl9CisJaWYgKE5VTEwgPT0gaXJfY29kZXMpIHsKKwkJa2ZyZWUoaXIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBpbml0IGhhcmR3YXJlLXNwZWNpZmljIHN0dWZmICovCisJYnR0dl9ncGlvX2lub3V0KHN1Yi0+Y29yZSwgaXItPm1hc2tfa2V5Y29kZSB8IGlyLT5tYXNrX2tleWRvd24sIDApOworCWlyLT5zdWIgPSBzdWI7CisKKwkvKiBpbml0IGlucHV0IGRldmljZSAqLworCXNucHJpbnRmKGlyLT5uYW1lLCBzaXplb2YoaXItPm5hbWUpLCAiYnR0diBJUiAoY2FyZD0lZCkiLAorCQkgc3ViLT5jb3JlLT50eXBlKTsKKwlzbnByaW50Zihpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSwgInBjaS0lcy9pcjAiLAorCQkgcGNpX25hbWUoc3ViLT5jb3JlLT5wY2kpKTsKKworCWlyX2lucHV0X2luaXQoJmlyLT5pbnB1dCwgJmlyLT5pciwgaXJfdHlwZSwgaXJfY29kZXMpOworCWlyLT5pbnB1dC5uYW1lID0gaXItPm5hbWU7CisJaXItPmlucHV0LnBoeXMgPSBpci0+cGh5czsKKwlpci0+aW5wdXQuaWQuYnVzdHlwZSA9IEJVU19QQ0k7CisJaXItPmlucHV0LmlkLnZlcnNpb24gPSAxOworCWlmIChzdWItPmNvcmUtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvcikgeworCQlpci0+aW5wdXQuaWQudmVuZG9yICA9IHN1Yi0+Y29yZS0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yOworCQlpci0+aW5wdXQuaWQucHJvZHVjdCA9IHN1Yi0+Y29yZS0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlOworCX0gZWxzZSB7CisJCWlyLT5pbnB1dC5pZC52ZW5kb3IgID0gc3ViLT5jb3JlLT5wY2ktPnZlbmRvcjsKKwkJaXItPmlucHV0LmlkLnByb2R1Y3QgPSBzdWItPmNvcmUtPnBjaS0+ZGV2aWNlOworCX0KKworCWlmIChpci0+cG9sbGluZykgeworCQlJTklUX1dPUksoJmlyLT53b3JrLCBpcl93b3JrLCBpcik7CisJCWluaXRfdGltZXIoJmlyLT50aW1lcik7CisJCWlyLT50aW1lci5mdW5jdGlvbiA9IGlyX3RpbWVyOworCQlpci0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylpcjsKKwkJc2NoZWR1bGVfd29yaygmaXItPndvcmspOworCX0KKworCS8qIGFsbCBkb25lICovCisJZGV2X3NldF9kcnZkYXRhKGRldixpcik7CisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZpci0+aW5wdXQpOworCXByaW50ayhERVZOQU1FICI6ICVzIGRldGVjdGVkIGF0ICVzXG4iLGlyLT5pbnB1dC5uYW1lLGlyLT5pbnB1dC5waHlzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IElSICppciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGlyLT5wb2xsaW5nKSB7CisJCWRlbF90aW1lcigmaXItPnRpbWVyKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmaXItPmlucHV0KTsKKwlrZnJlZShpcik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciwgUGF2ZWwgTWFjaGVrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlucHV0IGRyaXZlciBmb3IgYnQ4eDggZ3BpbyBJUiByZW1vdGUgY29udHJvbHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBpcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGJ0dHZfc3ViX3JlZ2lzdGVyKCZkcml2ZXIsICJyZW1vdGUiKTsKK30KKworc3RhdGljIHZvaWQgaXJfZmluaSh2b2lkKQoreworCWJ0dHZfc3ViX3VucmVnaXN0ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGlyX2luaXQpOworbW9kdWxlX2V4aXQoaXJfZmluaSk7CisKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2NjRmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jCkBAIC0wLDAgKzEsNDkyIEBACisvKgorICogJElkOiBpci1rYmQtaTJjLmMsdiAxLjEwIDIwMDQvMTIvMDkgMTI6NTE6MzUga3JheGVsIEV4cCAkCisgKgorICoga2V5Ym9hcmQgaW5wdXQgZHJpdmVyIGZvciBpMmMgSVIgcmVtb3RlIGNvbnRyb2xzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPgorICogbW9kaWZpZWQgZm9yIFBpeGVsVmlldyAoQlQ4NzhQK1cvRk0pIGJ5CisgKiAgICAgIE1pY2hhbCBLb2NoYW5vd2ljeiA8bWtvY2hhbm9AcGxkLm9yZy5wbD4KKyAqICAgICAgQ2hyaXN0b3BoIEJhcnRlbG11cyA8bGlyY0BiYXJ0ZWxtdXMuZGU+CisgKiBtb2RpZmllZCBmb3IgS05DIE9ORSBUViBTdGF0aW9uL0FudWJpcyBUeXBob29uIFRWaWV3IFR1bmVyIGJ5CisgKiAgICAgIFVscmljaCBNdWVsbGVyIDx1bHJpY2gubXVlbGxlcjQyQHdlYi5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvaXItY29tbW9uLmg+CisKKy8qIE1hcmsgUGhhbGFuIDxwaGFsYW5tQG8yLmllPiAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3B2OTUxW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbICAwIF0gPSBLRVlfS1AwLAorCVsgIDEgXSA9IEtFWV9LUDEsCisJWyAgMiBdID0gS0VZX0tQMiwKKwlbICAzIF0gPSBLRVlfS1AzLAorCVsgIDQgXSA9IEtFWV9LUDQsCisJWyAgNSBdID0gS0VZX0tQNSwKKwlbICA2IF0gPSBLRVlfS1A2LAorCVsgIDcgXSA9IEtFWV9LUDcsCisJWyAgOCBdID0gS0VZX0tQOCwKKwlbICA5IF0gPSBLRVlfS1A5LAorCisJWyAxOCBdID0gS0VZX1BPV0VSLAorCVsgMTYgXSA9IEtFWV9NVVRFLAorCVsgMzEgXSA9IEtFWV9WT0xVTUVET1dOLAorCVsgMjcgXSA9IEtFWV9WT0xVTUVVUCwKKwlbIDI2IF0gPSBLRVlfQ0hBTk5FTFVQLAorCVsgMzAgXSA9IEtFWV9DSEFOTkVMRE9XTiwKKwlbIDE0IF0gPSBLRVlfUEFHRVVQLAorCVsgMjkgXSA9IEtFWV9QQUdFRE9XTiwKKwlbIDE5IF0gPSBLRVlfU09VTkQsCisKKwlbIDI0IF0gPSBLRVlfS1BQTFVTTUlOVVMsCS8vIENIICsvLQorCVsgMjIgXSA9IEtFWV9TVUJUSVRMRSwJCS8vIENDCisJWyAxMyBdID0gS0VZX1RFWFQsCQkvLyBUVFgKKwlbIDExIF0gPSBLRVlfVFYsCQkvLyBBSVIvQ0JMCisJWyAxNyBdID0gS0VZX1BDLAkJLy8gUEMvVFYKKwlbIDIzIF0gPSBLRVlfT0ssCQkvLyBDSCBSVE4KKwlbIDI1IF0gPSBLRVlfTU9ERSwgCQkvLyBGVU5DCisJWyAxMiBdID0gS0VZX1NFQVJDSCwgCQkvLyBBVVRPU0NBTgorCisJLyogTm90IHN1cmUgd2hhdCB0byBkbyB3aXRoIHRoZXNlIG9uZXMhICovCisJWyAxNSBdID0gS0VZX1NFTEVDVCwgCQkvLyBTT1VSQ0UKKwlbIDEwIF0gPSBLRVlfS1BQTFVTLAkJLy8gKzEwMAorCVsgMjAgXSA9IEtFWV9LUEVRVUFMLAkJLy8gU1lOQworCVsgMjggXSA9IEtFWV9NRURJQSwgICAgICAgICAgICAgLy8gUEMvVFYKK307CisKK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19wdXJwbGV0dltJUl9LRVlUQUJfU0laRV0gPSB7CisJWyAweDMgIF0gPSBLRVlfUE9XRVIsCisJWyAweDZmIF0gPSBLRVlfTVVURSwKKwlbIDB4MTAgXSA9IEtFWV9CQUNLU1BBQ0UsCS8vIFJlY2FsbAorCisJWyAweDExIF0gPSBLRVlfS1AwLAorCVsgMHg0ICBdID0gS0VZX0tQMSwKKwlbIDB4NSAgXSA9IEtFWV9LUDIsCisJWyAweDYgIF0gPSBLRVlfS1AzLAorCVsgMHg4ICBdID0gS0VZX0tQNCwKKwlbIDB4OSAgXSA9IEtFWV9LUDUsCisJWyAweGEgIF0gPSBLRVlfS1A2LAorCVsgMHhjICBdID0gS0VZX0tQNywKKwlbIDB4ZCAgXSA9IEtFWV9LUDgsCisJWyAweGUgIF0gPSBLRVlfS1A5LAorCVsgMHgxMiBdID0gS0VZX0tQRE9ULAkJLy8gMTAwKworCisJWyAweDcgIF0gPSBLRVlfVk9MVU1FVVAsCisJWyAweGIgIF0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbIDB4MWEgXSA9IEtFWV9LUFBMVVMsCisJWyAweDE4IF0gPSBLRVlfS1BNSU5VUywKKwlbIDB4MTUgXSA9IEtFWV9VUCwKKwlbIDB4MWQgXSA9IEtFWV9ET1dOLAorCVsgMHhmICBdID0gS0VZX0NIQU5ORUxVUCwKKwlbIDB4MTMgXSA9IEtFWV9DSEFOTkVMRE9XTiwKKwlbIDB4NDggXSA9IEtFWV9aT09NLAorCisJWyAweDFiIF0gPSBLRVlfVklERU8sCQkvLyBWaWRlbyBzb3VyY2UKKyNpZiAwCisJWyAweDFmIF0gPSBLRVlfUywgICAgICAgCS8vIFNuYXBzaG90CisjZW5kaWYKKwlbIDB4NDkgXSA9IEtFWV9MQU5HVUFHRSwJLy8gTVRTIFNlbGVjdAorCVsgMHgxOSBdID0gS0VZX1NFQVJDSCwJCS8vIEF1dG8gU2NhbgorCisJWyAweDRiIF0gPSBLRVlfUkVDT1JELAorCVsgMHg0NiBdID0gS0VZX1BMQVksCisJWyAweDQ1IF0gPSBLRVlfUEFVU0UsICAgCS8vIFBhdXNlCisJWyAweDQ0IF0gPSBLRVlfU1RPUCwKKyNpZiAwCisJWyAweDQzIF0gPSBLRVlfVCwgICAgCQkvLyBUaW1lIFNoaWZ0CisJWyAweDQ3IF0gPSBLRVlfWSwgICAgCQkvLyBUaW1lIFNoaWZ0IE9GRgorCVsgMHg0YSBdID0gS0VZX08sICAgIAkJLy8gVE9QCisJWyAweDE3IF0gPSBLRVlfRiwgICAgCQkvLyBTVVJGIENICisjZW5kaWYKKwlbIDB4NDAgXSA9IEtFWV9GT1JXQVJELCAgIAkvLyBGb3J3YXJkID8KKwlbIDB4NDIgXSA9IEtFWV9SRVdJTkQsICAgCS8vIEJhY2t3YXJkID8KKworfTsKKworc3RydWN0IElSOworc3RydWN0IElSIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAgICAgIGM7CisJc3RydWN0IGlucHV0X2RldiAgICAgICBpbnB1dDsKKwlzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgIGlyOworCisJc3RydWN0IHdvcmtfc3RydWN0ICAgICB3b3JrOworCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgdGltZXI7CisJY2hhciAgICAgICAgICAgICAgICAgICBwaHlzWzMyXTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICgqZ2V0X2tleSkoc3RydWN0IElSKiwgdTMyKiwgdTMyKik7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogaW5zbW9kIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsgICAgLyogZGVidWcgbGV2ZWwgKDAsMSwyKSAqLworCisjZGVmaW5lIERFVk5BTUUgImlyLWtiZC1pMmMiCisjZGVmaW5lIGRwcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKQlpZiAoZGVidWcgPj0gbGV2ZWwpIFwKKwlwcmludGsoS0VSTl9ERUJVRyBERVZOQU1FICI6ICIgZm10ICwgIyMgYXJnKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGdldF9rZXlfaGF1cChzdHJ1Y3QgSVIgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpCit7CisJdW5zaWduZWQgY2hhciBidWZbM107CisJaW50IHN0YXJ0LCB0b2dnbGUsIGRldiwgY29kZTsKKworCS8qIHBvbGwgSVIgY2hpcCAqLworCWlmICgzICE9IGkyY19tYXN0ZXJfcmVjdigmaXItPmMsYnVmLDMpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHNwbGl0IHJjNSBkYXRhIGJsb2NrIC4uLiAqLworCXN0YXJ0ICA9IChidWZbMF0gPj4gNikgJiAgICAzOworCXRvZ2dsZSA9IChidWZbMF0gPj4gNSkgJiAgICAxOworCWRldiAgICA9ICBidWZbMF0gICAgICAgJiAweDFmOworCWNvZGUgICA9IChidWZbMV0gPj4gMikgJiAweDNmOworCisJaWYgKDMgIT0gc3RhcnQpCisJCS8qIG5vIGtleSBwcmVzc2VkICovCisJCXJldHVybiAwOworCWRwcmludGsoMSwiaXIgaGF1cHBhdWdlIChyYzUpOiBzJWQgdCVkIGRldj0lZCBjb2RlPSVkXG4iLAorCQlzdGFydCwgdG9nZ2xlLCBkZXYsIGNvZGUpOworCisJLyogcmV0dXJuIGtleSAqLworCSppcl9rZXkgPSBjb2RlOworCSppcl9yYXcgPSAoc3RhcnQgPDwgMTIpIHwgKHRvZ2dsZSA8PCAxMSkgfCAoZGV2IDw8IDYpIHwgY29kZTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZXRfa2V5X3BpeGVsdmlldyhzdHJ1Y3QgSVIgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYjsKKworCS8qIHBvbGwgSVIgY2hpcCAqLworCWlmICgxICE9IGkyY19tYXN0ZXJfcmVjdigmaXItPmMsJmIsMSkpIHsKKwkJZHByaW50aygxLCJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCSppcl9rZXkgPSBiOworCSppcl9yYXcgPSBiOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGdldF9rZXlfcHY5NTEoc3RydWN0IElSICppciwgdTMyICppcl9rZXksIHUzMiAqaXJfcmF3KQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CisKKwkvKiBwb2xsIElSIGNoaXAgKi8KKwlpZiAoMSAhPSBpMmNfbWFzdGVyX3JlY3YoJmlyLT5jLCZiLDEpKSB7CisJCWRwcmludGsoMSwicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGlnbm9yZSAweGFhICovCisJaWYgKGI9PTB4YWEpCisJCXJldHVybiAwOworCWRwcmludGsoMiwia2V5ICUwMnhcbiIsIGIpOworCisJKmlyX2tleSA9IGI7CisJKmlyX3JhdyA9IGI7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2tleV9rbmMxKHN0cnVjdCBJUiAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKK3sKKwl1bnNpZ25lZCBjaGFyIGI7CisKKwkvKiBwb2xsIElSIGNoaXAgKi8KKwlpZiAoMSAhPSBpMmNfbWFzdGVyX3JlY3YoJmlyLT5jLCZiLDEpKSB7CisJCWRwcmludGsoMSwicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGl0IHNlZW1zIHRoYXQgMHhGRSBpbmRpY2F0ZXMgdGhhdCBhIGJ1dHRvbiBpcyBzdGlsbCBob2xkCisJICAgZG93biwgd2hpbGUgMHhGRiBpbmRpY2F0ZXMgdGhhdCBubyBidXR0b24gaXMgaG9sZAorCSAgIGRvd24uIDB4RkUgc2VxdWVuY2VzIGFyZSBzb21ldGltZXMgaW50ZXJydXB0ZWQgYnkgMHhGRiAqLworCisJZHByaW50aygyLCJrZXkgJTAyeFxuIiwgYik7CisKKwlpZiAoYiA9PSAweEZGKQorCQlyZXR1cm4gMDsKKworCWlmIChiID09IDB4RkUpCisJCS8qIGtlZXAgb2xkIGRhdGEgKi8KKwkJcmV0dXJuIDE7CisKKwkqaXJfa2V5ID0gYjsKKwkqaXJfcmF3ID0gYjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZXRfa2V5X3B1cnBsZXR2KHN0cnVjdCBJUiAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKK3sKKyAgICAgICAgdW5zaWduZWQgY2hhciBiOworCisJLyogcG9sbCBJUiBjaGlwICovCisJaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KCZpci0+YywmYiwxKSkgeworCQlkcHJpbnRrKDEsInJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBubyBidXR0b24gcHJlc3MgKi8KKwlpZiAoYj09MCkKKwkJcmV0dXJuIDA7CisKKwkvKiByZXBlYXRpbmcgKi8KKwlpZiAoYiAmIDB4ODApCisJCXJldHVybiAxOworCisJKmlyX2tleSA9IGI7CisJKmlyX3JhdyA9IGI7CisJcmV0dXJuIDE7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBpcl9rZXlfcG9sbChzdHJ1Y3QgSVIgKmlyKQoreworCXN0YXRpYyB1MzIgaXJfa2V5LCBpcl9yYXc7CisJaW50IHJjOworCisJZHByaW50aygyLCJpcl9wb2xsX2tleVxuIik7CisJcmMgPSBpci0+Z2V0X2tleShpciwgJmlyX2tleSwgJmlyX3Jhdyk7CisJaWYgKHJjIDwgMCkgeworCQlkcHJpbnRrKDIsImVycm9yXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgwID09IHJjKSB7CisJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJfSBlbHNlIHsKKwkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCZpci0+aXIsIGlyX2tleSwgaXJfcmF3KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlyX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gKHN0cnVjdCBJUiopZGF0YTsKKwlzY2hlZHVsZV93b3JrKCZpci0+d29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGlyX3dvcmsodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gZGF0YTsKKwlpcl9rZXlfcG9sbChpcik7CisJbW9kX3RpbWVyKCZpci0+dGltZXIsIGppZmZpZXMrSFovMTApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGlyX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgaW50IGtpbmQpOworc3RhdGljIGludCBpcl9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGlyX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJpciByZW1vdGUga2JkIGRyaXZlciIsCisgICAgICAgIC5pZCAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9FWFAzLCAvKiBGSVhNRSAqLworICAgICAgICAuZmxhZ3MgICAgICAgICAgPSBJMkNfREZfTk9USUZZLAorICAgICAgICAuYXR0YWNoX2FkYXB0ZXIgPSBpcl9wcm9iZSwKKyAgICAgICAgLmRldGFjaF9jbGllbnQgID0gaXJfZGV0YWNoLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9Cit7CisgICAgICAgIEkyQ19ERVZOQU1FKCJ1bnNldCIpLAorICAgICAgICAuZHJpdmVyID0gJmRyaXZlcgorfTsKKworc3RhdGljIGludCBpcl9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwKKwkJICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgaW50IGtpbmQpCit7CisJSVJfS0VZVEFCX1RZUEUgKmlyX2NvZGVzID0gTlVMTDsKKwljaGFyICpuYW1lOworCWludCBpcl90eXBlOworICAgICAgICBzdHJ1Y3QgSVIgKmlyOworCisgICAgICAgIGlmIChOVUxMID09IChpciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBJUiksR0ZQX0tFUk5FTCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworCW1lbXNldChpciwwLHNpemVvZigqaXIpKTsKKwlpci0+YyA9IGNsaWVudF90ZW1wbGF0ZTsKKworCWkyY19zZXRfY2xpZW50ZGF0YSgmaXItPmMsIGlyKTsKKwlpci0+Yy5hZGFwdGVyID0gYWRhcDsKKwlpci0+Yy5hZGRyICAgID0gYWRkcjsKKworCXN3aXRjaChhZGRyKSB7CisJY2FzZSAweDY0OgorCQluYW1lICAgICAgICA9ICJQaXhlbHZpZXciOworCQlpci0+Z2V0X2tleSA9IGdldF9rZXlfcGl4ZWx2aWV3OworCQlpcl90eXBlICAgICA9IElSX1RZUEVfT1RIRVI7CisJCWlyX2NvZGVzICAgID0gaXJfY29kZXNfZW1wdHk7CisJCWJyZWFrOworCWNhc2UgMHg0YjoKKwkJbmFtZSAgICAgICAgPSAiUFY5NTEiOworCQlpci0+Z2V0X2tleSA9IGdldF9rZXlfcHY5NTE7CisJCWlyX3R5cGUgICAgID0gSVJfVFlQRV9PVEhFUjsKKwkJaXJfY29kZXMgICAgPSBpcl9jb2Rlc19wdjk1MTsKKwkJYnJlYWs7CisJY2FzZSAweDE4OgorCWNhc2UgMHgxYToKKwkJbmFtZSAgICAgICAgPSAiSGF1cHBhdWdlIjsKKwkJaXItPmdldF9rZXkgPSBnZXRfa2V5X2hhdXA7CisJCWlyX3R5cGUgICAgID0gSVJfVFlQRV9SQzU7CisJCWlyX2NvZGVzICAgID0gaXJfY29kZXNfcmM1X3R2OworCQlicmVhazsKKwljYXNlIDB4MzA6CisJCW5hbWUgICAgICAgID0gIktOQyBPbmUiOworCQlpci0+Z2V0X2tleSA9IGdldF9rZXlfa25jMTsKKwkJaXJfdHlwZSAgICAgPSBJUl9UWVBFX09USEVSOworCQlpcl9jb2RlcyAgICA9IGlyX2NvZGVzX2VtcHR5OworCQlicmVhazsKKwljYXNlIDB4N2E6CisJCW5hbWUgICAgICAgID0gIlB1cnBsZSBUViI7CisJCWlyLT5nZXRfa2V5ID0gZ2V0X2tleV9wdXJwbGV0djsKKwkJaXJfdHlwZSAgICAgPSBJUl9UWVBFX09USEVSOworCQlpcl9jb2RlcyAgICA9IGlyX2NvZGVzX3B1cnBsZXR2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCisJCXByaW50ayhERVZOQU1FICI6IEh1aD8gdW5rbm93biBpMmMgYWRkcmVzcyAoMHglMDJ4KT9cbiIsYWRkcik7CisJCWtmcmVlKGlyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHJlZ2lzdGVyIGkyYyBkZXZpY2UgKi8KKwlpMmNfYXR0YWNoX2NsaWVudCgmaXItPmMpOworCXNucHJpbnRmKGlyLT5jLm5hbWUsIHNpemVvZihpci0+Yy5uYW1lKSwgImkyYyBJUiAoJXMpIiwgbmFtZSk7CisJc25wcmludGYoaXItPnBoeXMsIHNpemVvZihpci0+cGh5cyksICIlcy8lcy9pcjAiLAorCQkgaXItPmMuYWRhcHRlci0+ZGV2LmJ1c19pZCwKKwkJIGlyLT5jLmRldi5idXNfaWQpOworCisJLyogaW5pdCArIHJlZ2lzdGVyIGlucHV0IGRldmljZSAqLworCWlyX2lucHV0X2luaXQoJmlyLT5pbnB1dCwmaXItPmlyLGlyX3R5cGUsaXJfY29kZXMpOworCWlyLT5pbnB1dC5pZC5idXN0eXBlID0gQlVTX0kyQzsKKwlpci0+aW5wdXQubmFtZSAgICAgICA9IGlyLT5jLm5hbWU7CisJaXItPmlucHV0LnBoeXMgICAgICAgPSBpci0+cGh5czsKKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJmlyLT5pbnB1dCk7CisJcHJpbnRrKERFVk5BTUUgIjogJXMgZGV0ZWN0ZWQgYXQgJXMgWyVzXVxuIiwKKwkgICAgICAgaXItPmlucHV0Lm5hbWUsaXItPmlucHV0LnBoeXMsYWRhcC0+bmFtZSk7CisKKwkvKiBzdGFydCBwb2xsaW5nIHZpYSBldmVudGQgKi8KKwlJTklUX1dPUksoJmlyLT53b3JrLCBpcl93b3JrLCBpcik7CisJaW5pdF90aW1lcigmaXItPnRpbWVyKTsKKwlpci0+dGltZXIuZnVuY3Rpb24gPSBpcl90aW1lcjsKKwlpci0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylpcjsKKwlzY2hlZHVsZV93b3JrKCZpci0+d29yayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcl9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKyAgICAgICAgc3RydWN0IElSICppciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJLyoga2lsbCBvdXRzdGFuZGluZyBwb2xscyAqLworCWRlbF90aW1lcigmaXItPnRpbWVyKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJLyogdW5yZWdpc3RlciBkZXZpY2VzICovCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJmlyLT5pbnB1dCk7CisJaTJjX2RldGFjaF9jbGllbnQoJmlyLT5jKTsKKworCS8qIGZyZWUgbWVtb3J5ICovCisJa2ZyZWUoaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlyX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKworCS8qIFRoZSBleHRlcm5hbCBJUiByZWNlaXZlciBpcyBhdCBpMmMgYWRkcmVzcyAweDM0ICgweDM1IGZvcgorCSAgIHJlYWRzKS4gIEZ1dHVyZSBIYXVwcGF1Z2UgY2FyZHMgd2lsbCBoYXZlIGFuIGludGVybmFsCisJICAgcmVjZWl2ZXIgYXQgMHgzMCAoMHgzMSBmb3IgcmVhZHMpLiAgSW4gdGhlb3J5LCBib3RoIGNhbiBiZQorCSAgIGZpdHRlZCwgYW5kIEhhdXBwYXVnZSBzdWdnZXN0IGFuIGV4dGVybmFsIG92ZXJyaWRlcyBhbgorCSAgIGludGVybmFsLgorCisJICAgVGhhdCdzIHdoeSB3ZSBwcm9iZSAweDFhICh+MHgzNCkgZmlyc3QuIENCCisJKi8KKworCXN0YXRpYyBjb25zdCBpbnQgcHJvYmVfYnR0dltdID0geyAweDFhLCAweDE4LCAweDRiLCAweDY0LCAweDMwLCAtMX07CisJc3RhdGljIGNvbnN0IGludCBwcm9iZV9zYWE3MTM0W10gPSB7IDB4N2EsIC0xIH07CisJY29uc3QgaW50ICpwcm9iZSA9IE5VTEw7CisJc3RydWN0IGkyY19jbGllbnQgYzsgY2hhciBidWY7IGludCBpLHJjOworCisJc3dpdGNoIChhZGFwLT5pZCkgeworCWNhc2UgSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfQlQ4NDg6CisJCXByb2JlID0gcHJvYmVfYnR0djsKKwkJYnJlYWs7CisJY2FzZSBJMkNfQUxHT19TQUE3MTM0OgorCQlwcm9iZSA9IHByb2JlX3NhYTcxMzQ7CisJCWJyZWFrOworCX0KKwlpZiAoTlVMTCA9PSBwcm9iZSkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoJmMsMCxzaXplb2YoYykpOworCWMuYWRhcHRlciA9IGFkYXA7CisJZm9yIChpID0gMDsgLTEgIT0gcHJvYmVbaV07IGkrKykgeworCQljLmFkZHIgPSBwcm9iZVtpXTsKKwkJcmMgPSBpMmNfbWFzdGVyX3JlY3YoJmMsJmJ1ZiwxKTsKKwkJZHByaW50aygxLCJwcm9iZSAweCUwMnggQCAlczogJXNcbiIsCisJCQlwcm9iZVtpXSwgYWRhcC0+bmFtZSwKKwkJCSgxID09IHJjKSA/ICJ5ZXMiIDogIm5vIik7CisJCWlmICgxID09IHJjKSB7CisJCQlpcl9hdHRhY2goYWRhcCxwcm9iZVtpXSwwLDApOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK01PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIsIE1pY2hhbCBLb2NoYW5vd2ljeiwgQ2hyaXN0b3BoIEJhcnRlbG11cywgVWxyaWNoIE11ZWxsZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiaW5wdXQgZHJpdmVyIGZvciBpMmMgSVIgcmVtb3RlIGNvbnRyb2xzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IGlyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcl9maW5pKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGlyX2luaXQpOworbW9kdWxlX2V4aXQoaXJfZmluaSk7CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tZXllLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTcyYzJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tZXllLmMKQEAgLTAsMCArMSwyMDQxIEBACisvKgorICogTW90aW9uIEV5ZSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIFNvbnkgVmFpbyBQaWN0dXJlQm9vaworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgQWxj9HZlIDx3d3cuYWxjb3ZlLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CisgKgorICogRWFybGllciB3b3JrIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgUGF1bCBgUnVzdHknIFJ1c3NlbGwgYW5kIFBhdWwgTWFja2VycmFzLgorICoKKyAqIFNvbWUgcGFydHMgYm9ycm93ZWQgZnJvbSB2YXJpb3VzIHZpZGVvNGxpbnV4IGRyaXZlcnMsIGVzcGVjaWFsbHkKKyAqIGJ0dHYtZHJpdmVyLmMgYW5kIHpvcmFuLmMsIHNlZSBvcmlnaW5hbCBmaWxlcyBmb3IgY3JlZGl0cy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgIm1leWUuaCIKKyNpbmNsdWRlIDxsaW51eC9tZXllLmg+CisKK01PRFVMRV9BVVRIT1IoIlN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInY0bC92NGwyIGRyaXZlciBmb3IgdGhlIE1vdGlvbkV5ZSBjYW1lcmEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKE1FWUVfRFJJVkVSX1ZFUlNJT04pOworCisvKiBmb3JjZSB1c2FnZSBvZiBWNEwxIEFQSSAqLworc3RhdGljIGludCBmb3JjZXY0bDE7IC8qID0gMCAqLworbW9kdWxlX3BhcmFtKGZvcmNldjRsMSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2V2NGwxLCAiZm9yY2UgdXNlIG9mIFY0TDEgaW5zdGVhZCBvZiBWNEwyIik7CisKKy8qIG51bWJlciBvZiBncmFiIGJ1ZmZlcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2J1ZmZlcnMgPSAyOworbW9kdWxlX3BhcmFtKGdidWZmZXJzLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhnYnVmZmVycywgIm51bWJlciBvZiBjYXB0dXJlIGJ1ZmZlcnMsIGRlZmF1bHQgaXMgMiAoMzIgbWF4KSIpOworCisvKiBzaXplIG9mIGEgZ3JhYiBidWZmZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2J1ZnNpemUgPSBNRVlFX01BWF9CVUZTSVpFOworbW9kdWxlX3BhcmFtKGdidWZzaXplLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhnYnVmc2l6ZSwgInNpemUgb2YgdGhlIGNhcHR1cmUgYnVmZmVycywgZGVmYXVsdCBpcyA2MTQ0MDAiCisJCSAiICh3aWxsIGJlIHJvdW5kZWQgdXAgdG8gYSBwYWdlIG11bHRpcGxlKSIpOworCisvKiAvZGV2L3ZpZGVvWCByZWdpc3RyYXRpb24gbnVtYmVyICovCitzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7Cittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLCAidmlkZW8gZGV2aWNlIHRvIHJlZ2lzdGVyICgwPS9kZXYvdmlkZW8wLCBldGMpIik7CisKKy8qIGRyaXZlciBzdHJ1Y3R1cmUgLSBvbmx5IG9uZSBwb3NzaWJsZSAqLworc3RhdGljIHN0cnVjdCBtZXllIG1leWU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgKHN0b2xlbiBmcm9tIGJ0dHYtZHJpdmVyLmMpICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkICpydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqbWVtOworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJbWVtID0gdm1hbGxvY18zMihzaXplKTsKKwlpZiAobWVtKSB7CisJCW1lbXNldChtZW0sIDAsIHNpemUpOworCQlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCQl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJCVNldFBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJCWFkciArPSBQQUdFX1NJWkU7CisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJfQorCX0KKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZCBydmZyZWUodm9pZCAqIG1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJaWYgKG1lbSkgeworCQlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCQl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKSB7CisJCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJCWFkciArPSBQQUdFX1NJWkU7CisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJfQorCQl2ZnJlZShtZW0pOworCX0KK30KKworLyoKKyAqIHJldHVybiBhIHBhZ2UgdGFibGUgcG9pbnRpbmcgdG8gTiBwYWdlcyBvZiBsb2NrZWQgbWVtb3J5CisgKgorICogTk9URTogVGhlIG1leWUgZGV2aWNlIGV4cGVjdHMgRE1BIGFkZHJlc3NlcyBvbiAzMiBiaXRzLCB3ZSBidWlsZAorICogYSB0YWJsZSBvZiAxMDI0IGVudHJpZXMgPSA0IGJ5dGVzICogMTAyNCA9IDQwOTYgYnl0ZXMuCisgKi8KK3N0YXRpYyBpbnQgcHRhYmxlX2FsbG9jKHZvaWQpCit7CisJdTMyICpwdDsKKwlpbnQgaTsKKworCW1lbXNldChtZXllLm1jaGlwX3B0YWJsZSwgMCwgc2l6ZW9mKG1leWUubWNoaXBfcHRhYmxlKSk7CisKKwkvKiBnaXZlIG9ubHkgMzIgYml0IERNQSBhZGRyZXNzZXMgKi8KKwlpZiAoZG1hX3NldF9tYXNrKCZtZXllLm1jaGlwX2Rldi0+ZGV2LCAweGZmZmZmZmZmKSkKKwkJcmV0dXJuIC0xOworCisJbWV5ZS5tY2hpcF9wdGFibGVfdG9jID0gZG1hX2FsbG9jX2NvaGVyZW50KCZtZXllLm1jaGlwX2Rldi0+ZGV2LAorCQkJCQkJICAgUEFHRV9TSVpFLAorCQkJCQkJICAgJm1leWUubWNoaXBfZG1haGFuZGxlLAorCQkJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZXllLm1jaGlwX3B0YWJsZV90b2MpIHsKKwkJbWV5ZS5tY2hpcF9kbWFoYW5kbGUgPSAwOworCQlyZXR1cm4gLTE7CisJfQorCisJcHQgPSBtZXllLm1jaGlwX3B0YWJsZV90b2M7CisJZm9yIChpID0gMDsgaSA8IE1DSElQX05CX1BBR0VTOyBpKyspIHsKKwkJZG1hX2FkZHJfdCBkbWE7CisJCW1leWUubWNoaXBfcHRhYmxlW2ldID0gZG1hX2FsbG9jX2NvaGVyZW50KCZtZXllLm1jaGlwX2Rldi0+ZGV2LAorCQkJCQkJCSAgUEFHRV9TSVpFLAorCQkJCQkJCSAgJmRtYSwKKwkJCQkJCQkgIEdGUF9LRVJORUwpOworCQlpZiAoIW1leWUubWNoaXBfcHRhYmxlW2ldKSB7CisJCQlpbnQgajsKKwkJCXB0ID0gbWV5ZS5tY2hpcF9wdGFibGVfdG9jOworCQkJZm9yIChqID0gMDsgaiA8IGk7ICsraikgeworCQkJCWRtYSA9IChkbWFfYWRkcl90KSAqcHQ7CisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoJm1leWUubWNoaXBfZGV2LT5kZXYsCisJCQkJCQkgIFBBR0VfU0laRSwKKwkJCQkJCSAgbWV5ZS5tY2hpcF9wdGFibGVbal0sIGRtYSk7CisJCQkJcHQrKzsKKwkJCX0KKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZtZXllLm1jaGlwX2Rldi0+ZGV2LAorCQkJCQkgIFBBR0VfU0laRSwKKwkJCQkJICBtZXllLm1jaGlwX3B0YWJsZV90b2MsCisJCQkJCSAgbWV5ZS5tY2hpcF9kbWFoYW5kbGUpOworCQkJbWV5ZS5tY2hpcF9wdGFibGVfdG9jID0gTlVMTDsKKwkJCW1leWUubWNoaXBfZG1haGFuZGxlID0gMDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkqcHQgPSAodTMyKSBkbWE7CisJCXB0Kys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdGFibGVfZnJlZSh2b2lkKQoreworCXUzMiAqcHQ7CisJaW50IGk7CisKKwlwdCA9IG1leWUubWNoaXBfcHRhYmxlX3RvYzsKKwlmb3IgKGkgPSAwOyBpIDwgTUNISVBfTkJfUEFHRVM7IGkrKykgeworCQlkbWFfYWRkcl90IGRtYSA9IChkbWFfYWRkcl90KSAqcHQ7CisJCWlmIChtZXllLm1jaGlwX3B0YWJsZVtpXSkKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZtZXllLm1jaGlwX2Rldi0+ZGV2LAorCQkJCQkgIFBBR0VfU0laRSwKKwkJCQkJICBtZXllLm1jaGlwX3B0YWJsZVtpXSwgZG1hKTsKKwkJcHQrKzsKKwl9CisKKwlpZiAobWV5ZS5tY2hpcF9wdGFibGVfdG9jKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmbWV5ZS5tY2hpcF9kZXYtPmRldiwKKwkJCQkgIFBBR0VfU0laRSwKKwkJCQkgIG1leWUubWNoaXBfcHRhYmxlX3RvYywKKwkJCQkgIG1leWUubWNoaXBfZG1haGFuZGxlKTsKKworCW1lbXNldChtZXllLm1jaGlwX3B0YWJsZSwgMCwgc2l6ZW9mKG1leWUubWNoaXBfcHRhYmxlKSk7CisJbWV5ZS5tY2hpcF9wdGFibGVfdG9jID0gTlVMTDsKKwltZXllLm1jaGlwX2RtYWhhbmRsZSA9IDA7Cit9CisKKy8qIGNvcHkgZGF0YSBmcm9tIHB0YWJsZSBpbnRvIGJ1ZiAqLworc3RhdGljIHZvaWQgcHRhYmxlX2NvcHkodTggKmJ1ZiwgaW50IHN0YXJ0LCBpbnQgc2l6ZSwgaW50IHB0X3BhZ2VzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IChzaXplIC8gUEFHRV9TSVpFKSAqIFBBR0VfU0laRTsgaSArPSBQQUdFX1NJWkUpIHsKKwkJbWVtY3B5KGJ1ZiArIGksIG1leWUubWNoaXBfcHRhYmxlW3N0YXJ0KytdLCBQQUdFX1NJWkUpOworCQlpZiAoc3RhcnQgPj0gcHRfcGFnZXMpCisJCQlzdGFydCA9IDA7CisJfQorCW1lbWNweShidWYgKyBpLCBtZXllLm1jaGlwX3B0YWJsZVtzdGFydF0sIHNpemUgJSBQQUdFX1NJWkUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEpQRUcgdGFibGVzIGF0IGRpZmZlcmVudCBxdWFsaXRpZXMgdG8gbG9hZCBpbnRvIHRoZSBWUkogY2hpcCAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHJldHVybiBhIHNldCBvZiBxdWFudGlzYXRpb24gdGFibGVzIGJhc2VkIG9uIGEgcXVhbGl0eSBmcm9tIDEgdG8gMTAgKi8KK3N0YXRpYyB1MTYgKmpwZWdfcXVhbnRpc2F0aW9uX3RhYmxlcyhpbnQgKmxlbmd0aCwgaW50IHF1YWxpdHkpCit7CisJc3RhdGljIHUxNiBqcGVnX3RhYmxlc1tdWzcwXSA9IHsgeworCQkweGRiZmYsIDB4NDMwMCwgMHhmZjAwLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwKKwkJMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsCisJCTB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLAorCQkweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwKKwkJMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwKKwkJMHhkYmZmLCAweDQzMDAsIDB4ZmYwMSwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsCisJCTB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLAorCQkweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwKKwkJMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsCisJCTB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsCisJfSwKKwl7CisJCTB4ZGJmZiwgMHg0MzAwLCAweDUwMDAsIDB4M2MzNywgMHgzYzQ2LCAweDUwMzIsIDB4NDE0NiwgMHg1YTQ2LAorCQkweDUwNTUsIDB4Nzg1ZiwgMHg4MmM4LCAweDZlNzgsIDB4Nzg2ZSwgMHhhZmY1LCAweDkxYjksIDB4ZmZjOCwKKwkJMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsCisJCTB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLAorCQkweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLAorCQkweGRiZmYsIDB4NDMwMCwgMHg1NTAxLCAweDVhNWEsIDB4Njk3OCwgMHhlYjc4LCAweDgyODIsIDB4ZmZlYiwKKwkJMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsCisJCTB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLAorCQkweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwKKwkJMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwKKwl9LAorCXsKKwkJMHhkYmZmLCAweDQzMDAsIDB4MjgwMCwgMHgxZTFjLCAweDFlMjMsIDB4MjgxOSwgMHgyMTIzLCAweDJkMjMsCisJCTB4MjgyYiwgMHgzYzMwLCAweDQxNjQsIDB4MzczYywgMHgzYzM3LCAweDU4N2IsIDB4NDk1ZCwgMHg5MTY0LAorCQkweDk5ODAsIDB4OGY5NiwgMHg4YzgwLCAweGEwOGEsIDB4ZTZiNCwgMHhhMGMzLCAweGRhYWEsIDB4OGFhZCwKKwkJMHhjODhjLCAweGNiZmYsIDB4ZWVkYSwgMHhmZmY1LCAweGZmZmYsIDB4YzE5YiwgMHhmZmZmLCAweGZhZmYsCisJCTB4ZTZmZiwgMHhmZmZkLCAweGZmZjgsCisJCTB4ZGJmZiwgMHg0MzAwLCAweDJiMDEsIDB4MmQyZCwgMHgzNTNjLCAweDc2M2MsIDB4NDE0MSwgMHhmODc2LAorCQkweDhjYTUsIDB4ZjhhNSwgMHhmOGY4LCAweGY4ZjgsIDB4ZjhmOCwgMHhmOGY4LCAweGY4ZjgsIDB4ZjhmOCwKKwkJMHhmOGY4LCAweGY4ZjgsIDB4ZjhmOCwgMHhmOGY4LCAweGY4ZjgsIDB4ZjhmOCwgMHhmOGY4LCAweGY4ZjgsCisJCTB4ZjhmOCwgMHhmOGY4LCAweGY4ZjgsIDB4ZjhmOCwgMHhmOGY4LCAweGY4ZjgsIDB4ZjhmOCwgMHhmOGY4LAorCQkweGY4ZjgsIDB4ZjhmOCwgMHhmZmY4LAorCX0sCisJeworCQkweGRiZmYsIDB4NDMwMCwgMHgxYjAwLCAweDE0MTIsIDB4MTQxNywgMHgxYjExLCAweDE2MTcsIDB4MWUxNywKKwkJMHgxYjFjLCAweDI4MjAsIDB4MmI0MiwgMHgyNTI4LCAweDI4MjUsIDB4M2E1MSwgMHgzMDNkLCAweDYwNDIsCisJCTB4NjU1NSwgMHg1ZjY0LCAweDVkNTUsIDB4NmE1YiwgMHg5OTc4LCAweDZhODEsIDB4OTA3MSwgMHg1YjczLAorCQkweDg1NWQsIDB4ODZiNSwgMHg5ZTkwLCAweGFiYTMsIDB4YWJhZCwgMHg4MDY3LCAweGM5YmMsIDB4YTZiYSwKKwkJMHg5OWM3LCAweGFiYTgsIDB4ZmZhNCwKKwkJMHhkYmZmLCAweDQzMDAsIDB4MWMwMSwgMHgxZTFlLCAweDIzMjgsIDB4NGUyOCwgMHgyYjJiLCAweGE0NGUsCisJCTB4NWQ2ZSwgMHhhNDZlLCAweGE0YTQsIDB4YTRhNCwgMHhhNGE0LCAweGE0YTQsIDB4YTRhNCwgMHhhNGE0LAorCQkweGE0YTQsIDB4YTRhNCwgMHhhNGE0LCAweGE0YTQsIDB4YTRhNCwgMHhhNGE0LCAweGE0YTQsIDB4YTRhNCwKKwkJMHhhNGE0LCAweGE0YTQsIDB4YTRhNCwgMHhhNGE0LCAweGE0YTQsIDB4YTRhNCwgMHhhNGE0LCAweGE0YTQsCisJCTB4YTRhNCwgMHhhNGE0LCAweGZmYTQsCisJfSwKKwl7CisJCTB4ZGJmZiwgMHg0MzAwLCAweDE0MDAsIDB4MGYwZSwgMHgwZjEyLCAweDE0MGQsIDB4MTAxMiwgMHgxNzEyLAorCQkweDE0MTUsIDB4MWUxOCwgMHgyMTMyLCAweDFjMWUsIDB4MWUxYywgMHgyYzNkLCAweDI0MmUsIDB4NDkzMiwKKwkJMHg0YzQwLCAweDQ3NGIsIDB4NDY0MCwgMHg1MDQ1LCAweDczNWEsIDB4NTA2MiwgMHg2ZDU1LCAweDQ1NTYsCisJCTB4NjQ0NiwgMHg2NTg4LCAweDc3NmQsIDB4ODE3YiwgMHg4MTgyLCAweDYwNGUsIDB4OTc4ZCwgMHg3ZDhjLAorCQkweDczOTYsIDB4ODE3ZSwgMHhmZjdjLAorCQkweGRiZmYsIDB4NDMwMCwgMHgxNTAxLCAweDE3MTcsIDB4MWExZSwgMHgzYjFlLCAweDIxMjEsIDB4N2MzYiwKKwkJMHg0NjUzLCAweDdjNTMsIDB4N2M3YywgMHg3YzdjLCAweDdjN2MsIDB4N2M3YywgMHg3YzdjLCAweDdjN2MsCisJCTB4N2M3YywgMHg3YzdjLCAweDdjN2MsIDB4N2M3YywgMHg3YzdjLCAweDdjN2MsIDB4N2M3YywgMHg3YzdjLAorCQkweDdjN2MsIDB4N2M3YywgMHg3YzdjLCAweDdjN2MsIDB4N2M3YywgMHg3YzdjLCAweDdjN2MsIDB4N2M3YywKKwkJMHg3YzdjLCAweDdjN2MsIDB4ZmY3YywKKwl9LAorCXsKKwkJMHhkYmZmLCAweDQzMDAsIDB4MTAwMCwgMHgwYzBiLCAweDBjMGUsIDB4MTAwYSwgMHgwZDBlLCAweDEyMGUsCisJCTB4MTAxMSwgMHgxODEzLCAweDFhMjgsIDB4MTYxOCwgMHgxODE2LCAweDIzMzEsIDB4MWQyNSwgMHgzYTI4LAorCQkweDNkMzMsIDB4MzkzYywgMHgzODMzLCAweDQwMzcsIDB4NWM0OCwgMHg0MDRlLCAweDU3NDQsIDB4Mzc0NSwKKwkJMHg1MDM4LCAweDUxNmQsIDB4NWY1NywgMHg2NzYyLCAweDY3NjgsIDB4NGQzZSwgMHg3OTcxLCAweDY0NzAsCisJCTB4NWM3OCwgMHg2NzY1LCAweGZmNjMsCisJCTB4ZGJmZiwgMHg0MzAwLCAweDExMDEsIDB4MTIxMiwgMHgxNTE4LCAweDJmMTgsIDB4MWExYSwgMHg2MzJmLAorCQkweDM4NDIsIDB4NjM0MiwgMHg2MzYzLCAweDYzNjMsIDB4NjM2MywgMHg2MzYzLCAweDYzNjMsIDB4NjM2MywKKwkJMHg2MzYzLCAweDYzNjMsIDB4NjM2MywgMHg2MzYzLCAweDYzNjMsIDB4NjM2MywgMHg2MzYzLCAweDYzNjMsCisJCTB4NjM2MywgMHg2MzYzLCAweDYzNjMsIDB4NjM2MywgMHg2MzYzLCAweDYzNjMsIDB4NjM2MywgMHg2MzYzLAorCQkweDYzNjMsIDB4NjM2MywgMHhmZjYzLAorCX0sCisJeworCQkweGRiZmYsIDB4NDMwMCwgMHgwZDAwLCAweDBhMDksIDB4MGEwYiwgMHgwZDA4LCAweDBhMGIsIDB4MGUwYiwKKwkJMHgwZDBlLCAweDEzMGYsIDB4MTUyMCwgMHgxMjEzLCAweDEzMTIsIDB4MWMyNywgMHgxNzFlLCAweDJlMjAsCisJCTB4MzEyOSwgMHgyZTMwLCAweDJkMjksIDB4MzMyYywgMHg0YTNhLCAweDMzM2UsIDB4NDYzNiwgMHgyYzM3LAorCQkweDQwMmQsIDB4NDE1NywgMHg0YzQ2LCAweDUyNGUsIDB4NTI1MywgMHgzZTMyLCAweDYxNWEsIDB4NTA1YSwKKwkJMHg0YTYwLCAweDUyNTEsIDB4ZmY0ZiwKKwkJMHhkYmZmLCAweDQzMDAsIDB4MGUwMSwgMHgwZTBlLCAweDExMTMsIDB4MjYxMywgMHgxNTE1LCAweDRmMjYsCisJCTB4MmQzNSwgMHg0ZjM1LCAweDRmNGYsIDB4NGY0ZiwgMHg0ZjRmLCAweDRmNGYsIDB4NGY0ZiwgMHg0ZjRmLAorCQkweDRmNGYsIDB4NGY0ZiwgMHg0ZjRmLCAweDRmNGYsIDB4NGY0ZiwgMHg0ZjRmLCAweDRmNGYsIDB4NGY0ZiwKKwkJMHg0ZjRmLCAweDRmNGYsIDB4NGY0ZiwgMHg0ZjRmLCAweDRmNGYsIDB4NGY0ZiwgMHg0ZjRmLCAweDRmNGYsCisJCTB4NGY0ZiwgMHg0ZjRmLCAweGZmNGYsCisJfSwKKwl7CisJCTB4ZGJmZiwgMHg0MzAwLCAweDBhMDAsIDB4MDcwNywgMHgwNzA4LCAweDBhMDYsIDB4MDgwOCwgMHgwYjA4LAorCQkweDBhMGEsIDB4MGUwYiwgMHgxMDE4LCAweDBkMGUsIDB4MGUwZCwgMHgxNTFkLCAweDExMTYsIDB4MjMxOCwKKwkJMHgyNTFmLCAweDIyMjQsIDB4MjIxZiwgMHgyNjIxLCAweDM3MmIsIDB4MjYyZiwgMHgzNDI5LCAweDIxMjksCisJCTB4MzAyMiwgMHgzMTQxLCAweDM5MzQsIDB4M2UzYiwgMHgzZTNlLCAweDJlMjUsIDB4NDk0NCwgMHgzYzQzLAorCQkweDM3NDgsIDB4M2UzZCwgMHhmZjNiLAorCQkweGRiZmYsIDB4NDMwMCwgMHgwYTAxLCAweDBiMGIsIDB4MGQwZSwgMHgxYzBlLCAweDEwMTAsIDB4M2IxYywKKwkJMHgyMjI4LCAweDNiMjgsIDB4M2IzYiwgMHgzYjNiLCAweDNiM2IsIDB4M2IzYiwgMHgzYjNiLCAweDNiM2IsCisJCTB4M2IzYiwgMHgzYjNiLCAweDNiM2IsIDB4M2IzYiwgMHgzYjNiLCAweDNiM2IsIDB4M2IzYiwgMHgzYjNiLAorCQkweDNiM2IsIDB4M2IzYiwgMHgzYjNiLCAweDNiM2IsIDB4M2IzYiwgMHgzYjNiLCAweDNiM2IsIDB4M2IzYiwKKwkJMHgzYjNiLCAweDNiM2IsIDB4ZmYzYiwKKwl9LAorCXsKKwkJMHhkYmZmLCAweDQzMDAsIDB4MDYwMCwgMHgwNTA0LCAweDA1MDYsIDB4MDYwNCwgMHgwNTA2LCAweDA3MDYsCisJCTB4MDYwNywgMHgwYTA4LCAweDBhMTAsIDB4MDkwYSwgMHgwYTA5LCAweDBlMTQsIDB4MGMwZiwgMHgxNzEwLAorCQkweDE4MTQsIDB4MTcxOCwgMHgxNjE0LCAweDFhMTYsIDB4MjUxZCwgMHgxYTFmLCAweDIzMWIsIDB4MTYxYywKKwkJMHgyMDE2LCAweDIwMmMsIDB4MjYyMywgMHgyOTI3LCAweDI5MmEsIDB4MWYxOSwgMHgzMDJkLCAweDI4MmQsCisJCTB4MjUzMCwgMHgyOTI4LCAweGZmMjgsCisJCTB4ZGJmZiwgMHg0MzAwLCAweDA3MDEsIDB4MDcwNywgMHgwODBhLCAweDEzMGEsIDB4MGEwYSwgMHgyODEzLAorCQkweDE2MWEsIDB4MjgxYSwgMHgyODI4LCAweDI4MjgsIDB4MjgyOCwgMHgyODI4LCAweDI4MjgsIDB4MjgyOCwKKwkJMHgyODI4LCAweDI4MjgsIDB4MjgyOCwgMHgyODI4LCAweDI4MjgsIDB4MjgyOCwgMHgyODI4LCAweDI4MjgsCisJCTB4MjgyOCwgMHgyODI4LCAweDI4MjgsIDB4MjgyOCwgMHgyODI4LCAweDI4MjgsIDB4MjgyOCwgMHgyODI4LAorCQkweDI4MjgsIDB4MjgyOCwgMHhmZjI4LAorCX0sCisJeworCQkweGRiZmYsIDB4NDMwMCwgMHgwMzAwLCAweDAyMDIsIDB4MDIwMywgMHgwMzAyLCAweDAzMDMsIDB4MDQwMywKKwkJMHgwMzAzLCAweDA1MDQsIDB4MDUwOCwgMHgwNDA1LCAweDA1MDQsIDB4MDcwYSwgMHgwNjA3LCAweDBjMDgsCisJCTB4MGMwYSwgMHgwYjBjLCAweDBiMGEsIDB4MGQwYiwgMHgxMjBlLCAweDBkMTAsIDB4MTEwZSwgMHgwYjBlLAorCQkweDEwMGIsIDB4MTAxNiwgMHgxMzExLCAweDE1MTQsIDB4MTUxNSwgMHgwZjBjLCAweDE4MTcsIDB4MTQxNiwKKwkJMHgxMjE4LCAweDE1MTQsIDB4ZmYxNCwKKwkJMHhkYmZmLCAweDQzMDAsIDB4MDMwMSwgMHgwNDA0LCAweDA0MDUsIDB4MDkwNSwgMHgwNTA1LCAweDE0MDksCisJCTB4MGIwZCwgMHgxNDBkLCAweDE0MTQsIDB4MTQxNCwgMHgxNDE0LCAweDE0MTQsIDB4MTQxNCwgMHgxNDE0LAorCQkweDE0MTQsIDB4MTQxNCwgMHgxNDE0LCAweDE0MTQsIDB4MTQxNCwgMHgxNDE0LCAweDE0MTQsIDB4MTQxNCwKKwkJMHgxNDE0LCAweDE0MTQsIDB4MTQxNCwgMHgxNDE0LCAweDE0MTQsIDB4MTQxNCwgMHgxNDE0LCAweDE0MTQsCisJCTB4MTQxNCwgMHgxNDE0LCAweGZmMTQsCisJfSwKKwl7CisJCTB4ZGJmZiwgMHg0MzAwLCAweDAxMDAsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLAorCQkweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwKKwkJMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsCisJCTB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLAorCQkweDAxMDEsIDB4MDEwMSwgMHhmZjAxLAorCQkweGRiZmYsIDB4NDMwMCwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwKKwkJMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsCisJCTB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLAorCQkweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDEwMSwKKwkJMHgwMTAxLCAweDAxMDEsIDB4ZmYwMSwKKwl9IH07CisKKwlpZiAocXVhbGl0eSA8IDAgfHwgcXVhbGl0eSA+IDEwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJtZXllOiBpbnZhbGlkIHF1YWxpdHkgbGV2ZWwgJWQgLSB1c2luZyA4XG4iLCBxdWFsaXR5KTsKKwkJcXVhbGl0eSA9IDg7CisJfQorCisJKmxlbmd0aCA9IEFSUkFZX1NJWkUoanBlZ190YWJsZXNbcXVhbGl0eV0pOworCXJldHVybiBqcGVnX3RhYmxlc1txdWFsaXR5XTsKK30KKworLyogcmV0dXJuIGEgZ2VuZXJpYyBzZXQgb2YgaHVmZm1hbiB0YWJsZXMgKi8KK3N0YXRpYyB1MTYgKmpwZWdfaHVmZm1hbl90YWJsZXMoaW50ICpsZW5ndGgpCit7CisJc3RhdGljIHUxNiB0YWJsZXNbXSA9IHsKKwkJMHhDNEZGLCAweEI1MDAsIDB4MDAxMCwgMHgwMTAyLCAweDAzMDMsIDB4MDQwMiwgMHgwNTAzLCAweDA0MDUsCisJCTB4MDAwNCwgMHgwMTAwLCAweDAxN0QsIDB4MDMwMiwgMHgwNDAwLCAweDA1MTEsIDB4MjExMiwgMHg0MTMxLAorCQkweDEzMDYsIDB4NjE1MSwgMHgyMjA3LCAweDE0NzEsIDB4ODEzMiwgMHhBMTkxLCAweDIzMDgsIDB4QjE0MiwKKwkJMHgxNUMxLCAweEQxNTIsIDB4MjRGMCwgMHg2MjMzLCAweDgyNzIsIDB4MEEwOSwgMHgxNzE2LCAweDE5MTgsCisJCTB4MjUxQSwgMHgyNzI2LCAweDI5MjgsIDB4MzQyQSwgMHgzNjM1LCAweDM4MzcsIDB4M0EzOSwgMHg0NDQzLAorCQkweDQ2NDUsIDB4NDg0NywgMHg0QTQ5LCAweDU0NTMsIDB4NTY1NSwgMHg1ODU3LCAweDVBNTksIDB4NjQ2MywKKwkJMHg2NjY1LCAweDY4NjcsIDB4NkE2OSwgMHg3NDczLCAweDc2NzUsIDB4Nzg3NywgMHg3QTc5LCAweDg0ODMsCisJCTB4ODY4NSwgMHg4ODg3LCAweDhBODksIDB4OTM5MiwgMHg5NTk0LCAweDk3OTYsIDB4OTk5OCwgMHhBMjlBLAorCQkweEE0QTMsIDB4QTZBNSwgMHhBOEE3LCAweEFBQTksIDB4QjNCMiwgMHhCNUI0LCAweEI3QjYsIDB4QjlCOCwKKwkJMHhDMkJBLCAweEM0QzMsIDB4QzZDNSwgMHhDOEM3LCAweENBQzksIDB4RDNEMiwgMHhENUQ0LCAweEQ3RDYsCisJCTB4RDlEOCwgMHhFMURBLCAweEUzRTIsIDB4RTVFNCwgMHhFN0U2LCAweEU5RTgsIDB4RjFFQSwgMHhGM0YyLAorCQkweEY1RjQsIDB4RjdGNiwgMHhGOUY4LCAweEZGRkEsCisJCTB4QzRGRiwgMHhCNTAwLCAweDAwMTEsIDB4MDEwMiwgMHgwNDAyLCAweDAzMDQsIDB4MDcwNCwgMHgwNDA1LAorCQkweDAwMDQsIDB4MDIwMSwgMHgwMDc3LCAweDAyMDEsIDB4MTEwMywgMHgwNTA0LCAweDMxMjEsIDB4MTIwNiwKKwkJMHg1MTQxLCAweDYxMDcsIDB4MTM3MSwgMHgzMjIyLCAweDA4ODEsIDB4NDIxNCwgMHhBMTkxLCAweEMxQjEsCisJCTB4MjMwOSwgMHg1MjMzLCAweDE1RjAsIDB4NzI2MiwgMHgwQUQxLCAweDI0MTYsIDB4RTEzNCwgMHhGMTI1LAorCQkweDE4MTcsIDB4MUExOSwgMHgyNzI2LCAweDI5MjgsIDB4MzUyQSwgMHgzNzM2LCAweDM5MzgsIDB4NDMzQSwKKwkJMHg0NTQ0LCAweDQ3NDYsIDB4NDk0OCwgMHg1MzRBLCAweDU1NTQsIDB4NTc1NiwgMHg1OTU4LCAweDYzNUEsCisJCTB4NjU2NCwgMHg2NzY2LCAweDY5NjgsIDB4NzM2QSwgMHg3NTc0LCAweDc3NzYsIDB4Nzk3OCwgMHg4MjdBLAorCQkweDg0ODMsIDB4ODY4NSwgMHg4ODg3LCAweDhBODksIDB4OTM5MiwgMHg5NTk0LCAweDk3OTYsIDB4OTk5OCwKKwkJMHhBMjlBLCAweEE0QTMsIDB4QTZBNSwgMHhBOEE3LCAweEFBQTksIDB4QjNCMiwgMHhCNUI0LCAweEI3QjYsCisJCTB4QjlCOCwgMHhDMkJBLCAweEM0QzMsIDB4QzZDNSwgMHhDOEM3LCAweENBQzksIDB4RDNEMiwgMHhENUQ0LAorCQkweEQ3RDYsIDB4RDlEOCwgMHhFMkRBLCAweEU0RTMsIDB4RTZFNSwgMHhFOEU3LCAweEVBRTksIDB4RjNGMiwKKwkJMHhGNUY0LCAweEY3RjYsIDB4RjlGOCwgMHhGRkZBLAorCQkweEM0RkYsIDB4MUYwMCwgMHgwMDAwLCAweDA1MDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsIDB4MDAwMCwKKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMjAxLCAweDA0MDMsIDB4MDYwNSwgMHgwODA3LCAweDBBMDksCisJCTB4RkYwQiwKKwkJMHhDNEZGLCAweDFGMDAsIDB4MDAwMSwgMHgwMTAzLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAweDAxMDEsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDIwMSwgMHgwNDAzLCAweDA2MDUsIDB4MDgwNywgMHgwQTA5LAorCQkweEZGMEIKKwl9OworCisJKmxlbmd0aCA9IEFSUkFZX1NJWkUodGFibGVzKTsKKwlyZXR1cm4gdGFibGVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1DSElQIGxvdy1sZXZlbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHJldHVybnMgdGhlIGhvcml6b250YWwgY2FwdHVyZSBzaXplICovCitzdGF0aWMgaW5saW5lIGludCBtY2hpcF9oc2l6ZSh2b2lkKQoreworCXJldHVybiBtZXllLnBhcmFtcy5zdWJzYW1wbGUgPyAzMjAgOiA2NDA7Cit9CisKKy8qIHJldHVybnMgdGhlIHZlcnRpY2FsIGNhcHR1cmUgc2l6ZSAqLworc3RhdGljIGlubGluZSBpbnQgbWNoaXBfdnNpemUodm9pZCkKK3sKKwlyZXR1cm4gbWV5ZS5wYXJhbXMuc3Vic2FtcGxlID8gMjQwIDogNDgwOworfQorCisvKiB3YWl0cyBmb3IgYSByZWdpc3RlciB0byBiZSBhdmFpbGFibGUgKi8KK3N0YXRpYyB2b2lkIG1jaGlwX3N5bmMoaW50IHJlZykKK3sKKwl1MzIgc3RhdHVzOworCWludCBpOworCisJaWYgKHJlZyA9PSBNQ0hJUF9NTV9GSUZPX0RBVEEpIHsKKwkJZm9yIChpID0gMDsgaSA8IE1DSElQX1JFR19USU1FT1VUOyBpKyspIHsKKwkJCXN0YXR1cyA9IHJlYWRsKG1leWUubWNoaXBfbW1yZWdzICsKKwkJCQkgICAgICAgTUNISVBfTU1fRklGT19TVEFUVVMpOworCQkJaWYgKCEoc3RhdHVzICYgTUNISVBfTU1fRklGT19XQUlUKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1leWU6IGZpZm8gbm90IHJlYWR5XG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoc3RhdHVzICYgTUNISVBfTU1fRklGT19SRUFEWSkKKwkJCQlyZXR1cm47CisJCQl1ZGVsYXkoMSk7CisJCX0KKwl9IGVsc2UgaWYgKHJlZyA+IDB4ODApIHsKKwkJdTMyIG1hc2sgPSAocmVnIDwgMHgxMDApID8gTUNISVBfSElDX1NUQVRVU19NQ0NfUkRZCisJCQkJCSA6IE1DSElQX0hJQ19TVEFUVVNfVlJKX1JEWTsKKwkJZm9yIChpID0gMDsgaSA8IE1DSElQX1JFR19USU1FT1VUOyBpKyspIHsKKwkJCXN0YXR1cyA9IHJlYWRsKG1leWUubWNoaXBfbW1yZWdzICsgTUNISVBfSElDX1NUQVRVUyk7CisJCQlpZiAoc3RhdHVzICYgbWFzaykKKwkJCQlyZXR1cm47CisJCQl1ZGVsYXkoMSk7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuOworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIm1leWU6IG1jaGlwX3N5bmMoKSB0aW1lb3V0IG9uIHJlZyAweCV4IHN0YXR1cz0weCV4XG4iLAorCSAgICAgICByZWcsIHN0YXR1cyk7Cit9CisKKy8qIHNldHMgYSB2YWx1ZSBpbnRvIHRoZSByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB2b2lkIG1jaGlwX3NldChpbnQgcmVnLCB1MzIgdikKK3sKKwltY2hpcF9zeW5jKHJlZyk7CisJd3JpdGVsKHYsIG1leWUubWNoaXBfbW1yZWdzICsgcmVnKTsKK30KKworLyogZ2V0IHRoZSByZWdpc3RlciB2YWx1ZSAqLworc3RhdGljIGlubGluZSB1MzIgbWNoaXBfcmVhZChpbnQgcmVnKQoreworCW1jaGlwX3N5bmMocmVnKTsKKwlyZXR1cm4gcmVhZGwobWV5ZS5tY2hpcF9tbXJlZ3MgKyByZWcpOworfQorCisvKiB3YWl0IGZvciBhIHJlZ2lzdGVyIHRvIGJlY29tZSBhIHBhcnRpY3VsYXIgdmFsdWUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG1jaGlwX2RlbGF5KHUzMiByZWcsIHUzMiB2KQoreworCWludCBuID0gMTA7CisJd2hpbGUgKC0tbiAmJiBtY2hpcF9yZWFkKHJlZykgIT0gdikKKwkJdWRlbGF5KDEpOworCXJldHVybiBuOworfQorCisvKiBzZXR1cCBzdWJzYW1wbGluZyAqLworc3RhdGljIHZvaWQgbWNoaXBfc3Vic2FtcGxlKHZvaWQpCit7CisJbWNoaXBfc2V0KE1DSElQX01DQ19SX1NBTVBMSU5HLCBtZXllLnBhcmFtcy5zdWJzYW1wbGUpOworCW1jaGlwX3NldChNQ0hJUF9NQ0NfUl9YUkFOR0UsIG1jaGlwX2hzaXplKCkpOworCW1jaGlwX3NldChNQ0hJUF9NQ0NfUl9ZUkFOR0UsIG1jaGlwX3ZzaXplKCkpOworCW1jaGlwX3NldChNQ0hJUF9NQ0NfQl9YUkFOR0UsIG1jaGlwX2hzaXplKCkpOworCW1jaGlwX3NldChNQ0hJUF9NQ0NfQl9ZUkFOR0UsIG1jaGlwX3ZzaXplKCkpOworCW1jaGlwX2RlbGF5KE1DSElQX0hJQ19TVEFUVVMsIE1DSElQX0hJQ19TVEFUVVNfSURMRSk7Cit9CisKKy8qIHNldCB0aGUgZnJhbWVyYXRlIGludG8gdGhlIG1jaGlwICovCitzdGF0aWMgdm9pZCBtY2hpcF9zZXRfZnJhbWVyYXRlKHZvaWQpCit7CisJbWNoaXBfc2V0KE1DSElQX0hJQ19TX1JBVEUsIG1leWUucGFyYW1zLmZyYW1lcmF0ZSk7Cit9CisKKy8qIGxvYWQgc29tZSBodWZmbWFuIGFuZCBxdWFudGlzYXRpb24gdGFibGVzIGludG8gdGhlIFZSSiBjaGlwIHJlYWR5CisgICBmb3IgSlBFRyBjb21wcmVzc2lvbiAqLworc3RhdGljIHZvaWQgbWNoaXBfbG9hZF90YWJsZXModm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCXUxNiAqdGFibGVzOworCisJdGFibGVzID0ganBlZ19odWZmbWFuX3RhYmxlcygmbGVuZ3RoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXdyaXRlbCh0YWJsZXNbaV0sIG1leWUubWNoaXBfbW1yZWdzICsgTUNISVBfVlJKX1RBQkxFX0RBVEEpOworCisJdGFibGVzID0ganBlZ19xdWFudGlzYXRpb25fdGFibGVzKCZsZW5ndGgsIG1leWUucGFyYW1zLnF1YWxpdHkpOworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJd3JpdGVsKHRhYmxlc1tpXSwgbWV5ZS5tY2hpcF9tbXJlZ3MgKyBNQ0hJUF9WUkpfVEFCTEVfREFUQSk7Cit9CisKKy8qIHNldHVwIHRoZSBWUkogcGFyYW1ldGVycyBpbiB0aGUgY2hpcCAqLworc3RhdGljIHZvaWQgbWNoaXBfdnJqX3NldHVwKHU4IG1vZGUpCit7CisJbWNoaXBfc2V0KE1DSElQX1ZSSl9CVVNfTU9ERSwgNSk7CisJbWNoaXBfc2V0KE1DSElQX1ZSSl9TSUdOQUxfQUNUSVZFX0xFVkVMLCAweDFmKTsKKwltY2hpcF9zZXQoTUNISVBfVlJKX1BEQVRfVVNFLCAxKTsKKwltY2hpcF9zZXQoTUNISVBfVlJKX0lSUV9GTEFHLCAweGEwKTsKKwltY2hpcF9zZXQoTUNISVBfVlJKX01PREVfU1BFQ0lGWSwgbW9kZSk7CisJbWNoaXBfc2V0KE1DSElQX1ZSSl9OVU1fTElORVMsIG1jaGlwX3ZzaXplKCkpOworCW1jaGlwX3NldChNQ0hJUF9WUkpfTlVNX1BJWEVMUywgbWNoaXBfaHNpemUoKSk7CisJbWNoaXBfc2V0KE1DSElQX1ZSSl9OVU1fQ09NUE9ORU5UUywgMHgxYik7CisJbWNoaXBfc2V0KE1DSElQX1ZSSl9MSU1JVF9DT01QUkVTU0VEX0xPLCAweEZGRkYpOworCW1jaGlwX3NldChNQ0hJUF9WUkpfTElNSVRfQ09NUFJFU1NFRF9ISSwgMHhGRkZGKTsKKwltY2hpcF9zZXQoTUNISVBfVlJKX0NPTVBfREFUQV9GT1JNQVQsIDB4Qyk7CisJbWNoaXBfc2V0KE1DSElQX1ZSSl9SRVNUQVJUX0lOVEVSVkFMLCAwKTsKKwltY2hpcF9zZXQoTUNISVBfVlJKX1NPRjEsIDB4NjAxKTsKKwltY2hpcF9zZXQoTUNISVBfVlJKX1NPRjIsIDB4MTUwMik7CisJbWNoaXBfc2V0KE1DSElQX1ZSSl9TT0YzLCAweDE1MDMpOworCW1jaGlwX3NldChNQ0hJUF9WUkpfU09GNCwgMHgxNTk2KTsKKwltY2hpcF9zZXQoTUNISVBfVlJKX1NPUywgMHgwZWQwKTsKKworCW1jaGlwX2xvYWRfdGFibGVzKCk7Cit9CisKKy8qIHNldHMgdGhlIERNQSBwYXJhbWV0ZXJzIGludG8gdGhlIGNoaXAgKi8KK3N0YXRpYyB2b2lkIG1jaGlwX2RtYV9zZXR1cChkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCWludCBpOworCisJbWNoaXBfc2V0KE1DSElQX01NX1BUX0FERFIsICh1MzIpZG1hX2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCW1jaGlwX3NldChNQ0hJUF9NTV9GSVIoaSksIDApOworCW1leWUubWNoaXBfZm51bSA9IDA7Cit9CisKKy8qIHNldHVwIGZvciBETUEgdHJhbnNmZXJzIC0gYWxzbyB6ZXJvcyB0aGUgZnJhbWVidWZmZXIgKi8KK3N0YXRpYyBpbnQgbWNoaXBfZG1hX2FsbG9jKHZvaWQpCit7CisJaWYgKCFtZXllLm1jaGlwX2RtYWhhbmRsZSkKKwkJaWYgKHB0YWJsZV9hbGxvYygpKQorCQkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisvKiBmcmVlcyB0aGUgRE1BIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgbWNoaXBfZG1hX2ZyZWUodm9pZCkKK3sKKwlpZiAobWV5ZS5tY2hpcF9kbWFoYW5kbGUpIHsKKwkJbWNoaXBfZG1hX3NldHVwKDApOworCQlwdGFibGVfZnJlZSgpOworCX0KK30KKworLyogc3RvcCBhbnkgZXhpc3RpbmcgSElDIGFjdGlvbiBhbmQgd2FpdCBmb3IgYW55IGRtYSB0byBjb21wbGV0ZSB0aGVuCisgICByZXNldCB0aGUgZG1hIGVuZ2luZSAqLworc3RhdGljIHZvaWQgbWNoaXBfaGljX3N0b3Aodm9pZCkKK3sKKwlpbnQgaSwgajsKKworCW1leWUubWNoaXBfbW9kZSA9IE1DSElQX0hJQ19NT0RFX05PT1A7CisJaWYgKCEobWNoaXBfcmVhZChNQ0hJUF9ISUNfU1RBVFVTKSAmIE1DSElQX0hJQ19TVEFUVVNfQlVTWSkpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7ICsraSkgeworCQltY2hpcF9zZXQoTUNISVBfSElDX0NNRCwgTUNISVBfSElDX0NNRF9TVE9QKTsKKwkJbWNoaXBfZGVsYXkoTUNISVBfSElDX0NNRCwgMCk7CisJCWZvciAoaiA9IDA7IGogPCAxMDA7ICsraikgeworCQkJaWYgKG1jaGlwX2RlbGF5KE1DSElQX0hJQ19TVEFUVVMsCisJCQkJCU1DSElQX0hJQ19TVEFUVVNfSURMRSkpCisJCQkJcmV0dXJuOworCQkJbXNsZWVwKDEpOworCQl9CisJCXByaW50ayhLRVJOX0VSUiAibWV5ZTogbmVlZCB0byByZXNldCBISUMhXG4iKTsKKworCQltY2hpcF9zZXQoTUNISVBfSElDX0NUTCwgTUNISVBfSElDX0NUTF9TT0ZUX1JFU0VUKTsKKwkJbXNsZWVwKDI1MCk7CisJfQorCXByaW50ayhLRVJOX0VSUiAibWV5ZTogcmVzZXR0aW5nIEhJQyBoYW5nZWQhXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNQ0hJUCBmcmFtZSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBnZXQgdGhlIG5leHQgcmVhZHkgZnJhbWUgZnJvbSB0aGUgZG1hIGVuZ2luZSAqLworc3RhdGljIHUzMiBtY2hpcF9nZXRfZnJhbWUodm9pZCkKK3sKKwl1MzIgdjsKKworCXYgPSBtY2hpcF9yZWFkKE1DSElQX01NX0ZJUihtZXllLm1jaGlwX2ZudW0pKTsKKwlyZXR1cm4gdjsKK30KKworLyogZnJlZXMgdGhlIGN1cnJlbnQgZnJhbWUgZnJvbSB0aGUgZG1hIGVuZ2luZSAqLworc3RhdGljIHZvaWQgbWNoaXBfZnJlZV9mcmFtZSh2b2lkKQoreworCW1jaGlwX3NldChNQ0hJUF9NTV9GSVIobWV5ZS5tY2hpcF9mbnVtKSwgMCk7CisJbWV5ZS5tY2hpcF9mbnVtKys7CisJbWV5ZS5tY2hpcF9mbnVtICU9IDQ7Cit9CisKKy8qIHJlYWQgb25lIGZyYW1lIGZyb20gdGhlIGZyYW1lYnVmZmVyIGFzc3VtaW5nIGl0IHdhcyBjYXB0dXJlZCB1c2luZworICAgYSB1bmNvbXByZXNzZWQgdHJhbnNmZXIgKi8KK3N0YXRpYyB2b2lkIG1jaGlwX2NvbnRfcmVhZF9mcmFtZSh1MzIgdiwgdTggKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IHB0X2lkOworCisJcHRfaWQgPSAodiA+PiAxNykgJiAweDNGRjsKKworCXB0YWJsZV9jb3B5KGJ1ZiwgcHRfaWQsIHNpemUsIE1DSElQX05CX1BBR0VTKTsKK30KKworLyogcmVhZCBhIGNvbXByZXNzZWQgZnJhbWUgZnJvbSB0aGUgZnJhbWVidWZmZXIgKi8KK3N0YXRpYyBpbnQgbWNoaXBfY29tcF9yZWFkX2ZyYW1lKHUzMiB2LCB1OCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlpbnQgcHRfc3RhcnQsIHB0X2VuZCwgdHJhaWxlcjsKKwlpbnQgZnNpemU7CisJaW50IGk7CisKKwlwdF9zdGFydCA9ICh2ID4+IDE5KSAmIDB4RkY7CisJcHRfZW5kID0gKHYgPj4gMTEpICYgMHhGRjsKKwl0cmFpbGVyID0gKHYgPj4gMSkgJiAweDNGRjsKKworCWlmIChwdF9lbmQgPCBwdF9zdGFydCkKKwkJZnNpemUgPSAoTUNISVBfTkJfUEFHRVNfTUpQRUcgLSBwdF9zdGFydCkgKiBQQUdFX1NJWkUgKworCQkJcHRfZW5kICogUEFHRV9TSVpFICsgdHJhaWxlciAqIDQ7CisJZWxzZQorCQlmc2l6ZSA9IChwdF9lbmQgLSBwdF9zdGFydCkgKiBQQUdFX1NJWkUgKyB0cmFpbGVyICogNDsKKworCWlmIChmc2l6ZSA+IHNpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWV5ZTogb3ZlcnNpemVkIGNvbXByZXNzZWQgZnJhbWUgJWRcbiIsCisJCSAgICAgICBmc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwdGFibGVfY29weShidWYsIHB0X3N0YXJ0LCBmc2l6ZSwgTUNISVBfTkJfUEFHRVNfTUpQRUcpOworCisjaWZkZWYgTUVZRV9KUEVHX0NPUlJFQ1RJT04KKworCS8qIFNvbWUgbWNoaXAgZ2VuZXJhdGVkIGpwZWcgZnJhbWVzIGFyZSBpbmNvcnJlY3QuIEluIG1vc3QKKwkgKiAoYWxsID8pIG9mIHRob3NlIGNhc2VzLCB0aGUgZmluYWwgRU9JICgweGZmIDB4ZDkpIG1hcmtlcgorCSAqIGlzIG5vdCBwcmVzZW50IGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lLgorCSAqCisJICogU2luY2UgYWRkaW5nIHRoZSBmaW5hbCBtYXJrZXIgaXMgbm90IGVub3VnaCB0byByZXN0b3JlCisJICogdGhlIGpwZWcgaW50ZWdyaXR5LCB3ZSBkcm9wIHRoZSBmcmFtZS4KKwkgKi8KKworCWZvciAoaSA9IGZzaXplIC0gMTsgaSA+IDAgJiYgYnVmW2ldID09IDB4ZmY7IGktLSkgOworCisJaWYgKGkgPCAyIHx8IGJ1ZltpIC0gMV0gIT0gMHhmZiB8fCBidWZbaV0gIT0gMHhkOSkKKwkJcmV0dXJuIC0xOworCisjZW5kaWYKKworCXJldHVybiBmc2l6ZTsKK30KKworLyogdGFrZSBhIHBpY3R1cmUgaW50byBTRFJBTSAqLworc3RhdGljIHZvaWQgbWNoaXBfdGFrZV9waWN0dXJlKHZvaWQpCit7CisJaW50IGk7CisKKwltY2hpcF9oaWNfc3RvcCgpOworCW1jaGlwX3N1YnNhbXBsZSgpOworCW1jaGlwX2RtYV9zZXR1cChtZXllLm1jaGlwX2RtYWhhbmRsZSk7CisKKwltY2hpcF9zZXQoTUNISVBfSElDX01PREUsIE1DSElQX0hJQ19NT0RFX1NUSUxMX0NBUCk7CisJbWNoaXBfc2V0KE1DSElQX0hJQ19DTUQsIE1DSElQX0hJQ19DTURfU1RBUlQpOworCisJbWNoaXBfZGVsYXkoTUNISVBfSElDX0NNRCwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKwkJaWYgKG1jaGlwX2RlbGF5KE1DSElQX0hJQ19TVEFUVVMsIE1DSElQX0hJQ19TVEFUVVNfSURMRSkpCisJCQlicmVhazsKKwkJbXNsZWVwKDEpOworCX0KK30KKworLyogZG1hIGEgcHJldmlvdXNseSB0YWtlbiBwaWN0dXJlIGludG8gYSBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIG1jaGlwX2dldF9waWN0dXJlKHU4ICpidWYsIGludCBidWZzaXplKQoreworCXUzMiB2OworCWludCBpOworCisJbWNoaXBfc2V0KE1DSElQX0hJQ19NT0RFLCBNQ0hJUF9ISUNfTU9ERV9TVElMTF9PVVQpOworCW1jaGlwX3NldChNQ0hJUF9ISUNfQ01ELCBNQ0hJUF9ISUNfQ01EX1NUQVJUKTsKKworCW1jaGlwX2RlbGF5KE1DSElQX0hJQ19DTUQsIDApOworCWZvciAoaSA9IDA7IGkgPCAxMDA7ICsraSkgeworCQlpZiAobWNoaXBfZGVsYXkoTUNISVBfSElDX1NUQVRVUywgTUNISVBfSElDX1NUQVRVU19JRExFKSkKKwkJCWJyZWFrOworCQltc2xlZXAoMSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJdiA9IG1jaGlwX2dldF9mcmFtZSgpOworCQlpZiAodiAmIE1DSElQX01NX0ZJUl9SRFkpIHsKKwkJCW1jaGlwX2NvbnRfcmVhZF9mcmFtZSh2LCBidWYsIGJ1ZnNpemUpOworCQkJYnJlYWs7CisJCX0KKwkJbWNoaXBfZnJlZV9mcmFtZSgpOworCX0KK30KKworLyogc3RhcnQgY29udGludW91cyBkbWEgY2FwdHVyZSAqLworc3RhdGljIHZvaWQgbWNoaXBfY29udGludW91c19zdGFydCh2b2lkKQoreworCW1jaGlwX2hpY19zdG9wKCk7CisJbWNoaXBfc3Vic2FtcGxlKCk7CisJbWNoaXBfc2V0X2ZyYW1lcmF0ZSgpOworCW1jaGlwX2RtYV9zZXR1cChtZXllLm1jaGlwX2RtYWhhbmRsZSk7CisKKwltZXllLm1jaGlwX21vZGUgPSBNQ0hJUF9ISUNfTU9ERV9DT05UX09VVDsKKworCW1jaGlwX3NldChNQ0hJUF9ISUNfTU9ERSwgTUNISVBfSElDX01PREVfQ09OVF9PVVQpOworCW1jaGlwX3NldChNQ0hJUF9ISUNfQ01ELCBNQ0hJUF9ISUNfQ01EX1NUQVJUKTsKKworCW1jaGlwX2RlbGF5KE1DSElQX0hJQ19DTUQsIDApOworfQorCisvKiBjb21wcmVzcyBvbmUgZnJhbWUgaW50byBhIGJ1ZmZlciAqLworc3RhdGljIGludCBtY2hpcF9jb21wcmVzc19mcmFtZSh1OCAqYnVmLCBpbnQgYnVmc2l6ZSkKK3sKKwl1MzIgdjsKKwlpbnQgbGVuID0gLTEsIGk7CisKKwltY2hpcF92cmpfc2V0dXAoMHgzZik7CisJdWRlbGF5KDUwKTsKKworCW1jaGlwX3NldChNQ0hJUF9ISUNfTU9ERSwgTUNISVBfSElDX01PREVfU1RJTExfQ09NUCk7CisJbWNoaXBfc2V0KE1DSElQX0hJQ19DTUQsIE1DSElQX0hJQ19DTURfU1RBUlQpOworCisJbWNoaXBfZGVsYXkoTUNISVBfSElDX0NNRCwgMCk7CisJZm9yIChpID0gMDsgaSA8IDEwMDsgKytpKSB7CisJCWlmIChtY2hpcF9kZWxheShNQ0hJUF9ISUNfU1RBVFVTLCBNQ0hJUF9ISUNfU1RBVFVTX0lETEUpKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJCXYgPSBtY2hpcF9nZXRfZnJhbWUoKTsKKwkJaWYgKHYgJiBNQ0hJUF9NTV9GSVJfUkRZKSB7CisJCQlsZW4gPSBtY2hpcF9jb21wX3JlYWRfZnJhbWUodiwgYnVmLCBidWZzaXplKTsKKwkJCWJyZWFrOworCQl9CisJCW1jaGlwX2ZyZWVfZnJhbWUoKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworI2lmIDAKKy8qIHVuY29tcHJlc3Mgb25lIGltYWdlIGludG8gYSBidWZmZXIgKi8KK3N0YXRpYyBpbnQgbWNoaXBfdW5jb21wcmVzc19mcmFtZSh1OCAqaW1nLCBpbnQgaW1nc2l6ZSwgdTggKmJ1ZiwgaW50IGJ1ZnNpemUpCit7CisJbWNoaXBfdnJqX3NldHVwKDB4M2YpOworCXVkZWxheSg1MCk7CisKKwltY2hpcF9zZXQoTUNISVBfSElDX01PREUsIE1DSElQX0hJQ19NT0RFX1NUSUxMX0RFQ09NUCk7CisJbWNoaXBfc2V0KE1DSElQX0hJQ19DTUQsIE1DSElQX0hJQ19DTURfU1RBUlQpOworCisJbWNoaXBfZGVsYXkoTUNISVBfSElDX0NNRCwgMCk7CisKKwlyZXR1cm4gbWNoaXBfY29tcF9yZWFkX2ZyYW1lKGJ1ZiwgYnVmc2l6ZSk7Cit9CisjZW5kaWYKKworLyogc3RhcnQgY29udGludW91cyBjb21wcmVzc2VkIGNhcHR1cmUgKi8KK3N0YXRpYyB2b2lkIG1jaGlwX2NvbnRfY29tcHJlc3Npb25fc3RhcnQodm9pZCkKK3sKKwltY2hpcF9oaWNfc3RvcCgpOworCW1jaGlwX3Zyal9zZXR1cCgweDNmKTsKKwltY2hpcF9zdWJzYW1wbGUoKTsKKwltY2hpcF9zZXRfZnJhbWVyYXRlKCk7CisJbWNoaXBfZG1hX3NldHVwKG1leWUubWNoaXBfZG1haGFuZGxlKTsKKworCW1leWUubWNoaXBfbW9kZSA9IE1DSElQX0hJQ19NT0RFX0NPTlRfQ09NUDsKKworCW1jaGlwX3NldChNQ0hJUF9ISUNfTU9ERSwgTUNISVBfSElDX01PREVfQ09OVF9DT01QKTsKKwltY2hpcF9zZXQoTUNISVBfSElDX0NNRCwgTUNISVBfSElDX0NNRF9TVEFSVCk7CisKKwltY2hpcF9kZWxheShNQ0hJUF9ISUNfQ01ELCAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcnJ1cHQgaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgbWV5ZV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgdjsKKwlpbnQgcmVxbnI7CisJc3RhdGljIGludCBzZXF1ZW5jZSA9IDA7CisKKwl2ID0gbWNoaXBfcmVhZChNQ0hJUF9NTV9JTlRBKTsKKworCWlmIChtZXllLm1jaGlwX21vZGUgIT0gTUNISVBfSElDX01PREVfQ09OVF9PVVQgJiYKKwkgICAgbWV5ZS5tY2hpcF9tb2RlICE9IE1DSElQX0hJQ19NT0RFX0NPTlRfQ09NUCkKKwkJcmV0dXJuIElSUV9OT05FOworCithZ2FpbjoKKwl2ID0gbWNoaXBfZ2V0X2ZyYW1lKCk7CisJaWYgKCEodiAmIE1DSElQX01NX0ZJUl9SRFkpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlpZiAobWV5ZS5tY2hpcF9tb2RlID09IE1DSElQX0hJQ19NT0RFX0NPTlRfT1VUKSB7CisJCWlmIChrZmlmb19nZXQobWV5ZS5ncmFicSwgKHVuc2lnbmVkIGNoYXIgKikmcmVxbnIsCisJCQkgICAgICBzaXplb2YoaW50KSkgIT0gc2l6ZW9mKGludCkpIHsKKwkJCW1jaGlwX2ZyZWVfZnJhbWUoKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCQltY2hpcF9jb250X3JlYWRfZnJhbWUodiwgbWV5ZS5ncmFiX2ZidWZmZXIgKyBnYnVmc2l6ZSAqIHJlcW5yLAorCQkJCSAgICAgIG1jaGlwX2hzaXplKCkgKiBtY2hpcF92c2l6ZSgpICogMik7CisJCW1leWUuZ3JhYl9idWZmZXJbcmVxbnJdLnNpemUgPSBtY2hpcF9oc2l6ZSgpICogbWNoaXBfdnNpemUoKSAqIDI7CisJCW1leWUuZ3JhYl9idWZmZXJbcmVxbnJdLnN0YXRlID0gTUVZRV9CVUZfRE9ORTsKKwkJZG9fZ2V0dGltZW9mZGF5KCZtZXllLmdyYWJfYnVmZmVyW3JlcW5yXS50aW1lc3RhbXApOworCQltZXllLmdyYWJfYnVmZmVyW3JlcW5yXS5zZXF1ZW5jZSA9IHNlcXVlbmNlKys7CisJCWtmaWZvX3B1dChtZXllLmRvbmVxLCAodW5zaWduZWQgY2hhciAqKSZyZXFuciwgc2l6ZW9mKGludCkpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm1leWUucHJvY19saXN0KTsKKwl9IGVsc2UgeworCQlpbnQgc2l6ZTsKKwkJc2l6ZSA9IG1jaGlwX2NvbXBfcmVhZF9mcmFtZSh2LCBtZXllLmdyYWJfdGVtcCwgZ2J1ZnNpemUpOworCQlpZiAoc2l6ZSA9PSAtMSkgeworCQkJbWNoaXBfZnJlZV9mcmFtZSgpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlpZiAoa2ZpZm9fZ2V0KG1leWUuZ3JhYnEsICh1bnNpZ25lZCBjaGFyICopJnJlcW5yLAorCQkJICAgICAgc2l6ZW9mKGludCkpICE9IHNpemVvZihpbnQpKSB7CisJCQltY2hpcF9mcmVlX2ZyYW1lKCk7CisJCQlnb3RvIGFnYWluOworCQl9CisJCW1lbWNweShtZXllLmdyYWJfZmJ1ZmZlciArIGdidWZzaXplICogcmVxbnIsIG1leWUuZ3JhYl90ZW1wLAorCQkgICAgICAgc2l6ZSk7CisJCW1leWUuZ3JhYl9idWZmZXJbcmVxbnJdLnNpemUgPSBzaXplOworCQltZXllLmdyYWJfYnVmZmVyW3JlcW5yXS5zdGF0ZSA9IE1FWUVfQlVGX0RPTkU7CisJCWRvX2dldHRpbWVvZmRheSgmbWV5ZS5ncmFiX2J1ZmZlcltyZXFucl0udGltZXN0YW1wKTsKKwkJbWV5ZS5ncmFiX2J1ZmZlcltyZXFucl0uc2VxdWVuY2UgPSBzZXF1ZW5jZSsrOworCQlrZmlmb19wdXQobWV5ZS5kb25lcSwgKHVuc2lnbmVkIGNoYXIgKikmcmVxbnIsIHNpemVvZihpbnQpKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtZXllLnByb2NfbGlzdCk7CisJfQorCW1jaGlwX2ZyZWVfZnJhbWUoKTsKKwlnb3RvIGFnYWluOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHZpZGVvNGxpbnV4IGludGVncmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbWV5ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpLCBlcnI7CisKKwllcnIgPSB2aWRlb19leGNsdXNpdmVfb3Blbihpbm9kZSwgZmlsZSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwltY2hpcF9oaWNfc3RvcCgpOworCisJaWYgKG1jaGlwX2RtYV9hbGxvYygpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWV5ZTogbWNoaXAgZnJhbWVidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQl2aWRlb19leGNsdXNpdmVfcmVsZWFzZShpbm9kZSwgZmlsZSk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUVZRV9NQVhfQlVGTkJSUzsgaSsrKQorCQltZXllLmdyYWJfYnVmZmVyW2ldLnN0YXRlID0gTUVZRV9CVUZfVU5VU0VEOworCWtmaWZvX3Jlc2V0KG1leWUuZ3JhYnEpOworCWtmaWZvX3Jlc2V0KG1leWUuZG9uZXEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1leWVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwltY2hpcF9oaWNfc3RvcCgpOworCW1jaGlwX2RtYV9mcmVlKCk7CisJdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1leWVfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIFZJRElPQ0dDQVA6IHsKKwkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmIgPSBhcmc7CisJCXN0cmNweShiLT5uYW1lLG1leWUudmlkZW9fZGV2LT5uYW1lKTsKKwkJYi0+dHlwZSA9IFZJRF9UWVBFX0NBUFRVUkU7CisJCWItPmNoYW5uZWxzID0gMTsKKwkJYi0+YXVkaW9zID0gMDsKKwkJYi0+bWF4d2lkdGggPSA2NDA7CisJCWItPm1heGhlaWdodCA9IDQ4MDsKKwkJYi0+bWlud2lkdGggPSAzMjA7CisJCWItPm1pbmhlaWdodCA9IDI0MDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NHQ0hBTjogeworCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKwkJdi0+ZmxhZ3MgPSAwOworCQl2LT50dW5lcnMgPSAwOworCQl2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCWlmICh2LT5jaGFubmVsICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RyY3B5KHYtPm5hbWUsIkNhbWVyYSIpOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1NDSEFOOiB7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCQlpZiAodi0+Y2hhbm5lbCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DR1BJQ1Q6IHsKKwkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CisJCSpwID0gbWV5ZS5waWN0dXJlOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1NQSUNUOiB7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCQlpZiAocC0+ZGVwdGggIT0gMTYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHAtPnBhbGV0dGUgIT0gVklERU9fUEFMRVRURV9ZVVY0MjIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG93bigmbWV5ZS5sb2NrKTsKKwkJc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUJSSUdIVE5FU1MsCisJCQkJICAgICAgcC0+YnJpZ2h0bmVzcyA+PiAxMCk7CisJCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFIVUUsCisJCQkJICAgICAgcC0+aHVlID4+IDEwKTsKKwkJc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTE9SLAorCQkJCSAgICAgIHAtPmNvbG91ciA+PiAxMCk7CisJCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT05UUkFTVCwKKwkJCQkgICAgICBwLT5jb250cmFzdCA+PiAxMCk7CisJCW1leWUucGljdHVyZSA9ICpwOworCQl1cCgmbWV5ZS5sb2NrKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NTWU5DOiB7CisJCWludCAqaSA9IGFyZzsKKwkJaW50IHVudXNlZDsKKworCQlpZiAoKmkgPCAwIHx8ICppID49IGdidWZmZXJzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZG93bigmbWV5ZS5sb2NrKTsKKworCQlzd2l0Y2ggKG1leWUuZ3JhYl9idWZmZXJbKmldLnN0YXRlKSB7CisKKwkJY2FzZSBNRVlFX0JVRl9VTlVTRUQ6CisJCQl1cCgmbWV5ZS5sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIE1FWUVfQlVGX1VTSU5HOgorCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJdXAoJm1leWUubG9jayk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisJCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKG1leWUucHJvY19saXN0LAorCQkJCQkJICAgICAobWV5ZS5ncmFiX2J1ZmZlclsqaV0uc3RhdGUgIT0gTUVZRV9CVUZfVVNJTkcpKSkgeworCQkJCXVwKCZtZXllLmxvY2spOworCQkJCXJldHVybiAtRUlOVFI7CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBNRVlFX0JVRl9ET05FOgorCQkJbWV5ZS5ncmFiX2J1ZmZlclsqaV0uc3RhdGUgPSBNRVlFX0JVRl9VTlVTRUQ7CisJCQlrZmlmb19nZXQobWV5ZS5kb25lcSwgKHVuc2lnbmVkIGNoYXIgKikmdW51c2VkLCBzaXplb2YoaW50KSk7CisJCX0KKwkJdXAoJm1leWUubG9jayk7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DTUNBUFRVUkU6IHsKKwkJc3RydWN0IHZpZGVvX21tYXAgKnZtID0gYXJnOworCQlpbnQgcmVzdGFydCA9IDA7CisKKwkJaWYgKHZtLT5mcmFtZSA+PSBnYnVmZmVycyB8fCB2bS0+ZnJhbWUgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2bS0+Zm9ybWF0ICE9IFZJREVPX1BBTEVUVEVfWVVWNDIyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2bS0+aGVpZ2h0ICogdm0tPndpZHRoICogMiA+IGdidWZzaXplKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghbWV5ZS5ncmFiX2ZidWZmZXIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG1leWUuZ3JhYl9idWZmZXJbdm0tPmZyYW1lXS5zdGF0ZSAhPSBNRVlFX0JVRl9VTlVTRUQpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWRvd24oJm1leWUubG9jayk7CisJCWlmICh2bS0+d2lkdGggPT0gNjQwICYmIHZtLT5oZWlnaHQgPT0gNDgwKSB7CisJCQlpZiAobWV5ZS5wYXJhbXMuc3Vic2FtcGxlKSB7CisJCQkJbWV5ZS5wYXJhbXMuc3Vic2FtcGxlID0gMDsKKwkJCQlyZXN0YXJ0ID0gMTsKKwkJCX0KKwkJfSBlbHNlIGlmICh2bS0+d2lkdGggPT0gMzIwICYmIHZtLT5oZWlnaHQgPT0gMjQwKSB7CisJCQlpZiAoIW1leWUucGFyYW1zLnN1YnNhbXBsZSkgeworCQkJCW1leWUucGFyYW1zLnN1YnNhbXBsZSA9IDE7CisJCQkJcmVzdGFydCA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1cCgmbWV5ZS5sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHJlc3RhcnQgfHwgbWV5ZS5tY2hpcF9tb2RlICE9IE1DSElQX0hJQ19NT0RFX0NPTlRfT1VUKQorCQkJbWNoaXBfY29udGludW91c19zdGFydCgpOworCQltZXllLmdyYWJfYnVmZmVyW3ZtLT5mcmFtZV0uc3RhdGUgPSBNRVlFX0JVRl9VU0lORzsKKwkJa2ZpZm9fcHV0KG1leWUuZ3JhYnEsICh1bnNpZ25lZCBjaGFyICopJnZtLT5mcmFtZSwgc2l6ZW9mKGludCkpOworCQl1cCgmbWV5ZS5sb2NrKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NHTUJVRjogeworCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqdm0gPSBhcmc7CisJCWludCBpOworCisJCW1lbXNldCh2bSwgMCAsIHNpemVvZigqdm0pKTsKKwkJdm0tPnNpemUgPSBnYnVmc2l6ZSAqIGdidWZmZXJzOworCQl2bS0+ZnJhbWVzID0gZ2J1ZmZlcnM7CisJCWZvciAoaSA9IDA7IGkgPCBnYnVmZmVyczsgaSsrKQorCQkJdm0tPm9mZnNldHNbaV0gPSBpICogZ2J1ZnNpemU7CisJCWJyZWFrOworCX0KKworCWNhc2UgTUVZRUlPQ19HX1BBUkFNUzogeworCQlzdHJ1Y3QgbWV5ZV9wYXJhbXMgKnAgPSBhcmc7CisJCSpwID0gbWV5ZS5wYXJhbXM7CisJCWJyZWFrOworCX0KKworCWNhc2UgTUVZRUlPQ19TX1BBUkFNUzogeworCQlzdHJ1Y3QgbWV5ZV9wYXJhbXMgKmpwID0gYXJnOworCQlpZiAoanAtPnN1YnNhbXBsZSA+IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGpwLT5xdWFsaXR5ID4gMTApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGpwLT5zaGFycG5lc3MgPiA2MyB8fCBqcC0+YWdjID4gNjMgfHwganAtPnBpY3R1cmUgPiA2MykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoanAtPmZyYW1lcmF0ZSA+IDMxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRvd24oJm1leWUubG9jayk7CisJCWlmIChtZXllLnBhcmFtcy5zdWJzYW1wbGUgIT0ganAtPnN1YnNhbXBsZSB8fAorCQkgICAgbWV5ZS5wYXJhbXMucXVhbGl0eSAhPSBqcC0+cXVhbGl0eSkKKwkJCW1jaGlwX2hpY19zdG9wKCk7CS8qIG5lZWQgcmVzdGFydCAqLworCQltZXllLnBhcmFtcyA9ICpqcDsKKwkJc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQVNIQVJQTkVTUywKKwkJCQkgICAgICBtZXllLnBhcmFtcy5zaGFycG5lc3MpOworCQlzb255cGlfY2FtZXJhX2NvbW1hbmQoU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQUdDLAorCQkJCSAgICAgIG1leWUucGFyYW1zLmFnYyk7CisJCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFQSUNUVVJFLAorCQkJCSAgICAgIG1leWUucGFyYW1zLnBpY3R1cmUpOworCQl1cCgmbWV5ZS5sb2NrKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBNRVlFSU9DX1FCVUZfQ0FQVDogeworCQlpbnQgKm5iID0gYXJnOworCisJCWlmICghbWV5ZS5ncmFiX2ZidWZmZXIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCpuYiA+PSBnYnVmZmVycykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoKm5iIDwgMCkgeworCQkJLyogc3RvcCBjYXB0dXJlICovCisJCQltY2hpcF9oaWNfc3RvcCgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKG1leWUuZ3JhYl9idWZmZXJbKm5iXS5zdGF0ZSAhPSBNRVlFX0JVRl9VTlVTRUQpCisJCQlyZXR1cm4gLUVCVVNZOworCQlkb3duKCZtZXllLmxvY2spOworCQlpZiAobWV5ZS5tY2hpcF9tb2RlICE9IE1DSElQX0hJQ19NT0RFX0NPTlRfQ09NUCkKKwkJCW1jaGlwX2NvbnRfY29tcHJlc3Npb25fc3RhcnQoKTsKKwkJbWV5ZS5ncmFiX2J1ZmZlclsqbmJdLnN0YXRlID0gTUVZRV9CVUZfVVNJTkc7CisJCWtmaWZvX3B1dChtZXllLmdyYWJxLCAodW5zaWduZWQgY2hhciAqKW5iLCBzaXplb2YoaW50KSk7CisJCXVwKCZtZXllLmxvY2spOworCQlicmVhazsKKwl9CisKKwljYXNlIE1FWUVJT0NfU1lOQzogeworCQlpbnQgKmkgPSBhcmc7CisJCWludCB1bnVzZWQ7CisKKwkJaWYgKCppIDwgMCB8fCAqaSA+PSBnYnVmZmVycykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRvd24oJm1leWUubG9jayk7CisJCXN3aXRjaCAobWV5ZS5ncmFiX2J1ZmZlclsqaV0uc3RhdGUpIHsKKworCQljYXNlIE1FWUVfQlVGX1VOVVNFRDoKKwkJCXVwKCZtZXllLmxvY2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgTUVZRV9CVUZfVVNJTkc6CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQl1cCgmbWV5ZS5sb2NrKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKwkJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobWV5ZS5wcm9jX2xpc3QsCisJCQkJCQkgICAgIChtZXllLmdyYWJfYnVmZmVyWyppXS5zdGF0ZSAhPSBNRVlFX0JVRl9VU0lORykpKSB7CisJCQkJdXAoJm1leWUubG9jayk7CisJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIE1FWUVfQlVGX0RPTkU6CisJCQltZXllLmdyYWJfYnVmZmVyWyppXS5zdGF0ZSA9IE1FWUVfQlVGX1VOVVNFRDsKKwkJCWtmaWZvX2dldChtZXllLmRvbmVxLCAodW5zaWduZWQgY2hhciAqKSZ1bnVzZWQsIHNpemVvZihpbnQpKTsKKwkJfQorCQkqaSA9IG1leWUuZ3JhYl9idWZmZXJbKmldLnNpemU7CisJCXVwKCZtZXllLmxvY2spOworCQlicmVhazsKKwl9CisKKwljYXNlIE1FWUVJT0NfU1RJTExDQVBUOiB7CisKKwkJaWYgKCFtZXllLmdyYWJfZmJ1ZmZlcikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobWV5ZS5ncmFiX2J1ZmZlclswXS5zdGF0ZSAhPSBNRVlFX0JVRl9VTlVTRUQpCisJCQlyZXR1cm4gLUVCVVNZOworCQlkb3duKCZtZXllLmxvY2spOworCQltZXllLmdyYWJfYnVmZmVyWzBdLnN0YXRlID0gTUVZRV9CVUZfVVNJTkc7CisJCW1jaGlwX3Rha2VfcGljdHVyZSgpOworCQltY2hpcF9nZXRfcGljdHVyZSgKKwkJCW1leWUuZ3JhYl9mYnVmZmVyLAorCQkJbWNoaXBfaHNpemUoKSAqIG1jaGlwX3ZzaXplKCkgKiAyKTsKKwkJbWV5ZS5ncmFiX2J1ZmZlclswXS5zdGF0ZSA9IE1FWUVfQlVGX0RPTkU7CisJCXVwKCZtZXllLmxvY2spOworCQlicmVhazsKKwl9CisKKwljYXNlIE1FWUVJT0NfU1RJTExKQ0FQVDogeworCQlpbnQgKmxlbiA9IGFyZzsKKworCQlpZiAoIW1leWUuZ3JhYl9mYnVmZmVyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChtZXllLmdyYWJfYnVmZmVyWzBdLnN0YXRlICE9IE1FWUVfQlVGX1VOVVNFRCkKKwkJCXJldHVybiAtRUJVU1k7CisJCWRvd24oJm1leWUubG9jayk7CisJCW1leWUuZ3JhYl9idWZmZXJbMF0uc3RhdGUgPSBNRVlFX0JVRl9VU0lORzsKKwkJKmxlbiA9IC0xOworCQl3aGlsZSAoKmxlbiA9PSAtMSkgeworCQkJbWNoaXBfdGFrZV9waWN0dXJlKCk7CisJCQkqbGVuID0gbWNoaXBfY29tcHJlc3NfZnJhbWUobWV5ZS5ncmFiX2ZidWZmZXIsIGdidWZzaXplKTsKKwkJfQorCQltZXllLmdyYWJfYnVmZmVyWzBdLnN0YXRlID0gTUVZRV9CVUZfRE9ORTsKKwkJdXAoJm1leWUubG9jayk7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX1FVRVJZQ0FQOiB7CisJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCA9IGFyZzsKKworCQlpZiAoZm9yY2V2NGwxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKCpjYXApKTsKKwkJc3RyY3B5KGNhcC0+ZHJpdmVyLCAibWV5ZSIpOworCQlzdHJjcHkoY2FwLT5jYXJkLCAibWV5ZSIpOworCQlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0k6JXMiLCBwY2lfbmFtZShtZXllLm1jaGlwX2RldikpOworCQljYXAtPnZlcnNpb24gPSAoTUVZRV9EUklWRVJfTUFKT1JWRVJTSU9OIDw8IDgpICsKKwkJCSAgICAgICBNRVlFX0RSSVZFUl9NSU5PUlZFUlNJT047CisJCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CisJCQkJICAgIFY0TDJfQ0FQX1NUUkVBTUlORzsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOiB7CisJCXN0cnVjdCB2NGwyX2lucHV0ICppID0gYXJnOworCisJCWlmIChpLT5pbmRleCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbXNldChpLCAwLCBzaXplb2YoKmkpKTsKKwkJaS0+aW5kZXggPSAwOworCQlzdHJjcHkoaS0+bmFtZSwgIkNhbWVyYSIpOworCQlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfR19JTlBVVDogeworCQlpbnQgKmkgPSBhcmc7CisKKwkJKmkgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ19TX0lOUFVUOiB7CisJCWludCAqaSA9IGFyZzsKKworCQlpZiAoKmkgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ19RVUVSWUNUUkw6IHsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpjID0gYXJnOworCisJCXN3aXRjaCAoYy0+aWQpIHsKKworCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQljLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjsKKwkJCXN0cmNweShjLT5uYW1lLCAiQnJpZ2h0bmVzcyIpOworCQkJYy0+bWluaW11bSA9IDA7CisJCQljLT5tYXhpbXVtID0gNjM7CisJCQljLT5zdGVwID0gMTsKKwkJCWMtPmRlZmF1bHRfdmFsdWUgPSAzMjsKKwkJCWMtPmZsYWdzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCWMtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOworCQkJc3RyY3B5KGMtPm5hbWUsICJIdWUiKTsKKwkJCWMtPm1pbmltdW0gPSAwOworCQkJYy0+bWF4aW11bSA9IDYzOworCQkJYy0+c3RlcCA9IDE7CisJCQljLT5kZWZhdWx0X3ZhbHVlID0gMzI7CisJCQljLT5mbGFncyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJCWMtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOworCQkJc3RyY3B5KGMtPm5hbWUsICJDb250cmFzdCIpOworCQkJYy0+bWluaW11bSA9IDA7CisJCQljLT5tYXhpbXVtID0gNjM7CisJCQljLT5zdGVwID0gMTsKKwkJCWMtPmRlZmF1bHRfdmFsdWUgPSAzMjsKKwkJCWMtPmZsYWdzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQljLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjsKKwkJCXN0cmNweShjLT5uYW1lLCAiU2F0dXJhdGlvbiIpOworCQkJYy0+bWluaW11bSA9IDA7CisJCQljLT5tYXhpbXVtID0gNjM7CisJCQljLT5zdGVwID0gMTsKKwkJCWMtPmRlZmF1bHRfdmFsdWUgPSAzMjsKKwkJCWMtPmZsYWdzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0FHQzoKKwkJCWMtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOworCQkJc3RyY3B5KGMtPm5hbWUsICJBZ2MiKTsKKwkJCWMtPm1pbmltdW0gPSAwOworCQkJYy0+bWF4aW11bSA9IDYzOworCQkJYy0+c3RlcCA9IDE7CisJCQljLT5kZWZhdWx0X3ZhbHVlID0gNDg7CisJCQljLT5mbGFncyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisJCQljLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjsKKwkJCXN0cmNweShjLT5uYW1lLCAiU2hhcnBuZXNzIik7CisJCQljLT5taW5pbXVtID0gMDsKKwkJCWMtPm1heGltdW0gPSA2MzsKKwkJCWMtPnN0ZXAgPSAxOworCQkJYy0+ZGVmYXVsdF92YWx1ZSA9IDMyOworCQkJYy0+ZmxhZ3MgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfUElDVFVSRToKKwkJCWMtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOworCQkJc3RyY3B5KGMtPm5hbWUsICJQaWN0dXJlIik7CisJCQljLT5taW5pbXVtID0gMDsKKwkJCWMtPm1heGltdW0gPSA2MzsKKwkJCWMtPnN0ZXAgPSAxOworCQkJYy0+ZGVmYXVsdF92YWx1ZSA9IDA7CisJCQljLT5mbGFncyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9KUEVHUVVBTDoKKwkJCWMtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOworCQkJc3RyY3B5KGMtPm5hbWUsICJKUEVHIHF1YWxpdHkiKTsKKwkJCWMtPm1pbmltdW0gPSAwOworCQkJYy0+bWF4aW11bSA9IDEwOworCQkJYy0+c3RlcCA9IDE7CisJCQljLT5kZWZhdWx0X3ZhbHVlID0gODsKKwkJCWMtPmZsYWdzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0ZSQU1FUkFURToKKwkJCWMtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOworCQkJc3RyY3B5KGMtPm5hbWUsICJGcmFtZXJhdGUiKTsKKwkJCWMtPm1pbmltdW0gPSAwOworCQkJYy0+bWF4aW11bSA9IDMxOworCQkJYy0+c3RlcCA9IDE7CisJCQljLT5kZWZhdWx0X3ZhbHVlID0gMDsKKwkJCWMtPmZsYWdzID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfU19DVFJMOiB7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmMgPSBhcmc7CisKKwkJZG93bigmbWV5ZS5sb2NrKTsKKwkJc3dpdGNoIChjLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQlzb255cGlfY2FtZXJhX2NvbW1hbmQoCisJCQkJU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQlJJR0hUTkVTUywgYy0+dmFsdWUpOworCQkJbWV5ZS5waWN0dXJlLmJyaWdodG5lc3MgPSBjLT52YWx1ZSA8PCAxMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCXNvbnlwaV9jYW1lcmFfY29tbWFuZCgKKwkJCQlTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFIVUUsIGMtPnZhbHVlKTsKKwkJCW1leWUucGljdHVyZS5odWUgPSBjLT52YWx1ZSA8PCAxMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJc29ueXBpX2NhbWVyYV9jb21tYW5kKAorCQkJCVNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTlRSQVNULCBjLT52YWx1ZSk7CisJCQltZXllLnBpY3R1cmUuY29udHJhc3QgPSBjLT52YWx1ZSA8PCAxMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQlzb255cGlfY2FtZXJhX2NvbW1hbmQoCisJCQkJU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQ09MT1IsIGMtPnZhbHVlKTsKKwkJCW1leWUucGljdHVyZS5jb2xvdXIgPSBjLT52YWx1ZSA8PCAxMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0FHQzoKKwkJCXNvbnlwaV9jYW1lcmFfY29tbWFuZCgKKwkJCQlTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFBR0MsIGMtPnZhbHVlKTsKKwkJCW1leWUucGFyYW1zLmFnYyA9IGMtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfU0hBUlBORVNTOgorCQkJc29ueXBpX2NhbWVyYV9jb21tYW5kKAorCQkJCVNPTllQSV9DT01NQU5EX1NFVENBTUVSQVNIQVJQTkVTUywgYy0+dmFsdWUpOworCQkJbWV5ZS5wYXJhbXMuc2hhcnBuZXNzID0gYy0+dmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9QSUNUVVJFOgorCQkJc29ueXBpX2NhbWVyYV9jb21tYW5kKAorCQkJCVNPTllQSV9DT01NQU5EX1NFVENBTUVSQVBJQ1RVUkUsIGMtPnZhbHVlKTsKKwkJCW1leWUucGFyYW1zLnBpY3R1cmUgPSBjLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0pQRUdRVUFMOgorCQkJbWV5ZS5wYXJhbXMucXVhbGl0eSA9IGMtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfRlJBTUVSQVRFOgorCQkJbWV5ZS5wYXJhbXMuZnJhbWVyYXRlID0gYy0+dmFsdWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVwKCZtZXllLmxvY2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJdXAoJm1leWUubG9jayk7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX0dfQ1RSTDogeworCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjID0gYXJnOworCisJCWRvd24oJm1leWUubG9jayk7CisJCXN3aXRjaCAoYy0+aWQpIHsKKwkJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQkJYy0+dmFsdWUgPSBtZXllLnBpY3R1cmUuYnJpZ2h0bmVzcyA+PiAxMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCWMtPnZhbHVlID0gbWV5ZS5waWN0dXJlLmh1ZSA+PiAxMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJYy0+dmFsdWUgPSBtZXllLnBpY3R1cmUuY29udHJhc3QgPj4gMTA7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQkJYy0+dmFsdWUgPSBtZXllLnBpY3R1cmUuY29sb3VyID4+IDEwOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfQUdDOgorCQkJYy0+dmFsdWUgPSBtZXllLnBhcmFtcy5hZ2M7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisJCQljLT52YWx1ZSA9IG1leWUucGFyYW1zLnNoYXJwbmVzczsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1BJQ1RVUkU6CisJCQljLT52YWx1ZSA9IG1leWUucGFyYW1zLnBpY3R1cmU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9KUEVHUVVBTDoKKwkJCWMtPnZhbHVlID0gbWV5ZS5wYXJhbXMucXVhbGl0eTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0ZSQU1FUkFURToKKwkJCWMtPnZhbHVlID0gbWV5ZS5wYXJhbXMuZnJhbWVyYXRlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1cCgmbWV5ZS5sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXVwKCZtZXllLmxvY2spOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ19FTlVNX0ZNVDogeworCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmID0gYXJnOworCisJCWlmIChmLT5pbmRleCA+IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmLT5pbmRleCA9PSAwKSB7CisJCQkvKiBzdGFuZGFyZCBZVVYgNDIyIGNhcHR1cmUgKi8KKwkJCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKKwkJCWYtPmluZGV4ID0gMDsKKwkJCWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCQlmLT5mbGFncyA9IDA7CisJCQlzdHJjcHkoZi0+ZGVzY3JpcHRpb24sICJZVVY0MjIiKTsKKwkJCWYtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVWVY7CisJCX0gZWxzZSB7CisJCQkvKiBjb21wcmVzc2VkIE1KUEVHIGNhcHR1cmUgKi8KKwkJCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKKwkJCWYtPmluZGV4ID0gMTsKKwkJCWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCQlmLT5mbGFncyA9IFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRDsKKwkJCXN0cmNweShmLT5kZXNjcmlwdGlvbiwgIk1KUEVHIik7CisJCQlmLT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NSlBFRzsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ19UUllfRk1UOiB7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZiA9IGFyZzsKKworCQlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX1lVWVYgJiYKKwkJICAgIGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX01KUEVHKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmLT5mbXQucGl4LmZpZWxkICE9IFY0TDJfRklFTERfQU5ZICYmCisJCSAgICBmLT5mbXQucGl4LmZpZWxkICE9IFY0TDJfRklFTERfTk9ORSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmLT5mbXQucGl4LmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQlpZiAoZi0+Zm10LnBpeC53aWR0aCA8PSAzMjApIHsKKwkJCWYtPmZtdC5waXgud2lkdGggPSAzMjA7CisJCQlmLT5mbXQucGl4LmhlaWdodCA9IDI0MDsKKwkJfSBlbHNlIHsKKwkJCWYtPmZtdC5waXgud2lkdGggPSA2NDA7CisJCQlmLT5mbXQucGl4LmhlaWdodCA9IDQ4MDsKKwkJfQorCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IGYtPmZtdC5waXgud2lkdGggKiAyOworCQlmLT5mbXQucGl4LnNpemVpbWFnZSA9IGYtPmZtdC5waXguaGVpZ2h0ICoKKwkJCQkgICAgICAgZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisJCWYtPmZtdC5waXguY29sb3JzcGFjZSA9IDA7CisJCWYtPmZtdC5waXgucHJpdiA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX0dfRk1UOiB7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZiA9IGFyZzsKKworCQlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVtc2V0KCZmLT5mbXQucGl4LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOworCQlmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQlzd2l0Y2ggKG1leWUubWNoaXBfbW9kZSkgeworCQljYXNlIE1DSElQX0hJQ19NT0RFX0NPTlRfT1VUOgorCQlkZWZhdWx0OgorCQkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9ZVVlWOworCQkJYnJlYWs7CisJCWNhc2UgTUNISVBfSElDX01PREVfQ09OVF9DT01QOgorCQkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NSlBFRzsKKwkJCWJyZWFrOworCQl9CisJCWYtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCWYtPmZtdC5waXgud2lkdGggPSBtY2hpcF9oc2l6ZSgpOworCQlmLT5mbXQucGl4LmhlaWdodCA9IG1jaGlwX3ZzaXplKCk7CisJCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gZi0+Zm10LnBpeC53aWR0aCAqIDI7CisJCWYtPmZtdC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC5oZWlnaHQgKgorCQkJCSAgICAgICBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKwkJZi0+Zm10LnBpeC5jb2xvcnNwYWNlID0gMDsKKwkJZi0+Zm10LnBpeC5wcml2ID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfU19GTVQ6IHsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOworCisJCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfWVVZViAmJgorCQkgICAgZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfTUpQRUcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGYtPmZtdC5waXguZmllbGQgIT0gVjRMMl9GSUVMRF9BTlkgJiYKKwkJICAgIGYtPmZtdC5waXguZmllbGQgIT0gVjRMMl9GSUVMRF9OT05FKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWYtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCWRvd24oJm1leWUubG9jayk7CisJCWlmIChmLT5mbXQucGl4LndpZHRoIDw9IDMyMCkgeworCQkJZi0+Zm10LnBpeC53aWR0aCA9IDMyMDsKKwkJCWYtPmZtdC5waXguaGVpZ2h0ID0gMjQwOworCQkJbWV5ZS5wYXJhbXMuc3Vic2FtcGxlID0gMTsKKwkJfSBlbHNlIHsKKwkJCWYtPmZtdC5waXgud2lkdGggPSA2NDA7CisJCQlmLT5mbXQucGl4LmhlaWdodCA9IDQ4MDsKKwkJCW1leWUucGFyYW1zLnN1YnNhbXBsZSA9IDA7CisJCX0KKwkJc3dpdGNoIChmLT5mbXQucGl4LnBpeGVsZm9ybWF0KSB7CisJCWNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6CisJCQltZXllLm1jaGlwX21vZGUgPSBNQ0hJUF9ISUNfTU9ERV9DT05UX09VVDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfUElYX0ZNVF9NSlBFRzoKKwkJCW1leWUubWNoaXBfbW9kZSA9IE1DSElQX0hJQ19NT0RFX0NPTlRfQ09NUDsKKwkJCWJyZWFrOworCQl9CisJCXVwKCZtZXllLmxvY2spOworCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IGYtPmZtdC5waXgud2lkdGggKiAyOworCQlmLT5mbXQucGl4LnNpemVpbWFnZSA9IGYtPmZtdC5waXguaGVpZ2h0ICoKKwkJCQkgICAgICAgZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisJCWYtPmZtdC5waXguY29sb3JzcGFjZSA9IDA7CisJCWYtPmZtdC5waXgucHJpdiA9IDA7CisKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfUkVRQlVGUzogeworCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxID0gYXJnOworCQlpbnQgaTsKKworCQlpZiAocmVxLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocmVxLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobWV5ZS5ncmFiX2ZidWZmZXIgJiYgcmVxLT5jb3VudCA9PSBnYnVmZmVycykgeworCQkJLyogYWxyZWFkeSBhbGxvY2F0ZWQsIG5vIG1vZGlmaWNhdGlvbnMgKi8KKwkJCWJyZWFrOworCQl9CisJCWRvd24oJm1leWUubG9jayk7CisJCWlmIChtZXllLmdyYWJfZmJ1ZmZlcikgeworCQkJZm9yIChpID0gMDsgaSA8IGdidWZmZXJzOyBpKyspCisJCQkJaWYgKG1leWUudm1hX3VzZV9jb3VudFtpXSkgeworCQkJCQl1cCgmbWV5ZS5sb2NrKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJcnZmcmVlKG1leWUuZ3JhYl9mYnVmZmVyLCBnYnVmZmVycyAqIGdidWZzaXplKTsKKwkJCW1leWUuZ3JhYl9mYnVmZmVyID0gTlVMTDsKKwkJfQorCQlnYnVmZmVycyA9IG1heCgyLCBtaW4oKGludClyZXEtPmNvdW50LCBNRVlFX01BWF9CVUZOQlJTKSk7CisJCXJlcS0+Y291bnQgPSBnYnVmZmVyczsKKwkJbWV5ZS5ncmFiX2ZidWZmZXIgPSBydm1hbGxvYyhnYnVmZmVycyAqIGdidWZzaXplKTsKKwkJaWYgKCFtZXllLmdyYWJfZmJ1ZmZlcikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtZXllOiB2NGwgZnJhbWVidWZmZXIgYWxsb2NhdGlvbiIKKwkJCQkJIiBmYWlsZWRcbiIpOworCQkJdXAoJm1leWUubG9jayk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgZ2J1ZmZlcnM7IGkrKykKKwkJCW1leWUudm1hX3VzZV9jb3VudFtpXSA9IDA7CisJCXVwKCZtZXllLmxvY2spOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ19RVUVSWUJVRjogeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKKwkJaW50IGluZGV4ID0gYnVmLT5pbmRleDsKKworCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGdidWZmZXJzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7CisJCWJ1Zi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJYnVmLT5pbmRleCA9IGluZGV4OworCQlidWYtPmJ5dGVzdXNlZCA9IG1leWUuZ3JhYl9idWZmZXJbaW5kZXhdLnNpemU7CisJCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKKwkJaWYgKG1leWUuZ3JhYl9idWZmZXJbaW5kZXhdLnN0YXRlID09IE1FWUVfQlVGX1VTSU5HKQorCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKKwkJaWYgKG1leWUuZ3JhYl9idWZmZXJbaW5kZXhdLnN0YXRlID09IE1FWUVfQlVGX0RPTkUpCisJCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKKwkJYnVmLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJYnVmLT50aW1lc3RhbXAgPSBtZXllLmdyYWJfYnVmZmVyW2luZGV4XS50aW1lc3RhbXA7CisJCWJ1Zi0+c2VxdWVuY2UgPSBtZXllLmdyYWJfYnVmZmVyW2luZGV4XS5zZXF1ZW5jZTsKKwkJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCQlidWYtPm0ub2Zmc2V0ID0gaW5kZXggKiBnYnVmc2l6ZTsKKwkJYnVmLT5sZW5ndGggPSBnYnVmc2l6ZTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfUUJVRjogeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKKworCQlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoYnVmLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoYnVmLT5pbmRleCA8IDAgfHwgYnVmLT5pbmRleCA+PSBnYnVmZmVycykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobWV5ZS5ncmFiX2J1ZmZlcltidWYtPmluZGV4XS5zdGF0ZSAhPSBNRVlFX0JVRl9VTlVTRUQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG93bigmbWV5ZS5sb2NrKTsKKwkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKKwkJYnVmLT5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19ET05FOworCQltZXllLmdyYWJfYnVmZmVyW2J1Zi0+aW5kZXhdLnN0YXRlID0gTUVZRV9CVUZfVVNJTkc7CisJCWtmaWZvX3B1dChtZXllLmdyYWJxLCAodW5zaWduZWQgY2hhciAqKSZidWYtPmluZGV4LCBzaXplb2YoaW50KSk7CisJCXVwKCZtZXllLmxvY2spOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ19EUUJVRjogeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKKwkJaW50IHJlcW5yOworCisJCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZG93bigmbWV5ZS5sb2NrKTsKKwkJaWYgKGtmaWZvX2xlbihtZXllLmRvbmVxKSA9PSAwICYmIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmbWV5ZS5sb2NrKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobWV5ZS5wcm9jX2xpc3QsCisJCQkJCSAgICAga2ZpZm9fbGVuKG1leWUuZG9uZXEpICE9IDApIDwgMCkgeworCQkJdXAoJm1leWUubG9jayk7CisJCQlyZXR1cm4gLUVJTlRSOworCQl9CisJCWlmICgha2ZpZm9fZ2V0KG1leWUuZG9uZXEsICh1bnNpZ25lZCBjaGFyICopJnJlcW5yLAorCQkJICAgICAgIHNpemVvZihpbnQpKSkgeworCQkJdXAoJm1leWUubG9jayk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWlmIChtZXllLmdyYWJfYnVmZmVyW3JlcW5yXS5zdGF0ZSAhPSBNRVlFX0JVRl9ET05FKSB7CisJCQl1cCgmbWV5ZS5sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJ1Zi0+aW5kZXggPSByZXFucjsKKwkJYnVmLT5ieXRlc3VzZWQgPSBtZXllLmdyYWJfYnVmZmVyW3JlcW5yXS5zaXplOworCQlidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7CisJCWJ1Zi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCWJ1Zi0+dGltZXN0YW1wID0gbWV5ZS5ncmFiX2J1ZmZlcltyZXFucl0udGltZXN0YW1wOworCQlidWYtPnNlcXVlbmNlID0gbWV5ZS5ncmFiX2J1ZmZlcltyZXFucl0uc2VxdWVuY2U7CisJCWJ1Zi0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKwkJYnVmLT5tLm9mZnNldCA9IHJlcW5yICogZ2J1ZnNpemU7CisJCWJ1Zi0+bGVuZ3RoID0gZ2J1ZnNpemU7CisJCW1leWUuZ3JhYl9idWZmZXJbcmVxbnJdLnN0YXRlID0gTUVZRV9CVUZfVU5VU0VEOworCQl1cCgmbWV5ZS5sb2NrKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfU1RSRUFNT046IHsKKwkJZG93bigmbWV5ZS5sb2NrKTsKKwkJc3dpdGNoIChtZXllLm1jaGlwX21vZGUpIHsKKwkJY2FzZSBNQ0hJUF9ISUNfTU9ERV9DT05UX09VVDoKKwkJCW1jaGlwX2NvbnRpbnVvdXNfc3RhcnQoKTsKKwkJCWJyZWFrOworCQljYXNlIE1DSElQX0hJQ19NT0RFX0NPTlRfQ09NUDoKKwkJCW1jaGlwX2NvbnRfY29tcHJlc3Npb25fc3RhcnQoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXAoJm1leWUubG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl1cCgmbWV5ZS5sb2NrKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOiB7CisJCWludCBpOworCisJCWRvd24oJm1leWUubG9jayk7CisJCW1jaGlwX2hpY19zdG9wKCk7CisJCWtmaWZvX3Jlc2V0KG1leWUuZ3JhYnEpOworCQlrZmlmb19yZXNldChtZXllLmRvbmVxKTsKKwkJZm9yIChpID0gMDsgaSA8IE1FWUVfTUFYX0JVRk5CUlM7IGkrKykKKwkJCW1leWUuZ3JhYl9idWZmZXJbaV0uc3RhdGUgPSBNRVlFX0JVRl9VTlVTRUQ7CisJCXVwKCZtZXllLmxvY2spOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFhYWCB3aGF0IGFib3V0IHByaXZhdGUgc25hcHNob3QgaW9jdGxzID8KKwkgKiBEbyB0aGV5IG5lZWQgdG8gYmUgY29udmVydGVkIHRvIFY0TDIgPworCSovCisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1leWVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgbWV5ZV9kb19pb2N0bCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWV5ZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXVuc2lnbmVkIGludCByZXMgPSAwOworCisJZG93bigmbWV5ZS5sb2NrKTsKKwlwb2xsX3dhaXQoZmlsZSwgJm1leWUucHJvY19saXN0LCB3YWl0KTsKKwlpZiAoa2ZpZm9fbGVuKG1leWUuZG9uZXEpKQorCQlyZXMgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCXVwKCZtZXllLmxvY2spOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIG1leWVfdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgaWR4ID0gKGludCl2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwltZXllLnZtYV91c2VfY291bnRbaWR4XSsrOworfQorCitzdGF0aWMgdm9pZCBtZXllX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWludCBpZHggPSAoaW50KXZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCW1leWUudm1hX3VzZV9jb3VudFtpZHhdLS07Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbWV5ZV92bV9vcHMgPSB7CisJLm9wZW4JCT0gbWV5ZV92bV9vcGVuLAorCS5jbG9zZQkJPSBtZXllX3ZtX2Nsb3NlLAorfTsKKworc3RhdGljIGludCBtZXllX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvczsKKworCWRvd24oJm1leWUubG9jayk7CisJaWYgKHNpemUgPiBnYnVmZmVycyAqIGdidWZzaXplKSB7CisJCXVwKCZtZXllLmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFtZXllLmdyYWJfZmJ1ZmZlcikgeworCQlpbnQgaTsKKworCQkvKiBsYXp5IGFsbG9jYXRpb24gKi8KKwkJbWV5ZS5ncmFiX2ZidWZmZXIgPSBydm1hbGxvYyhnYnVmZmVycypnYnVmc2l6ZSk7CisJCWlmICghbWV5ZS5ncmFiX2ZidWZmZXIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWV5ZTogdjRsIGZyYW1lYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCXVwKCZtZXllLmxvY2spOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGdidWZmZXJzOyBpKyspCisJCQltZXllLnZtYV91c2VfY291bnRbaV0gPSAwOworCX0KKwlwb3MgPSAodW5zaWduZWQgbG9uZyltZXllLmdyYWJfZmJ1ZmZlciArIG9mZnNldDsKKworCXdoaWxlIChzaXplID4gMCkgeworCQlwYWdlID0gdm1hbGxvY190b19wZm4oKHZvaWQgKilwb3MpOworCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsIHBhZ2UsIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKSB7CisJCQl1cCgmbWV5ZS5sb2NrKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJZWxzZQorCQkJc2l6ZSA9IDA7CisJfQorCisJdm1hLT52bV9vcHMgPSAmbWV5ZV92bV9vcHM7CisJdm1hLT52bV9mbGFncyAmPSB+Vk1fSU87CS8qIG5vdCBJL08gbWVtb3J5ICovCisJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsJLyogYXZvaWQgdG8gc3dhcCBvdXQgdGhpcyBWTUEgKi8KKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9ICh2b2lkICopIChvZmZzZXQgLyBnYnVmc2l6ZSk7CisJbWV5ZV92bV9vcGVuKHZtYSk7CisKKwl1cCgmbWV5ZS5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWV5ZV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBtZXllX29wZW4sCisJLnJlbGVhc2UJPSBtZXllX3JlbGVhc2UsCisJLm1tYXAJCT0gbWV5ZV9tbWFwLAorCS5pb2N0bAkJPSBtZXllX2lvY3RsLAorCS5wb2xsCQk9IG1leWVfcG9sbCwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIG1leWVfdGVtcGxhdGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJtZXllIiwKKwkudHlwZQkJPSBWSURfVFlQRV9DQVBUVVJFLAorCS5oYXJkd2FyZQk9IFZJRF9IQVJEV0FSRV9NRVlFLAorCS5mb3BzCQk9ICZtZXllX2ZvcHMsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKwkubWlub3IJCT0gLTEsCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG1leWVfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQoreworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCW1leWUucG1fbWNoaXBfbW9kZSA9IG1leWUubWNoaXBfbW9kZTsKKwltY2hpcF9oaWNfc3RvcCgpOworCW1jaGlwX3NldChNQ0hJUF9NTV9JTlRBLCAweDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1leWVfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV93cml0ZV9jb25maWdfd29yZChtZXllLm1jaGlwX2RldiwgTUNISVBfUENJX1NPRlRSRVNFVF9TRVQsIDEpOworCisJbWNoaXBfZGVsYXkoTUNISVBfSElDX0NNRCwgMCk7CisJbWNoaXBfZGVsYXkoTUNISVBfSElDX1NUQVRVUywgTUNISVBfSElDX1NUQVRVU19JRExFKTsKKwltc2xlZXAoMSk7CisJbWNoaXBfc2V0KE1DSElQX1ZSSl9TT0ZUX1JFU0VULCAxKTsKKwltc2xlZXAoMSk7CisJbWNoaXBfc2V0KE1DSElQX01NX1BDSV9NT0RFLCA1KTsKKwltc2xlZXAoMSk7CisJbWNoaXBfc2V0KE1DSElQX01NX0lOVEEsIE1DSElQX01NX0lOVEFfSElDXzFfTUFTSyk7CisKKwlzd2l0Y2ggKG1leWUucG1fbWNoaXBfbW9kZSkgeworCWNhc2UgTUNISVBfSElDX01PREVfQ09OVF9PVVQ6CisJCW1jaGlwX2NvbnRpbnVvdXNfc3RhcnQoKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0hJUF9ISUNfTU9ERV9DT05UX0NPTVA6CisJCW1jaGlwX2NvbnRfY29tcHJlc3Npb25fc3RhcnQoKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1leWVfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCByZXQgPSAtRUJVU1k7CisJdW5zaWduZWQgbG9uZyBtY2hpcF9hZHI7CisJdTggcmV2aXNpb247CisKKwlpZiAobWV5ZS5tY2hpcF9kZXYgIT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1leWU6IG9ubHkgb25lIGRldmljZSBhbGxvd2VkIVxuIik7CisJCWdvdG8gb3V0bm90ZGV2OworCX0KKworCW1leWUubWNoaXBfZGV2ID0gcGNpZGV2OworCW1leWUudmlkZW9fZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKCFtZXllLnZpZGVvX2RldikgeworCQlwcmludGsoS0VSTl9FUlIgIm1leWU6IHZpZGVvX2RldmljZV9hbGxvYygpIGZhaWxlZCFcbiIpOworCQlnb3RvIG91dG5vdGRldjsKKwl9CisKKwlyZXQgPSAtRU5PTUVNOworCW1leWUuZ3JhYl90ZW1wID0gdm1hbGxvYyhNQ0hJUF9OQl9QQUdFU19NSlBFRyAqIFBBR0VfU0laRSk7CisJaWYgKCFtZXllLmdyYWJfdGVtcCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1leWU6IGdyYWIgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBvdXR2bWFsbG9jOworCX0KKworCXNwaW5fbG9ja19pbml0KCZtZXllLmdyYWJxX2xvY2spOworCW1leWUuZ3JhYnEgPSBrZmlmb19hbGxvYyhzaXplb2YoaW50KSAqIE1FWUVfTUFYX0JVRk5CUlMsIEdGUF9LRVJORUwsCisJCQkJICZtZXllLmdyYWJxX2xvY2spOworCWlmIChJU19FUlIobWV5ZS5ncmFicSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXllOiBmaWZvIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBvdXRrZmlmb2FsbG9jMTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJm1leWUuZG9uZXFfbG9jayk7CisJbWV5ZS5kb25lcSA9IGtmaWZvX2FsbG9jKHNpemVvZihpbnQpICogTUVZRV9NQVhfQlVGTkJSUywgR0ZQX0tFUk5FTCwKKwkJCQkgJm1leWUuZG9uZXFfbG9jayk7CisJaWYgKElTX0VSUihtZXllLmRvbmVxKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1leWU6IGZpZm8gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIG91dGtmaWZvYWxsb2MyOworCX0KKworCW1lbWNweShtZXllLnZpZGVvX2RldiwgJm1leWVfdGVtcGxhdGUsIHNpemVvZihtZXllX3RlbXBsYXRlKSk7CisJbWV5ZS52aWRlb19kZXYtPmRldiA9ICZtZXllLm1jaGlwX2Rldi0+ZGV2OworCisJaWYgKChyZXQgPSBzb255cGlfY2FtZXJhX2NvbW1hbmQoU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBLCAxKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXllOiB1bmFibGUgdG8gcG93ZXIgb24gdGhlIGNhbWVyYVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAibWV5ZTogZGlkIHlvdSBlbmFibGUgdGhlIGNhbWVyYSBpbiAiCisJCQkJInNvbnlwaSB1c2luZyB0aGUgbW9kdWxlIG9wdGlvbnMgP1xuIik7CisJCWdvdG8gb3V0c29ueXBpZW5hYmxlOworCX0KKworCXJldCA9IC1FSU87CisJaWYgKChyZXQgPSBwY2lfZW5hYmxlX2RldmljZShtZXllLm1jaGlwX2RldikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWV5ZTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRlbmFibGVkZXY7CisJfQorCisJbWNoaXBfYWRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KG1leWUubWNoaXBfZGV2LDApOworCWlmICghbWNoaXBfYWRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWV5ZTogbWNoaXAgaGFzIG5vIGRldmljZSBiYXNlIGFkZHJlc3NcbiIpOworCQlnb3RvIG91dHJlZ2lvbnM7CisJfQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChtZXllLm1jaGlwX2RldiwgMCksCisJCQkJcGNpX3Jlc291cmNlX2xlbihtZXllLm1jaGlwX2RldiwgMCksCisJCQkJIm1leWUiKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1leWU6IHJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWRcbiIpOworCQlnb3RvIG91dHJlZ2lvbnM7CisJfQorCW1leWUubWNoaXBfbW1yZWdzID0gaW9yZW1hcChtY2hpcF9hZHIsIE1DSElQX01NX1JFR1MpOworCWlmICghbWV5ZS5tY2hpcF9tbXJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXllOiBpb3JlbWFwIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0cmVtYXA7CisJfQorCisJbWV5ZS5tY2hpcF9pcnEgPSBwY2lkZXYtPmlycTsKKwlpZiAocmVxdWVzdF9pcnEobWV5ZS5tY2hpcF9pcnEsIG1leWVfaXJxLAorCQkJU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsICJtZXllIiwgbWV5ZV9pcnEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWV5ZTogcmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRyZXFpcnE7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUobWV5ZS5tY2hpcF9kZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldmlzaW9uKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUobWV5ZS5tY2hpcF9kZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIDgpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShtZXllLm1jaGlwX2RldiwgUENJX0xBVEVOQ1lfVElNRVIsIDY0KTsKKworCXBjaV9zZXRfbWFzdGVyKG1leWUubWNoaXBfZGV2KTsKKworCS8qIEFzayB0aGUgY2FtZXJhIHRvIHBlcmZvcm0gYSBzb2Z0IHJlc2V0LiAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChtZXllLm1jaGlwX2RldiwgTUNISVBfUENJX1NPRlRSRVNFVF9TRVQsIDEpOworCisJbWNoaXBfZGVsYXkoTUNISVBfSElDX0NNRCwgMCk7CisJbWNoaXBfZGVsYXkoTUNISVBfSElDX1NUQVRVUywgTUNISVBfSElDX1NUQVRVU19JRExFKTsKKworCW1zbGVlcCgxKTsKKwltY2hpcF9zZXQoTUNISVBfVlJKX1NPRlRfUkVTRVQsIDEpOworCisJbXNsZWVwKDEpOworCW1jaGlwX3NldChNQ0hJUF9NTV9QQ0lfTU9ERSwgNSk7CisKKwltc2xlZXAoMSk7CisJbWNoaXBfc2V0KE1DSElQX01NX0lOVEEsIE1DSElQX01NX0lOVEFfSElDXzFfTUFTSyk7CisKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKG1leWUudmlkZW9fZGV2LCBWRkxfVFlQRV9HUkFCQkVSLAorCQkJCSAgdmlkZW9fbnIpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1leWU6IHZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWRcbiIpOworCQlnb3RvIG91dHZpZGVvcmVnOworCX0KKworCWluaXRfTVVURVgoJm1leWUubG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWV5ZS5wcm9jX2xpc3QpOworCW1leWUucGljdHVyZS5kZXB0aCA9IDE2OworCW1leWUucGljdHVyZS5wYWxldHRlID0gVklERU9fUEFMRVRURV9ZVVY0MjI7CisJbWV5ZS5waWN0dXJlLmJyaWdodG5lc3MgPSAzMiA8PCAxMDsKKwltZXllLnBpY3R1cmUuaHVlID0gMzIgPDwgMTA7CisJbWV5ZS5waWN0dXJlLmNvbG91ciA9IDMyIDw8IDEwOworCW1leWUucGljdHVyZS5jb250cmFzdCA9IDMyIDw8IDEwOworCW1leWUucGljdHVyZS53aGl0ZW5lc3MgPSAwOworCW1leWUucGFyYW1zLnN1YnNhbXBsZSA9IDA7CisJbWV5ZS5wYXJhbXMucXVhbGl0eSA9IDg7CisJbWV5ZS5wYXJhbXMuc2hhcnBuZXNzID0gMzI7CisJbWV5ZS5wYXJhbXMuYWdjID0gNDg7CisJbWV5ZS5wYXJhbXMucGljdHVyZSA9IDA7CisJbWV5ZS5wYXJhbXMuZnJhbWVyYXRlID0gMDsKKworCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFCUklHSFRORVNTLCAzMik7CisJc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUhVRSwgMzIpOworCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT0xPUiwgMzIpOworCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT05UUkFTVCwgMzIpOworCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFTSEFSUE5FU1MsIDMyKTsKKwlzb255cGlfY2FtZXJhX2NvbW1hbmQoU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBUElDVFVSRSwgMCk7CisJc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUFHQywgNDgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAibWV5ZTogTW90aW9uIEV5ZSBDYW1lcmEgRHJpdmVyIHYlcy5cbiIsCisJICAgICAgIE1FWUVfRFJJVkVSX1ZFUlNJT04pOworCXByaW50ayhLRVJOX0lORk8gIm1leWU6IG1jaGlwIEtMNUE3MjAwMiByZXYuICVkLCBiYXNlICVseCwgaXJxICVkXG4iLAorCSAgICAgICByZXZpc2lvbiwgbWNoaXBfYWRyLCBtZXllLm1jaGlwX2lycSk7CisKKwlyZXR1cm4gMDsKKworb3V0dmlkZW9yZWc6CisJZnJlZV9pcnEobWV5ZS5tY2hpcF9pcnEsIG1leWVfaXJxKTsKK291dHJlcWlycToKKwlpb3VubWFwKG1leWUubWNoaXBfbW1yZWdzKTsKK291dHJlbWFwOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQobWV5ZS5tY2hpcF9kZXYsIDApLAorCQkJICAgcGNpX3Jlc291cmNlX2xlbihtZXllLm1jaGlwX2RldiwgMCkpOworb3V0cmVnaW9uczoKKwlwY2lfZGlzYWJsZV9kZXZpY2UobWV5ZS5tY2hpcF9kZXYpOworb3V0ZW5hYmxlZGV2OgorCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkEsIDApOworb3V0c29ueXBpZW5hYmxlOgorCWtmaWZvX2ZyZWUobWV5ZS5kb25lcSk7CitvdXRrZmlmb2FsbG9jMjoKKwlrZmlmb19mcmVlKG1leWUuZ3JhYnEpOworb3V0a2ZpZm9hbGxvYzE6CisJdmZyZWUobWV5ZS5ncmFiX3RlbXApOworb3V0dm1hbGxvYzoKKwl2aWRlb19kZXZpY2VfcmVsZWFzZShtZXllLnZpZGVvX2Rldik7CitvdXRub3RkZXY6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG1leWVfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UobWV5ZS52aWRlb19kZXYpOworCisJbWNoaXBfaGljX3N0b3AoKTsKKworCW1jaGlwX2RtYV9mcmVlKCk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwltY2hpcF9zZXQoTUNISVBfTU1fSU5UQSwgMHgwKTsKKworCWZyZWVfaXJxKG1leWUubWNoaXBfaXJxLCBtZXllX2lycSk7CisKKwlpb3VubWFwKG1leWUubWNoaXBfbW1yZWdzKTsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQobWV5ZS5tY2hpcF9kZXYsIDApLAorCQkJICAgcGNpX3Jlc291cmNlX2xlbihtZXllLm1jaGlwX2RldiwgMCkpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKG1leWUubWNoaXBfZGV2KTsKKworCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkEsIDApOworCisJa2ZpZm9fZnJlZShtZXllLmRvbmVxKTsKKwlrZmlmb19mcmVlKG1leWUuZ3JhYnEpOworCisJdmZyZWUobWV5ZS5ncmFiX3RlbXApOworCisJaWYgKG1leWUuZ3JhYl9mYnVmZmVyKSB7CisJCXJ2ZnJlZShtZXllLmdyYWJfZmJ1ZmZlciwgZ2J1ZmZlcnMqZ2J1ZnNpemUpOworCQltZXllLmdyYWJfZmJ1ZmZlciA9IE5VTEw7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAibWV5ZTogcmVtb3ZlZFxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtZXllX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfS0FXQVNBS0ksIFBDSV9ERVZJQ0VfSURfTUNISVBfS0w1QTcyMDAyLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1leWVfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtZXllX2RyaXZlciA9IHsKKwkubmFtZQkJPSAibWV5ZSIsCisJLmlkX3RhYmxlCT0gbWV5ZV9wY2lfdGJsLAorCS5wcm9iZQkJPSBtZXllX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobWV5ZV9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gbWV5ZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gbWV5ZV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1leWVfaW5pdCh2b2lkKQoreworCWdidWZmZXJzID0gbWF4KDIsIG1pbigoaW50KWdidWZmZXJzLCBNRVlFX01BWF9CVUZOQlJTKSk7CisJaWYgKGdidWZzaXplIDwgMCB8fCBnYnVmc2l6ZSA+IE1FWUVfTUFYX0JVRlNJWkUpCisJCWdidWZzaXplID0gTUVZRV9NQVhfQlVGU0laRTsKKwlnYnVmc2l6ZSA9IFBBR0VfQUxJR04oZ2J1ZnNpemUpOworCXByaW50ayhLRVJOX0lORk8gIm1leWU6IHVzaW5nICVkIGJ1ZmZlcnMgd2l0aCAlZGsgKCVkayB0b3RhbCkiCisJCQkgImZvciBjYXB0dXJlXG4iLAorCQkJIGdidWZmZXJzLAorCQkJIGdidWZzaXplIC8gMTAyNCwgZ2J1ZmZlcnMgKiBnYnVmc2l6ZSAvIDEwMjQpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZtZXllX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZXllX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm1leWVfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobWV5ZV9pbml0KTsKK21vZHVsZV9leGl0KG1leWVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Y2Q4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuaApAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIE1vdGlvbiBFeWUgdmlkZW80bGludXggZHJpdmVyIGZvciBTb255IFZhaW8gUGljdHVyZUJvb2sKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEFsY/R2ZSA8d3d3LmFsY292ZS5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIEFuZHJldyBUcmlkZ2VsbCA8dHJpZGdlQHZhbGludXguY29tPgorICoKKyAqIEVhcmxpZXIgd29yayBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIFBhdWwgYFJ1c3R5JyBSdXNzZWxsIGFuZCBQYXVsIE1hY2tlcnJhcy4KKyAqCisgKiBTb21lIHBhcnRzIGJvcnJvd2VkIGZyb20gdmFyaW91cyB2aWRlbzRsaW51eCBkcml2ZXJzLCBlc3BlY2lhbGx5CisgKiBidHR2LWRyaXZlci5jIGFuZCB6b3Jhbi5jLCBzZWUgb3JpZ2luYWwgZmlsZXMgZm9yIGNyZWRpdHMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUVZRV9QUklWX0hfCisjZGVmaW5lIF9NRVlFX1BSSVZfSF8KKworI2RlZmluZSBNRVlFX0RSSVZFUl9NQUpPUlZFUlNJT04JIDEKKyNkZWZpbmUgTUVZRV9EUklWRVJfTUlOT1JWRVJTSU9OCTEzCisKKyNkZWZpbmUgTUVZRV9EUklWRVJfVkVSU0lPTiBfX3N0cmluZ2lmeShNRVlFX0RSSVZFUl9NQUpPUlZFUlNJT04pICIuIiBcCisJCQkgICAgX19zdHJpbmdpZnkoTUVZRV9EUklWRVJfTUlOT1JWRVJTSU9OKQorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vdGlvbiBKUEVHIGNoaXAgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1vdGlvbiBKUEVHIGNoaXAgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisjZGVmaW5lIE1DSElQX1BDSV9QT1dFUl9DU1IJCTB4NTQKKyNkZWZpbmUgTUNISVBfUENJX01DT1JFX1NUQVRVUwkJMHg2MAkJLyogc2VlIEhJQ19TVEFUVVMgICAqLworI2RlZmluZSBNQ0hJUF9QQ0lfSE9TVFVTRVJFUV9TRVQJMHg2NAorI2RlZmluZSBNQ0hJUF9QQ0lfSE9TVFVTRVJFUV9DTFIJMHg2OAorI2RlZmluZSBNQ0hJUF9QQ0lfTE9XUE9XRVJfU0VUCQkweDZjCisjZGVmaW5lIE1DSElQX1BDSV9MT1dQT1dFUl9DTFIJCTB4NzAKKyNkZWZpbmUgTUNISVBfUENJX1NPRlRSRVNFVF9TRVQJCTB4NzQKKworLyogTW90aW9uIEpQRUcgY2hpcCBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBNQ0hJUF9NTV9SRUdTCQkJMHgyMDAJCS8qIDUxMiBieXRlcyAgICAgICAgKi8KKyNkZWZpbmUgTUNISVBfUkVHX1RJTUVPVVQJCTEwMDAJCS8qIHJlZyBhY2Nlc3MsIH51cyAgKi8KKyNkZWZpbmUgTUNISVBfTUNDX1ZSSl9USU1FT1VUCQkxMDAwCQkvKiBNQ0MgJiBWUkogYWNjZXNzICovCisKKyNkZWZpbmUgTUNISVBfTU1fUENJX01PREUJCTB4MDAJCS8qIFBDSSBhY2Nlc3MgbW9kZSAqLworI2RlZmluZSBNQ0hJUF9NTV9QQ0lfTU9ERV9SRVRSWQkJMHgwMDAwMDAwMQkvKiByZXRyeSBtb2RlICovCisjZGVmaW5lIE1DSElQX01NX1BDSV9NT0RFX01BU1RFUgkweDAwMDAwMDAyCS8qIG1hc3RlciBhY2Nlc3MgKi8KKyNkZWZpbmUgTUNISVBfTU1fUENJX01PREVfUkVBRF9MSU5FCTB4MDAwMDAwMDQJLyogcmVhZCBsaW5lICovCisKKyNkZWZpbmUgTUNISVBfTU1fSU5UQQkJCTB4MDQJCS8qIEludCBzdGF0dXMvbWFzayAqLworI2RlZmluZSBNQ0hJUF9NTV9JTlRBX01DQwkJMHgwMDAwMDAwMQkvKiBNQ0MgaW50ZXJydXB0ICovCisjZGVmaW5lIE1DSElQX01NX0lOVEFfVlJKCQkweDAwMDAwMDAyCS8qIFZSSiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTUNISVBfTU1fSU5UQV9ISUNfMQkJMHgwMDAwMDAwNAkvKiBvbmUgZnJhbWUgZG9uZSAqLworI2RlZmluZSBNQ0hJUF9NTV9JTlRBX0hJQ18xX01BU0sJMHgwMDAwMDQwMAkvKiAxOiBlbmFibGUgKi8KKyNkZWZpbmUgTUNISVBfTU1fSU5UQV9ISUNfRU5ECQkweDAwMDAwMDA4CS8qIGFsbCBmcmFtZXMgZG9uZSAqLworI2RlZmluZSBNQ0hJUF9NTV9JTlRBX0hJQ19FTkRfTUFTSwkweDAwMDAwODAwCisjZGVmaW5lIE1DSElQX01NX0lOVEFfSlBFRwkJMHgwMDAwMDAxMAkvKiBkZWNvbXByZXNzLiBlcnJvciAqLworI2RlZmluZSBNQ0hJUF9NTV9JTlRBX0pQRUdfTUFTSwkJMHgwMDAwMTAwMAorI2RlZmluZSBNQ0hJUF9NTV9JTlRBX0NBUFRVUkUJCTB4MDAwMDAwMjAJLyogY2FwdHVyZSBlbmQgKi8KKyNkZWZpbmUgTUNISVBfTU1fSU5UQV9QQ0lfRVJSCQkweDAwMDAwMDQwCS8qIFBDSSBlcnJvciAqLworI2RlZmluZSBNQ0hJUF9NTV9JTlRBX1BDSV9FUlJfTUFTSwkweDAwMDA0MDAwCisKKyNkZWZpbmUgTUNISVBfTU1fUFRfQUREUgkJMHgwOAkJLyogcGFnZSB0YWJsZSBhZGRyZXNzKi8KKwkJCQkJCQkvKiBuKjRrQiAqLworI2RlZmluZSBNQ0hJUF9OQl9QQUdFUwkJCTEwMjQJCS8qIHBhZ2VzIGZvciBkaXNwbGF5ICovCisjZGVmaW5lIE1DSElQX05CX1BBR0VTX01KUEVHCQkyNTYJCS8qIHBhZ2VzIGZvciBtanBlZyAqLworCisjZGVmaW5lIE1DSElQX01NX0ZJUihuKQkJCSgweDBjKyhuKSo0KQkvKiBGcmFtZSBpbmZvIDAtMyAqLworI2RlZmluZSBNQ0hJUF9NTV9GSVJfUkRZCQkweDAwMDAwMDAxCS8qIGZyYW1lIHJlYWR5ICovCisjZGVmaW5lIE1DSElQX01NX0ZJUl9GQUlMRlJfTUFTSwkweGY4MDAwMDAwCS8qICMgb2YgZmFpbGVkIGZyYW1lcyAqLworI2RlZmluZSBNQ0hJUF9NTV9GSVJfRkFJTEZSX1NISUZUCTI3CisKKwkvKiBjb250aW51b3VzIGNvbXAvZGVjb21wIG1vZGUgKi8KKyNkZWZpbmUgTUNISVBfTU1fRklSX0NfRU5ETF9NQVNLCTB4MDAwMDA3ZmUJLyogZW5kIERXIFsxMF0gKi8KKyNkZWZpbmUgTUNISVBfTU1fRklSX0NfRU5ETF9TSElGVAkxCisjZGVmaW5lIE1DSElQX01NX0ZJUl9DX0VORFBfTUFTSwkweDAwMDdmODAwCS8qIGVuZCBwYWdlIFs4XSAqLworI2RlZmluZSBNQ0hJUF9NTV9GSVJfQ19FTkRQX1NISUZUCTExCisjZGVmaW5lIE1DSElQX01NX0ZJUl9DX1NUQVJUUF9NQVNLCTB4MDdmODAwMDAJLyogc3RhcnQgcGFnZSBbOF0gKi8KKyNkZWZpbmUgTUNISVBfTU1fRklSX0NfU1RBUlRQX1NISUZUCTE5CisKKwkvKiBjb250aW51b3VzIHBpY3R1cmUgb3V0cHV0IG1vZGUgKi8KKyNkZWZpbmUgTUNISVBfTU1fRklSX09fU1RBUlRQX01BU0sJMHg3ZmZlMDAwMAkvKiBzdGFydCBwYWdlIFsxMF0gKi8KKyNkZWZpbmUgTUNISVBfTU1fRklSX09fU1RBUlRQX1NISUZUCTE3CisKKyNkZWZpbmUgTUNISVBfTU1fRklGT19EQVRBCQkweDFjCQkvKiBQQ0kgVEdUIEZJRk8gZGF0YSAqLworI2RlZmluZSBNQ0hJUF9NTV9GSUZPX1NUQVRVUwkJMHgyMAkJLyogUENJIFRHVCBGSUZPIHN0YXQgKi8KKyNkZWZpbmUgTUNISVBfTU1fRklGT19NQVNLCQkweDAwMDAwMDAzCisjZGVmaW5lIE1DSElQX01NX0ZJRk9fV0FJVF9PUl9SRUFEWQkweDAwMDAwMDAyICAgICAgLyogQml0cyBjb21tb24gdG8gV0FJVCAmIFJFQURZKi8KKyNkZWZpbmUgTUNISVBfTU1fRklGT19JRExFCQkweDAJCS8qIEhJQyBpZGxlICovCisjZGVmaW5lIE1DSElQX01NX0ZJRk9fSURMRTEJCTB4MQkJLyogaWRlbSA/Pz8gKi8KKyNkZWZpbmUJTUNISVBfTU1fRklGT19XQUlUCQkweDIJCS8qIHdhaXQgcmVxdWVzdCAqLworI2RlZmluZSBNQ0hJUF9NTV9GSUZPX1JFQURZCQkweDMJCS8qIGRhdGEgcmVhZHkgKi8KKworI2RlZmluZSBNQ0hJUF9ISUNfSE9TVF9VU0VSRVEJCTB4NDAJCS8qIGhvc3QgdXNlcyBNQ09SRSAqLworCisjZGVmaW5lIE1DSElQX0hJQ19UUF9CVVNZCQkweDQ0CQkvKiB0YWtpbmcgcGljdHVyZSAqLworCisjZGVmaW5lIE1DSElQX0hJQ19QSUNfU0FWRUQJCTB4NDgJCS8qIHBpYyBpbiBTRFJBTSAqLworCisjZGVmaW5lIE1DSElQX0hJQ19MT1dQT1dFUgkJMHg0YwkJLyogY2xvY2sgc3RvcHBlZCAqLworCisjZGVmaW5lIE1DSElQX0hJQ19DVEwJCQkweDUwCQkvKiBISUMgY29udHJvbCAqLworI2RlZmluZSBNQ0hJUF9ISUNfQ1RMX1NPRlRfUkVTRVQJMHgwMDAwMDAwMQkvKiBNQ09SRSByZXNldCAqLworI2RlZmluZSBNQ0hJUF9ISUNfQ1RMX01DT1JFX1JEWQkJMHgwMDAwMDAwMgkvKiBNQ09SRSByZWFkeSAqLworCisjZGVmaW5lIE1DSElQX0hJQ19DTUQJCQkweDU0CQkvKiBISUMgY29tbWFuZCAqLworI2RlZmluZSBNQ0hJUF9ISUNfQ01EX0JJVFMJCTB4MDAwMDAwMDMgICAgICAvKiBjbWQgd2lkdGg9WzE6MF0qLworI2RlZmluZSBNQ0hJUF9ISUNfQ01EX05PT1AJCTB4MAorI2RlZmluZSBNQ0hJUF9ISUNfQ01EX1NUQVJUCQkweDEKKyNkZWZpbmUgTUNISVBfSElDX0NNRF9TVE9QCQkweDIKKworI2RlZmluZSBNQ0hJUF9ISUNfTU9ERQkJCTB4NTgKKyNkZWZpbmUgTUNISVBfSElDX01PREVfTk9PUAkJMHgwCisjZGVmaW5lIE1DSElQX0hJQ19NT0RFX1NUSUxMX0NBUAkweDEJCS8qIHN0aWxsIHBpYyBjYXB0ICovCisjZGVmaW5lIE1DSElQX0hJQ19NT0RFX0RJU1BMQVkJCTB4MgkJLyogZGlzcGxheSAqLworI2RlZmluZSBNQ0hJUF9ISUNfTU9ERV9TVElMTF9DT01QCTB4MwkJLyogc3RpbGwgcGljIGNvbXAuICovCisjZGVmaW5lIE1DSElQX0hJQ19NT0RFX1NUSUxMX0RFQ09NUAkweDQJCS8qIHN0aWxsIHBpYyBkZWNvbXAuICovCisjZGVmaW5lIE1DSElQX0hJQ19NT0RFX0NPTlRfQ09NUAkweDUJCS8qIGNvbnQgY2FwdCtjb21wICovCisjZGVmaW5lIE1DSElQX0hJQ19NT0RFX0NPTlRfREVDT01QCTB4NgkJLyogY29udCBkZWNvbXArZGlzcCAqLworI2RlZmluZSBNQ0hJUF9ISUNfTU9ERV9TVElMTF9PVVQJMHg3CQkvKiBzdGlsbCBwaWMgb3V0cHV0ICovCisjZGVmaW5lIE1DSElQX0hJQ19NT0RFX0NPTlRfT1VUCQkweDgJCS8qIGNvbnQgb3V0cHV0ICovCisKKyNkZWZpbmUgTUNISVBfSElDX1NUQVRVUwkJMHg1YworI2RlZmluZSBNQ0hJUF9ISUNfU1RBVFVTX01DQ19SRFkJMHgwMDAwMDAwMQkvKiBNQ0MgcmVnIGFjYyBvayAqLworI2RlZmluZSBNQ0hJUF9ISUNfU1RBVFVTX1ZSSl9SRFkJMHgwMDAwMDAwMgkvKiBWUkogcmVnIGFjYyBvayAqLworI2RlZmluZSBNQ0hJUF9ISUNfU1RBVFVTX0lETEUgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgTUNISVBfSElDX1NUQVRVU19DQVBESVMJCTB4MDAwMDAwMDQJLyogY2FwL2Rpc3AgaW4gcHJvZyAqLworI2RlZmluZSBNQ0hJUF9ISUNfU1RBVFVTX0NPTVBERUMJMHgwMDAwMDAwOAkvKiAoZGUpY29tcCBpbiBwcm9nICovCisjZGVmaW5lIE1DSElQX0hJQ19TVEFUVVNfQlVTWQkJMHgwMDAwMDAxMAkvKiBISUMgYnVzeSAqLworCisjZGVmaW5lIE1DSElQX0hJQ19TX1JBVEUJCTB4NjAJCS8qIE1KUEVHICMgZnJhbWVzICovCisKKyNkZWZpbmUgTUNISVBfSElDX1BDSV9WRk1UCQkweDY0CQkvKiB2aWRlbyBmb3JtYXQgKi8KKyNkZWZpbmUgTUNISVBfSElDX1BDSV9WRk1UX1lWWVUJCTB4MDAwMDAwMDEJLyogMDogViBZJyBVIFkgKi8KKwkJCQkJCQkvKiAxOiBZJyBWIFkgVSAqLworCisjZGVmaW5lIE1DSElQX01DQ19DTUQJCQkweDgwCQkvKiBNQ0MgY29tbWFuZHMgKi8KKyNkZWZpbmUgTUNISVBfTUNDX0NNRF9JTklUSUFMCQkweDAJCS8qIGlkbGUgPyAqLworI2RlZmluZSBNQ0hJUF9NQ0NfQ01EX0lJQ19TVEFSVF9TRVQJMHgxCisjZGVmaW5lIE1DSElQX01DQ19DTURfSUlDX0VORF9TRVQJMHgyCisjZGVmaW5lIE1DSElQX01DQ19DTURfRk1fV1JJVEUJCTB4MwkJLyogZnJhbWUgbWVtb3J5ICovCisjZGVmaW5lIE1DSElQX01DQ19DTURfRk1fUkVBRAkJMHg0CisjZGVmaW5lIE1DSElQX01DQ19DTURfRk1fU1RPUAkJMHg1CisjZGVmaW5lIE1DSElQX01DQ19DTURfQ0FQVFVSRQkJMHg2CisjZGVmaW5lIE1DSElQX01DQ19DTURfRElTUExBWQkJMHg3CisjZGVmaW5lIE1DSElQX01DQ19DTURfRU5EX0RJU1AJCTB4OAorI2RlZmluZSBNQ0hJUF9NQ0NfQ01EX1NUSUxMX0NPTVAJMHg5CisjZGVmaW5lIE1DSElQX01DQ19DTURfU1RJTExfREVDT01QCTB4YQorI2RlZmluZSBNQ0hJUF9NQ0NfQ01EX1NUSUxMX09VVFBVVAkweGIKKyNkZWZpbmUgTUNISVBfTUNDX0NNRF9DT05UX09VVFBVVAkweGMKKyNkZWZpbmUgTUNISVBfTUNDX0NNRF9DT05UX0NPTVAJCTB4ZAorI2RlZmluZSBNQ0hJUF9NQ0NfQ01EX0NPTlRfREVDT01QCTB4ZQorI2RlZmluZSBNQ0hJUF9NQ0NfQ01EX1JFU0VUCQkweGYJCS8qIE1DQyByZXNldCAqLworCisjZGVmaW5lIE1DSElQX01DQ19JSUNfV1IJCTB4ODQKKworI2RlZmluZSBNQ0hJUF9NQ0NfTUNDX1dSCQkweDg4CisKKyNkZWZpbmUgTUNISVBfTUNDX01DQ19SRAkJMHg4YworCisjZGVmaW5lIE1DSElQX01DQ19TVEFUVVMJCTB4OTAKKyNkZWZpbmUgTUNISVBfTUNDX1NUQVRVU19DQVBUCQkweDAwMDAwMDAxCS8qIGNhcHR1cmluZyAqLworI2RlZmluZSBNQ0hJUF9NQ0NfU1RBVFVTX0RJU1AJCTB4MDAwMDAwMDIJLyogZGlzcGxheWluZyAqLworI2RlZmluZSBNQ0hJUF9NQ0NfU1RBVFVTX0NPTVAJCTB4MDAwMDAwMDQJLyogY29tcHJlc3NpbmcgKi8KKyNkZWZpbmUgTUNISVBfTUNDX1NUQVRVU19ERUNPTVAJCTB4MDAwMDAwMDgJLyogZGVjb21wcmVzc2luZyAqLworI2RlZmluZSBNQ0hJUF9NQ0NfU1RBVFVTX01DQ19XUgkJMHgwMDAwMDAxMAkvKiByZWdpc3RlciByZWFkeSAqLworI2RlZmluZSBNQ0hJUF9NQ0NfU1RBVFVTX01DQ19SRAkJMHgwMDAwMDAyMAkvKiByZWdpc3RlciByZWFkeSAqLworI2RlZmluZSBNQ0hJUF9NQ0NfU1RBVFVTX0lJQ19XUgkJMHgwMDAwMDA0MAkvKiByZWdpc3RlciByZWFkeSAqLworI2RlZmluZSBNQ0hJUF9NQ0NfU1RBVFVTX09VVFBVVAkJMHgwMDAwMDA4MAkvKiBvdXRwdXQgaW4gcHJvZyAqLworCisjZGVmaW5lIE1DSElQX01DQ19TSUdfUE9MQVJJVFkJCTB4OTQKKyNkZWZpbmUgTUNISVBfTUNDX1NJR19QT0xfVlNfSAkJMHgwMDAwMDAwMQkvKiBWUyBhY3RpdmUtaGlnaCAqLworI2RlZmluZSBNQ0hJUF9NQ0NfU0lHX1BPTF9IU19ICQkweDAwMDAwMDAyCS8qIEhTIGFjdGl2ZS1oaWdoICovCisjZGVmaW5lIE1DSElQX01DQ19TSUdfUE9MX0RPRV9ICQkweDAwMDAwMDA0CS8qIERPRSBhY3RpdmUtaGlnaCAqLworCisjZGVmaW5lIE1DSElQX01DQ19JUlEJCQkweDk4CisjZGVmaW5lIE1DSElQX01DQ19JUlFfQ0FQRElTX1NUUlQJMHgwMDAwMDAwMQkvKiBjYXAvZGlzcCBzdGFydGVkICovCisjZGVmaW5lIE1DSElQX01DQ19JUlFfQ0FQRElTX1NUUlRfTUFTSwkweDAwMDAwMDEwCisjZGVmaW5lIE1DSElQX01DQ19JUlFfQ0FQRElTX0VORAkweDAwMDAwMDAyCS8qIGNhcC9kaXNwIGVuZGVkICovCisjZGVmaW5lIE1DSElQX01DQ19JUlFfQ0FQRElTX0VORF9NQVNLCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUNISVBfTUNDX0lSUV9DT01QREVDX1NUUlQJMHgwMDAwMDAwNAkvKiAoZGUpY29tcCBzdGFydGVkICovCisjZGVmaW5lIE1DSElQX01DQ19JUlFfQ09NUERFQ19TVFJUX01BU0sJMHgwMDAwMDA0MAorI2RlZmluZSBNQ0hJUF9NQ0NfSVJRX0NPTVBERUNfRU5ECTB4MDAwMDAwMDgJLyogKGRlKWNvbXAgZW5kZWQgKi8KKyNkZWZpbmUgTUNISVBfTUNDX0lSUV9DT01QREVDX0VORF9NQVNLCTB4MDAwMDAwODAKKworI2RlZmluZSBNQ0hJUF9NQ0NfSFNUQVJUCQkweDljCQkvKiB2aWRlbyBpbiAqLworI2RlZmluZSBNQ0hJUF9NQ0NfVlNUQVJUCQkweGEwCisjZGVmaW5lIE1DSElQX01DQ19IQ09VTlQJCTB4YTQKKyNkZWZpbmUgTUNISVBfTUNDX1ZDT1VOVAkJMHhhOAorI2RlZmluZSBNQ0hJUF9NQ0NfUl9YQkFTRQkJMHhhYwkJLyogY2FwdC9kaXNwICovCisjZGVmaW5lIE1DSElQX01DQ19SX1lCQVNFCQkweGIwCisjZGVmaW5lIE1DSElQX01DQ19SX1hSQU5HRQkJMHhiNAorI2RlZmluZSBNQ0hJUF9NQ0NfUl9ZUkFOR0UJCTB4YjgKKyNkZWZpbmUgTUNISVBfTUNDX0JfWEJBU0UJCTB4YmMJCS8qIGNvbXAvZGVjb21wICovCisjZGVmaW5lIE1DSElQX01DQ19CX1lCQVNFCQkweGMwCisjZGVmaW5lIE1DSElQX01DQ19CX1hSQU5HRQkJMHhjNAorI2RlZmluZSBNQ0hJUF9NQ0NfQl9ZUkFOR0UJCTB4YzgKKworI2RlZmluZSBNQ0hJUF9NQ0NfUl9TQU1QTElORwkJMHhjYwkJLyogMTogMTo0ICovCisKKyNkZWZpbmUgTUNISVBfVlJKX0NNRAkJCTB4MTAwCQkvKiBWUkogY29tbWFuZHMgKi8KKworLyogVlJKIHJlZ2lzdGVycyAoc2VlIHRhYmxlIDEyLjIuNCkgKi8KKyNkZWZpbmUgTUNISVBfVlJKX0NPTVBSRVNTRURfREFUQQkweDFiMAorI2RlZmluZSBNQ0hJUF9WUkpfUElYRUxfREFUQQkJMHgxYjgKKworI2RlZmluZSBNQ0hJUF9WUkpfQlVTX01PREUJCTB4MTAwCisjZGVmaW5lIE1DSElQX1ZSSl9TSUdOQUxfQUNUSVZFX0xFVkVMCTB4MTA4CisjZGVmaW5lIE1DSElQX1ZSSl9QREFUX1VTRQkJMHgxMTAKKyNkZWZpbmUgTUNISVBfVlJKX01PREVfU1BFQ0lGWQkJMHgxMTgKKyNkZWZpbmUgTUNISVBfVlJKX0xJTUlUX0NPTVBSRVNTRURfTE8JMHgxMjAKKyNkZWZpbmUgTUNISVBfVlJKX0xJTUlUX0NPTVBSRVNTRURfSEkJMHgxMjQKKyNkZWZpbmUgTUNISVBfVlJKX0NPTVBfREFUQV9GT1JNQVQJMHgxMjgKKyNkZWZpbmUgTUNISVBfVlJKX1RBQkxFX0RBVEEJCTB4MTQwCisjZGVmaW5lIE1DSElQX1ZSSl9SRVNUQVJUX0lOVEVSVkFMCTB4MTQ4CisjZGVmaW5lIE1DSElQX1ZSSl9OVU1fTElORVMJCTB4MTUwCisjZGVmaW5lIE1DSElQX1ZSSl9OVU1fUElYRUxTCQkweDE1OAorI2RlZmluZSBNQ0hJUF9WUkpfTlVNX0NPTVBPTkVOVFMJMHgxNjAKKyNkZWZpbmUgTUNISVBfVlJKX1NPRjEJCQkweDE2OAorI2RlZmluZSBNQ0hJUF9WUkpfU09GMgkJCTB4MTcwCisjZGVmaW5lIE1DSElQX1ZSSl9TT0YzCQkJMHgxNzgKKyNkZWZpbmUgTUNISVBfVlJKX1NPRjQJCQkweDE4MAorI2RlZmluZSBNQ0hJUF9WUkpfU09TCQkJMHgxODgKKyNkZWZpbmUgTUNISVBfVlJKX1NPRlRfUkVTRVQJCTB4MTkwCisKKyNkZWZpbmUgTUNISVBfVlJKX1NUQVRVUwkJMHgxYzAKKyNkZWZpbmUgTUNISVBfVlJKX1NUQVRVU19CVVNZCQkweDAwMDAxCisjZGVmaW5lIE1DSElQX1ZSSl9TVEFUVVNfQ09NUF9BQ0NFU1MJMHgwMDAwMgorI2RlZmluZSBNQ0hJUF9WUkpfU1RBVFVTX1BJWEVMX0FDQ0VTUwkweDAwMDA0CisjZGVmaW5lIE1DSElQX1ZSSl9TVEFUVVNfRVJST1IJCTB4MDAwMDgKKworI2RlZmluZSBNQ0hJUF9WUkpfSVJRX0ZMQUcJCTB4MWM4CisjZGVmaW5lIE1DSElQX1ZSSl9FUlJPUl9SRVBPUlQJCTB4MWQ4CisKKyNkZWZpbmUgTUNISVBfVlJKX1NUQVJUX0NPTU1BTkQJCTB4MWEwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRHJpdmVyIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2xsZXIgZm9yIGFjY2Vzc2luZyB0aGUgY2FtZXJhIGNvbW1hbmRzICovCisjaW5jbHVkZSA8bGludXgvc29ueXBpLmg+CisKKy8qIHByaXZhdGUgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvbWV5ZS5oPgorCisvKiBFbmFibGUganBnIHNvZnR3YXJlIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgTUVZRV9KUEVHX0NPUlJFQ1RJT04JMQorCisvKiBNYXhpbXVtIHNpemUgb2YgYSBidWZmZXIgKi8KKyNkZWZpbmUgTUVZRV9NQVhfQlVGU0laRQk2MTQ0MDAJLyogNjQwICogNDgwICogMiAqLworCisvKiBNYXhpbXVtIG51bWJlciBvZiBidWZmZXJzICovCisjZGVmaW5lIE1FWUVfTUFYX0JVRk5CUlMJMzIKKworLyogU3RhdGUgb2YgYSBidWZmZXIgKi8KKyNkZWZpbmUgTUVZRV9CVUZfVU5VU0VECTAJLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgTUVZRV9CVUZfVVNJTkcJMQkvKiBjdXJyZW50bHkgZ3JhYmJpbmcgLyBwbGF5aW5nICovCisjZGVmaW5lIE1FWUVfQlVGX0RPTkUJMgkvKiBkb25lICovCisKKy8qIGdyYWIgYnVmZmVyICovCitzdHJ1Y3QgbWV5ZV9ncmFiX2J1ZmZlciB7CisJaW50IHN0YXRlOwkJCS8qIHN0YXRlIG9mIGJ1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcgc2l6ZTsJCS8qIHNpemUgb2YganBnIGZyYW1lICovCisJc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOwkvKiB0aW1lc3RhbXAgKi8KKwl1bnNpZ25lZCBsb25nIHNlcXVlbmNlOwkJLyogc2VxdWVuY2UgbnVtYmVyICovCit9OworCisvKiBzaXplIG9mIGtmaWZvcyBjb250YWluaW5ncyBidWZmZXIgaW5kaWNlcyAqLworI2RlZmluZSBNRVlFX1FVRVVFX1NJWkUJTUVZRV9NQVhfQlVGTkJSUworCisvKiBNb3Rpb24gRXllIGRldmljZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBtZXllIHsKKwlzdHJ1Y3QgcGNpX2RldiAqbWNoaXBfZGV2OwkvKiBwY2kgZGV2aWNlICovCisJdTggbWNoaXBfaXJxOwkJCS8qIGlycSAqLworCXU4IG1jaGlwX21vZGU7CQkJLyogYWN0dWFsIG1jaGlwIG1vZGU6IEhJQ19NT0RFLi4uICovCisJdTggbWNoaXBfZm51bTsJCQkvKiBjdXJyZW50IG1jaGlwIGZyYW1lIG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqbWNoaXBfbW1yZWdzOy8qIG1jaGlwOiBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworCXU4ICptY2hpcF9wdGFibGVbTUNISVBfTkJfUEFHRVNdOy8qIG1jaGlwOiBwdGFibGUgKi8KKwl2b2lkICptY2hpcF9wdGFibGVfdG9jOwkJLyogbWNoaXA6IHB0YWJsZSB0b2MgKi8KKwlkbWFfYWRkcl90IG1jaGlwX2RtYWhhbmRsZTsJLyogbWNoaXA6IGRtYSBoYW5kbGUgdG8gcHRhYmxlIHRvYyAqLworCXVuc2lnbmVkIGNoYXIgKmdyYWJfZmJ1ZmZlcjsJLyogY2FwdHVyZSBmcmFtZWJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKmdyYWJfdGVtcDsJLyogdGVtcG9yYXJ5IGJ1ZmZlciAqLworCQkJCQkvKiBsaXN0IG9mIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgbWV5ZV9ncmFiX2J1ZmZlciBncmFiX2J1ZmZlcltNRVlFX01BWF9CVUZOQlJTXTsKKwlpbnQgdm1hX3VzZV9jb3VudFtNRVlFX01BWF9CVUZOQlJTXTsgLyogbW1hcCBjb3VudCAqLworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsJCS8qIHNlbWFwaG9yZSBmb3Igb3Blbi9tbWFwLi4uICovCisJc3RydWN0IGtmaWZvICpncmFicTsJCS8qIHF1ZXVlIGZvciBidWZmZXJzIHRvIGJlIGdyYWJiZWQgKi8KKwlzcGlubG9ja190IGdyYWJxX2xvY2s7CQkvKiBsb2NrIHByb3RlY3RpbmcgdGhlIHF1ZXVlICovCisJc3RydWN0IGtmaWZvICpkb25lcTsJCS8qIHF1ZXVlIGZvciBncmFiYmVkIGJ1ZmZlcnMgKi8KKwlzcGlubG9ja190IGRvbmVxX2xvY2s7CQkvKiBsb2NrIHByb3RlY3RpbmcgdGhlIHF1ZXVlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcHJvY19saXN0OwkvKiB3YWl0IHF1ZXVlICovCisJc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZGV2OwkvKiB2aWRlbyBkZXZpY2UgcGFyYW1ldGVycyAqLworCXN0cnVjdCB2aWRlb19waWN0dXJlIHBpY3R1cmU7CS8qIHZpZGVvIHBpY3R1cmUgcGFyYW1ldGVycyAqLworCXN0cnVjdCBtZXllX3BhcmFtcyBwYXJhbXM7CS8qIGFkZGl0aW9uYWwgcGFyYW1ldGVycyAqLworI2lmZGVmIENPTkZJR19QTQorCXU4IHBtX21jaGlwX21vZGU7CQkvKiBvbGQgbWNoaXAgbW9kZSAqLworI2VuZGlmCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5NmVjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5jCkBAIC0wLDAgKzEsMTg3NiBAQAorLyoKKyAqIHByb2dyYW1taW5nIHRoZSBtc3AzNCogc291bmQgcHJvY2Vzc29yIGZhbWlseQorICoKKyAqIChjKSAxOTk3LTIwMDEgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPgorICoKKyAqIHdoYXQgd29ya3MgYW5kIHdoYXQgZG9lc24ndDoKKyAqCisgKiAgQU0tTW9ubworICogICAgICBTdXBwb3J0IGZvciBIYXVwcGF1Z2UgY2FyZHMgYWRkZWQgKGRlY29kaW5nIGhhbmRsZWQgYnkgdHVuZXIpIGFkZGVkIGJ5CisgKiAgICAgIEZyZWRlcmljIENyb3phdCA8ZmNyb3phdEBtYWlsLmRvdGNvbS5mcj4KKyAqCisgKiAgRk0tTW9ubworICogICAgICBzaG91bGQgd29yay4gVGhlIHN0ZXJlbyBtb2RlcyBhcmUgYmFja3dhcmQgY29tcGF0aWJsZSB0byBGTS1tb25vLAorICogICAgICB0aGVyZWZvcmUgRk0tTW9ubyBzaG91bGQgYmUgYWxsd2F5cyBhdmFpbGFibGUuCisgKgorICogIEZNLVN0ZXJlbyAoQi9HLCB1c2VkIGluIGdlcm1hbnkpCisgKiAgICAgIHNob3VsZCB3b3JrLCB3aXRoIGF1dG9kZXRlY3QKKyAqCisgKiAgRk0tU3RlcmVvIChzYXRlbGxpdGUpCisgKiAgICAgIHNob3VsZCB3b3JrLCBubyBhdXRvZGV0ZWN0IChpLmUuIGRlZmF1bHQgaXMgbW9ubywgYnV0IHlvdSBjYW4KKyAqICAgICAgc3dpdGNoIHRvIHN0ZXJlbyAtLSB1bnRlc3RlZCkKKyAqCisgKiAgTklDQU0gKEIvRywgTCAsIHVzZWQgaW4gVUssIFNjYW5kaW5hdmlhLCBTcGFpbiBhbmQgRnJhbmNlKQorICogICAgICBzaG91bGQgd29yaywgd2l0aCBhdXRvZGV0ZWN0LiBTdXBwb3J0IGZvciBOSUNBTSB3YXMgYWRkZWQgYnkKKyAqICAgICAgUGVra2EgUGlldGlrYWluZW4gPHBwQG5ldHBwbC5maT4KKyAqCisgKgorICogVE9ETzoKKyAqICAgLSBiZXR0ZXIgU0FUIHN1cHBvcnQKKyAqCisgKgorICogOTgwNjIzICBUaG9tYXMgU2FpbGVyIChzYWlsZXJAaWZlLmVlLmV0aHouY2gpCisgKiAgICAgICAgIHVzaW5nIHNvdW5kY29yZSBpbnN0ZWFkIG9mIE9TUworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9pZC5oPgorI2luY2x1ZGUgIm1zcDM0MDAuaCIKKworI2RlZmluZSBPUE1PREVfQVVUTyAgICAtMQorI2RlZmluZSBPUE1PREVfTUFOVUFMICAgMAorI2RlZmluZSBPUE1PREVfU0lNUExFICAgMSAgIC8qIHVzZSBzaG9ydCBwcm9ncmFtbWluZyAoPj0gbXNwMzQxMCBvbmx5KSAqLworI2RlZmluZSBPUE1PREVfU0lNUExFUiAgMiAgIC8qIHVzZSBzaG9ydGVyIHByb2dyYW1taW5nICg+PSBtc3AzNHh4RykgICAqLworCisvKiBpbnNtb2QgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBvcG1vZGUgICA9IE9QTU9ERV9BVVRPOworc3RhdGljIGludCBkZWJ1ZyAgICA9IDA7ICAgIC8qIGRlYnVnIG91dHB1dCAqLworc3RhdGljIGludCBvbmNlICAgICA9IDA7ICAgIC8qIG5vIGNvbnRpbm91cyBzdGVyZW8gbW9uaXRvcmluZyAqLworc3RhdGljIGludCBhbXNvdW5kICA9IDA7ICAgIC8qIGhhcmQtd2lyZSBBTSBzb3VuZCBhdCA2LjUgSHogKGZyYW5jZSksCisJCQkgICAgICAgdGhlIGF1dG9zY2FuIHNlZW1zIHdvcmsgd2VsbCBvbmx5IHdpdGggRk0uLi4gKi8KK3N0YXRpYyBpbnQgc3RhbmRhcmQgPSAxOyAgICAvKiBPdmVycmlkZSBhdXRvIGRldGVjdCBvZiBhdWRpbyBzdGFuZGFyZCwgaWYgbmVlZGVkLiAqLworc3RhdGljIGludCBkb2xieSAgICA9IDA7CisKK3N0YXRpYyBpbnQgc3RlcmVvX3RocmVzaG9sZCA9IDB4MTkwOyAvKiBhMiB0aHJlc2hvbGQgZm9yIHN0ZXJlby9iaWxpbmd1YWwKKwkJCQkJKG1zcDM0eHhnIG9ubHkpIDB4MDBhMC0weDAzYzAgKi8KKworc3RydWN0IG1zcDM0MDBjIHsKKwlpbnQgcmV2MSxyZXYyOworCisJaW50IG9wbW9kZTsKKwlpbnQgbW9kZTsKKwlpbnQgbm9ybTsKKwlpbnQgbmljYW1fb247CisJaW50IGFjYjsKKwlpbnQgbWFpbiwgc2Vjb25kOwkvKiBzb3VuZCBjYXJyaWVyICovCisJaW50IGlucHV0OworCWludCBzb3VyY2U7ICAgICAgICAgICAgIC8qIHNlZSBtc3AzNHh4Z19zZXRfc291cmNlICovCisKKwkvKiB2NGwyICovCisJaW50IGF1ZG1vZGU7CisJaW50IHJ4c3ViY2hhbnM7CisKKwlpbnQgbXV0ZWQ7CisJaW50IHZvbHVtZSwgYmFsYW5jZTsKKwlpbnQgYmFzcywgdHJlYmxlOworCisJLyogdGhyZWFkICovCisJc3RydWN0IHRhc2tfc3RydWN0ICAgKmt0aHJlYWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgd3E7CisJaW50ICAgICAgICAgICAgICAgICAgcmVzdGFydDoxOworCWludCAgICAgICAgICAgICAgICAgIHdhdGNoX3N0ZXJlbzoxOworfTsKKworI2RlZmluZSBIQVZFX05JQ0FNKG1zcCkgICAoKChtc3AtPnJldjI+PjgpICYgMHhmZikgIT0gMDApCisjZGVmaW5lIEhBVkVfU0lNUExFKG1zcCkgICgobXNwLT5yZXYxICAgICAgJiAweGZmKSA+PSAnRCctJ0AnKQorI2RlZmluZSBIQVZFX1NJTVBMRVIobXNwKSAoKG1zcC0+cmV2MSAgICAgICYgMHhmZikgPj0gJ0cnLSdAJykKKyNkZWZpbmUgSEFWRV9SQURJTyhtc3ApICAgKChtc3AtPnJldjEgICAgICAmIDB4ZmYpID49ICdHJy0nQCcpCisKKyNkZWZpbmUgVklERU9fTU9ERV9SQURJTyAxNiAgICAgIC8qIG5vcm0gbWFnaWMgZm9yIHJhZGlvIG1vZGUgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIGRwcmludGsgICAgICBpZiAoZGVidWcgPj0gMSkgcHJpbnRrCisjZGVmaW5lIGQycHJpbnRrICAgICBpZiAoZGVidWcgPj0gMikgcHJpbnRrCisKKy8qIHJlYWQtb25seSAqLworbW9kdWxlX3BhcmFtKG9wbW9kZSwgICAgICAgICAgIGludCwgMDQ0NCk7CisKKy8qIHJlYWQtd3JpdGUgKi8KK21vZHVsZV9wYXJhbShvbmNlLCAgICAgICAgICAgICBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGRlYnVnLCAgICAgICAgICAgIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oc3RlcmVvX3RocmVzaG9sZCwgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShzdGFuZGFyZCwgICAgICAgICBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGFtc291bmQsICAgICAgICAgIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oZG9sYnksICAgICAgICAgICAgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhvbmNlLCAiTm8gY29udGludW91cyBzdGVyZW8gbW9uaXRvcmluZyIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyIpOworTU9EVUxFX1BBUk1fREVTQyhzdGFuZGFyZCwgIlNwZWNpZnkgYXVkaW8gc3RhbmRhcmQ6IDMyID0gTlRTQywgNjQgPSByYWRpbywgRGVmYXVsdDogQXV0b2RldGVjdCIpOworTU9EVUxFX1BBUk1fREVTQyhhbXNvdW5kLCAiSGFyZHdpcmUgQU0gc291bmQgYXQgNi41SHogKEZyYW5jZSksIEZNIGNhbiBhdXRvc2NhbiIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oImRldmljZSBkcml2ZXIgZm9yIG1zcDM0eHggVFYgc291bmQgcHJvY2Vzc29yIik7CitNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7IC8qIEZyZWVCU0QgdXNlcyB0aGlzIHRvbyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgSTJDX01TUDM0MDBDICAgICAgIDB4ODAKKyNkZWZpbmUgSTJDX01TUDM0MDBDX0FMVCAgIDB4ODgKKworI2RlZmluZSBJMkNfTVNQMzQwMENfREVNICAgMHgxMAorI2RlZmluZSBJMkNfTVNQMzQwMENfREZQICAgMHgxMgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKKwlJMkNfTVNQMzQwMEMgICAgICA+PiAxLAorCUkyQ19NU1AzNDAwQ19BTFQgID4+IDEsCisJSTJDX0NMSUVOVF9FTkQKK307CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY19yYW5nZVtdID0ge0kyQ19DTElFTlRfRU5ELEkyQ19DTElFTlRfRU5EfTsKK0kyQ19DTElFTlRfSU5TTU9EOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZnVuY3Rpb25zIGZvciB0YWxraW5nIHRvIHRoZSBNU1AzNDAwQyBTb3VuZCBwcm9jZXNzb3IgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGludCBtc3AzNDAwY19yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCS8qIHJlc2V0IGFuZCByZWFkIHJldmlzaW9uIGNvZGUgKi8KKwlzdGF0aWMgY2hhciByZXNldF9vZmZbM10gPSB7IDB4MDAsIDB4ODAsIDB4MDAgfTsKKwlzdGF0aWMgY2hhciByZXNldF9vblszXSAgPSB7IDB4MDAsIDB4MDAsIDB4MDAgfTsKKwlzdGF0aWMgY2hhciB3cml0ZVszXSAgICAgPSB7IEkyQ19NU1AzNDAwQ19ERlAgKyAxLCAweDAwLCAweDFlIH07CisJY2hhciByZWFkWzJdOworCXN0cnVjdCBpMmNfbXNnIHJlc2V0WzJdID0geworCQl7IGNsaWVudC0+YWRkciwgSTJDX01fSUdOT1JFX05BSywgMywgcmVzZXRfb2ZmIH0sCisJCXsgY2xpZW50LT5hZGRyLCBJMkNfTV9JR05PUkVfTkFLLCAzLCByZXNldF9vbiAgfSwKKwl9OworCXN0cnVjdCBpMmNfbXNnIHRlc3RbMl0gPSB7CisJCXsgY2xpZW50LT5hZGRyLCAwLCAgICAgICAgMywgd3JpdGUgfSwKKwkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCAyLCByZWFkICB9LAorCX07CisKKwlpZiAoICgxICE9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsJnJlc2V0WzBdLDEpKSB8fAorCSAgICAgKDEgIT0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwmcmVzZXRbMV0sMSkpIHx8CisJICAgICAoMiAhPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLHRlc3QsMikpICkgeworCQlwcmludGsoS0VSTl9FUlIgIm1zcDM0MDA6IGNoaXAgcmVzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworICAgICAgICB9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21zcDM0MDBjX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGRldiwgaW50IGFkZHIpCit7CisJaW50IGVycjsKKworICAgICAgICB1bnNpZ25lZCBjaGFyIHdyaXRlWzNdOworICAgICAgICB1bnNpZ25lZCBjaGFyIHJlYWRbMl07CisgICAgICAgIHN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7CisgICAgICAgICAgICAgICAgeyBjbGllbnQtPmFkZHIsIDAsICAgICAgICAzLCB3cml0ZSB9LAorICAgICAgICAgICAgICAgIHsgY2xpZW50LT5hZGRyLCBJMkNfTV9SRCwgMiwgcmVhZCAgfQorICAgICAgICB9OworICAgICAgICB3cml0ZVswXSA9IGRldisxOworICAgICAgICB3cml0ZVsxXSA9IGFkZHIgPj4gODsKKyAgICAgICAgd3JpdGVbMl0gPSBhZGRyICYgMHhmZjsKKworCWZvciAoZXJyID0gMDsgZXJyIDwgMzspIHsKKwkJaWYgKDIgPT0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlcixtc2dzLDIpKQorCQkJYnJlYWs7CisJCWVycisrOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtc3AzNHh4OiBJL08gZXJyb3IgIyVkIChyZWFkIDB4JTAyeC8weCUwMngpXG4iLAorCQkgICAgICAgZXJyLCBkZXYsIGFkZHIpOworCQltc2xlZXAoMTApOworCX0KKwlpZiAoMyA9PSBlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXNwMzR4eDogZ2l2aW5nIHVwLCByZXNldGluZyBjaGlwLiBTb3VuZCB3aWxsIGdvIG9mZiwgc29ycnkgZm9sa3MgOi18XG4iKTsKKwkJbXNwMzQwMGNfcmVzZXQoY2xpZW50KTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gcmVhZFswXSA8PCA4IHwgcmVhZFsxXTsKK30KKworc3RhdGljIGludAorbXNwMzQwMGNfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGRldiwgaW50IGFkZHIsIGludCB2YWwpCit7CisJaW50IGVycjsKKyAgICAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbNV07CisKKyAgICAgICAgYnVmZmVyWzBdID0gZGV2OworICAgICAgICBidWZmZXJbMV0gPSBhZGRyID4+IDg7CisgICAgICAgIGJ1ZmZlclsyXSA9IGFkZHIgJiAgMHhmZjsKKyAgICAgICAgYnVmZmVyWzNdID0gdmFsICA+PiA4OworICAgICAgICBidWZmZXJbNF0gPSB2YWwgICYgIDB4ZmY7CisKKwlmb3IgKGVyciA9IDA7IGVyciA8IDM7KSB7CisJCWlmICg1ID09IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZmZlciwgNSkpCisJCQlicmVhazsKKwkJZXJyKys7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1zcDM0eHg6IEkvTyBlcnJvciAjJWQgKHdyaXRlIDB4JTAyeC8weCUwMngpXG4iLAorCQkgICAgICAgZXJyLCBkZXYsIGFkZHIpOworCQltc2xlZXAoMTApOworCX0KKwlpZiAoMyA9PSBlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXNwMzR4eDogZ2l2aW5nIHVwLCByZXNldGluZyBjaGlwLiBTb3VuZCB3aWxsIGdvIG9mZiwgc29ycnkgZm9sa3MgOi18XG4iKTsKKwkJbXNwMzQwMGNfcmVzZXQoY2xpZW50KTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoaXMgbWFjcm8gaXMgYWxsb3dlZCBmb3IgKmNvbnN0YW50cyogb25seSwgZ2NjIG11c3QgY2FsY3VsYXRlIGl0CisgICBhdCBjb21waWxlIHRpbWUuICBSZW1lbWJlciAtLSBubyBmbG9hdHMgaW4ga2VybmVsIG1vZGUgKi8KKyNkZWZpbmUgTVNQX0NBUlJJRVIoZnJlcSkgKChpbnQpKChmbG9hdCkoZnJlcS8xOC40MzIpKigxPDwyNCkpKQorCisjZGVmaW5lIE1TUF9NT0RFX0FNX0RFVEVDVCAgIDAKKyNkZWZpbmUgTVNQX01PREVfRk1fUkFESU8gICAgMgorI2RlZmluZSBNU1BfTU9ERV9GTV9URVJSQSAgICAzCisjZGVmaW5lIE1TUF9NT0RFX0ZNX1NBVCAgICAgIDQKKyNkZWZpbmUgTVNQX01PREVfRk1fTklDQU0xICAgNQorI2RlZmluZSBNU1BfTU9ERV9GTV9OSUNBTTIgICA2CisjZGVmaW5lIE1TUF9NT0RFX0FNX05JQ0FNICAgIDcKKyNkZWZpbmUgTVNQX01PREVfQlRTQyAgICAgICAgOAorI2RlZmluZSBNU1BfTU9ERV9FWFRFUk4gICAgICA5CisKK3N0YXRpYyBzdHJ1Y3QgTVNQX0lOSVRfREFUQV9ERU0geworCWludCBmaXIxWzZdOworCWludCBmaXIyWzZdOworCWludCBjZG8xOworCWludCBjZG8yOworCWludCBhZF9jdjsKKwlpbnQgbW9kZV9yZWc7CisJaW50IGRmcF9zcmM7CisJaW50IGRmcF9tYXRyaXg7Cit9IG1zcF9pbml0X2RhdGFbXSA9IHsKKwkvKiBBTSAoZm9yIGNhcnJpZXIgZGV0ZWN0IC8gbXNwMzQwMCkgKi8KKwl7IHsgNzUsIDE5LCAzNiwgMzUsIDM5LCA0MCB9LCB7IDc1LCAxOSwgMzYsIDM1LCAzOSwgNDAgfSwKKwkgIE1TUF9DQVJSSUVSKDUuNSksIE1TUF9DQVJSSUVSKDUuNSksCisJICAweDAwZDAsIDB4MDUwMCwgICAweDAwMjAsIDB4MzAwMH0sCisKKwkvKiBBTSAoZm9yIGNhcnJpZXIgZGV0ZWN0IC8gbXNwMzQxMCkgKi8KKwl7IHsgLTEsIC0xLCAtOCwgMiwgNTksIDEyNiB9LCB7IC0xLCAtMSwgLTgsIDIsIDU5LCAxMjYgfSwKKwkgIE1TUF9DQVJSSUVSKDUuNSksIE1TUF9DQVJSSUVSKDUuNSksCisJICAweDAwZDAsIDB4MDEwMCwgICAweDAwMjAsIDB4MzAwMH0sCisKKwkvKiBGTSBSYWRpbyAqLworCXsgeyAtOCwgLTgsIDQsIDYsIDc4LCAxMDcgfSwgeyAtOCwgLTgsIDQsIDYsIDc4LCAxMDcgfSwKKwkgIE1TUF9DQVJSSUVSKDEwLjcpLCBNU1BfQ0FSUklFUigxMC43KSwKKwkgIDB4MDBkMCwgMHgwNDgwLCAweDAwMjAsIDB4MzAwMCB9LAorCisJLyogVGVycmVzdGlhbCBGTS1tb25vICsgRk0tc3RlcmVvICovCisJeyB7ICAzLCAxOCwgMjcsIDQ4LCA2NiwgNzIgfSwgeyAgMywgMTgsIDI3LCA0OCwgNjYsIDcyIH0sCisJICBNU1BfQ0FSUklFUig1LjUpLCBNU1BfQ0FSUklFUig1LjUpLAorCSAgMHgwMGQwLCAweDA0ODAsICAgMHgwMDMwLCAweDMwMDB9LAorCisJLyogU2F0IEZNLW1vbm8gKi8KKwl7IHsgIDEsICA5LCAxNCwgMjQsIDMzLCAzNyB9LCB7ICAzLCAxOCwgMjcsIDQ4LCA2NiwgNzIgfSwKKwkgIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuNSksCisJICAweDAwYzYsIDB4MDQ4MCwgICAweDAwMDAsIDB4MzAwMH0sCisKKwkvKiBOSUNBTS9GTSAtLSAgQi9HICg1LjUvNS44NSksIEQvSyAoNi41LzUuODUpICovCisJeyB7IC0yLCAtOCwgLTEwLCAxMCwgNTAsIDg2IH0sIHsgIDMsIDE4LCAyNywgNDgsIDY2LCA3MiB9LAorCSAgTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS41KSwKKwkgIDB4MDBkMCwgMHgwMDQwLCAgIDB4MDEyMCwgMHgzMDAwfSwKKworCS8qIE5JQ0FNL0ZNIC0tIEkgKDYuMC82LjU1MikgKi8KKwl7IHsgIDIsIDQsIC02LCAtNCwgNDAsIDk0IH0sIHsgIDMsIDE4LCAyNywgNDgsIDY2LCA3MiB9LAorCSAgTVNQX0NBUlJJRVIoNi4wKSwgTVNQX0NBUlJJRVIoNi4wKSwKKwkgIDB4MDBkMCwgMHgwMDQwLCAgIDB4MDEyMCwgMHgzMDAwfSwKKworCS8qIE5JQ0FNL0FNIC0tIEwgKDYuNS81Ljg1KSAqLworCXsgeyAgLTIsIC04LCAtMTAsIDEwLCA1MCwgODYgfSwgeyAgLTQsIC0xMiwgLTksIDIzLCA3OSwgMTI2IH0sCisJICBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2LjUpLAorCSAgMHgwMGM2LCAweDAxNDAsICAgMHgwMTIwLCAweDdjMDN9LAorfTsKKworc3RydWN0IENBUlJJRVJfREVURUNUIHsKKwlpbnQgICBjZG87CisJY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgQ0FSUklFUl9ERVRFQ1QgY2Fycmllcl9kZXRlY3RfbWFpbltdID0geworCS8qIG1haW4gY2FycmllciAqLworCXsgTVNQX0NBUlJJRVIoNC41KSwgICAgICAgICI0LjUgICBOVFNDIiAgICAgICAgICAgICAgICAgICB9LAorCXsgTVNQX0NBUlJJRVIoNS41KSwgICAgICAgICI1LjUgICBQQUwgQi9HIiAgICAgICAgICAgICAgICB9LAorCXsgTVNQX0NBUlJJRVIoNi4wKSwgICAgICAgICI2LjAgICBQQUwgSSIgICAgICAgICAgICAgICAgICB9LAorCXsgTVNQX0NBUlJJRVIoNi41KSwgICAgICAgICI2LjUgICBQQUwgRC9LICsgU0FUICsgU0VDQU0iICB9Cit9OworCitzdGF0aWMgc3RydWN0IENBUlJJRVJfREVURUNUIGNhcnJpZXJfZGV0ZWN0XzU1W10gPSB7CisJLyogUEFMIEIvRyAqLworCXsgTVNQX0NBUlJJRVIoNS43NDIxODc1KSwgICI1Ljc0MiBQQUwgQi9HIEZNLXN0ZXJlbyIgICAgIH0sCisJeyBNU1BfQ0FSUklFUig1Ljg1KSwgICAgICAgIjUuODUgIFBBTCBCL0cgTklDQU0iICAgICAgICAgfQorfTsKKworc3RhdGljIHN0cnVjdCBDQVJSSUVSX0RFVEVDVCBjYXJyaWVyX2RldGVjdF82NVtdID0geworCS8qIFBBTCBTQVQgLyBTRUNBTSAqLworCXsgTVNQX0NBUlJJRVIoNS44NSksICAgICAgICI1Ljg1ICBQQUwgRC9LICsgU0VDQU0gTklDQU0iIH0sCisJeyBNU1BfQ0FSUklFUig2LjI1NzgxMjUpLCAgIjYuMjUgIFBBTCBEL0sxIEZNLXN0ZXJlbyIgfSwKKwl7IE1TUF9DQVJSSUVSKDYuNzQyMTg3NSksICAiNi43NCAgUEFMIEQvSzIgRk0tc3RlcmVvIiB9LAorCXsgTVNQX0NBUlJJRVIoNy4wMiksICAgICAgICI3LjAyICBQQUwgU0FUIEZNLXN0ZXJlbyBzL2IiIH0sCisJeyBNU1BfQ0FSUklFUig3LjIwKSwgICAgICAgIjcuMjAgIFBBTCBTQVQgRk0tc3RlcmVvIHMiICAgfSwKKwl7IE1TUF9DQVJSSUVSKDcuMzgpLCAgICAgICAiNy4zOCAgUEFMIFNBVCBGTS1zdGVyZW8gYiIgICB9LAorfTsKKworI2RlZmluZSBDQVJSSUVSX0NPVU5UKHgpIChzaXplb2YoeCkvc2l6ZW9mKHN0cnVjdCBDQVJSSUVSX0RFVEVDVCkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc2NhcnRzWzNdWzldID0geworICAvKiBNQVNLICAgIElOMSAgICAgSU4yICAgICBJTjFfREEgIElOMl9EQSAgSU4zICAgICBJTjQgICAgIE1PTk8gICAgTVVURSAgICovCisgIHsgIDB4MDMyMCwgMHgwMDAwLCAweDAyMDAsIC0xLCAgICAgLTEsICAgICAweDAzMDAsIDB4MDAyMCwgMHgwMTAwLCAweDAzMjAgfSwKKyAgeyAgMHgwYzQwLCAweDA0NDAsIDB4MDQwMCwgMHgwYzAwLCAweDAwNDAsIDB4MDAwMCwgMHgwODQwLCAweDA4MDAsIDB4MGM0MCB9LAorICB7ICAweDMwODAsIDB4MTAwMCwgMHgxMDgwLCAweDAwMDAsIDB4MDA4MCwgMHgyMDgwLCAweDMwODAsIDB4MjAwMCwgMHgzMDAwIH0sCit9OworCitzdGF0aWMgY2hhciAqc2NhcnRfbmFtZXNbXSA9IHsKKyAgIm1hc2siLCAiaW4xIiwgImluMiIsICJpbjEgZGEiLCAiaW4yIGRhIiwgImluMyIsICJpbjQiLCAibW9ubyIsICJtdXRlIgorfTsKKworc3RhdGljIHZvaWQKK21zcDM0MDBjX3NldF9zY2FydChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgaW4sIGludCBvdXQpCit7CisJc3RydWN0IG1zcDM0MDBjICptc3AgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmICgtMSA9PSBzY2FydHNbb3V0XVtpbl0pCisJCXJldHVybjsKKworCWRwcmludGsoS0VSTl9ERUJVRworCQkibXNwMzR4eDogc2NhcnQgc3dpdGNoOiAlcyA9PiAlZFxuIixzY2FydF9uYW1lc1tpbl0sb3V0KTsKKwltc3AtPmFjYiAmPSB+c2NhcnRzW291dF1bU0NBUlRfTUFTS107CisJbXNwLT5hY2IgfD0gIHNjYXJ0c1tvdXRdW2luXTsKKwltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDEzLCBtc3AtPmFjYik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBtc3AzNDAwY19zZXRjYXJyaWVyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBjZG8xLCBpbnQgY2RvMikKK3sKKwltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RFTSwgMHgwMDkzLCBjZG8xICYgMHhmZmYpOworCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDAwOWIsIGNkbzEgPj4gMTIpOworCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDAwYTMsIGNkbzIgJiAweGZmZik7CisJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4MDBhYiwgY2RvMiA+PiAxMik7CisJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4MDA1NiwgMCk7IC8qTE9BRF9SRUdfMS8yKi8KK30KKworc3RhdGljIHZvaWQgbXNwMzQwMGNfc2V0dm9sdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICAgaW50IG11dGVkLCBpbnQgdm9sdW1lLCBpbnQgYmFsYW5jZSkKK3sKKwlpbnQgdmFsID0gMCwgYmFsID0gMDsKKworCWlmICghbXV0ZWQpIHsKKwkJdmFsID0gKHZvbHVtZSAqIDB4N0YgLyA2NTUzNSkgPDwgODsKKwl9CisJaWYgKHZhbCkgeworCQliYWwgPSAoYmFsYW5jZSAvIDI1NikgLSAxMjg7CisJfQorCWRwcmludGsoS0VSTl9ERUJVRworCQkibXNwMzR4eDogc2V0dm9sdW1lOiBtdXRlPSVzICVkOiVkICB2PTB4JTAyeCBiPTB4JTAyeFxuIiwKKwkJbXV0ZWQgPyAib24iIDogIm9mZiIsIHZvbHVtZSwgYmFsYW5jZSwgdmFsPj44LCBiYWwpOworCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMDAsIHZhbCk7IC8qIGxvdWRzcGVha2VyICovCisJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwNiwgdmFsKTsgLyogaGVhZHBob25lcyAgKi8KKwltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDA3LAorCQkgICAgICAgbXV0ZWQgPyAweDAxIDogKHZhbCB8IDB4MDEpKTsKKwltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDAxLCBiYWwgPDwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIG1zcDM0MDBjX3NldGJhc3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGJhc3MpCit7CisJaW50IHZhbCA9ICgoYmFzcy0zMjc2OCkgKiAweDYwIC8gNjU1MzUpIDw8IDg7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0eHg6IHNldGJhc3M6ICVkIDB4JTAyeFxuIixiYXNzLCB2YWw+PjgpOworCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMDIsIHZhbCk7IC8qIGxvdWRzcGVha2VyICovCit9CisKK3N0YXRpYyB2b2lkIG1zcDM0MDBjX3NldHRyZWJsZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgdHJlYmxlKQoreworCWludCB2YWwgPSAoKHRyZWJsZS0zMjc2OCkgKiAweDYwIC8gNjU1MzUpIDw8IDg7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0eHg6IHNldHRyZWJsZTogJWQgMHglMDJ4XG4iLHRyZWJsZSwgdmFsPj44KTsKKwltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDAzLCB2YWwpOyAvKiBsb3Vkc3BlYWtlciAqLworfQorCitzdGF0aWMgdm9pZCBtc3AzNDAwY19zZXRtb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCB0eXBlKQoreworCXN0cnVjdCBtc3AzNDAwYyAqbXNwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0MDA6IHNldG1vZGU6ICVkXG4iLHR5cGUpOworCW1zcC0+bW9kZSAgICAgICA9IHR5cGU7CisJbXNwLT5hdWRtb2RlICAgID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJbXNwLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKworCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDAwYmIsICAgICAgICAgIC8qIGFkX2N2ICovCisJCSAgICAgICBtc3BfaW5pdF9kYXRhW3R5cGVdLmFkX2N2KTsKKworCWZvciAoaSA9IDU7IGkgPj0gMDsgaS0tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyIDEgKi8KKwkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4MDAwMSwKKwkJCSAgICAgICBtc3BfaW5pdF9kYXRhW3R5cGVdLmZpcjFbaV0pOworCisJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4MDAwNSwgMHgwMDA0KTsgLyogZmlyIDIgKi8KKwltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RFTSwgMHgwMDA1LCAweDAwNDApOworCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDAwMDUsIDB4MDAwMCk7CisJZm9yIChpID0gNTsgaSA+PSAwOyBpLS0pCisJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDAwMDUsCisJCQkgICAgICAgbXNwX2luaXRfZGF0YVt0eXBlXS5maXIyW2ldKTsKKworCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDAwODMsICAgICAvKiBNT0RFX1JFRyAqLworCQkgICAgICAgbXNwX2luaXRfZGF0YVt0eXBlXS5tb2RlX3JlZyk7CisKKwltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgbXNwX2luaXRfZGF0YVt0eXBlXS5jZG8xLAorCQkJICAgIG1zcF9pbml0X2RhdGFbdHlwZV0uY2RvMik7CisKKwltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RFTSwgMHgwMDU2LCAwKTsgLypMT0FEX1JFR18xLzIqLworCisJaWYgKGRvbGJ5KSB7CisJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMDgsCisJCQkgICAgICAgMHgwNTIwKTsgLyogSTJTMSAqLworCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDA5LAorCQkJICAgICAgIDB4MDYyMCk7IC8qIEkyUzIgKi8KKwkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwYiwKKwkJCSAgICAgICBtc3BfaW5pdF9kYXRhW3R5cGVdLmRmcF9zcmMpOworCX0gZWxzZSB7CisJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMDgsCisJCQkgICAgICAgbXNwX2luaXRfZGF0YVt0eXBlXS5kZnBfc3JjKTsKKwkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwOSwKKwkJCSAgICAgICBtc3BfaW5pdF9kYXRhW3R5cGVdLmRmcF9zcmMpOworCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDBiLAorCQkJICAgICAgIG1zcF9pbml0X2RhdGFbdHlwZV0uZGZwX3NyYyk7CisJfQorCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMGEsCisJCSAgICAgICBtc3BfaW5pdF9kYXRhW3R5cGVdLmRmcF9zcmMpOworCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMGUsCisJCSAgICAgICBtc3BfaW5pdF9kYXRhW3R5cGVdLmRmcF9tYXRyaXgpOworCisJaWYgKEhBVkVfTklDQU0obXNwKSkgeworCQkvKiBuaWNhbSBwcmVzY2FsZSAqLworCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDEwLCAweDVhMDApOyAvKiB3YXM6IDB4MzAwMCAqLworCX0KK30KKworc3RhdGljIGludCBiZXN0X2F1ZGlvX21vZGUoaW50IHJ4c3ViY2hhbnMpCit7CisJaWYgKHJ4c3ViY2hhbnMgJiBWNEwyX1RVTkVSX1NVQl9TVEVSRU8pCisJCXJldHVybiBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCWlmIChyeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfTEFORzEpCisJCXJldHVybiBWNEwyX1RVTkVSX01PREVfTEFORzE7CisJaWYgKHJ4c3ViY2hhbnMgJiBWNEwyX1RVTkVSX1NVQl9MQU5HMikKKwkJcmV0dXJuIFY0TDJfVFVORVJfTU9ERV9MQU5HMjsKKwlyZXR1cm4gVjRMMl9UVU5FUl9NT0RFX01PTk87Cit9CisKKy8qIHR1cm4gb24vb2ZmIG5pY2FtICsgc3RlcmVvICovCitzdGF0aWMgdm9pZCBtc3AzNDAwY19zZXRfYXVkbW9kZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYXVkbW9kZSkKK3sKKwlzdGF0aWMgY2hhciAqc3RybW9kZVsxNl0gPSB7CisjaWYgX19HTlVDX18gPj0gMworCQlbIDAgLi4uIDE1IF0gICAgICAgICAgICAgICA9ICJpbnZhbGlkIiwKKyNlbmRpZgorCQlbIFY0TDJfVFVORVJfTU9ERV9NT05PICAgXSA9ICJtb25vIiwKKwkJWyBWNEwyX1RVTkVSX01PREVfU1RFUkVPIF0gPSAic3RlcmVvIiwKKwkJWyBWNEwyX1RVTkVSX01PREVfTEFORzEgIF0gPSAibGFuZzEiLAorCQlbIFY0TDJfVFVORVJfTU9ERV9MQU5HMiAgXSA9ICJsYW5nMiIsCisJfTsKKwlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBuaWNhbT0wOyAvKiBjaGFubmVsIHNvdXJjZTogRk0vQU0gb3IgbmljYW0gKi8KKwlpbnQgc3JjPTA7CisKKwlCVUdfT04obXNwLT5vcG1vZGUgPT0gT1BNT0RFX1NJTVBMRVIpOworCW1zcC0+YXVkbW9kZSA9IGF1ZG1vZGU7CisKKwkvKiBzd2l0Y2ggZGVtb2R1bGF0b3IgKi8KKwlzd2l0Y2ggKG1zcC0+bW9kZSkgeworCWNhc2UgTVNQX01PREVfRk1fVEVSUkE6CisJCWRwcmludGsoS0VSTl9ERUJVRyAibXNwMzQwMDogRk0gc2V0c3RlcmVvOiAlc1xuIiwKKwkJCXN0cm1vZGVbYXVkbW9kZV0pOworCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCxtc3AtPnNlY29uZCxtc3AtPm1haW4pOworCQlzd2l0Y2ggKGF1ZG1vZGUpIHsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgorCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwZSwgMHgzMDAxKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgorCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzI6CisJCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDBlLCAweDMwMDApOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNU1BfTU9ERV9GTV9TQVQ6CisJCWRwcmludGsoS0VSTl9ERUJVRyAibXNwMzQwMDogU0FUIHNldHN0ZXJlbzogJXNcbiIsCisJCQlzdHJtb2RlW2F1ZG1vZGVdKTsKKwkJc3dpdGNoIChhdWRtb2RlKSB7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CisJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi41KSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgorCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIE1TUF9DQVJSSUVSKDcuMiksIE1TUF9DQVJSSUVSKDcuMDIpKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKKwkJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBNU1BfQ0FSUklFUig3LjM4KSwgTVNQX0NBUlJJRVIoNy4wMikpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOgorCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIE1TUF9DQVJSSUVSKDcuMzgpLCBNU1BfQ0FSUklFUig3LjAyKSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIE1TUF9NT0RFX0ZNX05JQ0FNMToKKwljYXNlIE1TUF9NT0RFX0ZNX05JQ0FNMjoKKwljYXNlIE1TUF9NT0RFX0FNX05JQ0FNOgorCQlkcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0MDA6IE5JQ0FNIHNldHN0ZXJlbzogJXNcbiIsCisJCQlzdHJtb2RlW2F1ZG1vZGVdKTsKKwkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsbXNwLT5zZWNvbmQsbXNwLT5tYWluKTsKKwkJaWYgKG1zcC0+bmljYW1fb24pCisJCQluaWNhbT0weDAxMDA7CisJCWJyZWFrOworCWNhc2UgTVNQX01PREVfQlRTQzoKKwkJZHByaW50ayhLRVJOX0RFQlVHICJtc3AzNDAwOiBCVFNDIHNldHN0ZXJlbzogJXNcbiIsCisJCQlzdHJtb2RlW2F1ZG1vZGVdKTsKKwkJbmljYW09MHgwMzAwOworCQlicmVhazsKKwljYXNlIE1TUF9NT0RFX0VYVEVSTjoKKwkJZHByaW50ayhLRVJOX0RFQlVHICJtc3AzNDAwOiBleHRlcm4gc2V0c3RlcmVvOiAlc1xuIiwKKwkJCXN0cm1vZGVbYXVkbW9kZV0pOworCQluaWNhbSA9IDB4MDIwMDsKKwkJYnJlYWs7CisJY2FzZSBNU1BfTU9ERV9GTV9SQURJTzoKKwkJZHByaW50ayhLRVJOX0RFQlVHICJtc3AzNDAwOiBGTS1SYWRpbyBzZXRzdGVyZW86ICVzXG4iLAorCQkJc3RybW9kZVthdWRtb2RlXSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRwcmludGsoS0VSTl9ERUJVRyAibXNwMzQwMDogbW9ubyBzZXRzdGVyZW9cbiIpOworCQlyZXR1cm47CisJfQorCisJLyogc3dpdGNoIGF1ZGlvICovCisJc3dpdGNoIChhdWRtb2RlKSB7CisJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgorCQlzcmMgPSAweDAwMjAgfCBuaWNhbTsKKyNpZiAwCisJCS8qIHNwYXRpYWwgZWZmZWN0ICovCisJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMDUsMHg0MDAwKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgorCQlpZiAobXNwLT5tb2RlID09IE1TUF9NT0RFX0FNX05JQ0FNKSB7CisJCQlkcHJpbnRrKCJtc3AzNDAwOiBzd2l0Y2hpbmcgdG8gQU0gbW9ub1xuIik7CisJCQkvKiBBTSBtb25vIGRlY29kaW5nIGlzIGhhbmRsZWQgYnkgdHVuZXIsIG5vdCBNU1AgY2hpcCAqLworCQkJLyogU0NBUlQgc3dpdGNoaW5nIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJCW1zcDM0MDBjX3NldF9zY2FydChjbGllbnQsU0NBUlRfTU9OTywwKTsKKwkJCXNyYyA9IDB4MDIwMDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzE6CisJCXNyYyA9IDB4MDAwMCB8IG5pY2FtOworCQlicmVhazsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMjoKKwkJc3JjID0gMHgwMDEwIHwgbmljYW07CisJCWJyZWFrOworCX0KKwlkcHJpbnRrKEtFUk5fREVCVUcKKwkJIm1zcDM0MDA6IHNldHN0ZXJlbyBmaW5hbCBzb3VyY2UvbWF0cml4ID0gMHgleFxuIiwgc3JjKTsKKworCWlmIChkb2xieSkgeworCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDA4LDB4MDUyMCk7CisJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMDksMHgwNjIwKTsKKwkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwYSxzcmMpOworCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDBiLHNyYyk7CisJfSBlbHNlIHsKKwkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwOCxzcmMpOworCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDA5LHNyYyk7CisJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMGEsc3JjKTsKKwkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwYixzcmMpOworCX0KK30KKworc3RhdGljIHZvaWQKK21zcDM0MDBjX3ByaW50X21vZGUoc3RydWN0IG1zcDM0MDBjICptc3ApCit7CisJaWYgKG1zcC0+bWFpbiA9PSBtc3AtPnNlY29uZCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAibXNwMzQwMDogbW9ubyBzb3VuZCBjYXJyaWVyOiAlZC4lMDNkIE1IelxuIiwKKwkJICAgICAgIG1zcC0+bWFpbi85MTAwMDAsKG1zcC0+bWFpbi85MTApJTEwMDApOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJtc3AzNDAwOiBtYWluIHNvdW5kIGNhcnJpZXI6ICVkLiUwM2QgTUh6XG4iLAorCQkgICAgICAgbXNwLT5tYWluLzkxMDAwMCwobXNwLT5tYWluLzkxMCklMTAwMCk7CisJfQorCWlmIChtc3AtPm1vZGUgPT0gTVNQX01PREVfRk1fTklDQU0xIHx8CisJICAgIG1zcC0+bW9kZSA9PSBNU1BfTU9ERV9GTV9OSUNBTTIpCisJCXByaW50ayhLRVJOX0RFQlVHICJtc3AzNDAwOiBOSUNBTS9GTSBjYXJyaWVyICAgOiAlZC4lMDNkIE1IelxuIiwKKwkJICAgICAgIG1zcC0+c2Vjb25kLzkxMDAwMCwobXNwLT5zZWNvbmQvOTEwKSUxMDAwKTsKKwlpZiAobXNwLT5tb2RlID09IE1TUF9NT0RFX0FNX05JQ0FNKQorCQlwcmludGsoS0VSTl9ERUJVRyAibXNwMzQwMDogTklDQU0vQU0gY2FycmllciAgIDogJWQuJTAzZCBNSHpcbiIsCisJCSAgICAgICBtc3AtPnNlY29uZC85MTAwMDAsKG1zcC0+c2Vjb25kLzkxMCklMTAwMCk7CisJaWYgKG1zcC0+bW9kZSA9PSBNU1BfTU9ERV9GTV9URVJSQSAmJgorCSAgICBtc3AtPm1haW4gIT0gbXNwLT5zZWNvbmQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0MDA6IEZNLXN0ZXJlbyBjYXJyaWVyIDogJWQuJTAzZCBNSHpcbiIsCisJCSAgICAgICBtc3AtPnNlY29uZC85MTAwMDAsKG1zcC0+c2Vjb25kLzkxMCklMTAwMCk7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgUkVHSVNURVJfRFVNUCB7CisJaW50ICAgYWRkcjsKKwljaGFyICpuYW1lOworfTsKKworc3RhdGljIGludAorYXV0b2RldGVjdF9zdGVyZW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWw7CisJaW50IHJ4c3ViY2hhbnMgPSBtc3AtPnJ4c3ViY2hhbnM7CisJaW50IG5ld25pY2FtICAgPSBtc3AtPm5pY2FtX29uOworCWludCB1cGRhdGUgPSAwOworCisJc3dpdGNoIChtc3AtPm1vZGUpIHsKKwljYXNlIE1TUF9NT0RFX0ZNX1RFUlJBOgorCQl2YWwgPSBtc3AzNDAwY19yZWFkKGNsaWVudCwgSTJDX01TUDM0MDBDX0RGUCwgMHgxOCk7CisJCWlmICh2YWwgPiAzMjc2NykKKwkJCXZhbCAtPSA2NTUzNjsKKwkJZHByaW50ayhLRVJOX0RFQlVHCisJCQkibXNwMzR4eDogc3RlcmVvIGRldGVjdCByZWdpc3RlcjogJWRcbiIsdmFsKTsKKwkJaWYgKHZhbCA+IDQwOTYpIHsKKwkJCXJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU8gfCBWNEwyX1RVTkVSX1NVQl9NT05POworCQl9IGVsc2UgaWYgKHZhbCA8IC00MDk2KSB7CisJCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTEFORzEgfCBWNEwyX1RVTkVSX1NVQl9MQU5HMjsKKwkJfSBlbHNlIHsKKwkJCXJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCQl9CisJCW5ld25pY2FtID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNU1BfTU9ERV9GTV9OSUNBTTE6CisJY2FzZSBNU1BfTU9ERV9GTV9OSUNBTTI6CisJY2FzZSBNU1BfTU9ERV9BTV9OSUNBTToKKwkJdmFsID0gbXNwMzQwMGNfcmVhZChjbGllbnQsIEkyQ19NU1AzNDAwQ19ERU0sIDB4MjMpOworCQlkcHJpbnRrKEtFUk5fREVCVUcKKwkJCSJtc3AzNHh4OiBuaWNhbSBzeW5jPSVkLCBtb2RlPSVkXG4iLAorCQkJdmFsICYgMSwgKHZhbCAmIDB4MWUpID4+IDEpOworCisJCWlmICh2YWwgJiAxKSB7CisJCQkvKiBuaWNhbSBzeW5jZWQgKi8KKwkJCXN3aXRjaCAoKHZhbCAmIDB4MWUpID4+IDEpICB7CisJCQljYXNlIDA6CisJCQljYXNlIDg6CisJCQkJcnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCWNhc2UgOToKKwkJCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTworCQkJCQl8IFY0TDJfVFVORVJfU1VCX0xBTkcxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJY2FzZSAxMDoKKwkJCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTworCQkJCQl8IFY0TDJfVFVORVJfU1VCX0xBTkcxCisJCQkJCXwgVjRMMl9UVU5FUl9TVUJfTEFORzI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCQkJCWJyZWFrOworCQkJfQorCQkJbmV3bmljYW09MTsKKwkJfSBlbHNlIHsKKwkJCW5ld25pY2FtID0gMDsKKwkJCXJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCQl9CisJCWJyZWFrOworCWNhc2UgTVNQX01PREVfQlRTQzoKKwkJdmFsID0gbXNwMzQwMGNfcmVhZChjbGllbnQsIEkyQ19NU1AzNDAwQ19ERU0sIDB4MjAwKTsKKwkJZHByaW50ayhLRVJOX0RFQlVHCisJCQkibXNwMzQxMDogc3RhdHVzPTB4JXggKHByaT0lcywgc2VjPSVzLCAlcyVzJXMpXG4iLAorCQkJdmFsLAorCQkJKHZhbCAmIDB4MDAwMikgPyAibm8iICAgICA6ICJ5ZXMiLAorCQkJKHZhbCAmIDB4MDAwNCkgPyAibm8iICAgICA6ICJ5ZXMiLAorCQkJKHZhbCAmIDB4MDA0MCkgPyAic3RlcmVvIiA6ICJtb25vIiwKKwkJCSh2YWwgJiAweDAwODApID8gIiwgbmljYW0gMm5kIG1vbm8iIDogIiIsCisJCQkodmFsICYgMHgwMTAwKSA/ICIsIGJpbGluZ3VhbC9TQVAiICA6ICIiKTsKKwkJcnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJCWlmICh2YWwgJiAweDAwNDApIHJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworCQlpZiAodmFsICYgMHgwMTAwKSByeHN1YmNoYW5zIHw9IFY0TDJfVFVORVJfU1VCX0xBTkcxOworCQlicmVhazsKKwl9CisJaWYgKHJ4c3ViY2hhbnMgIT0gbXNwLT5yeHN1YmNoYW5zKSB7CisJCXVwZGF0ZSA9IDE7CisJCWRwcmludGsoS0VSTl9ERUJVRyAibXNwMzR4eDogd2F0Y2g6IHJ4c3ViY2hhbnMgJWQgPT4gJWRcbiIsCisJCQltc3AtPnJ4c3ViY2hhbnMscnhzdWJjaGFucyk7CisJCW1zcC0+cnhzdWJjaGFucyA9IHJ4c3ViY2hhbnM7CisJfQorCWlmIChuZXduaWNhbSAhPSBtc3AtPm5pY2FtX29uKSB7CisJCXVwZGF0ZSA9IDE7CisJCWRwcmludGsoS0VSTl9ERUJVRyAibXNwMzR4eDogd2F0Y2g6IG5pY2FtICVkID0+ICVkXG4iLAorCQkJbXNwLT5uaWNhbV9vbixuZXduaWNhbSk7CisJCW1zcC0+bmljYW1fb24gPSBuZXduaWNhbTsKKwl9CisJcmV0dXJuIHVwZGF0ZTsKK30KKworLyoKKyAqIEEga2VybmVsIHRocmVhZCBmb3IgbXNwMzQwMCBjb250cm9sIC0tIHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgdGhlCisgKiBpbiB0aGUgaW9jdGwgd2hpbGUgZG9pbmcgdGhlIHNvdW5kIGNhcnJpZXIgJiBzdGVyZW8gZGV0ZWN0CisgKi8KKworc3RhdGljIGludCBtc3AzNHh4X3NsZWVwKHN0cnVjdCBtc3AzNDAwYyAqbXNwLCBpbnQgdGltZW91dCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworYWdhaW46CisJYWRkX3dhaXRfcXVldWUoJm1zcC0+d3EsICZ3YWl0KTsKKwlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlpZiAodGltZW91dCA8IDApIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZSgpOworCQl9IGVsc2UgeworI2lmIDAKKwkJCS8qIGhtbSwgdGhhdCBvbmUgZG9lc24ndCByZXR1cm4gb24gd2FrZXVwIC4uLiAqLworCQkJbXNsZWVwX2ludGVycnVwdGlibGUodGltZW91dCk7CisjZWxzZQorCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7CisjZW5kaWYKKwkJfQorCX0KKworCXJlbW92ZV93YWl0X3F1ZXVlKCZtc3AtPndxLCAmd2FpdCk7CisKKwlpZiAodHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpKQorCQlnb3RvIGFnYWluOworCisJcmV0dXJuIG1zcC0+cmVzdGFydDsKK30KKworLyogc3RlcmVvL211bHRpbGFuZyBtb25pdG9yaW5nICovCitzdGF0aWMgdm9pZCB3YXRjaF9zdGVyZW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWYgKGF1dG9kZXRlY3Rfc3RlcmVvKGNsaWVudCkpCisJCW1zcDM0MDBjX3NldF9hdWRtb2RlKGNsaWVudCxiZXN0X2F1ZGlvX21vZGUobXNwLT5yeHN1YmNoYW5zKSk7CisJaWYgKG9uY2UpCisJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMDsKK30KKworc3RhdGljIGludCBtc3AzNDAwY190aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YTsKKwlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBDQVJSSUVSX0RFVEVDVCAqY2Q7CisJaW50IGNvdW50LCBtYXgxLG1heDIsdmFsMSx2YWwyLCB2YWwsdGhpczsKKworCXByaW50aygibXNwMzQwMDoga3RocmVhZCBzdGFydGVkXG4iKTsKKwlmb3IgKDs7KSB7CisJCWQycHJpbnRrKCJtc3AzNDAwOiB0aHJlYWQ6IHNsZWVwXG4iKTsKKwkJbXNwMzR4eF9zbGVlcChtc3AsLTEpOworCQlkMnByaW50aygibXNwMzQwMDogdGhyZWFkOiB3YWtldXBcbiIpOworCisJcmVzdGFydDoKKwkJZHByaW50aygibXNwMzQxMDogdGhyZWFkOiByZXN0YXJ0IHNjYW5cbiIpOworCQltc3AtPnJlc3RhcnQgPSAwOworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisKKwkJaWYgKFZJREVPX01PREVfUkFESU8gPT0gbXNwLT5ub3JtIHx8CisJCSAgICBNU1BfTU9ERV9FWFRFUk4gID09IG1zcC0+bW9kZSkgeworCQkJLyogbm8gY2FycmllciBzY2FuLCBqdXN0IHVubXV0ZSAqLworCQkJcHJpbnRrKCJtc3AzNDAwOiB0aHJlYWQ6IG5vIGNhcnJpZXIgc2NhblxuIik7CisJCQltc3AzNDAwY19zZXR2b2x1bWUoY2xpZW50LCBtc3AtPm11dGVkLAorCQkJCQkgICBtc3AtPnZvbHVtZSwgbXNwLT5iYWxhbmNlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogbXV0ZSAqLworCQltc3AzNDAwY19zZXR2b2x1bWUoY2xpZW50LCBtc3AtPm11dGVkLCAwLCAwKTsKKwkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0FNX0RFVEVDVCAvKiArMSAqLyApOworCQl2YWwxID0gdmFsMiA9IDA7CisJCW1heDEgPSBtYXgyID0gLTE7CisJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMDsKKworCQkvKiBzb21lIHRpbWUgZm9yIHRoZSB0dW5lciB0byBzeW5jICovCisJCWlmIChtc3AzNHh4X3NsZWVwKG1zcCwyMDApKQorCQkJZ290byByZXN0YXJ0OworCisJCS8qIGNhcnJpZXIgZGV0ZWN0IHBhc3MgIzEgLS0gbWFpbiBjYXJyaWVyICovCisJCWNkID0gY2Fycmllcl9kZXRlY3RfbWFpbjsgY291bnQgPSBDQVJSSUVSX0NPVU5UKGNhcnJpZXJfZGV0ZWN0X21haW4pOworCisJCWlmIChhbXNvdW5kICYmIChtc3AtPm5vcm0gPT0gVklERU9fTU9ERV9TRUNBTSkpIHsKKwkJCS8qIGF1dG9kZXRlY3QgZG9lc24ndCB3b3JrIHdlbGwgd2l0aCBBTSAuLi4gKi8KKwkJCW1heDEgPSAzOworCQkJY291bnQgPSAwOworCQkJZHByaW50aygibXNwMzQwMDogQU0gc291bmQgb3ZlcnJpZGVcbiIpOworCQl9CisKKwkJZm9yICh0aGlzID0gMDsgdGhpcyA8IGNvdW50OyB0aGlzKyspIHsKKwkJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBjZFt0aGlzXS5jZG8sY2RbdGhpc10uY2RvKTsKKwkJCWlmIChtc3AzNHh4X3NsZWVwKG1zcCwxMDApKQorCQkJCWdvdG8gcmVzdGFydDsKKwkJCXZhbCA9IG1zcDM0MDBjX3JlYWQoY2xpZW50LCBJMkNfTVNQMzQwMENfREZQLCAweDFiKTsKKwkJCWlmICh2YWwgPiAzMjc2NykKKwkJCQl2YWwgLT0gNjU1MzY7CisJCQlpZiAodmFsMSA8IHZhbCkKKwkJCQl2YWwxID0gdmFsLCBtYXgxID0gdGhpczsKKwkJCWRwcmludGsoIm1zcDM0MDA6IGNhcnJpZXIxIHZhbDogJTVkIC8gJXNcbiIsIHZhbCxjZFt0aGlzXS5uYW1lKTsKKwkJfQorCisJCS8qIGNhcnJpZXIgZGV0ZWN0IHBhc3MgIzIgLS0gc2Vjb25kIChzdGVyZW8pIGNhcnJpZXIgKi8KKwkJc3dpdGNoIChtYXgxKSB7CisJCWNhc2UgMTogLyogNS41ICovCisJCQljZCA9IGNhcnJpZXJfZGV0ZWN0XzU1OworCQkJY291bnQgPSBDQVJSSUVSX0NPVU5UKGNhcnJpZXJfZGV0ZWN0XzU1KTsKKwkJCWJyZWFrOworCQljYXNlIDM6IC8qIDYuNSAqLworCQkJY2QgPSBjYXJyaWVyX2RldGVjdF82NTsKKwkJCWNvdW50ID0gQ0FSUklFUl9DT1VOVChjYXJyaWVyX2RldGVjdF82NSk7CisJCQlicmVhazsKKwkJY2FzZSAwOiAvKiA0LjUgKi8KKwkJY2FzZSAyOiAvKiA2LjAgKi8KKwkJZGVmYXVsdDoKKwkJCWNkID0gTlVMTDsgY291bnQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYW1zb3VuZCAmJiAobXNwLT5ub3JtID09IFZJREVPX01PREVfU0VDQU0pKSB7CisJCQkvKiBhdXRvZGV0ZWN0IGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggQU0gLi4uICovCisJCQljZCA9IE5VTEw7IGNvdW50ID0gMDsgbWF4MiA9IDA7CisJCX0KKwkJZm9yICh0aGlzID0gMDsgdGhpcyA8IGNvdW50OyB0aGlzKyspIHsKKwkJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBjZFt0aGlzXS5jZG8sY2RbdGhpc10uY2RvKTsKKwkJCWlmIChtc3AzNHh4X3NsZWVwKG1zcCwxMDApKQorCQkJCWdvdG8gcmVzdGFydDsKKwkJCXZhbCA9IG1zcDM0MDBjX3JlYWQoY2xpZW50LCBJMkNfTVNQMzQwMENfREZQLCAweDFiKTsKKwkJCWlmICh2YWwgPiAzMjc2NykKKwkJCQl2YWwgLT0gNjU1MzY7CisJCQlpZiAodmFsMiA8IHZhbCkKKwkJCQl2YWwyID0gdmFsLCBtYXgyID0gdGhpczsKKwkJCWRwcmludGsoIm1zcDM0MDA6IGNhcnJpZXIyIHZhbDogJTVkIC8gJXNcbiIsIHZhbCxjZFt0aGlzXS5uYW1lKTsKKwkJfQorCisJCS8qIHByb2dyYW1tIHRoZSBtc3AzNDAwIGFjY29yZGluZyB0byB0aGUgcmVzdWx0cyAqLworCQltc3AtPm1haW4gICA9IGNhcnJpZXJfZGV0ZWN0X21haW5bbWF4MV0uY2RvOworCQlzd2l0Y2ggKG1heDEpIHsKKwkJY2FzZSAxOiAvKiA1LjUgKi8KKwkJCWlmIChtYXgyID09IDApIHsKKwkJCQkvKiBCL0cgRk0tc3RlcmVvICovCisJCQkJbXNwLT5zZWNvbmQgPSBjYXJyaWVyX2RldGVjdF81NVttYXgyXS5jZG87CisJCQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0ZNX1RFUlJBKTsKKwkJCQltc3AtPm5pY2FtX29uID0gMDsKKwkJCQltc3AzNDAwY19zZXRfYXVkbW9kZShjbGllbnQsIFY0TDJfVFVORVJfTU9ERV9NT05PKTsKKwkJCQltc3AtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQl9IGVsc2UgaWYgKG1heDIgPT0gMSAmJiBIQVZFX05JQ0FNKG1zcCkpIHsKKwkJCQkvKiBCL0cgTklDQU0gKi8KKwkJCQltc3AtPnNlY29uZCA9IGNhcnJpZXJfZGV0ZWN0XzU1W21heDJdLmNkbzsKKwkJCQltc3AzNDAwY19zZXRtb2RlKGNsaWVudCwgTVNQX01PREVfRk1fTklDQU0xKTsKKwkJCQltc3AtPm5pY2FtX29uID0gMTsKKwkJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgbXNwLT5zZWNvbmQsIG1zcC0+bWFpbik7CisJCQkJbXNwLT53YXRjaF9zdGVyZW8gPSAxOworCQkJfSBlbHNlIHsKKwkJCQlnb3RvIG5vX3NlY29uZDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6IC8qIDYuMCAqLworCQkJLyogUEFMIEkgTklDQU0gKi8KKwkJCW1zcC0+c2Vjb25kID0gTVNQX0NBUlJJRVIoNi41NTIpOworCQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0ZNX05JQ0FNMik7CisJCQltc3AtPm5pY2FtX29uID0gMTsKKwkJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBtc3AtPnNlY29uZCwgbXNwLT5tYWluKTsKKwkJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDM6IC8qIDYuNSAqLworCQkJaWYgKG1heDIgPT0gMSB8fCBtYXgyID09IDIpIHsKKwkJCQkvKiBEL0sgRk0tc3RlcmVvICovCisJCQkJbXNwLT5zZWNvbmQgPSBjYXJyaWVyX2RldGVjdF82NVttYXgyXS5jZG87CisJCQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0ZNX1RFUlJBKTsKKwkJCQltc3AtPm5pY2FtX29uID0gMDsKKwkJCQltc3AzNDAwY19zZXRfYXVkbW9kZShjbGllbnQsIFY0TDJfVFVORVJfTU9ERV9NT05PKTsKKwkJCQltc3AtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQl9IGVsc2UgaWYgKG1heDIgPT0gMCAmJgorCQkJCSAgIG1zcC0+bm9ybSA9PSBWSURFT19NT0RFX1NFQ0FNKSB7CisJCQkJLyogTCBOSUNBTSBvciBBTS1tb25vICovCisJCQkJbXNwLT5zZWNvbmQgPSBjYXJyaWVyX2RldGVjdF82NVttYXgyXS5jZG87CisJCQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0FNX05JQ0FNKTsKKwkJCQltc3AtPm5pY2FtX29uID0gMDsKKwkJCQltc3AzNDAwY19zZXRfYXVkbW9kZShjbGllbnQsIFY0TDJfVFVORVJfTU9ERV9NT05PKTsKKwkJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgbXNwLT5zZWNvbmQsIG1zcC0+bWFpbik7CisJCQkJLyogdm9sdW1lIHByZXNjYWxlIGZvciBTQ0FSVCAoQU0gbW9ubyBpbnB1dCkgKi8KKwkJCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDBkLCAweDE5MDApOworCQkJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMTsKKwkJCX0gZWxzZSBpZiAobWF4MiA9PSAwICYmIEhBVkVfTklDQU0obXNwKSkgeworCQkJCS8qIEQvSyBOSUNBTSAqLworCQkJCW1zcC0+c2Vjb25kID0gY2Fycmllcl9kZXRlY3RfNjVbbWF4Ml0uY2RvOworCQkJCW1zcDM0MDBjX3NldG1vZGUoY2xpZW50LCBNU1BfTU9ERV9GTV9OSUNBTTEpOworCQkJCW1zcC0+bmljYW1fb24gPSAxOworCQkJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBtc3AtPnNlY29uZCwgbXNwLT5tYWluKTsKKwkJCQltc3AtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQl9IGVsc2UgeworCQkJCWdvdG8gbm9fc2Vjb25kOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMDogLyogNC41ICovCisJCWRlZmF1bHQ6CisJCW5vX3NlY29uZDoKKwkJCW1zcC0+c2Vjb25kID0gY2Fycmllcl9kZXRlY3RfbWFpblttYXgxXS5jZG87CisJCQltc3AzNDAwY19zZXRtb2RlKGNsaWVudCwgTVNQX01PREVfRk1fVEVSUkEpOworCQkJbXNwLT5uaWNhbV9vbiA9IDA7CisJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgbXNwLT5zZWNvbmQsIG1zcC0+bWFpbik7CisJCQltc3AtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCQkJbXNwMzQwMGNfc2V0X2F1ZG1vZGUoY2xpZW50LCBWNEwyX1RVTkVSX01PREVfTU9OTyk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHVubXV0ZSAqLworCQltc3AzNDAwY19zZXR2b2x1bWUoY2xpZW50LCBtc3AtPm11dGVkLAorCQkJCSAgIG1zcC0+dm9sdW1lLCBtc3AtPmJhbGFuY2UpOworCQlpZiAoZGVidWcpCisJCQltc3AzNDAwY19wcmludF9tb2RlKG1zcCk7CisKKwkJLyogbW9uaXRvciB0diBhdWRpbyBtb2RlICovCisJCXdoaWxlIChtc3AtPndhdGNoX3N0ZXJlbykgeworCQkJaWYgKG1zcDM0eHhfc2xlZXAobXNwLDUwMDApKQorCQkJCWdvdG8gcmVzdGFydDsKKwkJCXdhdGNoX3N0ZXJlbyhjbGllbnQpOworCQl9CisJfQorCWRwcmludGsoS0VSTl9ERUJVRyAibXNwMzQwMDogdGhyZWFkOiBleGl0XG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHRoaXMgb25lIHVzZXMgdGhlIGF1dG9tYXRpYyBzb3VuZCBzdGFuZGFyZCBkZXRlY3Rpb24gb2YgbmV3ZXIgICAgICAgICAgICovCisvKiBtc3AzNHh4IGNoaXAgdmVyc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgc3RydWN0IE1PREVTIHsKKwlpbnQgcmV0dmFsOworCWludCBtYWluLCBzZWNvbmQ7CisJY2hhciAqbmFtZTsKK30gbW9kZWxpc3RbXSA9IHsKKwl7IDB4MDAwMCwgMCwgMCwgIkVSUk9SIiB9LAorCXsgMHgwMDAxLCAwLCAwLCAiYXV0b2RldGVjdCBzdGFydCIgfSwKKwl7IDB4MDAwMiwgTVNQX0NBUlJJRVIoNC41KSwgTVNQX0NBUlJJRVIoNC43MiksICI0LjUvNC43MiAgTSBEdWFsIEZNLVN0ZXJlbyIgfSwKKwl7IDB4MDAwMywgTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS43NDIxODc1KSwgIjUuNS81Ljc0ICBCL0cgRHVhbCBGTS1TdGVyZW8iIH0sCisJeyAweDAwMDQsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuMjU3ODEyNSksICI2LjUvNi4yNSAgRC9LMSBEdWFsIEZNLVN0ZXJlbyIgfSwKKwl7IDB4MDAwNSwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi43NDIxODc1KSwgIjYuNS82Ljc0ICBEL0syIER1YWwgRk0tU3RlcmVvIiB9LAorCXsgMHgwMDA2LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2LjUpLCAiNi41ICBEL0sgRk0tTW9ubyAoSERFVjMpIiB9LAorCXsgMHgwMDA4LCBNU1BfQ0FSUklFUig1LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwgIjUuNS81Ljg1ICBCL0cgTklDQU0gRk0iIH0sCisJeyAweDAwMDksIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDUuODUpLCAiNi41LzUuODUgIEwgTklDQU0gQU0iIH0sCisJeyAweDAwMGEsIE1TUF9DQVJSSUVSKDYuMCksIE1TUF9DQVJSSUVSKDYuNTUpLCAiNi4wLzYuNTUgIEkgTklDQU0gRk0iIH0sCisJeyAweDAwMGIsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDUuODUpLCAiNi41LzUuODUgIEQvSyBOSUNBTSBGTSIgfSwKKwl7IDB4MDAwYywgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNS44NSksICI2LjUvNS44NSAgRC9LIE5JQ0FNIEZNIChIREVWMikiIH0sCisJeyAweDAwMjAsIE1TUF9DQVJSSUVSKDQuNSksIE1TUF9DQVJSSUVSKDQuNSksICI0LjUgIE0gQlRTQy1TdGVyZW8iIH0sCisJeyAweDAwMjEsIE1TUF9DQVJSSUVSKDQuNSksIE1TUF9DQVJSSUVSKDQuNSksICI0LjUgIE0gQlRTQy1Nb25vICsgU0FQIiB9LAorCXsgMHgwMDMwLCBNU1BfQ0FSUklFUig0LjUpLCBNU1BfQ0FSUklFUig0LjUpLCAiNC41ICBNIEVJQS1KIEphcGFuIFN0ZXJlbyIgfSwKKwl7IDB4MDA0MCwgTVNQX0NBUlJJRVIoMTAuNyksIE1TUF9DQVJSSUVSKDEwLjcpLCAiMTAuNyAgRk0tU3RlcmVvIFJhZGlvIiB9LAorCXsgMHgwMDUwLCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2LjUpLCAiNi41ICBTQVQtTW9ubyIgfSwKKwl7IDB4MDA1MSwgTVNQX0NBUlJJRVIoNy4wMiksIE1TUF9DQVJSSUVSKDcuMjApLCAiNy4wMi83LjIwICBTQVQtU3RlcmVvIiB9LAorCXsgMHgwMDYwLCBNU1BfQ0FSUklFUig3LjIpLCBNU1BfQ0FSUklFUig3LjIpLCAiNy4yICBTQVQgQURSIiB9LAorCXsgICAgIC0xLCAwLCAwLCBOVUxMIH0sIC8qIEVPRiAqLworfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICptc3AzNHh4X3N0YW5kYXJkX21vZGVfbmFtZShpbnQgbW9kZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBtb2RlbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJaWYgKG1vZGVsaXN0W2ldLnJldHZhbCA9PSBtb2RlKQorCQkJcmV0dXJuIG1vZGVsaXN0W2ldLm5hbWU7CisJcmV0dXJuICJ1bmtub3duIjsKK30KKworc3RhdGljIGludCBtc3AzNHh4X21vZHVzKGludCBub3JtKQoreworCXN3aXRjaCAobm9ybSkgeworCWNhc2UgVklERU9fTU9ERV9QQUw6CisJCXJldHVybiAweDEwMDM7CisJY2FzZSBWSURFT19NT0RFX05UU0M6ICAvKiBCVFNDICovCisJCXJldHVybiAweDIwMDM7CisJY2FzZSBWSURFT19NT0RFX1NFQ0FNOgorCQlyZXR1cm4gMHgwMDAzOworCWNhc2UgVklERU9fTU9ERV9SQURJTzoKKwkJcmV0dXJuIDB4MDAwMzsKKwljYXNlIFZJREVPX01PREVfQVVUTzoKKwkJcmV0dXJuIDB4MjAwMzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMHgwMDAzOworCX0KK30KKworc3RhdGljIGludCBtc3AzNHh4X3N0YW5kYXJkKGludCBub3JtKQoreworCXN3aXRjaCAobm9ybSkgeworCWNhc2UgVklERU9fTU9ERV9QQUw6CisJCXJldHVybiAxOworCWNhc2UgVklERU9fTU9ERV9OVFNDOiAgLyogQlRTQyAqLworCQlyZXR1cm4gMHgwMDIwOworCWNhc2UgVklERU9fTU9ERV9TRUNBTToKKwkJcmV0dXJuIDE7CisJY2FzZSBWSURFT19NT0RFX1JBRElPOgorCQlyZXR1cm4gMHgwMDQwOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIGludCBtc3AzNDEwZF90aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YTsKKwlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBtb2RlLHZhbCxpLHN0ZDsKKworCXByaW50aygibXNwMzQxMDogZGFlbW9uIHN0YXJ0ZWRcbiIpOworCWZvciAoOzspIHsKKwkJZDJwcmludGsoS0VSTl9ERUJVRyAibXNwMzQxMDogdGhyZWFkOiBzbGVlcFxuIik7CisJCW1zcDM0eHhfc2xlZXAobXNwLC0xKTsKKwkJZDJwcmludGsoS0VSTl9ERUJVRyAibXNwMzQxMDogdGhyZWFkOiB3YWtldXBcbiIpOworCisJcmVzdGFydDoKKwkJZHByaW50aygibXNwMzQxMDogdGhyZWFkOiByZXN0YXJ0IHNjYW5cbiIpOworCQltc3AtPnJlc3RhcnQgPSAwOworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisKKwkJaWYgKG1zcC0+bW9kZSA9PSBNU1BfTU9ERV9FWFRFUk4pIHsKKwkJCS8qIG5vIGNhcnJpZXIgc2NhbiBuZWVkZWQsIGp1c3QgdW5tdXRlICovCisJCQlkcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0MTA6IHRocmVhZDogbm8gY2FycmllciBzY2FuXG4iKTsKKwkJCW1zcDM0MDBjX3NldHZvbHVtZShjbGllbnQsIG1zcC0+bXV0ZWQsCisJCQkJCSAgIG1zcC0+dm9sdW1lLCBtc3AtPmJhbGFuY2UpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBwdXQgaW50byBzYW5lIHN0YXRlIChhbmQgbXV0ZSkgKi8KKwkJbXNwMzQwMGNfcmVzZXQoY2xpZW50KTsKKworCQkvKiBzb21lIHRpbWUgZm9yIHRoZSB0dW5lciB0byBzeW5jICovCisJCWlmIChtc3AzNHh4X3NsZWVwKG1zcCwyMDApKQorCQkJZ290byByZXN0YXJ0OworCisJCS8qIHN0YXJ0IGF1dG9kZXRlY3QgKi8KKwkJbW9kZSA9IG1zcDM0eHhfbW9kdXMobXNwLT5ub3JtKTsKKwkJc3RkICA9IG1zcDM0eHhfc3RhbmRhcmQobXNwLT5ub3JtKTsKKwkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LCBJMkNfTVNQMzQwMENfREVNLCAweDMwLCBtb2RlKTsKKwkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LCBJMkNfTVNQMzQwMENfREVNLCAweDIwLCBzdGQpOworCQltc3AtPndhdGNoX3N0ZXJlbyA9IDA7CisKKwkJaWYgKGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0MTA6IHNldHRpbmcgbW9kZTogJXMgKDB4JTA0eClcbiIsCisJCQkgICAgICAgbXNwMzR4eF9zdGFuZGFyZF9tb2RlX25hbWUoc3RkKSAsc3RkKTsKKworCQlpZiAoc3RkICE9IDEpIHsKKwkJCS8qIHByb2dyYW1tZWQgc29tZSBzcGVjaWZpYyBtb2RlICovCisJCQl2YWwgPSBzdGQ7CisJCX0gZWxzZSB7CisJCQkvKiB0cmlnZ2VyZWQgYXV0b2RldGVjdCAqLworCQkJZm9yICg7OykgeworCQkJCWlmIChtc3AzNHh4X3NsZWVwKG1zcCwxMDApKQorCQkJCQlnb3RvIHJlc3RhcnQ7CisKKwkJCQkvKiBjaGVjayByZXN1bHRzICovCisJCQkJdmFsID0gbXNwMzQwMGNfcmVhZChjbGllbnQsIEkyQ19NU1AzNDAwQ19ERU0sIDB4N2UpOworCQkJCWlmICh2YWwgPCAweDA3ZmYpCisJCQkJCWJyZWFrOworCQkJCWRwcmludGsoS0VSTl9ERUJVRyAibXNwMzQxMDogZGV0ZWN0aW9uIHN0aWxsIGluIHByb2dyZXNzXG4iKTsKKwkJCX0KKwkJfQorCQlmb3IgKGkgPSAwOyBtb2RlbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJCWlmIChtb2RlbGlzdFtpXS5yZXR2YWwgPT0gdmFsKQorCQkJCWJyZWFrOworCQlkcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0MTA6IGN1cnJlbnQgbW9kZTogJXMgKDB4JTA0eClcbiIsCisJCQltb2RlbGlzdFtpXS5uYW1lID8gbW9kZWxpc3RbaV0ubmFtZSA6ICJ1bmtub3duIiwKKwkJCXZhbCk7CisJCW1zcC0+bWFpbiAgID0gbW9kZWxpc3RbaV0ubWFpbjsKKwkJbXNwLT5zZWNvbmQgPSBtb2RlbGlzdFtpXS5zZWNvbmQ7CisKKwkJaWYgKGFtc291bmQgJiYgKG1zcC0+bm9ybSA9PSBWSURFT19NT0RFX1NFQ0FNKSAmJiAodmFsICE9IDB4MDAwOSkpIHsKKwkJCS8qIGF1dG9kZXRlY3Rpb24gaGFzIGZhaWxlZCwgbGV0IGJhY2t1cCAqLworCQkJZHByaW50ayhLRVJOX0RFQlVHICJtc3AzNDEwOiBhdXRvZGV0ZWN0aW9uIGZhaWxlZCwiCisJCQkJIiBzd2l0Y2hpbmcgdG8gYmFja3VwIG1vZGU6ICVzICgweCUwNHgpXG4iLAorCQkJCW1vZGVsaXN0WzhdLm5hbWUgPyBtb2RlbGlzdFs4XS5uYW1lIDogInVua25vd24iLHZhbCk7CisJCQl2YWwgPSAweDAwMDk7CisJCQltc3AzNDAwY193cml0ZShjbGllbnQsIEkyQ19NU1AzNDAwQ19ERU0sIDB4MjAsIHZhbCk7CisJCX0KKworCQkvKiBzZXQgdmFyaW91cyBwcmVzY2FsZXMgKi8KKwkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LCBJMkNfTVNQMzQwMENfREZQLCAweDBkLCAweDE5MDApOyAvKiBzY2FydCAqLworCQltc3AzNDAwY193cml0ZShjbGllbnQsIEkyQ19NU1AzNDAwQ19ERlAsIDB4MGUsIDB4MjQwMyk7IC8qIEZNICovCisJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCwgSTJDX01TUDM0MDBDX0RGUCwgMHgxMCwgMHg1YTAwKTsgLyogbmljYW0gKi8KKworCQkvKiBzZXQgc3RlcmVvICovCisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMHgwMDA4OiAvKiBCL0cgTklDQU0gKi8KKwkJY2FzZSAweDAwMGE6IC8qIEkgTklDQU0gKi8KKwkJCWlmICh2YWwgPT0gMHgwMDA4KQorCQkJCW1zcC0+bW9kZSA9IE1TUF9NT0RFX0ZNX05JQ0FNMTsKKwkJCWVsc2UKKwkJCQltc3AtPm1vZGUgPSBNU1BfTU9ERV9GTV9OSUNBTTI7CisJCQkvKiBqdXN0IHR1cm4gb24gc3RlcmVvICovCisJCQltc3AtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJCQltc3AtPm5pY2FtX29uID0gMTsKKwkJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMTsKKwkJCW1zcDM0MDBjX3NldF9hdWRtb2RlKGNsaWVudCxWNEwyX1RVTkVSX01PREVfU1RFUkVPKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAwOToKKwkJCW1zcC0+bW9kZSA9IE1TUF9NT0RFX0FNX05JQ0FNOworCQkJbXNwLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCW1zcC0+bmljYW1fb24gPSAxOworCQkJbXNwMzQwMGNfc2V0X2F1ZG1vZGUoY2xpZW50LFY0TDJfVFVORVJfTU9ERV9NT05PKTsKKwkJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAyMDogLyogQlRTQyAqLworCQkJLyoganVzdCB0dXJuIG9uIHN0ZXJlbyAqLworCQkJbXNwLT5tb2RlID0gTVNQX01PREVfQlRTQzsKKwkJCW1zcC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwkJCW1zcC0+bmljYW1fb24gPSAwOworCQkJbXNwLT53YXRjaF9zdGVyZW8gPSAxOworCQkJbXNwMzQwMGNfc2V0X2F1ZG1vZGUoY2xpZW50LFY0TDJfVFVORVJfTU9ERV9TVEVSRU8pOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDQwOiAvKiBGTSByYWRpbyAqLworCQkJbXNwLT5tb2RlICAgPSBNU1BfTU9ERV9GTV9SQURJTzsKKwkJCW1zcC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwkJCW1zcC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJCQltc3AtPm5pY2FtX29uID0gMDsKKwkJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMDsKKwkJCS8qIG5vdCBuZWVkZWQgaW4gdGhlb3J5IGlmIEhBVkVfUkFESU8oKSwgYnV0CisJCQkgICBzaG9ydCBwcm9ncmFtbWluZyBlbmFibGVzIGNhcnJpZXIgbXV0ZSAqLworCQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsTVNQX01PREVfRk1fUkFESU8pOworCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIE1TUF9DQVJSSUVSKDEwLjcpLAorCQkJCQkgICAgTVNQX0NBUlJJRVIoMTAuNykpOworCQkJLyogc2NhcnQgcm91dGluZyAqLworCQkJbXNwMzQwMGNfc2V0X3NjYXJ0KGNsaWVudCxTQ0FSVF9JTjIsMCk7CisjaWYgMAorCQkJLyogcmFkaW8gZnJvbSBTQ0FSVF9JTjIgKi8KKwkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDA4LCAweDAyMjApOworCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDksIDB4MDIyMCk7CisJCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwYiwgMHgwMjIwKTsKKyNlbHNlCisJCQkvKiBtc3AzNHh4IGRvZXMgcmFkaW8gZGVjb2RpbmcgKi8KKwkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDA4LCAweDAwMjApOworCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDksIDB4MDAyMCk7CisJCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwYiwgMHgwMDIwKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgMHgwMDAzOgorCQljYXNlIDB4MDAwNDoKKwkJY2FzZSAweDAwMDU6CisJCQltc3AtPm1vZGUgICA9IE1TUF9NT0RFX0ZNX1RFUlJBOworCQkJbXNwLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCW1zcC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POworCQkJbXNwLT5uaWNhbV9vbiA9IDA7CisJCQltc3AtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHVubXV0ZSwgcmVzdG9yZSBtaXNjIHJlZ2lzdGVycyAqLworCQltc3AzNDAwY19zZXRiYXNzKGNsaWVudCwgbXNwLT5iYXNzKTsKKwkJbXNwMzQwMGNfc2V0dHJlYmxlKGNsaWVudCwgbXNwLT50cmVibGUpOworCQltc3AzNDAwY19zZXR2b2x1bWUoY2xpZW50LCBtc3AtPm11dGVkLAorCQkJCSAgICBtc3AtPnZvbHVtZSwgbXNwLT5iYWxhbmNlKTsKKwkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LCBJMkNfTVNQMzQwMENfREZQLCAweDAwMTMsIG1zcC0+YWNiKTsKKworCQkvKiBtb25pdG9yIHR2IGF1ZGlvIG1vZGUgKi8KKwkJd2hpbGUgKG1zcC0+d2F0Y2hfc3RlcmVvKSB7CisJCQlpZiAobXNwMzR4eF9zbGVlcChtc3AsNTAwMCkpCisJCQkJZ290byByZXN0YXJ0OworCQkJd2F0Y2hfc3RlcmVvKGNsaWVudCk7CisJCX0KKwl9CisJZHByaW50ayhLRVJOX0RFQlVHICJtc3AzNDEwOiB0aHJlYWQ6IGV4aXRcbiIpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogbXNwMzR4eEcgKyAoc2ltcGxlciBuby10aHJlYWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHRoaXMgb25lIHVzZXMgYm90aCBhdXRvbWF0aWMgc3RhbmRhcmQgZGV0ZWN0aW9uIGFuZCBhdXRvbWF0aWMgc291bmQgICAgICovCisvKiBzZWxlY3Qgd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGUgbmV3ZXIgRyB2ZXJzaW9ucyAgICAgICAgICAgICAgICAgICAgICAqLworLyogc3RydWN0IG1zcDogb25seSBub3JtLCBhY2IgYW5kIHNvdXJjZSBhcmUgcmVhbGx5IHVzZWQgaW4gdGhpcyBtb2RlICAgICAgKi8KKworc3RhdGljIHZvaWQgbXNwMzR4eGdfc2V0X3NvdXJjZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgc291cmNlKTsKKworLyogKHJlLSlpbml0aWFsaXplIHRoZSBtc3AzNHh4ZywgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IG5vcm0gaW4gbXNwLT5ub3JtCisgKiByZXR1cm4gMCBpZiBpdCB3b3JrZWQsIC0xIGlmIGl0IGZhaWxlZAorICovCitzdGF0aWMgaW50IG1zcDM0eHhnX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBtb2R1cyxzdGQ7CisKKwlpZiAobXNwMzQwMGNfcmVzZXQoY2xpZW50KSkKKwkJcmV0dXJuIC0xOworCisJLyogbWFrZSBzdXJlIHRoYXQgaW5wdXQvb3V0cHV0IGlzIG11dGVkIChwYXJhbm9pZCBtb2RlKSAqLworCWlmIChtc3AzNDAwY193cml0ZShjbGllbnQsCisJCQkgICBJMkNfTVNQMzQwMENfREZQLAorCQkJICAgMHgxMywgLyogQUNCICovCisJCQkgICAweDBmMjAgLyogbXV0ZSBEU1AgaW5wdXQsIG11dGUgU0NBUlQgMSAqLykpCisJCXJldHVybiAtMTsKKworCS8qIHN0ZXAtYnktc3RlcCBpbml0aWFsaXNhdGlvbiwgYXMgZGVzY3JpYmVkIGluIHRoZSBtYW51YWwgKi8KKwltb2R1cyA9IG1zcDM0eHhfbW9kdXMobXNwLT5ub3JtKTsKKwlzdGQgICA9IG1zcDM0eHhfc3RhbmRhcmQobXNwLT5ub3JtKTsKKwltb2R1cyAmPSB+MHgwMzsgLyogU1RBVFVTX0NIQU5HRT0wICovCisJbW9kdXMgfD0gMHgwMTsgIC8qIEFVVE9NQVRJQ19TT1VORF9ERVRFQ1RJT049MSAqLworCWlmIChtc3AzNDAwY193cml0ZShjbGllbnQsCisJCQkgICBJMkNfTVNQMzQwMENfREVNLAorCQkJICAgMHgzMC8qTU9EVVMqLywKKwkJCSAgIG1vZHVzKSkKKwkJcmV0dXJuIC0xOworCWlmIChtc3AzNDAwY193cml0ZShjbGllbnQsCisJCQkgICBJMkNfTVNQMzQwMENfREVNLAorCQkJICAgMHgyMC8qc3RhbmFyZCovLAorCQkJICAgc3RkKSkKKwkJcmV0dXJuIC0xOworCisJLyogd3JpdGUgdGhlIGRmcHMgdGhhdCBtYXkgaGF2ZSBhbiBpbmZsdWVuY2Ugb24KKwkgICBzdGFuZGFyZC9hdWRpbyBhdXRvZGV0ZWN0aW9uIHJpZ2h0IG5vdyAqLworCW1zcDM0eHhnX3NldF9zb3VyY2UoY2xpZW50LCBtc3AtPnNvdXJjZSk7CisKKwlpZiAobXNwMzQwMGNfd3JpdGUoY2xpZW50LCBJMkNfTVNQMzQwMENfREZQLAorCQkJICAgMHgwZSwgLyogQU0vRk0gUHJlc2NhbGUgKi8KKwkJCSAgIDB4MzAwMCAvKiBkZWZhdWx0OiBbMTU6OF0gNzVraHogZGV2aWF0aW9uICovKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1zcDM0MDBjX3dyaXRlKGNsaWVudCwgSTJDX01TUDM0MDBDX0RGUCwKKwkJCSAgIDB4MTAsIC8qIE5JQ0FNIFByZXNjYWxlICovCisJCQkgICAweDVhMDAgLyogZGVmYXVsdDogOWRiIGdhaW4gKGFzIHJlY29tbWVuZGVkKSAqLykpCisJCXJldHVybiAtMTsKKworCWlmIChtc3AzNDAwY193cml0ZShjbGllbnQsCisJCQkgICBJMkNfTVNQMzQwMENfREVNLAorCQkJICAgMHgyMCwgLyogU1RBTkRBUkQgU0VMRUNUICAqLworCQkJICAgc3RhbmRhcmQgLyogZGVmYXVsdDogMHgwMSBmb3IgYXV0b21hdGljIHN0YW5kYXJkIHNlbGVjdCovKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zcDM0eHhnX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhOworCXN0cnVjdCBtc3AzNDAwYyAqbXNwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCwgc3RkLCBpOworCisJcHJpbnRrKCJtc3AzNHh4ZzogZGFlbW9uIHN0YXJ0ZWRcbiIpOworCWZvciAoOzspIHsKKwkJZDJwcmludGsoS0VSTl9ERUJVRyAibXNwMzR4eGc6IHRocmVhZDogc2xlZXBcbiIpOworCQltc3AzNHh4X3NsZWVwKG1zcCwtMSk7CisJCWQycHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0eHhnOiB0aHJlYWQ6IHdha2V1cFxuIik7CisKKwlyZXN0YXJ0OgorCQlkcHJpbnRrKCJtc3AzNHh4ZzogdGhyZWFkOiByZXN0YXJ0IHNjYW5cbiIpOworCQltc3AtPnJlc3RhcnQgPSAwOworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisKKwkJLyogc2V0dXAgdGhlIGNoaXAqLworCQltc3AzNHh4Z19pbml0KGNsaWVudCk7CisJCXN0ZCA9IHN0YW5kYXJkOworCQlpZiAoc3RkICE9IDB4MDEpCisJCQlnb3RvIHVubXV0ZTsKKworCQkvKiB3YXRjaCBhdXRvZGV0ZWN0ICovCisJCWRwcmludGsoIm1zcDM0eHhnOiB0cmlnZ2VyZWQgYXV0b2RldGVjdCwgd2FpdGluZyBmb3IgcmVzdWx0XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCWlmIChtc3AzNHh4X3NsZWVwKG1zcCwxMDApKQorCQkJCWdvdG8gcmVzdGFydDsKKworCQkJLyogY2hlY2sgcmVzdWx0cyAqLworCQkJdmFsID0gbXNwMzQwMGNfcmVhZChjbGllbnQsIEkyQ19NU1AzNDAwQ19ERU0sIDB4N2UpOworCQkJaWYgKHZhbCA8IDB4MDdmZikgeworCQkJCXN0ZCA9IHZhbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRwcmludGsoIm1zcDM0eHhnOiBkZXRlY3Rpb24gc3RpbGwgaW4gcHJvZ3Jlc3NcbiIpOworCQl9CisJCWlmICgweDAxID09IHN0ZCkgeworCQkJZHByaW50aygibXNwMzR4eGc6IGRldGVjdGlvbiBzdGlsbCBpbiBwcm9ncmVzcyBhZnRlciAxMCB0cmllcy4gZ2l2aW5nIHVwLlxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJdW5tdXRlOgorCQlkcHJpbnRrKCJtc3AzNHh4ZzogY3VycmVudCBtb2RlOiAlcyAoMHglMDR4KVxuIiwKKwkJCW1zcDM0eHhfc3RhbmRhcmRfbW9kZV9uYW1lKHN0ZCksIHN0ZCk7CisKKwkJLyogdW5tdXRlOiBkaXNwYXRjaCBzb3VuZCB0byBzY2FydCBvdXRwdXQsIHNldCBzY2FydCB2b2x1bWUgKi8KKwkJZHByaW50aygibXNwMzR4eGc6IHVubXV0ZVxuIik7CisKKwkJbXNwMzQwMGNfc2V0YmFzcyhjbGllbnQsIG1zcC0+YmFzcyk7CisJCW1zcDM0MDBjX3NldHRyZWJsZShjbGllbnQsIG1zcC0+dHJlYmxlKTsKKwkJbXNwMzQwMGNfc2V0dm9sdW1lKGNsaWVudCwgbXNwLT5tdXRlZCwgbXNwLT52b2x1bWUsIG1zcC0+YmFsYW5jZSk7CisKKwkJLyogcmVzdG9yZSBBQ0IgKi8KKwkJaWYgKG1zcDM0MDBjX3dyaXRlKGNsaWVudCwKKwkJCQkgICBJMkNfTVNQMzQwMENfREZQLAorCQkJCSAgIDB4MTMsIC8qIEFDQiAqLworCQkJCSAgIG1zcC0+YWNiKSkKKwkJCXJldHVybiAtMTsKKwl9CisJZHByaW50ayhLRVJOX0RFQlVHICJtc3AzNHh4ZzogdGhyZWFkOiBleGl0XG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHRoZSBzYW1lICdzb3VyY2UnIGZvciB0aGUgbG91ZHNwZWFrZXIsIHNjYXJ0IGFuZCBxdWFzaS1wZWFrIGRldGVjdG9yCisgKiB0aGUgdmFsdWUgZm9yIHNvdXJjZSBpcyB0aGUgc2FtZSBhcyBiaXQgMTU6OCBvZiBERlAgcmVnaXN0ZXJzIDB4MDgsCisgKiAweDBhIGFuZCAweDBjOiAwPW1vbm8sIDE9c3RlcmVvIG9yIEF8QiwgMj1TQ0FSVCwgMz1zdGVyZW8gb3IgQSwgND1zdGVyZW8gb3IgQgorICoKKyAqIHRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgbXNwMzQwMGNfc2V0c3RlcmVvCisgKi8KK3N0YXRpYyB2b2lkIG1zcDM0eHhnX3NldF9zb3VyY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHNvdXJjZSkKK3sKKwlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJLyogZml4IG1hdHJpeCBtb2RlIHRvIHN0ZXJlbyBhbmQgbGV0IHRoZSBtc3AgY2hvb3NlIHdoYXQKKwkgKiB0byBvdXRwdXQgYWNjb3JkaW5nIHRvICdzb3VyY2UnLCBhcyByZWNvbW1lbmRlZAorCSAqLworCWludCB2YWx1ZSA9IChzb3VyY2UmMHgwNyk8PDh8KHNvdXJjZT09MCA/IDB4MDA6MHgyMCk7CisJZHByaW50aygibXNwMzR4eGc6IHNldCBzb3VyY2UgdG8gJWQgKDB4JXgpXG4iLCBzb3VyY2UsIHZhbHVlKTsKKwltc3AzNDAwY193cml0ZShjbGllbnQsCisJCSAgICAgICBJMkNfTVNQMzQwMENfREZQLAorCQkgICAgICAgMHgwOCwgLyogTG91ZHNwZWFrZXIgT3V0cHV0ICovCisJCSAgICAgICB2YWx1ZSk7CisJbXNwMzQwMGNfd3JpdGUoY2xpZW50LAorCQkgICAgICAgSTJDX01TUDM0MDBDX0RGUCwKKwkJICAgICAgIDB4MGEsIC8qIFNDQVJUMSBEQSBPdXRwdXQgKi8KKwkJICAgICAgIHZhbHVlKTsKKwltc3AzNDAwY193cml0ZShjbGllbnQsCisJCSAgICAgICBJMkNfTVNQMzQwMENfREZQLAorCQkgICAgICAgMHgwYywgLyogUXVhc2ktcGVhayBkZXRlY3RvciAqLworCQkgICAgICAgdmFsdWUpOworCS8qCisJICogc2V0IGlkZW50aWZpY2F0aW9uIHRocmVzaG9sZC4gUGVyc29uYWxseSwgSQorCSAqIEkgc2V0IGl0IHRvIGEgaGlnaGVyIHZhbHVlIHRoYXQgdGhlIGRlZmF1bHQKKwkgKiBvZiAweDE5MCB0byBpZ25vcmUgbm9pc3kgc3RlcmVvIHNpZ25hbHMuCisJICogdGhpcyBuZWVkcyB0dW5pbmcuIChyZWNvbW1lbmRlZCByYW5nZSAweDAwYTAtMHgwM2MwKQorCSAqIDB4N2YwID0gZm9yY2VkIG1vbm8gbW9kZQorCSAqLworCW1zcDM0MDBjX3dyaXRlKGNsaWVudCwKKwkJICAgICAgIEkyQ19NU1AzNDAwQ19ERU0sCisJCSAgICAgICAweDIyLCAvKiBhMiB0aHJlc2hvbGQgZm9yIHN0ZXJlby9iaWxpbmd1YWwgKi8KKwkJICAgICAgIHNvdXJjZT09MCA/IDB4N2YwOnN0ZXJlb190aHJlc2hvbGQpOworCW1zcC0+c291cmNlPXNvdXJjZTsKK30KKworc3RhdGljIHZvaWQgbXNwMzR4eGdfZGV0ZWN0X3N0ZXJlbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtc3AzNDAwYyAqbXNwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpbnQgc3RhdHVzID0gbXNwMzQwMGNfcmVhZChjbGllbnQsCisJCQkJICAgSTJDX01TUDM0MDBDX0RFTSwKKwkJCQkgICAweDAyMDAgLyogU1RBVFVTICovKTsKKwlpbnQgaXNfYmlsaW5ndWFsID0gc3RhdHVzJjB4MTAwOworCWludCBpc19zdGVyZW8gPSBzdGF0dXMmMHg0MDsKKworCW1zcC0+cnhzdWJjaGFucyA9IDA7CisJaWYgKGlzX3N0ZXJlbykKKwkJbXNwLT5yeHN1YmNoYW5zIHw9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwllbHNlCisJCW1zcC0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9NT05POworCWlmIChpc19iaWxpbmd1YWwpIHsKKwkJbXNwLT5yeHN1YmNoYW5zIHw9IFY0TDJfVFVORVJfU1VCX0xBTkcxfFY0TDJfVFVORVJfU1VCX0xBTkcyOworCQkvKiBJJ20gc3VwcG9zZWQgdG8gY2hlY2sgd2hldGhlciBpdCdzIFNBUCBvciBub3QKKwkJICogYW5kIHNldCBvbmx5IExBTkcyL1NBUCBpbiB0aGlzIGNhc2UuIFlldCwgdGhlIE1TUAorCQkgKiBkb2VzIGEgbG90IG9mIHdvcmsgdG8gaGlkZSB0aGlzIGFuZCBoYW5kbGUgZXZlcnl0aGluZworCQkgKiB0aGUgc2FtZSB3YXkuIEkgZG9uJ3Qgd2FudCB0byB3b3JrIGFyb3VuZCBpdCBzbyB1bmxlc3MKKwkJICogdGhpcyBpcyBhIHByb2JsZW0sIEknbGwgaGFuZGxlIFNBUCBqdXN0IGxpa2UgbGFuZzEvbGFuZzIuCisJCSAqLworCX0KKwlkcHJpbnRrKCJtc3AzNHh4Zzogc3RhdHVzPTB4JXgsIHN0ZXJlbz0lZCwgYmlsaW5ndWFsPSVkIC0+IHJ4c3ViY2hhbnM9JWRcbiIsCisJCXN0YXR1cywgaXNfc3RlcmVvLCBpc19iaWxpbmd1YWwsIG1zcC0+cnhzdWJjaGFucyk7Cit9CisKK3N0YXRpYyB2b2lkIG1zcDM0eHhnX3NldF9hdWRtb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBhdWRtb2RlKQoreworCXN0cnVjdCBtc3AzNDAwYyAqbXNwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHNvdXJjZSA9IDA7CisKKwlzd2l0Y2ggKGF1ZG1vZGUpIHsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgorCQlzb3VyY2U9MDsgLyogbW9ubyBvbmx5ICovCisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKKwkJc291cmNlPTE7IC8qIHN0ZXJlbyBvciBBfEIsIHNlZSBjb21tZW50IGluIG1zcDM0eHhnX2dldF92NGwyX3N0ZXJlbygpICovCisJCS8qIHByb2JsZW06IHRoYXQgY291bGQgYWxzbyBtZWFuIDIgKHNjYXJ0IGlucHV0KSAqLworCQlicmVhazsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKKwkJc291cmNlPTM7IC8qIHN0ZXJlbyBvciBBICovCisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOgorCQlzb3VyY2U9NDsgLyogc3RlcmVvIG9yIEIgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDogLyogZG9pbmcgbm90aGluZzogYSBzYWZlLCBzYW5lIGRlZmF1bHQgKi8KKwkJYXVkbW9kZSA9IDA7CisJCXJldHVybjsKKwl9CisJbXNwLT5hdWRtb2RlID0gYXVkbW9kZTsKKwltc3AzNHh4Z19zZXRfc291cmNlKGNsaWVudCwgc291cmNlKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG1zcF9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpOworc3RhdGljIGludCBtc3BfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBtc3BfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKTsKK3N0YXRpYyBpbnQgbXNwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKKworc3RhdGljIGludCBtc3Bfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCk7CitzdGF0aWMgaW50IG1zcF9yZXN1bWUoc3RydWN0IGRldmljZSAqIGRldiwgdTMyIGxldmVsKTsKKworc3RhdGljIHZvaWQgbXNwX3dha2VfdGhyZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5uYW1lICAgICAgICAgICA9ICJpMmMgbXNwMzQwMCBkcml2ZXIiLAorICAgICAgICAuaWQgICAgICAgICAgICAgPSBJMkNfRFJJVkVSSURfTVNQMzQwMCwKKyAgICAgICAgLmZsYWdzICAgICAgICAgID0gSTJDX0RGX05PVElGWSwKKyAgICAgICAgLmF0dGFjaF9hZGFwdGVyID0gbXNwX3Byb2JlLAorICAgICAgICAuZGV0YWNoX2NsaWVudCAgPSBtc3BfZGV0YWNoLAorICAgICAgICAuY29tbWFuZCAgICAgICAgPSBtc3BfY29tbWFuZCwKKwkuZHJpdmVyID0geworCQkuc3VzcGVuZCA9IG1zcF9zdXNwZW5kLAorCQkucmVzdW1lICA9IG1zcF9yZXN1bWUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQoreworCUkyQ19ERVZOQU1FKCIodW5zZXQpIiksCisJLmZsYWdzICAgICA9IEkyQ19DTElFTlRfQUxMT1dfVVNFLAorICAgICAgICAuZHJpdmVyICAgID0gJmRyaXZlciwKK307CisKK3N0YXRpYyBpbnQgbXNwX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgbXNwMzQwMGMgKm1zcDsKKyAgICAgICAgc3RydWN0IGkyY19jbGllbnQgKmM7CisJaW50ICgqdGhyZWFkX2Z1bmMpKHZvaWQgKmRhdGEpID0gTlVMTDsKKworICAgICAgICBjbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7CisgICAgICAgIGNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKKworICAgICAgICBpZiAoLTEgPT0gbXNwMzQwMGNfcmVzZXQoJmNsaWVudF90ZW1wbGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBkcHJpbnRrKCJtc3AzNDAwOiBubyBjaGlwIGZvdW5kXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTlVMTCA9PSAoYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSxHRlBfS0VSTkVMKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIG1lbWNweShjLCZjbGllbnRfdGVtcGxhdGUsc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJaWYgKE5VTEwgPT0gKG1zcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc3AzNDAwYyksR0ZQX0tFUk5FTCkpKSB7CisJCWtmcmVlKGMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQobXNwLDAsc2l6ZW9mKHN0cnVjdCBtc3AzNDAwYykpOworCW1zcC0+dm9sdW1lICA9IDU4ODgwOyAgLyogMGRiIGdhaW4gKi8KKwltc3AtPmJhbGFuY2UgPSAzMjc2ODsKKwltc3AtPmJhc3MgICAgPSAzMjc2ODsKKwltc3AtPnRyZWJsZSAgPSAzMjc2ODsKKwltc3AtPmlucHV0ICAgPSAtMTsKKwltc3AtPm11dGVkICAgPSAxOworCisJaTJjX3NldF9jbGllbnRkYXRhKGMsIG1zcCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbXNwLT53cSk7CisKKwlpZiAoLTEgPT0gbXNwMzQwMGNfcmVzZXQoYykpIHsKKwkJa2ZyZWUobXNwKTsKKwkJa2ZyZWUoYyk7CisJCWRwcmludGsoIm1zcDM0MDA6IG5vIGNoaXAgZm91bmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbXNwLT5yZXYxID0gbXNwMzQwMGNfcmVhZChjLCBJMkNfTVNQMzQwMENfREZQLCAweDFlKTsKKwlpZiAoLTEgIT0gbXNwLT5yZXYxKQorCQltc3AtPnJldjIgPSBtc3AzNDAwY19yZWFkKGMsIEkyQ19NU1AzNDAwQ19ERlAsIDB4MWYpOworCWlmICgoLTEgPT0gbXNwLT5yZXYxKSB8fCAoMCA9PSBtc3AtPnJldjEgJiYgMCA9PSBtc3AtPnJldjIpKSB7CisJCWtmcmVlKG1zcCk7CisJCWtmcmVlKGMpOworCQlwcmludGsoIm1zcDM0MDA6IGVycm9yIHdoaWxlIHJlYWRpbmcgY2hpcCB2ZXJzaW9uXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmIDAKKwkvKiB0aGlzIHdpbGwgdHVybiBvbiBhIDFrSHogYmVlcCAtIG1pZ2h0IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nLi4uICovCisJbXNwMzQwMGNfd3JpdGUoYyxJMkNfTVNQMzQwMENfREZQLCAweDAwMTQsIDB4MTA0MCk7CisjZW5kaWYKKwltc3AzNDAwY19zZXR2b2x1bWUoYywgbXNwLT5tdXRlZCwgbXNwLT52b2x1bWUsIG1zcC0+YmFsYW5jZSk7CisKKwlzbnByaW50ZihjLT5uYW1lLCBzaXplb2YoYy0+bmFtZSksICJNU1AzNCUwMmQlYy0lYyVkIiwKKwkJIChtc3AtPnJldjI+PjgpJjB4ZmYsIChtc3AtPnJldjEmMHhmZikrJ0AnLAorCQkgKChtc3AtPnJldjE+PjgpJjB4ZmYpKydAJywgbXNwLT5yZXYyJjB4MWYpOworCisJbXNwLT5vcG1vZGUgPSBvcG1vZGU7CisJaWYgKE9QTU9ERV9BVVRPID09IG1zcC0+b3Btb2RlKSB7CisjaWYgMCAvKiBzZWVtcyB0byB3b3JrIGZvciBpdnR2IG9ubHksIGRpc2FibGUgYnkgZGVmYXVsdCBmb3Igbm93IC4uLiAqLworCQlpZiAoSEFWRV9TSU1QTEVSKG1zcCkpCisJCQltc3AtPm9wbW9kZSA9IE9QTU9ERV9TSU1QTEVSOworCQllbHNlCisjZW5kaWYKKwkJaWYgKEhBVkVfU0lNUExFKG1zcCkpCisJCQltc3AtPm9wbW9kZSA9IE9QTU9ERV9TSU1QTEU7CisJCWVsc2UKKwkJCW1zcC0+b3Btb2RlID0gT1BNT0RFX01BTlVBTDsKKwl9CisKKwkvKiBoZWxsbyB3b3JsZCA6LSkgKi8KKwlwcmludGsoS0VSTl9JTkZPICJtc3AzNHh4OiBpbml0OiBjaGlwPSVzIixpMmNfY2xpZW50bmFtZShjKSk7CisJaWYgKEhBVkVfTklDQU0obXNwKSkKKwkJcHJpbnRrKCIgK25pY2FtIik7CisJaWYgKEhBVkVfU0lNUExFKG1zcCkpCisJCXByaW50aygiICtzaW1wbGUiKTsKKwlpZiAoSEFWRV9TSU1QTEVSKG1zcCkpCisJCXByaW50aygiICtzaW1wbGVyIik7CisJaWYgKEhBVkVfUkFESU8obXNwKSkKKwkJcHJpbnRrKCIgK3JhZGlvIik7CisKKwkvKiB2ZXJzaW9uLXNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisJc3dpdGNoIChtc3AtPm9wbW9kZSkgeworCWNhc2UgT1BNT0RFX01BTlVBTDoKKwkJcHJpbnRrKCIgbW9kZT1tYW51YWwiKTsKKwkJdGhyZWFkX2Z1bmMgPSBtc3AzNDAwY190aHJlYWQ7CisJCWJyZWFrOworCWNhc2UgT1BNT0RFX1NJTVBMRToKKwkJcHJpbnRrKCIgbW9kZT1zaW1wbGUiKTsKKwkJdGhyZWFkX2Z1bmMgPSBtc3AzNDEwZF90aHJlYWQ7CisJCWJyZWFrOworCWNhc2UgT1BNT0RFX1NJTVBMRVI6CisJCXByaW50aygiIG1vZGU9c2ltcGxlciIpOworCQl0aHJlYWRfZnVuYyA9IG1zcDM0eHhnX3RocmVhZDsKKwkJYnJlYWs7CisJfQorCXByaW50aygiXG4iKTsKKworCS8qIHN0YXJ0dXAgY29udHJvbCB0aHJlYWQgaWYgbmVlZGVkICovCisJaWYgKHRocmVhZF9mdW5jKSB7CisJCW1zcC0+a3RocmVhZCA9IGt0aHJlYWRfcnVuKHRocmVhZF9mdW5jLCBjLCAibXNwMzR4eCIpOworCQlpZiAoTlVMTCA9PSBtc3AtPmt0aHJlYWQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtc3AzNHh4OiBrZXJuZWxfdGhyZWFkKCkgZmFpbGVkXG4iKTsKKwkJbXNwX3dha2VfdGhyZWFkKGMpOworCX0KKworCS8qIGRvbmUgKi8KKyAgICAgICAgaTJjX2F0dGFjaF9jbGllbnQoYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNwX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtc3AzNDAwYyAqbXNwICA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJLyogc2h1dGRvd24gY29udHJvbCB0aHJlYWQgKi8KKwlpZiAobXNwLT5rdGhyZWFkID49IDApIHsKKwkJbXNwLT5yZXN0YXJ0ID0gMTsKKwkJa3RocmVhZF9zdG9wKG1zcC0+a3RocmVhZCk7CisJfQorICAgIAltc3AzNDAwY19yZXNldChjbGllbnQpOworCisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShtc3ApOworCWtmcmVlKGNsaWVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNwX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQorCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIG1zcF9hdHRhY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtc3Bfd2FrZV90aHJlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChOVUxMID09IG1zcC0+a3RocmVhZCkKKwkJcmV0dXJuOworCW1zcDM0MDBjX3NldHZvbHVtZShjbGllbnQsbXNwLT5tdXRlZCwwLDApOworCW1zcC0+d2F0Y2hfc3RlcmVvID0gMDsKKwltc3AtPnJlc3RhcnQgPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbXNwLT53cSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbW9kZV92NGwyX3RvX3Y0bDEoaW50IHJ4c3ViY2hhbnMpCit7CisJaW50IG1vZGUgPSAwOworCisJaWYgKHJ4c3ViY2hhbnMgJiBWNEwyX1RVTkVSX1NVQl9TVEVSRU8pCisJCW1vZGUgfD0gVklERU9fU09VTkRfU1RFUkVPOworCWlmIChyeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfTEFORzIpCisJCW1vZGUgfD0gVklERU9fU09VTkRfTEFORzI7CisJaWYgKHJ4c3ViY2hhbnMgJiBWNEwyX1RVTkVSX1NVQl9MQU5HMSkKKwkJbW9kZSB8PSBWSURFT19TT1VORF9MQU5HMTsKKwlpZiAoMCA9PSBtb2RlKQorCQltb2RlIHw9IFZJREVPX1NPVU5EX01PTk87CisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyBpbnQgbW9kZV92NGwxX3RvX3Y0bDIoaW50IG1vZGUpCit7CisJaWYgKG1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCisJCXJldHVybiBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCWlmIChtb2RlICYgVklERU9fU09VTkRfTEFORzIpCisJCXJldHVybiBWNEwyX1RVTkVSX01PREVfTEFORzI7CisJaWYgKG1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKKwkJcmV0dXJuIFY0TDJfVFVORVJfTU9ERV9MQU5HMTsKKwlyZXR1cm4gVjRMMl9UVU5FUl9NT0RFX01PTk87Cit9CisKK3N0YXRpYyB2b2lkIG1zcF9hbnlfZGV0ZWN0X3N0ZXJlbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtc3AzNDAwYyAqbXNwICA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJc3dpdGNoIChtc3AtPm9wbW9kZSkgeworCWNhc2UgT1BNT0RFX01BTlVBTDoKKwljYXNlIE9QTU9ERV9TSU1QTEU6CisJCWF1dG9kZXRlY3Rfc3RlcmVvKGNsaWVudCk7CisJCWJyZWFrOworCWNhc2UgT1BNT0RFX1NJTVBMRVI6CisJCW1zcDM0eHhnX2RldGVjdF9zdGVyZW8oY2xpZW50KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc3BfYW55X3NldF9hdWRtb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBhdWRtb2RlKQoreworCXN0cnVjdCBtc3AzNDAwYyAqbXNwICA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJc3dpdGNoIChtc3AtPm9wbW9kZSkgeworCWNhc2UgT1BNT0RFX01BTlVBTDoKKwljYXNlIE9QTU9ERV9TSU1QTEU6CisJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMDsKKwkJbXNwMzQwMGNfc2V0X2F1ZG1vZGUoY2xpZW50LCBhdWRtb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBPUE1PREVfU0lNUExFUjoKKwkJbXNwMzR4eGdfc2V0X2F1ZG1vZGUoY2xpZW50LCBhdWRtb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IG1zcF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKyAgICAgICAgX191MTYgICAgICAgICAgICpzYXJnID0gYXJnOworCWludCBzY2FydCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBBVURDX1NFVF9JTlBVVDoKKwkJZHByaW50ayhLRVJOX0RFQlVHICJtc3AzNHh4OiBBVURDX1NFVF9JTlBVVCglZClcbiIsKnNhcmcpOworCQlpZiAoKnNhcmcgPT0gbXNwLT5pbnB1dCkKKwkJCWJyZWFrOworCQltc3AtPmlucHV0ID0gKnNhcmc7CisJCXN3aXRjaCAoKnNhcmcpIHsKKwkJY2FzZSBBVURJT19SQURJTzoKKwkJCS8qIEhhdXBwYXVnZSB1c2VzIElOMiBmb3IgdGhlIHJhZGlvICovCisJCQltc3AtPm1vZGUgICA9IE1TUF9NT0RFX0ZNX1JBRElPOworCQkJc2NhcnQgICAgICAgPSBTQ0FSVF9JTjI7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19FWFRFUk5fMToKKwkJCS8qIElOMSBpcyBvZnRlbiB1c2VkIGZvciBleHRlcm5hbCBpbnB1dCAuLi4gKi8KKwkJCW1zcC0+bW9kZSAgID0gTVNQX01PREVfRVhURVJOOworCQkJc2NhcnQgICAgICAgPSBTQ0FSVF9JTjE7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19FWFRFUk5fMjoKKwkJCS8qIC4uLiBzb21ldGltZXMgaXQgaXMgSU4yIHRocm91Z2ggOykgKi8KKwkJCW1zcC0+bW9kZSAgID0gTVNQX01PREVfRVhURVJOOworCQkJc2NhcnQgICAgICAgPSBTQ0FSVF9JTjI7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19UVU5FUjoKKwkJCW1zcC0+bW9kZSAgID0gLTE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICgqc2FyZyAmIEFVRElPX01VVEUpCisJCQkJbXNwMzQwMGNfc2V0X3NjYXJ0KGNsaWVudCxTQ0FSVF9NVVRFLDApOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNjYXJ0KSB7CisJCQltc3AtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJCQltc3AtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCQkJbXNwMzQwMGNfc2V0X3NjYXJ0KGNsaWVudCxzY2FydCwwKTsKKwkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLDB4MDAwZCwweDE5MDApOworCQkJaWYgKG1zcC0+b3Btb2RlICE9IE9QTU9ERV9TSU1QTEVSKQorCQkJCW1zcDM0MDBjX3NldF9hdWRtb2RlKGNsaWVudCwgbXNwLT5hdWRtb2RlKTsKKwkJfQorCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKKwkJYnJlYWs7CisKKwljYXNlIEFVRENfU0VUX1JBRElPOgorCQlkcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0eHg6IEFVRENfU0VUX1JBRElPXG4iKTsKKwkJbXNwLT5ub3JtID0gVklERU9fTU9ERV9SQURJTzsKKwkJZHByaW50ayhLRVJOX0RFQlVHICJtc3AzNHh4OiBzd2l0Y2hpbmcgdG8gcmFkaW8gbW9kZVxuIik7CisJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMDsKKwkJc3dpdGNoIChtc3AtPm9wbW9kZSkgeworCQljYXNlIE9QTU9ERV9NQU5VQUw6CisJCQkvKiBzZXQgbXNwMzQwMCB0byBGTSByYWRpbyBtb2RlICovCisJCQltc3AzNDAwY19zZXRtb2RlKGNsaWVudCxNU1BfTU9ERV9GTV9SQURJTyk7CisJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgTVNQX0NBUlJJRVIoMTAuNyksCisJCQkJCSAgICBNU1BfQ0FSUklFUigxMC43KSk7CisJCQltc3AzNDAwY19zZXR2b2x1bWUoY2xpZW50LCBtc3AtPm11dGVkLAorCQkJCQkgICBtc3AtPnZvbHVtZSwgbXNwLT5iYWxhbmNlKTsKKwkJCWJyZWFrOworCQljYXNlIE9QTU9ERV9TSU1QTEU6CisJCWNhc2UgT1BNT0RFX1NJTVBMRVI6CisJCQkvKiB0aGUgdGhyZWFkIHdpbGwgZG8gZm9yIHVzICovCisJCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJLyogLS0tIHY0bCBpb2N0bHMgLS0tICovCisJLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCisJICAga2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLworCWNhc2UgVklESU9DR0FVRElPOgorCXsKKwkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKKworCQlkcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0eHg6IFZJRElPQ0dBVURJT1xuIik7CisJCXZhLT5mbGFncyB8PSBWSURFT19BVURJT19WT0xVTUUgfAorCQkJVklERU9fQVVESU9fQkFTUyB8CisJCQlWSURFT19BVURJT19UUkVCTEUgfAorCQkJVklERU9fQVVESU9fTVVUQUJMRTsKKwkJaWYgKG1zcC0+bXV0ZWQpCisJCQl2YS0+ZmxhZ3MgfD0gVklERU9fQVVESU9fTVVURTsKKworCQl2YS0+dm9sdW1lID0gbXNwLT52b2x1bWU7CisJCXZhLT5iYWxhbmNlID0gKHZhLT52b2x1bWUpID8gbXNwLT5iYWxhbmNlIDogMzI3Njg7CisJCXZhLT5iYXNzID0gbXNwLT5iYXNzOworCQl2YS0+dHJlYmxlID0gbXNwLT50cmVibGU7CisKKwkJbXNwX2FueV9kZXRlY3Rfc3RlcmVvKGNsaWVudCk7CisJCXZhLT5tb2RlID0gbW9kZV92NGwyX3RvX3Y0bDEobXNwLT5yeHN1YmNoYW5zKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DU0FVRElPOgorCXsKKwkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKKworCQlkcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0eHg6IFZJRElPQ1NBVURJT1xuIik7CisJCW1zcC0+bXV0ZWQgPSAodmEtPmZsYWdzICYgVklERU9fQVVESU9fTVVURSk7CisJCW1zcC0+dm9sdW1lID0gdmEtPnZvbHVtZTsKKwkJbXNwLT5iYWxhbmNlID0gdmEtPmJhbGFuY2U7CisJCW1zcC0+YmFzcyA9IHZhLT5iYXNzOworCQltc3AtPnRyZWJsZSA9IHZhLT50cmVibGU7CisKKwkJbXNwMzQwMGNfc2V0dm9sdW1lKGNsaWVudCwgbXNwLT5tdXRlZCwKKwkJCQkgICBtc3AtPnZvbHVtZSwgbXNwLT5iYWxhbmNlKTsKKwkJbXNwMzQwMGNfc2V0YmFzcyhjbGllbnQsbXNwLT5iYXNzKTsKKwkJbXNwMzQwMGNfc2V0dHJlYmxlKGNsaWVudCxtc3AtPnRyZWJsZSk7CisKKwkJaWYgKHZhLT5tb2RlICE9IDAgJiYgbXNwLT5ub3JtICE9IFZJREVPX01PREVfUkFESU8pCisJCQltc3BfYW55X3NldF9hdWRtb2RlKGNsaWVudCxtb2RlX3Y0bDFfdG9fdjRsMih2YS0+bW9kZSkpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NTQ0hBTjoKKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2YyA9IGFyZzsKKworCQlkcHJpbnRrKEtFUk5fREVCVUcgIm1zcDM0eHg6IFZJRElPQ1NDSEFOIChub3JtPSVkKVxuIix2Yy0+bm9ybSk7CisJCW1zcC0+bm9ybSA9IHZjLT5ub3JtOworCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NTRlJFUToKKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwl7CisJCS8qIG5ldyBjaGFubmVsIC0tIGtpY2sgYXVkaW8gY2FycmllciBzY2FuICovCisJCWRwcmludGsoS0VSTl9ERUJVRyAibXNwMzR4eDogVklESU9DU0ZSRVFcbiIpOworCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKKwkJYnJlYWs7CisJfQorCisJLyogLS0tIHY0bDIgaW9jdGxzIC0tLSAqLworCWNhc2UgVklESU9DX0dfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQgPSBhcmc7CisKKwkJbXNwX2FueV9kZXRlY3Rfc3RlcmVvKGNsaWVudCk7CisJCXZ0LT5hdWRtb2RlICAgID0gbXNwLT5hdWRtb2RlOworCQl2dC0+cnhzdWJjaGFucyA9IG1zcC0+cnhzdWJjaGFuczsKKwkJdnQtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfAorCQkJVjRMMl9UVU5FUl9DQVBfTEFORzF8CisJCQlWNEwyX1RVTkVSX0NBUF9MQU5HMjsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQ9KHN0cnVjdCB2NGwyX3R1bmVyICopYXJnOworCisJCS8qIG9ubHkgc2V0IGF1ZG1vZGUgKi8KKwkJaWYgKHZ0LT5hdWRtb2RlICE9IC0xICYmIHZ0LT5hdWRtb2RlICE9IDApCisJCQltc3BfYW55X3NldF9hdWRtb2RlKGNsaWVudCwgdnQtPmF1ZG1vZGUpOworCQlicmVhazsKKwl9CisKKwkvKiBtc3AzNHh4IHNwZWNpZmljICovCisJY2FzZSBNU1BfU0VUX01BVFJJWDoKKwl7CisJCXN0cnVjdCBtc3BfbWF0cml4ICptc3BtID0gYXJnOworCisJCWRwcmludGsoS0VSTl9ERUJVRyAibXNwMzR4eDogTVNQX1NFVF9NQVRSSVhcbiIpOworCQltc3AzNDAwY19zZXRfc2NhcnQoY2xpZW50LCBtc3BtLT5pbnB1dCwgbXNwbS0+b3V0cHV0KTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJLyogbm90aGluZyAqLworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKKworCWRwcmludGsoIm1zcDM0eHg6IHN1c3BlbmRcbiIpOworCW1zcDM0MDBjX3Jlc2V0KGMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zcF9yZXN1bWUoc3RydWN0IGRldmljZSAqIGRldiwgdTMyIGxldmVsKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CisKKwlkcHJpbnRrKCJtc3AzNHh4OiByZXN1bWVcbiIpOworCW1zcF93YWtlX3RocmVhZChjKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBfX2luaXQgbXNwMzQwMF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1zcDM0MDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXNwMzQwMF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChtc3AzNDAwX2NsZWFudXBfbW9kdWxlKTsKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MGE5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIE1TUDM0MDBfSAorI2RlZmluZSBNU1AzNDAwX0gKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgbXNwX2RmcHJlZyB7CisgICAgaW50IHJlZzsKKyAgICBpbnQgdmFsdWU7Cit9OworCitzdHJ1Y3QgbXNwX21hdHJpeCB7CisgIGludCBpbnB1dDsKKyAgaW50IG91dHB1dDsKK307CisKKyNkZWZpbmUgTVNQX1NFVF9ERlBSRUcgICAgIF9JT1coJ20nLDE1LHN0cnVjdCBtc3BfZGZwcmVnKQorI2RlZmluZSBNU1BfR0VUX0RGUFJFRyAgICAgX0lPVygnbScsMTYsc3RydWN0IG1zcF9kZnByZWcpCisKKy8qIGlvY3RsIGZvciBNU1BfU0VUX01BVFJJWCB3aWxsIGhhdmUgdG8gYmUgcmVnaXN0ZXJlZCAqLworI2RlZmluZSBNU1BfU0VUX01BVFJJWCAgICAgX0lPVygnbScsMTcsc3RydWN0IG1zcF9tYXRyaXgpCisKKyNkZWZpbmUgU0NBUlRfTUFTSyAgICAwCisjZGVmaW5lIFNDQVJUX0lOMSAgICAgMQorI2RlZmluZSBTQ0FSVF9JTjIgICAgIDIKKyNkZWZpbmUgU0NBUlRfSU4xX0RBICAzCisjZGVmaW5lIFNDQVJUX0lOMl9EQSAgNAorI2RlZmluZSBTQ0FSVF9JTjMgICAgIDUKKyNkZWZpbmUgU0NBUlRfSU40ICAgICA2CisjZGVmaW5lIFNDQVJUX01PTk8gICAgNworI2RlZmluZSBTQ0FSVF9NVVRFICAgIDgKKworI2RlZmluZSBTQ0FSVF9EU1BfSU4gIDAKKyNkZWZpbmUgU0NBUlQxX09VVCAgICAxCisjZGVmaW5lIFNDQVJUMl9PVVQgICAgMgorCisjZW5kaWYgLyogTVNQMzQwMF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210MjB4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDIweHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWFkMTdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDIweHguYwpAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqICRJZDogbXQyMHh4LmMsdiAxLjQgMjAwNS8wMy8wNCAwOToyNDo1NiBrcmF4ZWwgRXhwICQKKyAqCisgKiBpMmMgdHYgdHVuZXIgY2hpcCBkZXZpY2UgZHJpdmVyCisgKiBjb250cm9scyBtaWNyb3R1bmUgdHVuZXJzLCBtdDIwMzIgKyBtdDIwNTAgYXQgdGhlIG1vbWVudC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBvcHRpbWl6ZV92Y28gID0gMTsKK21vZHVsZV9wYXJhbShvcHRpbWl6ZV92Y28sICAgICAgaW50LCAwNjQ0KTsKKworc3RhdGljIHVuc2lnbmVkIGludCB0dl9hbnRlbm5hICAgID0gMTsKK21vZHVsZV9wYXJhbSh0dl9hbnRlbm5hLCAgICAgICAgaW50LCAwNjQ0KTsKKworc3RhdGljIHVuc2lnbmVkIGludCByYWRpb19hbnRlbm5hID0gMDsKK21vZHVsZV9wYXJhbShyYWRpb19hbnRlbm5hLCAgICAgaW50LCAwNjQ0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1UMjAzMiAweDA0CisjZGVmaW5lIE1UMjAzMCAweDA2CisjZGVmaW5lIE1UMjA0MCAweDA3CisjZGVmaW5lIE1UMjA1MCAweDQyCisKK3N0YXRpYyBjaGFyICptaWNyb3R1bmVfcGFydFtdID0geworCVsgTVQyMDMwIF0gPSAiTVQyMDMwIiwKKwlbIE1UMjAzMiBdID0gIk1UMjAzMiIsCisJWyBNVDIwNDAgXSA9ICJNVDIwNDAiLAorCVsgTVQyMDUwIF0gPSAiTVQyMDUwIiwKK307CisKKy8vIElzU3B1ckluQmFuZCgpPworc3RhdGljIGludCBtdDIwMzJfc3B1cmNoZWNrKHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkJICAgIGludCBmMSwgaW50IGYyLCBpbnQgc3BlY3RydW1fZnJvbSxpbnQgc3BlY3RydW1fdG8pCit7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCWludCBuMT0xLG4yLGY7CisKKwlmMT1mMS8xMDAwOyAvL3NjYWxlIHRvIGtIeiB0byBhdm9pZCAzMmJpdCBvdmVyZmxvd3MKKwlmMj1mMi8xMDAwOworCXNwZWN0cnVtX2Zyb20vPTEwMDA7CisJc3BlY3RydW1fdG8vPTEwMDA7CisKKwl0dW5lcl9kYmcoInNwdXJjaGVjayBmMT0lZCBmMj0lZCAgZnJvbT0lZCB0bz0lZFxuIiwKKwkJICBmMSxmMixzcGVjdHJ1bV9mcm9tLHNwZWN0cnVtX3RvKTsKKworCWRvIHsKKwkgICAgbjI9LW4xOworCSAgICBmPW4xKihmMS1mMik7CisJICAgIGRvIHsKKwkJbjItLTsKKwkJZj1mLWYyOworCQl0dW5lcl9kYmcoInNwdXJ0ZXN0IG4xPSVkIG4yPSVkIGZ0ZXN0PSVkXG4iLG4xLG4yLGYpOworCisJCWlmKCAoZj5zcGVjdHJ1bV9mcm9tKSAmJiAoZjxzcGVjdHJ1bV90bykpCisJCQl0dW5lcl9kYmcoIm10MjAzMiBzcHVyY2hlY2sgdHJpZ2dlcmVkOiAlZFxuIixuMSk7CisJICAgIH0gd2hpbGUgKCAoZj4oZjItc3BlY3RydW1fdG8pKSB8fCAobjI+LTUpKTsKKwkgICAgbjErKzsKKwl9IHdoaWxlIChuMTw1KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG10MjAzMl9jb21wdXRlX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHJmaW4sCisJCQkgICAgICAgdW5zaWduZWQgaW50IGlmMSwgdW5zaWduZWQgaW50IGlmMiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3BlY3RydW1fZnJvbSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3BlY3RydW1fdG8sCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgICAgIGludCAqcmV0X3NlbCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgeG9nYykgLy9hbGwgaW4gSHoKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisgICAgICAgIHVuc2lnbmVkIGludCBmcmVmLGxvMSxsbzFuLGxvMWEscyxzZWwsbG8xZnJlcSwgZGVzaXJlZF9sbzEsCisJCWRlc2lyZWRfbG8yLGxvMixsbzJuLGxvMmEsbG8ybnVtLGxvMmZyZXE7CisKKyAgICAgICAgZnJlZj0gNTI1MCAqMTAwMDsgLy81LjI1TUh6CisJZGVzaXJlZF9sbzE9cmZpbitpZjE7CisKKwlsbzE9KDIqKGRlc2lyZWRfbG8xLzEwMDApKyhmcmVmLzEwMDApKSAvICgyKmZyZWYvMTAwMCk7CisgICAgICAgIGxvMW49bG8xLzg7CisgICAgICAgIGxvMWE9bG8xLShsbzFuKjgpOworCisgICAgICAgIHM9cmZpbi8xMDAwLzEwMDArMTA5MDsKKworCWlmKG9wdGltaXplX3ZjbykgeworCQlpZihzPjE4OTApIHNlbD0wOworCQllbHNlIGlmKHM+MTcyMCkgc2VsPTE7CisJCWVsc2UgaWYocz4xNTMwKSBzZWw9MjsKKwkJZWxzZSBpZihzPjEzNzApIHNlbD0zOworCQllbHNlIHNlbD00OyAvLyA+MTA5MAorCX0KKwllbHNlIHsKKyAgICAgICAgCWlmKHM+MTc5MCkgc2VsPTA7IC8vIDwxOTU4CisgICAgICAgIAllbHNlIGlmKHM+MTYxNykgc2VsPTE7CisgICAgICAgIAllbHNlIGlmKHM+MTQ0OSkgc2VsPTI7CisgICAgICAgIAllbHNlIGlmKHM+MTI5MSkgc2VsPTM7CisgICAgICAgIAllbHNlIHNlbD00OyAvLyA+MTA5MAorCX0KKwkqcmV0X3NlbD1zZWw7CisKKyAgICAgICAgbG8xZnJlcT0obG8xYSs4KmxvMW4pKmZyZWY7CisKKwl0dW5lcl9kYmcoIm10MjAzMjogcmZpbj0lZCBsbzE9JWQgbG8xbj0lZCBsbzFhPSVkIHNlbD0lZCwgbG8xZnJlcT0lZFxuIiwKKwkJICByZmluLGxvMSxsbzFuLGxvMWEsc2VsLGxvMWZyZXEpOworCisgICAgICAgIGRlc2lyZWRfbG8yPWxvMWZyZXEtcmZpbi1pZjI7CisgICAgICAgIGxvMj0oZGVzaXJlZF9sbzIpL2ZyZWY7CisgICAgICAgIGxvMm49bG8yLzg7CisgICAgICAgIGxvMmE9bG8yLShsbzJuKjgpOworICAgICAgICBsbzJudW09KChkZXNpcmVkX2xvMi8xMDAwKSUoZnJlZi8xMDAwKSkqIDM3ODAvKGZyZWYvMTAwMCk7IC8vc2NhbGUgdG8gZml0IGluIDMyYml0IGFyaXRoCisgICAgICAgIGxvMmZyZXE9KGxvMmErOCpsbzJuKSpmcmVmICsgbG8ybnVtKihmcmVmLzEwMDApLzM3ODAqMTAwMDsKKworCXR1bmVyX2RiZygibXQyMDMyOiByZmluPSVkIGxvMj0lZCBsbzJuPSVkIGxvMmE9JWQgbnVtPSVkIGxvMmZyZXE9JWRcbiIsCisJCSAgcmZpbixsbzIsbG8ybixsbzJhLGxvMm51bSxsbzJmcmVxKTsKKworICAgICAgICBpZihsbzFhPDAgfHwgbG8xYT43IHx8IGxvMW48MTcgfHxsbzFuPjQ4IHx8IGxvMmE8MCB8fGxvMmEgPjcgfHxsbzJuPDE3IHx8IGxvMm4+MzApIHsKKwkJdHVuZXJfaW5mbygibXQyMDMyOiBmcmVxdWVuY3kgcGFyYW1ldGVycyBvdXQgb2YgcmFuZ2U6ICVkICVkICVkICVkXG4iLAorCQkJICAgbG8xYSwgbG8xbiwgbG8yYSxsbzJuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisKKwltdDIwMzJfc3B1cmNoZWNrKGMsIGxvMWZyZXEsIGRlc2lyZWRfbG8yLCAgc3BlY3RydW1fZnJvbSwgc3BlY3RydW1fdG8pOworCS8vIHNob3VsZCByZWNhbGN1bGF0ZSBsbzEgKG9uZSBzdGVwIHVwL2Rvd24pCisKKwkvLyBzZXQgdXAgTVQyMDMyIHJlZ2lzdGVyIG1hcCBmb3IgdHJhbnNmZXIgb3ZlciBpMmMKKwlidWZbMF09bG8xbi0xOworCWJ1ZlsxXT1sbzFhIHwgKHNlbDw8NCk7CisJYnVmWzJdPTB4ODY7IC8vIExPR0MKKwlidWZbM109MHgwZjsgLy9yZXNlcnZlZAorCWJ1Zls0XT0weDFmOworCWJ1Zls1XT0obG8ybi0xKSB8IChsbzJhPDw1KTsKKyAJaWYocmZpbiA+NDAwKjEwMDAqMTAwMCkKKyAgICAgICAgICAgICAgICBidWZbNl09MHhlNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ1Zls2XT0weGY0OyAvLyBzZXQgUEtFTiBwZXIgcmV2IDEuMgorCWJ1Zls3XT04K3hvZ2M7CisJYnVmWzhdPTB4YzM7IC8vcmVzZXJ2ZWQKKwlidWZbOV09MHg0ZTsgLy9yZXNlcnZlZAorCWJ1ZlsxMF09MHhlYzsgLy9yZXNlcnZlZAorCWJ1ZlsxMV09KGxvMm51bSYweGZmKTsKKwlidWZbMTJdPShsbzJudW0+PjgpIHwweDgwOyAvLyBMbzJSU1QKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10MjAzMl9jaGVja19sb19sb2NrKHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlpbnQgdHJ5LGxvY2s9MDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKworCWZvcih0cnk9MDt0cnk8MTA7dHJ5KyspIHsKKwkJYnVmWzBdPTB4MGU7CisJCWkyY19tYXN0ZXJfc2VuZChjLGJ1ZiwxKTsKKwkJaTJjX21hc3Rlcl9yZWN2KGMsYnVmLDEpOworCQl0dW5lcl9kYmcoIm10MjAzMiBSZWcuRT0weCUwMnhcbiIsYnVmWzBdKTsKKwkJbG9jaz1idWZbMF0gJjB4MDY7CisKKwkJaWYgKGxvY2s9PTYpCisJCQlicmVhazsKKworCQl0dW5lcl9kYmcoIm10MjAzMjogcGxsIHdhaXQgMW1zIGZvciBsb2NrICgweCUyeClcbiIsYnVmWzBdKTsKKwkJdWRlbGF5KDEwMDApOworCX0KKyAgICAgICAgcmV0dXJuIGxvY2s7Cit9CisKK3N0YXRpYyBpbnQgbXQyMDMyX29wdGltaXplX3ZjbyhzdHJ1Y3QgaTJjX2NsaWVudCAqYyxpbnQgc2VsLGludCBsb2NrKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKwlpbnQgdGFkMTsKKworCWJ1ZlswXT0weDBmOworCWkyY19tYXN0ZXJfc2VuZChjLGJ1ZiwxKTsKKwlpMmNfbWFzdGVyX3JlY3YoYyxidWYsMSk7CisJdHVuZXJfZGJnKCJtdDIwMzIgUmVnLkY9MHglMDJ4XG4iLGJ1ZlswXSk7CisJdGFkMT1idWZbMF0mMHgwNzsKKworCWlmKHRhZDEgPT0wKSByZXR1cm4gbG9jazsKKwlpZih0YWQxID09MSkgcmV0dXJuIGxvY2s7CisKKwlpZih0YWQxPT0yKSB7CisJCWlmKHNlbD09MCkKKwkJCXJldHVybiBsb2NrOworCQllbHNlIHNlbC0tOworCX0KKwllbHNlIHsKKwkJaWYoc2VsPDQpCisJCQlzZWwrKzsKKwkJZWxzZQorCQkJcmV0dXJuIGxvY2s7CisJfQorCisJdHVuZXJfZGJnKCJtdDIwMzIgb3B0aW1pemVfdmNvOiBzZWw9JWRcbiIsc2VsKTsKKworCWJ1ZlswXT0weDBmOworCWJ1ZlsxXT1zZWw7CisgICAgICAgIGkyY19tYXN0ZXJfc2VuZChjLGJ1ZiwyKTsKKwlsb2NrPW10MjAzMl9jaGVja19sb19sb2NrKGMpOworCXJldHVybiBsb2NrOworfQorCisKK3N0YXRpYyB2b2lkIG10MjAzMl9zZXRfaWZfZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IHJmaW4sCisJCQkgICAgICAgdW5zaWduZWQgaW50IGlmMSwgdW5zaWduZWQgaW50IGlmMiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZnJvbSwgdW5zaWduZWQgaW50IHRvKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzIxXTsKKwlpbnQgbGludF90cnkscmV0LHNlbCxsb2NrPTA7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJdHVuZXJfZGJnKCJtdDIwMzJfc2V0X2lmX2ZyZXEgcmZpbj0lZCBpZjE9JWQgaWYyPSVkIGZyb209JWQgdG89JWRcbiIsCisJCSAgcmZpbixpZjEsaWYyLGZyb20sdG8pOworCisgICAgICAgIGJ1ZlswXT0wOworICAgICAgICByZXQ9aTJjX21hc3Rlcl9zZW5kKGMsYnVmLDEpOworICAgICAgICBpMmNfbWFzdGVyX3JlY3YoYyxidWYsMjEpOworCisJYnVmWzBdPTA7CisJcmV0PW10MjAzMl9jb21wdXRlX2ZyZXEoYyxyZmluLGlmMSxpZjIsZnJvbSx0bywmYnVmWzFdLCZzZWwsdC0+eG9nYyk7CisJaWYgKHJldDwwKQorCQlyZXR1cm47CisKKyAgICAgICAgLy8gc2VuZCBvbmx5IHRoZSByZWxldmFudCByZWdpc3RlcnMgcGVyIFJldi4gMS4yCisgICAgICAgIGJ1ZlswXT0wOworICAgICAgICByZXQ9aTJjX21hc3Rlcl9zZW5kKGMsYnVmLDQpOworICAgICAgICBidWZbNV09NTsKKyAgICAgICAgcmV0PWkyY19tYXN0ZXJfc2VuZChjLGJ1Zis1LDQpOworICAgICAgICBidWZbMTFdPTExOworICAgICAgICByZXQ9aTJjX21hc3Rlcl9zZW5kKGMsYnVmKzExLDMpOworICAgICAgICBpZihyZXQhPTMpCisJCXR1bmVyX3dhcm4oImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgMylcbiIscmV0KTsKKworCS8vIHdhaXQgZm9yIFBMTHMgdG8gbG9jayAocGVyIG1hbnVhbCksIHJldHJ5IExJTlQgaWYgbm90LgorCWZvcihsaW50X3RyeT0wOyBsaW50X3RyeTwyOyBsaW50X3RyeSsrKSB7CisJCWxvY2s9bXQyMDMyX2NoZWNrX2xvX2xvY2soYyk7CisKKwkJaWYob3B0aW1pemVfdmNvKQorCQkJbG9jaz1tdDIwMzJfb3B0aW1pemVfdmNvKGMsc2VsLGxvY2spOworCQlpZihsb2NrPT02KSBicmVhazsKKworCQl0dW5lcl9kYmcoIm10MjAzMjogcmUtaW5pdCBQTExzIGJ5IExJTlRcbiIpOworCQlidWZbMF09NzsKKwkJYnVmWzFdPTB4ODAgKzgrdC0+eG9nYzsgLy8gc2V0IExJTlQgdG8gcmUtaW5pdCBQTExzCisJCWkyY19tYXN0ZXJfc2VuZChjLGJ1ZiwyKTsKKwkJbWRlbGF5KDEwKTsKKwkJYnVmWzFdPTgrdC0+eG9nYzsKKwkJaTJjX21hc3Rlcl9zZW5kKGMsYnVmLDIpOworICAgICAgICB9CisKKwlpZiAobG9jayE9NikKKwkJdHVuZXJfd2FybigiTVQyMDMyIEZhdGFsIEVycm9yOiBQTExzIGRpZG4ndCBsb2NrLlxuIik7CisKKwlidWZbMF09MjsKKwlidWZbMV09MHgyMDsgLy8gTE9HQyBmb3Igb3B0aW1hbCBwaGFzZSBub2lzZQorCXJldD1pMmNfbWFzdGVyX3NlbmQoYyxidWYsMik7CisJaWYgKHJldCE9MikKKwkJdHVuZXJfd2FybigiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIixyZXQpOworfQorCisKK3N0YXRpYyB2b2lkIG10MjAzMl9zZXRfdHZfZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpCit7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCWludCBpZjIsZnJvbSx0bzsKKworCS8vIHNpZ25hbCBiYW5kd2lkdGggYW5kIHBpY3R1cmUgY2FycmllcgorCWlmICh0LT5zdGQgJiBWNEwyX1NURF81MjVfNjApIHsKKwkJLy8gTlRTQworCQlmcm9tID0gNDA3NTAqMTAwMDsKKwkJdG8gICA9IDQ2NzUwKjEwMDA7CisJCWlmMiAgPSA0NTc1MCoxMDAwOworCX0gZWxzZSB7CisJCS8vIFBBTAorCQlmcm9tID0gMzI5MDAqMTAwMDsKKwkJdG8gICA9IDM5OTAwKjEwMDA7CisJCWlmMiAgPSAzODkwMCoxMDAwOworCX0KKworICAgICAgICBtdDIwMzJfc2V0X2lmX2ZyZXEoYywgZnJlcSo2MjUwMCAvKiBmcmVxKjEwMDAqMTAwMC8xNiAqLywKKwkJCSAgIDEwOTAqMTAwMCoxMDAwLCBpZjIsIGZyb20sIHRvKTsKK30KKworc3RhdGljIHZvaWQgbXQyMDMyX3NldF9yYWRpb19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSkKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJaW50IGlmMiA9IHQtPnJhZGlvX2lmMjsKKworCS8vIHBlciBNYW51YWwgZm9yIEZNIHR1bmluZzogZmlyc3QgaWYgY2VudGVyIGZyZXEuIDEwODUgTUh6CisgICAgICAgIG10MjAzMl9zZXRfaWZfZnJlcShjLCBmcmVxKjYyNTAwIC8qIGZyZXEqMTAwMCoxMDAwLzE2ICovLAorCQkJICAgMTA4NSoxMDAwKjEwMDAsaWYyLGlmMixpZjIpOworfQorCisvLyBJbml0YWxpemF0aW9uIGFzIGRlc2NyaWJlZCBpbiAiTVQyMDN4IFByb2dyYW1taW5nIFByb2NlZHVyZXMiLCBSZXYgMS4yLCBGZWIuMjAwMQorc3RhdGljIGludCBtdDIwMzJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzIxXTsKKyAgICAgICAgaW50IHJldCx4b2djLHhvaz0wOworCisJLy8gSW5pdGlhbGl6ZSBSZWdpc3RlcnMgcGVyIHNwZWMuCisgICAgICAgIGJ1ZlsxXT0yOyAvLyBJbmRleCB0byByZWdpc3RlciAyCisgICAgICAgIGJ1ZlsyXT0weGZmOworICAgICAgICBidWZbM109MHgwZjsKKyAgICAgICAgYnVmWzRdPTB4MWY7CisgICAgICAgIHJldD1pMmNfbWFzdGVyX3NlbmQoYyxidWYrMSw0KTsKKworICAgICAgICBidWZbNV09NjsgLy8gSW5kZXggcmVnaXN0ZXIgNgorICAgICAgICBidWZbNl09MHhlNDsKKyAgICAgICAgYnVmWzddPTB4OGY7CisgICAgICAgIGJ1Zls4XT0weGMzOworICAgICAgICBidWZbOV09MHg0ZTsKKyAgICAgICAgYnVmWzEwXT0weGVjOworICAgICAgICByZXQ9aTJjX21hc3Rlcl9zZW5kKGMsYnVmKzUsNik7CisKKyAgICAgICAgYnVmWzEyXT0xMzsgIC8vIEluZGV4IHJlZ2lzdGVyIDEzCisgICAgICAgIGJ1ZlsxM109MHgzMjsKKyAgICAgICAgcmV0PWkyY19tYXN0ZXJfc2VuZChjLGJ1ZisxMiwyKTsKKworICAgICAgICAvLyBBZGp1c3QgWE9HQyAocmVnaXN0ZXIgNyksIHdhaXQgZm9yIFhPSworICAgICAgICB4b2djPTc7CisgICAgICAgIGRvIHsKKwkJdHVuZXJfZGJnKCJtdDIwMzI6IHhvZ2MgPSAweCUwMnhcbiIseG9nYyYweDA3KTsKKyAgICAgICAgICAgICAgICBtZGVsYXkoMTApOworICAgICAgICAgICAgICAgIGJ1ZlswXT0weDBlOworICAgICAgICAgICAgICAgIGkyY19tYXN0ZXJfc2VuZChjLGJ1ZiwxKTsKKyAgICAgICAgICAgICAgICBpMmNfbWFzdGVyX3JlY3YoYyxidWYsMSk7CisgICAgICAgICAgICAgICAgeG9rPWJ1ZlswXSYweDAxOworICAgICAgICAgICAgICAgIHR1bmVyX2RiZygibXQyMDMyOiB4b2sgPSAweCUwMnhcbiIseG9rKTsKKyAgICAgICAgICAgICAgICBpZiAoeG9rID09IDEpIGJyZWFrOworCisgICAgICAgICAgICAgICAgeG9nYy0tOworICAgICAgICAgICAgICAgIHR1bmVyX2RiZygibXQyMDMyOiB4b2djID0gMHglMDJ4XG4iLHhvZ2MmMHgwNyk7CisgICAgICAgICAgICAgICAgaWYgKHhvZ2MgPT0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgeG9nYz00OyAvLyBtaW4uIDQgcGVyIHNwZWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZbMF09MHgwNzsKKyAgICAgICAgICAgICAgICBidWZbMV09MHg4OCArIHhvZ2M7CisgICAgICAgICAgICAgICAgcmV0PWkyY19tYXN0ZXJfc2VuZChjLGJ1ZiwyKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IT0yKQorCQkJdHVuZXJfd2FybigiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIixyZXQpOworICAgICAgICB9IHdoaWxlICh4b2sgIT0gMSApOworCXQtPnhvZ2M9eG9nYzsKKworCXQtPnR2X2ZyZXEgICAgPSBtdDIwMzJfc2V0X3R2X2ZyZXE7CisJdC0+cmFkaW9fZnJlcSA9IG10MjAzMl9zZXRfcmFkaW9fZnJlcTsKKyAgICAgICAgcmV0dXJuKDEpOworfQorCitzdGF0aWMgdm9pZCBtdDIwNTBfc2V0X2FudGVubmEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGNoYXIgYW50ZW5uYSkKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisgICAgICAgdW5zaWduZWQgY2hhciBidWZbMl07CisgICAgICAgaW50IHJldDsKKworICAgICAgIGJ1ZlswXSA9IDY7CisgICAgICAgYnVmWzFdID0gYW50ZW5uYSA/IDB4MTEgOiAweDEwOworICAgICAgIHJldD1pMmNfbWFzdGVyX3NlbmQoYyxidWYsMik7CisgICAgICAgdHVuZXJfZGJnKCJtdDIwNTA6IGVuYWJsZWQgYW50ZW5uYSBjb25uZWN0b3IgJWRcbiIsIGFudGVubmEpOworfQorCitzdGF0aWMgdm9pZCBtdDIwNTBfc2V0X2lmX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsdW5zaWduZWQgaW50IGZyZXEsIHVuc2lnbmVkIGludCBpZjIpCit7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXVuc2lnbmVkIGludCBpZjE9MTIxOCoxMDAwKjEwMDA7CisJdW5zaWduZWQgaW50IGZfbG8xLGZfbG8yLGxvMSxsbzIsZl9sbzFfbW9kdWxvLGZfbG8yX21vZHVsbyxudW0xLG51bTIsZGl2MWEsZGl2MWIsZGl2MmEsZGl2MmI7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKworCXR1bmVyX2RiZygibXQyMDUwX3NldF9pZl9mcmVxIGZyZXE9JWQgaWYxPSVkIGlmMj0lZFxuIiwKKwkJICBmcmVxLGlmMSxpZjIpOworCisJZl9sbzE9ZnJlcStpZjE7CisJZl9sbzE9KGZfbG8xLzEwMDAwMDApKjEwMDAwMDA7CisKKwlmX2xvMj1mX2xvMS1mcmVxLWlmMjsKKwlmX2xvMj0oZl9sbzIvNTAwMDApKjUwMDAwOworCisJbG8xPWZfbG8xLzQwMDAwMDA7CisJbG8yPWZfbG8yLzQwMDAwMDA7CisKKwlmX2xvMV9tb2R1bG89IGZfbG8xLShsbzEqNDAwMDAwMCk7CisJZl9sbzJfbW9kdWxvPSBmX2xvMi0obG8yKjQwMDAwMDApOworCisJbnVtMT00KmZfbG8xX21vZHVsby80MDAwMDAwOworCW51bTI9NDA5NiooZl9sbzJfbW9kdWxvLzEwMDApLzQwMDA7CisKKwkvLyB0b2RvIHNwdXJjaGVja3MKKworCWRpdjFhPShsbzEvMTIpLTE7CisJZGl2MWI9bG8xLShkaXYxYSsxKSoxMjsKKworCWRpdjJhPShsbzIvOCktMTsKKwlkaXYyYj1sbzItKGRpdjJhKzEpKjg7CisKKwlpZiAodHVuZXJfZGVidWcgPiAxKSB7CisJCXR1bmVyX2RiZygibG8xIGxvMiA9ICVkICVkXG4iLCBsbzEsIGxvMik7CisJCXR1bmVyX2RiZygibnVtMSBudW0yIGRpdjFhIGRpdjFiIGRpdjJhIGRpdjJiPSAleCAleCAleCAleCAleCAleFxuIiwKKwkJCSAgbnVtMSxudW0yLGRpdjFhLGRpdjFiLGRpdjJhLGRpdjJiKTsKKwl9CisKKwlidWZbMF09MTsKKwlidWZbMV09IDQqZGl2MWIgKyBudW0xOworCWlmKGZyZXE8Mjc1KjEwMDAqMTAwMCkgYnVmWzFdID0gYnVmWzFdfDB4ODA7CisKKwlidWZbMl09ZGl2MWE7CisJYnVmWzNdPTMyKmRpdjJiICsgbnVtMi8yNTY7CisJYnVmWzRdPW51bTItKG51bTIvMjU2KSoyNTY7CisJYnVmWzVdPWRpdjJhOworCWlmKG51bTIhPTApIGJ1Zls1XT1idWZbNV18MHg0MDsKKworCWlmICh0dW5lcl9kZWJ1ZyA+IDEpIHsKKwkJaW50IGk7CisJCXR1bmVyX2RiZygiYnVmcyBpczogIik7CisJCWZvcihpPTA7aTw2O2krKykKKwkJCXByaW50aygiJXggIixidWZbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorCisJcmV0PWkyY19tYXN0ZXJfc2VuZChjLGJ1Ziw2KTsKKyAgICAgICAgaWYgKHJldCE9NikKKwkJdHVuZXJfd2FybigiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSA2KVxuIixyZXQpOworfQorCitzdGF0aWMgdm9pZCBtdDIwNTBfc2V0X3R2X2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwl1bnNpZ25lZCBpbnQgaWYyOworCisJaWYgKHQtPnN0ZCAmIFY0TDJfU1REXzUyNV82MCkgeworCQkvLyBOVFNDCisgICAgICAgICAgICAgICAgaWYyID0gNDU3NTAqMTAwMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBQQUwKKyAgICAgICAgICAgICAgICBpZjIgPSAzODkwMCoxMDAwOworICAgICAgICB9CisJaWYgKFY0TDJfVFVORVJfRElHSVRBTF9UViA9PSB0LT5tb2RlKSB7CisJCS8vIERWQiAocGlubmFjbGUgMzAwaSkKKwkJaWYyID0gMzYxNTAqMTAwMDsKKwl9CisJbXQyMDUwX3NldF9pZl9mcmVxKGMsIGZyZXEqNjI1MDAsIGlmMik7CisJbXQyMDUwX3NldF9hbnRlbm5hKGMsIHR2X2FudGVubmEpOworfQorCitzdGF0aWMgdm9pZCBtdDIwNTBfc2V0X3JhZGlvX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlpbnQgaWYyID0gdC0+cmFkaW9faWYyOworCisJbXQyMDUwX3NldF9pZl9mcmVxKGMsIGZyZXEqNjI1MDAsIGlmMik7CisJbXQyMDUwX3NldF9hbnRlbm5hKGMsIHJhZGlvX2FudGVubmEpOworfQorCitzdGF0aWMgaW50IG10MjA1MF9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKwlpbnQgcmV0OworCisJYnVmWzBdPTY7CisJYnVmWzFdPTB4MTA7CisJcmV0PWkyY19tYXN0ZXJfc2VuZChjLGJ1ZiwyKTsgLy8gIHBvd2VyCisKKwlidWZbMF09MHgwZjsKKwlidWZbMV09MHgwZjsKKwlyZXQ9aTJjX21hc3Rlcl9zZW5kKGMsYnVmLDIpOyAvLyBtMWxvCisKKwlidWZbMF09MHgwZDsKKwlyZXQ9aTJjX21hc3Rlcl9zZW5kKGMsYnVmLDEpOworCWkyY19tYXN0ZXJfcmVjdihjLGJ1ZiwxKTsKKworCXR1bmVyX2RiZygibXQyMDUwOiBzcm8gaXMgJXhcbiIsYnVmWzBdKTsKKwl0LT50dl9mcmVxICAgID0gbXQyMDUwX3NldF90dl9mcmVxOworCXQtPnJhZGlvX2ZyZXEgPSBtdDIwNTBfc2V0X3JhZGlvX2ZyZXE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtaWNyb3R1bmVfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJY2hhciAqbmFtZTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBidWZbMjFdOworCWludCBjb21wYW55X2NvZGU7CisKKwltZW1zZXQoYnVmLDAsc2l6ZW9mKGJ1ZikpOworCXQtPnR2X2ZyZXEgICAgPSBOVUxMOworCXQtPnJhZGlvX2ZyZXEgPSBOVUxMOworCW5hbWUgPSAidW5rbm93biI7CisKKyAgICAgICAgaTJjX21hc3Rlcl9zZW5kKGMsYnVmLDEpOworICAgICAgICBpMmNfbWFzdGVyX3JlY3YoYyxidWYsMjEpOworICAgICAgICBpZiAodHVuZXJfZGVidWcpIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKwkJdHVuZXJfZGJnKCJNVDIweHggaGV4ZHVtcDoiKTsKKyAgICAgICAgICAgICAgICBmb3IoaT0wO2k8MjE7aSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIiAlMDJ4IixidWZbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChpKzEpJTgpPT0wKSBwcmludGsoIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICB9CisJY29tcGFueV9jb2RlID0gYnVmWzB4MTFdIDw8IDggfCBidWZbMHgxMl07CisJdHVuZXJfaW5mbygibWljcm90dW5lOiBjb21wYW55Y29kZT0lMDR4IHBhcnQ9JTAyeCByZXY9JTAyeFxuIiwKKwkJICAgY29tcGFueV9jb2RlLGJ1ZlsweDEzXSxidWZbMHgxNF0pOworCisjaWYgMAorCS8qIHNlZW1zIHRvIGNhdXNlIG1vcmUgcHJvYmxlbXMgdGhhbiBpdCBzb2x2ZXMgLi4uICovCisJc3dpdGNoIChjb21wYW55X2NvZGUpIHsKKwljYXNlIDB4MzBiZjoKKwljYXNlIDB4M2NiZjoKKwljYXNlIDB4M2RiZjoKKwljYXNlIDB4NGQ1NDoKKwljYXNlIDB4OGU4MToKKwljYXNlIDB4OGU5MToKKwkJLyogb2sgKD8pICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXR1bmVyX3dhcm4oInR1bmVyOiBtaWNyb3R1bmU6IHVua25vd24gY29tcGFueWNvZGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCWlmIChidWZbMHgxM10gPCBBUlJBWV9TSVpFKG1pY3JvdHVuZV9wYXJ0KSAmJgorCSAgICBOVUxMICE9IG1pY3JvdHVuZV9wYXJ0W2J1ZlsweDEzXV0pCisJCW5hbWUgPSBtaWNyb3R1bmVfcGFydFtidWZbMHgxM11dOworCXN3aXRjaCAoYnVmWzB4MTNdKSB7CisJY2FzZSBNVDIwMzI6CisJCW10MjAzMl9pbml0KGMpOworCQlicmVhazsKKwljYXNlIE1UMjA1MDoKKwkJbXQyMDUwX2luaXQoYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXR1bmVyX2luZm8oIm1pY3JvdHVuZSAlcyBmb3VuZCwgbm90ICh5ZXQ/KSBzdXBwb3J0ZWQsIHNvcnJ5IDotL1xuIiwKKwkJCSAgIG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKwlzdHJsY3B5KGMtPm5hbWUsIG5hbWUsIHNpemVvZihjLT5uYW1lKSk7CisJdHVuZXJfaW5mbygibWljcm90dW5lICVzIGZvdW5kLCBPS1xuIixuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGJmMWYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYwpAQCAtMCwwICsxLDEwMzUgQEAKKy8qCisgICAgbXhiIC0gdjRsMiBkcml2ZXIgZm9yIHRoZSBNdWx0aW1lZGlhIGVYdGVuc2lvbiBCb2FyZAorICAgIAorICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIE1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+CisKKyAgICBWaXNpdCBodHRwOi8vd3d3Lm1paHUuZGUvbGludXgvc2FhNzE0Ni9teGIvCisgICAgZm9yIGZ1cnRoZXIgZGV0YWlscyBhYm91dCB0aGlzIGNhcmQuCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjZGVmaW5lIERFQlVHX1ZBUklBQkxFIGRlYnVnCisKKyNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2X3Z2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisKKyNpbmNsdWRlICJteGIuaCIKKyNpbmNsdWRlICJ0ZWE2NDE1Yy5oIgorI2luY2x1ZGUgInRlYTY0MjAuaCIKKyNpbmNsdWRlICJ0ZGE5ODQwLmgiCisKKyNkZWZpbmUgSTJDX1NBQTcxMTEgMHgyNAorCisjZGVmaW5lIE1YQl9CT0FSRF9DQU5fRE9fVkJJKGRldikgICAoZGV2LT5yZXZpc2lvbiAhPSAwKSAKKworLyogZ2xvYmFsIHZhcmlhYmxlICovCitzdGF0aWMgaW50IG14Yl9udW0gPSAwOworCisvKiBpbml0aWFsIGZyZXF1ZW5jZSB0aGUgdHVuZXIgd2lsbCBiZSB0dW5lZCB0by4gCisgICBpbiB2ZXJkZW4gKGxvd2VyIHNheG9ueSwgZ2VybWFueSkgNDE0OCBpcyBhCisgICBjaGFubmVsIGNhbGxlZCAicGhvZW5peCIgKi8KK3N0YXRpYyBpbnQgZnJlcSA9IDQxNDg7Cittb2R1bGVfcGFyYW0oZnJlcSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZnJlcSwgImluaXRpYWwgZnJlcXVlbmN5IHRoZSB0dW5lciB3aWxsIGJlIHR1bmVkIHRvIHdoaWxlIHNldHVwIik7CisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGRldmljZSBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworI2RlZmluZSBNWEJfSU5QVVRTIDQKK2VudW0geyBUVU5FUiwgQVVYMSwgQVVYMywgQVVYM19ZQyB9OworCitzdGF0aWMgc3RydWN0IHY0bDJfaW5wdXQgbXhiX2lucHV0c1tNWEJfSU5QVVRTXSA9IHsKKwl7IFRVTkVSLAkiVHVuZXIiLAkJVjRMMl9JTlBVVF9UWVBFX1RVTkVSLAkxLCAwLCBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLCAwIH0sIAorCXsgQVVYMSwJCSJBVVgxIiwJCQlWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBLAkyLCAwLCBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLCAwIH0sCisJeyBBVVgzLAkJIkFVWDMgQ29tcG9zaXRlIiwJVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwJNCwgMCwgVjRMMl9TVERfUEFMX0JHfFY0TDJfU1REX05UU0NfTSwgMCB9LAorCXsgQVVYM19ZQywJIkFVWDMgUy1WaWRlbyIsCQlWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBLAk0LCAwLCBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLCAwIH0sCit9OworCisvKiB0aGlzIGFycmF5IGhvbGRzIHRoZSBpbmZvcm1hdGlvbiwgd2hpY2ggcG9ydCBvZiB0aGUgc2FhNzE0NiBlYWNoCisgICBpbnB1dCBhY3R1YWxseSB1c2VzLiB0aGUgbXhiIHVzZXMgcG9ydCAwIGZvciBldmVyeSBpbnB1dCAqLworc3RhdGljIHN0cnVjdCB7CisJaW50IGhwc19zb3VyY2U7CisJaW50IGhwc19zeW5jOworfSBpbnB1dF9wb3J0X3NlbGVjdGlvbltNWEJfSU5QVVRTXSA9IHsgCQorCXsgU0FBNzE0Nl9IUFNfU09VUkNFX1BPUlRfQSwgU0FBNzE0Nl9IUFNfU1lOQ19QT1JUX0EgfSwKKwl7IFNBQTcxNDZfSFBTX1NPVVJDRV9QT1JUX0EsIFNBQTcxNDZfSFBTX1NZTkNfUE9SVF9BIH0sCisJeyBTQUE3MTQ2X0hQU19TT1VSQ0VfUE9SVF9BLCBTQUE3MTQ2X0hQU19TWU5DX1BPUlRfQSB9LAorCXsgU0FBNzE0Nl9IUFNfU09VUkNFX1BPUlRfQSwgU0FBNzE0Nl9IUFNfU1lOQ19QT1JUX0EgfSwKK307CisKKy8qIHRoaXMgYXJyYXkgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UgKG14Yl9hdWRpb3MpLAorICAgd2hpY2ggaGFzIHRvIGJlIHN3aXRjaGVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZGVvIHNvdXJjZSAobXhiX2NoYW5uZWxzKSAqLworc3RhdGljIGludCB2aWRlb19hdWRpb19jb25uZWN0W01YQl9JTlBVVFNdID0KKwl7IDAsIDEsIDMsIDMgfTsKKworLyogdGhlc2UgYXJlIHRoZSBuZWNlc3NhcnkgaW5wdXQtb3V0cHV0LXBpbnMgZm9yIGJyaW5naW5nIG9uZSBhdWRpbyBzb3VyY2UKKyhzZWUgYWJvdmUpIHRvIHRoZSBDRC1vdXRwdXQgKi8KK3N0YXRpYyBzdHJ1Y3QgdGVhNjQyMF9tdWx0aXBsZXggVEVBNjQyMF9jZFtNWEJfQVVESU9TKzFdWzJdID0KKwkJeyAKKwkJe3sxLDEsMH0sezEsMSwwfX0sCS8qIFR1bmVyICovCisJCXt7NSwxLDB9LHs2LDEsMH19LAkvKiBBVVggMSAqLworCQl7ezQsMSwwfSx7NiwxLDB9fSwJLyogQVVYIDIgKi8KKwkJe3szLDEsMH0sezYsMSwwfX0sCS8qIEFVWCAzICovCisJCXt7MSwxLDB9LHszLDEsMH19LAkvKiBSYWRpbyAqLworCQl7ezEsMSwwfSx7MiwxLDB9fSwJLyogQ0QtUm9tICovCisJCXt7NiwxLDB9LHs2LDEsMH19CS8qIE11dGUgKi8KKwkJfTsKKworLyogdGhlc2UgYXJlIHRoZSBuZWNlc3NhcnkgaW5wdXQtb3V0cHV0LXBpbnMgZm9yIGJyaW5naW5nIG9uZSBhdWRpbyBzb3VyY2UKKyhzZWUgYWJvdmUpIHRvIHRoZSBsaW5lLW91dHB1dCAqLworc3RhdGljIHN0cnVjdCB0ZWE2NDIwX211bHRpcGxleCBURUE2NDIwX2xpbmVbTVhCX0FVRElPUysxXVsyXSA9CisJCXsKKwkJe3syLDMsMH0sezEsMiwwfX0sCisJCXt7NSwzLDB9LHs2LDIsMH19LAorCQl7ezQsMywwfSx7NiwyLDB9fSwKKwkJe3szLDMsMH0sezYsMiwwfX0sCisJCXt7MiwzLDB9LHszLDIsMH19LAorCQl7ezIsMywwfSx7MiwyLDB9fSwKKwkJe3s2LDMsMH0sezYsMiwwfX0JLyogTXV0ZSAqLworCQl9OworCisjZGVmaW5lIE1BWENPTlRST0xTCTEKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbXhiX2NvbnRyb2xzW10gPSB7CisJeyBWNEwyX0NJRF9BVURJT19NVVRFLCBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLCAiTXV0ZSIsIDAsIDEsIDEsIDAsIDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9leHRlbnNpb25faW9jdGxzIGlvY3Rsc1tdID0geworCXsgVklESU9DX0VOVU1JTlBVVCwgCVNBQTcxNDZfRVhDTFVTSVZFIH0sCisJeyBWSURJT0NfR19JTlBVVCwJU0FBNzE0Nl9FWENMVVNJVkUgfSwKKwl7IFZJRElPQ19TX0lOUFVULAlTQUE3MTQ2X0VYQ0xVU0lWRSB9LAorCXsgVklESU9DX1FVRVJZQ1RSTCwgCVNBQTcxNDZfQkVGT1JFIH0sCisJeyBWSURJT0NfR19DVFJMLAlTQUE3MTQ2X0JFRk9SRSB9LAorCXsgVklESU9DX1NfQ1RSTCwJU0FBNzE0Nl9CRUZPUkUgfSwKKwl7IFZJRElPQ19HX1RVTkVSLCAJU0FBNzE0Nl9FWENMVVNJVkUgfSwKKwl7IFZJRElPQ19TX1RVTkVSLCAJU0FBNzE0Nl9FWENMVVNJVkUgfSwKKwl7IFZJRElPQ19HX0ZSRVFVRU5DWSwJU0FBNzE0Nl9FWENMVVNJVkUgfSwKKwl7IFZJRElPQ19TX0ZSRVFVRU5DWSwgCVNBQTcxNDZfRVhDTFVTSVZFIH0sCisJeyBWSURJT0NfR19BVURJTywgCVNBQTcxNDZfRVhDTFVTSVZFIH0sCisJeyBWSURJT0NfU19BVURJTywgCVNBQTcxNDZfRVhDTFVTSVZFIH0sCisJeyBNWEJfU19BVURJT19DRCwgCVNBQTcxNDZfRVhDTFVTSVZFIH0sCS8qIGN1c3RvbSBjb250cm9sICovCQorCXsgTVhCX1NfQVVESU9fTElORSwgCVNBQTcxNDZfRVhDTFVTSVZFIH0sCS8qIGN1c3RvbSBjb250cm9sICovCQorCXsgMCwJCQkwIH0KK307CisKK3N0cnVjdCBteGIKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlCSp2aWRlb19kZXY7CisJc3RydWN0IHZpZGVvX2RldmljZQkqdmJpX2RldjsKKworCXN0cnVjdCBpMmNfYWRhcHRlcglpMmNfYWRhcHRlcjsJCisKKwlzdHJ1Y3QgaTJjX2NsaWVudCoJc2FhNzExMWE7CisJc3RydWN0IGkyY19jbGllbnQqCXRkYTk4NDA7CisJc3RydWN0IGkyY19jbGllbnQqCXRlYTY0MTVjOworCXN0cnVjdCBpMmNfY2xpZW50Kgl0dW5lcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCoJdGVhNjQyMF8xOworCXN0cnVjdCBpMmNfY2xpZW50Kgl0ZWE2NDIwXzI7CisKKwlpbnQJY3VyX21vZGU7CS8qIGN1cnJlbnQgYXVkaW8gbW9kZSAobW9ubywgc3RlcmVvLCAuLi4pICovCisJaW50CWN1cl9pbnB1dDsJLyogY3VycmVudCBpbnB1dCAqLworCWludAljdXJfZnJlcTsJLyogY3VycmVudCBmcmVxdWVuY3kgdGhlIHR1bmVyIGlzIHR1bmVkIHRvICovCisJaW50CWN1cl9tdXRlOwkvKiBjdXJyZW50IG11dGUgc3RhdHVzICovCit9OworCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uIGV4dGVuc2lvbjsKKworc3RhdGljIGludCBteGJfcHJvYmUoc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYpCit7CisJc3RydWN0IG14YiogbXhiID0gTlVMTDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisJaW50IHJlc3VsdDsKKworCWlmICgocmVzdWx0ID0gcmVxdWVzdF9tb2R1bGUoInNhYTcxMTEiKSkgPCAwKSB7CisJCXByaW50aygibXhiOiBzYWE3MTExIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgidHVuZXIiKSkgPCAwKSB7CisJCXByaW50aygibXhiOiB0dW5lciBpMmMgbW9kdWxlIG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICgocmVzdWx0ID0gcmVxdWVzdF9tb2R1bGUoInRlYTY0MjAiKSkgPCAwKSB7CisJCXByaW50aygibXhiOiB0ZWE2NDIwIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgidGVhNjQxNWMiKSkgPCAwKSB7CisJCXByaW50aygibXhiOiB0ZWE2NDE1YyBpMmMgbW9kdWxlIG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICgocmVzdWx0ID0gcmVxdWVzdF9tb2R1bGUoInRkYTk4NDAiKSkgPCAwKSB7CisJCXByaW50aygibXhiOiB0ZGE5ODQwIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlteGIgPSAoc3RydWN0IG14Yiopa21hbGxvYyhzaXplb2Yoc3RydWN0IG14YiksIEdGUF9LRVJORUwpOworCWlmKCBOVUxMID09IG14YiApIHsKKwkJREVCX0QoKCJub3QgZW5vdWdoIGtlcm5lbCBtZW1vcnkuXG4iKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQobXhiLCAweDAsIHNpemVvZihzdHJ1Y3QgbXhiKSk7CQorCisJbXhiLT5pMmNfYWRhcHRlciA9IChzdHJ1Y3QgaTJjX2FkYXB0ZXIpIHsKKwkJLmNsYXNzID0gSTJDX0NMQVNTX1RWX0FOQUxPRywKKwkJLm5hbWUgPSAibXhiIiwKKwl9OworCisJc2FhNzE0Nl9pMmNfYWRhcHRlcl9wcmVwYXJlKGRldiwgJm14Yi0+aTJjX2FkYXB0ZXIsIFNBQTcxNDZfSTJDX0JVU19CSVRfUkFURV80ODApOworCWlmKGkyY19hZGRfYWRhcHRlcigmbXhiLT5pMmNfYWRhcHRlcikgPCAwKSB7CisJCURFQl9TKCgiY2Fubm90IHJlZ2lzdGVyIGkyYy1kZXZpY2UuIHNraXBwaW5nLlxuIikpOworCQlrZnJlZShteGIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBsb29wIHRocm91Z2ggYWxsIGkyYy1kZXZpY2VzIG9uIHRoZSBidXMgYW5kIGxvb2sgd2hvIGlzIHRoZXJlICovCisJbGlzdF9mb3JfZWFjaChpdGVtLCZteGItPmkyY19hZGFwdGVyLmNsaWVudHMpIHsKKwkJY2xpZW50ID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgaTJjX2NsaWVudCwgbGlzdCk7CisJCWlmKCBJMkNfVEVBNjQyMF8xID09IGNsaWVudC0+YWRkciApCisJCQlteGItPnRlYTY0MjBfMSA9IGNsaWVudDsKKwkJaWYoIEkyQ19URUE2NDIwXzIgPT0gY2xpZW50LT5hZGRyICkgCisJCQlteGItPnRlYTY0MjBfMiA9IGNsaWVudDsKKwkJaWYoIEkyQ19URUE2NDE1Q18yID09IGNsaWVudC0+YWRkciApIAorCQkJbXhiLT50ZWE2NDE1YyA9IGNsaWVudDsKKwkJaWYoIEkyQ19UREE5ODQwID09IGNsaWVudC0+YWRkciApIAorCQkJbXhiLT50ZGE5ODQwID0gY2xpZW50OworCQlpZiggSTJDX1NBQTcxMTEgPT0gY2xpZW50LT5hZGRyICkKKwkJCW14Yi0+c2FhNzExMWEgPSBjbGllbnQ7CisJCWlmKCAweDYwID09IGNsaWVudC0+YWRkciApIAorCQkJbXhiLT50dW5lciA9IGNsaWVudDsKKwl9CisKKwkvKiBjaGVjayBpZiBhbGwgZGV2aWNlcyBhcmUgcHJlc2VudCAqLworCWlmKCAgICAwID09IG14Yi0+dGVhNjQyMF8xCXx8IDAgPT0gbXhiLT50ZWE2NDIwXzIJfHwgMCA9PSBteGItPnRlYTY0MTVjCisJICAgIHx8IDAgPT0gbXhiLT50ZGE5ODQwCXx8IDAgPT0gbXhiLT5zYWE3MTExYQl8fCAwID09IG14Yi0+dHVuZXIgKSB7CisKKwkJcHJpbnRrKCJteGI6IGRpZCBub3QgZmluZCBhbGwgaTJjIGRldmljZXMuIGFib3J0aW5nXG4iKTsKKwkJaTJjX2RlbF9hZGFwdGVyKCZteGItPmkyY19hZGFwdGVyKTsKKwkJa2ZyZWUobXhiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogYWxsIGRldmljZXMgYXJlIHByZXNlbnQsIHByb2JlIHdhcyBzdWNjZXNzZnVsICovCQorCisJLyogd2Ugc3RvcmUgdGhlIHBvaW50ZXIgaW4gb3VyIHByaXZhdGUgZGF0YSBmaWVsZCAqLworCWRldi0+ZXh0X3ByaXYgPSBteGI7CisKKwlyZXR1cm4gMDsKK30KKworLyogc29tZSBpbml0IGRhdGEgZm9yIHRoZSBzYWE3NzQwLCB0aGUgc28tY2FsbGVkICdzb3VuZCBhcmVuYSBtb2R1bGUnLiAKKyAgIHRoZXJlIGFyZSBubyBzcGVjcyBhdmFpbGFibGUsIHNvIHdlIHNpbXBseSB1c2Ugc29tZSBpbml0IHZhbHVlcyAqLworc3RhdGljIHN0cnVjdCB7CisJaW50CWxlbmd0aDsKKwljaGFyCWRhdGFbOV07Cit9IG14Yl9zYWE3NzQwX2luaXRbXSA9IHsKKwl7IDMsIHsgMHg4MCwgMHgwMCwgMHgwMCB9IH0seyAzLCB7IDB4ODAsIDB4ODksIDB4MDAgfSB9LAorCXsgMywgeyAweDgwLCAweGIwLCAweDBhIH0gfSx7IDMsIHsgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJeyAzLCB7IDB4NDksIDB4MDAsIDB4MDAgfSB9LHsgMywgeyAweDRhLCAweDAwLCAweDAwIH0gfSwKKwl7IDMsIHsgMHg0YiwgMHgwMCwgMHgwMCB9IH0seyAzLCB7IDB4NGMsIDB4MDAsIDB4MDAgfSB9LAorCXsgMywgeyAweDRkLCAweDAwLCAweDAwIH0gfSx7IDMsIHsgMHg0ZSwgMHgwMCwgMHgwMCB9IH0sCisJeyAzLCB7IDB4NGYsIDB4MDAsIDB4MDAgfSB9LHsgMywgeyAweDUwLCAweDAwLCAweDAwIH0gfSwKKwl7IDMsIHsgMHg1MSwgMHgwMCwgMHgwMCB9IH0seyAzLCB7IDB4NTIsIDB4MDAsIDB4MDAgfSB9LAorCXsgMywgeyAweDUzLCAweDAwLCAweDAwIH0gfSx7IDMsIHsgMHg1NCwgMHgwMCwgMHgwMCB9IH0sCisJeyAzLCB7IDB4NTUsIDB4MDAsIDB4MDAgfSB9LHsgMywgeyAweDU2LCAweDAwLCAweDAwIH0gfSwKKwl7IDMsIHsgMHg1NywgMHgwMCwgMHgwMCB9IH0seyAzLCB7IDB4NTgsIDB4MDAsIDB4MDAgfSB9LAorCXsgMywgeyAweDU5LCAweDAwLCAweDAwIH0gfSx7IDMsIHsgMHg1YSwgMHgwMCwgMHgwMCB9IH0sCisJeyAzLCB7IDB4NWIsIDB4MDAsIDB4MDAgfSB9LHsgMywgeyAweDVjLCAweDAwLCAweDAwIH0gfSwKKwl7IDMsIHsgMHg1ZCwgMHgwMCwgMHgwMCB9IH0seyAzLCB7IDB4NWUsIDB4MDAsIDB4MDAgfSB9LAorCXsgMywgeyAweDVmLCAweDAwLCAweDAwIH0gfSx7IDMsIHsgMHg2MCwgMHgwMCwgMHgwMCB9IH0sCisJeyAzLCB7IDB4NjEsIDB4MDAsIDB4MDAgfSB9LHsgMywgeyAweDYyLCAweDAwLCAweDAwIH0gfSwKKwl7IDMsIHsgMHg2MywgMHgwMCwgMHgwMCB9IH0seyAzLCB7IDB4NjQsIDB4MDAsIDB4MDAgfSB9LAorCXsgMywgeyAweDY1LCAweDAwLCAweDAwIH0gfSx7IDMsIHsgMHg2NiwgMHgwMCwgMHgwMCB9IH0sCisJeyAzLCB7IDB4NjcsIDB4MDAsIDB4MDAgfSB9LHsgMywgeyAweDY4LCAweDAwLCAweDAwIH0gfSwKKwl7IDMsIHsgMHg2OSwgMHgwMCwgMHgwMCB9IH0seyAzLCB7IDB4NmEsIDB4MDAsIDB4MDAgfSB9LAorCXsgMywgeyAweDZiLCAweDAwLCAweDAwIH0gfSx7IDMsIHsgMHg2YywgMHgwMCwgMHgwMCB9IH0sCisJeyAzLCB7IDB4NmQsIDB4MDAsIDB4MDAgfSB9LHsgMywgeyAweDZlLCAweDAwLCAweDAwIH0gfSwKKwl7IDMsIHsgMHg2ZiwgMHgwMCwgMHgwMCB9IH0seyAzLCB7IDB4NzAsIDB4MDAsIDB4MDAgfSB9LAorCXsgMywgeyAweDcxLCAweDAwLCAweDAwIH0gfSx7IDMsIHsgMHg3MiwgMHgwMCwgMHgwMCB9IH0sCisJeyAzLCB7IDB4NzMsIDB4MDAsIDB4MDAgfSB9LHsgMywgeyAweDc0LCAweDAwLCAweDAwIH0gfSwKKwl7IDMsIHsgMHg3NSwgMHgwMCwgMHgwMCB9IH0seyAzLCB7IDB4NzYsIDB4MDAsIDB4MDAgfSB9LAorCXsgMywgeyAweDc3LCAweDAwLCAweDAwIH0gfSx7IDMsIHsgMHg0MSwgMHgwMCwgMHg0MiB9IH0sCisJeyAzLCB7IDB4NDIsIDB4MTAsIDB4NDIgfSB9LHsgMywgeyAweDQzLCAweDIwLCAweDQyIH0gfSwKKwl7IDMsIHsgMHg0NCwgMHgzMCwgMHg0MiB9IH0seyAzLCB7IDB4NDUsIDB4MDAsIDB4MDEgfSB9LAorCXsgMywgeyAweDQ2LCAweDAwLCAweDAxIH0gfSx7IDMsIHsgMHg0NywgMHgwMCwgMHgwMSB9IH0sCisJeyAzLCB7IDB4NDgsIDB4MDAsIDB4MDEgfSB9LAorCXsgOSwgeyAweDAxLCAweDAzLCAweGM1LCAweDVjLCAweDdhLCAweDg1LCAweDAxLCAweDAwLCAweDU0IH0gfSwKKwl7IDksIHsgMHgyMSwgMHgwMywgMHhjNSwgMHg1YywgMHg3YSwgMHg4NSwgMHgwMSwgMHgwMCwgMHg1NCB9IH0sCisJeyA5LCB7IDB4MDksIDB4MGIsIDB4YjQsIDB4NmIsIDB4NzQsIDB4ODUsIDB4OTUsIDB4MDAsIDB4MzQgfSB9LAorCXsgOSwgeyAweDI5LCAweDBiLCAweGI0LCAweDZiLCAweDc0LCAweDg1LCAweDk1LCAweDAwLCAweDM0IH0gfSwKKwl7IDksIHsgMHgxMSwgMHgxNywgMHg0MywgMHg2MiwgMHg2OCwgMHg4OSwgMHhkMSwgMHhmZiwgMHhiMCB9IH0sCisJeyA5LCB7IDB4MzEsIDB4MTcsIDB4NDMsIDB4NjIsIDB4NjgsIDB4ODksIDB4ZDEsIDB4ZmYsIDB4YjAgfSB9LAorCXsgOSwgeyAweDE5LCAweDIwLCAweDYyLCAweDUxLCAweDVhLCAweDk1LCAweDE5LCAweDAxLCAweDUwIH0gfSwKKwl7IDksIHsgMHgzOSwgMHgyMCwgMHg2MiwgMHg1MSwgMHg1YSwgMHg5NSwgMHgxOSwgMHgwMSwgMHg1MCB9IH0sCisJeyA5LCB7IDB4MDUsIDB4M2UsIDB4ZDIsIDB4NjksIDB4NGUsIDB4OWEsIDB4NTEsIDB4MDAsIDB4ZjAgfSB9LAorCXsgOSwgeyAweDI1LCAweDNlLCAweGQyLCAweDY5LCAweDRlLCAweDlhLCAweDUxLCAweDAwLCAweGYwIH0gfSwKKwl7IDksIHsgMHgwZCwgMHgzZCwgMHhhMSwgMHg0MCwgMHg3ZCwgMHg5ZiwgMHgyOSwgMHhmZSwgMHgxNCB9IH0sCisJeyA5LCB7IDB4MmQsIDB4M2QsIDB4YTEsIDB4NDAsIDB4N2QsIDB4OWYsIDB4MjksIDB4ZmUsIDB4MTQgfSB9LAorCXsgOSwgeyAweDE1LCAweDczLCAweGExLCAweDUwLCAweDVkLCAweGE2LCAweGY1LCAweGZlLCAweDM4IH0gfSwKKwl7IDksIHsgMHgzNSwgMHg3MywgMHhhMSwgMHg1MCwgMHg1ZCwgMHhhNiwgMHhmNSwgMHhmZSwgMHgzOCB9IH0sCisJeyA5LCB7IDB4MWQsIDB4ZWQsIDB4ZDAsIDB4NjgsIDB4MjksIDB4YjQsIDB4ZTEsIDB4MDAsIDB4YjggfSB9LAorCXsgOSwgeyAweDNkLCAweGVkLCAweGQwLCAweDY4LCAweDI5LCAweGI0LCAweGUxLCAweDAwLCAweGI4IH0gfSwKKwl7IDMsIHsgMHg4MCwgMHhiMywgMHgwYSB9IH0sCisJey0xLCB7IDB9IH0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG14Yl9zYWE3MTExX2luaXRbXSA9IHsKKwkweDAwLCAweDAwLAkgIC8qIDAwIC0gSUQgYnl0ZSAqLworCTB4MDEsIDB4MDAsCSAgLyogMDEgLSByZXNlcnZlZCAqLworCisJLypmcm9udCBlbmQgKi8KKwkweDAyLCAweGQ4LAkgIC8qIDAyIC0gRlVTRT14LCBHVURMPXgsIE1PREU9eCAqLworCTB4MDMsIDB4MjMsCSAgLyogMDMgLSBITE5SUz0wLCBWQlNMPTEsIFdQT0ZGPTAsIEhPTERHPTAsIEdBRklYPTAsIEdBSTE9MjU2LCBHQUkyPTI1NiAqLworCTB4MDQsIDB4MDAsCSAgLyogMDQgLSBHQUkxPTI1NiAqLworCTB4MDUsIDB4MDAsCSAgLyogMDUgLSBHQUkyPTI1NiAqLworCisJLyogZGVjb2RlciAqLworCTB4MDYsIDB4ZjAsCSAgLyogMDYgLSBIU0IgYXQgIHh4KDUwSHopIC8gIHh4KDYwSHopIHBpeGVscyBhZnRlciBlbmQgb2YgbGFzdCBsaW5lICovCisJMHgwNywgMHgzMCwJICAvKiAwNyAtIEhTUyBhdCAgeHgoNTBIeikgLyAgeHgoNjBIeikgcGl4ZWxzIGFmdGVyIGVuZCBvZiBsYXN0IGxpbmUgKi8KKwkweDA4LCAweGE4LAkgIC8qIDA4IC0gQVVGRD14LCBGU0VMPXgsIEVYRklMPXgsIFZUUkM9eCwgSFBMTD14LCBWTk9JPXggKi8KKwkweDA5LCAweDAyLAkgIC8qIDA5IC0gQllQUz14LCBQUkVGPXgsIEJQU1M9eCwgVkJMQj14LCBVUFRDVj14LCBBUEVSPXggKi8KKwkweDBhLCAweDgwLAkgIC8qIDBhIC0gQlJJRz0xMjggKi8KKwkweDBiLCAweDQ3LAkgIC8qIDBiIC0gQ09OVD0xLjEwOSAqLworCTB4MGMsIDB4NDAsCSAgLyogMGMgLSBTQVROPTEuMCAqLworCTB4MGQsIDB4MDAsCSAgLyogMGQgLSBIVUU9MCAqLworCTB4MGUsIDB4MDEsCSAgLyogMGUgLSBDRFRPPTAsIENTVEQ9MCwgRENDRj0wLCBGQ1RDPTAsIENIQlc9MSAqLworCTB4MGYsIDB4MDAsCSAgLyogMGYgLSByZXNlcnZlZCAqLworCTB4MTAsIDB4ZDAsCSAgLyogMTAgLSBPRlRTPXgsIEhERUw9eCwgVlJMTj14LCBZREVMPXggKi8KKwkweDExLCAweDhjLAkgIC8qIDExIC0gR1BTVz14LCBDTTk5PXgsIEZFQ089eCwgQ09NUE89eCwgT0VZQz0xLCBPRUhWPTEsIFZJUEI9MCwgQ09MTz0wICovCisJMHgxMiwgMHg4MCwJICAvKiAxMiAtIHh4IG91dHB1dCBjb250cm9sIDIgKi8KKwkweDEzLCAweDMwLAkgIC8qIDEzIC0geHggb3V0cHV0IGNvbnRyb2wgMyAqLworCTB4MTQsIDB4MDAsCSAgLyogMTQgLSByZXNlcnZlZCAqLworCTB4MTUsIDB4MTUsCSAgLyogMTUgLSBWQkkgKi8KKwkweDE2LCAweDA0LAkgIC8qIDE2IC0gVkJJICovCisJMHgxNywgMHgwMCwJICAvKiAxNyAtIFZCSSAqLworfTsKKworLyogYnJpbmcgaGFyZHdhcmUgdG8gYSBzYW5lIHN0YXRlLiB0aGlzIGhhcyB0byBiZSBkb25lLCBqdXN0IGluIGNhc2Ugc29tZW9uZQorICAgd2FudHMgdG8gY2FwdHVyZSBmcm9tIHRoaXMgZGV2aWNlIGJlZm9yZSBpdCBoYXMgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZC4KKyAgIHRoZSBjYXB0dXJlIGVuZ2luZSB3b3VsZCBiYWRseSBmYWlsLCBiZWNhdXNlIG5vIHZhbGlkIHNpZ25hbCBhcnJpdmVzIG9uIHRoZQorICAgc2FhNzE0NiwgdGh1cyBsZWFkaW5nIHRvIHRpbWVvdXRzIGFuZCBzdHVmZi4gKi8KK3N0YXRpYyBpbnQgbXhiX2luaXRfZG9uZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYqIGRldikKK3sKKwlzdHJ1Y3QgbXhiKiBteGIgPSAoc3RydWN0IG14YiopZGV2LT5leHRfcHJpdjsKKwlzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9pbml0IGluaXQ7CisJc3RydWN0IGkyY19tc2cgbXNnOworCisJaW50IGkgPSAwLCBlcnIgPSAwOworCXN0cnVjdAl0ZWE2NDE1Y19tdWx0aXBsZXggdm07CQorCisJLyogc2VsZWN0IHZpZGVvIG1vZGUgaW4gc2FhNzExMWEgKi8KKwlpID0gVklERU9fTU9ERV9QQUw7CisJLyogZml4bWU6IGN1cnJlbnRseSBwb2ludGxlc3M6IGdldHMgb3ZlcndyaXR0ZW4gYnkgY29uZmlndXJhdGlvbiBiZWxvdyAqLworCW14Yi0+c2FhNzExMWEtPmRyaXZlci0+Y29tbWFuZChteGItPnNhYTcxMTFhLERFQ09ERVJfU0VUX05PUk0sICZpKTsKKworCS8qIHdyaXRlIGNvbmZpZ3VyYXRpb24gdG8gc2FhNzExMWEgKi8KKwlpbml0LmRhdGEgPSBteGJfc2FhNzExMV9pbml0OworCWluaXQubGVuID0gc2l6ZW9mKG14Yl9zYWE3MTExX2luaXQpOworCW14Yi0+c2FhNzExMWEtPmRyaXZlci0+Y29tbWFuZChteGItPnNhYTcxMTFhLERFQ09ERVJfSU5JVCwgJmluaXQpOworCisJLyogc2VsZWN0IHR1bmVyLW91dHB1dCBvbiBzYWE3MTExYSAqLworCWkgPSAwOworCW14Yi0+c2FhNzExMWEtPmRyaXZlci0+Y29tbWFuZChteGItPnNhYTcxMTFhLERFQ09ERVJfU0VUX0lOUFVULCAmaSk7CisKKwkvKiBlbmFibGUgdmJpIGJ5cGFzcyAqLworCWkgPSAxOworCW14Yi0+c2FhNzExMWEtPmRyaXZlci0+Y29tbWFuZChteGItPnNhYTcxMTFhLERFQ09ERVJfU0VUX1ZCSV9CWVBBU1MsICZpKTsKKworCS8qIHNlbGVjdCBhIHR1bmVyIHR5cGUgKi8KKwlpID0gNTsgCisJbXhiLT50dW5lci0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dHVuZXIsVFVORVJfU0VUX1RZUEUsICZpKTsKKwkKKwkvKiBtdXRlIGF1ZGlvIG9uIHRlYTY0MjBzICovCisJbXhiLT50ZWE2NDIwXzEtPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMSxURUE2NDIwX1NXSVRDSCwgJlRFQTY0MjBfbGluZVs2XVswXSk7CisJbXhiLT50ZWE2NDIwXzItPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMixURUE2NDIwX1NXSVRDSCwgJlRFQTY0MjBfbGluZVs2XVsxXSk7CisJbXhiLT50ZWE2NDIwXzEtPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMSxURUE2NDIwX1NXSVRDSCwgJlRFQTY0MjBfY2RbNl1bMF0pOworCW14Yi0+dGVhNjQyMF8yLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzIsVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2NkWzZdWzFdKTsKKworCS8qIHN3aXRjaCB0byB0dW5lci1jaGFubmVsIG9uIHRlYTY0MTVjKi8KKwl2bS5vdXQgPSAxNzsKKwl2bS5pbiAgPSAzOworCW14Yi0+dGVhNjQxNWMtPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MTVjLFRFQTY0MTVDX1NXSVRDSCwgJnZtKTsKKworCS8qIHNlbGVjdCB0dW5lci1vdXRwdXQgb24gbXVsdGljYWJsZSBvbiB0ZWE2NDE1YyovCisJdm0uaW4gID0gMzsKKwl2bS5vdXQgPSAxMzsKKwlteGItPnRlYTY0MTVjLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDE1YyxURUE2NDE1Q19TV0lUQ0gsICZ2bSk7CisJCQkJCisJLyogdHVuZSBpbiBzb21lIGZyZXF1ZW5jeSBvbiB0dW5lciAqLworCW14Yi0+dHVuZXItPmRyaXZlci0+Y29tbWFuZChteGItPnR1bmVyLCBWSURJT0NTRlJFUSwgJmZyZXEpOworCisJLyogdGhlIHJlc3QgZm9yIG14YiAqLworCW14Yi0+Y3VyX2lucHV0ID0gMDsKKwlteGItPmN1cl9mcmVxID0gZnJlcTsKKwlteGItPmN1cl9tdXRlID0gMTsKKworCW14Yi0+Y3VyX21vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCW14Yi0+dGRhOTg0MC0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGRhOTg0MCwgVERBOTg0MF9TV0lUQ0gsICZteGItPmN1cl9tb2RlKTsKKwkJCQorCS8qIGNoZWNrIGlmIHRoZSBzYWE3NzQwIChha2EgJ3NvdW5kIGFyZW5hIG1vZHVsZScpIGlzIHByZXNlbnQKKwkgICBvbiB0aGUgbXhiLiBpZiBzbywgd2UgbXVzdCBpbml0aWFsaXplIGl0LiBkdWUgdG8gbGFjayBvZiAKKwkgICBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlIHNhYTc3NDAsIHRoZSB2YWx1ZXMgd2VyZSByZXZlcnNlCisJICAgZW5naW5lZXJlZC4gKi8KKwltc2cuYWRkciA9IDB4MWI7CisJbXNnLmZsYWdzID0gMDsKKwltc2cubGVuID0gbXhiX3NhYTc3NDBfaW5pdFswXS5sZW5ndGg7CisJbXNnLmJ1ZiA9ICZteGJfc2FhNzc0MF9pbml0WzBdLmRhdGFbMF07CisKKwlpZiggMSA9PSAoZXJyID0gaTJjX3RyYW5zZmVyKCZteGItPmkyY19hZGFwdGVyLCAmbXNnLCAxKSkpIHsKKwkJLyogdGhlIHNvdW5kIGFyZW5hIG1vZHVsZSBpcyBhIHBvcywgdGhhdCdzIHByb2JhYmx5IHRoZSByZWFzb24KKwkJICAgcGhpbGlwcyByZWZ1c2VzIHRvIGhhbmQgb3V0IGEgZGF0YXNoZWV0IGZvciB0aGUgc2FhNzc0MC4uLgorCQkgICBpdCBzZWVtcyB0byBzY3JldyB1cCB0aGUgaTJjIGJ1cywgc28gd2UgZGlzYWJsZSBmYXN0IGlycQorCQkgICBiYXNlZCBpMmMgdHJhbnNhY3Rpb25zIGhlcmUgYW5kIHJlbHkgb24gdGhlIHNsb3cgYW5kIHNhZmUKKwkJICAgcG9sbGluZyBtZXRob2QgLi4uICovCisJCWV4dGVuc2lvbi5mbGFncyAmPSB+U0FBNzE0Nl9VU0VfSTJDX0lSUTsKKwkJZm9yKGkgPSAxOztpKyspIHsKKwkJCWlmKCAtMSA9PSBteGJfc2FhNzc0MF9pbml0W2ldLmxlbmd0aCApIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbXNnLmxlbiA9IG14Yl9zYWE3NzQwX2luaXRbaV0ubGVuZ3RoOwkJCisJCQltc2cuYnVmID0gJm14Yl9zYWE3NzQwX2luaXRbaV0uZGF0YVswXTsKKwkJCWlmKCAxICE9IChlcnIgPSBpMmNfdHJhbnNmZXIoJm14Yi0+aTJjX2FkYXB0ZXIsICZtc2csIDEpKSkgeworCQkJCURFQl9EKCgiZmFpbGVkIHRvIGluaXRpYWxpemUgJ3NvdW5kIGFyZW5hIG1vZHVsZScuXG4iKSk7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwkJSU5GTygoIidzb3VuZCBhcmVuYSBtb2R1bGUnIGRldGVjdGVkLlxuIikpOworCX0KK2VycjoJCisJLyogdGhlIHJlc3QgZm9yIHNhYTcxNDY6IHlvdSBzaG91bGQgZGVmaW5pdGVseSBzZXQgc29tZSBiYXNpYyB2YWx1ZXMKKwkgICBmb3IgdGhlIGlucHV0LXBvcnQgaGFuZGxpbmcgb2YgdGhlIHNhYTcxNDYuICovCisKKwkvKiBleHQtPnNhYSBoYXMgYmVlbiBmaWxsZWQgYnkgdGhlIGNvcmUgZHJpdmVyICovCisJICAgCisJLyogc29tZSBzdHVmZiBpcyBkb25lIHZpYSB2YXJpYWJsZXMgKi8KKwlzYWE3MTQ2X3NldF9ocHNfc291cmNlX2FuZF9zeW5jKGRldiwgaW5wdXRfcG9ydF9zZWxlY3Rpb25bbXhiLT5jdXJfaW5wdXRdLmhwc19zb3VyY2UsIGlucHV0X3BvcnRfc2VsZWN0aW9uW214Yi0+Y3VyX2lucHV0XS5ocHNfc3luYyk7CisKKwkvKiBzb21lIHN0dWZmIGlzIGRvbmUgdmlhIGRpcmVjdCB3cml0ZSB0byB0aGUgcmVnaXN0ZXJzICovCisKKwkvKiB0aGlzIGlzIHVnbHksIGJ1dCBiZWNhdXNlIG9mIHRoZSBmYWN0IHRoYXQgdGhpcyBpcyBjb21wbGV0ZWx5CisJICAgaGFyZHdhcmUgZGVwZW5kZW5kLCBpdCBzaG91bGQgYmUgZG9uZSBkaXJlY3RseS4uLiAqLworICAgICAgCXNhYTcxNDZfd3JpdGUoZGV2LCBERDFfU1RSRUFNX0IsCTB4MDAwMDAwMDApOworCXNhYTcxNDZfd3JpdGUoZGV2LCBERDFfSU5JVCwJCTB4MDIwMDAyMDApOworCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIChNQVNLXzA5IHwgTUFTS18yNSB8IE1BU0tfMTAgfCBNQVNLXzI2KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogaW50ZXJydXB0LWhhbmRsZXIuIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBpcnFfbWFzayBpcyAhPSAwLgorICAgaXQgbXVzdCBjbGVhciB0aGUgaW50ZXJydXB0LWJpdHMgaW4gaXJxX21hc2sgaXQgaGFzIGhhbmRsZWQgKi8KKy8qCit2b2lkIG14Yl9pcnFfYmgoc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYsIHUzMiogaXJxX21hc2spCit7CisJc3RydWN0IG14YiogbXhiID0gKHN0cnVjdCBteGIqKWRldi0+ZXh0X3ByaXY7Cit9CisqLworCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0X3Z2IHZ2X2RhdGE7CisKKy8qIHRoaXMgZnVuY3Rpb24gb25seSBnZXRzIGNhbGxlZCB3aGVuIHRoZSBwcm9iaW5nIHdhcyBzdWNjZXNzZnVsICovCitzdGF0aWMgaW50IG14Yl9hdHRhY2goc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYsIHN0cnVjdCBzYWE3MTQ2X3BjaV9leHRlbnNpb25fZGF0YSAqaW5mbykKK3sKKwlzdHJ1Y3QgbXhiKiBteGIgPSAoc3RydWN0IG14YiopZGV2LT5leHRfcHJpdjsKKwkKKwlERUJfRUUoKCJkZXY6JXBcbiIsZGV2KSk7CisKKwkvKiBjaGVja2luZyBmb3IgaTJjLWRldmljZXMgY2FuIGJlIG9taXR0ZWQgaGVyZSwgYmVjYXVzZSB3ZQorCSAgIGFscmVhZHkgZGlkIHRoaXMgaW4gIm14Yl92bDQyX3Byb2JlIiAqLworCisJc2FhNzE0Nl92dl9pbml0KGRldiwmdnZfZGF0YSk7CisJaWYoIDAgIT0gc2FhNzE0Nl9yZWdpc3Rlcl9kZXZpY2UoJm14Yi0+dmlkZW9fZGV2LCBkZXYsICJteGIiLCBWRkxfVFlQRV9HUkFCQkVSKSkgeworCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgY2FwdHVyZSB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCXJldHVybiAtMTsKKwl9CisJCisJLyogaW5pdGlhbGl6YXRpb24gc3R1ZmYgKHZiaSkgKG9ubHkgZm9yIHJldmlzaW9uID4gMCBhbmQgZm9yIGV4dGVuc2lvbnMgd2hpY2ggd2FudCBpdCkqLworCWlmKCAwICE9IE1YQl9CT0FSRF9DQU5fRE9fVkJJKGRldikpIHsKKwkJaWYoIDAgIT0gc2FhNzE0Nl9yZWdpc3Rlcl9kZXZpY2UoJm14Yi0+dmJpX2RldiwgZGV2LCAibXhiIiwgVkZMX1RZUEVfVkJJKSkgeworCQkJRVJSKCgiY2Fubm90IHJlZ2lzdGVyIHZiaSB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCX0KKwl9CisKKwlpMmNfdXNlX2NsaWVudChteGItPnRlYTY0MjBfMSk7CisJaTJjX3VzZV9jbGllbnQobXhiLT50ZWE2NDIwXzIpOworCWkyY191c2VfY2xpZW50KG14Yi0+dGVhNjQxNWMpOworCWkyY191c2VfY2xpZW50KG14Yi0+dGRhOTg0MCk7CisJaTJjX3VzZV9jbGllbnQobXhiLT5zYWE3MTExYSk7CisJaTJjX3VzZV9jbGllbnQobXhiLT50dW5lcik7CisKKwlwcmludGsoIm14YjogZm91bmQgJ011bHRpbWVkaWEgZVh0ZW5zaW9uIEJvYXJkJy0lZC5cbiIsbXhiX251bSk7CisKKwlteGJfbnVtKys7CisJbXhiX2luaXRfZG9uZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14Yl9kZXRhY2goc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYpCit7CisJc3RydWN0IG14YiogbXhiID0gKHN0cnVjdCBteGIqKWRldi0+ZXh0X3ByaXY7CisKKwlERUJfRUUoKCJkZXY6JXBcbiIsZGV2KSk7CisKKwlpMmNfcmVsZWFzZV9jbGllbnQobXhiLT50ZWE2NDIwXzEpOworCWkyY19yZWxlYXNlX2NsaWVudChteGItPnRlYTY0MjBfMik7CisJaTJjX3JlbGVhc2VfY2xpZW50KG14Yi0+dGVhNjQxNWMpOworCWkyY19yZWxlYXNlX2NsaWVudChteGItPnRkYTk4NDApOworCWkyY19yZWxlYXNlX2NsaWVudChteGItPnNhYTcxMTFhKTsKKwlpMmNfcmVsZWFzZV9jbGllbnQobXhiLT50dW5lcik7CisKKwlzYWE3MTQ2X3VucmVnaXN0ZXJfZGV2aWNlKCZteGItPnZpZGVvX2RldixkZXYpOworCWlmKCAwICE9IE1YQl9CT0FSRF9DQU5fRE9fVkJJKGRldikpIHsKKwkJc2FhNzE0Nl91bnJlZ2lzdGVyX2RldmljZSgmbXhiLT52YmlfZGV2LGRldik7CisJfQorCXNhYTcxNDZfdnZfcmVsZWFzZShkZXYpOworCisJbXhiX251bS0tOworCisJaTJjX2RlbF9hZGFwdGVyKCZteGItPmkyY19hZGFwdGVyKTsKKwlrZnJlZShteGIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhiX2lvY3RsKHN0cnVjdCBzYWE3MTQ2X2ZoICpmaCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKSAKK3sKKwlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IG14YiogbXhiID0gKHN0cnVjdCBteGIqKWRldi0+ZXh0X3ByaXY7CisJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOyAKKwkKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgorCXsKKwkJc3RydWN0IHY0bDJfaW5wdXQgKmkgPSBhcmc7CisJCQorCQlERUJfRUUoKCJWSURJT0NfRU5VTUlOUFVUICVkLlxuIixpLT5pbmRleCkpOworCQlpZiggaS0+aW5kZXggPCAwIHx8IGktPmluZGV4ID49IE1YQl9JTlBVVFMpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1lbWNweShpLCAmbXhiX2lucHV0c1tpLT5pbmRleF0sIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpOworCisJCXJldHVybiAwOworCX0KKwkvKiB0aGUgc2FhNzE0NiBwcm92aWRlcyBzb21lIGNvbnRyb2xzIChicmlnaHRuZXNzLCBjb250cmFzdCwgc2F0dXJhdGlvbikKKwkgICB3aGljaCBnZXRzIHJlZ2lzdGVyZWQgKmFmdGVyKiB0aGlzIGZ1bmN0aW9uLiBiZWNhdXNlIG9mIHRoaXMgd2UgaGF2ZQorCSAgIHRvIHJldHVybiB3aXRoIGEgdmFsdWUgIT0gMCBldmVuIGlmIHRoZSBmdW5jdGlvbiBzdWNjZWRlZC4uICovCisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyA9IGFyZzsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gTUFYQ09OVFJPTFMgLSAxOyBpID49IDA7IGktLSkgeworCQkJaWYgKG14Yl9jb250cm9sc1tpXS5pZCA9PSBxYy0+aWQpIHsKKwkJCQkqcWMgPSBteGJfY29udHJvbHNbaV07CisJCQkJREVCX0QoKCJWSURJT0NfUVVFUllDVFJMICVkLlxuIixxYy0+aWQpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJY2FzZSBWSURJT0NfR19DVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqdmMgPSBhcmc7CisJCWludCBpOworCisJCWZvciAoaSA9IE1BWENPTlRST0xTIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmIChteGJfY29udHJvbHNbaV0uaWQgPT0gdmMtPmlkKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJCisJCWlmKCBpIDwgMCApIHsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCQkKKwkJc3dpdGNoICh2Yy0+aWQgKSB7CisJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IHsKKwkJCQl2Yy0+dmFsdWUgPSBteGItPmN1cl9tdXRlOworCQkJCURFQl9EKCgiVklESU9DX0dfQ1RSTCBWNEwyX0NJRF9BVURJT19NVVRFOiVkLlxuIix2Yy0+dmFsdWUpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQkKKwkJREVCX0VFKCgiVklESU9DX0dfQ1RSTCBWNEwyX0NJRF9BVURJT19NVVRFOiVkLlxuIix2Yy0+dmFsdWUpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfU19DVFJMOgorCXsKKwkJc3RydWN0CXY0bDJfY29udHJvbAkqdmMgPSBhcmc7CisJCWludCBpID0gMDsKKwkJCisJCWZvciAoaSA9IE1BWENPTlRST0xTIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmIChteGJfY29udHJvbHNbaV0uaWQgPT0gdmMtPmlkKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJCisJCWlmKCBpIDwgMCApIHsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCQorCQlzd2l0Y2ggKHZjLT5pZCApIHsKKwkJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURTogeworCQkJCW14Yi0+Y3VyX211dGUgPSB2Yy0+dmFsdWU7CisJCQkJaWYoIDAgPT0gdmMtPnZhbHVlICkgeworCQkJCQkvKiBzd2l0Y2ggdGhlIGF1ZGlvLXNvdXJjZSAqLworCQkJCQlteGItPnRlYTY0MjBfMS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8xLFRFQTY0MjBfU1dJVENILCAmVEVBNjQyMF9saW5lW3ZpZGVvX2F1ZGlvX2Nvbm5lY3RbbXhiLT5jdXJfaW5wdXRdXVswXSk7CisJCQkJCW14Yi0+dGVhNjQyMF8yLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzIsVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2xpbmVbdmlkZW9fYXVkaW9fY29ubmVjdFtteGItPmN1cl9pbnB1dF1dWzFdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlteGItPnRlYTY0MjBfMS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8xLFRFQTY0MjBfU1dJVENILCAmVEVBNjQyMF9saW5lWzZdWzBdKTsKKwkJCQkJbXhiLT50ZWE2NDIwXzItPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMixURUE2NDIwX1NXSVRDSCwgJlRFQTY0MjBfbGluZVs2XVsxXSk7CisJCQkJfQorCQkJCURFQl9FRSgoIlZJRElPQ19TX0NUUkwsIFY0TDJfQ0lEX0FVRElPX01VVEU6ICVkLlxuIix2Yy0+dmFsdWUpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19JTlBVVDoKKwl7CisJCWludCAqaW5wdXQgPSAoaW50ICopYXJnOworCQkqaW5wdXQgPSBteGItPmN1cl9pbnB1dDsKKworCQlERUJfRUUoKCJWSURJT0NfR19JTlBVVCAlZC5cbiIsKmlucHV0KSk7CisJCXJldHVybiAwOwkJCisJfQkKKwljYXNlIFZJRElPQ19TX0lOUFVUOgorCXsKKwkJaW50IGlucHV0ID0gKihpbnQgKilhcmc7CisJCXN0cnVjdAl0ZWE2NDE1Y19tdWx0aXBsZXggdm07CQorCQlpbnQgaSA9IDA7CisKKwkJREVCX0VFKCgiVklESU9DX1NfSU5QVVQgJWQuXG4iLGlucHV0KSk7CisKKwkJaWYgKGlucHV0IDwgMCB8fCBpbnB1dCA+PSBNWEJfSU5QVVRTKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkKKwkJLyogZml4bWU6IGxvY2tlIGRhcyBzZXR6ZW4gZGVzIGlucHV0cyBtaXQgaGlsZmUgZGVzIG11dGV4ZXMKKwkJZG93bigmZGV2LT5sb2NrKTsKKwkJdmlkZW9fbXV4KGRldiwqaSk7CisJCXVwKCZkZXYtPmxvY2spOworCQkqLworCQkJCQorCQkvKiBmaXhtZTogY2hlY2sgaWYgc3RyZWFtaW5nIGNhcHR1cmUKKwkJaWYgKCAwICE9IGRldi0+c3RyZWFtaW5nICkgeworCQkJREVCX0QoKCJWSURJT0NfU19JTlBVVCBpbGxlZ2FsIHdoaWxlIHN0cmVhbWluZy5cbiIpKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJKi8KKwkJCisJCW14Yi0+Y3VyX2lucHV0ID0gaW5wdXQ7CisJCisJCXNhYTcxNDZfc2V0X2hwc19zb3VyY2VfYW5kX3N5bmMoZGV2LCBpbnB1dF9wb3J0X3NlbGVjdGlvbltpbnB1dF0uaHBzX3NvdXJjZSwgaW5wdXRfcG9ydF9zZWxlY3Rpb25baW5wdXRdLmhwc19zeW5jKTsKKwkJCisJCS8qIHByZXBhcmUgc3dpdGNoaW5nIG9mIHRlYTY0MTVjIGFuZCBzYWE3MTExYTsKKwkJICAgaGF2ZSBhIGxvb2sgYXQgdGhlICdiYWNrZ3JvdW5kJy1maWxlIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9ucyAgKi8KKwkJc3dpdGNoKCBpbnB1dCApIHsKKwkJCQorCQkJY2FzZSBUVU5FUjoKKwkJCXsKKwkJCQlpID0gMDsKKwkJCQl2bS5pbiAgPSAzOworCQkJCXZtLm91dCA9IDE3OworCQkJCQkJCQkKKwkJCWlmICggMCAhPSBteGItPnRlYTY0MTVjLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDE1YyxURUE2NDE1Q19TV0lUQ0gsICZ2bSkpIHsKKwkJCQkJcHJpbnRrKCJWSURJT0NfU19JTlBVVDogY291bGQgbm90IGFkZHJlc3MgdGVhNjQxNWMgIzFcbiIpOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJLyogY29ubmVjdCB0dW5lci1vdXRwdXQgYWx3YXlzIHRvIG11bHRpY2FibGUgKi8KKwkJCQl2bS5pbiAgPSAzOworCQkJCXZtLm91dCA9IDEzOworCQkJCWJyZWFrOwkJCQkKKwkJCX0KKwkJCWNhc2UgQVVYM19ZQzoKKwkJCXsKKwkJCQkvKiBub3RoaW5nIHRvIGJlIGRvbmUgaGVyZS4gYXV4M195YyBpcworCQkJCSAgIGRpcmVjdGx5IGNvbm5lY3RlZCB0byB0aGUgc2FhNzExYSAqLworCQkJCWkgPSA1OworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBBVVgzOgorCQkJeworCQkJCS8qIG5vdGhpbmcgdG8gYmUgZG9uZSBoZXJlLiBhdXgzIGlzCisJCQkJICAgZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoZSBzYWE3MTFhICovCisJCQkJaSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFVWDE6CisJCQl7CisJCQkJaSA9IDA7CisJCQkJdm0uaW4gID0gMTsKKwkJCQl2bS5vdXQgPSAxNzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIHN3aXRjaCB2aWRlbyBpbiB0ZWE2NDE1YyBvbmx5IGlmIG5lY2Vzc2FyeSAqLworCQlzd2l0Y2goIGlucHV0ICkgeworCQkJY2FzZSBUVU5FUjoKKwkJCWNhc2UgQVVYMToKKwkJCXsKKwkJCQlpZiAoIDAgIT0gbXhiLT50ZWE2NDE1Yy0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQxNWMsVEVBNjQxNUNfU1dJVENILCAmdm0pKSB7CisJCQkJCXByaW50aygiVklESU9DX1NfSU5QVVQ6IGNvdWxkIG5vdCBhZGRyZXNzIHRlYTY0MTVjICMzXG4iKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkJCQorCQkvKiBzd2l0Y2ggdmlkZW8gaW4gc2FhNzExMWEgKi8KKwkJaWYgKCAwICE9IG14Yi0+c2FhNzExMWEtPmRyaXZlci0+Y29tbWFuZChteGItPnNhYTcxMTFhLERFQ09ERVJfU0VUX0lOUFVULCAmaSkpIHsKKwkJCXByaW50aygiVklESU9DX1NfSU5QVVQ6IGNvdWxkIG5vdCBhZGRyZXNzIHNhYTcxMTFhICMxLlxuIik7CisJCX0JCQkKKworCQkvKiBzd2l0Y2ggdGhlIGF1ZGlvLXNvdXJjZSBvbmx5IGlmIG5lY2Vzc2FyeSAqLworCQlpZiggMCA9PSBteGItPmN1cl9tdXRlICkgeworCQkJbXhiLT50ZWE2NDIwXzEtPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMSxURUE2NDIwX1NXSVRDSCwgJlRFQTY0MjBfbGluZVt2aWRlb19hdWRpb19jb25uZWN0W2lucHV0XV1bMF0pOworCQkJbXhiLT50ZWE2NDIwXzItPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMixURUE2NDIwX1NXSVRDSCwgJlRFQTY0MjBfbGluZVt2aWRlb19hdWRpb19jb25uZWN0W2lucHV0XV1bMV0pOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKKwkJaW50IGJ5dGUgPSAwOworCisJCWlmKCAwICE9IHQtPmluZGV4ICkgeworCQkJREVCX0QoKCJWSURJT0NfR19UVU5FUjogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIgYXR0YWNoZWQuXG4iLCB0LT5pbmRleCkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlERUJfRUUoKCJWSURJT0NfR19UVU5FUjogJWRcbiIsIHQtPmluZGV4KSk7CisKKwkJbWVtc2V0KHQsMCxzaXplb2YoKnQpKTsKKwkJc3RyY3B5KHQtPm5hbWUsICJUZWxldmlzaW9uIik7CisKKwkJdC0+dHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCQl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTk9STSB8IFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8IFY0TDJfVFVORVJfQ0FQX0xBTkcxIHwgVjRMMl9UVU5FUl9DQVBfTEFORzIgfCBWNEwyX1RVTkVSX0NBUF9TQVA7CisJCXQtPnJhbmdlbG93ID0gNzcyOwkvKiA0OC4yNSBNSFogLyA2Mi41IGtIeiA9IDc3Miwgc2VlIGZpMTIxNm1rMi1zcGVjcywgcGFnZSAyICovCisJCXQtPnJhbmdlaGlnaCA9IDEzNjg0OwkvKiA4NTUuMjUgTUh6IC8gNjIuNSBrSHogPSAxMzY4NCAqLworCQkvKiBGSVhNRTogYWRkIHRoZSByZWFsIHNpZ25hbCBzdHJlbmd0aCBoZXJlICovCisJCXQtPnNpZ25hbCA9IDB4ZmZmZjsKKwkJdC0+YWZjID0gMDsJCQorCisJCW14Yi0+dGRhOTg0MC0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGRhOTg0MCxUREE5ODQwX0RFVEVDVCwgJmJ5dGUpOworCQl0LT5hdWRtb2RlID0gbXhiLT5jdXJfbW9kZTsKKwkJCisJCWlmKCBieXRlIDwgMCApIHsKKwkJCXQtPnJ4c3ViY2hhbnMgID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaChieXRlKSB7CisJCQkJY2FzZSBUREE5ODQwX01PTk9fREVURUNUOiB7CisJCQkJCXQtPnJ4c3ViY2hhbnMgCT0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCQkJREVCX0QoKCJWSURJT0NfR19UVU5FUjogVjRMMl9UVU5FUl9NT0RFX01PTk8uXG4iKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIFREQTk4NDBfRFVBTF9ERVRFQ1Q6IHsKKwkJCQkJdC0+cnhzdWJjaGFucyAJPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8IFY0TDJfVFVORVJfU1VCX0xBTkcyOworCQkJCQlERUJfRCgoIlZJRElPQ19HX1RVTkVSOiBWNEwyX1RVTkVSX01PREVfTEFORzEuXG4iKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIFREQTk4NDBfU1RFUkVPX0RFVEVDVDogeworCQkJCQl0LT5yeHN1YmNoYW5zIAk9IFY0TDJfVFVORVJfU1VCX1NURVJFTyB8IFY0TDJfVFVORVJfU1VCX01PTk87CisJCQkJCURFQl9EKCgiVklESU9DX0dfVFVORVI6IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8uXG4iKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkZWZhdWx0OiB7IC8qIFREQTk4NDBfSU5DT1JSRUNUX0RFVEVDVCAqLworCQkJCQl0LT5yeHN1YmNoYW5zIAk9IFY0TDJfVFVORVJfTU9ERV9NT05POworCQkJCQlERUJfRCgoIlZJRElPQ19HX1RVTkVSOiBUREE5ODQwX0lOQ09SUkVDVF9ERVRFQ1QgPT4gVjRMMl9UVU5FUl9NT0RFX01PTk9cbiIpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1NfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKKwkJaW50IHJlc3VsdCA9IDA7CisJCWludCBieXRlID0gMDsKKwkJCisJCWlmKCAwICE9IHQtPmluZGV4ICkgeworCQkJREVCX0QoKCJWSURJT0NfU19UVU5FUjogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIgYXR0YWNoZWQuXG4iLHQtPmluZGV4KSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQorCQlzd2l0Y2godC0+YXVkbW9kZSkgeworCQkJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOiB7CisJCQkJbXhiLT5jdXJfbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJCQkJYnl0ZSA9IFREQTk4NDBfU0VUX1NURVJFTzsKKwkJCQlERUJfRCgoIlZJRElPQ19TX1RVTkVSOiBWNEwyX1RVTkVSX01PREVfU1RFUkVPXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMTogeworCQkJCW14Yi0+Y3VyX21vZGUgPSBWNEwyX1RVTkVSX01PREVfTEFORzE7CisJCQkJYnl0ZSA9IFREQTk4NDBfU0VUX0xBTkcxOworCQkJCURFQl9EKCgiVklESU9DX1NfVFVORVI6IFY0TDJfVFVORVJfTU9ERV9MQU5HMVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzI6IHsKKwkJCQlteGItPmN1cl9tb2RlID0gVjRMMl9UVU5FUl9NT0RFX0xBTkcyOworCQkJCWJ5dGUgPSBUREE5ODQwX1NFVF9MQU5HMjsKKwkJCQlERUJfRCgoIlZJRElPQ19TX1RVTkVSOiBWNEwyX1RVTkVSX01PREVfTEFORzJcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6IHsgLyogY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzogeyovCisJCQkJbXhiLT5jdXJfbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POworCQkJCWJ5dGUgPSBUREE5ODQwX1NFVF9NT05POworCQkJCURFQl9EKCgiVklESU9DX1NfVFVORVI6IFREQTk4NDBfU0VUX01PTk9cbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmKCAwICE9IChyZXN1bHQgPSBteGItPnRkYTk4NDAtPmRyaXZlci0+Y29tbWFuZChteGItPnRkYTk4NDAsIFREQTk4NDBfU1dJVENILCAmYnl0ZSkpKSB7CisJCQlwcmludGsoIlZJRElPQ19TX1RVTkVSIGVycm9yLiByZXN1bHQ6JWQsIGJ5dGU6JWRcbiIscmVzdWx0LGJ5dGUpOworCQl9CisJCQkJCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwl7CisJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKKworCQlpZigwICE9IG14Yi0+Y3VyX2lucHV0KSB7CisJCQlERUJfRCgoIlZJRElPQ19HX0ZSRVE6IGNoYW5uZWwgJWQgZG9lcyBub3QgaGF2ZSBhIHR1bmVyIVxuIixteGItPmN1cl9pbnB1dCkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQltZW1zZXQoZiwwLHNpemVvZigqZikpOworCQlmLT50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7CisJCWYtPmZyZXF1ZW5jeSA9ICBteGItPmN1cl9mcmVxOworCisJCURFQl9FRSgoIlZJRElPQ19HX0ZSRVE6IGZyZXE6MHglMDh4LlxuIiwgbXhiLT5jdXJfZnJlcSkpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CisJeworCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CisJCWludCB0X2xvY2tlZCA9IDA7CisJCWludCB2X2J5dGUgPSAwOworCisJCWlmICgwICE9IGYtPnR1bmVyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKFY0TDJfVFVORVJfQU5BTE9HX1RWICE9IGYtPnR5cGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCisJCWlmKDAgIT0gbXhiLT5jdXJfaW5wdXQpIHsKKwkJCURFQl9EKCgiVklESU9DX1NfRlJFUTogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIhXG4iLG14Yi0+Y3VyX2lucHV0KSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCURFQl9FRSgoIlZJRElPQ19TX0ZSRVFVRU5DWTogZnJlcToweCUwOHguXG4iLGYtPmZyZXF1ZW5jeSkpOworCisJCW14Yi0+Y3VyX2ZyZXEgPSBmLT5mcmVxdWVuY3k7CisKKwkJLyogdHVuZSBpbiBkZXNpcmVkIGZyZXF1ZW5jeSAqLwkJCQorCQlteGItPnR1bmVyLT5kcml2ZXItPmNvbW1hbmQobXhiLT50dW5lciwgVklESU9DU0ZSRVEsICZteGItPmN1cl9mcmVxKTsKKworCQkvKiBjaGVjayBpZiBwbGwgb2YgdHVuZXIgJiBzYWE3MTExYSBpcyBsb2NrZWQgKi8KKy8vCQlteGItPnR1bmVyLT5kcml2ZXItPmNvbW1hbmQobXhiLT50dW5lcixUVU5FUl9JU19MT0NLRUQsICZ0X2xvY2tlZCk7CisJCW14Yi0+c2FhNzExMWEtPmRyaXZlci0+Y29tbWFuZChteGItPnNhYTcxMTFhLERFQ09ERVJfR0VUX1NUQVRVUywgJnZfYnl0ZSk7CisKKwkJLyogbm90IGxvY2tlZCAtLSBhbnl0aGluZyB0byBkbyBoZXJlID8gKi8KKwkJaWYoIDAgPT0gdF9sb2NrZWQgfHwgMCA9PSAodl9ieXRlICYgREVDT0RFUl9TVEFUVVNfR09PRCkpIHsKKwkJfQorCisJCS8qIGhhY2s6IGNoYW5naW5nIHRoZSBmcmVxdWVuY3kgc2hvdWxkIGludmFsaWRhdGUgdGhlIHZiaS1jb3VudGVyICg9PiBhbGV2dCkgKi8KKwkJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwkJdnYtPnZiaV9maWVsZGNvdW50ID0gMDsKKwkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworCisJCXJldHVybiAwOworCX0KKwljYXNlIE1YQl9TX0FVRElPX0NEOgorCXsKKwkJaW50IGkgPSAqKGludCopYXJnOworCQkJCQorCQlpZiggaSA8IDAgfHwgaSA+PSBNWEJfQVVESU9TICkgeworCQkJREVCX0QoKCJpbGxlZ2FsIGFyZ3VtZW50IHRvIE1YQl9TX0FVRElPX0NEOiBpOiVkLlxuIixpKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkKKwkJREVCX0VFKCgiTVhCX1NfQVVESU9fQ0Q6IGk6JWQuXG4iLGkpKTsKKworCQlteGItPnRlYTY0MjBfMS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8xLFRFQTY0MjBfU1dJVENILCAmVEVBNjQyMF9jZFtpXVswXSk7CisJCW14Yi0+dGVhNjQyMF8yLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzIsVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2NkW2ldWzFdKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBNWEJfU19BVURJT19MSU5FOgorCXsKKwkJaW50IGkgPSAqKGludCopYXJnOworCQkJCQorCQlpZiggaSA8IDAgfHwgaSA+PSBNWEJfQVVESU9TICkgeworCQkJREVCX0QoKCJpbGxlZ2FsIGFyZ3VtZW50IHRvIE1YQl9TX0FVRElPX0xJTkU6IGk6JWQuXG4iLGkpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCQorCQlERUJfRUUoKCJNWEJfU19BVURJT19MSU5FOiBpOiVkLlxuIixpKSk7CisJCW14Yi0+dGVhNjQyMF8xLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzEsVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2xpbmVbaV1bMF0pOworCQlteGItPnRlYTY0MjBfMi0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8yLFRFQTY0MjBfU1dJVENILCAmVEVBNjQyMF9saW5lW2ldWzFdKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICphID0gYXJnOworCisJCWlmKCBhLT5pbmRleCA8IDAgfHwgYS0+aW5kZXggPiBNWEJfSU5QVVRTICkgeworCSAJCURFQl9EKCgiVklESU9DX0dfQVVESU8gJWQgb3V0IG9mIHJhbmdlLlxuIixhLT5pbmRleCkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJCisgCQlERUJfRUUoKCJWSURJT0NfR19BVURJTyAlZC5cbiIsYS0+aW5kZXgpKTsKKwkJbWVtY3B5KGEsICZteGJfYXVkaW9zW3ZpZGVvX2F1ZGlvX2Nvbm5lY3RbbXhiLT5jdXJfaW5wdXRdXSwgc2l6ZW9mKHN0cnVjdCB2NGwyX2F1ZGlvKSk7CisJCQorCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICphID0gYXJnOworCQlERUJfRCgoIlZJRElPQ19TX0FVRElPICVkLlxuIixhLT5pbmRleCkpOworCQlyZXR1cm4gMDsKKwl9CQorCWRlZmF1bHQ6CisvKgorCQlERUIyKHByaW50aygiZG9lcyBub3QgaGFuZGxlIHRoaXMgaW9jdGwuXG4iKSk7CisqLworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGRfY2FsbGJhY2soc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYsIHN0cnVjdCBzYWE3MTQ2X3N0YW5kYXJkICpzdGQpCit7CisJc3RydWN0IG14YiogbXhiID0gKHN0cnVjdCBteGIqKWRldi0+ZXh0X3ByaXY7CisJaW50IHplcm8gPSAwOworCWludCBvbmUgPSAxOworCisJaWYoVjRMMl9TVERfUEFMX0kgPT0gc3RkLT5pZCApIHsKKwkJREVCX0QoKCJWSURJT0NfU19TVEQ6IHNldHRpbmcgbXhiIGZvciBQQUxfSS5cbiIpKTsKKwkJLyogc2V0IHRoZSA3MTQ2IGdwaW8gcmVnaXN0ZXIgLS0gSSBkb24ndCBrbm93IHdoYXQgdGhpcyBkb2VzIGV4YWN0bHkgKi8KKyAgICAgIAkJc2FhNzE0Nl93cml0ZShkZXYsIEdQSU9fQ1RSTCwgMHgwMDQwNDA1MCk7CisJCS8qIHVuc2V0IHRoZSA3MTExIGdwaW8gcmVnaXN0ZXIgLS0gSSBkb24ndCBrbm93IHdoYXQgdGhpcyBkb2VzIGV4YWN0bHkgKi8KKwkJbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsREVDT0RFUl9TRVRfR1BJTywgJnplcm8pOworCX0gZWxzZSB7CisJCURFQl9EKCgiVklESU9DX1NfU1REOiBzZXR0aW5nIG14YiBmb3IgUEFML05UU0MvU0VDQU0uXG4iKSk7CisJCS8qIHNldCB0aGUgNzE0NiBncGlvIHJlZ2lzdGVyIC0tIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcyBleGFjdGx5ICovCisgICAgICAJCXNhYTcxNDZfd3JpdGUoZGV2LCBHUElPX0NUUkwsIDB4MDA0MDQwNTApOworCQkvKiBzZXQgdGhlIDcxMTEgZ3BpbyByZWdpc3RlciAtLSBJIGRvbid0IGtub3cgd2hhdCB0aGlzIGRvZXMgZXhhY3RseSAqLworCQlteGItPnNhYTcxMTFhLT5kcml2ZXItPmNvbW1hbmQobXhiLT5zYWE3MTExYSxERUNPREVSX1NFVF9HUElPLCAmb25lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9zdGFuZGFyZCBzdGFuZGFyZFtdID0geworCXsKKwkJLm5hbWUJPSAiUEFMLUJHIiwgCS5pZAk9IFY0TDJfU1REX1BBTF9CRywKKwkJLnZfb2Zmc2V0CT0gMHgxNywJLnZfZmllbGQgCT0gMjg4LAorCQkuaF9vZmZzZXQJPSAweDE0LAkuaF9waXhlbHMgCT0gNjgwLAorCQkudl9tYXhfb3V0CT0gNTc2LAkuaF9tYXhfb3V0CT0gNzY4LAorCX0sIHsKKwkJLm5hbWUJPSAiUEFMLUkiLCAJLmlkCT0gVjRMMl9TVERfUEFMX0ksCisJCS52X29mZnNldAk9IDB4MTcsCS52X2ZpZWxkIAk9IDI4OCwKKwkJLmhfb2Zmc2V0CT0gMHgxNCwJLmhfcGl4ZWxzIAk9IDY4MCwKKwkJLnZfbWF4X291dAk9IDU3NiwJLmhfbWF4X291dAk9IDc2OCwKKwl9LCB7CisJCS5uYW1lCT0gIk5UU0MiLCAJLmlkCT0gVjRMMl9TVERfTlRTQywKKwkJLnZfb2Zmc2V0CT0gMHgxNiwJLnZfZmllbGQgCT0gMjQwLAorCQkuaF9vZmZzZXQJPSAweDA2LAkuaF9waXhlbHMgCT0gNzA4LAorCQkudl9tYXhfb3V0CT0gNDgwLAkuaF9tYXhfb3V0CT0gNjQwLAorCX0sIHsKKwkJLm5hbWUJPSAiU0VDQU0iLCAJLmlkCT0gVjRMMl9TVERfU0VDQU0sCisJCS52X29mZnNldAk9IDB4MTQsCS52X2ZpZWxkIAk9IDI4OCwKKwkJLmhfb2Zmc2V0CT0gMHgxNCwJLmhfcGl4ZWxzIAk9IDcyMCwKKwkJLnZfbWF4X291dAk9IDU3NiwJLmhfbWF4X291dAk9IDc2OCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfcGNpX2V4dGVuc2lvbl9kYXRhIG14YiA9IHsKKyAgICAgICAgLmV4dF9wcml2ID0gIk11bHRpbWVkaWEgZVh0ZW5zaW9uIEJvYXJkIiwKKyAgICAgICAgLmV4dCA9ICZleHRlbnNpb24sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZQkgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTQ2LAorCQkuc3VidmVuZG9yID0gMHgwMDAwLAorCQkuc3ViZGV2aWNlID0gMHgwMDAwLAorCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykmbXhiLAorCX0sIHsKKwkJLnZlbmRvcgk9IDAsCisJfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0X3Z2IHZ2X2RhdGEgPSB7CisJLmlucHV0cwkJPSBNWEJfSU5QVVRTLAorCS5jYXBhYmlsaXRpZXMJPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1ZCSV9DQVBUVVJFLAorCS5zdGRzCQk9ICZzdGFuZGFyZFswXSwKKwkubnVtX3N0ZHMJPSBzaXplb2Yoc3RhbmRhcmQpL3NpemVvZihzdHJ1Y3Qgc2FhNzE0Nl9zdGFuZGFyZCksCisJLnN0ZF9jYWxsYmFjawk9ICZzdGRfY2FsbGJhY2ssIAorCS5pb2N0bHMJCT0gJmlvY3Rsc1swXSwKKwkuaW9jdGwJCT0gbXhiX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBleHRlbnNpb24gPSB7CisJLm5hbWUJCT0gTVhCX0lERU5USUZJRVIsCisJLmZsYWdzCQk9IFNBQTcxNDZfVVNFX0kyQ19JUlEsCisJCisJLnBjaV90YmwJPSAmcGNpX3RibFswXSwKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCisJLnByb2JlCQk9IG14Yl9wcm9iZSwKKwkuYXR0YWNoCQk9IG14Yl9hdHRhY2gsCisJLmRldGFjaAkJPSBteGJfZGV0YWNoLAorCisJLmlycV9tYXNrCT0gMCwKKwkuaXJxX2Z1bmMJPSBOVUxMLAorfTsJCisKK3N0YXRpYyBpbnQgX19pbml0IG14Yl9pbml0X21vZHVsZSh2b2lkKQoreworCWlmKCAwICE9IHNhYTcxNDZfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZleHRlbnNpb24pKSB7CisJCURFQl9TKCgiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGVuc2lvbi5cbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXhiX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJc2FhNzE0Nl91bnJlZ2lzdGVyX2V4dGVuc2lvbigmZXh0ZW5zaW9uKTsKK30KKworbW9kdWxlX2luaXQobXhiX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KG14Yl9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigidmlkZW80bGludXgtMiBkcml2ZXIgZm9yIHRoZSBTaWVtZW5zLU5peGRvcmYgJ011bHRpbWVkaWEgZVh0ZW5zaW9uIGJvYXJkJyIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIdW5vbGQgPG1pY2hhZWxAbWlodS5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMzJlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5oCkBAIC0wLDAgKzEsNDIgQEAKKyNpZm5kZWYgX19NWEJfXworI2RlZmluZSBfX01YQl9fCisKKyNkZWZpbmUgQkFTRV9WSURJT0NfTVhCIDEwCisKKyNkZWZpbmUgTVhCX1NfQVVESU9fQ0QJCV9JT1cgICgnVicsIEJBU0VfVklESU9DX1BSSVZBVEUrQkFTRV9WSURJT0NfTVhCKzAsIGludCkKKyNkZWZpbmUgTVhCX1NfQVVESU9fTElORQlfSU9XICAoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFK0JBU0VfVklESU9DX01YQisxLCBpbnQpCisKKyNkZWZpbmUgTVhCX0lERU5USUZJRVIgIk11bHRpbWVkaWEgZVh0ZW5zaW9uIEJvYXJkIgorCisjZGVmaW5lIE1YQl9BVURJT1MJNgorCisvKiB0aGVzZSBhcmUgdGhlIGF2YWlsYWJsZSBhdWRpbyBzb3VyY2VzLCB3aGljaCBjYW4gc3dpdGNoZWQKKyAgIHRvIHRoZSBsaW5lLSBhbmQgY2Qtb3V0cHV0IGluZGl2aWR1YWxseSAqLworc3RhdGljIHN0cnVjdCB2NGwyX2F1ZGlvIG14Yl9hdWRpb3NbTVhCX0FVRElPU10gPSB7CisJICAgIHsKKwkJLmluZGV4CT0gMCwKKwkJLm5hbWUJPSAiVHVuZXIiLAorCQkuY2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTywKKwl9ICwgeworCQkuaW5kZXgJPSAxLAorCQkubmFtZQk9ICJBVVgxIiwKKwkJLmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU8sCisJfSAsIHsKKwkJLmluZGV4CT0gMiwKKwkJLm5hbWUJPSAiQVVYMiIsCisJCS5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPLAorCX0gLCB7CisJCS5pbmRleAk9IDMsCisJCS5uYW1lCT0gIkFVWDMiLAorCQkuY2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTywKKwl9ICwgeworCQkuaW5kZXgJPSA0LAorCQkubmFtZQk9ICJSYWRpbyAoWDkpIiwKKwkJLmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU8sCisJfSAsIHsKKwkJLmluZGV4CT0gNSwKKwkJLm5hbWUJPSAiQ0QtUk9NIChYMTApIiwKKwkJLmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU8sCisJfQorfTsJCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhNDFhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorb3ZjYW1jaGlwLW9ianMgICAgIDo9IG92Y2FtY2hpcF9jb3JlLm8gb3Y2eDIwLm8gb3Y2eDMwLm8gb3Y3eDEwLm8gb3Y3eDIwLm8gXAorICAgICAgICAgICAgICAgICAgICAgIG92NzZiZS5vCisKK29iai0kKENPTkZJR19WSURFT19PVkNBTUNISVApICs9IG92Y2FtY2hpcC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjZ4MjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzM2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjZ4MjAuYwpAQCAtMCwwICsxLDQxNSBAQAorLyogT21uaVZpc2lvbiBPVjY2MjAvT1Y2MTIwIENhbWVyYSBDaGlwIFN1cHBvcnQgQ29kZQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IE1hcmsgTWNDbGVsbGFuZCA8bWFya0BhbHBoYS5keW5kbnMub3JnPgorICogaHR0cDovL2FscGhhLmR5bmRucy5vcmcvb3Y1MTEvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gTk8gV0FSUkFOVFkgT0YgQU5ZIEtJTkQgaXMgZXhwcmVzc2VkIG9yIGltcGxpZWQuCisgKi8KKworI2RlZmluZSBERUJVRworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgIm92Y2FtY2hpcF9wcml2LmgiCisKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBSRUdfR0FJTgkJMHgwMAkvKiBnYWluIFs1OjBdICovCisjZGVmaW5lIFJFR19CTFVFCQkweDAxCS8qIGJsdWUgZ2FpbiAqLworI2RlZmluZSBSRUdfUkVECQkJMHgwMgkvKiByZWQgZ2FpbiAqLworI2RlZmluZSBSRUdfU0FUCQkJMHgwMwkvKiBzYXR1cmF0aW9uICovCisjZGVmaW5lIFJFR19DTlQJCQkweDA1CS8qIFkgY29udHJhc3QgKi8KKyNkZWZpbmUgUkVHX0JSVAkJCTB4MDYJLyogWSBicmlnaHRuZXNzICovCisjZGVmaW5lIFJFR19XQl9CTFVFCQkweDBDCS8qIFdCIGJsdWUgcmF0aW8gWzU6MF0gKi8KKyNkZWZpbmUgUkVHX1dCX1JFRAkJMHgwRAkvKiBXQiByZWQgcmF0aW8gWzU6MF0gKi8KKyNkZWZpbmUgUkVHX0VYUAkJCTB4MTAJLyogZXhwb3N1cmUgKi8KKworLyogV2luZG93IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgSFdTQkFTRSAweDM4CisjZGVmaW5lIEhXRUJBU0UgMHgzQQorI2RlZmluZSBWV1NCQVNFIDB4MDUKKyNkZWZpbmUgVldFQkFTRSAweDA2CisKK3N0cnVjdCBvdjZ4MjAgeworCWludCBhdXRvX2JydDsKKwlpbnQgYXV0b19leHA7CisJaW50IGJhY2tsaWdodDsKKwlpbnQgYmFuZGZpbHQ7CisJaW50IG1pcnJvcjsKK307CisKKy8qIEluaXRpYWwgdmFsdWVzIGZvciB1c2Ugd2l0aCBPVjUxMS9PVjUxMSsgY2FtZXJhcyAqLworc3RhdGljIHN0cnVjdCBvdmNhbWNoaXBfcmVndmFscyByZWd2YWxzX2luaXRfNngyMF81MTFbXSA9IHsKKwl7IDB4MTIsIDB4ODAgfSwgLyogcmVzZXQgKi8KKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MDMsIDB4NjAgfSwKKwl7IDB4MDUsIDB4N2YgfSwgLyogRm9yIHdoZW4gYXV0b2FkanVzdCBpcyBvZmYgKi8KKwl7IDB4MDcsIDB4YTggfSwKKwl7IDB4MGMsIDB4MjQgfSwKKwl7IDB4MGQsIDB4MjQgfSwKKwl7IDB4MGYsIDB4MTUgfSwgLyogQ09NUyAqLworCXsgMHgxMCwgMHg3NSB9LCAvKiBBRUMgRXhwb3N1cmUgdGltZSAqLworCXsgMHgxMiwgMHgyNCB9LCAvKiBFbmFibGUgQUdDIGFuZCBBV0IgKi8KKwl7IDB4MTQsIDB4MDQgfSwKKwl7IDB4MTYsIDB4MDMgfSwKKwl7IDB4MjYsIDB4YjIgfSwgLyogQkxDIGVuYWJsZSAqLworCS8qIDB4Mjg6IDB4MDUgU2VsZWN0cyBSR0IgZm9ybWF0IGlmIFJHQiBvbiAqLworCXsgMHgyOCwgMHgwNSB9LAorCXsgMHgyYSwgMHgwNCB9LCAvKiBEaXNhYmxlIGZyYW1lcmF0ZSBhZGp1c3QgKi8KKwl7IDB4MmQsIDB4OTkgfSwKKwl7IDB4MzMsIDB4YTAgfSwgLyogQ29sb3IgUHJvY2Vzc2luZyBQYXJhbWV0ZXIgKi8KKwl7IDB4MzQsIDB4ZDIgfSwgLyogTWF4IEEvRCByYW5nZSAqLworCXsgMHgzOCwgMHg4YiB9LAorCXsgMHgzOSwgMHg0MCB9LAorCisJeyAweDNjLCAweDM5IH0sIC8qIEVuYWJsZSBBRUMgbW9kZSBjaGFuZ2luZyAqLworCXsgMHgzYywgMHgzYyB9LCAvKiBDaGFuZ2UgQUVDIG1vZGUgKi8KKwl7IDB4M2MsIDB4MjQgfSwgLyogRGlzYWJsZSBBRUMgbW9kZSBjaGFuZ2luZyAqLworCisJeyAweDNkLCAweDgwIH0sCisJLyogVGhlc2UgbmV4dCB0d28gcmVnaXN0ZXJzICgweDRhLCAweDRiKSBhcmUgdW5kb2N1bWVudGVkLiBUaGV5CisJICogY29udHJvbCB0aGUgY29sb3IgYmFsYW5jZSAqLworCXsgMHg0YSwgMHg4MCB9LAorCXsgMHg0YiwgMHg4MCB9LAorCXsgMHg0ZCwgMHhkMiB9LCAvKiBUaGlzIHJlZHVjZXMgbm9pc2UgYSBiaXQgKi8KKwl7IDB4NGUsIDB4YzEgfSwKKwl7IDB4NGYsIDB4MDQgfSwKKwl7IDB4ZmYsIDB4ZmYgfSwJLyogRU5EIE1BUktFUiAqLworfTsKKworLyogSW5pdGlhbCB2YWx1ZXMgZm9yIHVzZSB3aXRoIE9WNTE4IGNhbWVyYXMgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3ZjYW1jaGlwX3JlZ3ZhbHMgcmVndmFsc19pbml0XzZ4MjBfNTE4W10gPSB7CisJeyAweDEyLCAweDgwIH0sIC8qIERvIGEgcmVzZXQgKi8KKwl7IDB4MDMsIDB4YzAgfSwgLyogU2F0dXJhdGlvbiAqLworCXsgMHgwNSwgMHg4YSB9LCAvKiBDb250cmFzdCAqLworCXsgMHgwYywgMHgyNCB9LCAvKiBBV0IgYmx1ZSAqLworCXsgMHgwZCwgMHgyNCB9LCAvKiBBV0IgcmVkICovCisJeyAweDBlLCAweDhkIH0sIC8qIEFkZGl0aW9uYWwgMnggZ2FpbiAqLworCXsgMHgwZiwgMHgyNSB9LCAvKiBCbGFjayBleHBhbmRpbmcgbGV2ZWwgPSAxLjNWICovCisJeyAweDExLCAweDAxIH0sIC8qIENsb2NrIGRpdi4gKi8KKwl7IDB4MTIsIDB4MjQgfSwgLyogRW5hYmxlIEFHQyBhbmQgQVdCICovCisJeyAweDEzLCAweDAxIH0sIC8qIChkZWZhdWx0KSAqLworCXsgMHgxNCwgMHg4MCB9LCAvKiBTZXQgcmVzZXJ2ZWQgYml0IDcgKi8KKwl7IDB4MTUsIDB4MDEgfSwgLyogKGRlZmF1bHQpICovCisJeyAweDE2LCAweDAzIH0sIC8qIChkZWZhdWx0KSAqLworCXsgMHgxNywgMHgzOCB9LCAvKiAoZGVmYXVsdCkgKi8KKwl7IDB4MTgsIDB4ZWEgfSwgLyogKGRlZmF1bHQpICovCisJeyAweDE5LCAweDA0IH0sCisJeyAweDFhLCAweDkzIH0sCisJeyAweDFiLCAweDAwIH0sIC8qIChkZWZhdWx0KSAqLworCXsgMHgxZSwgMHhjNCB9LCAvKiAoZGVmYXVsdCkgKi8KKwl7IDB4MWYsIDB4MDQgfSwgLyogKGRlZmF1bHQpICovCisJeyAweDIwLCAweDIwIH0sIC8qIEVuYWJsZSAxc3Qgc3RhZ2UgYXBlcnR1cmUgY29ycmVjdGlvbiAqLworCXsgMHgyMSwgMHgxMCB9LCAvKiBZIG9mZnNldCAqLworCXsgMHgyMiwgMHg4OCB9LCAvKiBVIG9mZnNldCAqLworCXsgMHgyMywgMHhjMCB9LCAvKiBTZXQgWFRBTCBwb3dlciBsZXZlbCAqLworCXsgMHgyNCwgMHg1MyB9LCAvKiBBRUMgYnJpZ2h0IHJhdGlvICovCisJeyAweDI1LCAweDdhIH0sIC8qIEFFQyBibGFjayByYXRpbyAqLworCXsgMHgyNiwgMHhiMiB9LCAvKiBCTEMgZW5hYmxlICovCisJeyAweDI3LCAweGEyIH0sIC8qIEZ1bGwgb3V0cHV0IHJhbmdlICovCisJeyAweDI4LCAweDAxIH0sIC8qIChkZWZhdWx0KSAqLworCXsgMHgyOSwgMHgwMCB9LCAvKiAoZGVmYXVsdCkgKi8KKwl7IDB4MmEsIDB4ODQgfSwgLyogKGRlZmF1bHQpICovCisJeyAweDJiLCAweGE4IH0sIC8qIFNldCBjdXN0b20gZnJhbWUgcmF0ZSAqLworCXsgMHgyYywgMHhhMCB9LCAvKiAocmVzZXJ2ZWQpICovCisJeyAweDJkLCAweDk1IH0sIC8qIEVuYWJsZSBiYW5kaW5nIGZpbHRlciAqLworCXsgMHgyZSwgMHg4OCB9LCAvKiBWIG9mZnNldCAqLworCXsgMHgzMywgMHgyMiB9LCAvKiBMdW1pbmFuY2UgZ2FtbWEgb24gKi8KKwl7IDB4MzQsIDB4YzcgfSwgLyogQS9EIGJpYXMgKi8KKwl7IDB4MzYsIDB4MTIgfSwgLyogKHJlc2VydmVkKSAqLworCXsgMHgzNywgMHg2MyB9LCAvKiAocmVzZXJ2ZWQpICovCisJeyAweDM4LCAweDhiIH0sIC8qIFF1aWNrIEFFQy9BRUIgKi8KKwl7IDB4MzksIDB4MDAgfSwgLyogKGRlZmF1bHQpICovCisJeyAweDNhLCAweDBmIH0sIC8qIChkZWZhdWx0KSAqLworCXsgMHgzYiwgMHgzYyB9LCAvKiAoZGVmYXVsdCkgKi8KKwl7IDB4M2MsIDB4NWMgfSwgLyogQUVDIGNvbnRyb2xzICovCisJeyAweDNkLCAweDgwIH0sIC8qIERyb3AgMSAoYmFkKSBmcmFtZSB3aGVuIEFFQyBjaGFuZ2UgKi8KKwl7IDB4M2UsIDB4ODAgfSwgLyogKGRlZmF1bHQpICovCisJeyAweDNmLCAweDAyIH0sIC8qIChkZWZhdWx0KSAqLworCXsgMHg0MCwgMHgxMCB9LCAvKiAocmVzZXJ2ZWQpICovCisJeyAweDQxLCAweDEwIH0sIC8qIChyZXNlcnZlZCkgKi8KKwl7IDB4NDIsIDB4MDAgfSwgLyogKHJlc2VydmVkKSAqLworCXsgMHg0MywgMHg3ZiB9LCAvKiAocmVzZXJ2ZWQpICovCisJeyAweDQ0LCAweDgwIH0sIC8qIChyZXNlcnZlZCkgKi8KKwl7IDB4NDUsIDB4MWMgfSwgLyogKHJlc2VydmVkKSAqLworCXsgMHg0NiwgMHgxYyB9LCAvKiAocmVzZXJ2ZWQpICovCisJeyAweDQ3LCAweDgwIH0sIC8qIChyZXNlcnZlZCkgKi8KKwl7IDB4NDgsIDB4NWYgfSwgLyogKHJlc2VydmVkKSAqLworCXsgMHg0OSwgMHgwMCB9LCAvKiAocmVzZXJ2ZWQpICovCisJeyAweDRhLCAweDAwIH0sIC8qIENvbG9yIGJhbGFuY2UgKHVuZG9jdW1lbnRlZCkgKi8KKwl7IDB4NGIsIDB4ODAgfSwgLyogQ29sb3IgYmFsYW5jZSAodW5kb2N1bWVudGVkKSAqLworCXsgMHg0YywgMHg1OCB9LCAvKiAocmVzZXJ2ZWQpICovCisJeyAweDRkLCAweGQyIH0sIC8qIFUgKj0gLjkzOCwgViAqPSAuODM4ICovCisJeyAweDRlLCAweGEwIH0sIC8qIChkZWZhdWx0KSAqLworCXsgMHg0ZiwgMHgwNCB9LCAvKiBVViAzLXBvaW50IGF2ZXJhZ2UgKi8KKwl7IDB4NTAsIDB4ZmYgfSwgLyogKHJlc2VydmVkKSAqLworCXsgMHg1MSwgMHg1OCB9LCAvKiAocmVzZXJ2ZWQpICovCisJeyAweDUyLCAweGMwIH0sIC8qIChyZXNlcnZlZCkgKi8KKwl7IDB4NTMsIDB4NDIgfSwgLyogKHJlc2VydmVkKSAqLworCXsgMHgyNywgMHhhNiB9LCAvKiBFbmFibGUgbWFudWFsIG9mZnNldCBhZGouIChyZWcgMjEgJiAyMikgKi8KKwl7IDB4MTIsIDB4MjAgfSwKKwl7IDB4MTIsIDB4MjQgfSwKKworCXsgMHhmZiwgMHhmZiB9LAkvKiBFTkQgTUFSS0VSICovCit9OworCisvKiBUaGlzIGluaXRpYWxpemVzIHRoZSBPVjZ4MjAgY2FtZXJhIGNoaXAgYW5kIHJlbGV2YW50IHZhcmlhYmxlcy4gKi8KK3N0YXRpYyBpbnQgb3Y2eDIwX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IG92NngyMCAqczsKKwlpbnQgcmM7CisKKwlEREVCVUcoNCwgJmMtPmRldiwgImVudGVyZWQiKTsKKworCXN3aXRjaCAoYy0+YWRhcHRlci0+aWQpIHsKKwljYXNlIEkyQ19BTEdPX1NNQlVTIHwgSTJDX0hXX1NNQlVTX09WNTExOgorCQlyYyA9IG92X3dyaXRlX3JlZ3ZhbHMoYywgcmVndmFsc19pbml0XzZ4MjBfNTExKTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfQUxHT19TTUJVUyB8IEkyQ19IV19TTUJVU19PVjUxODoKKwkJcmMgPSBvdl93cml0ZV9yZWd2YWxzKGMsIHJlZ3ZhbHNfaW5pdF82eDIwXzUxOCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmMtPmRldiwgIm92NngyMDogVW5zdXBwb3J0ZWQgYWRhcHRlclxuIik7CisJCXJjID0gLUVOT0RFVjsKKwl9CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlvdi0+c3ByaXYgPSBzID0ga21hbGxvYyhzaXplb2YgKnMsIEdGUF9LRVJORUwpOworCWlmICghcykKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHMsIDAsIHNpemVvZiAqcyk7CisKKwlzLT5hdXRvX2JydCA9IDE7CisJcy0+YXV0b19leHAgPSAxOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG92NngyMF9mcmVlKHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJa2ZyZWUob3YtPnNwcml2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjZ4MjBfc2V0X2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKmMsCisJCQkgICAgICBzdHJ1Y3Qgb3ZjYW1jaGlwX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlzdHJ1Y3Qgb3Y2eDIwICpzID0gb3YtPnNwcml2OworCWludCByYzsKKwlpbnQgdiA9IGN0bC0+dmFsdWU7CisKKwlzd2l0Y2ggKGN0bC0+aWQpIHsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQ09OVDoKKwkJcmMgPSBvdl93cml0ZShjLCBSRUdfQ05ULCB2ID4+IDgpOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQlJJR0hUOgorCQlyYyA9IG92X3dyaXRlKGMsIFJFR19CUlQsIHYgPj4gOCk7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9TQVQ6CisJCXJjID0gb3Zfd3JpdGUoYywgUkVHX1NBVCwgdiA+PiA4KTsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0hVRToKKwkJcmMgPSBvdl93cml0ZShjLCBSRUdfUkVELCAweEZGIC0gKHYgPj4gOCkpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmMgPSBvdl93cml0ZShjLCBSRUdfQkxVRSwgdiA+PiA4KTsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0VYUDoKKwkJcmMgPSBvdl93cml0ZShjLCBSRUdfRVhQLCB2KTsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0ZSRVE6CisJeworCQlpbnQgc2l4dHkgPSAodiA9PSA2MCk7CisKKwkJcmMgPSBvdl93cml0ZShjLCAweDJiLCBzaXh0eT8weGE4OjB4MjgpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmMgPSBvdl93cml0ZShjLCAweDJhLCBzaXh0eT8weDg0OjB4YTQpOworCQlicmVhazsKKwl9CisJY2FzZSBPVkNBTUNISVBfQ0lEX0JBTkRGSUxUOgorCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyZCwgdj8weDA0OjB4MDAsIDB4MDQpOworCQlzLT5iYW5kZmlsdCA9IHY7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPQlJJR0hUOgorCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyZCwgdj8weDEwOjB4MDAsIDB4MTApOworCQlzLT5hdXRvX2JydCA9IHY7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPRVhQOgorCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgxMywgdj8weDAxOjB4MDAsIDB4MDEpOworCQlzLT5hdXRvX2V4cCA9IHY7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9CQUNLTElHSFQ6CisJeworCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHg0ZSwgdj8weGUwOjB4YzAsIDB4ZTApOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MjksIHY/MHgwODoweDAwLCAweDA4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDBlLCB2PzB4ODA6MHgwMCwgMHg4MCk7CisJCXMtPmJhY2tsaWdodCA9IHY7CisJCWJyZWFrOworCX0KKwljYXNlIE9WQ0FNQ0hJUF9DSURfTUlSUk9SOgorCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgxMiwgdj8weDQwOjB4MDAsIDB4NDApOworCQlzLT5taXJyb3IgPSB2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbnRyb2wgbm90IHN1cHBvcnRlZDogJWQiLCBjdGwtPmlkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKK291dDoKKwlEREVCVUcoMywgJmMtPmRldiwgImlkPSVkLCBhcmc9JWQsIHJjPSVkIiwgY3RsLT5pZCwgdiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvdjZ4MjBfZ2V0X2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKmMsCisJCQkgICAgICBzdHJ1Y3Qgb3ZjYW1jaGlwX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlzdHJ1Y3Qgb3Y2eDIwICpzID0gb3YtPnNwcml2OworCWludCByYyA9IDA7CisJdW5zaWduZWQgY2hhciB2YWwgPSAwOworCisJc3dpdGNoIChjdGwtPmlkKSB7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0NPTlQ6CisJCXJjID0gb3ZfcmVhZChjLCBSRUdfQ05ULCAmdmFsKTsKKwkJY3RsLT52YWx1ZSA9IHZhbCA8PCA4OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQlJJR0hUOgorCQlyYyA9IG92X3JlYWQoYywgUkVHX0JSVCwgJnZhbCk7CisJCWN0bC0+dmFsdWUgPSB2YWwgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX1NBVDoKKwkJcmMgPSBvdl9yZWFkKGMsIFJFR19TQVQsICZ2YWwpOworCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9IVUU6CisJCXJjID0gb3ZfcmVhZChjLCBSRUdfQkxVRSwgJnZhbCk7CisJCWN0bC0+dmFsdWUgPSB2YWwgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0VYUDoKKwkJcmMgPSBvdl9yZWFkKGMsIFJFR19FWFAsICZ2YWwpOworCQljdGwtPnZhbHVlID0gdmFsOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQkFOREZJTFQ6CisJCWN0bC0+dmFsdWUgPSBzLT5iYW5kZmlsdDsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9CUklHSFQ6CisJCWN0bC0+dmFsdWUgPSBzLT5hdXRvX2JydDsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9FWFA6CisJCWN0bC0+dmFsdWUgPSBzLT5hdXRvX2V4cDsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0JBQ0tMSUdIVDoKKwkJY3RsLT52YWx1ZSA9IHMtPmJhY2tsaWdodDsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX01JUlJPUjoKKwkJY3RsLT52YWx1ZSA9IHMtPm1pcnJvcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRERFQlVHKDIsICZjLT5kZXYsICJjb250cm9sIG5vdCBzdXBwb3J0ZWQ6ICVkIiwgY3RsLT5pZCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJRERFQlVHKDMsICZjLT5kZXYsICJpZD0lZCwgYXJnPSVkLCByYz0lZCIsIGN0bC0+aWQsIGN0bC0+dmFsdWUsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgb3Y2eDIwX21vZGVfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IG92Y2FtY2hpcF93aW5kb3cgKndpbikKK3sKKwkvKioqKioqKiogUUNJRi1zcGVjaWZpYyByZWdzICoqKioqKioqLworCisJb3Zfd3JpdGUoYywgMHgxNCwgd2luLT5xdWFydGVyPzB4MjQ6MHgwNCk7CisKKwkvKioqKioqKiogUGFsZXR0ZS1zcGVjaWZpYyByZWdzICoqKioqKioqLworCisJLyogT1Y1MTggbmVlZHMgOCBiaXQgbXVsdGlwbGV4ZWQgaW4gY29sb3IgbW9kZSwgYW5kIDE2IGJpdCBpbiBCJlcgKi8KKwlpZiAoYy0+YWRhcHRlci0+aWQgPT0gKEkyQ19BTEdPX1NNQlVTIHwgSTJDX0hXX1NNQlVTX09WNTE4KSkgeworCQlpZiAod2luLT5mb3JtYXQgPT0gVklERU9fUEFMRVRURV9HUkVZKQorCQkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDAwLCAweDIwKTsKKwkJZWxzZQorCQkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDIwLCAweDIwKTsKKwl9IGVsc2UgeworCQlpZiAod2luLT5mb3JtYXQgPT0gVklERU9fUEFMRVRURV9HUkVZKQorCQkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDIwLCAweDIwKTsKKwkJZWxzZQorCQkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDAwLCAweDIwKTsKKwl9CisKKwkvKioqKioqKiogQ2xvY2sgcHJvZ3JhbW1pbmcgKioqKioqKiovCisKKwkvKiBUaGUgT1Y2NjIwIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcuIFRoaXMgcHJldmVudHMgdGhlCisJICogc2V2ZXJlIGJhbmRpbmcgdGhhdCBub3JtYWxseSBvY2N1cnMgKi8KKworCS8qIENsb2NrIGRvd24gKi8KKwlvdl93cml0ZShjLCAweDJhLCAweDA0KTsKKworCW92X3dyaXRlKGMsIDB4MTEsIHdpbi0+Y2xvY2tkaXYpOworCisJb3Zfd3JpdGUoYywgMHgyYSwgMHg4NCk7CisJLyogVGhpcyBuZXh0IHNldHRpbmcgaXMgY3JpdGljYWwuIEl0IHNlZW1zIHRvIGltcHJvdmUKKwkgKiB0aGUgZ2FpbiBvciB0aGUgY29udHJhc3QuIFRoZSAicmVzZXJ2ZWQiIGJpdHMgc2VlbQorCSAqIHRvIGhhdmUgc29tZSBlZmZlY3QgaW4gdGhpcyBjYXNlLiAqLworCW92X3dyaXRlKGMsIDB4MmQsIDB4ODUpOyAvKiBGSVhNRTogVGhpcyBtZXNzZXMgdXAgYmFuZGluZyBmaWx0ZXIgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NngyMF9zZXRfd2luZG93KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3Qgb3ZjYW1jaGlwX3dpbmRvdyAqd2luKQoreworCWludCByZXQsIGh3c2NhbGUsIHZ3c2NhbGU7CisKKwlyZXQgPSBvdjZ4MjBfbW9kZV9pbml0KGMsIHdpbik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAod2luLT5xdWFydGVyKSB7CisJCWh3c2NhbGUgPSAwOworCQl2d3NjYWxlID0gMDsKKwl9IGVsc2UgeworCQlod3NjYWxlID0gMTsKKwkJdndzY2FsZSA9IDE7CS8qIFRoZSBkYXRhc2hlZXQgc2F5cyAwOyBpdCdzIHdyb25nICovCisJfQorCisJb3Zfd3JpdGUoYywgMHgxNywgSFdTQkFTRSArICh3aW4tPnggPj4gaHdzY2FsZSkpOworCW92X3dyaXRlKGMsIDB4MTgsIEhXRUJBU0UgKyAoKHdpbi0+eCArIHdpbi0+d2lkdGgpID4+IGh3c2NhbGUpKTsKKwlvdl93cml0ZShjLCAweDE5LCBWV1NCQVNFICsgKHdpbi0+eSA+PiB2d3NjYWxlKSk7CisJb3Zfd3JpdGUoYywgMHgxYSwgVldFQkFTRSArICgod2luLT55ICsgd2luLT5oZWlnaHQpID4+IHZ3c2NhbGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NngyMF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9WQ0FNQ0hJUF9DTURfU19DVFJMOgorCQlyZXR1cm4gb3Y2eDIwX3NldF9jb250cm9sKGMsIGFyZyk7CisJY2FzZSBPVkNBTUNISVBfQ01EX0dfQ1RSTDoKKwkJcmV0dXJuIG92NngyMF9nZXRfY29udHJvbChjLCBhcmcpOworCWNhc2UgT1ZDQU1DSElQX0NNRF9TX01PREU6CisJCXJldHVybiBvdjZ4MjBfc2V0X3dpbmRvdyhjLCBhcmcpOworCWRlZmF1bHQ6CisJCURERUJVRygyLCAmYy0+ZGV2LCAiY29tbWFuZCBub3Qgc3VwcG9ydGVkOiAlZCIsIGNtZCk7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCitzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjZ4MjBfb3BzID0geworCS5pbml0ICAgID0Jb3Y2eDIwX2luaXQsCisJLmZyZWUgICAgPQlvdjZ4MjBfZnJlZSwKKwkuY29tbWFuZCA9CW92NngyMF9jb21tYW5kLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngzMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y2eDMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhODQyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngzMC5jCkBAIC0wLDAgKzEsMzc0IEBACisvKiBPbW5pVmlzaW9uIE9WNjYzMC9PVjYxMzAgQ2FtZXJhIENoaXAgU3VwcG9ydCBDb2RlCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgTWFyayBNY0NsZWxsYW5kIDxtYXJrQGFscGhhLmR5bmRucy5vcmc+CisgKiBodHRwOi8vYWxwaGEuZHluZG5zLm9yZy9vdjUxMS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCBpcyBleHByZXNzZWQgb3IgaW1wbGllZC4KKyAqLworCisjZGVmaW5lIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAib3ZjYW1jaGlwX3ByaXYuaCIKKworLyogUmVnaXN0ZXJzICovCisjZGVmaW5lIFJFR19HQUlOCQkweDAwCS8qIGdhaW4gWzU6MF0gKi8KKyNkZWZpbmUgUkVHX0JMVUUJCTB4MDEJLyogYmx1ZSBnYWluICovCisjZGVmaW5lIFJFR19SRUQJCQkweDAyCS8qIHJlZCBnYWluICovCisjZGVmaW5lIFJFR19TQVQJCQkweDAzCS8qIHNhdHVyYXRpb24gWzc6M10gKi8KKyNkZWZpbmUgUkVHX0NOVAkJCTB4MDUJLyogWSBjb250cmFzdCBbMzowXSAqLworI2RlZmluZSBSRUdfQlJUCQkJMHgwNgkvKiBZIGJyaWdodG5lc3MgKi8KKyNkZWZpbmUgUkVHX1NIQVJQCQkweDA3CS8qIHNoYXJwbmVzcyAqLworI2RlZmluZSBSRUdfV0JfQkxVRQkJMHgwQwkvKiBXQiBibHVlIHJhdGlvIFs1OjBdICovCisjZGVmaW5lIFJFR19XQl9SRUQJCTB4MEQJLyogV0IgcmVkIHJhdGlvIFs1OjBdICovCisjZGVmaW5lIFJFR19FWFAJCQkweDEwCS8qIGV4cG9zdXJlICovCisKKy8qIFdpbmRvdyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEhXU0JBU0UgMHgzOAorI2RlZmluZSBIV0VCQVNFIDB4M0EKKyNkZWZpbmUgVldTQkFTRSAweDA1CisjZGVmaW5lIFZXRUJBU0UgMHgwNgorCitzdHJ1Y3Qgb3Y2eDMwIHsKKwlpbnQgYXV0b19icnQ7CisJaW50IGF1dG9fZXhwOworCWludCBiYWNrbGlnaHQ7CisJaW50IGJhbmRmaWx0OworCWludCBtaXJyb3I7Cit9OworCitzdGF0aWMgc3RydWN0IG92Y2FtY2hpcF9yZWd2YWxzIHJlZ3ZhbHNfaW5pdF82eDMwW10gPSB7CisJeyAweDEyLCAweDgwIH0sIC8qIHJlc2V0ICovCisJeyAweDAwLCAweDFmIH0sIC8qIEdhaW4gKi8KKwl7IDB4MDEsIDB4OTkgfSwgLyogQmx1ZSBnYWluICovCisJeyAweDAyLCAweDdjIH0sIC8qIFJlZCBnYWluICovCisJeyAweDAzLCAweGMwIH0sIC8qIFNhdHVyYXRpb24gKi8KKwl7IDB4MDUsIDB4MGEgfSwgLyogQ29udHJhc3QgKi8KKwl7IDB4MDYsIDB4OTUgfSwgLyogQnJpZ2h0bmVzcyAqLworCXsgMHgwNywgMHgyZCB9LCAvKiBTaGFycG5lc3MgKi8KKwl7IDB4MGMsIDB4MjAgfSwKKwl7IDB4MGQsIDB4MjAgfSwKKwl7IDB4MGUsIDB4MjAgfSwKKwl7IDB4MGYsIDB4MDUgfSwKKwl7IDB4MTAsIDB4OWEgfSwgLyogImV4cG9zdXJlIGNoZWNrIiAqLworCXsgMHgxMSwgMHgwMCB9LCAvKiBQaXhlbCBjbG9jayA9IGZhc3Rlc3QgKi8KKwl7IDB4MTIsIDB4MjQgfSwgLyogRW5hYmxlIEFHQyBhbmQgQVdCICovCisJeyAweDEzLCAweDIxIH0sCisJeyAweDE0LCAweDgwIH0sCisJeyAweDE1LCAweDAxIH0sCisJeyAweDE2LCAweDAzIH0sCisJeyAweDE3LCAweDM4IH0sCisJeyAweDE4LCAweGVhIH0sCisJeyAweDE5LCAweDA0IH0sCisJeyAweDFhLCAweDkzIH0sCisJeyAweDFiLCAweDAwIH0sCisJeyAweDFlLCAweGM0IH0sCisJeyAweDFmLCAweDA0IH0sCisJeyAweDIwLCAweDIwIH0sCisJeyAweDIxLCAweDEwIH0sCisJeyAweDIyLCAweDg4IH0sCisJeyAweDIzLCAweGMwIH0sIC8qIENyeXN0YWwgY2lyY3VpdCBwb3dlciBsZXZlbCAqLworCXsgMHgyNSwgMHg5YSB9LCAvKiBJbmNyZWFzZSBBRUMgYmxhY2sgcGl4ZWwgcmF0aW8gKi8KKwl7IDB4MjYsIDB4YjIgfSwgLyogQkxDIGVuYWJsZSAqLworCXsgMHgyNywgMHhhMiB9LAorCXsgMHgyOCwgMHgwMCB9LAorCXsgMHgyOSwgMHgwMCB9LAorCXsgMHgyYSwgMHg4NCB9LCAvKiAoa2VlcCkgKi8KKwl7IDB4MmIsIDB4YTggfSwgLyogKGtlZXApICovCisJeyAweDJjLCAweGEwIH0sCisJeyAweDJkLCAweDk1IH0sCS8qIEVuYWJsZSBhdXRvLWJyaWdodG5lc3MgKi8KKwl7IDB4MmUsIDB4ODggfSwKKwl7IDB4MzMsIDB4MjYgfSwKKwl7IDB4MzQsIDB4MDMgfSwKKwl7IDB4MzYsIDB4OGYgfSwKKwl7IDB4MzcsIDB4ODAgfSwKKwl7IDB4MzgsIDB4ODMgfSwKKwl7IDB4MzksIDB4ODAgfSwKKwl7IDB4M2EsIDB4MGYgfSwKKwl7IDB4M2IsIDB4M2MgfSwKKwl7IDB4M2MsIDB4MWEgfSwKKwl7IDB4M2QsIDB4ODAgfSwKKwl7IDB4M2UsIDB4ODAgfSwKKwl7IDB4M2YsIDB4MGUgfSwKKwl7IDB4NDAsIDB4MDAgfSwgLyogV2hpdGUgYmFsICovCisJeyAweDQxLCAweDAwIH0sIC8qIFdoaXRlIGJhbCAqLworCXsgMHg0MiwgMHg4MCB9LAorCXsgMHg0MywgMHgzZiB9LCAvKiBXaGl0ZSBiYWwgKi8KKwl7IDB4NDQsIDB4ODAgfSwKKwl7IDB4NDUsIDB4MjAgfSwKKwl7IDB4NDYsIDB4MjAgfSwKKwl7IDB4NDcsIDB4ODAgfSwKKwl7IDB4NDgsIDB4N2YgfSwKKwl7IDB4NDksIDB4MDAgfSwKKwl7IDB4NGEsIDB4MDAgfSwKKwl7IDB4NGIsIDB4ODAgfSwKKwl7IDB4NGMsIDB4ZDAgfSwKKwl7IDB4NGQsIDB4MTAgfSwgLyogVSA9IDAuNTYzdSwgViA9IDAuNzE0diAqLworCXsgMHg0ZSwgMHg0MCB9LAorCXsgMHg0ZiwgMHgwNyB9LCAvKiBVViBhdmVyYWdlIG1vZGUsIGNvbG9yIGtpbGxlcjogc3Ryb25nZXN0ICovCisJeyAweDUwLCAweGZmIH0sCisJeyAweDU0LCAweDIzIH0sIC8qIE1heCBBR0MgZ2FpbjogMThkQiAqLworCXsgMHg1NSwgMHhmZiB9LAorCXsgMHg1NiwgMHgxMiB9LAorCXsgMHg1NywgMHg4MSB9LCAvKiAoZGVmYXVsdCkgKi8KKwl7IDB4NTgsIDB4NzUgfSwKKwl7IDB4NTksIDB4MDEgfSwgLyogQUdDIGRhcmsgY3VycmVudCBjb21wZW5zYXRpb246ICsxICovCisJeyAweDVhLCAweDJjIH0sCisJeyAweDViLCAweDBmIH0sIC8qIEFXQiBjaHJvbWluYW5jZSBsZXZlbHMgKi8KKwl7IDB4NWMsIDB4MTAgfSwKKwl7IDB4M2QsIDB4ODAgfSwKKwl7IDB4MjcsIDB4YTYgfSwKKwkvKiBUb2dnbGUgQVdCIG9mZiBhbmQgb24gKi8KKwl7IDB4MTIsIDB4MjAgfSwKKwl7IDB4MTIsIDB4MjQgfSwKKworCXsgMHhmZiwgMHhmZiB9LAkvKiBFTkQgTUFSS0VSICovCit9OworCisvKiBUaGlzIGluaXRpYWxpemVzIHRoZSBPVjZ4MzAgY2FtZXJhIGNoaXAgYW5kIHJlbGV2YW50IHZhcmlhYmxlcy4gKi8KK3N0YXRpYyBpbnQgb3Y2eDMwX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IG92NngzMCAqczsKKwlpbnQgcmM7CisKKwlEREVCVUcoNCwgJmMtPmRldiwgImVudGVyZWQiKTsKKworCXJjID0gb3Zfd3JpdGVfcmVndmFscyhjLCByZWd2YWxzX2luaXRfNngzMCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJb3YtPnNwcml2ID0gcyA9IGttYWxsb2Moc2l6ZW9mICpzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChzLCAwLCBzaXplb2YgKnMpOworCisJcy0+YXV0b19icnQgPSAxOworCXMtPmF1dG9fZXhwID0gMTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvdjZ4MzBfZnJlZShzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKworCWtmcmVlKG92LT5zcHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y2eDMwX3NldF9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkJICAgICAgc3RydWN0IG92Y2FtY2hpcF9jb250cm9sICpjdGwpCit7CisJc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IG92NngzMCAqcyA9IG92LT5zcHJpdjsKKwlpbnQgcmM7CisJaW50IHYgPSBjdGwtPnZhbHVlOworCisJc3dpdGNoIChjdGwtPmlkKSB7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0NPTlQ6CisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCBSRUdfQ05ULCB2ID4+IDEyLCAweDBmKTsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0JSSUdIVDoKKwkJcmMgPSBvdl93cml0ZShjLCBSRUdfQlJULCB2ID4+IDgpOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfU0FUOgorCQlyYyA9IG92X3dyaXRlKGMsIFJFR19TQVQsIHYgPj4gOCk7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9IVUU6CisJCXJjID0gb3Zfd3JpdGUoYywgUkVHX1JFRCwgMHhGRiAtICh2ID4+IDgpKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gb3Zfd3JpdGUoYywgUkVHX0JMVUUsIHYgPj4gOCk7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9FWFA6CisJCXJjID0gb3Zfd3JpdGUoYywgUkVHX0VYUCwgdik7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9GUkVROgorCXsKKwkJaW50IHNpeHR5ID0gKHYgPT0gNjApOworCisJCXJjID0gb3Zfd3JpdGUoYywgMHgyYiwgc2l4dHk/MHhhODoweDI4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gb3Zfd3JpdGUoYywgMHgyYSwgc2l4dHk/MHg4NDoweGE0KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgT1ZDQU1DSElQX0NJRF9CQU5ERklMVDoKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MmQsIHY/MHgwNDoweDAwLCAweDA0KTsKKwkJcy0+YmFuZGZpbHQgPSB2OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0JSSUdIVDoKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MmQsIHY/MHgxMDoweDAwLCAweDEwKTsKKwkJcy0+YXV0b19icnQgPSB2OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0VYUDoKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MjgsIHY/MHgwMDoweDEwLCAweDEwKTsKKwkJcy0+YXV0b19leHAgPSB2OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQkFDS0xJR0hUOgorCXsKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4NGUsIHY/MHg4MDoweDYwLCAweGUwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDI5LCB2PzB4MDg6MHgwMCwgMHgwOCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKworCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyOCwgdj8weDAyOjB4MDAsIDB4MDIpOworCQlzLT5iYWNrbGlnaHQgPSB2OworCQlicmVhazsKKwl9CisJY2FzZSBPVkNBTUNISVBfQ0lEX01JUlJPUjoKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MTIsIHY/MHg0MDoweDAwLCAweDQwKTsKKwkJcy0+bWlycm9yID0gdjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRERFQlVHKDIsICZjLT5kZXYsICJjb250cm9sIG5vdCBzdXBwb3J0ZWQ6ICVkIiwgY3RsLT5pZCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCitvdXQ6CisJRERFQlVHKDMsICZjLT5kZXYsICJpZD0lZCwgYXJnPSVkLCByYz0lZCIsIGN0bC0+aWQsIHYsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgb3Y2eDMwX2dldF9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkJICAgICAgc3RydWN0IG92Y2FtY2hpcF9jb250cm9sICpjdGwpCit7CisJc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IG92NngzMCAqcyA9IG92LT5zcHJpdjsKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGNoYXIgdmFsID0gMDsKKworCXN3aXRjaCAoY3RsLT5pZCkgeworCWNhc2UgT1ZDQU1DSElQX0NJRF9DT05UOgorCQlyYyA9IG92X3JlYWQoYywgUkVHX0NOVCwgJnZhbCk7CisJCWN0bC0+dmFsdWUgPSAodmFsICYgMHgwZikgPDwgMTI7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9CUklHSFQ6CisJCXJjID0gb3ZfcmVhZChjLCBSRUdfQlJULCAmdmFsKTsKKwkJY3RsLT52YWx1ZSA9IHZhbCA8PCA4OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfU0FUOgorCQlyYyA9IG92X3JlYWQoYywgUkVHX1NBVCwgJnZhbCk7CisJCWN0bC0+dmFsdWUgPSB2YWwgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0hVRToKKwkJcmMgPSBvdl9yZWFkKGMsIFJFR19CTFVFLCAmdmFsKTsKKwkJY3RsLT52YWx1ZSA9IHZhbCA8PCA4OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfRVhQOgorCQlyYyA9IG92X3JlYWQoYywgUkVHX0VYUCwgJnZhbCk7CisJCWN0bC0+dmFsdWUgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9CQU5ERklMVDoKKwkJY3RsLT52YWx1ZSA9IHMtPmJhbmRmaWx0OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0JSSUdIVDoKKwkJY3RsLT52YWx1ZSA9IHMtPmF1dG9fYnJ0OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0VYUDoKKwkJY3RsLT52YWx1ZSA9IHMtPmF1dG9fZXhwOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQkFDS0xJR0hUOgorCQljdGwtPnZhbHVlID0gcy0+YmFja2xpZ2h0OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfTUlSUk9SOgorCQljdGwtPnZhbHVlID0gcy0+bWlycm9yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbnRyb2wgbm90IHN1cHBvcnRlZDogJWQiLCBjdGwtPmlkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlEREVCVUcoMywgJmMtPmRldiwgImlkPSVkLCBhcmc9JWQsIHJjPSVkIiwgY3RsLT5pZCwgY3RsLT52YWx1ZSwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvdjZ4MzBfbW9kZV9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3Qgb3ZjYW1jaGlwX3dpbmRvdyAqd2luKQoreworCS8qKioqKioqKiBRQ0lGLXNwZWNpZmljIHJlZ3MgKioqKioqKiovCisKKwlvdl93cml0ZV9tYXNrKGMsIDB4MTQsIHdpbi0+cXVhcnRlcj8weDIwOjB4MDAsIDB4MjApOworCisJLyoqKioqKioqIFBhbGV0dGUtc3BlY2lmaWMgcmVncyAqKioqKioqKi8KKworCWlmICh3aW4tPmZvcm1hdCA9PSBWSURFT19QQUxFVFRFX0dSRVkpIHsKKwkJaWYgKGMtPmFkYXB0ZXItPmlkID09IChJMkNfQUxHT19TTUJVUyB8IEkyQ19IV19TTUJVU19PVjUxOCkpIHsKKwkJCS8qIERvIG5vdGhpbmcgLSB3ZSdyZSBhbHJlYWR5IGluIDgtYml0IG1vZGUgKi8KKwkJfSBlbHNlIHsKKwkJCW92X3dyaXRlX21hc2soYywgMHgxMywgMHgyMCwgMHgyMCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGUgT1Y1MTggbmVlZHMgc3BlY2lhbCB0cmVhdG1lbnQuIEFsdGhvdWdoIGJvdGggdGhlIE9WNTE4CisJCSAqIGFuZCB0aGUgT1Y2NjMwIHN1cHBvcnQgYSAxNi1iaXQgdmlkZW8gYnVzLCBvbmx5IHRoZSA4IGJpdCBZCisJCSAqIGJ1cyBpcyBhY3R1YWxseSB1c2VkLiBUaGUgVVYgYnVzIGlzIHRpZWQgdG8gZ3JvdW5kLgorCQkgKiBUaGVyZWZvcmUsIHRoZSBPVjY2MzAgbmVlZHMgdG8gYmUgaW4gOC1iaXQgbXVsdGlwbGV4ZWQKKwkJICogb3V0cHV0IG1vZGUgKi8KKworCQlpZiAoYy0+YWRhcHRlci0+aWQgPT0gKEkyQ19BTEdPX1NNQlVTIHwgSTJDX0hXX1NNQlVTX09WNTE4KSkgeworCQkJLyogRG8gbm90aGluZyAtIHdlIHdhbnQgdG8gc3RheSBpbiA4LWJpdCBtb2RlICovCisJCQkvKiBXYXJuaW5nOiBNZXNzaW5nIHdpdGggcmVnIDB4MTMgYnJlYWtzIE9WNTE4IGNvbG9yICovCisJCX0gZWxzZSB7CisJCQlvdl93cml0ZV9tYXNrKGMsIDB4MTMsIDB4MDAsIDB4MjApOworCQl9CisJfQorCisJLyoqKioqKioqIENsb2NrIHByb2dyYW1taW5nICoqKioqKioqLworCisJb3Zfd3JpdGUoYywgMHgxMSwgd2luLT5jbG9ja2Rpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjZ4MzBfc2V0X3dpbmRvdyhzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IG92Y2FtY2hpcF93aW5kb3cgKndpbikKK3sKKwlpbnQgcmV0LCBod3NjYWxlLCB2d3NjYWxlOworCisJcmV0ID0gb3Y2eDMwX21vZGVfaW5pdChjLCB3aW4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHdpbi0+cXVhcnRlcikgeworCQlod3NjYWxlID0gMDsKKwkJdndzY2FsZSA9IDA7CisJfSBlbHNlIHsKKwkJaHdzY2FsZSA9IDE7CisJCXZ3c2NhbGUgPSAxOwkvKiBUaGUgZGF0YXNoZWV0IHNheXMgMDsgaXQncyB3cm9uZyAqLworCX0KKworCW92X3dyaXRlKGMsIDB4MTcsIEhXU0JBU0UgKyAod2luLT54ID4+IGh3c2NhbGUpKTsKKwlvdl93cml0ZShjLCAweDE4LCBIV0VCQVNFICsgKCh3aW4tPnggKyB3aW4tPndpZHRoKSA+PiBod3NjYWxlKSk7CisJb3Zfd3JpdGUoYywgMHgxOSwgVldTQkFTRSArICh3aW4tPnkgPj4gdndzY2FsZSkpOworCW92X3dyaXRlKGMsIDB4MWEsIFZXRUJBU0UgKyAoKHdpbi0+eSArIHdpbi0+aGVpZ2h0KSA+PiB2d3NjYWxlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjZ4MzBfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPVkNBTUNISVBfQ01EX1NfQ1RSTDoKKwkJcmV0dXJuIG92NngzMF9zZXRfY29udHJvbChjLCBhcmcpOworCWNhc2UgT1ZDQU1DSElQX0NNRF9HX0NUUkw6CisJCXJldHVybiBvdjZ4MzBfZ2V0X2NvbnRyb2woYywgYXJnKTsKKwljYXNlIE9WQ0FNQ0hJUF9DTURfU19NT0RFOgorCQlyZXR1cm4gb3Y2eDMwX3NldF93aW5kb3coYywgYXJnKTsKKwlkZWZhdWx0OgorCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbW1hbmQgbm90IHN1cHBvcnRlZDogJWQiLCBjbWQpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y2eDMwX29wcyA9IHsKKwkuaW5pdCAgICA9CW92NngzMF9pbml0LAorCS5mcmVlICAgID0Jb3Y2eDMwX2ZyZWUsCisJLmNvbW1hbmQgPQlvdjZ4MzBfY29tbWFuZCwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjc2YmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NzZiZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YmJkYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjc2YmUuYwpAQCAtMCwwICsxLDMwMyBAQAorLyogT21uaVZpc2lvbiBPVjc2QkUgQ2FtZXJhIENoaXAgU3VwcG9ydCBDb2RlCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgTWFyayBNY0NsZWxsYW5kIDxtYXJrQGFscGhhLmR5bmRucy5vcmc+CisgKiBodHRwOi8vYWxwaGEuZHluZG5zLm9yZy9vdjUxMS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCBpcyBleHByZXNzZWQgb3IgaW1wbGllZC4KKyAqLworCisjZGVmaW5lIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAib3ZjYW1jaGlwX3ByaXYuaCIKKworLyogT1Y3NjEwIHJlZ2lzdGVyczogU2luY2UgdGhlIE9WNzZCRSBpcyB1bmRvY3VtZW50ZWQsIHdlJ2xsIHNldHRsZSBmb3IgdGhlc2UKKyAqIGZvciBub3cuICovCisjZGVmaW5lIFJFR19HQUlOCQkweDAwCS8qIGdhaW4gWzU6MF0gKi8KKyNkZWZpbmUgUkVHX0JMVUUJCTB4MDEJLyogYmx1ZSBjaGFubmVsIGJhbGFuY2UgKi8KKyNkZWZpbmUgUkVHX1JFRAkJCTB4MDIJLyogcmVkIGNoYW5uZWwgYmFsYW5jZSAqLworI2RlZmluZSBSRUdfU0FUCQkJMHgwMwkvKiBzYXR1cmF0aW9uICovCisjZGVmaW5lIFJFR19DTlQJCQkweDA1CS8qIFkgY29udHJhc3QgKi8KKyNkZWZpbmUgUkVHX0JSVAkJCTB4MDYJLyogWSBicmlnaHRuZXNzICovCisjZGVmaW5lIFJFR19CTFVFX0JJQVMJCTB4MEMJLyogYmx1ZSBjaGFubmVsIGJpYXMgWzU6MF0gKi8KKyNkZWZpbmUgUkVHX1JFRF9CSUFTCQkweDBECS8qIHJlZCBjaGFubmVsIGJpYXMgWzU6MF0gKi8KKyNkZWZpbmUgUkVHX0dBTU1BX0NPRUZGCQkweDBFCS8qIGdhbW1hIHNldHRpbmdzICovCisjZGVmaW5lIFJFR19XQl9SQU5HRQkJMHgwRgkvKiBBRUMvQUxDL1MtQVdCIHNldHRpbmdzICovCisjZGVmaW5lIFJFR19FWFAJCQkweDEwCS8qIG1hbnVhbCBleHBvc3VyZSBzZXR0aW5nICovCisjZGVmaW5lIFJFR19DTE9DSwkJMHgxMQkvKiBwb2xhcml0eS9jbG9jayBwcmVzY2FsZXIgKi8KKyNkZWZpbmUgUkVHX0ZJRUxEX0RJVklERQkweDE2CS8qIGZpZWxkIGludGVydmFsL21vZGUgc2V0dGluZ3MgKi8KKyNkZWZpbmUgUkVHX0hXSU5fU1RBUlQJCTB4MTcJLyogaG9yaXpvbnRhbCB3aW5kb3cgc3RhcnQgKi8KKyNkZWZpbmUgUkVHX0hXSU5fRU5ECQkweDE4CS8qIGhvcml6b250YWwgd2luZG93IGVuZCAqLworI2RlZmluZSBSRUdfVldJTl9TVEFSVAkJMHgxOQkvKiB2ZXJ0aWNhbCB3aW5kb3cgc3RhcnQgKi8KKyNkZWZpbmUgUkVHX1ZXSU5fRU5ECQkweDFBCS8qIHZlcnRpY2FsIHdpbmRvdyBlbmQgKi8KKyNkZWZpbmUgUkVHX1BJWEVMX1NISUZUICAgCTB4MUIJLyogcGl4ZWwgc2hpZnQgKi8KKyNkZWZpbmUgUkVHX1lPRkZTRVQJCTB4MjEJLyogWSBjaGFubmVsIG9mZnNldCAqLworI2RlZmluZSBSRUdfVU9GRlNFVAkJMHgyMgkvKiBVIGNoYW5uZWwgb2Zmc2V0ICovCisjZGVmaW5lIFJFR19FQ1cJCQkweDI0CS8qIGV4cG9zdXJlIHdoaXRlIGxldmVsIGZvciBBRUMgKi8KKyNkZWZpbmUgUkVHX0VDQgkJCTB4MjUJLyogZXhwb3N1cmUgYmxhY2sgbGV2ZWwgZm9yIEFFQyAqLworI2RlZmluZSBSRUdfRlJBTUVSQVRFX0gJCTB4MkEJLyogZnJhbWUgcmF0ZSBNU0IgKyBtaXNjICovCisjZGVmaW5lIFJFR19GUkFNRVJBVEVfTAkJMHgyQgkvKiBmcmFtZSByYXRlIExTQiAqLworI2RlZmluZSBSRUdfQUxDCQkJMHgyQwkvKiBBdXRvIExldmVsIENvbnRyb2wgc2V0dGluZ3MgKi8KKyNkZWZpbmUgUkVHX1ZPRkZTRVQJCTB4MkUJLyogViBjaGFubmVsIG9mZnNldCBhZGp1c3RtZW50ICovCisjZGVmaW5lIFJFR19BUlJBWV9CSUFTCQkweDJGCS8qIGFycmF5IGJpYXMgLS0gZG9uJ3QgY2hhbmdlICovCisjZGVmaW5lIFJFR19ZR0FNTUEJCTB4MzMJLyogbWlzYyBnYW1tYSBzZXR0aW5ncyBbNzo2XSAqLworI2RlZmluZSBSRUdfQklBU19BREpVU1QJCTB4MzQJLyogbWlzYyBiaWFzIHNldHRpbmdzICovCisKKy8qIFdpbmRvdyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEhXU0JBU0UgMHgzOAorI2RlZmluZSBIV0VCQVNFIDB4M2EKKyNkZWZpbmUgVldTQkFTRSAweDA1CisjZGVmaW5lIFZXRUJBU0UgMHgwNQorCitzdHJ1Y3Qgb3Y3NmJlIHsKKwlpbnQgYXV0b19icnQ7CisJaW50IGF1dG9fZXhwOworCWludCBiYW5kZmlsdDsKKwlpbnQgbWlycm9yOworfTsKKworLyogTk9URTogVGhlc2UgYXJlIHRoZSBzYW1lIGFzIHRoZSA3eDEwIHNldHRpbmdzLCBidXQgc2hvdWxkIGV2ZW50dWFsbHkgYmUKKyAqIG9wdGltaXplZCBmb3IgdGhlIE9WNzZCRSAqLworc3RhdGljIHN0cnVjdCBvdmNhbWNoaXBfcmVndmFscyByZWd2YWxzX2luaXRfNzZiZVtdID0geworCXsgMHgxMCwgMHhmZiB9LAorCXsgMHgxNiwgMHgwMyB9LAorCXsgMHgyOCwgMHgyNCB9LAorCXsgMHgyYiwgMHhhYyB9LAorCXsgMHgxMiwgMHgwMCB9LAorCXsgMHgzOCwgMHg4MSB9LAorCXsgMHgyOCwgMHgyNCB9LAkvKiAwYyAqLworCXsgMHgwZiwgMHg4NSB9LAkvKiBsZydzIHNldHRpbmcgKi8KKwl7IDB4MTUsIDB4MDEgfSwKKwl7IDB4MjAsIDB4MWMgfSwKKwl7IDB4MjMsIDB4MmEgfSwKKwl7IDB4MjQsIDB4MTAgfSwKKwl7IDB4MjUsIDB4OGEgfSwKKwl7IDB4MjYsIDB4YTIgfSwKKwl7IDB4MjcsIDB4YzIgfSwKKwl7IDB4MmEsIDB4MDQgfSwKKwl7IDB4MmMsIDB4ZmUgfSwKKwl7IDB4MmQsIDB4OTMgfSwKKwl7IDB4MzAsIDB4NzEgfSwKKwl7IDB4MzEsIDB4NjAgfSwKKwl7IDB4MzIsIDB4MjYgfSwKKwl7IDB4MzMsIDB4MjAgfSwKKwl7IDB4MzQsIDB4NDggfSwKKwl7IDB4MTIsIDB4MjQgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MGMsIDB4MjQgfSwKKwl7IDB4MGQsIDB4MjQgfSwKKwl7IDB4ZmYsIDB4ZmYgfSwJLyogRU5EIE1BUktFUiAqLworfTsKKworLyogVGhpcyBpbml0aWFsaXplcyB0aGUgT1Y3NmJlIGNhbWVyYSBjaGlwIGFuZCByZWxldmFudCB2YXJpYWJsZXMuICovCitzdGF0aWMgaW50IG92NzZiZV9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCBvdjc2YmUgKnM7CisJaW50IHJjOworCisJRERFQlVHKDQsICZjLT5kZXYsICJlbnRlcmVkIik7CisKKwlyYyA9IG92X3dyaXRlX3JlZ3ZhbHMoYywgcmVndmFsc19pbml0Xzc2YmUpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW92LT5zcHJpdiA9IHMgPSBrbWFsbG9jKHNpemVvZiAqcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocywgMCwgc2l6ZW9mICpzKTsKKworCXMtPmF1dG9fYnJ0ID0gMTsKKwlzLT5hdXRvX2V4cCA9IDE7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgb3Y3NmJlX2ZyZWUoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisKKwlrZnJlZShvdi0+c3ByaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NzZiZV9zZXRfY29udHJvbChzdHJ1Y3QgaTJjX2NsaWVudCAqYywKKwkJCSAgICAgIHN0cnVjdCBvdmNhbWNoaXBfY29udHJvbCAqY3RsKQoreworCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCBvdjc2YmUgKnMgPSBvdi0+c3ByaXY7CisJaW50IHJjOworCWludCB2ID0gY3RsLT52YWx1ZTsKKworCXN3aXRjaCAoY3RsLT5pZCkgeworCWNhc2UgT1ZDQU1DSElQX0NJRF9CUklHSFQ6CisJCXJjID0gb3Zfd3JpdGUoYywgUkVHX0JSVCwgdiA+PiA4KTsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX1NBVDoKKwkJcmMgPSBvdl93cml0ZShjLCBSRUdfU0FULCB2ID4+IDgpOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfRVhQOgorCQlyYyA9IG92X3dyaXRlKGMsIFJFR19FWFAsIHYpOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfRlJFUToKKwl7CisJCWludCBzaXh0eSA9ICh2ID09IDYwKTsKKworCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyYSwgc2l4dHk/MHgwMDoweDgwLCAweDgwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gb3Zfd3JpdGUoYywgMHgyYiwgc2l4dHk/MHgwMDoweGFjKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDc2LCAweDAxLCAweDAxKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgT1ZDQU1DSElQX0NJRF9CQU5ERklMVDoKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MmQsIHY/MHgwNDoweDAwLCAweDA0KTsKKwkJcy0+YmFuZGZpbHQgPSB2OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0JSSUdIVDoKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MmQsIHY/MHgxMDoweDAwLCAweDEwKTsKKwkJcy0+YXV0b19icnQgPSB2OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0VYUDoKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MTMsIHY/MHgwMToweDAwLCAweDAxKTsKKwkJcy0+YXV0b19leHAgPSB2OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfTUlSUk9SOgorCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgxMiwgdj8weDQwOjB4MDAsIDB4NDApOworCQlzLT5taXJyb3IgPSB2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbnRyb2wgbm90IHN1cHBvcnRlZDogJWQiLCBjdGwtPmlkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKK291dDoKKwlEREVCVUcoMywgJmMtPmRldiwgImlkPSVkLCBhcmc9JWQsIHJjPSVkIiwgY3RsLT5pZCwgdiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvdjc2YmVfZ2V0X2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKmMsCisJCQkgICAgICBzdHJ1Y3Qgb3ZjYW1jaGlwX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlzdHJ1Y3Qgb3Y3NmJlICpzID0gb3YtPnNwcml2OworCWludCByYyA9IDA7CisJdW5zaWduZWQgY2hhciB2YWwgPSAwOworCisJc3dpdGNoIChjdGwtPmlkKSB7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0JSSUdIVDoKKwkJcmMgPSBvdl9yZWFkKGMsIFJFR19CUlQsICZ2YWwpOworCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9TQVQ6CisJCXJjID0gb3ZfcmVhZChjLCBSRUdfU0FULCAmdmFsKTsKKwkJY3RsLT52YWx1ZSA9IHZhbCA8PCA4OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfRVhQOgorCQlyYyA9IG92X3JlYWQoYywgUkVHX0VYUCwgJnZhbCk7CisJCWN0bC0+dmFsdWUgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9CQU5ERklMVDoKKwkJY3RsLT52YWx1ZSA9IHMtPmJhbmRmaWx0OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0JSSUdIVDoKKwkJY3RsLT52YWx1ZSA9IHMtPmF1dG9fYnJ0OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0VYUDoKKwkJY3RsLT52YWx1ZSA9IHMtPmF1dG9fZXhwOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfTUlSUk9SOgorCQljdGwtPnZhbHVlID0gcy0+bWlycm9yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbnRyb2wgbm90IHN1cHBvcnRlZDogJWQiLCBjdGwtPmlkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlEREVCVUcoMywgJmMtPmRldiwgImlkPSVkLCBhcmc9JWQsIHJjPSVkIiwgY3RsLT5pZCwgY3RsLT52YWx1ZSwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvdjc2YmVfbW9kZV9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3Qgb3ZjYW1jaGlwX3dpbmRvdyAqd2luKQoreworCWludCBxdmdhID0gd2luLT5xdWFydGVyOworCisJLyoqKioqKioqIFFWR0Etc3BlY2lmaWMgcmVncyAqKioqKioqKi8KKworCW92X3dyaXRlKGMsIDB4MTQsIHF2Z2E/MHhhNDoweDg0KTsKKworCS8qKioqKioqKiBQYWxldHRlLXNwZWNpZmljIHJlZ3MgKioqKioqKiovCisKKwlpZiAod2luLT5mb3JtYXQgPT0gVklERU9fUEFMRVRURV9HUkVZKSB7CisJCW92X3dyaXRlX21hc2soYywgMHgwZSwgMHg0MCwgMHg0MCk7CisJCW92X3dyaXRlX21hc2soYywgMHgxMywgMHgyMCwgMHgyMCk7CisJfSBlbHNlIHsKKwkJb3Zfd3JpdGVfbWFzayhjLCAweDBlLCAweDAwLCAweDQwKTsKKwkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDAwLCAweDIwKTsKKwl9CisKKwkvKioqKioqKiogQ2xvY2sgcHJvZ3JhbW1pbmcgKioqKioqKiovCisKKwlvdl93cml0ZShjLCAweDExLCB3aW4tPmNsb2NrZGl2KTsKKworCS8qKioqKioqKiBSZXNvbHV0aW9uLXNwZWNpZmljICoqKioqKioqLworCisJaWYgKHdpbi0+d2lkdGggPT0gNjQwICYmIHdpbi0+aGVpZ2h0ID09IDQ4MCkKKwkJb3Zfd3JpdGUoYywgMHgzNSwgMHg5ZSk7CisJZWxzZQorCQlvdl93cml0ZShjLCAweDM1LCAweDFlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NzZiZV9zZXRfd2luZG93KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3Qgb3ZjYW1jaGlwX3dpbmRvdyAqd2luKQoreworCWludCByZXQsIGh3c2NhbGUsIHZ3c2NhbGU7CisKKwlyZXQgPSBvdjc2YmVfbW9kZV9pbml0KGMsIHdpbik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAod2luLT5xdWFydGVyKSB7CisJCWh3c2NhbGUgPSAxOworCQl2d3NjYWxlID0gMDsKKwl9IGVsc2UgeworCQlod3NjYWxlID0gMjsKKwkJdndzY2FsZSA9IDE7CisJfQorCisJb3Zfd3JpdGUoYywgMHgxNywgSFdTQkFTRSArICh3aW4tPnggPj4gaHdzY2FsZSkpOworCW92X3dyaXRlKGMsIDB4MTgsIEhXRUJBU0UgKyAoKHdpbi0+eCArIHdpbi0+d2lkdGgpID4+IGh3c2NhbGUpKTsKKwlvdl93cml0ZShjLCAweDE5LCBWV1NCQVNFICsgKHdpbi0+eSA+PiB2d3NjYWxlKSk7CisJb3Zfd3JpdGUoYywgMHgxYSwgVldFQkFTRSArICgod2luLT55ICsgd2luLT5oZWlnaHQpID4+IHZ3c2NhbGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NzZiZV9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9WQ0FNQ0hJUF9DTURfU19DVFJMOgorCQlyZXR1cm4gb3Y3NmJlX3NldF9jb250cm9sKGMsIGFyZyk7CisJY2FzZSBPVkNBTUNISVBfQ01EX0dfQ1RSTDoKKwkJcmV0dXJuIG92NzZiZV9nZXRfY29udHJvbChjLCBhcmcpOworCWNhc2UgT1ZDQU1DSElQX0NNRF9TX01PREU6CisJCXJldHVybiBvdjc2YmVfc2V0X3dpbmRvdyhjLCBhcmcpOworCWRlZmF1bHQ6CisJCURERUJVRygyLCAmYy0+ZGV2LCAiY29tbWFuZCBub3Qgc3VwcG9ydGVkOiAlZCIsIGNtZCk7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCitzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjc2YmVfb3BzID0geworCS5pbml0ICAgID0Jb3Y3NmJlX2luaXQsCisJLmZyZWUgICAgPQlvdjc2YmVfZnJlZSwKKwkuY29tbWFuZCA9CW92NzZiZV9jb21tYW5kLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292N3gxMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y3eDEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzODNkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292N3gxMC5jCkBAIC0wLDAgKzEsMzM1IEBACisvKiBPbW5pVmlzaW9uIE9WNzYxMC9PVjcxMTAgQ2FtZXJhIENoaXAgU3VwcG9ydCBDb2RlCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgTWFyayBNY0NsZWxsYW5kIDxtYXJrQGFscGhhLmR5bmRucy5vcmc+CisgKiBodHRwOi8vYWxwaGEuZHluZG5zLm9yZy9vdjUxMS8KKyAqCisgKiBDb2xvciBmaXhlcyBieSBieSBPcmlvbiBTa3kgTGF3bG9yIDxvbGF3bG9yQGFjbS5vcmc+ICgyLzI2LzIwMDApCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gTk8gV0FSUkFOVFkgT0YgQU5ZIEtJTkQgaXMgZXhwcmVzc2VkIG9yIGltcGxpZWQuCisgKi8KKworI2RlZmluZSBERUJVRworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgIm92Y2FtY2hpcF9wcml2LmgiCisKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBSRUdfR0FJTgkJMHgwMAkvKiBnYWluIFs1OjBdICovCisjZGVmaW5lIFJFR19CTFVFCQkweDAxCS8qIGJsdWUgY2hhbm5lbCBiYWxhbmNlICovCisjZGVmaW5lIFJFR19SRUQJCQkweDAyCS8qIHJlZCBjaGFubmVsIGJhbGFuY2UgKi8KKyNkZWZpbmUgUkVHX1NBVAkJCTB4MDMJLyogc2F0dXJhdGlvbiAqLworI2RlZmluZSBSRUdfQ05UCQkJMHgwNQkvKiBZIGNvbnRyYXN0ICovCisjZGVmaW5lIFJFR19CUlQJCQkweDA2CS8qIFkgYnJpZ2h0bmVzcyAqLworI2RlZmluZSBSRUdfQkxVRV9CSUFTCQkweDBDCS8qIGJsdWUgY2hhbm5lbCBiaWFzIFs1OjBdICovCisjZGVmaW5lIFJFR19SRURfQklBUwkJMHgwRAkvKiByZWQgY2hhbm5lbCBiaWFzIFs1OjBdICovCisjZGVmaW5lIFJFR19HQU1NQV9DT0VGRgkJMHgwRQkvKiBnYW1tYSBzZXR0aW5ncyAqLworI2RlZmluZSBSRUdfV0JfUkFOR0UJCTB4MEYJLyogQUVDL0FMQy9TLUFXQiBzZXR0aW5ncyAqLworI2RlZmluZSBSRUdfRVhQCQkJMHgxMAkvKiBtYW51YWwgZXhwb3N1cmUgc2V0dGluZyAqLworI2RlZmluZSBSRUdfQ0xPQ0sJCTB4MTEJLyogcG9sYXJpdHkvY2xvY2sgcHJlc2NhbGVyICovCisjZGVmaW5lIFJFR19GSUVMRF9ESVZJREUJMHgxNgkvKiBmaWVsZCBpbnRlcnZhbC9tb2RlIHNldHRpbmdzICovCisjZGVmaW5lIFJFR19IV0lOX1NUQVJUCQkweDE3CS8qIGhvcml6b250YWwgd2luZG93IHN0YXJ0ICovCisjZGVmaW5lIFJFR19IV0lOX0VORAkJMHgxOAkvKiBob3Jpem9udGFsIHdpbmRvdyBlbmQgKi8KKyNkZWZpbmUgUkVHX1ZXSU5fU1RBUlQJCTB4MTkJLyogdmVydGljYWwgd2luZG93IHN0YXJ0ICovCisjZGVmaW5lIFJFR19WV0lOX0VORAkJMHgxQQkvKiB2ZXJ0aWNhbCB3aW5kb3cgZW5kICovCisjZGVmaW5lIFJFR19QSVhFTF9TSElGVCAgIAkweDFCCS8qIHBpeGVsIHNoaWZ0ICovCisjZGVmaW5lIFJFR19ZT0ZGU0VUCQkweDIxCS8qIFkgY2hhbm5lbCBvZmZzZXQgKi8KKyNkZWZpbmUgUkVHX1VPRkZTRVQJCTB4MjIJLyogVSBjaGFubmVsIG9mZnNldCAqLworI2RlZmluZSBSRUdfRUNXCQkJMHgyNAkvKiBleHBvc3VyZSB3aGl0ZSBsZXZlbCBmb3IgQUVDICovCisjZGVmaW5lIFJFR19FQ0IJCQkweDI1CS8qIGV4cG9zdXJlIGJsYWNrIGxldmVsIGZvciBBRUMgKi8KKyNkZWZpbmUgUkVHX0ZSQU1FUkFURV9ICQkweDJBCS8qIGZyYW1lIHJhdGUgTVNCICsgbWlzYyAqLworI2RlZmluZSBSRUdfRlJBTUVSQVRFX0wJCTB4MkIJLyogZnJhbWUgcmF0ZSBMU0IgKi8KKyNkZWZpbmUgUkVHX0FMQwkJCTB4MkMJLyogQXV0byBMZXZlbCBDb250cm9sIHNldHRpbmdzICovCisjZGVmaW5lIFJFR19WT0ZGU0VUCQkweDJFCS8qIFYgY2hhbm5lbCBvZmZzZXQgYWRqdXN0bWVudCAqLworI2RlZmluZSBSRUdfQVJSQVlfQklBUwkJMHgyRgkvKiBhcnJheSBiaWFzIC0tIGRvbid0IGNoYW5nZSAqLworI2RlZmluZSBSRUdfWUdBTU1BCQkweDMzCS8qIG1pc2MgZ2FtbWEgc2V0dGluZ3MgWzc6Nl0gKi8KKyNkZWZpbmUgUkVHX0JJQVNfQURKVVNUCQkweDM0CS8qIG1pc2MgYmlhcyBzZXR0aW5ncyAqLworCisvKiBXaW5kb3cgcGFyYW1ldGVycyAqLworI2RlZmluZSBIV1NCQVNFIDB4MzgKKyNkZWZpbmUgSFdFQkFTRSAweDNhCisjZGVmaW5lIFZXU0JBU0UgMHgwNQorI2RlZmluZSBWV0VCQVNFIDB4MDUKKworc3RydWN0IG92N3gxMCB7CisJaW50IGF1dG9fYnJ0OworCWludCBhdXRvX2V4cDsKKwlpbnQgYmFuZGZpbHQ7CisJaW50IG1pcnJvcjsKK307CisKKy8qIExhd3JlbmNlIEdsYWlzdGVyIDxsZ0BqZm0uYmMuY2E+IHJlcG9ydHM6CisgKgorICogUmVnaXN0ZXIgMHgwZiBpbiB0aGUgNzYxMCBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOgorICoKKyAqIDB4ODUgKEFFQyBtZXRob2QgMSk6IEJlc3Qgb3ZlcmFsbCwgZ29vZCBjb250cmFzdCByYW5nZQorICogMHg0NSAoQUVDIG1ldGhvZCAyKTogVmVyeSBvdmVyZXhwb3NlZAorICogMHhhNSAoc3BlYyBzaGVldCBkZWZhdWx0KTogT2ssIGJ1dCB0aGUgYmxhY2sgbGV2ZWwgaXMKKyAqCXNoaWZ0ZWQgcmVzdWx0aW5nIGluIGxvc3Mgb2YgY29udHJhc3QKKyAqIDB4MDUgKG9sZCBkcml2ZXIgc2V0dGluZyk6IHZlcnkgb3ZlcmV4cG9zZWQsIHRvbyBtdWNoCisgKgljb250cmFzdAorICovCitzdGF0aWMgc3RydWN0IG92Y2FtY2hpcF9yZWd2YWxzIHJlZ3ZhbHNfaW5pdF83eDEwW10gPSB7CisJeyAweDEwLCAweGZmIH0sCisJeyAweDE2LCAweDAzIH0sCisJeyAweDI4LCAweDI0IH0sCisJeyAweDJiLCAweGFjIH0sCisJeyAweDEyLCAweDAwIH0sCisJeyAweDM4LCAweDgxIH0sCisJeyAweDI4LCAweDI0IH0sCS8qIDBjICovCisJeyAweDBmLCAweDg1IH0sCS8qIGxnJ3Mgc2V0dGluZyAqLworCXsgMHgxNSwgMHgwMSB9LAorCXsgMHgyMCwgMHgxYyB9LAorCXsgMHgyMywgMHgyYSB9LAorCXsgMHgyNCwgMHgxMCB9LAorCXsgMHgyNSwgMHg4YSB9LAorCXsgMHgyNiwgMHhhMiB9LAorCXsgMHgyNywgMHhjMiB9LAorCXsgMHgyYSwgMHgwNCB9LAorCXsgMHgyYywgMHhmZSB9LAorCXsgMHgyZCwgMHg5MyB9LAorCXsgMHgzMCwgMHg3MSB9LAorCXsgMHgzMSwgMHg2MCB9LAorCXsgMHgzMiwgMHgyNiB9LAorCXsgMHgzMywgMHgyMCB9LAorCXsgMHgzNCwgMHg0OCB9LAorCXsgMHgxMiwgMHgyNCB9LAorCXsgMHgxMSwgMHgwMSB9LAorCXsgMHgwYywgMHgyNCB9LAorCXsgMHgwZCwgMHgyNCB9LAorCXsgMHhmZiwgMHhmZiB9LAkvKiBFTkQgTUFSS0VSICovCit9OworCisvKiBUaGlzIGluaXRpYWxpemVzIHRoZSBPVjd4MTAgY2FtZXJhIGNoaXAgYW5kIHJlbGV2YW50IHZhcmlhYmxlcy4gKi8KK3N0YXRpYyBpbnQgb3Y3eDEwX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IG92N3gxMCAqczsKKwlpbnQgcmM7CisKKwlEREVCVUcoNCwgJmMtPmRldiwgImVudGVyZWQiKTsKKworCXJjID0gb3Zfd3JpdGVfcmVndmFscyhjLCByZWd2YWxzX2luaXRfN3gxMCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJb3YtPnNwcml2ID0gcyA9IGttYWxsb2Moc2l6ZW9mICpzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChzLCAwLCBzaXplb2YgKnMpOworCisJcy0+YXV0b19icnQgPSAxOworCXMtPmF1dG9fZXhwID0gMTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvdjd4MTBfZnJlZShzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKworCWtmcmVlKG92LT5zcHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y3eDEwX3NldF9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkJICAgICAgc3RydWN0IG92Y2FtY2hpcF9jb250cm9sICpjdGwpCit7CisJc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IG92N3gxMCAqcyA9IG92LT5zcHJpdjsKKwlpbnQgcmM7CisJaW50IHYgPSBjdGwtPnZhbHVlOworCisJc3dpdGNoIChjdGwtPmlkKSB7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0NPTlQ6CisJCXJjID0gb3Zfd3JpdGUoYywgUkVHX0NOVCwgdiA+PiA4KTsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0JSSUdIVDoKKwkJcmMgPSBvdl93cml0ZShjLCBSRUdfQlJULCB2ID4+IDgpOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfU0FUOgorCQlyYyA9IG92X3dyaXRlKGMsIFJFR19TQVQsIHYgPj4gOCk7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9IVUU6CisJCXJjID0gb3Zfd3JpdGUoYywgUkVHX1JFRCwgMHhGRiAtICh2ID4+IDgpKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gb3Zfd3JpdGUoYywgUkVHX0JMVUUsIHYgPj4gOCk7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9FWFA6CisJCXJjID0gb3Zfd3JpdGUoYywgUkVHX0VYUCwgdik7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9GUkVROgorCXsKKwkJaW50IHNpeHR5ID0gKHYgPT0gNjApOworCisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDJhLCBzaXh0eT8weDAwOjB4ODAsIDB4ODApOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmMgPSBvdl93cml0ZShjLCAweDJiLCBzaXh0eT8weDAwOjB4YWMpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MTMsIDB4MTAsIDB4MTApOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MTMsIDB4MDAsIDB4MTApOworCQlicmVhazsKKwl9CisJY2FzZSBPVkNBTUNISVBfQ0lEX0JBTkRGSUxUOgorCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyZCwgdj8weDA0OjB4MDAsIDB4MDQpOworCQlzLT5iYW5kZmlsdCA9IHY7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPQlJJR0hUOgorCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyZCwgdj8weDEwOjB4MDAsIDB4MTApOworCQlzLT5hdXRvX2JydCA9IHY7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPRVhQOgorCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyOSwgdj8weDAwOjB4ODAsIDB4ODApOworCQlzLT5hdXRvX2V4cCA9IHY7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9NSVJST1I6CisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDEyLCB2PzB4NDA6MHgwMCwgMHg0MCk7CisJCXMtPm1pcnJvciA9IHY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURERUJVRygyLCAmYy0+ZGV2LCAiY29udHJvbCBub3Qgc3VwcG9ydGVkOiAlZCIsIGN0bC0+aWQpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworb3V0OgorCURERUJVRygzLCAmYy0+ZGV2LCAiaWQ9JWQsIGFyZz0lZCwgcmM9JWQiLCBjdGwtPmlkLCB2LCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG92N3gxMF9nZXRfY29udHJvbChzdHJ1Y3QgaTJjX2NsaWVudCAqYywKKwkJCSAgICAgIHN0cnVjdCBvdmNhbWNoaXBfY29udHJvbCAqY3RsKQoreworCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCBvdjd4MTAgKnMgPSBvdi0+c3ByaXY7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBjaGFyIHZhbCA9IDA7CisKKwlzd2l0Y2ggKGN0bC0+aWQpIHsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQ09OVDoKKwkJcmMgPSBvdl9yZWFkKGMsIFJFR19DTlQsICZ2YWwpOworCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9CUklHSFQ6CisJCXJjID0gb3ZfcmVhZChjLCBSRUdfQlJULCAmdmFsKTsKKwkJY3RsLT52YWx1ZSA9IHZhbCA8PCA4OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfU0FUOgorCQlyYyA9IG92X3JlYWQoYywgUkVHX1NBVCwgJnZhbCk7CisJCWN0bC0+dmFsdWUgPSB2YWwgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0hVRToKKwkJcmMgPSBvdl9yZWFkKGMsIFJFR19CTFVFLCAmdmFsKTsKKwkJY3RsLT52YWx1ZSA9IHZhbCA8PCA4OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfRVhQOgorCQlyYyA9IG92X3JlYWQoYywgUkVHX0VYUCwgJnZhbCk7CisJCWN0bC0+dmFsdWUgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9CQU5ERklMVDoKKwkJY3RsLT52YWx1ZSA9IHMtPmJhbmRmaWx0OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0JSSUdIVDoKKwkJY3RsLT52YWx1ZSA9IHMtPmF1dG9fYnJ0OworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0VYUDoKKwkJY3RsLT52YWx1ZSA9IHMtPmF1dG9fZXhwOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfTUlSUk9SOgorCQljdGwtPnZhbHVlID0gcy0+bWlycm9yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbnRyb2wgbm90IHN1cHBvcnRlZDogJWQiLCBjdGwtPmlkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlEREVCVUcoMywgJmMtPmRldiwgImlkPSVkLCBhcmc9JWQsIHJjPSVkIiwgY3RsLT5pZCwgY3RsLT52YWx1ZSwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvdjd4MTBfbW9kZV9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3Qgb3ZjYW1jaGlwX3dpbmRvdyAqd2luKQoreworCWludCBxdmdhID0gd2luLT5xdWFydGVyOworCisJLyoqKioqKioqIFFWR0Etc3BlY2lmaWMgcmVncyAqKioqKioqKi8KKworCW92X3dyaXRlKGMsIDB4MTQsIHF2Z2E/MHgyNDoweDA0KTsKKworCS8qKioqKioqKiBQYWxldHRlLXNwZWNpZmljIHJlZ3MgKioqKioqKiovCisKKwlpZiAod2luLT5mb3JtYXQgPT0gVklERU9fUEFMRVRURV9HUkVZKSB7CisJCW92X3dyaXRlX21hc2soYywgMHgwZSwgMHg0MCwgMHg0MCk7CisJCW92X3dyaXRlX21hc2soYywgMHgxMywgMHgyMCwgMHgyMCk7CisJfSBlbHNlIHsKKwkJb3Zfd3JpdGVfbWFzayhjLCAweDBlLCAweDAwLCAweDQwKTsKKwkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDAwLCAweDIwKTsKKwl9CisKKwkvKioqKioqKiogQ2xvY2sgcHJvZ3JhbW1pbmcgKioqKioqKiovCisKKwlvdl93cml0ZShjLCAweDExLCB3aW4tPmNsb2NrZGl2KTsKKworCS8qKioqKioqKiBSZXNvbHV0aW9uLXNwZWNpZmljICoqKioqKioqLworCisJaWYgKHdpbi0+d2lkdGggPT0gNjQwICYmIHdpbi0+aGVpZ2h0ID09IDQ4MCkKKwkJb3Zfd3JpdGUoYywgMHgzNSwgMHg5ZSk7CisJZWxzZQorCQlvdl93cml0ZShjLCAweDM1LCAweDFlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92N3gxMF9zZXRfd2luZG93KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3Qgb3ZjYW1jaGlwX3dpbmRvdyAqd2luKQoreworCWludCByZXQsIGh3c2NhbGUsIHZ3c2NhbGU7CisKKwlyZXQgPSBvdjd4MTBfbW9kZV9pbml0KGMsIHdpbik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAod2luLT5xdWFydGVyKSB7CisJCWh3c2NhbGUgPSAxOworCQl2d3NjYWxlID0gMDsKKwl9IGVsc2UgeworCQlod3NjYWxlID0gMjsKKwkJdndzY2FsZSA9IDE7CisJfQorCisJb3Zfd3JpdGUoYywgMHgxNywgSFdTQkFTRSArICh3aW4tPnggPj4gaHdzY2FsZSkpOworCW92X3dyaXRlKGMsIDB4MTgsIEhXRUJBU0UgKyAoKHdpbi0+eCArIHdpbi0+d2lkdGgpID4+IGh3c2NhbGUpKTsKKwlvdl93cml0ZShjLCAweDE5LCBWV1NCQVNFICsgKHdpbi0+eSA+PiB2d3NjYWxlKSk7CisJb3Zfd3JpdGUoYywgMHgxYSwgVldFQkFTRSArICgod2luLT55ICsgd2luLT5oZWlnaHQpID4+IHZ3c2NhbGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92N3gxMF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9WQ0FNQ0hJUF9DTURfU19DVFJMOgorCQlyZXR1cm4gb3Y3eDEwX3NldF9jb250cm9sKGMsIGFyZyk7CisJY2FzZSBPVkNBTUNISVBfQ01EX0dfQ1RSTDoKKwkJcmV0dXJuIG92N3gxMF9nZXRfY29udHJvbChjLCBhcmcpOworCWNhc2UgT1ZDQU1DSElQX0NNRF9TX01PREU6CisJCXJldHVybiBvdjd4MTBfc2V0X3dpbmRvdyhjLCBhcmcpOworCWRlZmF1bHQ6CisJCURERUJVRygyLCAmYy0+ZGV2LCAiY29tbWFuZCBub3Qgc3VwcG9ydGVkOiAlZCIsIGNtZCk7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCitzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjd4MTBfb3BzID0geworCS5pbml0ICAgID0Jb3Y3eDEwX2luaXQsCisJLmZyZWUgICAgPQlvdjd4MTBfZnJlZSwKKwkuY29tbWFuZCA9CW92N3gxMF9jb21tYW5kLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292N3gyMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y3eDIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4YzQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292N3gyMC5jCkBAIC0wLDAgKzEsNDU1IEBACisvKiBPbW5pVmlzaW9uIE9WNzYyMC9PVjcxMjAgQ2FtZXJhIENoaXAgU3VwcG9ydCBDb2RlCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgTWFyayBNY0NsZWxsYW5kIDxtYXJrQGFscGhhLmR5bmRucy5vcmc+CisgKiBodHRwOi8vYWxwaGEuZHluZG5zLm9yZy9vdjUxMS8KKyAqCisgKiBPVjc2MjAgZml4ZXMgYnkgQ2hhcmwgUC4gQm90aGEgPGNwYm90aGFAaWVlZS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gTk8gV0FSUkFOVFkgT0YgQU5ZIEtJTkQgaXMgZXhwcmVzc2VkIG9yIGltcGxpZWQuCisgKi8KKworI2RlZmluZSBERUJVRworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgIm92Y2FtY2hpcF9wcml2LmgiCisKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBSRUdfR0FJTgkJMHgwMAkvKiBnYWluIFs1OjBdICovCisjZGVmaW5lIFJFR19CTFVFCQkweDAxCS8qIGJsdWUgZ2FpbiAqLworI2RlZmluZSBSRUdfUkVECQkJMHgwMgkvKiByZWQgZ2FpbiAqLworI2RlZmluZSBSRUdfU0FUCQkJMHgwMwkvKiBzYXR1cmF0aW9uICovCisjZGVmaW5lIFJFR19CUlQJCQkweDA2CS8qIFkgYnJpZ2h0bmVzcyAqLworI2RlZmluZSBSRUdfU0hBUlAJCTB4MDcJLyogYW5hbG9nIHNoYXJwbmVzcyAqLworI2RlZmluZSBSRUdfQkxVRV9CSUFTCQkweDBDCS8qIFdCIGJsdWUgcmF0aW8gWzU6MF0gKi8KKyNkZWZpbmUgUkVHX1JFRF9CSUFTCQkweDBECS8qIFdCIHJlZCByYXRpbyBbNTowXSAqLworI2RlZmluZSBSRUdfRVhQCQkJMHgxMAkvKiBleHBvc3VyZSAqLworCisvKiBEZWZhdWx0IGNvbnRyb2wgc2V0dGluZ3MuIFZhbHVlcyBhcmUgaW4gdGVybXMgb2YgVjRMMiBjb250cm9scy4gKi8KKyNkZWZpbmUgT1Y3MTIwX0RGTF9CUklHSFQgICAgIDB4NjAKKyNkZWZpbmUgT1Y3NjIwX0RGTF9CUklHSFQgICAgIDB4NjAKKyNkZWZpbmUgT1Y3MTIwX0RGTF9TQVQgICAgICAgIDB4YjAKKyNkZWZpbmUgT1Y3NjIwX0RGTF9TQVQgICAgICAgIDB4YzAKKyNkZWZpbmUgREZMX0FVVE9fRVhQICAgICAgICAgICAgIDEKKyNkZWZpbmUgREZMX0FVVE9fR0FJTiAgICAgICAgICAgIDEKKyNkZWZpbmUgT1Y3MTIwX0RGTF9HQUlOICAgICAgIDB4MDAKKyNkZWZpbmUgT1Y3NjIwX0RGTF9HQUlOICAgICAgIDB4MDAKKy8qIE5PVEU6IFNpbmNlIGF1dG9leHBvc3VyZSBpcyB0aGUgZGVmYXVsdCwgdGhlc2UgYXJlbid0IHByb2dyYW1tZWQgaW50byB0aGUKKyAqIE9WN3gyMCBjaGlwLiBUaGV5IGFyZSBqdXN0IGhlcmUgYmVjYXVzZSBWNEwyIGV4cGVjdHMgYSBkZWZhdWx0ICovCisjZGVmaW5lIE9WNzEyMF9ERkxfRVhQICAgICAgICAweDdmCisjZGVmaW5lIE9WNzYyMF9ERkxfRVhQICAgICAgICAweDdmCisKKy8qIFdpbmRvdyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEhXU0JBU0UgMHgyRgkvKiBGcm9tIDc2MjAuU0VUIChzcGVjIGlzIHdyb25nKSAqLworI2RlZmluZSBIV0VCQVNFIDB4MkYKKyNkZWZpbmUgVldTQkFTRSAweDA1CisjZGVmaW5lIFZXRUJBU0UgMHgwNQorCitzdHJ1Y3Qgb3Y3eDIwIHsKKwlpbnQgYXV0b19icnQ7CisJaW50IGF1dG9fZXhwOworCWludCBhdXRvX2dhaW47CisJaW50IGJhY2tsaWdodDsKKwlpbnQgYmFuZGZpbHQ7CisJaW50IG1pcnJvcjsKK307CisKKy8qIENvbnRyYXN0IGxvb2stdXAgdGFibGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGN0YWJbXSA9IHsKKwkweDAxLCAweDA1LCAweDA5LCAweDExLCAweDE1LCAweDM1LCAweDM3LCAweDU3LAorCTB4NWIsIDB4YTUsIDB4YTcsIDB4YzcsIDB4YzksIDB4Y2YsIDB4ZWYsIDB4ZmYKK307CisKKy8qIFNldHRpbmdzIGZvciAoQmxhY2sgJiBXaGl0ZSkgT1Y3MTIwIGNhbWVyYSBjaGlwICovCitzdGF0aWMgc3RydWN0IG92Y2FtY2hpcF9yZWd2YWxzIHJlZ3ZhbHNfaW5pdF83MTIwW10gPSB7CisJeyAweDEyLCAweDgwIH0sIC8qIHJlc2V0ICovCisJeyAweDEzLCAweDAwIH0sIC8qIEF1dG9hZGp1c3Qgb2ZmICovCisJeyAweDEyLCAweDIwIH0sIC8qIERpc2FibGUgQVdCICovCisJeyAweDEzLCBERkxfQVVUT19HQUlOPzB4MDE6MHgwMCB9LCAvKiBBdXRvYWRqdXN0IG9uIChpZiBkZXNpcmVkKSAqLworCXsgMHgwMCwgT1Y3MTIwX0RGTF9HQUlOIH0sCisJeyAweDAxLCAweDgwIH0sCisJeyAweDAyLCAweDgwIH0sCisJeyAweDAzLCBPVjcxMjBfREZMX1NBVCB9LAorCXsgMHgwNiwgT1Y3MTIwX0RGTF9CUklHSFQgfSwKKwl7IDB4MDcsIDB4MDAgfSwKKwl7IDB4MGMsIDB4MjAgfSwKKwl7IDB4MGQsIDB4MjAgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MTQsIDB4ODQgfSwKKwl7IDB4MTUsIDB4MDEgfSwKKwl7IDB4MTYsIDB4MDMgfSwKKwl7IDB4MTcsIDB4MmYgfSwKKwl7IDB4MTgsIDB4Y2YgfSwKKwl7IDB4MTksIDB4MDYgfSwKKwl7IDB4MWEsIDB4ZjUgfSwKKwl7IDB4MWIsIDB4MDAgfSwKKwl7IDB4MjAsIDB4MDggfSwKKwl7IDB4MjEsIDB4ODAgfSwKKwl7IDB4MjIsIDB4ODAgfSwKKwl7IDB4MjMsIDB4MDAgfSwKKwl7IDB4MjYsIDB4YTAgfSwKKwl7IDB4MjcsIDB4ZmEgfSwKKwl7IDB4MjgsIDB4MjAgfSwgLyogRE9OJ1Qgc2V0IGJpdCA2LiBJdCBpcyBmb3IgdGhlIE9WNzYyMCBvbmx5ICovCisJeyAweDI5LCBERkxfQVVUT19FWFA/MHgwMDoweDgwIH0sCisJeyAweDJhLCAweDEwIH0sCisJeyAweDJiLCAweDAwIH0sCisJeyAweDJjLCAweDg4IH0sCisJeyAweDJkLCAweDk1IH0sCisJeyAweDJlLCAweDgwIH0sCisJeyAweDJmLCAweDQ0IH0sCisJeyAweDYwLCAweDIwIH0sCisJeyAweDYxLCAweDAyIH0sCisJeyAweDYyLCAweDVmIH0sCisJeyAweDYzLCAweGQ1IH0sCisJeyAweDY0LCAweDU3IH0sCisJeyAweDY1LCAweDgzIH0sIC8qIE9WIHNheXMgImRvbid0IGNoYW5nZSB0aGlzIHZhbHVlIiAqLworCXsgMHg2NiwgMHg1NSB9LAorCXsgMHg2NywgMHg5MiB9LAorCXsgMHg2OCwgMHhjZiB9LAorCXsgMHg2OSwgMHg3NiB9LAorCXsgMHg2YSwgMHgyMiB9LAorCXsgMHg2YiwgMHhlMiB9LAorCXsgMHg2YywgMHg0MCB9LAorCXsgMHg2ZCwgMHg0OCB9LAorCXsgMHg2ZSwgMHg4MCB9LAorCXsgMHg2ZiwgMHgwZCB9LAorCXsgMHg3MCwgMHg4OSB9LAorCXsgMHg3MSwgMHgwMCB9LAorCXsgMHg3MiwgMHgxNCB9LAorCXsgMHg3MywgMHg1NCB9LAorCXsgMHg3NCwgMHhhMCB9LAorCXsgMHg3NSwgMHg4ZSB9LAorCXsgMHg3NiwgMHgwMCB9LAorCXsgMHg3NywgMHhmZiB9LAorCXsgMHg3OCwgMHg4MCB9LAorCXsgMHg3OSwgMHg4MCB9LAorCXsgMHg3YSwgMHg4MCB9LAorCXsgMHg3YiwgMHhlNiB9LAorCXsgMHg3YywgMHgwMCB9LAorCXsgMHgyNCwgMHgzYSB9LAorCXsgMHgyNSwgMHg2MCB9LAorCXsgMHhmZiwgMHhmZiB9LAkvKiBFTkQgTUFSS0VSICovCit9OworCisvKiBTZXR0aW5ncyBmb3IgKGNvbG9yKSBPVjc2MjAgY2FtZXJhIGNoaXAgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3ZjYW1jaGlwX3JlZ3ZhbHMgcmVndmFsc19pbml0Xzc2MjBbXSA9IHsKKwl7IDB4MTIsIDB4ODAgfSwgLyogcmVzZXQgKi8KKwl7IDB4MDAsIE9WNzYyMF9ERkxfR0FJTiB9LAorCXsgMHgwMSwgMHg4MCB9LAorCXsgMHgwMiwgMHg4MCB9LAorCXsgMHgwMywgT1Y3NjIwX0RGTF9TQVQgfSwKKwl7IDB4MDYsIE9WNzYyMF9ERkxfQlJJR0hUIH0sCisJeyAweDA3LCAweDAwIH0sCisJeyAweDBjLCAweDI0IH0sCisJeyAweDBjLCAweDI0IH0sCisJeyAweDBkLCAweDI0IH0sCisJeyAweDExLCAweDAxIH0sCisJeyAweDEyLCAweDI0IH0sCisJeyAweDEzLCBERkxfQVVUT19HQUlOPzB4MDE6MHgwMCB9LAorCXsgMHgxNCwgMHg4NCB9LAorCXsgMHgxNSwgMHgwMSB9LAorCXsgMHgxNiwgMHgwMyB9LAorCXsgMHgxNywgMHgyZiB9LAorCXsgMHgxOCwgMHhjZiB9LAorCXsgMHgxOSwgMHgwNiB9LAorCXsgMHgxYSwgMHhmNSB9LAorCXsgMHgxYiwgMHgwMCB9LAorCXsgMHgyMCwgMHgxOCB9LAorCXsgMHgyMSwgMHg4MCB9LAorCXsgMHgyMiwgMHg4MCB9LAorCXsgMHgyMywgMHgwMCB9LAorCXsgMHgyNiwgMHhhMiB9LAorCXsgMHgyNywgMHhlYSB9LAorCXsgMHgyOCwgMHgyMCB9LAorCXsgMHgyOSwgREZMX0FVVE9fRVhQPzB4MDA6MHg4MCB9LAorCXsgMHgyYSwgMHgxMCB9LAorCXsgMHgyYiwgMHgwMCB9LAorCXsgMHgyYywgMHg4OCB9LAorCXsgMHgyZCwgMHg5MSB9LAorCXsgMHgyZSwgMHg4MCB9LAorCXsgMHgyZiwgMHg0NCB9LAorCXsgMHg2MCwgMHgyNyB9LAorCXsgMHg2MSwgMHgwMiB9LAorCXsgMHg2MiwgMHg1ZiB9LAorCXsgMHg2MywgMHhkNSB9LAorCXsgMHg2NCwgMHg1NyB9LAorCXsgMHg2NSwgMHg4MyB9LAorCXsgMHg2NiwgMHg1NSB9LAorCXsgMHg2NywgMHg5MiB9LAorCXsgMHg2OCwgMHhjZiB9LAorCXsgMHg2OSwgMHg3NiB9LAorCXsgMHg2YSwgMHgyMiB9LAorCXsgMHg2YiwgMHgwMCB9LAorCXsgMHg2YywgMHgwMiB9LAorCXsgMHg2ZCwgMHg0NCB9LAorCXsgMHg2ZSwgMHg4MCB9LAorCXsgMHg2ZiwgMHgxZCB9LAorCXsgMHg3MCwgMHg4YiB9LAorCXsgMHg3MSwgMHgwMCB9LAorCXsgMHg3MiwgMHgxNCB9LAorCXsgMHg3MywgMHg1NCB9LAorCXsgMHg3NCwgMHgwMCB9LAorCXsgMHg3NSwgMHg4ZSB9LAorCXsgMHg3NiwgMHgwMCB9LAorCXsgMHg3NywgMHhmZiB9LAorCXsgMHg3OCwgMHg4MCB9LAorCXsgMHg3OSwgMHg4MCB9LAorCXsgMHg3YSwgMHg4MCB9LAorCXsgMHg3YiwgMHhlMiB9LAorCXsgMHg3YywgMHgwMCB9LAorCXsgMHhmZiwgMHhmZiB9LAkvKiBFTkQgTUFSS0VSICovCit9OworCisvKiBSZXR1cm5zIGluZGV4IGludG8gdGhlIHNwZWNpZmllZCBsb29rLXVwIHRhYmxlLCB3aXRoICduJyBlbGVtZW50cywgZm9yIHdoaWNoCisgKiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICJ2YWwiLiBJZiBhIG1hdGNoIGlzbid0IGZvdW5kLCAobi0xKQorICogaXMgcmV0dXJuZWQuIFRoZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBtdXN0IGJlIGluIGFzY2VuZGluZyBvcmRlci4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IG92N3gyMF9sdXRfZmluZCh1bnNpZ25lZCBjaGFyIGx1dFtdLCBpbnQgbiwgdW5zaWduZWQgY2hhciB2YWwpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGx1dFtpXSA8IHZhbCAmJiBpIDwgbikKKwkJaSsrOworCisJcmV0dXJuIGk7Cit9CisKKy8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WN3gyMCBjYW1lcmEgY2hpcCBhbmQgcmVsZXZhbnQgdmFyaWFibGVzLiAqLworc3RhdGljIGludCBvdjd4MjBfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlzdHJ1Y3Qgb3Y3eDIwICpzOworCWludCByYzsKKworCURERUJVRyg0LCAmYy0+ZGV2LCAiZW50ZXJlZCIpOworCisJaWYgKG92LT5tb25vKQorCQlyYyA9IG92X3dyaXRlX3JlZ3ZhbHMoYywgcmVndmFsc19pbml0XzcxMjApOworCWVsc2UKKwkJcmMgPSBvdl93cml0ZV9yZWd2YWxzKGMsIHJlZ3ZhbHNfaW5pdF83NjIwKTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW92LT5zcHJpdiA9IHMgPSBrbWFsbG9jKHNpemVvZiAqcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocywgMCwgc2l6ZW9mICpzKTsKKworCXMtPmF1dG9fYnJ0ID0gMTsKKwlzLT5hdXRvX2V4cCA9IERGTF9BVVRPX0VYUDsKKwlzLT5hdXRvX2dhaW4gPSBERkxfQVVUT19HQUlOOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y3eDIwX2ZyZWUoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisKKwlrZnJlZShvdi0+c3ByaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92N3gyMF9zZXRfdjRsMV9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkJCSAgIHN0cnVjdCBvdmNhbWNoaXBfY29udHJvbCAqY3RsKQoreworCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCBvdjd4MjAgKnMgPSBvdi0+c3ByaXY7CisJaW50IHJjOworCWludCB2ID0gY3RsLT52YWx1ZTsKKworCXN3aXRjaCAoY3RsLT5pZCkgeworCWNhc2UgT1ZDQU1DSElQX0NJRF9DT05UOgorCXsKKwkJLyogVXNlIFkgZ2FtbWEgY29udHJvbCBpbnN0ZWFkLiBCaXQgMCBlbmFibGVzIGl0LiAqLworCQlyYyA9IG92X3dyaXRlKGMsIDB4NjQsIGN0YWJbdiA+PiAxMl0pOworCQlicmVhazsKKwl9CisJY2FzZSBPVkNBTUNISVBfQ0lEX0JSSUdIVDoKKwkJLyogNzYyMCBkb2Vzbid0IGxpa2UgbWFudWFsIGNoYW5nZXMgd2hlbiBpbiBhdXRvIG1vZGUgKi8KKwkJaWYgKCFzLT5hdXRvX2JydCkKKwkJCXJjID0gb3Zfd3JpdGUoYywgUkVHX0JSVCwgdiA+PiA4KTsKKwkJZWxzZQorCQkJcmMgPSAwOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfU0FUOgorCQlyYyA9IG92X3dyaXRlKGMsIFJFR19TQVQsIHYgPj4gOCk7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9FWFA6CisJCWlmICghcy0+YXV0b19leHApCisJCQlyYyA9IG92X3dyaXRlKGMsIFJFR19FWFAsIHYpOworCQllbHNlCisJCQlyYyA9IC1FQlVTWTsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0ZSRVE6CisJeworCQlpbnQgc2l4dHkgPSAodiA9PSA2MCk7CisKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MmEsIHNpeHR5PzB4MDA6MHg4MCwgMHg4MCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKworCQlyYyA9IG92X3dyaXRlKGMsIDB4MmIsIHNpeHR5PzB4MDA6MHhhYyk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKworCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHg3NiwgMHgwMSwgMHgwMSk7CisJCWJyZWFrOworCX0KKwljYXNlIE9WQ0FNQ0hJUF9DSURfQkFOREZJTFQ6CisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDJkLCB2PzB4MDQ6MHgwMCwgMHgwNCk7CisJCXMtPmJhbmRmaWx0ID0gdjsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9CUklHSFQ6CisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDJkLCB2PzB4MTA6MHgwMCwgMHgxMCk7CisJCXMtPmF1dG9fYnJ0ID0gdjsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9FWFA6CisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDEzLCB2PzB4MDE6MHgwMCwgMHgwMSk7CisJCXMtPmF1dG9fZXhwID0gdjsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0JBQ0tMSUdIVDoKKwl7CisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDY4LCB2PzB4ZTA6MHhjMCwgMHhlMCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKworCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyOSwgdj8weDA4OjB4MDAsIDB4MDgpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MjgsIHY/MHgwMjoweDAwLCAweDAyKTsKKwkJcy0+YmFja2xpZ2h0ID0gdjsKKwkJYnJlYWs7CisJfQorCWNhc2UgT1ZDQU1DSElQX0NJRF9NSVJST1I6CisJCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDEyLCB2PzB4NDA6MHgwMCwgMHg0MCk7CisJCXMtPm1pcnJvciA9IHY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURERUJVRygyLCAmYy0+ZGV2LCAiY29udHJvbCBub3Qgc3VwcG9ydGVkOiAlZCIsIGN0bC0+aWQpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworb3V0OgorCURERUJVRygzLCAmYy0+ZGV2LCAiaWQ9JWQsIGFyZz0lZCwgcmM9JWQiLCBjdGwtPmlkLCB2LCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG92N3gyMF9nZXRfdjRsMV9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkJCSAgIHN0cnVjdCBvdmNhbWNoaXBfY29udHJvbCAqY3RsKQoreworCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCBvdjd4MjAgKnMgPSBvdi0+c3ByaXY7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBjaGFyIHZhbCA9IDA7CisKKwlzd2l0Y2ggKGN0bC0+aWQpIHsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQ09OVDoKKwkJcmMgPSBvdl9yZWFkKGMsIDB4NjQsICZ2YWwpOworCQljdGwtPnZhbHVlID0gb3Y3eDIwX2x1dF9maW5kKGN0YWIsIDE2LCB2YWwpIDw8IDEyOworCQlicmVhazsKKwljYXNlIE9WQ0FNQ0hJUF9DSURfQlJJR0hUOgorCQlyYyA9IG92X3JlYWQoYywgUkVHX0JSVCwgJnZhbCk7CisJCWN0bC0+dmFsdWUgPSB2YWwgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX1NBVDoKKwkJcmMgPSBvdl9yZWFkKGMsIFJFR19TQVQsICZ2YWwpOworCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9FWFA6CisJCXJjID0gb3ZfcmVhZChjLCBSRUdfRVhQLCAmdmFsKTsKKwkJY3RsLT52YWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBPVkNBTUNISVBfQ0lEX0JBTkRGSUxUOgorCQljdGwtPnZhbHVlID0gcy0+YmFuZGZpbHQ7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPQlJJR0hUOgorCQljdGwtPnZhbHVlID0gcy0+YXV0b19icnQ7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPRVhQOgorCQljdGwtPnZhbHVlID0gcy0+YXV0b19leHA7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9CQUNLTElHSFQ6CisJCWN0bC0+dmFsdWUgPSBzLT5iYWNrbGlnaHQ7CisJCWJyZWFrOworCWNhc2UgT1ZDQU1DSElQX0NJRF9NSVJST1I6CisJCWN0bC0+dmFsdWUgPSBzLT5taXJyb3I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURERUJVRygyLCAmYy0+ZGV2LCAiY29udHJvbCBub3Qgc3VwcG9ydGVkOiAlZCIsIGN0bC0+aWQpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCURERUJVRygzLCAmYy0+ZGV2LCAiaWQ9JWQsIGFyZz0lZCwgcmM9JWQiLCBjdGwtPmlkLCBjdGwtPnZhbHVlLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG92N3gyMF9tb2RlX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCBvdmNhbWNoaXBfd2luZG93ICp3aW4pCit7CisJc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJaW50IHF2Z2EgPSB3aW4tPnF1YXJ0ZXI7CisKKwkvKioqKioqKiogUVZHQS1zcGVjaWZpYyByZWdzICoqKioqKioqLworCW92X3dyaXRlX21hc2soYywgMHgxNCwgcXZnYT8weDIwOjB4MDAsIDB4MjApOworCW92X3dyaXRlX21hc2soYywgMHgyOCwgcXZnYT8weDAwOjB4MjAsIDB4MjApOworCW92X3dyaXRlKGMsIDB4MjQsIHF2Z2E/MHgyMDoweDNhKTsKKwlvdl93cml0ZShjLCAweDI1LCBxdmdhPzB4MzA6MHg2MCk7CisJb3Zfd3JpdGVfbWFzayhjLCAweDJkLCBxdmdhPzB4NDA6MHgwMCwgMHg0MCk7CisJaWYgKCFvdi0+bW9ubykKKwkJb3Zfd3JpdGVfbWFzayhjLCAweDY3LCBxdmdhPzB4ZjA6MHg5MCwgMHhmMCk7CisJb3Zfd3JpdGVfbWFzayhjLCAweDc0LCBxdmdhPzB4MjA6MHgwMCwgMHgyMCk7CisKKwkvKioqKioqKiogQ2xvY2sgcHJvZ3JhbW1pbmcgKioqKioqKiovCisKKwlvdl93cml0ZShjLCAweDExLCB3aW4tPmNsb2NrZGl2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92N3gyMF9zZXRfd2luZG93KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3Qgb3ZjYW1jaGlwX3dpbmRvdyAqd2luKQoreworCWludCByZXQsIGh3c2NhbGUsIHZ3c2NhbGU7CisKKwlyZXQgPSBvdjd4MjBfbW9kZV9pbml0KGMsIHdpbik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAod2luLT5xdWFydGVyKSB7CisJCWh3c2NhbGUgPSAxOworCQl2d3NjYWxlID0gMDsKKwl9IGVsc2UgeworCQlod3NjYWxlID0gMjsKKwkJdndzY2FsZSA9IDE7CisJfQorCisJb3Zfd3JpdGUoYywgMHgxNywgSFdTQkFTRSArICh3aW4tPnggPj4gaHdzY2FsZSkpOworCW92X3dyaXRlKGMsIDB4MTgsIEhXRUJBU0UgKyAoKHdpbi0+eCArIHdpbi0+d2lkdGgpID4+IGh3c2NhbGUpKTsKKwlvdl93cml0ZShjLCAweDE5LCBWV1NCQVNFICsgKHdpbi0+eSA+PiB2d3NjYWxlKSk7CisJb3Zfd3JpdGUoYywgMHgxYSwgVldFQkFTRSArICgod2luLT55ICsgd2luLT5oZWlnaHQpID4+IHZ3c2NhbGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92N3gyMF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9WQ0FNQ0hJUF9DTURfU19DVFJMOgorCQlyZXR1cm4gb3Y3eDIwX3NldF92NGwxX2NvbnRyb2woYywgYXJnKTsKKwljYXNlIE9WQ0FNQ0hJUF9DTURfR19DVFJMOgorCQlyZXR1cm4gb3Y3eDIwX2dldF92NGwxX2NvbnRyb2woYywgYXJnKTsKKwljYXNlIE9WQ0FNQ0hJUF9DTURfU19NT0RFOgorCQlyZXR1cm4gb3Y3eDIwX3NldF93aW5kb3coYywgYXJnKTsKKwlkZWZhdWx0OgorCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbW1hbmQgbm90IHN1cHBvcnRlZDogJWQiLCBjbWQpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y3eDIwX29wcyA9IHsKKwkuaW5pdCAgICA9CW92N3gyMF9pbml0LAorCS5mcmVlICAgID0Jb3Y3eDIwX2ZyZWUsCisJLmNvbW1hbmQgPQlvdjd4MjBfY29tbWFuZCwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRkNTYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYwpAQCAtMCwwICsxLDQ0NCBAQAorLyogU2hhcmVkIENvZGUgZm9yIE9tbmlWaXNpb24gQ2FtZXJhIENoaXAgRHJpdmVycworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBNYXJrIE1jQ2xlbGxhbmQgPG1hcmtAYWxwaGEuZHluZG5zLm9yZz4KKyAqIGh0dHA6Ly9hbHBoYS5keW5kbnMub3JnL292NTExLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIE5PIFdBUlJBTlRZIE9GIEFOWSBLSU5EIGlzIGV4cHJlc3NlZCBvciBpbXBsaWVkLgorICovCisKKyNkZWZpbmUgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgIm92Y2FtY2hpcF9wcml2LmgiCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjI3IGZvciBMaW51eCAyLjYiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIk1hcmsgTWNDbGVsbGFuZCA8bWFya0BhbHBoYS5keW5kbnMub3JnPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIk9WIGNhbWVyYSBjaGlwIEkyQyBkcml2ZXIiCisKKyNkZWZpbmUgUElORk8oZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPICJvdmNhbWNoaXA6ICIgZm10ICJcbiIgLCAjIyBhcmdzKTsKKyNkZWZpbmUgUEVSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSICJvdmNhbWNoaXA6ICIgZm10ICJcbiIgLCAjIyBhcmdzKTsKKworI2lmZGVmIERFQlVHCitpbnQgb3ZjYW1jaGlwX2RlYnVnID0gMDsKK3N0YXRpYyBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLAorICAiRGVidWcgbGV2ZWw6IDA9bm9uZSwgMT1pbml0cywgMj13YXJuaW5nLCAzPWNvbmZpZywgND1mdW5jdGlvbnMsIDU9YWxsIik7CisjZW5kaWYKKworLyogQnkgZGVmYXVsdCwgbGV0IGJyaWRnZSBkcml2ZXIgdGVsbCB1cyBpZiBjaGlwIGlzIG1vbm9jaHJvbWUuIG1vbm89MAorICogd2lsbCBpZ25vcmUgdGhhdCBhbmQgYWx3YXlzIHRyZWF0IGNoaXBzIGFzIGNvbG9yLiBtb25vPTEgd2lsbCBmb3JjZQorICogbW9ub2Nocm9tZSBtb2RlIGZvciBhbGwgY2hpcHMuICovCitzdGF0aWMgaW50IG1vbm8gPSAtMTsKK21vZHVsZV9wYXJhbShtb25vLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtb25vLAorICAiMT1jaGlwcyBhcmUgbW9ub2Nocm9tZSAoT1Z4MXh4KSwgMD1mb3JjZSBjb2xvciwgLTE9YXV0b2RldGVjdCAoZGVmYXVsdCkiKTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFJlZ2lzdGVycyBjb21tb24gdG8gYWxsIGNoaXBzLCB0aGF0IGFyZSBuZWVkZWQgZm9yIGRldGVjdGlvbiAqLworI2RlZmluZSBHRU5FUklDX1JFR19JRF9ISUdIICAgICAgIDB4MUMJLyogbWFudWZhY3R1cmVyIElEIE1TQiAqLworI2RlZmluZSBHRU5FUklDX1JFR19JRF9MT1cgICAgICAgIDB4MUQJLyogbWFudWZhY3R1cmVyIElEIExTQiAqLworI2RlZmluZSBHRU5FUklDX1JFR19DT01fSSAgICAgICAgIDB4MjkJLyogbWlzYyBJRCBiaXRzICovCisKK2V4dGVybiBzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjZ4MjBfb3BzOworZXh0ZXJuIHN0cnVjdCBvdmNhbWNoaXBfb3BzIG92NngzMF9vcHM7CitleHRlcm4gc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y3eDEwX29wczsKK2V4dGVybiBzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjd4MjBfb3BzOworZXh0ZXJuIHN0cnVjdCBvdmNhbWNoaXBfb3BzIG92NzZiZV9vcHM7CisKK3N0YXRpYyBjaGFyICpjaGlwX25hbWVzW05VTV9DQ19UWVBFU10gPSB7CisJW0NDX1VOS05PV05dCT0gIlVua25vd24gY2hpcCIsCisJW0NDX09WNzZCRV0JPSAiT1Y3NkJFIiwKKwlbQ0NfT1Y3NjEwXQk9ICJPVjc2MTAiLAorCVtDQ19PVjc2MjBdCT0gIk9WNzYyMCIsCisJW0NDX09WNzYyMEFFXQk9ICJPVjc2MjBBRSIsCisJW0NDX09WNjYyMF0JPSAiT1Y2NjIwIiwKKwlbQ0NfT1Y2NjMwXQk9ICJPVjY2MzAiLAorCVtDQ19PVjY2MzBBRV0JPSAiT1Y2NjMwQUUiLAorCVtDQ19PVjY2MzBBRl0JPSAiT1Y2NjMwQUYiLAorfTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXI7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgb3Zfd3JpdGVfcmVndmFscyhzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IG92Y2FtY2hpcF9yZWd2YWxzICpydmFscykKK3sKKwlpbnQgcmM7CisKKwl3aGlsZSAocnZhbHMtPnJlZyAhPSAweGZmKSB7CisJCXJjID0gb3Zfd3JpdGUoYywgcnZhbHMtPnJlZywgcnZhbHMtPnZhbCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCXJ2YWxzKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlcyBiaXRzIGF0IHBvc2l0aW9ucyBzcGVjaWZpZWQgYnkgbWFzayB0byBhbiBJMkMgcmVnLiBCaXRzIHRoYXQgYXJlIGluCisgKiB0aGUgc2FtZSBwb3NpdGlvbiBhcyAxJ3MgaW4gIm1hc2siIGFyZSBjbGVhcmVkIGFuZCBzZXQgdG8gInZhbHVlIi4gQml0cworICogdGhhdCBhcmUgaW4gdGhlIHNhbWUgcG9zaXRpb24gYXMgMCdzIGluICJtYXNrIiBhcmUgcHJlc2VydmVkLCByZWdhcmRsZXNzCisgKiBvZiB0aGVpciByZXNwZWN0aXZlIHN0YXRlIGluICJ2YWx1ZSIuCisgKi8KK2ludCBvdl93cml0ZV9tYXNrKHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkgIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkgIHVuc2lnbmVkIGNoYXIgdmFsdWUsCisJCSAgdW5zaWduZWQgY2hhciBtYXNrKQoreworCWludCByYzsKKwl1bnNpZ25lZCBjaGFyIG9sZHZhbCwgbmV3dmFsOworCisJaWYgKG1hc2sgPT0gMHhmZikgeworCQluZXd2YWwgPSB2YWx1ZTsKKwl9IGVsc2UgeworCQlyYyA9IG92X3JlYWQoYywgcmVnLCAmb2xkdmFsKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlvbGR2YWwgJj0gKH5tYXNrKTsJCS8qIENsZWFyIHRoZSBtYXNrZWQgYml0cyAqLworCQl2YWx1ZSAmPSBtYXNrOwkJCS8qIEVuZm9yY2UgbWFzayBvbiB2YWx1ZSAqLworCQluZXd2YWwgPSBvbGR2YWwgfCB2YWx1ZTsJLyogU2V0IHRoZSBkZXNpcmVkIGJpdHMgKi8KKwl9CisKKwlyZXR1cm4gb3Zfd3JpdGUoYywgcmVnLCBuZXd2YWwpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBSZXNldCB0aGUgY2hpcCBhbmQgZW5zdXJlIHRoYXQgSTJDIGlzIHN5bmNocm9uaXplZC4gUmV0dXJucyA8MCBpZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGluaXRfY2FtY2hpcChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlpbnQgaSwgc3VjY2VzczsKKwl1bnNpZ25lZCBjaGFyIGhpZ2gsIGxvdzsKKworCS8qIFJlc2V0IHRoZSBjaGlwICovCisJb3Zfd3JpdGUoYywgMHgxMiwgMHg4MCk7CisKKwkvKiBXYWl0IGZvciBpdCB0byBpbml0aWFsaXplICovCisJbXNsZWVwKDE1MCk7CisKKwlmb3IgKGkgPSAwLCBzdWNjZXNzID0gMDsgaSA8IEkyQ19ERVRFQ1RfUkVUUklFUyAmJiAhc3VjY2VzczsgaSsrKSB7CisJCWlmIChvdl9yZWFkKGMsIEdFTkVSSUNfUkVHX0lEX0hJR0gsICZoaWdoKSA+PSAwKSB7CisJCQlpZiAob3ZfcmVhZChjLCBHRU5FUklDX1JFR19JRF9MT1csICZsb3cpID49IDApIHsKKwkJCQlpZiAoaGlnaCA9PSAweDdGICYmIGxvdyA9PSAweEEyKSB7CisJCQkJCXN1Y2Nlc3MgPSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBSZXNldCB0aGUgY2hpcCAqLworCQlvdl93cml0ZShjLCAweDEyLCAweDgwKTsKKworCQkvKiBXYWl0IGZvciBpdCB0byBpbml0aWFsaXplICovCisJCW1zbGVlcCgxNTApOworCisJCS8qIER1bW15IHJlYWQgdG8gc3luYyBJMkMgKi8KKwkJb3ZfcmVhZChjLCAweDAwLCAmbG93KTsKKwl9CisKKwlpZiAoIXN1Y2Nlc3MpCisJCXJldHVybiAtRUlPOworCisJUERFQlVHKDEsICJJMkMgc3luY2VkIGluICVkIGF0dGVtcHQocykiLCBpKTsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGRldGVjdHMgdGhlIE9WNzYxMCwgT1Y3NjIwLCBvciBPVjc2QkUgY2hpcC4gKi8KK3N0YXRpYyBpbnQgb3Y3eHgwX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlpbnQgcmM7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlQREVCVUcoNCwgIiIpOworCisJLyogRGV0ZWN0IGNoaXAgKHN1Yil0eXBlICovCisJcmMgPSBvdl9yZWFkKGMsIEdFTkVSSUNfUkVHX0NPTV9JLCAmdmFsKTsKKwlpZiAocmMgPCAwKSB7CisJCVBFUlJPUigiRXJyb3IgZGV0ZWN0aW5nIG92N3h4MCB0eXBlIik7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoKHZhbCAmIDMpID09IDMpIHsKKwkJUElORk8oIkNhbWVyYSBjaGlwIGlzIGFuIE9WNzYxMCIpOworCQlvdi0+c3VidHlwZSA9IENDX09WNzYxMDsKKwl9IGVsc2UgaWYgKCh2YWwgJiAzKSA9PSAxKSB7CisJCXJjID0gb3ZfcmVhZChjLCAweDE1LCAmdmFsKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJUEVSUk9SKCJFcnJvciBkZXRlY3Rpbmcgb3Y3eHgwIHR5cGUiKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWlmICh2YWwgJiAxKSB7CisJCQlQSU5GTygiQ2FtZXJhIGNoaXAgaXMgYW4gT1Y3NjIwQUUiKTsKKwkJCS8qIE9WNzYyMCBpcyBhIGNsb3NlIGVub3VnaCBtYXRjaCBmb3Igbm93LiBUaGVyZSBhcmUKKwkJCSAqIHNvbWUgZGVmaW5pdGUgZGlmZmVyZW5jZXMgdGhvdWdoLCBzbyB0aGlzIHNob3VsZCBiZQorCQkJICogZml4ZWQgKi8KKwkJCW92LT5zdWJ0eXBlID0gQ0NfT1Y3NjIwOworCQl9IGVsc2UgeworCQkJUElORk8oIkNhbWVyYSBjaGlwIGlzIGFuIE9WNzZCRSIpOworCQkJb3YtPnN1YnR5cGUgPSBDQ19PVjc2QkU7CisJCX0KKwl9IGVsc2UgaWYgKCh2YWwgJiAzKSA9PSAwKSB7CisJCVBJTkZPKCJDYW1lcmEgY2hpcCBpcyBhbiBPVjc2MjAiKTsKKwkJb3YtPnN1YnR5cGUgPSBDQ19PVjc2MjA7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJVbmtub3duIGNhbWVyYSBjaGlwIHZlcnNpb246ICVkIiwgdmFsICYgMyk7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCWlmIChvdi0+c3VidHlwZSA9PSBDQ19PVjc2QkUpCisJCW92LT5zb3BzID0gJm92NzZiZV9vcHM7CisJZWxzZSBpZiAob3YtPnN1YnR5cGUgPT0gQ0NfT1Y3NjIwKQorCQlvdi0+c29wcyA9ICZvdjd4MjBfb3BzOworCWVsc2UKKwkJb3YtPnNvcHMgPSAmb3Y3eDEwX29wczsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGRldGVjdHMgdGhlIE9WNjYyMCwgT1Y2NjMwLCBPVjY2MzBBRSwgb3IgT1Y2NjMwQUYgY2hpcC4gKi8KK3N0YXRpYyBpbnQgb3Y2eHgwX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlpbnQgcmM7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlQREVCVUcoNCwgIiIpOworCisJLyogRGV0ZWN0IGNoaXAgKHN1Yil0eXBlICovCisJcmMgPSBvdl9yZWFkKGMsIEdFTkVSSUNfUkVHX0NPTV9JLCAmdmFsKTsKKwlpZiAocmMgPCAwKSB7CisJCVBFUlJPUigiRXJyb3IgZGV0ZWN0aW5nIG92Nnh4MCB0eXBlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKHZhbCAmIDMpID09IDApIHsKKwkJb3YtPnN1YnR5cGUgPSBDQ19PVjY2MzA7CisJCVBJTkZPKCJDYW1lcmEgY2hpcCBpcyBhbiBPVjY2MzAiKTsKKwl9IGVsc2UgaWYgKCh2YWwgJiAzKSA9PSAxKSB7CisJCW92LT5zdWJ0eXBlID0gQ0NfT1Y2NjIwOworCQlQSU5GTygiQ2FtZXJhIGNoaXAgaXMgYW4gT1Y2NjIwIik7CisJfSBlbHNlIGlmICgodmFsICYgMykgPT0gMikgeworCQlvdi0+c3VidHlwZSA9IENDX09WNjYzMDsKKwkJUElORk8oIkNhbWVyYSBjaGlwIGlzIGFuIE9WNjYzMEFFIik7CisJfSBlbHNlIGlmICgodmFsICYgMykgPT0gMykgeworCQlvdi0+c3VidHlwZSA9IENDX09WNjYzMDsKKwkJUElORk8oIkNhbWVyYSBjaGlwIGlzIGFuIE9WNjYzMEFGIik7CisJfQorCisJaWYgKG92LT5zdWJ0eXBlID09IENDX09WNjYyMCkKKwkJb3YtPnNvcHMgPSAmb3Y2eDIwX29wczsKKwllbHNlCisJCW92LT5zb3BzID0gJm92NngzMF9vcHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdmNhbWNoaXBfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworCS8qIElkZWFsbHkgd2Ugd291bGQganVzdCB0cnkgYSBzaW5nbGUgcmVnaXN0ZXIgd3JpdGUgYW5kIHNlZSBpZiBpdCBOQUtzLgorCSAqIFRoYXQgaXNuJ3QgcG9zc2libGUgc2luY2UgdGhlIE9WNTE4IGNhbid0IHJlcG9ydCBJMkMgdHJhbnNhY3Rpb24KKwkgKiBmYWlsdXJlcy4gU28sIHdlIGhhdmUgdG8gdHJ5IHRvIGluaXRpYWxpemUgdGhlIGNoaXAgKGkuZS4gcmVzZXQgaXQKKwkgKiBhbmQgY2hlY2sgdGhlIElEIHJlZ2lzdGVycykgdG8gZGV0ZWN0IGl0cyBwcmVzZW5jZS4gKi8KKworCS8qIFRlc3QgZm9yIDd4eDAgKi8KKwlQREVCVUcoMywgIlRlc3RpbmcgZm9yIDBWN3h4MCIpOworCWMtPmFkZHIgPSBPVjd4eDBfU0lEOworCWlmIChpbml0X2NhbWNoaXAoYykgPCAwKSB7CisJCS8qIFRlc3QgZm9yIDZ4eDAgKi8KKwkJUERFQlVHKDMsICJUZXN0aW5nIGZvciAwVjZ4eDAiKTsKKwkJYy0+YWRkciA9IE9WNnh4MF9TSUQ7CisJCWlmIChpbml0X2NhbWNoaXAoYykgPCAwKSB7CisgCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0gZWxzZSB7CisJCQlpZiAob3Y2eHgwX2RldGVjdChjKSA8IDApIHsKKwkJCQlQRVJST1IoIkZhaWxlZCB0byBpbml0IE9WNnh4MCIpOworIAkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChvdjd4eDBfZGV0ZWN0KGMpIDwgMCkgeworCQkJUEVSUk9SKCJGYWlsZWQgdG8gaW5pdCBPVjd4eDAiKTsKKyAJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG92Y2FtY2hpcF9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG92Y2FtY2hpcCAqb3Y7CisJc3RydWN0IGkyY19jbGllbnQgKmM7CisKKwkvKiBJMkMgaXMgbm90IGEgUG5QIGJ1cywgc28gd2UgY2FuIG5ldmVyIGJlIGNlcnRhaW4gdGhhdCB3ZSdyZSB0YWxraW5nCisJICogdG8gdGhlIHJpZ2h0IGNoaXAuIFRvIHByZXZlbnQgZGFtYWdlIHRvIEVFUFJPTVMgYW5kIHN1Y2gsIG9ubHkKKwkgKiBhdHRhY2ggdG8gYWRhcHRlcnMgdGhhdCBhcmUga25vd24gdG8gY29udGFpbiBPViBjYW1lcmEgY2hpcHMuICovCisKKwlzd2l0Y2ggKGFkYXAtPmlkKSB7CisJY2FzZSAoSTJDX0FMR09fU01CVVMgfCBJMkNfSFdfU01CVVNfT1Y1MTEpOgorCWNhc2UgKEkyQ19BTEdPX1NNQlVTIHwgSTJDX0hXX1NNQlVTX09WNTE4KToKKwljYXNlIChJMkNfQUxHT19TTUJVUyB8IEkyQ19IV19TTUJVU19PVkZYMik6CisJY2FzZSAoSTJDX0FMR09fU01CVVMgfCBJMkNfSFdfU01CVVNfVzk5NjhDRik6CisJCVBERUJVRygxLCAiQWRhcHRlciBJRCAweCUwNnggYWNjZXB0ZWQiLCBhZGFwLT5pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBERUJVRygxLCAiQWRhcHRlciBJRCAweCUwNnggcmVqZWN0ZWQiLCBhZGFwLT5pZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWMgPSBrbWFsbG9jKHNpemVvZiAqYywgR0ZQX0tFUk5FTCk7CisJaWYgKCFjKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBub19jbGllbnQ7CisJfQorCW1lbWNweShjLCAmY2xpZW50X3RlbXBsYXRlLCBzaXplb2YgKmMpOworCWMtPmFkYXB0ZXIgPSBhZGFwOworCXN0cmNweShpMmNfY2xpZW50bmFtZShjKSwgIk9WPz8/PyIpOworCisJb3YgPSBrbWFsbG9jKHNpemVvZiAqb3YsIEdGUF9LRVJORUwpOworCWlmICghb3YpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG5vX292OworCX0KKwltZW1zZXQob3YsIDAsIHNpemVvZiAqb3YpOworCWkyY19zZXRfY2xpZW50ZGF0YShjLCBvdik7CisKKwlyYyA9IG92Y2FtY2hpcF9kZXRlY3QoYyk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0cmNweShpMmNfY2xpZW50bmFtZShjKSwgY2hpcF9uYW1lc1tvdi0+c3VidHlwZV0pOworCisJUERFQlVHKDEsICJDYW1lcmEgY2hpcCBkZXRlY3Rpb24gY29tcGxldGUiKTsKKworCWkyY19hdHRhY2hfY2xpZW50KGMpOworCisJcmV0dXJuIHJjOworZXJyb3I6CisJa2ZyZWUob3YpOworbm9fb3Y6CisJa2ZyZWUoYyk7Citub19jbGllbnQ6CisJUERFQlVHKDEsICJyZXR1cm5pbmcgJWQiLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG92Y2FtY2hpcF9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJaW50IHJjOworCisJcmMgPSBvdi0+c29wcy0+ZnJlZShjKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlpMmNfZGV0YWNoX2NsaWVudChjKTsKKworCWtmcmVlKG92KTsKKwlrZnJlZShjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdmNhbWNoaXBfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJaWYgKCFvdi0+aW5pdGlhbGl6ZWQgJiYKKwkgICAgY21kICE9IE9WQ0FNQ0hJUF9DTURfUV9TVUJUWVBFICYmCisJICAgIGNtZCAhPSBPVkNBTUNISVBfQ01EX0lOSVRJQUxJWkUpIHsKKwkJZGV2X2VycigmYy0+ZGV2LCAiRVJST1I6IENhbWVyYSBjaGlwIG5vdCBpbml0aWFsaXplZCB5ZXQhXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1ZDQU1DSElQX0NNRF9RX1NVQlRZUEU6CisJeworCQkqKGludCAqKWFyZyA9IG92LT5zdWJ0eXBlOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBPVkNBTUNISVBfQ01EX0lOSVRJQUxJWkU6CisJeworCQlpbnQgcmM7CisKKwkJaWYgKG1vbm8gPT0gLTEpCisJCQlvdi0+bW9ubyA9ICooaW50ICopYXJnOworCQllbHNlCisJCQlvdi0+bW9ubyA9IG1vbm87CisKKwkJaWYgKG92LT5tb25vKSB7CisJCQlpZiAob3YtPnN1YnR5cGUgIT0gQ0NfT1Y3NjIwKQorCQkJCWRldl93YXJuKCZjLT5kZXYsICJXYXJuaW5nOiBNb25vY2hyb21lIG5vdCAiCisJCQkJCSJpbXBsZW1lbnRlZCBmb3IgdGhpcyBjaGlwXG4iKTsKKwkJCWVsc2UKKwkJCQlkZXZfaW5mbygmYy0+ZGV2LCAiSW5pdGlhbGl6aW5nIGNoaXAgYXMgIgorCQkJCQkibW9ub2Nocm9tZVxuIik7CisJCX0KKworCQlyYyA9IG92LT5zb3BzLT5pbml0KGMpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCW92LT5pbml0aWFsaXplZCA9IDE7CisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gb3YtPnNvcHMtPmNvbW1hbmQoYywgY21kLCBhcmcpOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKKwkub3duZXIgPQkJVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJCSJvdmNhbWNoaXAiLAorCS5pZCA9CQkJSTJDX0RSSVZFUklEX09WQ0FNQ0hJUCwKKwkuY2xhc3MgPQkJSTJDX0NMQVNTX0NBTV9ESUdJVEFMLAorCS5mbGFncyA9CQlJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9CW92Y2FtY2hpcF9hdHRhY2gsCisJLmRldGFjaF9jbGllbnQgPQlvdmNhbWNoaXBfZGV0YWNoLAorCS5jb21tYW5kID0JCW92Y2FtY2hpcF9jb21tYW5kLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKKwlJMkNfREVWTkFNRSgiKHVuc2V0KSIpLAorCS5kcml2ZXIgPQkmZHJpdmVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb3ZjYW1jaGlwX2luaXQodm9pZCkKK3sKKyNpZmRlZiBERUJVRworCW92Y2FtY2hpcF9kZWJ1ZyA9IGRlYnVnOworI2VuZGlmCisKKwlQSU5GTyhEUklWRVJfVkVSU0lPTiAiIDogIiBEUklWRVJfREVTQyk7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3ZjYW1jaGlwX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob3ZjYW1jaGlwX2luaXQpOworbW9kdWxlX2V4aXQob3ZjYW1jaGlwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX3ByaXYuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1ZTYxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfcHJpdi5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIE9tbmlWaXNpb24qIGNhbWVyYSBjaGlwIGRyaXZlciBwcml2YXRlIGRlZmluaXRpb25zIGZvciBjb3JlIGNvZGUgYW5kCisgKiBjaGlwLXNwZWNpZmljIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBNYXJrIE1jQ2xlbGxhbmQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCBpcyBleHByZXNzZWQgb3IgaW1wbGllZC4KKyAqCisgKiAqIE9tbmlWaXNpb24gaXMgYSB0cmFkZW1hcmsgb2YgT21uaVZpc2lvbiBUZWNobm9sb2dpZXMsIEluYy4gVGhpcyBkcml2ZXIKKyAqIGlzIG5vdCBzcG9uc29yZWQgb3IgZGV2ZWxvcGVkIGJ5IHRoZW0uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX09WQ0FNQ0hJUF9QUklWX0gKKyNkZWZpbmUgX19MSU5VWF9PVkNBTUNISVBfUFJJVl9ICisKKyNpbmNsdWRlIDxtZWRpYS9vdmNhbWNoaXAuaD4KKworI2lmZGVmIERFQlVHCitleHRlcm4gaW50IG92Y2FtY2hpcF9kZWJ1ZzsKKyNlbmRpZgorCisjZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCisJaWYgKG92Y2FtY2hpcF9kZWJ1ZyA+PSAobGV2ZWwpKQlwcl9kZWJ1ZygiWyVzOiVkXSAiIGZtdCAiXG4iLCBcCisJCV9fRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzKQorCisjZGVmaW5lIERERUJVRyhsZXZlbCwgZGV2LCBmbXQsIGFyZ3MuLi4pIFwKKwlpZiAob3ZjYW1jaGlwX2RlYnVnID49IChsZXZlbCkpCWRldl9kYmcoZGV2LCAiWyVzOiVkXSAiIGZtdCAiXG4iLCBcCisJCV9fRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzKQorCisvKiBOdW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgY2hpcCBkZXRlY3Rpb24uIEluY3JlYXNlIHRoaXMgaWYgeW91IGFyZSBnZXR0aW5nCisgKiAiRmFpbGVkIHRvIGluaXQgY2FtZXJhIGNoaXAiICovCisjZGVmaW5lIEkyQ19ERVRFQ1RfUkVUUklFUwkxMAorCitzdHJ1Y3Qgb3ZjYW1jaGlwX3JlZ3ZhbHMgeworCXVuc2lnbmVkIGNoYXIgcmVnOworCXVuc2lnbmVkIGNoYXIgdmFsOworfTsKKworc3RydWN0IG92Y2FtY2hpcF9vcHMgeworCWludCAoKmluaXQpKHN0cnVjdCBpMmNfY2xpZW50ICopOworCWludCAoKmZyZWUpKHN0cnVjdCBpMmNfY2xpZW50ICopOworCWludCAoKmNvbW1hbmQpKHN0cnVjdCBpMmNfY2xpZW50ICosIHVuc2lnbmVkIGludCwgdm9pZCAqKTsKK307CisKK3N0cnVjdCBvdmNhbWNoaXAgeworCXN0cnVjdCBvdmNhbWNoaXBfb3BzICpzb3BzOworCXZvaWQgKnNwcml2OyAgICAgICAgICAgICAgIC8qIFByaXZhdGUgZGF0YSBmb3IgT1Y3eDEwLmMgZXRjLi4uICovCisJaW50IHN1YnR5cGU7ICAgICAgICAgICAgICAgLyogPSBTRU5fT1Y3NjEwIGV0Yy4uLiAqLworCWludCBtb25vOyAgICAgICAgICAgICAgICAgIC8qIE1vbm9jaHJvbWUgY2hpcD8gKGludmFsaWQgdW50aWwgaW5pdCkgKi8KKwlpbnQgaW5pdGlhbGl6ZWQ7ICAgICAgICAgICAvKiBPVkNBTUNISVBfQ01EX0lOSVRJQUxJWkUgd2FzIHN1Y2Nlc3NmdWwgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICAgICAgICAgIEkyQyBJL08gICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSBpbnQgb3ZfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgY2hhciByZWcsCisJCQkgIHVuc2lnbmVkIGNoYXIgKnZhbHVlKQoreworCWludCByYzsKKworCXJjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGMsIHJlZyk7CisJKnZhbHVlID0gKHVuc2lnbmVkIGNoYXIpIHJjOworCXJldHVybiByYzsKK30KKworc3RhdGljIGlubGluZSBpbnQgb3Zfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJICAgdW5zaWduZWQgY2hhciB2YWx1ZSApCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoYywgcmVnLCB2YWx1ZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICAgIEZVTkNUSU9OIFBST1RPVFlQRVMgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRnVuY3Rpb25zIGluIG92Y2FtY2hpcF9jb3JlLmMgKi8KKworZXh0ZXJuIGludCBvdl93cml0ZV9yZWd2YWxzKHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkJICAgIHN0cnVjdCBvdmNhbWNoaXBfcmVndmFscyAqcnZhbHMpOworCitleHRlcm4gaW50IG92X3dyaXRlX21hc2soc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGNoYXIgcmVnLAorCSAgICAgIAkJIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGNoYXIgbWFzayk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wbGFuYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbGFuYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOWMzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmMKQEAgLTAsMCArMSwyMzAzIEBACisvKiAKKyAgICBwbGFuYiAtIFBsYW5CIGZyYW1lIGdyYWJiZXIgZHJpdmVyCisKKyAgICBQbGFuQiBpcyB1c2VkIGluIHRoZSA3eDAwLzh4MDAgc2VyaWVzIG9mIFBvd2VyTWFjaW50b3NoCisgICAgQ29tcHV0ZXJzIGFzIHZpZGVvIGlucHV0IERNQSBjb250cm9sbGVyLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk4IE1pY2hlbCBMYW5uZXJzIChtbGFuQGNwdS5sdSkKKworICAgIEJhc2VkIGxhcmdlbHkgb24gdGhlIGJ0dHYgZHJpdmVyIGJ5IFJhbHBoIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKKworICAgIEFkZGl0aW9uYWwgZGVidWdnaW5nIGFuZCBjb2RpbmcgYnkgVGFrYXNoaSBPZSAodG9lQHVubHNlcnZlLnVubC5lZHUpCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qICRJZDogcGxhbmIuYyx2IDEuMTggMTk5OS8wNS8wMiAxNzozNjozNCBtbGFuIEV4cCAkICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJwbGFuYi5oIgorI2luY2x1ZGUgInNhYTcxOTYuaCIKKworLyogV291bGQgeW91IG1pbmQgZm9yIHNvbWUgdWdseSBkZWJ1Z2dpbmc/ICovCisjaWYgMAorI2RlZmluZSBERUJVRyh4Li4uKSBwcmludGsoS0VSTl9ERUJVRyAjIyB4KSAvKiBEZWJ1ZyBkcml2ZXIgKi8KKyNlbHNlCisjZGVmaW5lIERFQlVHKHguLi4pIAkJLyogRG9uJ3QgZGVidWcgZHJpdmVyICovCisjZW5kaWYKKworI2lmIDAKKyNkZWZpbmUgSURFQlVHKHguLi4pIHByaW50ayhLRVJOX0RFQlVHICMjIHgpIC8qIERlYnVnIGludGVycnVwdCBwYXJ0ICovCisjZWxzZQorI2RlZmluZSBJREVCVUcoeC4uLikgCQkvKiBEb24ndCBkZWJ1ZyBpbnRlcnJ1cHQgcGFydCAqLworI2VuZGlmCisKKy8qIEV2ZXIgc2VlbiBhIE1hYyB3aXRoIG1vcmUgdGhhbiAxIG9mIHRoZXNlPyAqLworI2RlZmluZSBQTEFOQl9NQVggMQorCitzdGF0aWMgaW50IHBsYW5iX251bTsKK3N0YXRpYyBzdHJ1Y3QgcGxhbmIgcGxhbmJzW1BMQU5CX01BWF07CitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IHBsYW5iX3JlZ2lzdGVycyAqcGxhbmJfcmVnczsKKworc3RhdGljIGludCBkZWZfbm9ybSA9IFBMQU5CX0RFRl9OT1JNOwkvKiBkZWZhdWx0IG5vcm0gKi8KK3N0YXRpYyBpbnQgdmlkZW9fbnIgPSAtMTsKKworTU9EVUxFX1BBUk0oZGVmX25vcm0sICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlZl9ub3JtLCAiRGVmYXVsdCBzdGFydHVwIG5vcm0gKDA9UEFMLCAxPU5UU0MsIDI9U0VDQU0pIik7CitNT0RVTEVfUEFSTSh2aWRlb19uciwiaSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBQbGFuQiBFeHBvcnRlZCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgbG9uZyBwbGFuYl93cml0ZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KTsKK3N0YXRpYyBsb25nIHBsYW5iX3JlYWQoc3RydWN0IHZpZGVvX2RldmljZSAqLCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCk7CitzdGF0aWMgaW50IHBsYW5iX29wZW4oc3RydWN0IHZpZGVvX2RldmljZSAqLCBpbnQpOworc3RhdGljIHZvaWQgcGxhbmJfY2xvc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqKTsKK3N0YXRpYyBpbnQgcGxhbmJfaW9jdGwoc3RydWN0IHZpZGVvX2RldmljZSAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKik7CitzdGF0aWMgaW50IHBsYW5iX2luaXRfZG9uZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICopOworc3RhdGljIGludCBwbGFuYl9tbWFwKHN0cnVjdCB2aWRlb19kZXZpY2UgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHBsYW5iX2lycShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZCByZWxlYXNlX3BsYW5iKHZvaWQpOworaW50IGluaXRfcGxhbmJzKHN0cnVjdCB2aWRlb19pbml0ICopOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gUGxhbkIgSW50ZXJuYWwgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBwbGFuYl9wcmVwYXJlX29wZW4oc3RydWN0IHBsYW5iICopOworc3RhdGljIHZvaWQgcGxhbmJfcHJlcGFyZV9jbG9zZShzdHJ1Y3QgcGxhbmIgKik7CitzdGF0aWMgdm9pZCBzYWFfd3JpdGVfcmVnKHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2FhX3N0YXR1cyhpbnQsIHN0cnVjdCBwbGFuYiAqKTsKK3N0YXRpYyB2b2lkIHNhYV9zZXQodW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhciwgc3RydWN0IHBsYW5iICopOworc3RhdGljIHZvaWQgc2FhX2luaXRfcmVncyhzdHJ1Y3QgcGxhbmIgKik7CitzdGF0aWMgaW50IGdyYWJidWZfYWxsb2Moc3RydWN0IHBsYW5iICopOworc3RhdGljIGludCB2Z3JhYihzdHJ1Y3QgcGxhbmIgKiwgc3RydWN0IHZpZGVvX21tYXAgKik7CitzdGF0aWMgdm9pZCBhZGRfY2xpcChzdHJ1Y3QgcGxhbmIgKiwgc3RydWN0IHZpZGVvX2NsaXAgKik7CitzdGF0aWMgdm9pZCBmaWxsX2NtZF9idWZmKHN0cnVjdCBwbGFuYiAqKTsKK3N0YXRpYyB2b2lkIGNtZF9idWZmKHN0cnVjdCBwbGFuYiAqKTsKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpzZXR1cF9ncmFiX2NtZChpbnQsIHN0cnVjdCBwbGFuYiAqKTsKK3N0YXRpYyB2b2lkIG92ZXJsYXlfc3RhcnQoc3RydWN0IHBsYW5iICopOworc3RhdGljIHZvaWQgb3ZlcmxheV9zdG9wKHN0cnVjdCBwbGFuYiAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YWJfY21kX2RiZG1hKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKiwgdW5zaWduZWQgc2hvcnQsCisJdW5zaWduZWQgaW50KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YWJfY21kX3N0b3JlKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKiwgdW5zaWduZWQgaW50LAorCXVuc2lnbmVkIGludCk7CitzdGF0aWMgaW5saW5lIHZvaWQgdGFiX2NtZF9nZW4odm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqLCB1bnNpZ25lZCBzaG9ydCwKKwl1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCBpbml0X3BsYW5iKHN0cnVjdCBwbGFuYiAqKTsKK3N0YXRpYyBpbnQgZmluZF9wbGFuYih2b2lkKTsKK3N0YXRpYyB2b2lkIHBsYW5iX3ByZV9jYXB0dXJlKGludCwgaW50LCBzdHJ1Y3QgcGxhbmIgKik7CitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY21kX2dlb19zZXR1cCh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICosCisJCQkJCWludCwgaW50LCBpbnQsIGludCwgaW50LCBzdHJ1Y3QgcGxhbmIgKik7CitzdGF0aWMgaW5saW5lIHZvaWQgcGxhbmJfZGJkbWFfc3RvcCh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2FhX2dlb19zZXR1cChpbnQsIGludCwgaW50LCBpbnQsIHN0cnVjdCBwbGFuYiAqKTsKK3N0YXRpYyBpbmxpbmUgaW50IG92ZXJsYXlfaXNfYWN0aXZlKHN0cnVjdCBwbGFuYiAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGdyYWJidWZfYWxsb2Moc3RydWN0IHBsYW5iICpwYikKK3sKKwlpbnQgaSwgbnBhZ2U7CisKKwlucGFnZSA9IE1BWF9HQlVGRkVSUyAqICgoUExBTkJfTUFYX0ZCVUYgLyBQQUdFX1NJWkUgKyAxKQorI2lmbmRlZiBQTEFOQl9HU0NBTkxJTkUKKwkJKyBNQVhfTE5VTQorI2VuZGlmIC8qIFBMQU5CX0dTQ0FOTElORSAqLworCQkpOworCWlmICgocGItPnJhd2J1ZiA9ICh1bnNpZ25lZCBjaGFyKiopIGttYWxsb2MgKG5wYWdlCisJCQkJKiBzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpKSA9PSAwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2U7IGkrKykgeworCQlwYi0+cmF3YnVmW2ldID0gKHVuc2lnbmVkIGNoYXIgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwKKwkJCQkJCQkJfEdGUF9ETUEsIDApOworCQlpZiAoIXBiLT5yYXdidWZbaV0pCisJCQlicmVhazsKKwkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShwYi0+cmF3YnVmW2ldKSk7CisJfQorCWlmIChpLS0gPCBucGFnZSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiUGxhbkI6IGluaXRfZ3JhYjogZ3JhYiBidWZmZXIgbm90IGFsbG9jYXRlZFxuIik7CisJCWZvciAoOyBpID4gMDsgaS0tKSB7CisJCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGItPnJhd2J1ZltpXSkpOworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwYi0+cmF3YnVmW2ldLCAwKTsKKwkJfQorCQlrZnJlZShwYi0+cmF3YnVmKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwlwYi0+cmF3YnVmX3NpemUgPSBucGFnZTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSGFyZHdhcmUgYWNjZXNzIGZ1bmN0aW9ucyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzYWFfd3JpdGVfcmVnKHVuc2lnbmVkIGNoYXIgYWRkciwgdW5zaWduZWQgY2hhciB2YWwpCit7CisJcGxhbmJfcmVncy0+c2FhX2FkZHIgPSBhZGRyOyBlaWVpbygpOworCXBsYW5iX3JlZ3MtPnNhYV9yZWd2YWwgPSB2YWw7IGVpZWlvKCk7CisJcmV0dXJuOworfQorCisvKiByZXR1cm4gIHN0YXR1cyBieXRlIDAgb3IgMTogKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNhYV9zdGF0dXMoaW50IGJ5dGUsIHN0cnVjdCBwbGFuYiAqcGIpCit7CisJc2FhX3JlZ3NbcGItPndpbi5ub3JtXVtTQUE3MTk2X1NURENdID0KKwkJKHNhYV9yZWdzW3BiLT53aW4ubm9ybV1bU0FBNzE5Nl9TVERDXSAmIH4yKSB8ICgoYnl0ZSAmIDEpIDw8IDEpOworCXNhYV93cml0ZV9yZWcgKFNBQTcxOTZfU1REQywgc2FhX3JlZ3NbcGItPndpbi5ub3JtXVtTQUE3MTk2X1NURENdKTsKKworCS8qIExldCdzIHdhaXQgMzBtc2VjIGZvciB0aGlzIG9uZSAqLworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDMwKTsKKworCXJldHVybiAodW5zaWduZWQgY2hhcilpbl84ICgmcGxhbmJfcmVncy0+c2FhX3N0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNhYV9zZXQodW5zaWduZWQgY2hhciBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCwgc3RydWN0IHBsYW5iICpwYikKK3sKKwlpZihzYWFfcmVnc1twYi0+d2luLm5vcm1dW2FkZHJdICE9IHZhbCkgeworCQlzYWFfcmVnc1twYi0+d2luLm5vcm1dW2FkZHJdID0gdmFsOworCQlzYWFfd3JpdGVfcmVnIChhZGRyLCB2YWwpOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNhYV9pbml0X3JlZ3Moc3RydWN0IHBsYW5iICpwYikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQUE3MTk2X05VTVJFR1M7IGkrKykKKwkJc2FhX3dyaXRlX3JlZyAoaSwgc2FhX3JlZ3NbcGItPndpbi5ub3JtXVtpXSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2FhX2dlb19zZXR1cChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBpbnRlcmxhY2UsIGludCBicHAsCisJc3RydWN0IHBsYW5iICpwYikKK3sKKwlpbnQgaHQsIG5vcm0gPSBwYi0+d2luLm5vcm07CisKKwlzd2l0Y2goYnBwKSB7CisJY2FzZSAyOgorCQkvKiBSR0I1NTUrYSAxeDE2LWJpdCArIDE2LWJpdCB0cmFuc3BhcmVudCAqLworCQlzYWFfcmVnc1tub3JtXVtTQUE3MTk2X0ZNVFNdICY9IH4weDM7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDQ6CisJCS8qIFJHQjg4OCAxeDI0LWJpdCArIDgtYml0IHRyYW5zcGFyZW50ICovCisJCXNhYV9yZWdzW25vcm1dW1NBQTcxOTZfRk1UU10gJj0gfjB4MTsKKwkJc2FhX3JlZ3Nbbm9ybV1bU0FBNzE5Nl9GTVRTXSB8PSAweDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlodCA9IChpbnRlcmxhY2UgPyBoZWlnaHQgLyAyIDogaGVpZ2h0KTsKKwlzYWFfcmVnc1tub3JtXVtTQUE3MTk2X09VVFBJWF0gPSAodW5zaWduZWQgY2hhcikgKHdpZHRoICYgMHgwMGZmKTsKKwlzYWFfcmVnc1tub3JtXVtTQUE3MTk2X0hGSUxUXSA9IChzYWFfcmVnc1tub3JtXVtTQUE3MTk2X0hGSUxUXSAmIH4weDMpCisJCQkJCQl8ICh3aWR0aCA+PiA4ICYgMHgzKTsKKwlzYWFfcmVnc1tub3JtXVtTQUE3MTk2X09VVExJTkVdID0gKHVuc2lnbmVkIGNoYXIpIChodCAmIDB4ZmYpOworCXNhYV9yZWdzW25vcm1dW1NBQTcxOTZfVllQXSA9IChzYWFfcmVnc1tub3JtXVtTQUE3MTk2X1ZZUF0gJiB+MHgzKQorCQkJCQkJfCAoaHQgPj4gOCAmIDB4Myk7CisJLyogZmVlZCBib3RoIGZpZWxkcyBpZiBpbnRlcmxhY2VkLCBvciBlbHNlIGZlZWQgb25seSBldmVuIGZpZWxkcyAqLworCXNhYV9yZWdzW25vcm1dW1NBQTcxOTZfRk1UU10gPSAoaW50ZXJsYWNlKSA/CisJCQkJCShzYWFfcmVnc1tub3JtXVtTQUE3MTk2X0ZNVFNdICYgfjB4NjApCisJCQkJCTogKHNhYV9yZWdzW25vcm1dW1NBQTcxOTZfRk1UU10gfCAweDYwKTsKKwkvKiB0cmFuc3BhcmVudCBtb2RlOyBleHRlbmRlZCBmb3JtYXQgZW5hYmxlZCAqLworCXNhYV9yZWdzW25vcm1dW1NBQTcxOTZfRFBBVEhdIHw9IDB4MzsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogREJETUEgc3VwcG9ydCBmdW5jdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGFuYl9kYmRtYV9yZXN0YXJ0KHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzICpjaCkKK3sKKwlvdXRfbGUzMigmY2gtPmNvbnRyb2wsIFBMQU5CX0NMUihSVU4pKTsKKwlvdXRfbGUzMigmY2gtPmNvbnRyb2wsIFBMQU5CX1NFVChSVU58V0FLRSkgfCBQTEFOQl9DTFIoUEFVU0UpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBsYW5iX2RiZG1hX3N0b3Aodm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgKmNoKQoreworCWludCBpID0gMDsKKworCW91dF9sZTMyKCZjaC0+Y29udHJvbCwgUExBTkJfQ0xSKFJVTikgfCBQTEFOQl9TRVQoRkxVU0gpKTsKKwl3aGlsZSgoaW5fbGUzMigmY2gtPnN0YXR1cykgPT0gKEFDVElWRSB8IEZMVVNIKSkgJiYgKGkgPCA5OTkpKSB7CisJCUlERUJVRygiUGxhbkI6IHdhaXRpbmcgZm9yIERNQSB0byBzdG9wXG4iKTsKKwkJaSsrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRhYl9jbWRfZGJkbWEodm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY2gsCisJdW5zaWduZWQgc2hvcnQgY29tbWFuZCwgdW5zaWduZWQgaW50IGNtZF9kZXApCit7CisJc3RfbGUxNigmY2gtPmNvbW1hbmQsIGNvbW1hbmQpOworCXN0X2xlMzIoJmNoLT5jbWRfZGVwLCBjbWRfZGVwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRhYl9jbWRfc3RvcmUodm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY2gsCisJdW5zaWduZWQgaW50IHBoeV9hZGRyLCB1bnNpZ25lZCBpbnQgY21kX2RlcCkKK3sKKwlzdF9sZTE2KCZjaC0+Y29tbWFuZCwgU1RPUkVfV09SRCB8IEtFWV9TWVNURU0pOworCXN0X2xlMTYoJmNoLT5yZXFfY291bnQsIDQpOworCXN0X2xlMzIoJmNoLT5waHlfYWRkciwgcGh5X2FkZHIpOworCXN0X2xlMzIoJmNoLT5jbWRfZGVwLCBjbWRfZGVwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRhYl9jbWRfZ2VuKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNoLAorCXVuc2lnbmVkIHNob3J0IGNvbW1hbmQsIHVuc2lnbmVkIHNob3J0IHJlcV9jb3VudCwKKwl1bnNpZ25lZCBpbnQgcGh5X2FkZHIsIHVuc2lnbmVkIGludCBjbWRfZGVwKQoreworCXN0X2xlMTYoJmNoLT5jb21tYW5kLCBjb21tYW5kKTsKKwlzdF9sZTE2KCZjaC0+cmVxX2NvdW50LCByZXFfY291bnQpOworCXN0X2xlMzIoJmNoLT5waHlfYWRkciwgcGh5X2FkZHIpOworCXN0X2xlMzIoJmNoLT5jbWRfZGVwLCBjbWRfZGVwKTsKK30KKworc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNtZF9nZW9fc2V0dXAoCisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqYzEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGludGVybGFjZSwKKwlpbnQgYnBwLCBpbnQgY2xpcCwgc3RydWN0IHBsYW5iICpwYikKK3sKKwlpbnQgbm9ybSA9IHBiLT53aW4ubm9ybTsKKworCWlmKChzYWFfZ2VvX3NldHVwKHdpZHRoLCBoZWlnaHQsIGludGVybGFjZSwgYnBwLCBwYikpICE9IDApCisJCXJldHVybiAodm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqKU5VTEw7CisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5zYWFfYWRkciksCisJCQkJCQkJU0FBNzE5Nl9GTVRTKTsKKwl0YWJfY21kX3N0b3JlKGMxKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPnNhYV9yZWd2YWwpLAorCQkJCQlzYWFfcmVnc1tub3JtXVtTQUE3MTk2X0ZNVFNdKTsKKwl0YWJfY21kX3N0b3JlKGMxKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPnNhYV9hZGRyKSwKKwkJCQkJCQlTQUE3MTk2X0RQQVRIKTsKKwl0YWJfY21kX3N0b3JlKGMxKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPnNhYV9yZWd2YWwpLAorCQkJCQlzYWFfcmVnc1tub3JtXVtTQUE3MTk2X0RQQVRIXSk7CisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5ldmVuKSwKKwkJCQkJYnBwIHwgKChjbGlwKT8gUExBTkJfQ0xJUE1BU0s6IDApKTsKKwl0YWJfY21kX3N0b3JlKGMxKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPm9kZCksCisJCQkJCWJwcCB8ICgoY2xpcCk/IFBMQU5CX0NMSVBNQVNLOiAwKSk7CisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5zYWFfYWRkciksCisJCQkJCQkJU0FBNzE5Nl9PVVRQSVgpOworCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+c2FhX3JlZ3ZhbCksCisJCQkJCXNhYV9yZWdzW25vcm1dW1NBQTcxOTZfT1VUUElYXSk7CisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5zYWFfYWRkciksCisJCQkJCQkJU0FBNzE5Nl9IRklMVCk7CisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5zYWFfcmVndmFsKSwKKwkJCQkJc2FhX3JlZ3Nbbm9ybV1bU0FBNzE5Nl9IRklMVF0pOworCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+c2FhX2FkZHIpLAorCQkJCQkJCVNBQTcxOTZfT1VUTElORSk7CisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5zYWFfcmVndmFsKSwKKwkJCQkJc2FhX3JlZ3Nbbm9ybV1bU0FBNzE5Nl9PVVRMSU5FXSk7CisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5zYWFfYWRkciksCisJCQkJCQkJU0FBNzE5Nl9WWVApOworCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+c2FhX3JlZ3ZhbCksCisJCQkJCXNhYV9yZWdzW25vcm1dW1NBQTcxOTZfVllQXSk7CisJcmV0dXJuIGMxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbWlzYy4gc3VwcG9ydGluZyBmdW5jdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGFuYl9sb2NrKHN0cnVjdCBwbGFuYiAqcGIpCit7CisJZG93bigmcGItPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGxhbmJfdW5sb2NrKHN0cnVjdCBwbGFuYiAqcGIpCit7CisJdXAoJnBiLT5sb2NrKTsKK30KKworLyoqKioqKioqKioqKioqKi8KKy8qIERyaXZlciBDb3JlICovCisvKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHBsYW5iX3ByZXBhcmVfb3BlbihzdHJ1Y3QgcGxhbmIgKnBiKQoreworCWludAlpLCBzaXplOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0d28gcGx1cyBhbHBoYSBjb21tYW5kIGJ1ZmZlcnMgKHNpemU6IG1heCBsaW5lcywKKwkgICBwbHVzIDQwIGNvbW1hbmRzIGhhbmRsaW5nLCBwbHVzIDEgYWxpZ25tZW50KSwgcGx1cyBkdW1teSBjb21tYW5kIGJ1ZiwKKwkgICBwbHVzIGNsaXBtYXNrIGJ1ZmZlciwgcGx1cyBmcmFtZSBncmFiYmluZyBzdGF0dXMgKi8KKwlzaXplID0gKHBiLT50YWJfc2l6ZSooMitNQVhfR0JVRkZFUlMqVEFCX0ZBQ1RPUikrMStNQVhfR0JVRkZFUlMKKwkJKiBQTEFOQl9EVU1NWSkqc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpCisJCSsoUExBTkJfTUFYTElORVMqKChQTEFOQl9NQVhQSVhFTFMrNykmIH43KSkvOAorCQkrTUFYX0dCVUZGRVJTKnNpemVvZih1bnNpZ25lZCBpbnQpOworCWlmICgocGItPnByaXZfc3BhY2UgPSBrbWFsbG9jIChzaXplLCBHRlBfS0VSTkVMKSkgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0ICgodm9pZCAqKSBwYi0+cHJpdl9zcGFjZSwgMCwgc2l6ZSk7CisJcGItPm92ZXJsYXlfbGFzdDEgPSBwYi0+Y2gxX2NtZCA9ICh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICopCisJCQkJCQlEQkRNQV9BTElHTiAocGItPnByaXZfc3BhY2UpOworCXBiLT5vdmVybGF5X2xhc3QyID0gcGItPmNoMl9jbWQgPSBwYi0+Y2gxX2NtZCArIHBiLT50YWJfc2l6ZTsKKwlwYi0+Y2gxX2NtZF9waHlzID0gdmlydF90b19idXMocGItPmNoMV9jbWQpOworCXBiLT5jYXBfY21kWzBdID0gcGItPmNoMl9jbWQgKyBwYi0+dGFiX3NpemU7CisJcGItPnByZV9jbWRbMF0gPSBwYi0+Y2FwX2NtZFswXSArIHBiLT50YWJfc2l6ZSAqIFRBQl9GQUNUT1I7CisJZm9yIChpID0gMTsgaSA8IE1BWF9HQlVGRkVSUzsgaSsrKSB7CisJCXBiLT5jYXBfY21kW2ldID0gcGItPnByZV9jbWRbaS0xXSArIFBMQU5CX0RVTU1ZOworCQlwYi0+cHJlX2NtZFtpXSA9IHBiLT5jYXBfY21kW2ldICsgcGItPnRhYl9zaXplICogVEFCX0ZBQ1RPUjsKKwl9CisJcGItPmZyYW1lX3N0YXQ9KHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShwYi0+cHJlX2NtZFtNQVhfR0JVRkZFUlMtMV0KKwkJCQkJCSsgUExBTkJfRFVNTVkpOworCXBiLT5tYXNrID0gKHVuc2lnbmVkIGNoYXIgKikocGItPmZyYW1lX3N0YXQrTUFYX0dCVUZGRVJTKTsKKworCXBiLT5yYXdidWYgPSBOVUxMOworCXBiLT5yYXdidWZfc2l6ZSA9IDA7CisJcGItPmdyYWJiaW5nID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0dCVUZGRVJTOyBpKyspIHsKKwkJcGItPmZyYW1lX3N0YXRbaV0gPSBHQlVGRkVSX1VOVVNFRDsKKwkJcGItPmd3aWR0aFtpXSA9IDA7CisJCXBiLT5naGVpZ2h0W2ldID0gMDsKKwkJcGItPmdmbXRbaV0gPSAwOworCQlwYi0+Z25vcm1fc3dpdGNoW2ldID0gMDsKKyNpZm5kZWYgUExBTkJfR1NDQU5MSU5FCisJCXBiLT5sc2l6ZVtpXSA9IDA7CisJCXBiLT5sbnVtW2ldID0gMDsKKyNlbmRpZiAvKiBQTEFOQl9HU0NBTkxJTkUgKi8KKwl9CisJcGItPmdjb3VudCA9IDA7CisJcGItPnN1c3BlbmQgPSAwOworCXBiLT5sYXN0X2ZyID0gLTk5OTsKKwlwYi0+cHJldl9sYXN0X2ZyID0gLTk5OTsKKworCS8qIFJlc2V0IERNQSBjb250cm9sbGVycyAqLworCXBsYW5iX2RiZG1hX3N0b3AoJnBiLT5wbGFuYl9iYXNlLT5jaDIpOworCXBsYW5iX2RiZG1hX3N0b3AoJnBiLT5wbGFuYl9iYXNlLT5jaDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBsYW5iX3ByZXBhcmVfY2xvc2Uoc3RydWN0IHBsYW5iICpwYikKK3sKKwlpbnQgaTsKKworCS8qIG1ha2Ugc3VyZSB0aGUgZG1hJ3MgYXJlIGlkbGUgKi8KKwlwbGFuYl9kYmRtYV9zdG9wKCZwYi0+cGxhbmJfYmFzZS0+Y2gyKTsKKwlwbGFuYl9kYmRtYV9zdG9wKCZwYi0+cGxhbmJfYmFzZS0+Y2gxKTsKKwkvKiBmcmVlIGtlcm5lbCBtZW1vcnkgb2YgY29tbWFuZCBidWZmZXJzICovCisJaWYocGItPnByaXZfc3BhY2UgIT0gMCkgeworCQlrZnJlZSAocGItPnByaXZfc3BhY2UpOworCQlwYi0+cHJpdl9zcGFjZSA9IDA7CisJCXBiLT5jbWRfYnVmZl9pbml0ZWQgPSAwOworCX0KKwlpZihwYi0+cmF3YnVmKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwYi0+cmF3YnVmX3NpemU7IGkrKykgeworCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHBiLT5yYXdidWZbaV0pKTsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcGItPnJhd2J1ZltpXSwgMCk7CisJCX0KKwkJa2ZyZWUocGItPnJhd2J1Zik7CisJfQorCXBiLT5yYXdidWYgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBvdmVybGF5IHN1cHBvcnQgZnVuY3Rpb25zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgaW50IG92ZXJsYXlfaXNfYWN0aXZlKHN0cnVjdCBwbGFuYiAqcGIpCit7CisJdW5zaWduZWQgaW50IHNpemUgPSBwYi0+dGFiX3NpemUgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCk7CisJdW5zaWduZWQgaW50IGNhZGRyID0gKHVuc2lnbmVkKWluX2xlMzIoJnBiLT5wbGFuYl9iYXNlLT5jaDEuY21kcHRyKTsKKworCXJldHVybiAoaW5fbGUzMigmcGItPm92ZXJsYXlfbGFzdDEtPmNtZF9kZXApID09IHBiLT5jaDFfY21kX3BoeXMpCisJCQkmJiAoY2FkZHIgPCAocGItPmNoMV9jbWRfcGh5cyArIHNpemUpKQorCQkJJiYgKGNhZGRyID49ICh1bnNpZ25lZClwYi0+Y2gxX2NtZF9waHlzKTsKK30KKworc3RhdGljIHZvaWQgb3ZlcmxheV9zdGFydChzdHJ1Y3QgcGxhbmIgKnBiKQoreworCisJREVCVUcoIlBsYW5COiBvdmVybGF5X3N0YXJ0KClcbiIpOworCisJaWYoQUNUSVZFICYgaW5fbGUzMigmcGItPnBsYW5iX2Jhc2UtPmNoMS5zdGF0dXMpKSB7CisKKwkJREVCVUcoIlBsYW5COiBwcmVzdW1hYmx5LCBncmFiYmluZyBpcyBpbiBwcm9ncmVzcy4uLlxuIik7CisKKwkJcGxhbmJfZGJkbWFfc3RvcCgmcGItPnBsYW5iX2Jhc2UtPmNoMik7CisJCW91dF9sZTMyICgmcGItPnBsYW5iX2Jhc2UtPmNoMi5jbWRwdHIsCisJCQkJCQl2aXJ0X3RvX2J1cyhwYi0+Y2gyX2NtZCkpOworCQlwbGFuYl9kYmRtYV9yZXN0YXJ0KCZwYi0+cGxhbmJfYmFzZS0+Y2gyKTsKKwkJc3RfbGUxNiAoJnBiLT5jaDFfY21kLT5jb21tYW5kLCBEQkRNQV9OT1ApOworCQl0YWJfY21kX2RiZG1hKHBiLT5sYXN0X2NtZFtwYi0+bGFzdF9mcl0sCisJCQkJCURCRE1BX05PUCB8IEJSX0FMV0FZUywKKwkJCQkJdmlydF90b19idXMocGItPmNoMV9jbWQpKTsKKwkJZWllaW8oKTsKKwkJcGItPnByZXZfbGFzdF9mciA9IHBiLT5sYXN0X2ZyOworCQlwYi0+bGFzdF9mciA9IC0yOworCQlpZighKEFDVElWRSAmIGluX2xlMzIoJnBiLT5wbGFuYl9iYXNlLT5jaDEuc3RhdHVzKSkpIHsKKwkJCUlERUJVRygiUGxhbkI6IGJlY2FtZSBpbmFjdGl2ZSAiCisJCQkJImluIHRoZSBtZWFuIHRpbWUuLi4gcmVhY3RpdmF0aW5nXG4iKTsKKwkJCXBsYW5iX2RiZG1hX3N0b3AoJnBiLT5wbGFuYl9iYXNlLT5jaDEpOworCQkJb3V0X2xlMzIgKCZwYi0+cGxhbmJfYmFzZS0+Y2gxLmNtZHB0ciwKKwkJCQkJCXZpcnRfdG9fYnVzKHBiLT5jaDFfY21kKSk7CisJCQlwbGFuYl9kYmRtYV9yZXN0YXJ0KCZwYi0+cGxhbmJfYmFzZS0+Y2gxKTsKKwkJfQorCX0gZWxzZSB7CisKKwkJREVCVUcoIlBsYW5COiBjdXJyZW50bHkgaWRsZSwgc28gY2FuIGRvIHdoYXRldmVyXG4iKTsKKworCQlwbGFuYl9kYmRtYV9zdG9wKCZwYi0+cGxhbmJfYmFzZS0+Y2gyKTsKKwkJcGxhbmJfZGJkbWFfc3RvcCgmcGItPnBsYW5iX2Jhc2UtPmNoMSk7CisJCXN0X2xlMzIgKCZwYi0+cGxhbmJfYmFzZS0+Y2gyLmNtZHB0ciwKKwkJCQkJCXZpcnRfdG9fYnVzKHBiLT5jaDJfY21kKSk7CisJCXN0X2xlMzIgKCZwYi0+cGxhbmJfYmFzZS0+Y2gxLmNtZHB0ciwKKwkJCQkJCXZpcnRfdG9fYnVzKHBiLT5jaDFfY21kKSk7CisJCW91dF9sZTE2ICgmcGItPmNoMV9jbWQtPmNvbW1hbmQsIERCRE1BX05PUCk7CisJCXBsYW5iX2RiZG1hX3Jlc3RhcnQoJnBiLT5wbGFuYl9iYXNlLT5jaDIpOworCQlwbGFuYl9kYmRtYV9yZXN0YXJ0KCZwYi0+cGxhbmJfYmFzZS0+Y2gxKTsKKwkJcGItPmxhc3RfZnIgPSAtMTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBvdmVybGF5X3N0b3Aoc3RydWN0IHBsYW5iICpwYikKK3sKKwlERUJVRygiUGxhbkI6IG92ZXJsYXlfc3RvcCgpXG4iKTsKKworCWlmKHBiLT5sYXN0X2ZyID09IC0xKSB7CisKKwkJREVCVUcoIlBsYW5COiBubyBncmFiYmluZywgaXQgc2VlbXMuLi5cbiIpOworCisJCXBsYW5iX2RiZG1hX3N0b3AoJnBiLT5wbGFuYl9iYXNlLT5jaDIpOworCQlwbGFuYl9kYmRtYV9zdG9wKCZwYi0+cGxhbmJfYmFzZS0+Y2gxKTsKKwkJcGItPmxhc3RfZnIgPSAtOTk5OworCX0gZWxzZSBpZihwYi0+bGFzdF9mciA9PSAtMikgeworCQl1bnNpZ25lZCBpbnQgY21kX2RlcDsKKwkJdGFiX2NtZF9kYmRtYShwYi0+Y2FwX2NtZFtwYi0+cHJldl9sYXN0X2ZyXSwgREJETUFfU1RPUCwgMCk7CisJCWVpZWlvKCk7CisJCWNtZF9kZXAgPSAodW5zaWduZWQgaW50KWluX2xlMzIoJnBiLT5vdmVybGF5X2xhc3QxLT5jbWRfZGVwKTsKKwkJaWYob3ZlcmxheV9pc19hY3RpdmUocGIpKSB7CisKKwkJCURFQlVHKCJQbGFuQjogb3ZlcmxheSBpcyBjdXJyZW50bHkgYWN0aXZlXG4iKTsKKworCQkJcGxhbmJfZGJkbWFfc3RvcCgmcGItPnBsYW5iX2Jhc2UtPmNoMik7CisJCQlwbGFuYl9kYmRtYV9zdG9wKCZwYi0+cGxhbmJfYmFzZS0+Y2gxKTsKKwkJCWlmKGNtZF9kZXAgIT0gcGItPmNoMV9jbWRfcGh5cykgeworCQkJCW91dF9sZTMyKCZwYi0+cGxhbmJfYmFzZS0+Y2gxLmNtZHB0ciwKKwkJCQkJCXZpcnRfdG9fYnVzKHBiLT5vdmVybGF5X2xhc3QxKSk7CisJCQkJcGxhbmJfZGJkbWFfcmVzdGFydCgmcGItPnBsYW5iX2Jhc2UtPmNoMSk7CisJCQl9CisJCX0KKwkJcGItPmxhc3RfZnIgPSBwYi0+cHJldl9sYXN0X2ZyOworCQlwYi0+cHJldl9sYXN0X2ZyID0gLTk5OTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBzdXNwZW5kX292ZXJsYXkoc3RydWN0IHBsYW5iICpwYikKK3sKKwlpbnQgZnIgPSAtMTsKKwlzdHJ1Y3QgZGJkbWFfY21kIGxhc3Q7CisKKwlERUJVRygiUGxhbkI6IHN1c3BlbmRfb3ZlcmxheTogJWRcbiIsIHBiLT5zdXNwZW5kKTsKKworCWlmKHBiLT5zdXNwZW5kKyspCisJCXJldHVybjsKKwlpZihBQ1RJVkUgJiBpbl9sZTMyKCZwYi0+cGxhbmJfYmFzZS0+Y2gxLnN0YXR1cykpIHsKKwkJaWYocGItPmxhc3RfZnIgPT0gLTIpIHsKKwkJCWZyID0gcGItPnByZXZfbGFzdF9mcjsKKwkJCW1lbWNweSgmbGFzdCwgKHZvaWQqKXBiLT5sYXN0X2NtZFtmcl0sIHNpemVvZihsYXN0KSk7CisJCQl0YWJfY21kX2RiZG1hKHBiLT5sYXN0X2NtZFtmcl0sIERCRE1BX1NUT1AsIDApOworCQl9CisJCWlmKG92ZXJsYXlfaXNfYWN0aXZlKHBiKSkgeworCQkJcGxhbmJfZGJkbWFfc3RvcCgmcGItPnBsYW5iX2Jhc2UtPmNoMik7CisJCQlwbGFuYl9kYmRtYV9zdG9wKCZwYi0+cGxhbmJfYmFzZS0+Y2gxKTsKKwkJCXBiLT5zdXNwZW5kZWQub3ZlcmxheSA9IDE7CisJCQlwYi0+c3VzcGVuZGVkLmZyYW1lID0gZnI7CisJCQltZW1jcHkoJnBiLT5zdXNwZW5kZWQuY21kLCAmbGFzdCwgc2l6ZW9mKGxhc3QpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlwYi0+c3VzcGVuZGVkLm92ZXJsYXkgPSAwOworCXBiLT5zdXNwZW5kZWQuZnJhbWUgPSBmcjsKKwltZW1jcHkoJnBiLT5zdXNwZW5kZWQuY21kLCAmbGFzdCwgc2l6ZW9mKGxhc3QpKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJlc3VtZV9vdmVybGF5KHN0cnVjdCBwbGFuYiAqcGIpCit7CisKKwlERUJVRygiUGxhbkI6IHJlc3VtZV9vdmVybGF5OiAlZFxuIiwgcGItPnN1c3BlbmQpOworCisJaWYocGItPnN1c3BlbmQgPiAxKQorCQlyZXR1cm47CisJaWYocGItPnN1c3BlbmRlZC5mcmFtZSAhPSAtMSkgeworCQltZW1jcHkoKHZvaWQqKXBiLT5sYXN0X2NtZFtwYi0+c3VzcGVuZGVkLmZyYW1lXSwKKwkJCQkmcGItPnN1c3BlbmRlZC5jbWQsIHNpemVvZihwYi0+c3VzcGVuZGVkLmNtZCkpOworCX0KKwlpZihBQ1RJVkUgJiBpbl9sZTMyKCZwYi0+cGxhbmJfYmFzZS0+Y2gxLnN0YXR1cykpIHsKKwkJZ290byBmaW5pc2g7CisJfQorCWlmKHBiLT5zdXNwZW5kZWQub3ZlcmxheSkgeworCisJCURFQlVHKCJQbGFuQjogb3ZlcmxheSBiZWluZyByZXN1bWVkXG4iKTsKKworCQlzdF9sZTE2ICgmcGItPmNoMV9jbWQtPmNvbW1hbmQsIERCRE1BX05PUCk7CisJCXN0X2xlMTYgKCZwYi0+Y2gyX2NtZC0+Y29tbWFuZCwgREJETUFfTk9QKTsKKwkJLyogU2V0IGNvbW1hbmQgYnVmZmVyIGFkZHJlc3NlcyAqLworCQlzdF9sZTMyKCZwYi0+cGxhbmJfYmFzZS0+Y2gxLmNtZHB0ciwKKwkJCQkJdmlydF90b19idXMocGItPm92ZXJsYXlfbGFzdDEpKTsKKwkJb3V0X2xlMzIoJnBiLT5wbGFuYl9iYXNlLT5jaDIuY21kcHRyLAorCQkJCQl2aXJ0X3RvX2J1cyhwYi0+b3ZlcmxheV9sYXN0MikpOworCQkvKiBTdGFydCB0aGUgRE1BIGNvbnRyb2xsZXIgKi8KKwkJb3V0X2xlMzIgKCZwYi0+cGxhbmJfYmFzZS0+Y2gyLmNvbnRyb2wsCisJCQkJUExBTkJfQ0xSKFBBVVNFKSB8IFBMQU5CX1NFVChSVU58V0FLRSkpOworCQlvdXRfbGUzMiAoJnBiLT5wbGFuYl9iYXNlLT5jaDEuY29udHJvbCwKKwkJCQlQTEFOQl9DTFIoUEFVU0UpIHwgUExBTkJfU0VUKFJVTnxXQUtFKSk7CisJfSBlbHNlIGlmKHBiLT5zdXNwZW5kZWQuZnJhbWUgIT0gLTEpIHsKKwkJb3V0X2xlMzIoJnBiLT5wbGFuYl9iYXNlLT5jaDEuY21kcHRyLAorCQkJCXZpcnRfdG9fYnVzKHBiLT5sYXN0X2NtZFtwYi0+c3VzcGVuZGVkLmZyYW1lXSkpOworCQlvdXRfbGUzMiAoJnBiLT5wbGFuYl9iYXNlLT5jaDEuY29udHJvbCwKKwkJCQlQTEFOQl9DTFIoUEFVU0UpIHwgUExBTkJfU0VUKFJVTnxXQUtFKSk7CisJfQorCitmaW5pc2g6CisJcGItPnN1c3BlbmQtLTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBiLT5zdXNwZW5kcSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9jbGlwKHN0cnVjdCBwbGFuYiAqcGIsIHN0cnVjdCB2aWRlb19jbGlwICpjbGlwKSAKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSpiYXNlOworCWludAl4YyA9IGNsaXAtPngsIHljID0gY2xpcC0+eTsKKwlpbnQJd2MgPSBjbGlwLT53aWR0aCwgaGMgPSBjbGlwLT5oZWlnaHQ7CisJaW50CXd3ID0gcGItPndpbi53aWR0aCwgaHcgPSBwYi0+d2luLmhlaWdodDsKKwlpbnQJeCwgeSwgeHRtcDEsIHh0bXAyOworCisJREVCVUcoIlBsYW5COiBjbGlwICVkeCVkKyVkKyVkXG4iLCB3YywgaGMsIHhjLCB5Yyk7CisKKwlpZih4YyA8IDApIHsKKwkJd2MgKz0geGM7CisJCXhjID0gMDsKKwl9CisJaWYoeWMgPCAwKSB7CisJCWhjICs9IHljOworCQl5YyA9IDA7CisJfQorCWlmKHhjICsgd2MgPiB3dykKKwkJd2MgPSB3dyAtIHhjOworCWlmKHdjIDw9IDApIC8qIE5vdGhpbmcgdG8gZG8gKi8KKwkJcmV0dXJuOworCWlmKHljICsgaGMgPiBodykKKwkJaGMgPSBodyAtIHljOworCisJZm9yICh5ID0geWM7IHkgPCB5YytoYzsgeSsrKSB7CisJCXh0bXAxPXhjPj4zOworCQl4dG1wMj0oeGMrd2MpPj4zOworCQliYXNlID0gcGItPm1hc2sgKyB5Kjk2OworCQlpZih4YyAhPSAwIHx8IHdjID49IDgpCisJCQkqKGJhc2UgKyB4dG1wMSkgJj0gKHVuc2lnbmVkIGNoYXIpKDB4MDBmZiAmCisJCQkJKDB4ZmYwMCA+PiAoeGMmNykpKTsKKwkJZm9yICh4ID0geHRtcDEgKyAxOyB4IDwgeHRtcDI7IHgrKykgeworCQkJKihiYXNlICsgeCkgPSAwOworCQl9CisJCWlmKHhjIDwgKHd3ICYgfjB4NykpCisJCQkqKGJhc2UgKyB4dG1wMikgJj0gKHVuc2lnbmVkIGNoYXIpKDB4MDBmZiA+PgorCQkJCSgoeGMrd2MpICYgNykpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZmlsbF9jbWRfYnVmZihzdHJ1Y3QgcGxhbmIgKnBiKQoreworCWludCByZXN0b3JlID0gMDsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kIGxhc3Q7CisKKwlERUJVRygiUGxhbkI6IGZpbGxfY21kX2J1ZmYoKVxuIik7CisKKwlpZihwYi0+b3ZlcmxheV9sYXN0MSAhPSBwYi0+Y2gxX2NtZCkgeworCQlyZXN0b3JlID0gMTsKKwkJbGFzdCA9ICoocGItPm92ZXJsYXlfbGFzdDEpOworCX0KKwltZW1zZXQgKCh2b2lkICopIHBiLT5jaDFfY21kLCAwLCAyICogcGItPnRhYl9zaXplCisJCQkJCSogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwljbWRfYnVmZiAocGIpOworCWlmKHJlc3RvcmUpCisJCSoocGItPm92ZXJsYXlfbGFzdDEpID0gbGFzdDsKKwlpZihwYi0+c3VzcGVuZGVkLm92ZXJsYXkpIHsKKwkJdW5zaWduZWQgbG9uZyBqdW1wX2FkZHIgPSBpbl9sZTMyKCZwYi0+b3ZlcmxheV9sYXN0MS0+Y21kX2RlcCk7CisJCWlmKGp1bXBfYWRkciAhPSBwYi0+Y2gxX2NtZF9waHlzKSB7CisJCQlpbnQgaTsKKworCQkJREVCVUcoIlBsYW5COiBhZGp1c3RpbmcgY2gxJ3MganVtcCBhZGRyZXNzXG4iKTsKKworCQkJZm9yKGkgPSAwOyBpIDwgTUFYX0dCVUZGRVJTOyBpKyspIHsKKwkJCQlpZihwYi0+bmVlZF9wcmVfY2FwdHVyZVtpXSkgeworCQkJCSAgICBpZihqdW1wX2FkZHIgPT0gdmlydF90b19idXMocGItPnByZV9jbWRbaV0pKQorCQkJCQlnb3RvIGZvdW5kOworCQkJCX0gZWxzZSB7CisJCQkJICAgIGlmKGp1bXBfYWRkciA9PSB2aXJ0X3RvX2J1cyhwYi0+Y2FwX2NtZFtpXSkpCisJCQkJCWdvdG8gZm91bmQ7CisJCQkJfQorCQkJfQorCisJCQlERUJVRygiUGxhbkI6IG5vdCBmb3VuZC4uLlxuIik7CisKKwkJCWdvdG8gb3V0OworZm91bmQ6CisJCQlpZihwYi0+bmVlZF9wcmVfY2FwdHVyZVtpXSkKKwkJCQlvdXRfbGUzMigmcGItPnByZV9jbWRbaV0tPnBoeV9hZGRyLAorCQkJCQkJdmlydF90b19idXMocGItPm92ZXJsYXlfbGFzdDEpKTsKKwkJCWVsc2UKKwkJCQlvdXRfbGUzMigmcGItPmNhcF9jbWRbaV0tPnBoeV9hZGRyLAorCQkJCQkJdmlydF90b19idXMocGItPm92ZXJsYXlfbGFzdDEpKTsKKwkJfQorCX0KK291dDoKKwlwYi0+Y21kX2J1ZmZfaW5pdGVkID0gMTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY21kX2J1ZmYoc3RydWN0IHBsYW5iICpwYikKK3sKKwlpbnQJCWksIGJwcCwgY291bnQsIG5saW5lcywgc3RlcHNpemUsIGludGVybGFjZTsKKwl1bnNpZ25lZCBsb25nCWJhc2UsIGp1bXAsIGFkZHJfY29tLCBhZGRyX2RlcDsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjMSA9IHBiLT5jaDFfY21kOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmMyID0gcGItPmNoMl9jbWQ7CisKKwlpbnRlcmxhY2UgPSBwYi0+d2luLmludGVybGFjZTsKKwlicHAgPSBwYi0+d2luLmJwcDsKKwljb3VudCA9IChicHAgKiAoKHBiLT53aW4ueCArIHBiLT53aW4ud2lkdGggPiBwYi0+d2luLnN3aWR0aCkgPworCQkocGItPndpbi5zd2lkdGggLSBwYi0+d2luLngpIDogcGItPndpbi53aWR0aCkpOworCW5saW5lcyA9ICgocGItPndpbi55ICsgcGItPndpbi5oZWlnaHQgPiBwYi0+d2luLnNoZWlnaHQpID8KKwkJKHBiLT53aW4uc2hlaWdodCAtIHBiLT53aW4ueSkgOiBwYi0+d2luLmhlaWdodCk7CisKKwkvKiBEbyB2aWRlbyBpbjogKi8KKworCS8qIFByZWFtYmxlIGNvbW1hbmRzOiAqLworCWFkZHJfY29tID0gdmlydF90b19idXMoYzEpOworCWFkZHJfZGVwID0gdmlydF90b19idXMoJmMxLT5jbWRfZGVwKTsKKwl0YWJfY21kX2RiZG1hKGMxKyssIERCRE1BX05PUCwgMCk7CisJanVtcCA9IHZpcnRfdG9fYnVzKGMxKzE2KTsgLyogMTQgYnkgY21kX2dlb19zZXR1cCgpIGFuZCAyIGZvciBwYWRkaW5nICovCisJaWYoKGMxID0gY21kX2dlb19zZXR1cChjMSwgcGItPndpbi53aWR0aCwgcGItPndpbi5oZWlnaHQsIGludGVybGFjZSwKKwkJCQkJYnBwLCAxLCBwYikpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUGxhbkI6IGVuY291bnRlcmVkIHNlcmlvdXMgcHJvYmxlbXNcbiIpOworCQl0YWJfY21kX2RiZG1hKHBiLT5jaDFfY21kICsgMSwgREJETUFfU1RPUCwgMCk7CisJCXRhYl9jbWRfZGJkbWEocGItPmNoMl9jbWQgKyAxLCBEQkRNQV9TVE9QLCAwKTsKKwkJcmV0dXJuOworCX0KKwl0YWJfY21kX3N0b3JlKGMxKyssIGFkZHJfY29tLCAodW5zaWduZWQpKERCRE1BX05PUCB8IEJSX0FMV0FZUykgPDwgMTYpOworCXRhYl9jbWRfc3RvcmUoYzErKywgYWRkcl9kZXAsIGp1bXApOworCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gxLndhaXRfc2VsKSwKKwkJCQkJCQlQTEFOQl9TRVQoRklFTERfU1lOQykpOworCQkvKiAoMSkgd2FpdCBmb3IgZmllbGQgc3luYyB0byBiZSBzZXQgKi8KKwl0YWJfY21kX2RiZG1hKGMxKyssIERCRE1BX05PUCB8IFdBSVRfSUZDTFIsIDApOworCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gxLmJyX3NlbCksCisJCQkJCQkJUExBTkJfU0VUKE9ERF9GSUVMRCkpOworCQkvKiB3YWl0IGZvciBmaWVsZCBzeW5jIHRvIGJlIGNsZWFyZWQgKi8KKwl0YWJfY21kX2RiZG1hKGMxKyssIERCRE1BX05PUCB8IFdBSVRfSUZTRVQsIDApOworCQkvKiBpZiBub3Qgb2RkIGZpZWxkLCB3YWl0IHVudGlsIGZpZWxkIHN5bmMgaXMgc2V0IGFnYWluICovCisJdGFiX2NtZF9kYmRtYShjMSwgREJETUFfTk9QIHwgQlJfSUZTRVQsIHZpcnRfdG9fYnVzKGMxLTMpKTsgYzErKzsKKwkJLyogYXNzZXJ0IGNoX3N5bmMgdG8gY2gyICovCisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5jaDIuY29udHJvbCksCisJCQkJCQkJUExBTkJfU0VUKENIX1NZTkMpKTsKKwl0YWJfY21kX3N0b3JlKGMxKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPmNoMS5icl9zZWwpLAorCQkJCQkJCVBMQU5CX1NFVChETUFfQUJPUlQpKTsKKworCWJhc2UgPSAocGItPmZyYW1lX2J1ZmZlcl9waHlzICsgcGItPm9mZnNldCArIHBiLT53aW4ueSAqIChwYi0+d2luLmJwbAorCQkJCQkrIHBiLT53aW4ucGFkKSArIHBiLT53aW4ueCAqIGJwcCk7CisKKwlpZiAoaW50ZXJsYWNlKSB7CisJCXN0ZXBzaXplID0gMjsKKwkJanVtcCA9IHZpcnRfdG9fYnVzKGMxICsgKG5saW5lcyArIDEpIC8gMik7CisJfSBlbHNlIHsKKwkJc3RlcHNpemUgPSAxOworCQlqdW1wID0gdmlydF90b19idXMoYzEgKyBubGluZXMpOworCX0KKworCS8qIGV2ZW4gZmllbGQgZGF0YTogKi8KKwlmb3IgKGk9MDsgaSA8IG5saW5lczsgaSArPSBzdGVwc2l6ZSwgYzErKykKKwkJdGFiX2NtZF9nZW4oYzEsIElOUFVUX01PUkUgfCBLRVlfU1RSRUFNMCB8IEJSX0lGU0VULAorCQkJY291bnQsIGJhc2UgKyBpICogKHBiLT53aW4uYnBsICsgcGItPndpbi5wYWQpLCBqdW1wKTsKKworCS8qIEZvciBub24taW50ZXJsYWNlZCwgd2UgdXNlIGV2ZW4gZmllbGRzIG9ubHkgKi8KKwlpZiAoIWludGVybGFjZSkKKwkJZ290byBjbWRfdGFiX2RhdGFfZW5kOworCisJLyogUmVzeW5jIHRvIG9kZCBmaWVsZCAqLworCQkvKiAoMikgd2FpdCBmb3IgZmllbGQgc3luYyB0byBiZSBzZXQgKi8KKwl0YWJfY21kX2RiZG1hKGMxKyssIERCRE1BX05PUCB8IFdBSVRfSUZDTFIsIDApOworCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gxLmJyX3NlbCksCisJCQkJCQkJUExBTkJfU0VUKE9ERF9GSUVMRCkpOworCQkvKiB3YWl0IGZvciBmaWVsZCBzeW5jIHRvIGJlIGNsZWFyZWQgKi8KKwl0YWJfY21kX2RiZG1hKGMxKyssIERCRE1BX05PUCB8IFdBSVRfSUZTRVQsIDApOworCQkvKiBpZiBub3Qgb2RkIGZpZWxkLCB3YWl0IHVudGlsIGZpZWxkIHN5bmMgaXMgc2V0IGFnYWluICovCisJdGFiX2NtZF9kYmRtYShjMSwgREJETUFfTk9QIHwgQlJfSUZDTFIsIHZpcnRfdG9fYnVzKGMxLTMpKTsgYzErKzsKKwkJLyogYXNzZXJ0IGNoX3N5bmMgdG8gY2gyICovCisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5jaDIuY29udHJvbCksCisJCQkJCQkJUExBTkJfU0VUKENIX1NZTkMpKTsKKwl0YWJfY21kX3N0b3JlKGMxKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPmNoMS5icl9zZWwpLAorCQkJCQkJCVBMQU5CX1NFVChETUFfQUJPUlQpKTsKKwkKKwkvKiBvZGQgZmllbGQgZGF0YTogKi8KKwlqdW1wID0gdmlydF90b19idXMoYzEgKyBubGluZXMgLyAyKTsKKwlmb3IgKGk9MTsgaSA8IG5saW5lczsgaSArPSBzdGVwc2l6ZSwgYzErKykKKwkJdGFiX2NtZF9nZW4oYzEsIElOUFVUX01PUkUgfCBLRVlfU1RSRUFNMCB8IEJSX0lGU0VULCBjb3VudCwKKwkJCWJhc2UgKyBpICogKHBiLT53aW4uYnBsICsgcGItPndpbi5wYWQpLCBqdW1wKTsKKworCS8qIEFuZCBqdW1wIGJhY2sgdG8gdGhlIHN0YXJ0ICovCitjbWRfdGFiX2RhdGFfZW5kOgorCXBiLT5vdmVybGF5X2xhc3QxID0gYzE7CS8qIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBsYXN0IGNvbW1hbmQgKi8KKwl0YWJfY21kX2RiZG1hKGMxLCBEQkRNQV9OT1AgfCBCUl9BTFdBWVMsIHZpcnRfdG9fYnVzKHBiLT5jaDFfY21kKSk7CisKKwkvKiBDbGlwbWFzayBjb21tYW5kIGJ1ZmZlciAqLworCisJLyogUHJlYW1ibGUgY29tbWFuZHM6ICovCisJdGFiX2NtZF9kYmRtYShjMisrLCBEQkRNQV9OT1AsIDApOworCXRhYl9jbWRfc3RvcmUoYzIrKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gyLndhaXRfc2VsKSwKKwkJCQkJCQlQTEFOQl9TRVQoQ0hfU1lOQykpOworCQkvKiB3YWl0IHVudGlsIGNoMSBhc3NlcnRzIGNoX3N5bmMgKi8KKwl0YWJfY21kX2RiZG1hKGMyKyssIERCRE1BX05PUCB8IFdBSVRfSUZDTFIsIDApOworCQkvKiBjbGVhciBjaF9zeW5jIGFzc2VydGVkIGJ5IGNoMSAqLworCXRhYl9jbWRfc3RvcmUoYzIrKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gyLmNvbnRyb2wpLAorCQkJCQkJCVBMQU5CX0NMUihDSF9TWU5DKSk7CisJdGFiX2NtZF9zdG9yZShjMisrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5jaDIud2FpdF9zZWwpLAorCQkJCQkJCVBMQU5CX1NFVChGSUVMRF9TWU5DKSk7CisJdGFiX2NtZF9zdG9yZShjMisrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5jaDIuYnJfc2VsKSwKKwkJCQkJCQlQTEFOQl9TRVQoT0REX0ZJRUxEKSk7CisKKwkvKiBqdW1wIHRvIGVuZCBvZiBldmVuIGZpZWxkIGlmIGFwcHJvcHJpYXRlICovCisJLyogdGhpcyBwb2ludHMgdG8gKGludGVybGFjZSk/IHBvcy4gQzogcG9zLiBCICovCisJanVtcCA9IChpbnRlcmxhY2UpID8gdmlydF90b19idXMoYzIgKyAobmxpbmVzICsgMSkgLyAyICsgMik6CisJCQkJCQl2aXJ0X3RvX2J1cyhjMiArIG5saW5lcyArIDIpOworCQkvKiBpZiBvZGQgZmllbGQsIHNraXAgb3ZlciB0byBvZGQgZmllbGQgY2xpcG1hc2tpbmcgKi8KKwl0YWJfY21kX2RiZG1hKGMyKyssIERCRE1BX05PUCB8IEJSX0lGU0VULCBqdW1wKTsKKworCS8qIGV2ZW4gZmllbGQgbWFzazogKi8KKwl0YWJfY21kX3N0b3JlKGMyKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPmNoMi5icl9zZWwpLAorCQkJCQkJCVBMQU5CX1NFVChETUFfQUJPUlQpKTsKKwkvKiB0aGlzIHBvaW50cyB0byBwb3MuIEIgKi8KKwlqdW1wID0gKGludGVybGFjZSkgPyB2aXJ0X3RvX2J1cyhjMiArIG5saW5lcyArIDEpOgorCQkJCQkJdmlydF90b19idXMoYzIgKyBubGluZXMpOworCWJhc2UgPSB2aXJ0X3RvX2J1cyhwYi0+bWFzayk7CisJZm9yIChpPTA7IGkgPCBubGluZXM7IGkgKz0gc3RlcHNpemUsIGMyKyspCisJCXRhYl9jbWRfZ2VuKGMyLCBPVVRQVVRfTU9SRSB8IEtFWV9TVFJFQU0wIHwgQlJfSUZTRVQsIDk2LAorCQkJYmFzZSArIGkgKiA5NiwganVtcCk7CisKKwkvKiBGb3Igbm9uLWludGVybGFjZWQsIHdlIHVzZSBvbmx5IGV2ZW4gZmllbGRzICovCisJaWYoIWludGVybGFjZSkKKwkJZ290byBjbWRfdGFiX21hc2tfZW5kOworCisJLyogb2RkIGZpZWxkIG1hc2s6ICovCisvKiBDICovCXRhYl9jbWRfc3RvcmUoYzIrKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gyLmJyX3NlbCksCisJCQkJCQkJUExBTkJfU0VUKERNQV9BQk9SVCkpOworCS8qIHRoaXMgcG9pbnRzIHRvIHBvcy4gQiAqLworCWp1bXAgPSB2aXJ0X3RvX2J1cyhjMiArIG5saW5lcyAvIDIpOworCWJhc2UgPSB2aXJ0X3RvX2J1cyhwYi0+bWFzayk7CisJZm9yIChpPTE7IGkgPCBubGluZXM7IGkgKz0gMiwgYzIrKykgICAgIC8qIGFib3J0IGlmIHNldCAqLworCQl0YWJfY21kX2dlbihjMiwgT1VUUFVUX01PUkUgfCBLRVlfU1RSRUFNMCB8IEJSX0lGU0VULCA5NiwKKwkJCWJhc2UgKyBpICogOTYsIGp1bXApOworCisJLyogSW5mb3JtIGNoYW5uZWwgMSBhbmQganVtcCBiYWNrIHRvIHN0YXJ0ICovCitjbWRfdGFiX21hc2tfZW5kOgorCS8qIG9rLCBJIGp1c3QgcmVhbGl6ZWQgdGhpcyBpcyBraW5kIG9mIGZsYXdlZC4gKi8KKwkvKiB0aGlzIHBhcnQgaXMgcmVhY2hlZCBvbmx5IGFmdGVyIG9kZCBmaWVsZCBjbGlwbWFza2luZy4gKi8KKwkvKiB3YW5uYSBjbGVhbiB1cD8gKi8KKwkJLyogd2FpdCBmb3IgZmllbGQgc3luYyB0byBiZSBzZXQgKi8KKwkJLyogY29ycmVzcG9uZHMgdG8gZnN5bmMgKDEpIG9mIGNoMSAqLworLyogQiAqLwl0YWJfY21kX2RiZG1hKGMyKyssIERCRE1BX05PUCB8IFdBSVRfSUZDTFIsIDApOworCQkvKiByZXN0YXJ0IGNoMSwgbWVhbnQgdG8gY2xlYXIgYW55IGRlYWQgYml0IG9yIHNvbWV0aGluZyAqLworCXRhYl9jbWRfc3RvcmUoYzIrKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gxLmNvbnRyb2wpLAorCQkJCQkJCVBMQU5CX0NMUihSVU4pKTsKKwl0YWJfY21kX3N0b3JlKGMyKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPmNoMS5jb250cm9sKSwKKwkJCQkJCQlQTEFOQl9TRVQoUlVOKSk7CisJcGItPm92ZXJsYXlfbGFzdDIgPSBjMjsJLyoga2VlcCBhIHBvaW50ZXIgdG8gdGhlIGxhc3QgY29tbWFuZCAqLworCQkvKiBzdGFydCBvdmVyIGV2ZW4gZmllbGQgY2xpcG1hc2tpbmcgKi8KKwl0YWJfY21kX2RiZG1hKGMyLCBEQkRNQV9OT1AgfCBCUl9BTFdBWVMsIHZpcnRfdG9fYnVzKHBiLT5jaDJfY21kKSk7CisKKwllaWVpbygpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGdyYWJkaXNwbGF5IHN1cHBvcnQgZnVuY3Rpb25zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHBhbGV0dGUyZm10W10gPSB7CisgICAgICAgMCwKKyAgICAgICBQTEFOQl9HUkFZLAorICAgICAgIDAsCisgICAgICAgMCwKKyAgICAgICAwLAorICAgICAgIFBMQU5CX0NPTE9VUjMyLAorICAgICAgIFBMQU5CX0NPTE9VUjE1LAorICAgICAgIDAsCisgICAgICAgMCwKKyAgICAgICAwLAorICAgICAgIDAsCisgICAgICAgMCwKKyAgICAgICAwLAorICAgICAgIDAsCisgICAgICAgMCwKK307CisKKyNkZWZpbmUgUExBTkJfUEFMRVRURV9NQVggMTUKKworc3RhdGljIGludCB2Z3JhYihzdHJ1Y3QgcGxhbmIgKnBiLCBzdHJ1Y3QgdmlkZW9fbW1hcCAqbXApCit7CisJdW5zaWduZWQgaW50IGZyID0gbXAtPmZyYW1lOworCXVuc2lnbmVkIGludCBmb3JtYXQ7CisKKwlpZihwYi0+cmF3YnVmPT1OVUxMKSB7CisJCWludCBlcnI7CisJCWlmKChlcnI9Z3JhYmJ1Zl9hbGxvYyhwYikpKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlJREVCVUcoIlBsYW5COiBncmFiICVkOiAlZHglZCgldSlcbiIsIHBiLT5ncmFiYmluZywKKwkJCQkJCW1wLT53aWR0aCwgbXAtPmhlaWdodCwgZnIpOworCisJaWYocGItPmdyYWJiaW5nID49IE1BWF9HQlVGRkVSUykKKwkJcmV0dXJuIC1FTk9CVUZTOworCWlmKGZyID4gKE1BWF9HQlVGRkVSUyAtIDEpIHx8IGZyIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYobXAtPmhlaWdodCA8PSAwIHx8IG1wLT53aWR0aCA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZihtcC0+Zm9ybWF0IDwgMCB8fCBtcC0+Zm9ybWF0ID49IFBMQU5CX1BBTEVUVEVfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZigoZm9ybWF0ID0gcGFsZXR0ZTJmbXRbbXAtPmZvcm1hdF0pID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChtcC0+aGVpZ2h0ICogbXAtPndpZHRoICogZm9ybWF0ID4gUExBTkJfTUFYX0ZCVUYpIC8qIGZvcm1hdCA9IGJwcCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCXBsYW5iX2xvY2socGIpOworCWlmKG1wLT53aWR0aCAhPSBwYi0+Z3dpZHRoW2ZyXSB8fCBtcC0+aGVpZ2h0ICE9IHBiLT5naGVpZ2h0W2ZyXSB8fAorCQkJZm9ybWF0ICE9IHBiLT5nZm10W2ZyXSB8fCAocGItPmdub3JtX3N3aXRjaFtmcl0pKSB7CisJCWludCBpOworI2lmbmRlZiBQTEFOQl9HU0NBTkxJTkUKKwkJdW5zaWduZWQgaW50IG9zaXplID0gcGItPmd3aWR0aFtmcl0gKiBwYi0+Z2hlaWdodFtmcl0KKwkJCQkJCQkJKiBwYi0+Z2ZtdFtmcl07CisJCXVuc2lnbmVkIGludCBuc2l6ZSA9IG1wLT53aWR0aCAqIG1wLT5oZWlnaHQgKiBmb3JtYXQ7CisjZW5kaWYKKworCQlJREVCVUcoIlBsYW5COiBnd2lkdGggPSAlZCwgZ2hlaWdodCA9ICVkLCBtcC0+Zm9ybWF0ID0gJXVcbiIsCisJCQkJCW1wLT53aWR0aCwgbXAtPmhlaWdodCwgbXAtPmZvcm1hdCk7CisKKyNpZm5kZWYgUExBTkJfR1NDQU5MSU5FCisJCWlmKHBiLT5nbm9ybV9zd2l0Y2hbZnJdKQorCQkJbnNpemUgPSAwOworCQlpZiAobnNpemUgPCBvc2l6ZSkgeworCQkJZm9yKGkgPSBwYi0+Z2J1Zl9pZHhbZnJdOyBvc2l6ZSA+IDA7IGkrKykgeworCQkJCW1lbXNldCgodm9pZCAqKXBiLT5yYXdidWZbaV0sIDAsIFBBR0VfU0laRSk7CisJCQkJb3NpemUgLT0gUEFHRV9TSVpFOworCQkJfQorCQl9CisJCWZvcihpID0gcGItPmxfZnJfYWRkcl9pZHhbZnJdOyBpIDwgcGItPmxfZnJfYWRkcl9pZHhbZnJdCisJCQkJCQkJKyBwYi0+bG51bVtmcl07IGkrKykKKwkJCW1lbXNldCgodm9pZCAqKXBiLT5yYXdidWZbaV0sIDAsIFBBR0VfU0laRSk7CisjZWxzZQorLyogWFhYIFRPRE8gKi8KKy8qCisJCWlmKHBiLT5nbm9ybV9zd2l0Y2hbZnJdKQorCQkJbWVtc2V0KCh2b2lkICopcGItPmdidWZmZXJbZnJdLCAwLAorCQkJCQlwYi0+Z2J5dGVzX3Blcl9saW5lICogcGItPmdoZWlnaHRbZnJdKTsKKwkJZWxzZSB7CisJCQlpZihtcC0+CisJCQlmb3IoaSA9IDA7IGkgPCBwYi0+Z2hlaWdodFtmcl07IGkrKykgeworCQkJCW1lbXNldCgodm9pZCAqKShwYi0+Z2J1ZmZlcltmcl0KKwkJCQkJKyBwYi0+Z2J5dGVzX3Blcl9saW5lICogaQorCQkJfQorCQl9CisqLworI2VuZGlmCisJCXBiLT5nd2lkdGhbZnJdID0gbXAtPndpZHRoOworCQlwYi0+Z2hlaWdodFtmcl0gPSBtcC0+aGVpZ2h0OworCQlwYi0+Z2ZtdFtmcl0gPSBmb3JtYXQ7CisJCXBiLT5sYXN0X2NtZFtmcl0gPSBzZXR1cF9ncmFiX2NtZChmciwgcGIpOworCQlwbGFuYl9wcmVfY2FwdHVyZShmciwgcGItPmdmbXRbZnJdLCBwYik7IC8qIGdmbXQgPSBicHAgKi8KKwkJcGItPm5lZWRfcHJlX2NhcHR1cmVbZnJdID0gMTsKKwkJcGItPmdub3JtX3N3aXRjaFtmcl0gPSAwOworCX0gZWxzZQorCQlwYi0+bmVlZF9wcmVfY2FwdHVyZVtmcl0gPSAwOworCXBiLT5mcmFtZV9zdGF0W2ZyXSA9IEdCVUZGRVJfR1JBQkJJTkc7CisJaWYoIShBQ1RJVkUgJiBpbl9sZTMyKCZwYi0+cGxhbmJfYmFzZS0+Y2gxLnN0YXR1cykpKSB7CisKKwkJSURFQlVHKCJQbGFuQjogY2gxIGluYWN0aXZlLCBpbml0aWF0aW5nIGdyYWJiaW5nXG4iKTsKKworCQlwbGFuYl9kYmRtYV9zdG9wKCZwYi0+cGxhbmJfYmFzZS0+Y2gxKTsKKwkJaWYocGItPm5lZWRfcHJlX2NhcHR1cmVbZnJdKSB7CisKKwkJCUlERUJVRygiUGxhbkI6IHBhZGRpbmcgcHJlLWNhcHR1cmUgc2VxdWVuY2VcbiIpOworCisJCQlvdXRfbGUzMiAoJnBiLT5wbGFuYl9iYXNlLT5jaDEuY21kcHRyLAorCQkJCQkJdmlydF90b19idXMocGItPnByZV9jbWRbZnJdKSk7CisJCX0gZWxzZSB7CisJCQl0YWJfY21kX2RiZG1hKHBiLT5sYXN0X2NtZFtmcl0sIERCRE1BX1NUT1AsIDApOworCQkJdGFiX2NtZF9kYmRtYShwYi0+Y2FwX2NtZFtmcl0sIERCRE1BX05PUCwgMCk7CisJCS8qIGxldCdzIGJlIG9uIHRoZSBzYWZlIHNpZGUuIGhlcmUgaXMgbm90IHRpbWluZyBjcml0aWNhbC4gKi8KKwkJCXRhYl9jbWRfZGJkbWEoKHBiLT5jYXBfY21kW2ZyXSArIDEpLCBEQkRNQV9OT1AsIDApOworCQkJb3V0X2xlMzIgKCZwYi0+cGxhbmJfYmFzZS0+Y2gxLmNtZHB0ciwKKwkJCQkJCXZpcnRfdG9fYnVzKHBiLT5jYXBfY21kW2ZyXSkpOworCQl9CisJCXBsYW5iX2RiZG1hX3Jlc3RhcnQoJnBiLT5wbGFuYl9iYXNlLT5jaDEpOworCQlwYi0+bGFzdF9mciA9IGZyOworCX0gZWxzZSB7CisJCWludCBpOworCisJCUlERUJVRygiUGxhbkI6IGNoMSBhY3RpdmUsIGdyYWJiaW5nIGJlaW5nIHF1ZXVlZFxuIik7CisKKwkJaWYoKHBiLT5sYXN0X2ZyID09IC0xKSB8fCAoKHBiLT5sYXN0X2ZyID09IC0yKSAmJgorCQkJCQkJb3ZlcmxheV9pc19hY3RpdmUocGIpKSkgeworCisJCQlJREVCVUcoIlBsYW5COiBvdmVybGF5IGlzIGFjdGl2ZSwgZ3JhYmJpbmcgZGVmZXJlZFxuIik7CisKKwkJCXRhYl9jbWRfZGJkbWEocGItPmxhc3RfY21kW2ZyXSwKKwkJCQkJREJETUFfTk9QIHwgQlJfQUxXQVlTLAorCQkJCQl2aXJ0X3RvX2J1cyhwYi0+Y2gxX2NtZCkpOworCQkJaWYocGItPm5lZWRfcHJlX2NhcHR1cmVbZnJdKSB7CisKKwkJCQlJREVCVUcoIlBsYW5COiBwYWRkaW5nIHByZS1jYXB0dXJlIHNlcXVlbmNlXG4iKTsKKworCQkJCXRhYl9jbWRfc3RvcmUocGItPnByZV9jbWRbZnJdLAorCQkJCSAgICB2aXJ0X3RvX2J1cygmcGItPm92ZXJsYXlfbGFzdDEtPmNtZF9kZXApLAorCQkJCQkJdmlydF90b19idXMocGItPmNoMV9jbWQpKTsKKwkJCQllaWVpbygpOworCQkJCW91dF9sZTMyICgmcGItPm92ZXJsYXlfbGFzdDEtPmNtZF9kZXAsCisJCQkJCQl2aXJ0X3RvX2J1cyhwYi0+cHJlX2NtZFtmcl0pKTsKKwkJCX0gZWxzZSB7CisJCQkJdGFiX2NtZF9zdG9yZShwYi0+Y2FwX2NtZFtmcl0sCisJCQkJICAgIHZpcnRfdG9fYnVzKCZwYi0+b3ZlcmxheV9sYXN0MS0+Y21kX2RlcCksCisJCQkJCQl2aXJ0X3RvX2J1cyhwYi0+Y2gxX2NtZCkpOworCQkJCXRhYl9jbWRfZGJkbWEoKHBiLT5jYXBfY21kW2ZyXSArIDEpLAorCQkJCQkJCQlEQkRNQV9OT1AsIDApOworCQkJCWVpZWlvKCk7CisJCQkJb3V0X2xlMzIgKCZwYi0+b3ZlcmxheV9sYXN0MS0+Y21kX2RlcCwKKwkJCQkJCXZpcnRfdG9fYnVzKHBiLT5jYXBfY21kW2ZyXSkpOworCQkJfQorCQkJZm9yKGkgPSAwOyBvdmVybGF5X2lzX2FjdGl2ZShwYikgJiYgaSA8IDk5OTsgaSsrKQorCQkJCUlERUJVRygiUGxhbkI6IHdhaXRpbmcgZm9yIG92ZXJsYXkgZG9uZVxuIik7CisJCQl0YWJfY21kX2RiZG1hKHBiLT5jaDFfY21kLCBEQkRNQV9OT1AsIDApOworCQkJcGItPnByZXZfbGFzdF9mciA9IGZyOworCQkJcGItPmxhc3RfZnIgPSAtMjsKKwkJfSBlbHNlIGlmKHBiLT5sYXN0X2ZyID09IC0yKSB7CisKKwkJCUlERUJVRygiUGxhbkI6IG1peGVkIG1vZGUgZGV0ZWN0ZWQsIGdyYWJiaW5nIgorCQkJCSIgd2lsbCBiZSBkb25lIGJlZm9yZSBhY3RpdmF0aW5nIG92ZXJsYXlcbiIpOworCisJCQl0YWJfY21kX2RiZG1hKHBiLT5jaDFfY21kLCBEQkRNQV9OT1AsIDApOworCQkJaWYocGItPm5lZWRfcHJlX2NhcHR1cmVbZnJdKSB7CisKKwkJCQlJREVCVUcoIlBsYW5COiBwYWRkaW5nIHByZS1jYXB0dXJlIHNlcXVlbmNlXG4iKTsKKworCQkJCXRhYl9jbWRfZGJkbWEocGItPmxhc3RfY21kW3BiLT5wcmV2X2xhc3RfZnJdLAorCQkJCQkJREJETUFfTk9QIHwgQlJfQUxXQVlTLAorCQkJCQkJdmlydF90b19idXMocGItPnByZV9jbWRbZnJdKSk7CisJCQkJZWllaW8oKTsKKwkJCX0gZWxzZSB7CisJCQkJdGFiX2NtZF9kYmRtYShwYi0+Y2FwX2NtZFtmcl0sIERCRE1BX05PUCwgMCk7CisJCQkJaWYocGItPmd3aWR0aFtwYi0+cHJldl9sYXN0X2ZyXSAhPQorCQkJCQkJCQlwYi0+Z3dpZHRoW2ZyXQorCQkJCQl8fCBwYi0+Z2hlaWdodFtwYi0+cHJldl9sYXN0X2ZyXSAhPQorCQkJCQkJCQlwYi0+Z2hlaWdodFtmcl0KKwkJCQkJfHwgcGItPmdmbXRbcGItPnByZXZfbGFzdF9mcl0gIT0KKwkJCQkJCQkJcGItPmdmbXRbZnJdKQorCQkJCQl0YWJfY21kX2RiZG1hKChwYi0+Y2FwX2NtZFtmcl0gKyAxKSwKKwkJCQkJCQkJREJETUFfTk9QLCAwKTsKKwkJCQllbHNlCisJCQkJCXRhYl9jbWRfZGJkbWEoKHBiLT5jYXBfY21kW2ZyXSArIDEpLAorCQkJCQkgICAgREJETUFfTk9QIHwgQlJfQUxXQVlTLAorCQkJCQkgICAgdmlydF90b19idXMocGItPmNhcF9jbWRbZnJdICsgMTYpKTsKKwkJCQl0YWJfY21kX2RiZG1hKHBiLT5sYXN0X2NtZFtwYi0+cHJldl9sYXN0X2ZyXSwKKwkJCQkJCURCRE1BX05PUCB8IEJSX0FMV0FZUywKKwkJCQkJCXZpcnRfdG9fYnVzKHBiLT5jYXBfY21kW2ZyXSkpOworCQkJCWVpZWlvKCk7CisJCQl9CisJCQl0YWJfY21kX2RiZG1hKHBiLT5sYXN0X2NtZFtmcl0sCisJCQkJCURCRE1BX05PUCB8IEJSX0FMV0FZUywKKwkJCQkJdmlydF90b19idXMocGItPmNoMV9jbWQpKTsKKwkJCWVpZWlvKCk7CisJCQlwYi0+cHJldl9sYXN0X2ZyID0gZnI7CisJCQlwYi0+bGFzdF9mciA9IC0yOworCQl9IGVsc2UgeworCisJCQlJREVCVUcoIlBsYW5COiBhY3RpdmUgZ3JhYmJpbmcgc2Vzc2lvbiBkZXRlY3RlZFxuIik7CisKKwkJCWlmKHBiLT5uZWVkX3ByZV9jYXB0dXJlW2ZyXSkgeworCisJCQkJSURFQlVHKCJQbGFuQjogcGFkZGluZyBwcmUtY2FwdHVyZSBzZXF1ZW5jZVxuIik7CisKKwkJCQl0YWJfY21kX2RiZG1hKHBiLT5sYXN0X2NtZFtwYi0+bGFzdF9mcl0sCisJCQkJCQlEQkRNQV9OT1AgfCBCUl9BTFdBWVMsCisJCQkJCQl2aXJ0X3RvX2J1cyhwYi0+cHJlX2NtZFtmcl0pKTsKKwkJCQllaWVpbygpOworCQkJfSBlbHNlIHsKKwkJCQl0YWJfY21kX2RiZG1hKHBiLT5sYXN0X2NtZFtmcl0sIERCRE1BX1NUT1AsIDApOworCQkJCXRhYl9jbWRfZGJkbWEocGItPmNhcF9jbWRbZnJdLCBEQkRNQV9OT1AsIDApOworCQkJCWlmKHBiLT5nd2lkdGhbcGItPmxhc3RfZnJdICE9IHBiLT5nd2lkdGhbZnJdCisJCQkJCXx8IHBiLT5naGVpZ2h0W3BiLT5sYXN0X2ZyXSAhPQorCQkJCQkJCQlwYi0+Z2hlaWdodFtmcl0KKwkJCQkJfHwgcGItPmdmbXRbcGItPmxhc3RfZnJdICE9CisJCQkJCQkJCXBiLT5nZm10W2ZyXSkKKwkJCQkJdGFiX2NtZF9kYmRtYSgocGItPmNhcF9jbWRbZnJdICsgMSksCisJCQkJCQkJCURCRE1BX05PUCwgMCk7CisJCQkJZWxzZQorCQkJCQl0YWJfY21kX2RiZG1hKChwYi0+Y2FwX2NtZFtmcl0gKyAxKSwKKwkJCQkJICAgIERCRE1BX05PUCB8IEJSX0FMV0FZUywKKwkJCQkJICAgIHZpcnRfdG9fYnVzKHBiLT5jYXBfY21kW2ZyXSArIDE2KSk7CisJCQkJdGFiX2NtZF9kYmRtYShwYi0+bGFzdF9jbWRbcGItPmxhc3RfZnJdLAorCQkJCQkJREJETUFfTk9QIHwgQlJfQUxXQVlTLAorCQkJCQkJdmlydF90b19idXMocGItPmNhcF9jbWRbZnJdKSk7CisJCQkJZWllaW8oKTsKKwkJCX0KKwkJCXBiLT5sYXN0X2ZyID0gZnI7CisJCX0KKwkJaWYoIShBQ1RJVkUgJiBpbl9sZTMyKCZwYi0+cGxhbmJfYmFzZS0+Y2gxLnN0YXR1cykpKSB7CisKKwkJCUlERUJVRygiUGxhbkI6IGJlY2FtZSBpbmFjdGl2ZSBpbiB0aGUgbWVhbiB0aW1lLi4uIgorCQkJCSJyZWFjdGl2YXRpbmdcbiIpOworCisJCQlwbGFuYl9kYmRtYV9zdG9wKCZwYi0+cGxhbmJfYmFzZS0+Y2gxKTsKKwkJCW91dF9sZTMyICgmcGItPnBsYW5iX2Jhc2UtPmNoMS5jbWRwdHIsCisJCQkJCQl2aXJ0X3RvX2J1cyhwYi0+Y2FwX2NtZFtmcl0pKTsKKwkJCXBsYW5iX2RiZG1hX3Jlc3RhcnQoJnBiLT5wbGFuYl9iYXNlLT5jaDEpOworCQl9CisJfQorCXBiLT5ncmFiYmluZysrOworCXBsYW5iX3VubG9jayhwYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGxhbmJfcHJlX2NhcHR1cmUoaW50IGZyLCBpbnQgYnBwLCBzdHJ1Y3QgcGxhbmIgKnBiKQoreworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmMxID0gcGItPnByZV9jbWRbZnJdOworCWludCBpbnRlcmxhY2UgPSAocGItPmdoZWlnaHRbZnJdID4gcGItPm1heGxpbmVzLzIpPyAxOiAwOworCisJdGFiX2NtZF9kYmRtYShjMSsrLCBEQkRNQV9OT1AsIDApOworCWlmKChjMSA9IGNtZF9nZW9fc2V0dXAoYzEsIHBiLT5nd2lkdGhbZnJdLCBwYi0+Z2hlaWdodFtmcl0sIGludGVybGFjZSwKKwkJCQkJCWJwcCwgMCwgcGIpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBsYW5COiBlbmNvdW50ZXJlZCBzb21lIHByb2JsZW1zXG4iKTsKKwkJdGFiX2NtZF9kYmRtYShwYi0+cHJlX2NtZFtmcl0gKyAxLCBEQkRNQV9TVE9QLCAwKTsKKwkJcmV0dXJuOworCX0KKwkvKiBTeW5jIHRvIGV2ZW4gZmllbGQgKi8KKwl0YWJfY21kX3N0b3JlKGMxKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPmNoMS53YWl0X3NlbCksCisJCVBMQU5CX1NFVChGSUVMRF9TWU5DKSk7CisJdGFiX2NtZF9kYmRtYShjMSsrLCBEQkRNQV9OT1AgfCBXQUlUX0lGQ0xSLCAwKTsKKwl0YWJfY21kX3N0b3JlKGMxKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPmNoMS5icl9zZWwpLAorCQlQTEFOQl9TRVQoT0REX0ZJRUxEKSk7CisJdGFiX2NtZF9kYmRtYShjMSsrLCBEQkRNQV9OT1AgfCBXQUlUX0lGU0VULCAwKTsKKwl0YWJfY21kX2RiZG1hKGMxLCBEQkRNQV9OT1AgfCBCUl9JRlNFVCwgdmlydF90b19idXMoYzEtMykpOyBjMSsrOworCXRhYl9jbWRfZGJkbWEoYzErKywgREJETUFfTk9QIHwgSU5UUl9BTFdBWVMsIDApOworCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gxLmJyX3NlbCksCisJCVBMQU5CX1NFVChETUFfQUJPUlQpKTsKKwkvKiBGb3Igbm9uLWludGVybGFjZWQsIHdlIHVzZSBldmVuIGZpZWxkcyBvbmx5ICovCisJaWYgKHBiLT5naGVpZ2h0W2ZyXSA8PSBwYi0+bWF4bGluZXMvMikKKwkJZ290byBjbWRfdGFiX2RhdGFfZW5kOworCS8qIFN5bmMgdG8gb2RkIGZpZWxkICovCisJdGFiX2NtZF9kYmRtYShjMSsrLCBEQkRNQV9OT1AgfCBXQUlUX0lGQ0xSLCAwKTsKKwl0YWJfY21kX3N0b3JlKGMxKyssICh1bnNpZ25lZCkoJnBiLT5wbGFuYl9iYXNlX3BoeXMtPmNoMS5icl9zZWwpLAorCQlQTEFOQl9TRVQoT0REX0ZJRUxEKSk7CisJdGFiX2NtZF9kYmRtYShjMSsrLCBEQkRNQV9OT1AgfCBXQUlUX0lGU0VULCAwKTsKKwl0YWJfY21kX2RiZG1hKGMxLCBEQkRNQV9OT1AgfCBCUl9JRkNMUiwgdmlydF90b19idXMoYzEtMykpOyBjMSsrOworCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gxLmJyX3NlbCksCisJCVBMQU5CX1NFVChETUFfQUJPUlQpKTsKK2NtZF90YWJfZGF0YV9lbmQ6CisJdGFiX2NtZF9kYmRtYShjMSwgREJETUFfTk9QIHwgQlJfQUxXQVlTLCB2aXJ0X3RvX2J1cyhwYi0+Y2FwX2NtZFtmcl0pKTsKKworCWVpZWlvKCk7Cit9CisKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpzZXR1cF9ncmFiX2NtZChpbnQgZnIsIHN0cnVjdCBwbGFuYiAqcGIpCit7CisJaW50CQlpLCBicHAsIGNvdW50LCBubGluZXMsIHN0ZXBzaXplLCBpbnRlcmxhY2U7CisjaWZkZWYgUExBTkJfR1NDQU5MSU5FCisJaW50CQlzY2FubGluZTsKKyNlbHNlCisJaW50CQlubHBwLCBsZWZ0b3ZlcjE7CisJdW5zaWduZWQgbG9uZwliYXNlOworI2VuZGlmCisJdW5zaWduZWQgbG9uZwlqdW1wOworCWludAkJcGFnZWk7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqYzE7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqanVtcF9hZGRyOworCisJYzEgPSBwYi0+Y2FwX2NtZFtmcl07CisJaW50ZXJsYWNlID0gKHBiLT5naGVpZ2h0W2ZyXSA+IHBiLT5tYXhsaW5lcy8yKT8gMTogMDsKKwlicHAgPSBwYi0+Z2ZtdFtmcl07CS8qIGdmbXQgPSBicHAgKi8KKwljb3VudCA9IGJwcCAqIHBiLT5nd2lkdGhbZnJdOworCW5saW5lcyA9IHBiLT5naGVpZ2h0W2ZyXTsKKyNpZmRlZiBQTEFOQl9HU0NBTkxJTkUKKwlzY2FubGluZSA9IHBiLT5nYnl0ZXNfcGVyX2xpbmU7CisjZWxzZQorCXBiLT5sc2l6ZVtmcl0gPSBjb3VudDsKKwlwYi0+bG51bVtmcl0gPSAwOworI2VuZGlmCisKKwkvKiBEbyB2aWRlbyBpbjogKi8KKworCS8qIFByZWFtYmxlIGNvbW1hbmRzOiAqLworCXRhYl9jbWRfZGJkbWEoYzErKywgREJETUFfTk9QLCAwKTsKKwl0YWJfY21kX2RiZG1hKGMxLCBEQkRNQV9OT1AgfCBCUl9BTFdBWVMsIHZpcnRfdG9fYnVzKGMxICsgMTYpKTsgYzErKzsKKwlpZigoYzEgPSBjbWRfZ2VvX3NldHVwKGMxLCBwYi0+Z3dpZHRoW2ZyXSwgcGItPmdoZWlnaHRbZnJdLCBpbnRlcmxhY2UsCisJCQkJCQlicHAsIDAsIHBiKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQbGFuQjogZW5jb3VudGVyZWQgc2VyaW91cyBwcm9ibGVtc1xuIik7CisJCXRhYl9jbWRfZGJkbWEocGItPmNhcF9jbWRbZnJdICsgMSwgREJETUFfU1RPUCwgMCk7CisJCXJldHVybiAocGItPmNhcF9jbWRbZnJdICsgMik7CisJfQorCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gxLndhaXRfc2VsKSwKKwkJUExBTkJfU0VUKEZJRUxEX1NZTkMpKTsKKwl0YWJfY21kX2RiZG1hKGMxKyssIERCRE1BX05PUCB8IFdBSVRfSUZDTFIsIDApOworCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gxLmJyX3NlbCksCisJCVBMQU5CX1NFVChPRERfRklFTEQpKTsKKwl0YWJfY21kX2RiZG1hKGMxKyssIERCRE1BX05PUCB8IFdBSVRfSUZTRVQsIDApOworCXRhYl9jbWRfZGJkbWEoYzEsIERCRE1BX05PUCB8IEJSX0lGU0VULCB2aXJ0X3RvX2J1cyhjMS0zKSk7IGMxKys7CisJdGFiX2NtZF9kYmRtYShjMSsrLCBEQkRNQV9OT1AgfCBJTlRSX0FMV0FZUywgMCk7CisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5jaDEuYnJfc2VsKSwKKwkJUExBTkJfU0VUKERNQV9BQk9SVCkpOworCisJaWYgKGludGVybGFjZSkgeworCQlzdGVwc2l6ZSA9IDI7CisJCWp1bXBfYWRkciA9IGMxICsgVEFCX0ZBQ1RPUiAqIChubGluZXMgKyAxKSAvIDI7CisJfSBlbHNlIHsKKwkJc3RlcHNpemUgPSAxOworCQlqdW1wX2FkZHIgPSBjMSArIFRBQl9GQUNUT1IgKiBubGluZXM7CisJfQorCWp1bXAgPSB2aXJ0X3RvX2J1cyhqdW1wX2FkZHIpOworCisJLyogZXZlbiBmaWVsZCBkYXRhOiAqLworCisJcGFnZWkgPSBwYi0+Z2J1Zl9pZHhbZnJdOworI2lmZGVmIFBMQU5CX0dTQ0FOTElORQorCWZvciAoaSA9IDA7IGkgPCBubGluZXM7IGkgKz0gc3RlcHNpemUpIHsKKwkJdGFiX2NtZF9nZW4oYzErKywgSU5QVVRfTU9SRSB8IEJSX0lGU0VULCBjb3VudCwKKwkJCQkJdmlydF90b19idXMocGItPnJhd2J1ZltwYWdlaQorCQkJCQkrIGkgKiBzY2FubGluZSAvIFBBR0VfU0laRV0pLCBqdW1wKTsKKwl9CisjZWxzZQorCWkgPSAwOworCWxlZnRvdmVyMSA9IDA7CisJZG8geworCSAgICBpbnQgajsKKworCSAgICBiYXNlID0gdmlydF90b19idXMocGItPnJhd2J1ZltwYWdlaV0pOworCSAgICBubHBwID0gKFBBR0VfU0laRSAtIGxlZnRvdmVyMSkgLyBjb3VudCAvIHN0ZXBzaXplOworCSAgICBmb3IoaiA9IDA7IGogPCBubHBwICYmIGkgPCBubGluZXM7IGorKywgaSArPSBzdGVwc2l6ZSwgYzErKykKKwkJdGFiX2NtZF9nZW4oYzEsIElOUFVUX01PUkUgfCBLRVlfU1RSRUFNMCB8IEJSX0lGU0VULAorCQkJICBjb3VudCwgYmFzZSArIGNvdW50ICogaiAqIHN0ZXBzaXplICsgbGVmdG92ZXIxLCBqdW1wKTsKKwkgICAgaWYoaSA8IG5saW5lcykgeworCQlpbnQgbG92MCA9IFBBR0VfU0laRSAtIGNvdW50ICogbmxwcCAqIHN0ZXBzaXplIC0gbGVmdG92ZXIxOworCisJCWlmKGxvdjAgPT0gMCkKKwkJICAgIGxlZnRvdmVyMSA9IDA7CisJCWVsc2UgeworCQkgICAgaWYobG92MCA+PSBjb3VudCkgeworCQkJdGFiX2NtZF9nZW4oYzErKywgSU5QVVRfTU9SRSB8IEJSX0lGU0VULCBjb3VudCwgYmFzZQorCQkJCSsgY291bnQgKiBubHBwICogc3RlcHNpemUgKyBsZWZ0b3ZlcjEsIGp1bXApOworCQkgICAgfSBlbHNlIHsKKwkJCXBiLT5sX3RvX2FkZHJbZnJdW3BiLT5sbnVtW2ZyXV0gPSBwYi0+cmF3YnVmW3BhZ2VpXQorCQkJCQkrIGNvdW50ICogbmxwcCAqIHN0ZXBzaXplICsgbGVmdG92ZXIxOworCQkJcGItPmxfdG9fbmV4dF9pZHhbZnJdW3BiLT5sbnVtW2ZyXV0gPSBwYWdlaSArIDE7CisJCQlwYi0+bF90b19uZXh0X3NpemVbZnJdW3BiLT5sbnVtW2ZyXV0gPSBjb3VudCAtIGxvdjA7CisJCQl0YWJfY21kX2dlbihjMSsrLCBJTlBVVF9NT1JFIHwgQlJfSUZTRVQsIGNvdW50LAorCQkJCXZpcnRfdG9fYnVzKHBiLT5yYXdidWZbcGItPmxfZnJfYWRkcl9pZHhbZnJdCisJCQkJCQkrIHBiLT5sbnVtW2ZyXV0pLCBqdW1wKTsKKwkJCWlmKCsrcGItPmxudW1bZnJdID4gTUFYX0xOVU0pCisJCQkJcGItPmxudW1bZnJdLS07CisJCSAgICB9CisJCSAgICBsZWZ0b3ZlcjEgPSBjb3VudCAqIHN0ZXBzaXplIC0gbG92MDsKKwkJICAgIGkgKz0gc3RlcHNpemU7CisJCX0KKwkgICAgfQorCSAgICBwYWdlaSsrOworCX0gd2hpbGUoaSA8IG5saW5lcyk7CisJdGFiX2NtZF9kYmRtYShjMSwgREJETUFfTk9QIHwgQlJfQUxXQVlTLCBqdW1wKTsKKwljMSA9IGp1bXBfYWRkcjsKKyNlbmRpZiAvKiBQTEFOQl9HU0NBTkxJTkUgKi8KKworCS8qIEZvciBub24taW50ZXJsYWNlZCwgd2UgdXNlIGV2ZW4gZmllbGRzIG9ubHkgKi8KKwlpZiAoIWludGVybGFjZSkKKwkJZ290byBjbWRfdGFiX2RhdGFfZW5kOworCisJLyogU3luYyB0byBvZGQgZmllbGQgKi8KKwl0YWJfY21kX2RiZG1hKGMxKyssIERCRE1BX05PUCB8IFdBSVRfSUZDTFIsIDApOworCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+Y2gxLmJyX3NlbCksCisJCVBMQU5CX1NFVChPRERfRklFTEQpKTsKKwl0YWJfY21kX2RiZG1hKGMxKyssIERCRE1BX05PUCB8IFdBSVRfSUZTRVQsIDApOworCXRhYl9jbWRfZGJkbWEoYzEsIERCRE1BX05PUCB8IEJSX0lGQ0xSLCB2aXJ0X3RvX2J1cyhjMS0zKSk7IGMxKys7CisJdGFiX2NtZF9zdG9yZShjMSsrLCAodW5zaWduZWQpKCZwYi0+cGxhbmJfYmFzZV9waHlzLT5jaDEuYnJfc2VsKSwKKwkJUExBTkJfU0VUKERNQV9BQk9SVCkpOworCQorCS8qIG9kZCBmaWVsZCBkYXRhOiAqLworCWp1bXBfYWRkciA9IGMxICsgVEFCX0ZBQ1RPUiAqIG5saW5lcyAvIDI7CisJanVtcCA9IHZpcnRfdG9fYnVzKGp1bXBfYWRkcik7CisjaWZkZWYgUExBTkJfR1NDQU5MSU5FCisJZm9yIChpID0gMTsgaSA8IG5saW5lczsgaSArPSBzdGVwc2l6ZSkgeworCQl0YWJfY21kX2dlbihjMSsrLCBJTlBVVF9NT1JFIHwgQlJfSUZTRVQsIGNvdW50LAorCQkJCQl2aXJ0X3RvX2J1cyhwYi0+cmF3YnVmW3BhZ2VpCisJCQkJCSsgaSAqIHNjYW5saW5lIC8gUEFHRV9TSVpFXSksIGp1bXApOworCX0KKyNlbHNlCisJaSA9IDE7CisJbGVmdG92ZXIxID0gMDsKKwlwYWdlaSA9IHBiLT5nYnVmX2lkeFtmcl07CisJaWYobmxpbmVzIDw9IDEpCisJICAgIGdvdG8gc2tpcDsKKwlkbyB7CisJICAgIGludCBqOworCisJICAgIGJhc2UgPSB2aXJ0X3RvX2J1cyhwYi0+cmF3YnVmW3BhZ2VpXSk7CisJICAgIG5scHAgPSAoUEFHRV9TSVpFIC0gbGVmdG92ZXIxKSAvIGNvdW50IC8gc3RlcHNpemU7CisJICAgIGlmKGxlZnRvdmVyMSA+PSBjb3VudCkgeworCQl0YWJfY21kX2dlbihjMSsrLCBJTlBVVF9NT1JFIHwgS0VZX1NUUkVBTTAgfCBCUl9JRlNFVCwgY291bnQsCisJCQkJCQliYXNlICsgbGVmdG92ZXIxIC0gY291bnQsIGp1bXApOworCQlpICs9IHN0ZXBzaXplOworCSAgICB9CisJICAgIGZvcihqID0gMDsgaiA8IG5scHAgJiYgaSA8IG5saW5lczsgaisrLCBpICs9IHN0ZXBzaXplLCBjMSsrKQorCQl0YWJfY21kX2dlbihjMSwgSU5QVVRfTU9SRSB8IEtFWV9TVFJFQU0wIHwgQlJfSUZTRVQsIGNvdW50LAorCQkJYmFzZSArIGNvdW50ICogKGogKiBzdGVwc2l6ZSArIDEpICsgbGVmdG92ZXIxLCBqdW1wKTsKKwkgICAgaWYoaSA8IG5saW5lcykgeworCQlpbnQgbG92MCA9IFBBR0VfU0laRSAtIGNvdW50ICogbmxwcCAqIHN0ZXBzaXplIC0gbGVmdG92ZXIxOworCisJCWlmKGxvdjAgPT0gMCkKKwkJICAgIGxlZnRvdmVyMSA9IDA7CisJCWVsc2UgeworCQkgICAgaWYobG92MCA+IGNvdW50KSB7CisJCQlwYi0+bF90b19hZGRyW2ZyXVtwYi0+bG51bVtmcl1dID0gcGItPnJhd2J1ZltwYWdlaV0KKwkJCQkrIGNvdW50ICogKG5scHAgKiBzdGVwc2l6ZSArIDEpICsgbGVmdG92ZXIxOworCQkJcGItPmxfdG9fbmV4dF9pZHhbZnJdW3BiLT5sbnVtW2ZyXV0gPSBwYWdlaSArIDE7CisJCQlwYi0+bF90b19uZXh0X3NpemVbZnJdW3BiLT5sbnVtW2ZyXV0gPSBjb3VudCAqIHN0ZXBzaXplCisJCQkJCQkJCQktIGxvdjA7CisJCQl0YWJfY21kX2dlbihjMSsrLCBJTlBVVF9NT1JFIHwgQlJfSUZTRVQsIGNvdW50LAorCQkJCXZpcnRfdG9fYnVzKHBiLT5yYXdidWZbcGItPmxfZnJfYWRkcl9pZHhbZnJdCisJCQkJCQkJKyBwYi0+bG51bVtmcl1dKSwganVtcCk7CisJCQlpZigrK3BiLT5sbnVtW2ZyXSA+IE1BWF9MTlVNKQorCQkJCXBiLT5sbnVtW2ZyXS0tOworCQkJaSArPSBzdGVwc2l6ZTsKKwkJICAgIH0KKwkJICAgIGxlZnRvdmVyMSA9IGNvdW50ICogc3RlcHNpemUgLSBsb3YwOworCQl9CisJICAgIH0KKwkgICAgcGFnZWkrKzsKKwl9IHdoaWxlKGkgPCBubGluZXMpOworc2tpcDoKKwl0YWJfY21kX2RiZG1hKGMxLCBEQkRNQV9OT1AgfCBCUl9BTFdBWVMsIGp1bXApOworCWMxID0ganVtcF9hZGRyOworI2VuZGlmIC8qIFBMQU5CX0dTQ0FOTElORSAqLworCitjbWRfdGFiX2RhdGFfZW5kOgorCXRhYl9jbWRfc3RvcmUoYzErKywgKHVuc2lnbmVkKSgmcGItPnBsYW5iX2Jhc2VfcGh5cy0+aW50cl9zdGF0KSwKKwkJCShmciA8PCA5KSB8IFBMQU5CX0ZSTV9JUlEgfCBQTEFOQl9HRU5fSVJRKTsKKwkvKiBzdG9wIGl0ICovCisJdGFiX2NtZF9kYmRtYShjMSwgREJETUFfU1RPUCwgMCk7CisKKwllaWVpbygpOworCXJldHVybiBjMTsKK30KKworc3RhdGljIHZvaWQgcGxhbmJfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXVuc2lnbmVkIGludCBzdGF0LCBhc3RhdDsKKwlzdHJ1Y3QgcGxhbmIgKnBiID0gKHN0cnVjdCBwbGFuYiAqKWRldl9pZDsKKworCUlERUJVRygiUGxhbkI6IHBsYW5iX2lycSgpXG4iKTsKKworCS8qIGdldC9jbGVhciBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMgKi8KKwllaWVpbygpOworCXN0YXQgPSBpbl9sZTMyKCZwYi0+cGxhbmJfYmFzZS0+aW50cl9zdGF0KTsKKwlhc3RhdCA9IHN0YXQgJiBwYi0+aW50cl9tYXNrOworCW91dF9sZTMyKCZwYi0+cGxhbmJfYmFzZS0+aW50cl9zdGF0LCBQTEFOQl9GUk1fSVJRCisJCQkJCSYgfmFzdGF0ICYgc3RhdCAmIH5QTEFOQl9HRU5fSVJRKTsKKwlJREVCVUcoIlBsYW5COiBzdGF0ID0gJVgsIGFzdGF0ID0gJVhcbiIsIHN0YXQsIGFzdGF0KTsKKworCWlmKGFzdGF0ICYgUExBTkJfRlJNX0lSUSkgeworCQl1bnNpZ25lZCBpbnQgZnIgPSBzdGF0ID4+IDk7CisjaWZuZGVmIFBMQU5CX0dTQ0FOTElORQorCQlpbnQgaTsKKyNlbmRpZgorCQlJREVCVUcoIlBsYW5COiBQTEFOQl9GUk1fSVJRXG4iKTsKKworCQlwYi0+Z2NvdW50Kys7CisKKwkJSURFQlVHKCJQbGFuQjogZ3JhYiAlZDogZnIgPSAlZCwgZ2NvdW50ID0gJWRcbiIsCisJCQkJcGItPmdyYWJiaW5nLCBmciwgcGItPmdjb3VudCk7CisjaWZuZGVmIFBMQU5CX0dTQ0FOTElORQorCQlJREVCVUcoIlBsYW5COiAlZCAqICVkIGJ5dGVzIGFyZSBiZWluZyBjb3BpZWQgb3ZlclxuIiwKKwkJCQlwYi0+bG51bVtmcl0sIHBiLT5sc2l6ZVtmcl0pOworCQlmb3IoaSA9IDA7IGkgPCBwYi0+bG51bVtmcl07IGkrKykgeworCQkJaW50IGZpcnN0ID0gcGItPmxzaXplW2ZyXSAtIHBiLT5sX3RvX25leHRfc2l6ZVtmcl1baV07CisKKwkJCW1lbWNweShwYi0+bF90b19hZGRyW2ZyXVtpXSwKKwkJCQlwYi0+cmF3YnVmW3BiLT5sX2ZyX2FkZHJfaWR4W2ZyXSArIGldLAorCQkJCWZpcnN0KTsKKwkJCW1lbWNweShwYi0+cmF3YnVmW3BiLT5sX3RvX25leHRfaWR4W2ZyXVtpXV0sCisJCQkJcGItPnJhd2J1ZltwYi0+bF9mcl9hZGRyX2lkeFtmcl0gKyBpXSArIGZpcnN0LAorCQkJCQkJcGItPmxfdG9fbmV4dF9zaXplW2ZyXVtpXSk7CisJCX0KKyNlbmRpZgorCQlwYi0+ZnJhbWVfc3RhdFtmcl0gPSBHQlVGRkVSX0RPTkU7CisJCXBiLT5ncmFiYmluZy0tOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBiLT5jYXBxKTsKKwkJcmV0dXJuOworCX0KKwkvKiBpbmNvcnJlY3QgaW50ZXJydXB0cz8gKi8KKwlwYi0+aW50cl9tYXNrID0gUExBTkJfQ0xSX0lSUTsKKwlvdXRfbGUzMigmcGItPnBsYW5iX2Jhc2UtPmludHJfc3RhdCwgUExBTkJfQ0xSX0lSUSk7CisJcHJpbnRrKEtFUk5fRVJSICJQbGFuQjogSVJRIGxvY2t1cCwgY2xlYXJlZCBpbnRycnVwdHMiCisJCQkJCQkJIiB1bmNvbmRpdGlvbmFsbHlcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGV2aWNlIE9wZXJhdGlvbnMgZnVuY3Rpb25zICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHBsYW5iX29wZW4oc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgcGxhbmIgKnBiID0gKHN0cnVjdCBwbGFuYiAqKWRldjsKKworCWlmIChwYi0+dXNlciA9PSAwKSB7CisJCWludCBlcnI7CisJCWlmKChlcnIgPSBwbGFuYl9wcmVwYXJlX29wZW4ocGIpKSAhPSAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcGItPnVzZXIrKzsKKworCURFQlVHKCJQbGFuQjogZGV2aWNlIG9wZW5lZFxuIik7CisJcmV0dXJuIDA7ICAgCit9CisKK3N0YXRpYyB2b2lkIHBsYW5iX2Nsb3NlKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhbmIgKnBiID0gKHN0cnVjdCBwbGFuYiAqKWRldjsKKworCWlmKHBiLT51c2VyIDwgMSkgLyogPz8/ICovCisJCXJldHVybjsKKwlwbGFuYl9sb2NrKHBiKTsKKwlpZiAocGItPnVzZXIgPT0gMSkgeworCQlpZiAocGItPm92ZXJsYXkpIHsKKwkJCXBsYW5iX2RiZG1hX3N0b3AoJnBiLT5wbGFuYl9iYXNlLT5jaDIpOworCQkJcGxhbmJfZGJkbWFfc3RvcCgmcGItPnBsYW5iX2Jhc2UtPmNoMSk7CisJCQlwYi0+b3ZlcmxheSA9IDA7CisJCX0KKwkJcGxhbmJfcHJlcGFyZV9jbG9zZShwYik7CisJfQorCXBiLT51c2VyLS07CisJcGxhbmJfdW5sb2NrKHBiKTsKKworCURFQlVHKCJQbGFuQjogZGV2aWNlIGNsb3NlZFxuIik7Cit9CisKK3N0YXRpYyBsb25nIHBsYW5iX3JlYWQoc3RydWN0IHZpZGVvX2RldmljZSAqdiwgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50LAorCQkJCWludCBub25ibG9jaykKK3sKKwlERUJVRygicGxhbmI6IHJlYWQgcmVxdWVzdFxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBsb25nIHBsYW5iX3dyaXRlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQl1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgbm9uYmxvY2spCit7CisJREVCVUcoInBsYW5iOiB3cml0ZSByZXF1ZXN0XG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBwbGFuYl9pb2N0bChzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcGxhbmIgKnBiPShzdHJ1Y3QgcGxhbmIgKilkZXY7CisgIAkKKwlzd2l0Y2ggKGNtZCkKKwl7CQorCQljYXNlIFZJRElPQ0dDQVA6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IGI7CisKKwkJCURFQlVHKCJQbGFuQjogSU9DVEwgVklESU9DR0NBUFxuIik7CisKKwkJCXN0cmNweSAoYi5uYW1lLCBwYi0+dmlkZW9fZGV2Lm5hbWUpOworCQkJYi50eXBlID0gVklEX1RZUEVfT1ZFUkxBWSB8IFZJRF9UWVBFX0NMSVBQSU5HIHwKKwkJCQkgVklEX1RZUEVfRlJBTUVSQU0gfCBWSURfVFlQRV9TQ0FMRVMgfAorCQkJCSBWSURfVFlQRV9DQVBUVVJFOworCQkJYi5jaGFubmVscyA9IDI7CS8qIGNvbXBvc2l0ZSAmIHN2aHMgKi8KKwkJCWIuYXVkaW9zID0gMDsKKwkJCWIubWF4d2lkdGggPSBQTEFOQl9NQVhQSVhFTFM7CisgICAgICAgICAgICAgICAgICAgICAgICBiLm1heGhlaWdodCA9IFBMQU5CX01BWExJTkVTOworICAgICAgICAgICAgICAgICAgICAgICAgYi5taW53aWR0aCA9IDMyOyAvKiB3aWxkIGd1ZXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICBiLm1pbmhlaWdodCA9IDMyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmcsJmIsc2l6ZW9mKGIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ1NGQlVGOgorCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlkZW9fYnVmZmVyIHY7CisJCQl1bnNpZ25lZCBzaG9ydCBicHA7CisJCQl1bnNpZ25lZCBpbnQgZm10OworCisJCQlERUJVRygiUGxhbkI6IElPQ1RMIFZJRElPQ1NGQlVGXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pCisJCQl8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJnLHNpemVvZih2KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCQkJcGxhbmJfbG9jayhwYik7CisJCQlzd2l0Y2godi5kZXB0aCkgeworCQkJY2FzZSA4OgorCQkJCWJwcCA9IDE7CisJCQkJZm10ID0gUExBTkJfR1JBWTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTU6CisJCQljYXNlIDE2OgorCQkJCWJwcCA9IDI7CisJCQkJZm10ID0gUExBTkJfQ09MT1VSMTU7CisJCQkJYnJlYWs7CisJCQljYXNlIDI0OgorCQkJY2FzZSAzMjoKKwkJCQlicHAgPSA0OworCQkJCWZtdCA9IFBMQU5CX0NPTE9VUjMyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwbGFuYl91bmxvY2socGIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChicHAgKiB2LndpZHRoID4gdi5ieXRlc3BlcmxpbmUpIHsKKwkJCQlwbGFuYl91bmxvY2socGIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcGItPndpbi5icHAgPSBicHA7CisJCQlwYi0+d2luLmNvbG9yX2ZtdCA9IGZtdDsKKwkJCXBiLT5mcmFtZV9idWZmZXJfcGh5cyA9ICh1bnNpZ25lZCBsb25nKSB2LmJhc2U7CisJCQlwYi0+d2luLnNoZWlnaHQgPSB2LmhlaWdodDsKKwkJCXBiLT53aW4uc3dpZHRoID0gdi53aWR0aDsKKwkJCXBiLT5waWN0dXJlLmRlcHRoID0gcGItPndpbi5kZXB0aCA9IHYuZGVwdGg7CisJCQlwYi0+d2luLmJwbCA9IHBiLT53aW4uYnBwICogcGItPndpbi5zd2lkdGg7CisJCQlwYi0+d2luLnBhZCA9IHYuYnl0ZXNwZXJsaW5lIC0gcGItPndpbi5icGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJQbGFuQjogRGlzcGxheSBhdCAlcCBpcyAlZCBieSAlZCwgYnl0ZWRlcHRoICVkLCIKKwkJCQkiIGJwbCAlZCAoKyAlZClcbiIsIHYuYmFzZSwgdi53aWR0aCx2LmhlaWdodCwKKwkJCQlwYi0+d2luLmJwcCwgcGItPndpbi5icGwsIHBiLT53aW4ucGFkKTsKKworCQkJcGItPmNtZF9idWZmX2luaXRlZCA9IDA7CisJCQlpZihwYi0+b3ZlcmxheSkgeworCQkJCXN1c3BlbmRfb3ZlcmxheShwYik7CisJCQkJZmlsbF9jbWRfYnVmZihwYik7CisJCQkJcmVzdW1lX292ZXJsYXkocGIpOworCQkJfQorCQkJcGxhbmJfdW5sb2NrKHBiKTsKKwkJCXJldHVybiAwOwkJCisJCX0KKwkJY2FzZSBWSURJT0NHRkJVRjoKKwkJeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZpZGVvX2J1ZmZlciB2OworCisJCQlERUJVRygiUGxhbkI6IElPQ1RMIFZJRElPQ0dGQlVGXG4iKTsKKworCQkJdi5iYXNlID0gKHZvaWQgKilwYi0+ZnJhbWVfYnVmZmVyX3BoeXM7CisJCQl2LmhlaWdodCA9IHBiLT53aW4uc2hlaWdodDsKKwkJCXYud2lkdGggPSBwYi0+d2luLnN3aWR0aDsKKwkJCXYuZGVwdGggPSBwYi0+d2luLmRlcHRoOworCQkJdi5ieXRlc3BlcmxpbmUgPSBwYi0+d2luLmJwbCArIHBiLT53aW4ucGFkOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ2LCBzaXplb2YodikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DQ0FQVFVSRToKKwkJeworCQkJaW50IGk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZpLCBhcmcsIHNpemVvZihpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCQkJaWYoaT09MCkgeworCQkJCURFQlVHKCJQbGFuQjogSU9DVEwgVklESU9DQ0FQVFVSRSBTdG9wXG4iKTsKKworCQkJCWlmICghKHBiLT5vdmVybGF5KSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJcGxhbmJfbG9jayhwYik7CisJCQkJcGItPm92ZXJsYXkgPSAwOworCQkJCW92ZXJsYXlfc3RvcChwYik7CisJCQkJcGxhbmJfdW5sb2NrKHBiKTsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUcoIlBsYW5COiBJT0NUTCBWSURJT0NDQVBUVVJFIFN0YXJ0XG4iKTsKKworCQkJCWlmIChwYi0+ZnJhbWVfYnVmZmVyX3BoeXMgPT0gMCB8fAorCQkJCQkgIHBiLT53aW4ud2lkdGggPT0gMCB8fAorCQkJCQkgIHBiLT53aW4uaGVpZ2h0ID09IDApCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlmIChwYi0+b3ZlcmxheSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJcGxhbmJfbG9jayhwYik7CisJCQkJcGItPm92ZXJsYXkgPSAxOworCQkJCWlmKCEocGItPmNtZF9idWZmX2luaXRlZCkpCisJCQkJCWZpbGxfY21kX2J1ZmYocGIpOworCQkJCW92ZXJsYXlfc3RhcnQocGIpOworCQkJCXBsYW5iX3VubG9jayhwYik7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ0dDSEFOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCB2OworCisJCQlERUJVRygiUGxhbkI6IElPQ1RMIFZJRElPQ0dDSEFOXG4iKTsKKworCQkJaWYoY29weV9mcm9tX3VzZXIoJnYsIGFyZyxzaXplb2YodikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdi5mbGFncyA9IDA7CisJCQl2LnR1bmVycyA9IDA7CisJCQl2LnR5cGUgPSBWSURFT19UWVBFX0NBTUVSQTsKKwkJCXYubm9ybSA9IHBiLT53aW4ubm9ybTsKKwkJCXN3aXRjaCh2LmNoYW5uZWwpCisJCQl7CisJCQljYXNlIDA6CisJCQkJc3RyY3B5KHYubmFtZSwiQ29tcG9zaXRlIik7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJc3RyY3B5KHYubmFtZSwiU1ZIUyIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmKGNvcHlfdG9fdXNlcihhcmcsJnYsc2l6ZW9mKHYpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NTQ0hBTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgdjsKKworCQkJREVCVUcoIlBsYW5COiBJT0NUTCBWSURJT0NTQ0hBTlxuIik7CisKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZ2LCBhcmcsIHNpemVvZih2KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmICh2Lm5vcm0gIT0gcGItPndpbi5ub3JtKSB7CisJCQkJaW50IGksIG1heGxpbmVzOworCisJCQkJc3dpdGNoICh2Lm5vcm0pCisJCQkJeworCQkJCWNhc2UgVklERU9fTU9ERV9QQUw6CisJCQkJY2FzZSBWSURFT19NT0RFX1NFQ0FNOgorCQkJCQltYXhsaW5lcyA9IFBMQU5CX01BWExJTkVTOworCQkJCQlicmVhazsKKwkJCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCQkJbWF4bGluZXMgPSBQTEFOQl9OVFNDX01BWExJTkVTOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBsYW5iX2xvY2socGIpOworCQkJCS8qIGVtcHR5IHRoZSBncmFiYmluZyBxdWV1ZSAqLworCQkJCXdhaXRfZXZlbnQocGItPmNhcHEsICFwYi0+Z3JhYmJpbmcpOworCQkJCXBiLT5tYXhsaW5lcyA9IG1heGxpbmVzOworCQkJCXBiLT53aW4ubm9ybSA9IHYubm9ybTsKKwkJCQkvKiBTdG9wIG92ZXJsYXkgaWYgcnVubmluZyAqLworCQkJCXN1c3BlbmRfb3ZlcmxheShwYik7CisJCQkJZm9yKGkgPSAwOyBpIDwgTUFYX0dCVUZGRVJTOyBpKyspCisJCQkJCXBiLT5nbm9ybV9zd2l0Y2hbaV0gPSAxOworCQkJCS8qIEkga25vdyBpdCdzIGFuIG92ZXJraWxsLCBidXQuLi4uICovCisJCQkJZmlsbF9jbWRfYnVmZihwYik7CisJCQkJLyogb2ssIG5vdyBpbml0IGl0IGFjY29yZGluZ2x5ICovCisJCQkJc2FhX2luaXRfcmVncyAocGIpOworCQkJCS8qIHJlc3RhcnQgb3ZlcmxheSBpZiBpdCB3YXMgcnVubmluZyAqLworCQkJCXJlc3VtZV9vdmVybGF5KHBiKTsKKwkJCQlwbGFuYl91bmxvY2socGIpOworCQkJfQorCisJCQlzd2l0Y2godi5jaGFubmVsKQorCQkJeworCQkJY2FzZSAwOgkvKiBDb21wb3NpdGUJKi8KKwkJCQlzYWFfc2V0IChTQUE3MTk2X0lPQ0MsCisJCQkJCSgoc2FhX3JlZ3NbcGItPndpbi5ub3JtXVtTQUE3MTk2X0lPQ0NdICYKKwkJCQkJICB+NykgfCAzKSwgcGIpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgkvKiBTVkhTCQkqLworCQkJCXNhYV9zZXQgKFNBQTcxOTZfSU9DQywKKwkJCQkJKChzYWFfcmVnc1twYi0+d2luLm5vcm1dW1NBQTcxOTZfSU9DQ10gJgorCQkJCQkgIH43KSB8IDQpLCBwYik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ0dQSUNUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSB2cCA9IHBiLT5waWN0dXJlOworCisJCQlERUJVRygiUGxhbkI6IElPQ1RMIFZJRElPQ0dQSUNUXG4iKTsKKworCQkJc3dpdGNoKHBiLT53aW4uY29sb3JfZm10KSB7CisJCQljYXNlIFBMQU5CX0dSQVk6CisJCQkJdnAucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfR1JFWTsKKwkJCWNhc2UgUExBTkJfQ09MT1VSMTU6CisJCQkJdnAucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCNTU1OworCQkJCWJyZWFrOworCQkJY2FzZSBQTEFOQl9DT0xPVVIzMjoKKwkJCQl2cC5wYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IzMjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdnAucGFsZXR0ZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmKGNvcHlfdG9fdXNlcihhcmcsJnZwLHNpemVvZih2cCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NTUElDVDoKKwkJeworCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgdnA7CisKKwkJCURFQlVHKCJQbGFuQjogSU9DVEwgVklESU9DU1BJQ1RcbiIpOworCisJCQlpZihjb3B5X2Zyb21fdXNlcigmdnAsYXJnLHNpemVvZih2cCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcGItPnBpY3R1cmUgPSB2cDsKKwkJCS8qIFNob3VsZCB3ZSBkbyBzYW5pdHkgY2hlY2tzIGhlcmU/ICovCisJCQlzYWFfc2V0IChTQUE3MTk2X0JSSUcsICh1bnNpZ25lZCBjaGFyKQorCQkJICAgICgocGItPnBpY3R1cmUuYnJpZ2h0bmVzcykgPj4gOCksIHBiKTsKKwkJCXNhYV9zZXQgKFNBQTcxOTZfSFVFQywgKHVuc2lnbmVkIGNoYXIpCisJCQkgICAgKChwYi0+cGljdHVyZS5odWUpID4+IDgpIF4gMHg4MCwgcGIpOworCQkJc2FhX3NldCAoU0FBNzE5Nl9DU0FULCAodW5zaWduZWQgY2hhcikKKwkJCSAgICAoKHBiLT5waWN0dXJlLmNvbG91cikgPj4gOSksIHBiKTsKKwkJCXNhYV9zZXQgKFNBQTcxOTZfQ09OVCwgKHVuc2lnbmVkIGNoYXIpCisJCQkgICAgKChwYi0+cGljdHVyZS5jb250cmFzdCkgPj4gOSksIHBiKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NTV0lOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93CXZ3OworCQkJc3RydWN0IHZpZGVvX2NsaXAJY2xpcDsKKwkJCWludCAJCQlpOworCQkJCisJCQlERUJVRygiUGxhbkI6IElPQ1RMIFZJRElPQ1NXSU5cbiIpOworCisJCQlpZihjb3B5X2Zyb21fdXNlcigmdncsYXJnLHNpemVvZih2dykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlwbGFuYl9sb2NrKHBiKTsKKwkJCS8qIFN0b3Agb3ZlcmxheSBpZiBydW5uaW5nICovCisJCQlzdXNwZW5kX292ZXJsYXkocGIpOworCQkJcGItPndpbi5pbnRlcmxhY2UgPSAodncuaGVpZ2h0ID4gcGItPm1heGxpbmVzLzIpPyAxOiAwOworCQkJaWYgKHBiLT53aW4ueCAhPSB2dy54IHx8CisJCQkgICAgcGItPndpbi55ICE9IHZ3LnkgfHwKKwkJCSAgICBwYi0+d2luLndpZHRoICE9IHZ3LndpZHRoIHx8CisJCQkgICAgcGItPndpbi5oZWlnaHQgIT0gdncuaGVpZ2h0IHx8CisJCQkgICAgIXBiLT5jbWRfYnVmZl9pbml0ZWQpIHsKKwkJCQlwYi0+d2luLnggPSB2dy54OworCQkJCXBiLT53aW4ueSA9IHZ3Lnk7CisJCQkJcGItPndpbi53aWR0aCA9IHZ3LndpZHRoOworCQkJCXBiLT53aW4uaGVpZ2h0ID0gdncuaGVpZ2h0OworCQkJCWZpbGxfY21kX2J1ZmYocGIpOworCQkJfQorCQkJLyogUmVzZXQgY2xpcCBtYXNrICovCisJCQltZW1zZXQgKCh2b2lkICopIHBiLT5tYXNrLCAweGZmLCAocGItPm1heGxpbmVzCisJCQkJCSogKChQTEFOQl9NQVhQSVhFTFMgKyA3KSAmIH43KSkgLyA4KTsKKwkJCS8qIEFkZCBhbnkgY2xpcCByZWN0cyAqLworCQkJZm9yIChpID0gMDsgaSA8IHZ3LmNsaXBjb3VudDsgaSsrKSB7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjbGlwLCB2dy5jbGlwcyArIGksCisJCQkJCQlzaXplb2Yoc3RydWN0IHZpZGVvX2NsaXApKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJYWRkX2NsaXAocGIsICZjbGlwKTsKKwkJCX0KKwkJCS8qIHJlc3RhcnQgb3ZlcmxheSBpZiBpdCB3YXMgcnVubmluZyAqLworCQkJcmVzdW1lX292ZXJsYXkocGIpOworCQkJcGxhbmJfdW5sb2NrKHBiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DR1dJTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX3dpbmRvdyB2dzsKKworCQkJREVCVUcoIlBsYW5COiBJT0NUTCBWSURJT0NHV0lOXG4iKTsKKworCQkJdncueD1wYi0+d2luLng7CisJCQl2dy55PXBiLT53aW4ueTsKKwkJCXZ3LndpZHRoPXBiLT53aW4ud2lkdGg7CisJCQl2dy5oZWlnaHQ9cGItPndpbi5oZWlnaHQ7CisJCQl2dy5jaHJvbWFrZXk9MDsKKwkJCXZ3LmZsYWdzPTA7CisJCQlpZihwYi0+d2luLmludGVybGFjZSkKKwkJCQl2dy5mbGFnc3w9VklERU9fV0lORE9XX0lOVEVSTEFDRTsKKwkJCWlmKGNvcHlfdG9fdXNlcihhcmcsJnZ3LHNpemVvZih2dykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwkgICAgICAgIGNhc2UgVklESU9DU1lOQzogeworCQkJaW50IGk7CisKKwkJCUlERUJVRygiUGxhbkI6IElPQ1RMIFZJRElPQ1NZTkNcbiIpOworCisJCQlpZihjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZpLGFyZyxzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCUlERUJVRygiUGxhbkI6IHN5bmMgdG8gZnJhbWUgJWRcbiIsIGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihpID4gKE1BWF9HQlVGRkVSUyAtIDEpIHx8IGkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKK2Noa19ncmFiOgorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwYi0+ZnJhbWVfc3RhdFtpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHQlVGRkVSX1VOVVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCQljYXNlIEdCVUZGRVJfR1JBQkJJTkc6CisJCQkJSURFQlVHKCJQbGFuQjogd2FpdGluZyBmb3IgZ3JhYiIKKwkJCQkJCQkiIGRvbmUgKCVkKVxuIiwgaSk7CisgCQkJICAgICAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwYi0+Y2FwcSk7CisJCQkJaWYoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCXJldHVybiAtRUlOVFI7CisJCQkJZ290byBjaGtfZ3JhYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0JVRkZFUl9ET05FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYi0+ZnJhbWVfc3RhdFtpXSA9IEdCVUZGRVJfVU5VU0VEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCQl9CisKKwkgICAgICAgIGNhc2UgVklESU9DTUNBUFRVUkU6CisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWRlb19tbWFwIHZtOworCQkJdm9sYXRpbGUgdW5zaWduZWQgaW50IHN0YXR1czsKKworCQkJSURFQlVHKCJQbGFuQjogSU9DVEwgVklESU9DTUNBUFRVUkVcbiIpOworCisJCQlpZihjb3B5X2Zyb21fdXNlcigodm9pZCAqKSAmdm0sKHZvaWQgKilhcmcsc2l6ZW9mKHZtKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYi0+ZnJhbWVfc3RhdFt2bS5mcmFtZV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEdCVUZGRVJfVU5VU0VEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworCisJCSAgICAgICAgcmV0dXJuIHZncmFiKHBiLCAmdm0pOworCQl9CisJCQorCQljYXNlIFZJRElPQ0dNQlVGOgorCQl7CisJCQlpbnQgaTsKKwkJCXN0cnVjdCB2aWRlb19tYnVmIHZtOworCisJCQlERUJVRygiUGxhbkI6IElPQ1RMIFZJRElPQ0dNQlVGXG4iKTsKKworCQkJbWVtc2V0KCZ2bSwgMCAsIHNpemVvZih2bSkpOworCQkJdm0uc2l6ZSA9IFBMQU5CX01BWF9GQlVGICogTUFYX0dCVUZGRVJTOworCQkJdm0uZnJhbWVzID0gTUFYX0dCVUZGRVJTOworCQkJZm9yKGkgPSAwOyBpPE1BWF9HQlVGRkVSUzsgaSsrKQorCQkJCXZtLm9mZnNldHNbaV0gPSBQTEFOQl9NQVhfRkJVRiAqIGk7CisJCQlpZihjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICh2b2lkICopJnZtLCBzaXplb2Yodm0pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJCQorCQljYXNlIFBMQU5CSU9DR1NBQVJFR1M6CisJCXsKKwkJCXN0cnVjdCBwbGFuYl9zYWFfcmVncyBwcmVnOworCisJCQlERUJVRygiUGxhbkI6IElPQ1RMIFBMQU5CSU9DR1NBQVJFR1NcbiIpOworCisJCQlpZihjb3B5X2Zyb21fdXNlcigmcHJlZywgYXJnLCBzaXplb2YocHJlZykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYocHJlZy5hZGRyID49IFNBQTcxOTZfTlVNUkVHUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXByZWcudmFsID0gc2FhX3JlZ3NbcGItPndpbi5ub3JtXVtwcmVnLmFkZHJdOworCQkJaWYoY29weV90b191c2VyKCh2b2lkICopYXJnLCAodm9pZCAqKSZwcmVnLAorCQkJCQkJCQlzaXplb2YocHJlZykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwkJCisJCWNhc2UgUExBTkJJT0NTU0FBUkVHUzoKKwkJeworCQkJc3RydWN0IHBsYW5iX3NhYV9yZWdzIHByZWc7CisKKwkJCURFQlVHKCJQbGFuQjogSU9DVEwgUExBTkJJT0NTU0FBUkVHU1xuIik7CisKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZwcmVnLCBhcmcsIHNpemVvZihwcmVnKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZihwcmVnLmFkZHIgPj0gU0FBNzE5Nl9OVU1SRUdTKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc2FhX3NldCAocHJlZy5hZGRyLCBwcmVnLnZhbCwgcGIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJCisJCWNhc2UgUExBTkJJT0NHU1RBVDoKKwkJeworCQkJc3RydWN0IHBsYW5iX3N0YXRfcmVncyBwc3RhdDsKKworCQkJREVCVUcoIlBsYW5COiBJT0NUTCBQTEFOQklPQ0dTVEFUXG4iKTsKKworCQkJcHN0YXQuY2gxX3N0YXQgPSBpbl9sZTMyKCZwYi0+cGxhbmJfYmFzZS0+Y2gxLnN0YXR1cyk7CisJCQlwc3RhdC5jaDJfc3RhdCA9IGluX2xlMzIoJnBiLT5wbGFuYl9iYXNlLT5jaDIuc3RhdHVzKTsKKwkJCXBzdGF0LnNhYV9zdGF0MCA9IHNhYV9zdGF0dXMoMCwgcGIpOworCQkJcHN0YXQuc2FhX3N0YXQxID0gc2FhX3N0YXR1cygxLCBwYik7CisKKwkJCWlmKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgKHZvaWQgKikmcHN0YXQsCisJCQkJCQkJc2l6ZW9mKHBzdGF0KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJY2FzZSBQTEFOQklPQ1NNT0RFOiB7CisJCQlpbnQgdjsKKworCQkJREVCVUcoIlBsYW5COiBJT0NUTCBQTEFOQklPQ1NNT0RFXG4iKTsKKworCQkJaWYoY29weV9mcm9tX3VzZXIoJnYsIGFyZywgc2l6ZW9mKHYpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJc3dpdGNoKHYpCisJCQl7CisJCQljYXNlIFBMQU5CX1RWX01PREU6CisJCQkJc2FhX3NldCAoU0FBNzE5Nl9TVERDLAorCQkJCQkoc2FhX3JlZ3NbcGItPndpbi5ub3JtXVtTQUE3MTk2X1NURENdICYKKwkJCQkJICAweDdmKSwgcGIpOworCQkJCWJyZWFrOworCQkJY2FzZSBQTEFOQl9WVFJfTU9ERToKKwkJCQlzYWFfc2V0IChTQUE3MTk2X1NUREMsCisJCQkJCShzYWFfcmVnc1twYi0+d2luLm5vcm1dW1NBQTcxOTZfU1REQ10gfAorCQkJCQkgIDB4ODApLCBwYik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJcGItPndpbi5tb2RlID0gdjsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgUExBTkJJT0NHTU9ERTogeworCQkJaW50IHY9cGItPndpbi5tb2RlOworCisJCQlERUJVRygiUGxhbkI6IElPQ1RMIFBMQU5CSU9DR01PREVcbiIpOworCisJCQlpZihjb3B5X3RvX3VzZXIoYXJnLCZ2LHNpemVvZih2KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorI2lmZGVmIFBMQU5CX0dTQ0FOTElORQorCQljYXNlIFBMQU5CR19HUkFCX0JQTDogeworCQkJaW50IHY9cGItPmdieXRlc19wZXJfbGluZTsKKworCQkJREVCVUcoIlBsYW5COiBJT0NUTCBQTEFOQkdfR1JBQl9CUExcbiIpOworCisJCQlpZihjb3B5X3RvX3VzZXIoYXJnLCZ2LHNpemVvZih2KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorI2VuZGlmIC8qIFBMQU5CX0dTQ0FOTElORSAqLworCQljYXNlIFBMQU5CX0lOVFJfREVCVUc6IHsKKwkJCWludCBpOworCisJCQlERUJVRygiUGxhbkI6IElPQ1RMIFBMQU5CX0lOVFJfREVCVUdcbiIpOworCisJCQlpZihjb3B5X2Zyb21fdXNlcigmaSwgYXJnLCBzaXplb2YoaSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkvKiBhdm9pZCBoYW5nIHVwcyBhbGwgdG9nZXRoZXIgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfR0JVRkZFUlM7IGkrKykgeworCQkJCWlmKHBiLT5mcmFtZV9zdGF0W2ldID09IEdCVUZGRVJfR1JBQkJJTkcpIHsKKwkJCQkJcGItPmZyYW1lX3N0YXRbaV0gPSBHQlVGRkVSX0RPTkU7CisJCQkJfQorCQkJfQorCQkJaWYocGItPmdyYWJiaW5nKQorCQkJCXBiLT5ncmFiYmluZy0tOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwYi0+Y2FwcSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFBMQU5CX0lOVl9SRUdTOiB7CisJCQlpbnQgaTsKKwkJCXN0cnVjdCBwbGFuYl9hbnlfcmVncyBhbnk7CisKKwkJCURFQlVHKCJQbGFuQjogSU9DVEwgUExBTkJfSU5WX1JFR1NcbiIpOworCisJCQlpZihjb3B5X2Zyb21fdXNlcigmYW55LCBhcmcsIHNpemVvZihhbnkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmKGFueS5vZmZzZXQgPCAwIHx8IGFueS5vZmZzZXQgKyBhbnkuYnl0ZXMgPiAweDQwMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmKGFueS5ieXRlcyA+IDEyOCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWZvciAoaSA9IDA7IGkgPCBhbnkuYnl0ZXM7IGkrKykgeworCQkJCWFueS5kYXRhW2ldID0KKwkJCQkJaW5fOCgodW5zaWduZWQgY2hhciAqKXBiLT5wbGFuYl9iYXNlCisJCQkJCQkJKyBhbnkub2Zmc2V0ICsgaSk7CisJCQl9CisJCQlpZihjb3B5X3RvX3VzZXIoYXJnLCZhbnksc2l6ZW9mKGFueSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJREVCVUcoIlBsYW5COiBVbmltcGxlbWVudGVkIElPQ1RMXG4iKTsKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCX0KKwkvKiBTb21lIElPQ1RMcyBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkIG9uIFBsYW5CICovCisJCWNhc2UgVklESU9DR1RVTkVSOiB7CisJCURFQlVHKCJQbGFuQjogSU9DVEwgVklESU9DR1RVTkVSXG4iKTsKKwkJCWdvdG8gdW5pbXBsZW1lbnRlZDsgfQorCQljYXNlIFZJRElPQ1NUVU5FUjogeworCQlERUJVRygiUGxhbkI6IElPQ1RMIFZJRElPQ1NUVU5FUlxuIik7CisJCQlnb3RvIHVuaW1wbGVtZW50ZWQ7IH0KKwkJY2FzZSBWSURJT0NTRlJFUTogeworCQlERUJVRygiUGxhbkI6IElPQ1RMIFZJRElPQ1NGUkVRXG4iKTsKKwkJCWdvdG8gdW5pbXBsZW1lbnRlZDsgfQorCQljYXNlIFZJRElPQ0dGUkVROiB7CisJCURFQlVHKCJQbGFuQjogSU9DVEwgVklESU9DR0ZSRVFcbiIpOworCQkJZ290byB1bmltcGxlbWVudGVkOyB9CisJCWNhc2UgVklESU9DS0VZOiB7CisJCURFQlVHKCJQbGFuQjogSU9DVEwgVklESU9DS0VZXG4iKTsKKwkJCWdvdG8gdW5pbXBsZW1lbnRlZDsgfQorCQljYXNlIFZJRElPQ1NBVURJTzogeworCQlERUJVRygiUGxhbkI6IElPQ1RMIFZJRElPQ1NBVURJT1xuIik7CisJCQlnb3RvIHVuaW1wbGVtZW50ZWQ7IH0KKwkJY2FzZSBWSURJT0NHQVVESU86IHsKKwkJREVCVUcoIlBsYW5COiBJT0NUTCBWSURJT0NHQVVESU9cbiIpOworCQkJZ290byB1bmltcGxlbWVudGVkOyB9Cit1bmltcGxlbWVudGVkOgorCQlERUJVRygiICAgICAgIFVuaW1wbGVtZW50ZWRcbiIpOworCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGxhbmJfbW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICphZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGxhbmIgKnBiID0gKHN0cnVjdCBwbGFuYiAqKWRldjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCA9ICh1bnNpZ25lZCBsb25nKWFkcjsKKworCWlmIChzaXplID4gTUFYX0dCVUZGRVJTICogUExBTkJfTUFYX0ZCVUYpCisJICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXBiLT5yYXdidWYpIHsKKwkJaW50IGVycjsKKwkJaWYoKGVycj1ncmFiYnVmX2FsbG9jKHBiKSkpCisJCQlyZXR1cm4gZXJyOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGItPnJhd2J1Zl9zaXplOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBwZm47CisKKwkJcGZuID0gdmlydF90b19waHlzKCh2b2lkICopcGItPnJhd2J1ZltpXSkgPj4gUEFHRV9TSElGVDsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwZm4sIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQorCQkJYnJlYWs7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgcGxhbmJfdGVtcGxhdGU9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9IFBMQU5CX0RFVklDRV9OQU1FLAorCS50eXBlCQk9IFZJRF9UWVBFX09WRVJMQVksCisJLmhhcmR3YXJlCT0gVklEX0hBUkRXQVJFX1BMQU5CLAorCS5vcGVuCQk9IHBsYW5iX29wZW4sCisJLmNsb3NlCQk9IHBsYW5iX2Nsb3NlLAorCS5yZWFkCQk9IHBsYW5iX3JlYWQsCisJLndyaXRlCQk9IHBsYW5iX3dyaXRlLAorCS5pb2N0bAkJPSBwbGFuYl9pb2N0bCwKKwkubW1hcAkJPSBwbGFuYl9tbWFwLAkvKiBtbWFwPyAqLworfTsKKworc3RhdGljIGludCBpbml0X3BsYW5iKHN0cnVjdCBwbGFuYiAqcGIpCit7CisJdW5zaWduZWQgY2hhciBzYWFfcmV2OworCWludCBpLCByZXN1bHQ7CisKKwltZW1zZXQgKCh2b2lkICopICZwYi0+d2luLCAwLCBzaXplb2YgKHN0cnVjdCBwbGFuYl93aW5kb3cpKTsKKwkvKiBTaW1wbGUgc2FuaXR5IGNoZWNrICovCisJaWYoZGVmX25vcm0gPj0gTlVNX1NVUFBPUlRFRF9OT1JNIHx8IGRlZl9ub3JtIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlBsYW5COiBPcHRpb24ocykgaW52YWxpZFxuIik7CisJCXJldHVybiAtMjsKKwl9CisJcGItPndpbi5ub3JtID0gZGVmX25vcm07CisJcGItPndpbi5tb2RlID0gUExBTkJfVFZfTU9ERTsJLyogVFYgbW9kZSAqLworCXBiLT53aW4uaW50ZXJsYWNlPTE7CisJcGItPndpbi54PTA7CisJcGItPndpbi55PTA7CisJcGItPndpbi53aWR0aD03Njg7IC8qIDY0MCAqLworCXBiLT53aW4uaGVpZ2h0PTU3NjsgLyogNDgwICovCisJcGItPm1heGxpbmVzPTU3NjsKKyNpZiAwCisJYnR2LT53aW4uY3JvcHdpZHRoPTc2ODsgLyogNjQwICovCisJYnR2LT53aW4uY3JvcGhlaWdodD01NzY7IC8qIDQ4MCAqLworCWJ0di0+d2luLmNyb3B4PTA7CisJYnR2LT53aW4uY3JvcHk9MDsKKyNlbmRpZgorCXBiLT53aW4ucGFkPTA7CisJcGItPndpbi5icHA9NDsKKwlwYi0+d2luLmRlcHRoPTMyOworCXBiLT53aW4uY29sb3JfZm10PVBMQU5CX0NPTE9VUjMyOworCXBiLT53aW4uYnBsPTEwMjQqcGItPndpbi5icHA7CisJcGItPndpbi5zd2lkdGg9MTAyNDsKKwlwYi0+d2luLnNoZWlnaHQ9NzY4OworI2lmZGVmIFBMQU5CX0dTQ0FOTElORQorCWlmKChwYi0+Z2J5dGVzX3Blcl9saW5lID0gUExBTkJfTUFYUElYRUxTICogNCkgPiBQQUdFX1NJWkUKKwkJCQl8fCAocGItPmdieXRlc19wZXJfbGluZSA8PSAwKSkKKwkJcmV0dXJuIC0zOworCWVsc2UgeworCQkvKiBwYWdlIGFsaWduIHBiLT5nYnl0ZXNfcGVyX2xpbmUgZm9yIERNQSBwdXJwb3NlICovCisJCWZvcihpID0gUEFHRV9TSVpFOyBwYi0+Z2J5dGVzX3Blcl9saW5lIDwgKGk+PjEpOykKKwkJCWk+Pj0xOworCQlwYi0+Z2J5dGVzX3Blcl9saW5lID0gaTsKKwl9CisjZW5kaWYKKwlwYi0+dGFiX3NpemUgPSBQTEFOQl9NQVhMSU5FUyArIDQwOworCXBiLT5zdXNwZW5kID0gMDsKKwlpbml0X01VVEVYKCZwYi0+bG9jayk7CisJcGItPmNoMV9jbWQgPSAwOworCXBiLT5jaDJfY21kID0gMDsKKwlwYi0+bWFzayA9IDA7CisJcGItPnByaXZfc3BhY2UgPSAwOworCXBiLT5vZmZzZXQgPSAwOworCXBiLT51c2VyID0gMDsKKwlwYi0+b3ZlcmxheSA9IDA7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcGItPnN1c3BlbmRxKTsKKwlwYi0+Y21kX2J1ZmZfaW5pdGVkID0gMDsKKwlwYi0+ZnJhbWVfYnVmZmVyX3BoeXMgPSAwOworCisJLyogUmVzZXQgRE1BIGNvbnRyb2xsZXJzICovCisJcGxhbmJfZGJkbWFfc3RvcCgmcGItPnBsYW5iX2Jhc2UtPmNoMik7CisJcGxhbmJfZGJkbWFfc3RvcCgmcGItPnBsYW5iX2Jhc2UtPmNoMSk7CisKKwlzYWFfcmV2ID0gIChzYWFfc3RhdHVzKDAsIHBiKSAmIDB4ZjApID4+IDQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiUGxhbkI6IFNBQTcxOTYgdmlkZW8gcHJvY2Vzc29yIHJldi4gJWRcbiIsIHNhYV9yZXYpOworCS8qIEluaXRpYWxpemUgdGhlIFNBQSByZWdpc3RlcnMgaW4gbWVtb3J5IGFuZCBvbiBjaGlwICovCisJc2FhX2luaXRfcmVncyAocGIpOworCisJLyogY2xlYXIgaW50ZXJydXB0IG1hc2sgKi8KKwlwYi0+aW50cl9tYXNrID0gUExBTkJfQ0xSX0lSUTsKKworICAgICAgICByZXN1bHQgPSByZXF1ZXN0X2lycShwYi0+aXJxLCBwbGFuYl9pcnEsIDAsICJQbGFuQiIsICh2b2lkICopcGIpOworICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworCSAgICAgICAgaWYgKHJlc3VsdD09LUVJTlZBTCkKKwkgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJQbGFuQjogQmFkIGlycSBudW1iZXIgKCVkKSAiCisJCQkJCQkib3IgaGFuZGxlclxuIiwgKGludClwYi0+aXJxKTsKKwkJZWxzZSBpZiAocmVzdWx0PT0tRUJVU1kpCisJCQlwcmludGsoS0VSTl9FUlIgIlBsYW5COiBJIGRvbid0IGtub3cgd2h5LCAiCisJCQkJCSJidXQgSVJRICVkIGlzIGJ1c3lcbiIsIChpbnQpcGItPmlycSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWRpc2FibGVfaXJxKHBiLT5pcnEpOworICAgICAgICAKKwkvKiBOb3cgYWRkIHRoZSB0ZW1wbGF0ZSBhbmQgcmVnaXN0ZXIgdGhlIGRldmljZSB1bml0LiAqLworCW1lbWNweSgmcGItPnZpZGVvX2RldiwmcGxhbmJfdGVtcGxhdGUsc2l6ZW9mKHBsYW5iX3RlbXBsYXRlKSk7CisKKwlwYi0+cGljdHVyZS5icmlnaHRuZXNzPTB4OTA8PDg7CisJcGItPnBpY3R1cmUuY29udHJhc3QgPSAweDcwIDw8IDg7CisJcGItPnBpY3R1cmUuY29sb3VyID0gMHg3MDw8ODsKKwlwYi0+cGljdHVyZS5odWUgPSAweDgwMDA7CisJcGItPnBpY3R1cmUud2hpdGVuZXNzID0gMDsKKwlwYi0+cGljdHVyZS5kZXB0aCA9IHBiLT53aW4uZGVwdGg7CisKKwlwYi0+ZnJhbWVfc3RhdD1OVUxMOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBiLT5jYXBxKTsKKwlmb3IoaT0wOyBpPE1BWF9HQlVGRkVSUzsgaSsrKSB7CisJCXBiLT5nYnVmX2lkeFtpXSA9IFBMQU5CX01BWF9GQlVGICogaSAvIFBBR0VfU0laRTsKKwkJcGItPmd3aWR0aFtpXT0wOworCQlwYi0+Z2hlaWdodFtpXT0wOworCQlwYi0+Z2ZtdFtpXT0wOworCQlwYi0+Y2FwX2NtZFtpXT1OVUxMOworI2lmbmRlZiBQTEFOQl9HU0NBTkxJTkUKKwkJcGItPmxfZnJfYWRkcl9pZHhbaV0gPSBNQVhfR0JVRkZFUlMgKiAoUExBTkJfTUFYX0ZCVUYKKwkJCQkJCS8gUEFHRV9TSVpFICsgMSkgKyBNQVhfTE5VTSAqIGk7CisJCXBiLT5sc2l6ZVtpXSA9IDA7CisJCXBiLT5sbnVtW2ldID0gMDsKKyNlbmRpZgorCX0KKwlwYi0+cmF3YnVmPU5VTEw7CisJcGItPmdyYWJiaW5nPTA7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCW91dF9sZTMyKCZwYi0+cGxhbmJfYmFzZS0+aW50cl9zdGF0LCBQTEFOQl9DTFJfSVJRKTsKKwlwYi0+aW50cl9tYXNrID0gUExBTkJfRlJNX0lSUTsKKwllbmFibGVfaXJxKHBiLT5pcnEpOworCisJaWYodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZwYi0+dmlkZW9fZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucik8MCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglTY2FuIGZvciBhIFBsYW5CIGNvbnRyb2xsZXIsIHJlcXVlc3QgdGhlIGlycSBhbmQgbWFwIHRoZSBpbyBtZW1vcnkgCisgKi8KKworc3RhdGljIGludCBmaW5kX3BsYW5iKHZvaWQpCit7CisJc3RydWN0IHBsYW5iCQkqcGI7CisJc3RydWN0IGRldmljZV9ub2RlCSpwbGFuYl9kZXZpY2VzOworCXVuc2lnbmVkIGNoYXIJCWRldl9mbiwgY29uZnJlZywgYnVzOworCXVuc2lnbmVkIGludAkJb2xkX2Jhc2UsIG5ld19iYXNlOworCXVuc2lnbmVkIGludAkJaXJxOworCXN0cnVjdCBwY2lfZGV2IAkJKnBkZXY7CisJaW50IHJjOworCisJaWYgKF9tYWNoaW5lICE9IF9NQUNIX1BtYWMpCisJCXJldHVybiAwOworCisJcGxhbmJfZGV2aWNlcyA9IGZpbmRfZGV2aWNlcygicGxhbmIiKTsKKwlpZiAocGxhbmJfZGV2aWNlcyA9PSAwKSB7CisJCXBsYW5iX251bT0wOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQbGFuQjogbm8gZGV2aWNlIGZvdW5kIVxuIik7CisJCXJldHVybiBwbGFuYl9udW07CisJfQorCisJaWYgKHBsYW5iX2RldmljZXMtPm5leHQgIT0gTlVMTCkKKwkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBvbmx5IHVzaW5nIGZpcnN0IFBsYW5CIGRldmljZSFcbiIpOworCXBiID0gJnBsYW5ic1swXTsKKwlwbGFuYl9udW0gPSAxOworCisgICAgICAgIGlmIChwbGFuYl9kZXZpY2VzLT5uX2FkZHJzICE9IDEpIHsKKyAgICAgICAgICAgICAgICBwcmludGsgKEtFUk5fV0FSTklORyAiUGxhbkI6IGV4cGVjdGluZyAxIGFkZHJlc3MgZm9yIHBsYW5iICIKKyAgICAgICAgICAgICAgICAJIihnb3QgJWQpIiwgcGxhbmJfZGV2aWNlcy0+bl9hZGRycyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwbGFuYl9kZXZpY2VzLT5uX2ludHJzID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUGxhbkI6IG5vIGludHJzIGZvciBkZXZpY2UgJXNcbiIsCisJCSAgICAgICBwbGFuYl9kZXZpY2VzLT5mdWxsX25hbWUpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpcnEgPSBwbGFuYl9kZXZpY2VzLT5pbnRyc1swXS5saW5lOworCX0KKworCS8qIEluaXRpYWxpemUgUGxhbkIncyBQQ0kgcmVnaXN0ZXJzICovCisKKwkvKiBUaGVyZSBpcyBhIGJ1ZyB3aXRoIHRoZSB3YXkgT0YgYXNzaWducyBhZGRyZXNzZXMKKwkgICB0byB0aGUgZGV2aWNlcyBiZWhpbmQgdGhlIGNoYW9zIGJyaWRnZS4KKwkgICBjb250cm9sIG5lZWRzIG9ubHkgMHgxMDAwIG9mIHNwYWNlLCBidXQgZGVjb2RlcyBvbmx5CisJICAgdGhlIHVwcGVyIDE2IGJpdHMuIEl0IHRoZXJlZm9yZSBvY2N1cGllcyBhIGZ1bGwgNjRLLgorCSAgIE9GIGFzc2lnbnMgdGhlIHBsYW5iIGNvbnRyb2xsZXIgbWVtb3J5IHdpdGhpbiB0aGlzIHNwYWNlOworCSAgIHNvIHdlIG5lZWQgdG8gY2hhbmdlIHRoYXQgaGVyZSBpbiBvcmRlciB0byBhY2Nlc3MgcGxhbmIuICovCisKKwkvKiBXZSByZW1hcCB0byAweGYxMDAwMDAwIGluIGhvcGUgdGhhdCBub2JvZHkgdXNlcyBpdCAhICovCisKKwlidXMgPSAocGxhbmJfZGV2aWNlcy0+YWRkcnNbMF0uc3BhY2UgPj4gMTYpICYgMHhmZjsKKwlkZXZfZm4gPSAocGxhbmJfZGV2aWNlcy0+YWRkcnNbMF0uc3BhY2UgPj4gOCkgJiAweGZmOworCWNvbmZyZWcgPSBwbGFuYl9kZXZpY2VzLT5hZGRyc1swXS5zcGFjZSAmIDB4ZmY7CisJb2xkX2Jhc2UgPSBwbGFuYl9kZXZpY2VzLT5hZGRyc1swXS5hZGRyZXNzOworCW5ld19iYXNlID0gMHhmMTAwMDAwMDsKKworCURFQlVHKCJQbGFuQjogRm91bmQgb24gYnVzICVkLCBkZXYgJWQsIGZ1bmMgJWQsICIKKwkJIm1lbWJhc2UgMHgleCAoYmFzZSByZWcuIDB4JXgpXG4iLAorCQlidXMsIFBDSV9TTE9UKGRldl9mbiksIFBDSV9GVU5DKGRldl9mbiksIG9sZF9iYXNlLCBjb25mcmVnKTsKKworCXBkZXYgPSBwY2lfZmluZF9zbG90IChidXMsIGRldl9mbik7CisJaWYgKCFwZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAicGxhbmI6IGNhbm5vdCBmaW5kIHNsb3RcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogRW5hYmxlIHJlc3BvbnNlIGluIG1lbW9yeSBzcGFjZSwgYnVzIG1hc3RlcmluZywKKwkgICB1c2UgbWVtb3J5IHdyaXRlIGFuZCBpbnZhbGlkYXRlICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwbGFuYjogY2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXJjID0gcGNpX3NldF9td2kocGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAicGxhbmI6IGNhbm5vdCBlbmFibGUgTVdJIG9uIFBDSSBkZXZpY2UgJXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIFNldCB0aGUgbmV3IGJhc2UgYWRkcmVzcyAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBkZXYsIGNvbmZyZWcsIG5ld19iYXNlKTsKKworCXBsYW5iX3JlZ3MgPSAodm9sYXRpbGUgc3RydWN0IHBsYW5iX3JlZ2lzdGVycyAqKQorCQkJCQkJaW9yZW1hcCAobmV3X2Jhc2UsIDB4NDAwKTsKKwlwYi0+cGxhbmJfYmFzZSA9IHBsYW5iX3JlZ3M7CisJcGItPnBsYW5iX2Jhc2VfcGh5cyA9IChzdHJ1Y3QgcGxhbmJfcmVnaXN0ZXJzICopbmV3X2Jhc2U7CisJcGItPmlycQk9IGlycTsKKwkKKwlyZXR1cm4gcGxhbmJfbnVtOworCitlcnJfb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyX291dDoKKwkvKiBGSVhNRSBoYW5kbGUgZXJyb3IgKi8gICAvKiBjb21tZW50IG1vdmVkIGZyb20gcGNpX2ZpbmRfc2xvdCwgYWJvdmUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9wbGFuYih2b2lkKQoreworCWludCBpOworCXN0cnVjdCBwbGFuYiAqcGI7CisKKwlmb3IgKGk9MDtpPHBsYW5iX251bTsgaSsrKSAKKwl7CisJCXBiPSZwbGFuYnNbaV07CisKKwkJLyogc3RvcCBhbmQgZmxhc2ggRE1BcyB1bmNvbmRpdGlvbmFsbHkgKi8KKwkJcGxhbmJfZGJkbWFfc3RvcCgmcGItPnBsYW5iX2Jhc2UtPmNoMik7CisJCXBsYW5iX2RiZG1hX3N0b3AoJnBiLT5wbGFuYl9iYXNlLT5jaDEpOworCisJCS8qIGNsZWFyIGFuZCBmcmVlIGludGVycnVwdHMgKi8KKwkJcGItPmludHJfbWFzayA9IFBMQU5CX0NMUl9JUlE7CisJCW91dF9sZTMyICgmcGItPnBsYW5iX2Jhc2UtPmludHJfc3RhdCwgUExBTkJfQ0xSX0lSUSk7CisJCWZyZWVfaXJxKHBiLT5pcnEsIHBiKTsKKworCQkvKiBtYWtlIHN1cmUgYWxsIGFsbG9jYXRlZCBtZW1vcnkgYXJlIGZyZWVkICovCisJCXBsYW5iX3ByZXBhcmVfY2xvc2UocGIpOworCisJCXByaW50ayhLRVJOX0lORk8gIlBsYW5COiB1bnJlZ2lzdGVyaW5nIHdpdGggdjRsXG4iKTsKKwkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnBiLT52aWRlb19kZXYpOworCisJCS8qIG5vdGUgdGhhdCBpb3VubWFwKCkgZG9lcyBub3RoaW5nIG9uIHRoZSBQUEMgcmlnaHQgbm93ICovCisJCWlvdW5tYXAgKCh2b2lkICopcGItPnBsYW5iX2Jhc2UpOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9wbGFuYnModm9pZCkKK3sKKwlpbnQgaTsKKyAgCisJaWYgKGZpbmRfcGxhbmIoKTw9MCkKKwkJcmV0dXJuIC1FSU87CisKKwlmb3IgKGk9MDsgaTxwbGFuYl9udW07IGkrKykgeworCQlpZiAoaW5pdF9wbGFuYigmcGxhbmJzW2ldKTwwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBsYW5COiBlcnJvciByZWdpc3RlcmluZyBkZXZpY2UgJWQiCisJCQkJCQkJIiB3aXRoIHY0bFxuIiwgaSk7CisJCQlyZWxlYXNlX3BsYW5iKCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfSAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUGxhbkI6IHJlZ2lzdGVyZWQgZGV2aWNlICVkIHdpdGggdjRsXG4iLCBpKTsKKwl9ICAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcGxhbmJzKHZvaWQpCit7CisJcmVsZWFzZV9wbGFuYigpOworfQorCittb2R1bGVfaW5pdChpbml0X3BsYW5icyk7Cittb2R1bGVfZXhpdChleGl0X3BsYW5icyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwZmFhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcGxhbmIuaApAQCAtMCwwICsxLDIzMSBAQAorLyogCisgICAgcGxhbmIgLSBQbGFuQiBmcmFtZSBncmFiYmVyIGRyaXZlcgorCisgICAgUGxhbkIgaXMgdXNlZCBpbiB0aGUgN3gwMC84eDAwIHNlcmllcyBvZiBQb3dlck1hY2ludG9zaAorICAgIENvbXB1dGVycyBhcyB2aWRlbyBpbnB1dCBETUEgY29udHJvbGxlci4KKworICAgIENvcHlyaWdodCAoQykgMTk5OCBNaWNoZWwgTGFubmVycyAobWxhbkBjcHUubHUpCisKKyAgICBCYXNlZCBsYXJnZWx5IG9uIHRoZSBidHR2IGRyaXZlciBieSBSYWxwaCBNZXR6bGVyIChyamttQHRocC51bmkta29lbG4uZGUpCisKKyAgICBBZGRpdGlvbmFsIGRlYnVnZ2luZyBhbmQgY29kaW5nIGJ5IFRha2FzaGkgT2UgKHRvZUB1bmxzZXJ2ZS51bmwuZWR1KQorCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qICRJZDogcGxhbmIuaCx2IDEuMTMgMTk5OS8wNS8wMyAxOToyODo1NiBtbGFuIEV4cCAkICovCisKKyNpZm5kZWYgX1BMQU5CX0hfCisjZGVmaW5lIF9QTEFOQl9IXworCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS9kYmRtYS5oPgorI2luY2x1ZGUgInNhYTcxOTYuaCIKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNkZWZpbmUgUExBTkJfREVWSUNFX05BTUUJIkFwcGxlIFBsYW5CIFZpZGVvLUluIgorI2RlZmluZSBQTEFOQl9SRVYJCSIxLjAiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisvLyNkZWZpbmUgUExBTkJfR1NDQU5MSU5FCS8qIHVzZSB0aGlzIGlmIGFwcHMgaGF2ZSB0aGUgbm90aW9uIG9mICovCisJCQkJLyogZ3JhYiBidWZmZXIgc2NhbmxpbmUgKi8KKy8qIFRoaXMgc2hvdWxkIGJlIHNhZmUgZm9yIGJvdGggUEFMIGFuZCBOVFNDICovCisjZGVmaW5lIFBMQU5CX01BWFBJWEVMUyA3NjgKKyNkZWZpbmUgUExBTkJfTUFYTElORVMgNTc2CisjZGVmaW5lIFBMQU5CX05UU0NfTUFYTElORVMgNDgwCisKKy8qIFVuY29tbWVudCB5b3VyIHByZWZlcnJlZCBub3JtIDstKSAqLworI2RlZmluZSBQTEFOQl9ERUZfTk9STSBWSURFT19NT0RFX1BBTAorLy8jZGVmaW5lIFBMQU5CX0RFRl9OT1JNIFZJREVPX01PREVfTlRTQworLy8jZGVmaW5lIFBMQU5CX0RFRl9OT1JNIFZJREVPX01PREVfU0VDQU0KKworLyogZmllbGRzIHNldHRpbmdzICovCisjZGVmaW5lIFBMQU5CX0dSQVkJMHgxCS8qICA4LWJpdCBtb25vPyAqLworI2RlZmluZSBQTEFOQl9DT0xPVVIxNQkweDIJLyogMTYtYml0IG1vZGUgKi8KKyNkZWZpbmUgUExBTkJfQ09MT1VSMzIJMHg0CS8qIDMyLWJpdCBtb2RlICovCisjZGVmaW5lIFBMQU5CX0NMSVBNQVNLCTB4OAkvKiBoYXJkd2FyZSBjbGlwbWFza2luZyAqLworCisvKiBtaXNjLiBmbGFncyBmb3IgUGxhbkIgRE1BIG9wZXJhdGlvbiAqLworI2RlZmluZQlDSF9TWU5DCQkweDEJLyogc3luY2hyb25pemUgY2hhbm5lbHMgKHNldCBieSBjaDE7CisJCQkJICAgY2xlYXJlZCBieSBjaDIpICovCisjZGVmaW5lIEZJRUxEX1NZTkMJMHgyICAgICAvKiB1c2VkIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBmaWVsZAorCQkJCSAgICgwIC0+IDEgLT4gMCBmb3IgY2gxOyAwIC0+IDEgZm9yIGNoMikgKi8KKyNkZWZpbmUgRVZFTl9GSUVMRAkweDAJLyogZXZlbiBmaWVsZCBpcyBkZXRlY3RlZCBpZiB1bnNldCAqLworI2RlZmluZSBETUFfQUJPUlQJMHgyCS8qIGVycm9yIG9yIGp1c3Qgb3V0IG9mIHN5bmMgaWYgc2V0ICovCisjZGVmaW5lIE9ERF9GSUVMRAkweDQJLyogb2RkIGZpZWxkIGlzIGRldGVjdGVkIGlmIHNldCAqLworCisvKiBmb3IgY2FwdHVyZSBvcGVyYXRpb25zICovCisjZGVmaW5lIE1BWF9HQlVGRkVSUwkyCisvKiBub3RlIFBMQU5CX01BWF9GQlVGIG11c3QgYmUgZGl2aXNpYmxlIGJ5IFBBR0VfU0laRSAqLworI2lmZGVmIFBMQU5CX0dTQ0FOTElORQorI2RlZmluZSBQTEFOQl9NQVhfRkJVRgkweDI0MDAwMAkvKiA1NzYgKiAxMDI0ICogNCAqLworI2RlZmluZSBUQUJfRkFDVE9SCSgxKQorI2Vsc2UKKyNkZWZpbmUgUExBTkJfTUFYX0ZCVUYJMHgxYjAwMDAJLyogNTc2ICogNzY4ICogNCAqLworI2RlZmluZSBUQUJfRkFDVE9SCSgyKQorI2VuZGlmCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCitzdHJ1Y3QgcGxhbmJfc2FhX3JlZ3MgeworCXVuc2lnbmVkIGNoYXIgYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKK307CisKK3N0cnVjdCBwbGFuYl9zdGF0X3JlZ3MgeworCXVuc2lnbmVkIGludCBjaDFfc3RhdDsKKwl1bnNpZ25lZCBpbnQgY2gyX3N0YXQ7CisJdW5zaWduZWQgY2hhciBzYWFfc3RhdDA7CisJdW5zaWduZWQgY2hhciBzYWFfc3RhdDE7Cit9OworCitzdHJ1Y3QgcGxhbmJfYW55X3JlZ3MgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IGJ5dGVzOworCXVuc2lnbmVkIGNoYXIgZGF0YVsxMjhdOworfTsKKworLyogcGxhbmIgcHJpdmF0ZSBpb2N0bHMgKi8KKyNkZWZpbmUgUExBTkJJT0NHU0FBUkVHUwlfSU9XUigndicsIEJBU0VfVklESU9DUFJJVkFURSwgc3RydWN0IHBsYW5iX3NhYV9yZWdzKQkvKiBSZWFkIGEgc2FhNzE5NiByZWcgdmFsdWUgKi8KKyNkZWZpbmUgUExBTkJJT0NTU0FBUkVHUwlfSU9XKCd2JywgQkFTRV9WSURJT0NQUklWQVRFICsgMSwgc3RydWN0IHBsYW5iX3NhYV9yZWdzKQkvKiBTZXQgYSBzYWE3MTk2IHJlZyB2YWx1ZSAqLworI2RlZmluZSBQTEFOQklPQ0dTVEFUCQlfSU9SKCd2JywgQkFTRV9WSURJT0NQUklWQVRFICsgMiwgc3RydWN0IHBsYW5iX3N0YXRfcmVncykJLyogUmVhZCBwbGFuYiBzdGF0dXMgKi8KKyNkZWZpbmUgUExBTkJfVFZfTU9ERQkJMQorI2RlZmluZSBQTEFOQl9WVFJfTU9ERQkJMgorI2RlZmluZSBQTEFOQklPQ0dNT0RFCQlfSU9SKCd2JywgQkFTRV9WSURJT0NQUklWQVRFICsgMywgaW50KQkvKiBHZXQgVFYvVlRSIG1vZGUgKi8KKyNkZWZpbmUgUExBTkJJT0NTTU9ERQkJX0lPVygndicsIEJBU0VfVklESU9DUFJJVkFURSArIDQsIGludCkJLyogU2V0IFRWL1ZUUiBtb2RlICovCisKKyNpZmRlZiBQTEFOQl9HU0NBTkxJTkUKKyNkZWZpbmUgUExBTkJHX0dSQUJfQlBMCQlfSU9SKCd2JywgQkFTRV9WSURJT0NQUklWQVRFICsgNSwgaW50KQkvKiAjIG9mIGJ5dGVzIHBlciBzY2FubGluZSBpbiBncmFiIGJ1ZmZlciAqLworI2VuZGlmCisKKy8qIGNhbGwgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCkgd2l0aCBhcHByb3ByaWF0ZSBhY3Rpb25zICovCisjZGVmaW5lIFBMQU5CX0lOVFJfREVCVUcJX0lPVygndicsIEJBU0VfVklESU9DUFJJVkFURSArIDIwLCBpbnQpCisvKiBpbnZlc3RpZ2F0ZSB3aGljaCByZWcgZG9lcyB3aGF0ICovCisjZGVmaW5lIFBMQU5CX0lOVl9SRUdTCQlfSU9XUigndicsIEJBU0VfVklESU9DUFJJVkFURSArIDIxLCBzdHJ1Y3QgcGxhbmJfYW55X3JlZ3MpCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIFBvdGVudGlhbGx5IHVzZWZ1bCBtYWNyb3MgKi8KKyNkZWZpbmUgUExBTkJfU0VUKHgpCSgoeCkgPDwgMTYgfCAoeCkpCisjZGVmaW5lIFBMQU5CX0NMUih4KQkoKHgpIDw8IDE2KQorCisvKiBUaGlzIHJlcHJlc2VudHMgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIGxheW91dCAqLworc3RydWN0IHBsYW5iX3JlZ2lzdGVycyB7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MJY2gxOwkJLyogMHgwMDogdmlkZW8gaW4gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJCWV2ZW47CQkvKiAweDQwOiBldmVuIGZpZWxkIHNldHRpbmcgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJCW9kZDsJCS8qIDB4NDQ7IG9kZCBmaWVsZCBzZXR0aW5nICovCisJdW5zaWduZWQgaW50CQkJcGFkMVsxNF07CS8qIGVtcHR5PyAqLworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzCWNoMjsJCS8qIDB4ODA6IGNsaXBtYXNrIG91dCAqLworCXVuc2lnbmVkIGludAkJCXBhZDJbMTZdOwkvKiAweGMwOiBlbXB0eT8gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJCXJlZzM7CQkvKiAweDEwMDogPz8/PyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludAkJaW50cl9zdGF0OwkvKiAweDEwNDogaXJxIHN0YXR1cyAqLworI2RlZmluZSBQTEFOQl9DTFJfSVJRCQkweDAwCQkvKiBjbGVhciBQbGFuIEIgaW50ZXJydXB0ICovCisjZGVmaW5lIFBMQU5CX0dFTl9JUlEJCTB4MDEJCS8qIGFzc2VydCBQbGFuIEIgaW50ZXJydXB0ICovCisjZGVmaW5lIFBMQU5CX0ZSTV9JUlEJCTB4MDEwMAkJLyogZW5kIG9mIGZyYW1lICovCisJdW5zaWduZWQgaW50CQkJcGFkM1sxXTsJLyogZW1wdHk/ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50CQlyZWc1OwkJLyogMHgxMGM6ID8/PyAqLworCXVuc2lnbmVkIGludAkJCXBhZDRbNjBdOwkvKiBlbXB0eT8gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCQlzYWFfYWRkcjsJLyogMHgyMDA6IFNBQSBzdWJhZHIgKi8KKwljaGFyCQkJCXBhZDVbM107CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkJc2FhX3JlZ3ZhbDsJLyogU0FBNzE5NiB3cml0ZSByZWcuIHZhbCAqLworCWNoYXIJCQkJcGFkNlszXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCQlzYWFfc3RhdHVzOwkvKiBTQUE3MTk2IHN0YXR1cyBieXRlICovCisJLyogVGhlcmUgaXMgbW9yZSB1bnVzZWQgc3R1ZmYgaGVyZSAqLworfTsKKworc3RydWN0IHBsYW5iX3dpbmRvdyB7CisJaW50CXgsIHk7CisJdXNob3J0CXdpZHRoLCBoZWlnaHQ7CisJdXNob3J0CWJwcCwgYnBsLCBkZXB0aCwgcGFkOworCXVzaG9ydAlzd2lkdGgsIHNoZWlnaHQ7CisJaW50CW5vcm07CisJaW50CWludGVybGFjZTsKKwl1MzIJY29sb3JfZm10OworCWludAljaHJvbWFrZXk7CisJaW50CW1vZGU7CQkvKiB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIFRWL1ZUUiBtb2RlcyAqLworfTsKKworc3RydWN0IHBsYW5iX3N1c3BlbmQgeworCWludCBvdmVybGF5OworCWludCBmcmFtZTsKKwlzdHJ1Y3QgZGJkbWFfY21kIGNtZDsKK307CisKK3N0cnVjdCBwbGFuYiB7CisJc3RydWN0CXZpZGVvX2RldmljZSB2aWRlb19kZXY7CisJc3RydWN0CXZpZGVvX3BpY3R1cmUgcGljdHVyZTsJCS8qIEN1cnJlbnQgcGljdHVyZSBwYXJhbXMgKi8KKwlzdHJ1Y3QJdmlkZW9fYXVkaW8gYXVkaW9fZGV2OwkJLyogQ3VycmVudCBhdWRpbyBwYXJhbXMgKi8KKyAgCisJdm9sYXRpbGUgc3RydWN0IHBsYW5iX3JlZ2lzdGVycyAqcGxhbmJfYmFzZTsJLyogdmlydCBiYXNlIG9mIHBsYW5iICovCisJc3RydWN0IHBsYW5iX3JlZ2lzdGVycyAqcGxhbmJfYmFzZV9waHlzOwkvKiBwaHlzIGJhc2Ugb2YgcGxhbmIgKi8KKwl2b2lkCSpwcml2X3NwYWNlOwkJCS8qIE9yZy4gYWxsb2MuIG1lbSBmb3Iga2ZyZWUgKi8KKwlpbnQJdXNlcjsKKwl1bnNpZ25lZCBpbnQgdGFiX3NpemU7CisJaW50ICAgICBtYXhsaW5lczsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJdW5zaWduZWQgaW50CWlycTsJCQkvKiBpbnRlcnJ1cHQgbnVtYmVyICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGludHJfbWFzazsKKworCWludAlvdmVybGF5OwkJCS8qIG92ZXJsYXkgcnVubmluZz8gKi8KKwlzdHJ1Y3QJcGxhbmJfd2luZG93IHdpbjsKKwl1bnNpZ25lZCBsb25nIGZyYW1lX2J1ZmZlcl9waHlzOwkvKiBXZSBuZWVkIHBoeXMgZm9yIERNQSAqLworCWludAlvZmZzZXQ7CQkJCS8qIG9mZnNldCBvZiBwaXhlbCAxICovCisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY2gxX2NtZDsJLyogVmlkZW8gSW4gRE1BIGNtZCBidWZmZXIgKi8KKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjaDJfY21kOwkvKiBDbGlwIE91dCBETUEgY21kIGJ1ZmZlciAqLworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKm92ZXJsYXlfbGFzdDE7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqb3ZlcmxheV9sYXN0MjsKKwl1bnNpZ25lZCBsb25nIGNoMV9jbWRfcGh5czsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICptYXNrOwkJLyogQ2xpcG1hc2sgYnVmZmVyICovCisJaW50IHN1c3BlbmQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3VzcGVuZHE7CisJc3RydWN0IHBsYW5iX3N1c3BlbmQgc3VzcGVuZGVkOworCWludAljbWRfYnVmZl9pbml0ZWQ7CQkvKiBjbWQgYnVmZmVyIGluaXRlZD8gKi8KKworCWludCBncmFiYmluZzsKKwl1bnNpZ25lZCBpbnQgZ2NvdW50OworCXdhaXRfcXVldWVfaGVhZF90IGNhcHE7CisJaW50IGxhc3RfZnI7CisJaW50IHByZXZfbGFzdF9mcjsKKwl1bnNpZ25lZCBjaGFyICoqcmF3YnVmOworCWludCByYXdidWZfc2l6ZTsKKwlpbnQgZ2J1Zl9pZHhbTUFYX0dCVUZGRVJTXTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjYXBfY21kW01BWF9HQlVGRkVSU107CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqbGFzdF9jbWRbTUFYX0dCVUZGRVJTXTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpwcmVfY21kW01BWF9HQlVGRkVSU107CisJaW50IG5lZWRfcHJlX2NhcHR1cmVbTUFYX0dCVUZGRVJTXTsKKyNkZWZpbmUgUExBTkJfRFVNTVkgNDAJLyogIyBvZiBjb21tYW5kIGJ1ZidzIGFsbG9jYXRlZCBmb3IgcHJlLWNhcHR1cmUgc2VxLiAqLworCWludCBnd2lkdGhbTUFYX0dCVUZGRVJTXSwgZ2hlaWdodFtNQVhfR0JVRkZFUlNdOworCXVuc2lnbmVkIGludCBnZm10W01BWF9HQlVGRkVSU107CisJaW50IGdub3JtX3N3aXRjaFtNQVhfR0JVRkZFUlNdOworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmZyYW1lX3N0YXQ7CisjZGVmaW5lIEdCVUZGRVJfVU5VU0VEICAgICAgIDB4MDBVCisjZGVmaW5lIEdCVUZGRVJfR1JBQkJJTkcgICAgIDB4MDFVCisjZGVmaW5lIEdCVUZGRVJfRE9ORSAgICAgICAgIDB4MDJVCisjaWZkZWYgUExBTkJfR1NDQU5MSU5FCisJaW50IGdieXRlc19wZXJfbGluZTsKKyNlbHNlCisjZGVmaW5lIE1BWF9MTlVNIDQzMQkvKiBjaGFuZ2UgdGhpcyBpZiBQTEFOQl9NQVhMSU5FUyBvciAqLworCQkJLyogUExBTkJfTUFYUElYRUxTIGNoYW5nZXMgKi8KKwlpbnQgbF9mcl9hZGRyX2lkeFtNQVhfR0JVRkZFUlNdOworCXVuc2lnbmVkIGNoYXIgKmxfdG9fYWRkcltNQVhfR0JVRkZFUlNdW01BWF9MTlVNXTsKKwlpbnQgbF90b19uZXh0X2lkeFtNQVhfR0JVRkZFUlNdW01BWF9MTlVNXTsKKwlpbnQgbF90b19uZXh0X3NpemVbTUFYX0dCVUZGRVJTXVtNQVhfTE5VTV07CisJaW50IGxzaXplW01BWF9HQlVGRkVSU10sIGxudW1bTUFYX0dCVUZGRVJTXTsKKyNlbmRpZgorfTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9QTEFOQl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwNDIwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKQEAgLTAsMCArMSwxMDYwIEBACisvKgorICoJTWVkaWEgVmlzaW9uIFBybyBNb3ZpZSBTdHVkaW8KKyAqCQkJb3IKKyAqCSJhbGwgeW91IG5lZWQgaXMgYW4gSTJDIGJ1cyBzb21lIFJBTSBhbmQgYSBwcmF5ZXIiCisgKgorICoJVGhpcyBkcmF3cyBoZWF2aWx5IG9uIGNvZGUKKyAqCisgKgkoYykgV29sZmdhbmcgS29laGxlciwgIHdvbGZAZmlyc3QuZ21kLmRlLCBEZWMuIDE5OTQKKyAqCUtpZWZlcm5yaW5nIDE1CisgKgkxNDQ3OCBQb3RzZGFtLCBHZXJtYW55CisgKgorICoJTW9zdCBvZiB0aGlzIGNvZGUgaXMgZGlyZWN0bHkgZGVyaXZlZCBmcm9tIGhpcyB1c2Vyc3BhY2UgZHJpdmVyLgorICoJSGlzIGRyaXZlciB3b3JrcyBzbyBzZW5kIGFueSByZXBvcnRzIHRvIGFsYW5AcmVkaGF0LmNvbSB1bmxlc3MgdGhlCisgKgl1c2Vyc3BhY2UgZHJpdmVyIGFsc28gZG9lc24ndCB3b3JrIGZvciB5b3UuLi4KKyAqICAgICAgCisgKiAgICAgIENoYW5nZXM6CisgKiAgICAgIDA4LzA3LzIwMDMgICAgICAgIERhbmllbGUgQmVsbHVjY2kgPGJlbGx1Y2RhQHRpc2NhbGkuaXQ+CisgKiAgICAgICAgICAgICAgICAgICAgICAgIC0gcG1zX2NhcHR1cmU6IHJlcG9ydCBiYWNrIC1FRkFVTFQgCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCisjZGVmaW5lIE1PVE9ST0xBCTEKKyNkZWZpbmUgUEhJTElQUzIJMgorI2RlZmluZSBQSElMSVBTMQkzCisjZGVmaW5lIE1WVk1FTU9SWVdJRFRICTB4NDAJCS8qIDUxMiBieXRlcyAqLworCitzdHJ1Y3QgcG1zX2RldmljZQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgdjsKKwlzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0dXJlOworCWludCBoZWlnaHQ7CisJaW50IHdpZHRoOworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKK307CisKK3N0cnVjdCBpMmNfaW5mbworeworCXU4IHNsYXZlOworCXU4IHN1YjsKKwl1OCBkYXRhOworCXU4IGhpdHM7Cit9OworCitzdGF0aWMgaW50IGkyY19jb3VudCAJCT0gMDsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2luZm8gaTJjaW5mb1s2NF07CisKK3N0YXRpYyBpbnQgZGVjb2RlciAJCT0gUEhJTElQUzI7CitzdGF0aWMgaW50IHN0YW5kYXJkIAkJPSAwOwkvKiAwIC0gYXV0byAxIC0gbnRzYyAyIC0gcGFsIDMgLSBzZWNhbSAqLworCisvKgorICoJSS9PIHBvcnRzIGFuZCBTaGFyZWQgTWVtb3J5CisgKi8KKyAKK3N0YXRpYyBpbnQgaW9fcG9ydAkJPQkweDI1MDsKK3N0YXRpYyBpbnQgZGF0YV9wb3J0CQk9CTB4MjUxOworc3RhdGljIGludCBtZW1fYmFzZQkJPQkweEM4MDAwOworc3RhdGljIHZvaWQgX19pb21lbSAqbWVtOworc3RhdGljIGludCB2aWRlb19uciAgICAgICAgICAgICA9ICAgICAgIC0xOworCisJCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdnZfd3JpdGUodTggaW5kZXgsIHU4IHZhbHVlKQoreworCW91dHcoaW5kZXh8KHZhbHVlPDw4KSwgaW9fcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggbXZ2X3JlYWQodTggaW5kZXgpCit7CisJb3V0YihpbmRleCwgaW9fcG9ydCk7CisJcmV0dXJuIGluYihkYXRhX3BvcnQpOworfQorCitzdGF0aWMgaW50IHBtc19pMmNfc3RhdCh1OCBzbGF2ZSkKK3sKKwlpbnQgY291bnRlcjsKKwlpbnQgaTsKKwkKKwlvdXRiKDB4MjgsIGlvX3BvcnQpOworCQorCWNvdW50ZXI9MDsKKwl3aGlsZSgoaW5iKGRhdGFfcG9ydCkmMHgwMSk9PTApCisJCWlmKGNvdW50ZXIrKz09MjU2KQorCQkJYnJlYWs7CisKKwl3aGlsZSgoaW5iKGRhdGFfcG9ydCkmMHgwMSkhPTApCisJCWlmKGNvdW50ZXIrKz09MjU2KQorCQkJYnJlYWs7CisJCQkKKwlvdXRiKHNsYXZlLCBpb19wb3J0KTsKKwkKKwljb3VudGVyPTA7CisJd2hpbGUoKGluYihkYXRhX3BvcnQpJjB4MDEpPT0wKQorCQlpZihjb3VudGVyKys9PTI1NikKKwkJCWJyZWFrOworCisJd2hpbGUoKGluYihkYXRhX3BvcnQpJjB4MDEpIT0wKQorCQlpZihjb3VudGVyKys9PTI1NikKKwkJCWJyZWFrOworCQkJCisJZm9yKGk9MDtpPDEyO2krKykKKwl7CisJCWNoYXIgc3Q9aW5iKGRhdGFfcG9ydCk7CisJCWlmKChzdCYyKSE9MCkKKwkJCXJldHVybiAtMTsKKwkJaWYoKHN0JjEpPT0wKQorCQkJYnJlYWs7CisJfQorCW91dGIoMHgyOSwgaW9fcG9ydCk7CisJcmV0dXJuIGluYihkYXRhX3BvcnQpOwkJCit9CisKK3N0YXRpYyBpbnQgcG1zX2kyY193cml0ZSh1MTYgc2xhdmUsIHUxNiBzdWIsIHUxNiBkYXRhKQoreworCWludCBza2lwPTA7CisJaW50IGNvdW50OworCWludCBpOworCQorCWZvcihpPTA7aTxpMmNfY291bnQ7aSsrKQorCXsKKwkJaWYoKGkyY2luZm9baV0uc2xhdmU9PXNsYXZlKSAmJgorCQkgICAoaTJjaW5mb1tpXS5zdWIgPT0gc3ViKSkKKwkJeworCQkgICAJaWYoaTJjaW5mb1tpXS5kYXRhPT1kYXRhKQorCQkgICAJCXNraXA9MTsKKwkJICAgCWkyY2luZm9baV0uZGF0YT1kYXRhOworCQkgICAJaT1pMmNfY291bnQrMTsKKwkJfQorCX0KKwkKKwlpZihpPT1pMmNfY291bnQgJiYgaTJjX2NvdW50PDY0KQorCXsKKwkJaTJjaW5mb1tpMmNfY291bnRdLnNsYXZlPXNsYXZlOworCQlpMmNpbmZvW2kyY19jb3VudF0uc3ViPXN1YjsKKwkJaTJjaW5mb1tpMmNfY291bnRdLmRhdGE9ZGF0YTsKKwkJaTJjX2NvdW50Kys7CisJfQorCQorCWlmKHNraXApCisJCXJldHVybiAwOworCQkKKwltdnZfd3JpdGUoMHgyOSwgc3ViKTsKKwltdnZfd3JpdGUoMHgyQSwgZGF0YSk7CisJbXZ2X3dyaXRlKDB4MjgsIHNsYXZlKTsKKwkKKwlvdXRiKDB4MjgsIGlvX3BvcnQpOworCQorCWNvdW50PTA7CisJd2hpbGUoKGluYihkYXRhX3BvcnQpJjEpPT0wKQorCQlpZihjb3VudD4yNTUpCisJCQlicmVhazsKKwl3aGlsZSgoaW5iKGRhdGFfcG9ydCkmMSkhPTApCisJCWlmKGNvdW50PjI1NSkKKwkJCWJyZWFrOworCQkJCisJY291bnQ9aW5iKGRhdGFfcG9ydCk7CisJCisJaWYoY291bnQmMikKKwkJcmV0dXJuIC0xOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwbXNfaTJjX3JlYWQoaW50IHNsYXZlLCBpbnQgc3ViKQoreworCWludCBpPTA7CisJZm9yKGk9MDtpPGkyY19jb3VudDtpKyspCisJeworCQlpZihpMmNpbmZvW2ldLnNsYXZlPT1zbGF2ZSAmJiBpMmNpbmZvW2ldLnN1Yj09c3ViKQorCQkJcmV0dXJuIGkyY2luZm9baV0uZGF0YTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcG1zX2kyY19hbmRvcihpbnQgc2xhdmUsIGludCBzdWIsIGludCBhbmQsIGludCBvcikKK3sKKwl1OCB0bXA7CQorCQorCXRtcD1wbXNfaTJjX3JlYWQoc2xhdmUsIHN1Yik7CisJdG1wID0gKHRtcCZhbmQpfG9yOworCXBtc19pMmNfd3JpdGUoc2xhdmUsIHN1YiwgdG1wKTsKK30KKworLyoKKyAqCUNvbnRyb2wgZnVuY3Rpb25zCisgKi8KKyAKKworc3RhdGljIHZvaWQgcG1zX3ZpZGVvc291cmNlKHNob3J0IHNvdXJjZSkKK3sKKwltdnZfd3JpdGUoMHgyRSwgc291cmNlPzB4MzE6MHgzMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBtc19odWUoc2hvcnQgaHVlKQoreworCXN3aXRjaChkZWNvZGVyKQorCXsKKwkJY2FzZSBNT1RPUk9MQToKKwkJCXBtc19pMmNfd3JpdGUoMHg4QSwgMHgwMCwgaHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFBISUxJUFMyOgorCQkJcG1zX2kyY193cml0ZSgweDhBLCAweDA3LCBodWUpOworCQkJYnJlYWs7CisJCWNhc2UgUEhJTElQUzE6CisJCQlwbXNfaTJjX3dyaXRlKDB4NDIsIDB4MDcsIGh1ZSk7CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBtc19jb2xvdXIoc2hvcnQgY29sb3VyKQoreworCXN3aXRjaChkZWNvZGVyKQorCXsKKwkJY2FzZSBNT1RPUk9MQToKKwkJCXBtc19pMmNfd3JpdGUoMHg4QSwgMHgwMCwgY29sb3VyKTsKKwkJCWJyZWFrOworCQljYXNlIFBISUxJUFMxOgorCQkJcG1zX2kyY193cml0ZSgweDQyLCAweDEyLCBjb2xvdXIpOworCQkJYnJlYWs7CisJfQorfQorIAorIAorc3RhdGljIHZvaWQgcG1zX2NvbnRyYXN0KHNob3J0IGNvbnRyYXN0KQoreworCXN3aXRjaChkZWNvZGVyKQorCXsKKwkJY2FzZSBNT1RPUk9MQToKKwkJCXBtc19pMmNfd3JpdGUoMHg4QSwgMHgwMCwgY29udHJhc3QpOworCQkJYnJlYWs7CisJCWNhc2UgUEhJTElQUzE6CisJCQlwbXNfaTJjX3dyaXRlKDB4NDIsIDB4MTMsIGNvbnRyYXN0KTsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcG1zX2JyaWdodG5lc3Moc2hvcnQgYnJpZ2h0bmVzcykKK3sKKwlzd2l0Y2goZGVjb2RlcikKKwl7CisJCWNhc2UgTU9UT1JPTEE6CisJCQlwbXNfaTJjX3dyaXRlKDB4OEEsIDB4MDAsIGJyaWdodG5lc3MpOworCQkJcG1zX2kyY193cml0ZSgweDhBLCAweDAwLCBicmlnaHRuZXNzKTsKKwkJCXBtc19pMmNfd3JpdGUoMHg4QSwgMHgwMCwgYnJpZ2h0bmVzcyk7CisJCQlicmVhazsKKwkJY2FzZSBQSElMSVBTMToKKwkJCXBtc19pMmNfd3JpdGUoMHg0MiwgMHgxOSwgYnJpZ2h0bmVzcyk7CisJCQlicmVhazsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgcG1zX2Zvcm1hdChzaG9ydCBmb3JtYXQpCit7CisJaW50IHRhcmdldDsKKwlzdGFuZGFyZCA9IGZvcm1hdDsKKwkKKwlpZihkZWNvZGVyPT1QSElMSVBTMSkKKwkJdGFyZ2V0PTB4NDI7CisJZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMikKKwkJdGFyZ2V0PTB4OEE7CisJZWxzZQorCQlyZXR1cm47CisJCQkJCisJc3dpdGNoKGZvcm1hdCkKKwl7CisJCWNhc2UgMDoJLyogQXV0byAqLworCQkJcG1zX2kyY19hbmRvcih0YXJnZXQsIDB4MEQsIDB4RkUsMHgwMCk7CisJCQlwbXNfaTJjX2FuZG9yKHRhcmdldCwgMHgwRiwgMHgzRiwweDgwKTsKKwkJCWJyZWFrOworCQljYXNlIDE6IC8qIE5UU0MgKi8KKwkJCXBtc19pMmNfYW5kb3IodGFyZ2V0LCAweDBELCAweEZFLCAweDAwKTsKKwkJCXBtc19pMmNfYW5kb3IodGFyZ2V0LCAweDBGLCAweDNGLCAweDQwKTsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8qIFBBTCAqLworCQkJcG1zX2kyY19hbmRvcih0YXJnZXQsIDB4MEQsIDB4RkUsIDB4MDApOworCQkJcG1zX2kyY19hbmRvcih0YXJnZXQsIDB4MEYsIDB4M0YsIDB4MDApOworCQkJYnJlYWs7CisJCWNhc2UgMzoJLyogU0VDQU0gKi8KKwkJCXBtc19pMmNfYW5kb3IodGFyZ2V0LCAweDBELCAweEZFLCAweDAxKTsKKwkJCXBtc19pMmNfYW5kb3IodGFyZ2V0LCAweDBGLCAweDNGLCAweDAwKTsKKwkJCWJyZWFrOworCX0KK30KKworI2lmZGVmIEZPUl9GVVRVUkVfRVhQQU5TSU9OCisKKy8qCisgKglUaGVzZSBmZWF0dXJlcyBvZiB0aGUgUE1TIGNhcmQgYXJlIG5vdCBjdXJyZW50bHkgZXhwb3Nlcy4gVGhleQorICoJY291bGQgYmVjb21lIGEgcHJpdmF0ZSB2NGwgaW9jdGwgZm9yIFBNU0NPTkZJRyBvciBzb21lc3VjaCBpZiAKKyAqCXBlb3BsZSBuZWVkIGl0LiBXZSBhbHNvIGRvbid0IHlldCB1c2UgdGhlIFBNUyBpbnRlcnJ1cHQuCisgKi8KKworc3RhdGljIHZvaWQgcG1zX2hzdGFydChzaG9ydCBzdGFydCkKK3sKKwlzd2l0Y2goZGVjb2RlcikKKwl7CisJCWNhc2UgUEhJTElQUzE6CisJCQlwbXNfaTJjX3dyaXRlKDB4OEEsIDB4MDUsIHN0YXJ0KTsKKwkJCXBtc19pMmNfd3JpdGUoMHg4QSwgMHgxOCwgc3RhcnQpOworCQkJYnJlYWs7CisJCWNhc2UgUEhJTElQUzI6CisJCQlwbXNfaTJjX3dyaXRlKDB4NDIsIDB4MDUsIHN0YXJ0KTsKKwkJCXBtc19pMmNfd3JpdGUoMHg0MiwgMHgxOCwgc3RhcnQpOworCQkJYnJlYWs7CisJfQorfQorCisvKgorICoJQmFuZHBhc3MgZmlsdGVycworICovCisgCitzdGF0aWMgdm9pZCBwbXNfYmFuZHBhc3Moc2hvcnQgcGFzcykKK3sKKwlpZihkZWNvZGVyPT1QSElMSVBTMikKKwkJcG1zX2kyY19hbmRvcigweDhBLCAweDA2LCAweENGLCAocGFzcyYweDAzKTw8NCk7CisJZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKKwkJcG1zX2kyY19hbmRvcigweDQyLCAweDA2LCAweENGLCAocGFzcyYweDAzKTw8NCk7Cit9CisKK3N0YXRpYyB2b2lkIHBtc19hbnRpc25vdyhzaG9ydCBzbm93KQoreworCWlmKGRlY29kZXI9PVBISUxJUFMyKQorCQlwbXNfaTJjX2FuZG9yKDB4OEEsIDB4MDYsIDB4RjMsIChzbm93JjB4MDMpPDwyKTsKKwllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMxKQorCQlwbXNfaTJjX2FuZG9yKDB4NDIsIDB4MDYsIDB4RjMsIChzbm93JjB4MDMpPDwyKTsKK30KKworc3RhdGljIHZvaWQgcG1zX3NoYXJwbmVzcyhzaG9ydCBzaGFycCkKK3sKKwlpZihkZWNvZGVyPT1QSElMSVBTMikKKwkJcG1zX2kyY19hbmRvcigweDhBLCAweDA2LCAweEZDLCBzaGFycCYweDAzKTsKKwllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMxKQorCQlwbXNfaTJjX2FuZG9yKDB4NDIsIDB4MDYsIDB4RkMsIHNoYXJwJjB4MDMpOworfQorCitzdGF0aWMgdm9pZCBwbXNfY2hyb21hYWdjKHNob3J0IGFnYykKK3sKKwlpZihkZWNvZGVyPT1QSElMSVBTMikKKwkJcG1zX2kyY19hbmRvcigweDhBLCAweDBDLCAweDlGLCAoYWdjJjB4MDMpPDw1KTsKKwllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMxKQorCQlwbXNfaTJjX2FuZG9yKDB4NDIsIDB4MEMsIDB4OUYsIChhZ2MmMHgwMyk8PDUpOworfQorCitzdGF0aWMgdm9pZCBwbXNfdmVydG5vaXNlKHNob3J0IG5vaXNlKQoreworCWlmKGRlY29kZXI9PVBISUxJUFMyKQorCQlwbXNfaTJjX2FuZG9yKDB4OEEsIDB4MTAsIDB4RkMsIG5vaXNlJjMpOworCWVsc2UgaWYoZGVjb2Rlcj09UEhJTElQUzEpCisJCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgxMCwgMHhGQywgbm9pc2UmMyk7Cit9CisKK3N0YXRpYyB2b2lkIHBtc19mb3JjZWNvbG91cihzaG9ydCBjb2xvdXIpCit7CisJaWYoZGVjb2Rlcj09UEhJTElQUzIpCisJCXBtc19pMmNfYW5kb3IoMHg4QSwgMHgwQywgMHg3RiwgKGNvbG91ciYxKTw8Nyk7CisJZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKKwkJcG1zX2kyY19hbmRvcigweDQyLCAweDBDLCAweDcsIChjb2xvdXImMSk8PDcpOworfQorCitzdGF0aWMgdm9pZCBwbXNfYW50aWdhbW1hKHNob3J0IGdhbW1hKQoreworCWlmKGRlY29kZXI9PVBISUxJUFMyKQorCQlwbXNfaTJjX2FuZG9yKDB4QjgsIDB4MDAsIDB4N0YsIChnYW1tYSYxKTw8Nyk7CisJZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKKwkJcG1zX2kyY19hbmRvcigweDQyLCAweDIwLCAweDcsIChnYW1tYSYxKTw8Nyk7Cit9CisKK3N0YXRpYyB2b2lkIHBtc19wcmVmaWx0ZXIoc2hvcnQgZmlsdGVyKQoreworCWlmKGRlY29kZXI9PVBISUxJUFMyKQorCQlwbXNfaTJjX2FuZG9yKDB4OEEsIDB4MDYsIDB4QkYsIChmaWx0ZXImMSk8PDYpOworCWVsc2UgaWYoZGVjb2Rlcj09UEhJTElQUzEpCisJCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgwNiwgMHhCRiwgKGZpbHRlciYxKTw8Nik7Cit9CisKK3N0YXRpYyB2b2lkIHBtc19oZmlsdGVyKHNob3J0IGZpbHRlcikKK3sKKwlpZihkZWNvZGVyPT1QSElMSVBTMikKKwkJcG1zX2kyY19hbmRvcigweEI4LCAweDA0LCAweDFGLCAoZmlsdGVyJjcpPDw1KTsKKwllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMxKQorCQlwbXNfaTJjX2FuZG9yKDB4NDIsIDB4MjQsIDB4MUYsIChmaWx0ZXImNyk8PDUpOworfQorCitzdGF0aWMgdm9pZCBwbXNfdmZpbHRlcihzaG9ydCBmaWx0ZXIpCit7CisJaWYoZGVjb2Rlcj09UEhJTElQUzIpCisJCXBtc19pMmNfYW5kb3IoMHhCOCwgMHgwOCwgMHg5RiwgKGZpbHRlciYzKTw8NSk7CisJZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKKwkJcG1zX2kyY19hbmRvcigweDQyLCAweDI4LCAweDlGLCAoZmlsdGVyJjMpPDw1KTsKK30KKworc3RhdGljIHZvaWQgcG1zX2tpbGxjb2xvdXIoc2hvcnQgY29sb3VyKQoreworCWlmKGRlY29kZXI9PVBISUxJUFMyKQorCXsKKwkJcG1zX2kyY19hbmRvcigweDhBLCAweDA4LCAweDA3LCAoY29sb3VyJjB4MUYpPDwzKTsKKwkJcG1zX2kyY19hbmRvcigweDhBLCAweDA5LCAweDA3LCAoY29sb3VyJjB4MUYpPDwzKTsKKwl9CisJZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKKwl7CisJCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgwOCwgMHgwNywgKGNvbG91ciYweDFGKTw8Myk7CisJCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgwOSwgMHgwNywgKGNvbG91ciYweDFGKTw8Myk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbXNfY2hyb21hZ2FpbihzaG9ydCBjaHJvbWEpCit7CisJaWYoZGVjb2Rlcj09UEhJTElQUzIpCisJeworCQlwbXNfaTJjX3dyaXRlKDB4OEEsIDB4MTEsIGNocm9tYSk7CisJfQorCWVsc2UgaWYoZGVjb2Rlcj09UEhJTElQUzEpCisJeworCQlwbXNfaTJjX3dyaXRlKDB4NDIsIDB4MTEsIGNocm9tYSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHBtc19zcGFjaWFsY29tcGwoc2hvcnQgZGF0YSkKK3sKKwltdnZfd3JpdGUoMHgzQiwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHBtc19zcGFjaWFsY29tcGgoc2hvcnQgZGF0YSkKK3sKKwltdnZfd3JpdGUoMHgzQSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHBtc192c3RhcnQoc2hvcnQgc3RhcnQpCit7CisJbXZ2X3dyaXRlKDB4MTYsIHN0YXJ0KTsKKwltdnZfd3JpdGUoMHgxNywgKHN0YXJ0Pj44KSYweDAxKTsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHBtc19zZWNhbWNyb3NzKHNob3J0IGNyb3NzKQoreworCWlmKGRlY29kZXI9PVBISUxJUFMyKQorCQlwbXNfaTJjX2FuZG9yKDB4OEEsIDB4MEYsIDB4REYsIChjcm9zcyYxKTw8NSk7CisJZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKKwkJcG1zX2kyY19hbmRvcigweDQyLCAweDBGLCAweERGLCAoY3Jvc3MmMSk8PDUpOworfQorCisKK3N0YXRpYyB2b2lkIHBtc19zd3NlbnNlKHNob3J0IHNlbnNlKQoreworCWlmKGRlY29kZXI9PVBISUxJUFMyKQorCXsKKwkJcG1zX2kyY193cml0ZSgweDhBLCAweDBBLCBzZW5zZSk7CisJCXBtc19pMmNfd3JpdGUoMHg4QSwgMHgwQiwgc2Vuc2UpOworCX0KKwllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMxKQorCXsKKwkJcG1zX2kyY193cml0ZSgweDQyLCAweDBBLCBzZW5zZSk7CisJCXBtc19pMmNfd3JpdGUoMHg0MiwgMHgwQiwgc2Vuc2UpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBwbXNfZnJhbWVyYXRlKHNob3J0IGZycikKK3sKKwlpbnQgZnBzPShzdGFuZGFyZD09MSk/MzA6MjU7CisJaWYoZnJyPT0wKQorCQlyZXR1cm47CisJZnBzPWZwcy9mcnI7CisJbXZ2X3dyaXRlKDB4MTQsMHg4MHxmcHMpOworCW12dl93cml0ZSgweDE1LDEpOworfQorCitzdGF0aWMgdm9pZCBwbXNfdmVydCh1OCBkZWNpZGVuLCB1OCBkZWNpbnVtKQoreworCW12dl93cml0ZSgweDFDLCBkZWNpZGVuKTsJLyogRGVub21pbmF0b3IgKi8KKwltdnZfd3JpdGUoMHgxRCwgZGVjaW51bSk7CS8qIE51bWVyYXRvciAqLworfQorCisvKgorICoJVHVybiAxNmJpdCByYXRpb3MgaW50byBiZXN0IHNtYWxsIHJhdGlvIHRoZSBjaGlwc2V0IGNhbiBncm9rCisgKi8KKyAKK3N0YXRpYyB2b2lkIHBtc192ZXJ0ZGVjaSh1bnNpZ25lZCBzaG9ydCBkZWNpbnVtLCB1bnNpZ25lZCBzaG9ydCBkZWNpZGVuKQoreworCS8qIEtub2NrIGl0IGRvd24gYnkgLzUgb25jZSAqLworCWlmKGRlY2ludW0lNT09MCkKKwl7CisJCWRlY2lkZW4vPTU7CisJCWRlY2ludW0vPTU7CisJfQorCS8qCisJICoJMydzCisJICovCisJd2hpbGUoZGVjaW51bSUzPT0wICYmIGRlY2lkZW4lMz09MCkKKwl7CisJCWRlY2lkZW4vPTM7CisJCWRlY2ludW0vPTM7CisJfQorCS8qCisJICoJMidzCisJICovCisJd2hpbGUoZGVjaW51bSUyPT0wICYmIGRlY2lkZW4lMj09MCkKKwl7CisJCWRlY2ludW0vPTI7CisJCWRlY2lkZW4vPTI7CisJfQorCS8qCisJICoJRnVkZ3lpZnkKKwkgKi8KKwl3aGlsZShkZWNpZGVuPjMyKQorCXsKKwkJZGVjaWRlbi89MjsKKwkJZGVjaW51bT0oZGVjaW51bSsxKS8yOworCX0KKwlpZihkZWNpZGVuPT0zMikKKwkJZGVjaWRlbi0tOworCXBtc192ZXJ0KGRlY2lkZW4sZGVjaW51bSk7Cit9CisKK3N0YXRpYyB2b2lkIHBtc19ob3J6ZGVjaShzaG9ydCBkZWNpbnVtLCBzaG9ydCBkZWNpZGVuKQoreworCWlmKGRlY2ludW08PTUxMikKKwl7CisJCWlmKGRlY2ludW0lNT09MCkKKwkJeworCQkJZGVjaW51bS89NTsKKwkJCWRlY2lkZW4vPTU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZGVjaW51bT01MTI7CisJCWRlY2lkZW49NjQwOwkvKiA3Njggd291bGQgYmUgaWRlYWwgKi8KKwl9CisJCisJd2hpbGUoKChkZWNpbnVtfGRlY2lkZW4pJjEpPT0wKQorCXsKKwkJZGVjaW51bT4+PTE7CisJCWRlY2lkZW4+Pj0xOworCX0KKwl3aGlsZShkZWNpZGVuPjMyKQorCXsKKwkJZGVjaWRlbj4+PTE7CisJCWRlY2ludW09KGRlY2ludW0rMSk+PjE7CisJfQorCWlmKGRlY2lkZW49PTMyKQorCQlkZWNpZGVuLS07CisJCQorCW12dl93cml0ZSgweDI0LCAweDgwfGRlY2lkZW4pOworCW12dl93cml0ZSgweDI1LCBkZWNpbnVtKTsKK30KKworc3RhdGljIHZvaWQgcG1zX3Jlc29sdXRpb24oc2hvcnQgd2lkdGgsIHNob3J0IGhlaWdodCkKK3sKKwlpbnQgZmdfaGVpZ2h0OworCQorCWZnX2hlaWdodD1oZWlnaHQ7CisJaWYoZmdfaGVpZ2h0PjI4MCkKKwkJZmdfaGVpZ2h0PTI4MDsKKwkJCisJbXZ2X3dyaXRlKDB4MTgsIGZnX2hlaWdodCk7CisJbXZ2X3dyaXRlKDB4MTksIGZnX2hlaWdodD4+OCk7CisJCisJaWYoc3RhbmRhcmQ9PTEpCisJeworCQltdnZfd3JpdGUoMHgxQSwgMHhGQyk7CisJCW12dl93cml0ZSgweDFCLCAweDAwKTsKKwkJaWYoaGVpZ2h0PmZnX2hlaWdodCkKKwkJCXBtc192ZXJ0ZGVjaSgyNDAsMjQwKTsKKwkJZWxzZQorCQkJcG1zX3ZlcnRkZWNpKGZnX2hlaWdodCwyNDApOworCX0KKwllbHNlCisJeworCQltdnZfd3JpdGUoMHgxQSwgMHgxQSk7CisJCW12dl93cml0ZSgweDFCLCAweDAxKTsKKwkJaWYoZmdfaGVpZ2h0PjI1NikKKwkJCXBtc192ZXJ0ZGVjaSgyNzAsMjcwKTsKKwkJZWxzZQorCQkJcG1zX3ZlcnRkZWNpKGZnX2hlaWdodCwgMjcwKTsKKwl9CisJbXZ2X3dyaXRlKDB4MTIsMCk7CisJbXZ2X3dyaXRlKDB4MTMsIE1WVk1FTU9SWVdJRFRIKTsKKwltdnZfd3JpdGUoMHg0MiwgMHgwMCk7CisJbXZ2X3dyaXRlKDB4NDMsIDB4MDApOworCW12dl93cml0ZSgweDQ0LCBNVlZNRU1PUllXSURUSCk7CisJCisJbXZ2X3dyaXRlKDB4MjIsIHdpZHRoKzgpOworCW12dl93cml0ZSgweDIzLCAod2lkdGgrOCk+PiA4KTsKKworCWlmKHN0YW5kYXJkPT0xKQorCQlwbXNfaG9yemRlY2kod2lkdGgsNjQwKTsKKwllbHNlCisJCXBtc19ob3J6ZGVjaSh3aWR0aCs4LCA3NjgpOworCisJbXZ2X3dyaXRlKDB4MzAsIG12dl9yZWFkKDB4MzApJjB4RkUpOworCW12dl93cml0ZSgweDA4LCBtdnZfcmVhZCgweDA4KXwweDAxKTsKKwltdnZfd3JpdGUoMHgwMSwgbXZ2X3JlYWQoMHgwMSkmMHhGRCk7CisJbXZ2X3dyaXRlKDB4MzIsIDB4MDApOworCW12dl93cml0ZSgweDMzLCBNVlZNRU1PUllXSURUSCk7Cit9CisKKworLyoKKyAqCVNldCBJbnB1dAorICovCisgCitzdGF0aWMgdm9pZCBwbXNfdmNyaW5wdXQoc2hvcnQgaW5wdXQpCit7CisJaWYoZGVjb2Rlcj09UEhJTElQUzIpCisJCXBtc19pMmNfYW5kb3IoMHg4QSwweDBELDB4N0YsKGlucHV0JjEpPDw3KTsKKwllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMxKQorCQlwbXNfaTJjX2FuZG9yKDB4NDIsMHgwRCwweDdGLChpbnB1dCYxKTw8Nyk7Cit9CisKKworc3RhdGljIGludCBwbXNfY2FwdHVyZShzdHJ1Y3QgcG1zX2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgcmdiNTU1LCBpbnQgY291bnQpCit7CisJaW50IHk7CisJaW50IGR3ID0gMipkZXYtPndpZHRoOworCisJY2hhciB0bXBbZHcrMzJdOyAvKiB1c2luZyBhIHRlbXAgYnVmZmVyIGlzIGZhc3RlciB0aGFuIGRpcmVjdCAgKi8KKwlpbnQgY250ID0gMDsKKwlpbnQgbGVuPTA7CisJdW5zaWduZWQgY2hhciByOCA9IDB4NTsgIC8qIHZhbHVlIGZvciByZWc4ICAqLworCisJaWYgKHJnYjU1NSkKKwkJcjggfD0gMHgyMDsgLyogZWxzZSB1c2UgdW50cmFuc2xhdGVkIHJnYiA9IDU2NSAqLworCW12dl93cml0ZSgweDA4LHI4KTsgLyogY2FwdHVyZSByZ2I1NTUvNTY1LCBpbml0IERSQU0sIFBDIGVuYWJsZSAqLworCisvKglwcmludGYoIiVkICVkICVkICVkICVkICV4ICV4XG4iLHdpZHRoLGhlaWdodCx2b2ZmLG5vbSxkZW4sbXZ2X2J1Zik7ICovCisgIAorCWZvciAoeSA9IDA7IHkgPCBkZXYtPmhlaWdodDsgeSsrICkgCisJeworCQl3cml0ZWIoMCwgbWVtKTsgIC8qIHN5bmNocm9uaXNpZXJ0IG5ldWUgWmVpbGUgKi8KKwkJCisJCS8qCisJCSAqCVRoaXMgaXMgaW4gdHJ1dGggYSBmaWZvLCBiZSB2ZXJ5IGNhcmVmdWwgYXMgaWYgeW91CisJCSAqCWZvcmdvdCB0aGlzIG9kZCB0aGluZ3Mgd2lsbCBvY2N1ciA4KQorCQkgKi8KKwkJIAorCQltZW1jcHlfZnJvbWlvKHRtcCwgbWVtLCBkdyszMik7IC8qIGRpc2NhcmQgMTYgd29yZCAgICovCisJCWNudCAtPSBkZXYtPmhlaWdodDsKKwkJd2hpbGUgKGNudCA8PSAwKSAKKwkJeyAKKwkJCS8qCisJCQkgKglEb24ndCBjb3B5IHRvbyBmYXIKKwkJCSAqLworCQkJaW50IGR0PWR3OworCQkJaWYoZHQrbGVuPmNvdW50KQorCQkJCWR0PWNvdW50LWxlbjsKKwkJCWNudCArPSBkZXYtPmhlaWdodDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB0bXArMzIsIGR0KSkKKwkJCQlyZXR1cm4gbGVuID8gbGVuIDogLUVGQVVMVDsKKwkJCWJ1ZiArPSBkdDsgICAgCisJCQlsZW4gKz0gZHQ7CisJCX0KKwl9CisJcmV0dXJuIGxlbjsKK30KKworCisvKgorICoJVmlkZW80bGludXggaW50ZXJmYWNpbmcKKyAqLworCitzdGF0aWMgaW50IHBtc19kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBwbXNfZGV2aWNlICpwZD0oc3RydWN0IHBtc19kZXZpY2UgKilkZXY7CisJCisJc3dpdGNoKGNtZCkKKwl7CisJCWNhc2UgVklESU9DR0NBUDoKKwkJeworCQkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmIgPSBhcmc7CisJCQlzdHJjcHkoYi0+bmFtZSwgIk1lZGlhdmlzaW9uIFBNUyIpOworCQkJYi0+dHlwZSA9IFZJRF9UWVBFX0NBUFRVUkV8VklEX1RZUEVfU0NBTEVTOworCQkJYi0+Y2hhbm5lbHMgPSA0OworCQkJYi0+YXVkaW9zID0gMDsKKwkJCWItPm1heHdpZHRoID0gNjQwOworCQkJYi0+bWF4aGVpZ2h0ID0gNDgwOworCQkJYi0+bWlud2lkdGggPSAxNjsKKwkJCWItPm1pbmhlaWdodCA9IDE2OworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHQ0hBTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisJCQlpZih2LT5jaGFubmVsPDAgfHwgdi0+Y2hhbm5lbD4zKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJdi0+ZmxhZ3M9MDsKKwkJCXYtPnR1bmVycz0xOworCQkJLyogR29vZCBxdWVzdGlvbi4uIGl0cyBjb21wb3NpdGUgb3IgU1ZIUyBzby4uICovCisJCQl2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCQlzd2l0Y2godi0+Y2hhbm5lbCkKKwkJCXsKKwkJCQljYXNlIDA6CisJCQkJCXN0cmNweSh2LT5uYW1lLCAiQ29tcG9zaXRlIik7YnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQlzdHJjcHkodi0+bmFtZSwgIlNWaWRlbyIpO2JyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJc3RyY3B5KHYtPm5hbWUsICJDb21wb3NpdGUoVkNSKSIpO2JyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJc3RyY3B5KHYtPm5hbWUsICJTVmlkZW8oVkNSKSIpO2JyZWFrOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NTQ0hBTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisJCQlpZih2LT5jaGFubmVsPDAgfHwgdi0+Y2hhbm5lbD4zKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZG93bigmcGQtPmxvY2spOworCQkJcG1zX3ZpZGVvc291cmNlKHYtPmNoYW5uZWwmMSk7CisJCQlwbXNfdmNyaW5wdXQodi0+Y2hhbm5lbD4+MSk7CisJCQl1cCgmcGQtPmxvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHVFVORVI6CisJCXsKKwkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKKwkJCWlmKHYtPnR1bmVyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc3RyY3B5KHYtPm5hbWUsICJGb3JtYXQiKTsKKwkJCXYtPnJhbmdlbG93PTA7CisJCQl2LT5yYW5nZWhpZ2g9MDsKKwkJCXYtPmZsYWdzPSBWSURFT19UVU5FUl9QQUx8VklERU9fVFVORVJfTlRTQ3xWSURFT19UVU5FUl9TRUNBTTsKKwkJCXN3aXRjaChzdGFuZGFyZCkKKwkJCXsKKwkJCQljYXNlIDA6CisJCQkJCXYtPm1vZGUgPSBWSURFT19NT0RFX0FVVE87CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMToKKwkJCQkJdi0+bW9kZSA9IFZJREVPX01PREVfTlRTQzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQl2LT5tb2RlID0gVklERU9fTU9ERV9QQUw7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJdi0+bW9kZSA9IFZJREVPX01PREVfU0VDQU07CisJCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NTVFVORVI6CisJCXsKKwkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKKwkJCWlmKHYtPnR1bmVyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZG93bigmcGQtPmxvY2spOworCQkJc3dpdGNoKHYtPm1vZGUpCisJCQl7CisJCQkJY2FzZSBWSURFT19NT0RFX0FVVE86CisJCQkJCXBtc19mcmFtZXJhdGUoMjUpOworCQkJCQlwbXNfc2VjYW1jcm9zcygwKTsKKwkJCQkJcG1zX2Zvcm1hdCgwKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBWSURFT19NT0RFX05UU0M6CisJCQkJCXBtc19mcmFtZXJhdGUoMzApOworCQkJCQlwbXNfc2VjYW1jcm9zcygwKTsKKwkJCQkJcG1zX2Zvcm1hdCgxKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJCQkJcG1zX2ZyYW1lcmF0ZSgyNSk7CisJCQkJCXBtc19zZWNhbWNyb3NzKDApOworCQkJCQlwbXNfZm9ybWF0KDIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFZJREVPX01PREVfU0VDQU06CisJCQkJCXBtc19mcmFtZXJhdGUoMjUpOworCQkJCQlwbXNfc2VjYW1jcm9zcygxKTsKKwkJCQkJcG1zX2Zvcm1hdCgyKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdXAoJnBkLT5sb2NrKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQl1cCgmcGQtPmxvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHUElDVDoKKwkJeworCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CisJCQkqcCA9IHBkLT5waWN0dXJlOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NTUElDVDoKKwkJeworCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CisJCQlpZighKChwLT5wYWxldHRlPT1WSURFT19QQUxFVFRFX1JHQjU2NSAmJiBwLT5kZXB0aD09MTYpCisJCQkgICAgfHwocC0+cGFsZXR0ZT09VklERU9fUEFMRVRURV9SR0I1NTUgJiYgcC0+ZGVwdGg9PTE1KSkpCisJCQkgICAgCXJldHVybiAtRUlOVkFMOworCQkJcGQtPnBpY3R1cmU9ICpwOworCQkJCisJCQkvKgorCQkJICoJTm93IGxvYWQgdGhlIGNhcmQuCisJCQkgKi8KKworCQkJZG93bigmcGQtPmxvY2spOworCQkJcG1zX2JyaWdodG5lc3MocC0+YnJpZ2h0bmVzcz4+OCk7CisJCQlwbXNfaHVlKHAtPmh1ZT4+OCk7CisJCQlwbXNfY29sb3VyKHAtPmNvbG91cj4+OCk7CisJCQlwbXNfY29udHJhc3QocC0+Y29udHJhc3Q+PjgpOwkKKwkJCXVwKCZwZC0+bG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ1NXSU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCQkJaWYodnctPmZsYWdzKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYodnctPmNsaXBjb3VudCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmKHZ3LT5oZWlnaHQ8MTZ8fHZ3LT5oZWlnaHQ+NDgwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYodnctPndpZHRoPDE2fHx2dy0+d2lkdGg+NjQwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcGQtPndpZHRoPXZ3LT53aWR0aDsKKwkJCXBkLT5oZWlnaHQ9dnctPmhlaWdodDsKKwkJCWRvd24oJnBkLT5sb2NrKTsKKwkJCXBtc19yZXNvbHV0aW9uKHBkLT53aWR0aCwgcGQtPmhlaWdodCk7CisJCQl1cCgmcGQtPmxvY2spOwkJCS8qIE9rIHdlIGZpZ3VyZWQgb3V0IHdoYXQgdG8gdXNlIGZyb20gb3VyIHdpZGUgY2hvaWNlICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ0dXSU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCQkJbWVtc2V0KHZ3LDAsc2l6ZW9mKCp2dykpOworCQkJdnctPndpZHRoPXBkLT53aWR0aDsKKwkJCXZ3LT5oZWlnaHQ9cGQtPmhlaWdodDsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DS0VZOgorCQkJcmV0dXJuIDA7CisJCWNhc2UgVklESU9DQ0FQVFVSRToKKwkJY2FzZSBWSURJT0NHRkJVRjoKKwkJY2FzZSBWSURJT0NTRkJVRjoKKwkJY2FzZSBWSURJT0NHRlJFUToKKwkJY2FzZSBWSURJT0NTRlJFUToKKwkJY2FzZSBWSURJT0NHQVVESU86CisJCWNhc2UgVklESU9DU0FVRElPOgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbXNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgcG1zX2RvX2lvY3RsKTsKK30KKworc3RhdGljIHNzaXplX3QgcG1zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcG1zX2RldmljZSAqcGQ9KHN0cnVjdCBwbXNfZGV2aWNlICopdjsKKwlpbnQgbGVuOworCQorCWRvd24oJnBkLT5sb2NrKTsKKwlsZW49cG1zX2NhcHR1cmUocGQsIGJ1ZiwgKHBkLT5waWN0dXJlLmRlcHRoPT0xNik/MDoxLGNvdW50KTsKKwl1cCgmcGQtPmxvY2spOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBtc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKKwkuaW9jdGwgICAgICAgICAgPSBwbXNfaW9jdGwsCisJLnJlYWQgICAgICAgICAgID0gcG1zX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgcG1zX3RlbXBsYXRlPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiTWVkaWF2aXNpb24gUE1TIiwKKwkudHlwZQkJPSBWSURfVFlQRV9DQVBUVVJFLAorCS5oYXJkd2FyZQk9IFZJRF9IQVJEV0FSRV9QTVMsCisJLmZvcHMgICAgICAgICAgID0gJnBtc19mb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbXNfZGV2aWNlIHBtc19kZXZpY2U7CisKKworLyoKKyAqCVByb2JlIGZvciBhbmQgaW5pdGlhbGlzZSB0aGUgTWVkaWF2aXNpb24gUE1TCisgKi8KKyAKK3N0YXRpYyBpbnQgaW5pdF9tZWRpYXZpc2lvbih2b2lkKQoreworCWludCBpZDsKKwlpbnQgaWRlYywgZGVjc3Q7CisJaW50IGk7CisJCQorCXVuc2lnbmVkIGNoYXIgaTJjX2RlZnNbXT17CisJCTB4NEMsMHgzMCwweDAwLDB4RTgsCisJCTB4QjYsMHhFMiwweDAwLDB4MDAsCisJCTB4RkYsMHhGRiwweDAwLDB4MDAsCisJCTB4MDAsMHgwMCwweDc4LDB4OTgsCisJCTB4MDAsMHgwMCwweDAwLDB4MDAsCisJCTB4MzQsMHgwQSwweEY0LDB4Q0UsCisJCTB4RTQKKwl9OworCisJbWVtID0gaW9yZW1hcChtZW1fYmFzZSwgMHg4MDApOworCWlmICghbWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKDB4OUEwMSwgMSwgIk1lZGlhdmlzaW9uIFBNUyBjb25maWciKSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZGlhdmlzaW9uOiB1bmFibGUgdG8gZGV0ZWN0OiAweDlBMDEgaW4gdXNlLlxuIik7CisJCWlvdW5tYXAobWVtKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCAzLCAiTWVkaWF2aXNpb24gUE1TIikpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWRpYXZpc2lvbjogSS9PIHBvcnQgJWQgaW4gdXNlLlxuIiwgaW9fcG9ydCk7CisJCXJlbGVhc2VfcmVnaW9uKDB4OUEwMSwgMSk7CisJCWlvdW5tYXAobWVtKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJb3V0YigweEI4LCAweDlBMDEpOwkJLyogVW5sb2NrICovCisJb3V0Yihpb19wb3J0Pj40LCAweDlBMDEpOwkvKiBTZXQgSU8gcG9ydCAqLworCQorCQorCWlkPW12dl9yZWFkKDMpOworCWRlY3N0PXBtc19pMmNfc3RhdCgweDQzKTsKKwkKKwlpZihkZWNzdCE9LTEpCisJCWlkZWM9MjsKKwllbHNlIGlmKHBtc19pMmNfc3RhdCgweGI5KSE9LTEpCisJCWlkZWM9MzsKKwllbHNlIGlmKHBtc19pMmNfc3RhdCgweDhiKSE9LTEpCisJCWlkZWM9MTsKKwllbHNlIAorCQlpZGVjPTA7CisKKwlwcmludGsoS0VSTl9JTkZPICJQTVMgdHlwZSBpcyAlZFxuIiwgaWRlYyk7CisJaWYoaWRlYyA9PSAwKSB7CisJCXJlbGVhc2VfcmVnaW9uKGlvX3BvcnQsIDMpOworCQlyZWxlYXNlX3JlZ2lvbigweDlBMDEsIDEpOworCQlpb3VubWFwKG1lbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCisJICoJT2sgd2UgaGF2ZSBhIFBNUyBvZiBzb21lIHNvcnQKKwkgKi8KKwkKKwltdnZfd3JpdGUoMHgwNCwgbWVtX2Jhc2U+PjEyKTsJLyogU2V0IHRoZSBtZW1vcnkgYXJlYSAqLworCQorCS8qIE9rIG5vdyBsb2FkIHRoZSBkZWZhdWx0cyAqLworCQorCWZvcihpPTA7aTwweDE5O2krKykKKwl7CisJCWlmKGkyY19kZWZzW2ldPT0weEZGKQorCQkJcG1zX2kyY19hbmRvcigweDhBLCBpLCAweDA3LDB4MDApOworCQllbHNlCisJCQlwbXNfaTJjX3dyaXRlKDB4OEEsIGksIGkyY19kZWZzW2ldKTsKKwl9CisJCisJcG1zX2kyY193cml0ZSgweEI4LDB4MDAsMHgxMik7CisJcG1zX2kyY193cml0ZSgweEI4LDB4MDQsMHgwMCk7CisJcG1zX2kyY193cml0ZSgweEI4LDB4MDcsMHgwMCk7CisJcG1zX2kyY193cml0ZSgweEI4LDB4MDgsMHgwMCk7CisJcG1zX2kyY193cml0ZSgweEI4LDB4MDksMHhGRik7CisJcG1zX2kyY193cml0ZSgweEI4LDB4MEEsMHgwMCk7CisJcG1zX2kyY193cml0ZSgweEI4LDB4MEIsMHgxMCk7CisJcG1zX2kyY193cml0ZSgweEI4LDB4MTAsMHgwMyk7CisJCisJbXZ2X3dyaXRlKDB4MDEsIDB4MDApOworCW12dl93cml0ZSgweDA1LCAweEEwKTsKKwltdnZfd3JpdGUoMHgwOCwgMHgyNSk7CisJbXZ2X3dyaXRlKDB4MDksIDB4MDApOworCW12dl93cml0ZSgweDBBLCAweDIwfE1WVk1FTU9SWVdJRFRIKTsJCisJCisJbXZ2X3dyaXRlKDB4MTAsIDB4MDIpOworCW12dl93cml0ZSgweDFFLCAweDBDKTsKKwltdnZfd3JpdGUoMHgxRiwgMHgwMyk7CisJbXZ2X3dyaXRlKDB4MjYsIDB4MDYpOworCQorCW12dl93cml0ZSgweDJCLCAweDAwKTsKKwltdnZfd3JpdGUoMHgyQywgMHgyMCk7CisJbXZ2X3dyaXRlKDB4MkQsIDB4MDApOworCW12dl93cml0ZSgweDJGLCAweDcwKTsKKwltdnZfd3JpdGUoMHgzMiwgMHgwMCk7CisJbXZ2X3dyaXRlKDB4MzMsIE1WVk1FTU9SWVdJRFRIKTsKKwltdnZfd3JpdGUoMHgzNCwgMHgwMCk7CisJbXZ2X3dyaXRlKDB4MzUsIDB4MDApOworCW12dl93cml0ZSgweDNBLCAweDgwKTsKKwltdnZfd3JpdGUoMHgzQiwgMHgxMCk7CisJbXZ2X3dyaXRlKDB4MjAsIDB4MDApOworCW12dl93cml0ZSgweDIxLCAweDAwKTsKKwltdnZfd3JpdGUoMHgzMCwgMHgyMik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglJbml0aWFsaXphdGlvbiBhbmQgbW9kdWxlIHN0dWZmCisgKi8KKyAKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcG1zX2NhcmRzKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWVkaWF2aXNpb24gUHJvIE1vdmllIFN0dWRpbyBkcml2ZXIgMC4wMlxuIik7CisJCisJZGF0YV9wb3J0ID0gaW9fcG9ydCArMTsKKwkKKwlpZihpbml0X21lZGlhdmlzaW9uKCkpCisJeworCQlwcmludGsoS0VSTl9JTkZPICJCb2FyZCBub3QgZm91bmQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW1lbWNweSgmcG1zX2RldmljZSwgJnBtc190ZW1wbGF0ZSwgc2l6ZW9mKHBtc190ZW1wbGF0ZSkpOworCWluaXRfTVVURVgoJnBtc19kZXZpY2UubG9jayk7CisJcG1zX2RldmljZS5oZWlnaHQ9MjQwOworCXBtc19kZXZpY2Uud2lkdGg9MzIwOworCXBtc19zd3NlbnNlKDc1KTsKKwlwbXNfcmVzb2x1dGlvbigzMjAsMjQwKTsKKwlyZXR1cm4gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopJnBtc19kZXZpY2UsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKTsKK30KKworbW9kdWxlX3BhcmFtKGlvX3BvcnQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWVtX2Jhc2UsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworc3RhdGljIHZvaWQgX19leGl0IHNodXRkb3duX21lZGlhdmlzaW9uKHZvaWQpCit7CisJcmVsZWFzZV9yZWdpb24oaW9fcG9ydCwzKTsKKwlyZWxlYXNlX3JlZ2lvbigweDlBMDEsIDEpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9wbXNfbW9kdWxlKHZvaWQpCit7CisJc2h1dGRvd25fbWVkaWF2aXNpb24oKTsKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgoc3RydWN0IHZpZGVvX2RldmljZSAqKSZwbXNfZGV2aWNlKTsKKwlpb3VubWFwKG1lbSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcG1zX2NhcmRzKTsKK21vZHVsZV9leGl0KGNsZWFudXBfcG1zX21vZHVsZSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTY5ZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ2YS5jCkBAIC0wLDAgKzEsODQzIEBACisvKgorICogRHJpdmVyIGZvciB0aGUgU0FBNTI0NkEgb3IgU0FBNTI4MSBUZWxldGV4dCAoPVZpZGVvdGV4dCkgZGVjb2RlciBjaGlwcyBmcm9tCisgKiBQaGlsaXBzLgorICoKKyAqIE9ubHkgY2FwdHVyaW5nIG9mIFRlbGV0ZXh0IHBhZ2VzIGlzIHRlc3RlZC4gVGhlIHZpZGVvdGV4dCBjaGlwcyBhbHNvIGhhdmUgYQorICogVFYgb3V0cHV0IGJ1dCBteSBoYXJkd2FyZSBkb2Vzbid0IHVzZSBpdC4gRm9yIHRoaXMgcmVhc29uIHRoaXMgZHJpdmVyIGRvZXMKKyAqIG5vdCBzdXBwb3J0IGNoYW5naW5nIGFueSBUViBkaXNwbGF5IHNldHRpbmdzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBNaWNoYWVsIEdlbmcgPGxpbnV4QE1pY2hhZWxHZW5nLmRlPgorICoKKyAqIERlcml2ZWQgZnJvbQorICoKKyAqIHNhYTUyNDkgZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggUmljaGFyZCBHdWVudGhlcgorICogPHJpY2hhcmQuZ3VlbnRoZXJAc3R1ZGVudC51bmktdHVlYmluZ2VuLmRlPgorICoKKyAqIHdpdGggY2hhbmdlcyBieQorICogQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqCisgKiBhbmQKKyAqCisgKiB2dHguYworICogQ29weXJpZ2h0IChDKSAxOTk0LTk3IE1hcnRpbiBCdWNrICA8bWFydGluLTIuYnVja0BzdHVkZW50LnVuaS11bG0uZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW90ZXh0Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlICJzYWE1MjQ2YS5oIgorCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEdlbmcgPGxpbnV4QE1pY2hhZWxHZW5nLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQaGlsaXBzIFNBQTUyNDZBLCBTQUE1MjgxIFRlbGV0ZXh0IGRlY29kZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBzYWE1MjQ2YV9kZXZpY2UKK3sKKwl1OCAgICAgcGdidWZbTlVNX0RBVVNdW1ZUWF9WSVJUVUFMU0laRV07CisJaW50ICAgIGlzX3NlYXJjaGluZ1tOVU1fREFVU107CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzYWFfdGVtcGxhdGU7CS8qIERlY2xhcmVkIG5lYXIgYm90dG9tICovCisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdCSA9IHsgSTJDX0FERFJFU1MsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY19yYW5nZVtdID0geyBJMkNfQ0xJRU5UX0VORCB9OworSTJDX0NMSUVOVF9JTlNNT0Q7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CisKK3N0YXRpYyBpbnQgc2FhNTI0NmFfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQoreworCWludCBwZ2J1ZjsKKwlpbnQgZXJyOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmQ7CisJc3RydWN0IHNhYTUyNDZhX2RldmljZSAqdDsKKworCXByaW50ayhLRVJOX0lORk8gInNhYTUyNDZhOiB0ZWxldGV4dCBjaGlwIGZvdW5kLlxuIik7CisJY2xpZW50PWttYWxsb2Moc2l6ZW9mKCpjbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZihjbGllbnQ9PU5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKKwljbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7CisJbWVtY3B5KGNsaWVudCwgJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKCpjbGllbnQpKTsKKwl0ID0ga21hbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKKwlpZih0PT1OVUxMKQorCXsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKKwlzdHJsY3B5KGNsaWVudC0+bmFtZSwgSUZfTkFNRSwgSTJDX05BTUVfU0laRSk7CisJaW5pdF9NVVRFWCgmdC0+bG9jayk7CisKKwkvKgorCSAqCU5vdyBjcmVhdGUgYSB2aWRlbzRsaW51eCBkZXZpY2UKKwkgKi8KKworCXZkID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYodmQ9PU5VTEwpCisJeworCQlrZnJlZSh0KTsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHZkKTsKKwltZW1jcHkodmQsICZzYWFfdGVtcGxhdGUsIHNpemVvZigqdmQpKTsKKworCWZvciAocGdidWYgPSAwOyBwZ2J1ZiA8IE5VTV9EQVVTOyBwZ2J1ZisrKQorCXsKKwkJbWVtc2V0KHQtPnBnYnVmW3BnYnVmXSwgJyAnLCBzaXplb2YodC0+cGdidWZbMF0pKTsKKwkJdC0+aXNfc2VhcmNoaW5nW3BnYnVmXSA9IEZBTFNFOworCX0KKwl2ZC0+cHJpdj10OworCisKKwkvKgorCSAqCVJlZ2lzdGVyIGl0CisJICovCisKKwlpZigoZXJyPXZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZCwgVkZMX1RZUEVfVlRYLC0xKSk8MCkKKwl7CisJCWtmcmVlKHQpOworCQlrZnJlZShjbGllbnQpOworCQl2aWRlb19kZXZpY2VfcmVsZWFzZSh2ZCk7CisJCXJldHVybiBlcnI7CisJfQorCXQtPmNsaWVudCA9IGNsaWVudDsKKwlpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCXJldHVybiAwOworfQorCisvKgorICoJV2UgZG8gbW9zdCBvZiB0aGUgaGFyZCB3b3JrIHdoZW4gd2UgYmVjb21lIGEgZGV2aWNlIG9uIHRoZSBpMmMuCisgKi8KK3N0YXRpYyBpbnQgc2FhNTI0NmFfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCisJCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgc2FhNTI0NmFfYXR0YWNoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWE1MjQ2YV9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UodmQpOworCWtmcmVlKHZkLT5wcml2KTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTUyNDZhX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmRldmljZSwgdW5zaWduZWQgaW50IGNtZCwKKwl2b2lkICphcmcpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKglJMkMgaW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX3ZpZGVvdGV4dCA9Cit7CisJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKKwkubmFtZSAJCT0gSUZfTkFNRSwJCS8qIG5hbWUgKi8KKwkuaWQgCQk9IEkyQ19EUklWRVJJRF9TQUE1MjQ5LCAvKiBpbiBpMmMuaCAqLworCS5mbGFncyAJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBzYWE1MjQ2YV9wcm9iZSwKKwkuZGV0YWNoX2NsaWVudCAgPSBzYWE1MjQ2YV9kZXRhY2gsCisJLmNvbW1hbmQgCT0gc2FhNTI0NmFfY29tbWFuZAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKKwkuZHJpdmVyCQk9ICZpMmNfZHJpdmVyX3ZpZGVvdGV4dCwKKwkubmFtZQkJPSAiKHVuc2V0KSIsCit9OworCitzdGF0aWMgaW50IGkyY19zZW5kYnVmKHN0cnVjdCBzYWE1MjQ2YV9kZXZpY2UgKnQsIGludCByZWcsIGludCBjb3VudCwgdTggKmRhdGEpCit7CisJY2hhciBidWZbNjRdOworCisJYnVmWzBdID0gcmVnOworCW1lbWNweShidWYrMSwgZGF0YSwgY291bnQpOworCisJaWYoaTJjX21hc3Rlcl9zZW5kKHQtPmNsaWVudCwgYnVmLCBjb3VudCsxKT09Y291bnQrMSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGkyY19zZW5kZGF0YShzdHJ1Y3Qgc2FhNTI0NmFfZGV2aWNlICp0LCAuLi4pCit7CisJdW5zaWduZWQgY2hhciBidWZbNjRdOworCWludCB2OworCWludCBjdD0wOworCXZhX2xpc3QgYXJncDsKKwl2YV9zdGFydChhcmdwLHQpOworCisJd2hpbGUoKHY9dmFfYXJnKGFyZ3AsaW50KSkhPS0xKQorCQlidWZbY3QrK109djsKKwlyZXR1cm4gaTJjX3NlbmRidWYodCwgYnVmWzBdLCBjdC0xLCBidWYrMSk7Cit9CisKKy8qIEdldCBjb3VudCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBJskMtZGV2aWNlIGF0IGFkZHJlc3MgYWRyLCBzdG9yZSB0aGVtIGluIGJ1Zi4KKyAqIFN0YXJ0ICYgc3RvcCBoYW5kc2hha2luZyBpcyBkb25lIGJ5IHRoaXMgcm91dGluZSwgYWNrIHdpbGwgYmUgc2VudCBhZnRlciB0aGUKKyAqIGxhc3QgYnl0ZSB0byBpbmhpYml0IGZ1cnRoZXIgc2VuZGluZyBvZiBkYXRhLiBJZiB1YWNjZXNzIGlzIFRSVUUsIGRhdGEgaXMKKyAqIHdyaXR0ZW4gdG8gdXNlci1zcGFjZSB3aXRoIHB1dF91c2VyLiBSZXR1cm5zIC0xIGlmIEmyQy1kZXZpY2UgZGlkbid0IHNlbmQKKyAqIGFja25vd2xlZGdlLCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGkyY19nZXRkYXRhKHN0cnVjdCBzYWE1MjQ2YV9kZXZpY2UgKnQsIGludCBjb3VudCwgdTggKmJ1ZikKK3sKKwlpZihpMmNfbWFzdGVyX3JlY3YodC0+Y2xpZW50LCBidWYsIGNvdW50KSE9Y291bnQpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworLyogV2hlbiBhIHBhZ2UgaXMgZm91bmQgdGhlbiB0aGUgbm90IEZPVU5EIGJpdCBpbiBvbmUgb2YgdGhlIHN0YXR1cyByZWdpc3RlcnMKKyAqIG9mIHRoZSBTQUE1MjY0QSBjaGlwIGlzIGNsZWFyZWQuIFVuZm9ydHVuYXRlbHkgdGhpcyBiaXQgaXMgbm90IHNldAorICogYXV0b21hdGljYWxseSB3aGVuIGEgbmV3IHBhZ2UgaXMgcmVxdWVzdGVkLiBJbnN0ZWFkIHRoaXMgZnVuY3Rpb24gbXVzdCBiZQorICogY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgKgorICogUmV0dXJuIHZhbHVlOiAwIGlmIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGludCBzYWE1MjQ2YV9jbGVhcl9mb3VuZF9iaXQoc3RydWN0IHNhYTUyNDZhX2RldmljZSAqdCwKKwl1bnNpZ25lZCBjaGFyIGRhdV9ubykKK3sKKwl1bnNpZ25lZCBjaGFyIHJvd18yNV9jb2x1bW5fODsKKworCWlmIChpMmNfc2VuZGRhdGEodCwgU0FBNTI0NkFfUkVHSVNURVJfUjgsCisKKwkJZGF1X25vIHwKKwkJUjhfRE9fTk9UX0NMRUFSX01FTU9SWSwKKworCQlSOV9DVVJTRVJfUk9XXzI1LAorCisJCVIxMF9DVVJTRVJfQ09MVU1OXzgsCisKKwkJQ09NTUFORF9FTkQpIHx8CisJCWkyY19nZXRkYXRhKHQsIDEsICZyb3dfMjVfY29sdW1uXzgpKQorCXsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJvd18yNV9jb2x1bW5fOCB8PSBST1cyNV9DT0xVTU44X1BBR0VfTk9UX0ZPVU5EOworCWlmIChpMmNfc2VuZGRhdGEodCwgU0FBNTI0NkFfUkVHSVNURVJfUjgsCisKKwkJZGF1X25vIHwKKwkJUjhfRE9fTk9UX0NMRUFSX01FTU9SWSwKKworCQlSOV9DVVJTRVJfUk9XXzI1LAorCisJCVIxMF9DVVJTRVJfQ09MVU1OXzgsCisKKwkJcm93XzI1X2NvbHVtbl84LAorCisJCUNPTU1BTkRfRU5EKSkKKwl7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKiBSZXF1ZXN0cyBvbmUgdmlkZW90ZXh0IHBhZ2UgYXMgZGVzY3JpYmVkIGluIHJlcS4gVGhlIGZpZWxkcyBvZiByZXEgYXJlCisgKiBjaGVja2VkIGFuZCBhbiBlcnJvciBpcyByZXR1cm5lZCBpZiBzb21ldGhpbmcgaXMgaW52YWxpZC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IDAgaWYgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW50IHNhYTUyNDZhX3JlcXVlc3RfcGFnZShzdHJ1Y3Qgc2FhNTI0NmFfZGV2aWNlICp0LAorICAgIHZ0eF9wYWdlcmVxX3QgKnJlcSkKK3sKKwlpZiAocmVxLT5wYWdlbWFzayA8IDAgfHwgcmVxLT5wYWdlbWFzayA+PSBQR01BU0tfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmVxLT5wYWdlbWFzayAmIFBHTUFTS19QQUdFKQorCQlpZiAocmVxLT5wYWdlIDwgMCB8fCByZXEtPnBhZ2UgPiBQQUdFX01BWCkKKwkJCXJldHVybiAtRUlOVkFMOworCWlmIChyZXEtPnBhZ2VtYXNrICYgUEdNQVNLX0hPVVIpCisJCWlmIChyZXEtPmhvdXIgPCAwIHx8IHJlcS0+aG91ciA+IEhPVVJfTUFYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfTUlOVVRFKQorCQlpZiAocmVxLT5taW51dGUgPCAwIHx8IHJlcS0+bWludXRlID4gTUlOVVRFX01BWCkKKwkJCXJldHVybiAtRUlOVkFMOworCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpMmNfc2VuZGRhdGEodCwgU0FBNTI0NkFfUkVHSVNURVJfUjIsCisKKwkJUjJfSU5fUjNfU0VMRUNUX1BBR0VfSFVORFJFRFMgfAorCQlyZXEtPnBnYnVmIDw8IDQgfAorCQlSMl9CQU5LXzAgfAorCQlSMl9IQU1NSU5HX0NIRUNLX09GRiwKKworCQlIVU5EUkVEU19PRl9QQUdFKHJlcS0+cGFnZSkgfAorCQlSM19IT0xEX1BBR0UgfAorCQkocmVxLT5wYWdlbWFzayAmIFBHX0hVTkQgPworCQkJUjNfUEFHRV9IVU5EUkVEU19ET19DQVJFIDoKKwkJCVIzX1BBR0VfSFVORFJFRFNfRE9fTk9UX0NBUkUpLAorCisJCVRFTlNfT0ZfUEFHRShyZXEtPnBhZ2UpIHwKKwkJKHJlcS0+cGFnZW1hc2sgJiBQR19URU4gPworCQkJUjNfUEFHRV9URU5TX0RPX0NBUkUgOgorCQkJUjNfUEFHRV9URU5TX0RPX05PVF9DQVJFKSwKKworCQlVTklUU19PRl9QQUdFKHJlcS0+cGFnZSkgfAorCQkocmVxLT5wYWdlbWFzayAmIFBHX1VOSVQgPworCQkJUjNfUEFHRV9VTklUU19ET19DQVJFIDoKKwkJCVIzX1BBR0VfVU5JVFNfRE9fTk9UX0NBUkUpLAorCisJCVRFTlNfT0ZfSE9VUihyZXEtPmhvdXIpIHwKKwkJKHJlcS0+cGFnZW1hc2sgJiBIUl9URU4gPworCQkJUjNfSE9VUlNfVEVOU19ET19DQVJFIDoKKwkJCVIzX0hPVVJTX1RFTlNfRE9fTk9UX0NBUkUpLAorCisJCVVOSVRTX09GX0hPVVIocmVxLT5ob3VyKSB8CisJCShyZXEtPnBhZ2VtYXNrICYgSFJfVU5JVCA/CisJCQlSM19IT1VSU19VTklUU19ET19DQVJFIDoKKwkJCVIzX0hPVVJTX1VOSVRTX0RPX05PVF9DQVJFKSwKKworCQlURU5TX09GX01JTlVURShyZXEtPm1pbnV0ZSkgfAorCQkocmVxLT5wYWdlbWFzayAmIE1JTl9URU4gPworCQkJUjNfTUlOVVRFU19URU5TX0RPX0NBUkUgOgorCQkJUjNfTUlOVVRFU19URU5TX0RPX05PVF9DQVJFKSwKKworCQlVTklUU19PRl9NSU5VVEUocmVxLT5taW51dGUpIHwKKwkJKHJlcS0+cGFnZW1hc2sgJiBNSU5fVU5JVCA/CisJCQlSM19NSU5VVEVTX1VOSVRTX0RPX0NBUkUgOgorCQkJUjNfTUlOVVRFU19VTklUU19ET19OT1RfQ0FSRSksCisKKwkJQ09NTUFORF9FTkQpIHx8IGkyY19zZW5kZGF0YSh0LCBTQUE1MjQ2QV9SRUdJU1RFUl9SMiwKKworCQlSMl9JTl9SM19TRUxFQ1RfUEFHRV9IVU5EUkVEUyB8CisJCXJlcS0+cGdidWYgPDwgNCB8CisJCVIyX0JBTktfMCB8CisJCVIyX0hBTU1JTkdfQ0hFQ0tfT0ZGLAorCisJCUhVTkRSRURTX09GX1BBR0UocmVxLT5wYWdlKSB8CisJCVIzX1VQREFURV9QQUdFIHwKKwkJKHJlcS0+cGFnZW1hc2sgJiBQR19IVU5EID8KKwkJCVIzX1BBR0VfSFVORFJFRFNfRE9fQ0FSRSA6CisJCQlSM19QQUdFX0hVTkRSRURTX0RPX05PVF9DQVJFKSwKKworCQlDT01NQU5EX0VORCkpCisJeworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0gPSBUUlVFOworCXJldHVybiAwOworfQorCisvKiBUaGlzIHJvdXRpbmUgZGVjb2RlcyB0aGUgcGFnZSBudW1iZXIgZnJvbSB0aGUgaW5mb2JpdHMgY29udGFpbmVkIGluIGxpbmUgMjUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIGluZm9iaXRzOiBtdXN0IGJlIGJpdHMgMCB0byA5IG9mIGNvbHVtbiAyNQorICoKKyAqIFJldHVybiB2YWx1ZTogcGFnZSBudW1iZXIgY29kZWQgaW4gaGV4YWRlY2ltYWwsIGkuIGUuIHBhZ2UgMTIzIGlzIGNvZGVkIDB4MTIzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNhYTUyNDZhX2V4dHJhY3RfcGFnZW51bV9mcm9tX2luZm9iaXRzKAorICAgIHVuc2lnbmVkIGNoYXIgaW5mb2JpdHNbMTBdKQoreworCWludCBwYWdlX2h1bmRyZWRzLCBwYWdlX3RlbnMsIHBhZ2VfdW5pdHM7CisKKwlwYWdlX3VuaXRzICAgID0gaW5mb2JpdHNbMF0gJiBST1cyNV9DT0xVTU4wX1BBR0VfVU5JVFM7CisJcGFnZV90ZW5zICAgICA9IGluZm9iaXRzWzFdICYgUk9XMjVfQ09MVU1OMV9QQUdFX1RFTlM7CisJcGFnZV9odW5kcmVkcyA9IGluZm9iaXRzWzhdICYgUk9XMjVfQ09MVU1OOF9QQUdFX0hVTkRSRURTOworCisJLyogcGFnZSAweC4uIG1lYW5zIHBhZ2UgOC4uICovCisJaWYgKHBhZ2VfaHVuZHJlZHMgPT0gMCkKKwkJcGFnZV9odW5kcmVkcyA9IDg7CisKKwlyZXR1cm4oKHBhZ2VfaHVuZHJlZHMgPDwgOCkgfCAocGFnZV90ZW5zIDw8IDQpIHwgcGFnZV91bml0cyk7Cit9CisKKy8qIERlY29kZXMgdGhlIGhvdXIgZnJvbSB0aGUgaW5mb2JpdHMgY29udGFpbmVkIGluIGxpbmUgMjUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIGluZm9iaXRzOiBtdXN0IGJlIGJpdHMgMCB0byA5IG9mIGNvbHVtbiAyNQorICoKKyAqIFJldHVybjogaG91ciBjb2RlZCBpbiBoZXhhZGVjaW1hbCwgaS4gZS4gMTJoIGlzIGNvZGVkIDB4MTIKKyAqLworc3RhdGljIGlubGluZSBpbnQgc2FhNTI0NmFfZXh0cmFjdF9ob3VyX2Zyb21faW5mb2JpdHMoCisgICAgdW5zaWduZWQgY2hhciBpbmZvYml0c1sxMF0pCit7CisJaW50IGhvdXJfdGVucywgaG91cl91bml0czsKKworCWhvdXJfdW5pdHMgPSBpbmZvYml0c1s0XSAmIFJPVzI1X0NPTFVNTjRfSE9VUl9VTklUUzsKKwlob3VyX3RlbnMgID0gaW5mb2JpdHNbNV0gJiBST1cyNV9DT0xVTU41X0hPVVJfVEVOUzsKKworCXJldHVybigoaG91cl90ZW5zIDw8IDQpIHwgaG91cl91bml0cyk7Cit9CisKKy8qIERlY29kZXMgdGhlIG1pbnV0ZXMgZnJvbSB0aGUgaW5mb2JpdHMgY29udGFpbmVkIGluIGxpbmUgMjUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIGluZm9iaXRzOiBtdXN0IGJlIGJpdHMgMCB0byA5IG9mIGNvbHVtbiAyNQorICoKKyAqIFJldHVybjogbWludXRlcyBjb2RlZCBpbiBoZXhhZGVjaW1hbCwgaS4gZS4gMTBtaW4gaXMgY29kZWQgMHgxMAorICovCitzdGF0aWMgaW5saW5lIGludCBzYWE1MjQ2YV9leHRyYWN0X21pbnV0ZXNfZnJvbV9pbmZvYml0cygKKyAgICB1bnNpZ25lZCBjaGFyIGluZm9iaXRzWzEwXSkKK3sKKwlpbnQgbWludXRlc190ZW5zLCBtaW51dGVzX3VuaXRzOworCisJbWludXRlc191bml0cyA9IGluZm9iaXRzWzJdICYgUk9XMjVfQ09MVU1OMl9NSU5VVEVTX1VOSVRTOworCW1pbnV0ZXNfdGVucyAgPSBpbmZvYml0c1szXSAmIFJPVzI1X0NPTFVNTjNfTUlOVVRFU19URU5TOworCisJcmV0dXJuKChtaW51dGVzX3RlbnMgPDwgNCkgfCBtaW51dGVzX3VuaXRzKTsKK30KKworLyogUmVhZHMgdGhlIHN0YXR1cyBiaXRzIGNvbnRhaW5lZCBpbiB0aGUgZmlyc3QgMTAgY29sdW1ucyBvZiB0aGUgZmlyc3QgbGluZQorICogYW5kIGV4dHJhY3RzIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGluZm8uCisgKgorICogUmV0dXJuIHZhbHVlOiAwIGlmIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBpbnQgc2FhNTI0NmFfZ2V0X3N0YXR1cyhzdHJ1Y3Qgc2FhNTI0NmFfZGV2aWNlICp0LAorICAgIHZ0eF9wYWdlaW5mb190ICppbmZvLCB1bnNpZ25lZCBjaGFyIGRhdV9ubykKK3sKKwl1bnNpZ25lZCBjaGFyIGluZm9iaXRzWzEwXTsKKwlpbnQgY29sdW1uOworCisJaWYgKGRhdV9ubyA+PSBOVU1fREFVUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaTJjX3NlbmRkYXRhKHQsIFNBQTUyNDZBX1JFR0lTVEVSX1I4LAorCisJCWRhdV9ubyB8CisJCVI4X0RPX05PVF9DTEVBUl9NRU1PUlksCisKKwkJUjlfQ1VSU0VSX1JPV18yNSwKKworCQlSMTBfQ1VSU0VSX0NPTFVNTl8wLAorCisJCUNPTU1BTkRfRU5EKSB8fAorCQlpMmNfZ2V0ZGF0YSh0LCAxMCwgaW5mb2JpdHMpKQorCXsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaW5mby0+cGFnZW51bSA9IHNhYTUyNDZhX2V4dHJhY3RfcGFnZW51bV9mcm9tX2luZm9iaXRzKGluZm9iaXRzKTsKKwlpbmZvLT5ob3VyICAgID0gc2FhNTI0NmFfZXh0cmFjdF9ob3VyX2Zyb21faW5mb2JpdHMoaW5mb2JpdHMpOworCWluZm8tPm1pbnV0ZSAgPSBzYWE1MjQ2YV9leHRyYWN0X21pbnV0ZXNfZnJvbV9pbmZvYml0cyhpbmZvYml0cyk7CisJaW5mby0+Y2hhcnNldCA9ICgoaW5mb2JpdHNbN10gJiBST1cyNV9DT0xVTU43X0NIQVJBQ1RFUl9TRVQpID4+IDEpOworCWluZm8tPmRlbGV0ZSA9ICEhKGluZm9iaXRzWzNdICYgUk9XMjVfQ09MVU1OM19ERUxFVEVfUEFHRSk7CisJaW5mby0+aGVhZGxpbmUgPSAhIShpbmZvYml0c1s1XSAmIFJPVzI1X0NPTFVNTjVfSU5TRVJUX0hFQURMSU5FKTsKKwlpbmZvLT5zdWJ0aXRsZSA9ICEhKGluZm9iaXRzWzVdICYgUk9XMjVfQ09MVU1ONV9JTlNFUlRfU1VCVElUTEUpOworCWluZm8tPnN1cHBfaGVhZGVyID0gISEoaW5mb2JpdHNbNl0gJiBST1cyNV9DT0xVTU42X1NVUFBSRVNTX0hFQURFUik7CisJaW5mby0+dXBkYXRlID0gISEoaW5mb2JpdHNbNl0gJiBST1cyNV9DT0xVTU42X1VQREFURV9QQUdFKTsKKwlpbmZvLT5pbnRlcl9zZXEgPSAhIShpbmZvYml0c1s2XSAmIFJPVzI1X0NPTFVNTjZfSU5URVJSVVBURURfU0VRVUVOQ0UpOworCWluZm8tPmRpc19kaXNwID0gISEoaW5mb2JpdHNbNl0gJiBST1cyNV9DT0xVTU42X1NVUFBSRVNTX0RJU1BMQVkpOworCWluZm8tPnNlcmlhbCA9ICEhKGluZm9iaXRzWzddICYgUk9XMjVfQ09MVU1ON19TRVJJQUxfTU9ERSk7CisJaW5mby0+bm90Zm91bmQgPSAhIShpbmZvYml0c1s4XSAmIFJPVzI1X0NPTFVNTjhfUEFHRV9OT1RfRk9VTkQpOworCWluZm8tPnBibGYgPSAhIShpbmZvYml0c1s5XSAmIFJPVzI1X0NPTFVNTjlfUEFHRV9CRUlOR19MT09LRURfRk9SKTsKKwlpbmZvLT5oYW1taW5nID0gMDsKKwlmb3IgKGNvbHVtbiA9IDA7IGNvbHVtbiA8PSA3OyBjb2x1bW4rKykgeworCQlpZiAoaW5mb2JpdHNbY29sdW1uXSAmIFJPVzI1X0NPTFVNTjBfVE9fN19IQU1NSU5HX0VSUk9SKSB7CisJCQlpbmZvLT5oYW1taW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghaW5mby0+aGFtbWluZyAmJiAhaW5mby0+bm90Zm91bmQpCisJCXQtPmlzX3NlYXJjaGluZ1tkYXVfbm9dID0gRkFMU0U7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlYWRzIDEgdmlkZW90ZXh0IHBhZ2UgYnVmZmVyIG9mIHRoZSBTQUE1MjQ2QS4KKyAqCisgKiByZXEgaXMgdXNlZCBib3RoIGFzIGlucHV0IGFuZCBhcyBvdXRwdXQuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIHdoaWNoIHBhcnQKKyAqIG11c3QgYmUgcmVhZC4gVGhlIHZpZGVvdGV4dCBwYWdlIGlzIGNvcGllZCBpbnRvIHJlcS0+YnVmZmVyLgorICoKKyAqIFJldHVybiB2YWx1ZTogMCBpZiBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNhYTUyNDZhX2dldF9wYWdlKHN0cnVjdCBzYWE1MjQ2YV9kZXZpY2UgKnQsCisJdnR4X3BhZ2VyZXFfdCAqcmVxKQoreworCWludCBzdGFydCwgZW5kLCBzaXplOworCWNoYXIgKmJ1ZjsKKwlpbnQgZXJyOworCisJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMgfHwKKwkgICAgcmVxLT5zdGFydCA8IDAgfHwgcmVxLT5zdGFydCA+IHJlcS0+ZW5kIHx8IHJlcS0+ZW5kID49IFZUWF9QQUdFU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWYgPSBrbWFsbG9jKFZUWF9QQUdFU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUmVhZCAibm9ybWFsIiBwYXJ0IG9mIHBhZ2UgKi8KKwllcnIgPSAtRUlPOworCisJZW5kID0gbWluKHJlcS0+ZW5kLCBWVFhfUEFHRVNJWkUgLSAxKTsKKwlpZiAoaTJjX3NlbmRkYXRhKHQsIFNBQTUyNDZBX1JFR0lTVEVSX1I4LAorCQkJcmVxLT5wZ2J1ZiB8IFI4X0RPX05PVF9DTEVBUl9NRU1PUlksCisJCQlST1cocmVxLT5zdGFydCksIENPTFVNTihyZXEtPnN0YXJ0KSwgQ09NTUFORF9FTkQpKQorCQlnb3RvIG91dDsKKwlpZiAoaTJjX2dldGRhdGEodCwgZW5kIC0gcmVxLT5zdGFydCArIDEsIGJ1ZikpCisJCWdvdG8gb3V0OworCWVyciA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciwgYnVmLCBlbmQgLSByZXEtPnN0YXJ0ICsgMSkpCisJCWdvdG8gb3V0OworCisJLyogQWx3YXlzIGdldCB0aGUgdGltZSBmcm9tIGJ1ZmZlciA0LCBzaW5jZSB0aGlzIHN0dXBpZCBTQUE1MjQ2QSBvbmx5CisJICogdXBkYXRlcyB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBidWZmZXIuLi4KKwkgKi8KKwlpZiAoUkVRX0NPTlRBSU5TX1RJTUUocmVxKSkgeworCQlzdGFydCA9IG1heChyZXEtPnN0YXJ0LCBQT1NfVElNRV9TVEFSVCk7CisJCWVuZCAgID0gbWluKHJlcS0+ZW5kLCAgIFBPU19USU1FX0VORCk7CisJCXNpemUgPSBlbmQgLSBzdGFydCArIDE7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChzaXplIDwgMCkKKwkJCWdvdG8gb3V0OworCQllcnIgPSAtRUlPOworCQlpZiAoaTJjX3NlbmRkYXRhKHQsIFNBQTUyNDZBX1JFR0lTVEVSX1I4LAorCQkJCVI4X0FDVElWRV9DSEFQVEVSXzQgfCBSOF9ET19OT1RfQ0xFQVJfTUVNT1JZLAorCQkJCVI5X0NVUlNFUl9ST1dfMCwgc3RhcnQsIENPTU1BTkRfRU5EKSkKKwkJCWdvdG8gb3V0OworCQlpZiAoaTJjX2dldGRhdGEodCwgc2l6ZSwgYnVmKSkKKwkJCWdvdG8gb3V0OworCQllcnIgPSAtRUZBVUxUOworCQlpZiAoY29weV90b191c2VyKHJlcS0+YnVmZmVyICsgc3RhcnQgLSByZXEtPnN0YXJ0LCBidWYsIHNpemUpKQorCQkJZ290byBvdXQ7CisJfQorCS8qIEluc2VydCB0aGUgaGVhZGVyIGZyb20gYnVmZmVyIDQgb25seSwgaWYgYWNxdWlzaXRpb24gY2lyY3VpdCBpcyBzdGlsbCBzZWFyY2hpbmcgZm9yIGEgcGFnZSAqLworCWlmIChSRVFfQ09OVEFJTlNfSEVBREVSKHJlcSkgJiYgdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdKSB7CisJCXN0YXJ0ID0gbWF4KHJlcS0+c3RhcnQsIFBPU19IRUFERVJfU1RBUlQpOworCQllbmQgICA9IG1pbihyZXEtPmVuZCwgICBQT1NfSEVBREVSX0VORCk7CisJCXNpemUgPSBlbmQgLSBzdGFydCArIDE7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChzaXplIDwgMCkKKwkJCWdvdG8gb3V0OworCQllcnIgPSAtRUlPOworCQlpZiAoaTJjX3NlbmRkYXRhKHQsIFNBQTUyNDZBX1JFR0lTVEVSX1I4LAorCQkJCVI4X0FDVElWRV9DSEFQVEVSXzQgfCBSOF9ET19OT1RfQ0xFQVJfTUVNT1JZLAorCQkJCVI5X0NVUlNFUl9ST1dfMCwgc3RhcnQsIENPTU1BTkRfRU5EKSkKKwkJCWdvdG8gb3V0OworCQlpZiAoaTJjX2dldGRhdGEodCwgZW5kIC0gc3RhcnQgKyAxLCBidWYpKQorCQkJZ290byBvdXQ7CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5idWZmZXIgKyBzdGFydCAtIHJlcS0+c3RhcnQsIGJ1Ziwgc2l6ZSkpCisJCQlnb3RvIG91dDsKKwl9CisJZXJyID0gMDsKK291dDoKKwlrZnJlZShidWYpOworCXJldHVybiBlcnI7Cit9CisKKy8qIFN0b3BzIHRoZSBhY3F1aXNpdGlvbiBjaXJjdWl0IGdpdmVuIGluIGRhdV9uby4gVGhlIHBhZ2UgYnVmZmVyIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhpcyBhY3F1aXNpdGlvbiBjaXJjdWl0IHdpbGwgbm8gbW9yZSBiZSB1cGRhdGVkLiBUaGUgb3RoZXIgZGF1cyBhcmUKKyAqIG5vdCBhZmZlY3RlZC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IDAgaWYgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGludCBzYWE1MjQ2YV9zdG9wX2RhdShzdHJ1Y3Qgc2FhNTI0NmFfZGV2aWNlICp0LAorICAgIHVuc2lnbmVkIGNoYXIgZGF1X25vKQoreworCWlmIChkYXVfbm8gPj0gTlVNX0RBVVMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpMmNfc2VuZGRhdGEodCwgU0FBNTI0NkFfUkVHSVNURVJfUjIsCisKKwkJUjJfSU5fUjNfU0VMRUNUX1BBR0VfSFVORFJFRFMgfAorCQlkYXVfbm8gPDwgNCB8CisJCVIyX0JBTktfMCB8CisJCVIyX0hBTU1JTkdfQ0hFQ0tfT0ZGLAorCisJCVIzX1BBR0VfSFVORFJFRFNfMCB8CisJCVIzX0hPTERfUEFHRSB8CisJCVIzX1BBR0VfSFVORFJFRFNfRE9fTk9UX0NBUkUsCisKKwkJQ09NTUFORF9FTkQpKQorCXsKKwkJcmV0dXJuIC1FSU87CisJfQorCXQtPmlzX3NlYXJjaGluZ1tkYXVfbm9dID0gRkFMU0U7CisJcmV0dXJuIDA7Cit9CisKKy8qICBIYW5kbGVzIGlvY3RscyBkZWZpbmVkIGluIHZpZGVvdGV4dC5oCisgKgorICogIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbnQgZG9fc2FhNTI0NmFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3Qgc2FhNTI0NmFfZGV2aWNlICp0PXZkLT5wcml2OworCXN3aXRjaChjbWQpCisJeworCQljYXNlIFZUWElPQ0dFVElORk86CisJCXsKKwkJCXZ0eF9pbmZvX3QgKmluZm8gPSBhcmc7CisKKwkJCWluZm8tPnZlcnNpb25fbWFqb3IgPSBNQUpPUl9WRVJTSU9OOworCQkJaW5mby0+dmVyc2lvbl9taW5vciA9IE1JTk9SX1ZFUlNJT047CisJCQlpbmZvLT5udW1wYWdlcyA9IE5VTV9EQVVTOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZUWElPQ0NMUlBBR0U6CisJCXsKKwkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKKworCQkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQltZW1zZXQodC0+cGdidWZbcmVxLT5wZ2J1Zl0sICcgJywgc2l6ZW9mKHQtPnBnYnVmWzBdKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVlRYSU9DQ0xSRk9VTkQ6CisJCXsKKwkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKKworCQkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4oc2FhNTI0NmFfY2xlYXJfZm91bmRfYml0KHQsIHJlcS0+cGdidWYpKTsKKwkJfQorCisJCWNhc2UgVlRYSU9DUEFHRVJFUToKKwkJeworCQkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOworCisJCQlyZXR1cm4oc2FhNTI0NmFfcmVxdWVzdF9wYWdlKHQsIHJlcSkpOworCQl9CisKKwkJY2FzZSBWVFhJT0NHRVRTVEFUOgorCQl7CisJCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CisJCQl2dHhfcGFnZWluZm9fdCBpbmZvOworCQkJaW50IHJ2YWw7CisKKwkJCWlmICgocnZhbCA9IHNhYTUyNDZhX2dldF9zdGF0dXModCwgJmluZm8sIHJlcS0+cGdidWYpKSkKKwkJCQlyZXR1cm4gcnZhbDsKKwkJCWlmKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciwgJmluZm8sCisJCQkJc2l6ZW9mKHZ0eF9wYWdlaW5mb190KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVlRYSU9DR0VUUEFHRToKKwkJeworCQkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOworCisJCQlyZXR1cm4oc2FhNTI0NmFfZ2V0X3BhZ2UodCwgcmVxKSk7CisJCX0KKworCQljYXNlIFZUWElPQ1NUT1BEQVU6CisJCXsKKwkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKKworCQkJcmV0dXJuKHNhYTUyNDZhX3N0b3BfZGF1KHQsIHJlcS0+cGdidWYpKTsKKwkJfQorCisJCWNhc2UgVlRYSU9DUFVUUEFHRToKKwkJY2FzZSBWVFhJT0NTRVRESVNQOgorCQljYXNlIFZUWElPQ1BVVFNUQVQ6CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFZUWElPQ0NMUkNBQ0hFOgorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVlRYSU9DU0VUVklSVDoKKwkJeworCQkJLyogSSBkbyBub3Qga25vdyB3aGF0ICJ2aXJ0dWFsIG1vZGUiIG1lYW5zICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFRyYW5zbGF0ZXMgb2xkIHZ0eCBJT0NUTHMgdG8gbmV3IG9uZXMKKyAqCisgKiBUaGlzIGtlZXBzIG5ldyBrZXJuZWwgdmVyc2lvbnMgY29tcGF0aWJsZSB3aXRoIG9sZCB1c2Vyc3BhY2UgcHJvZ3JhbXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHZ0eF9maXhfY29tbWFuZCh1bnNpZ25lZCBpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWVFhJT0NHRVRJTkZPX09MRDoKKwkJY21kID0gVlRYSU9DR0VUSU5GTzsKKwkJYnJlYWs7CisJY2FzZSBWVFhJT0NDTFJQQUdFX09MRDoKKwkJY21kID0gVlRYSU9DQ0xSUEFHRTsKKwkJYnJlYWs7CisJY2FzZSBWVFhJT0NDTFJGT1VORF9PTEQ6CisJCWNtZCA9IFZUWElPQ0NMUkZPVU5EOworCQlicmVhazsKKwljYXNlIFZUWElPQ1BBR0VSRVFfT0xEOgorCQljbWQgPSBWVFhJT0NQQUdFUkVROworCQlicmVhazsKKwljYXNlIFZUWElPQ0dFVFNUQVRfT0xEOgorCQljbWQgPSBWVFhJT0NHRVRTVEFUOworCQlicmVhazsKKwljYXNlIFZUWElPQ0dFVFBBR0VfT0xEOgorCQljbWQgPSBWVFhJT0NHRVRQQUdFOworCQlicmVhazsKKwljYXNlIFZUWElPQ1NUT1BEQVVfT0xEOgorCQljbWQgPSBWVFhJT0NTVE9QREFVOworCQlicmVhazsKKwljYXNlIFZUWElPQ1BVVFBBR0VfT0xEOgorCQljbWQgPSBWVFhJT0NQVVRQQUdFOworCQlicmVhazsKKwljYXNlIFZUWElPQ1NFVERJU1BfT0xEOgorCQljbWQgPSBWVFhJT0NTRVRESVNQOworCQlicmVhazsKKwljYXNlIFZUWElPQ1BVVFNUQVRfT0xEOgorCQljbWQgPSBWVFhJT0NQVVRTVEFUOworCQlicmVhazsKKwljYXNlIFZUWElPQ0NMUkNBQ0hFX09MRDoKKwkJY21kID0gVlRYSU9DQ0xSQ0FDSEU7CisJCWJyZWFrOworCWNhc2UgVlRYSU9DU0VUVklSVF9PTEQ6CisJCWNtZCA9IFZUWElPQ1NFVFZJUlQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY21kOworfQorCisvKgorICoJSGFuZGxlIHRoZSBsb2NraW5nCisgKi8KK3N0YXRpYyBpbnQgc2FhNTI0NmFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBzYWE1MjQ2YV9kZXZpY2UgKnQgPSB2ZC0+cHJpdjsKKwlpbnQgZXJyOworCisJY21kID0gdnR4X2ZpeF9jb21tYW5kKGNtZCk7CisJZG93bigmdC0+bG9jayk7CisJZXJyID0gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBkb19zYWE1MjQ2YV9pb2N0bCk7CisJdXAoJnQtPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2FhNTI0NmFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHNhYTUyNDZhX2RldmljZSAqdCA9IHZkLT5wcml2OworCWludCBlcnI7CisKKwllcnIgPSB2aWRlb19leGNsdXNpdmVfb3Blbihpbm9kZSxmaWxlKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICh0LT5jbGllbnQ9PU5VTEwpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChpMmNfc2VuZGRhdGEodCwgU0FBNTI0NkFfUkVHSVNURVJfUjAsCisKKwkJUjBfU0VMRUNUX1IxMSB8CisJCVIwX1BMTF9USU1FX0NPTlNUQU5UX0xPTkcgfAorCQlSMF9FTkFCTEVfbk9ERF9FVkVOX09VVFBVVCB8CisJCVIwX0VOQUJMRV9IRFJfUE9MTCB8CisJCVIwX0RPX05PVF9GT1JDRV9uT0REX0VWRU5fTE9XX0lGX1BJQ1RVUkVfRElTUExBWUVEIHwKKwkJUjBfTk9fRlJFRV9SVU5fUExMIHwKKwkJUjBfTk9fQVVUT01BVElDX0ZBU1RFWFRfUFJPTVBULAorCisJCVIxX05PTl9JTlRFUkxBQ0VEXzMxMl8zMTJfTElORVMgfAorCQlSMV9ERVcgfAorCQlSMV9FWFRFTkRFRF9QQUNLRVRfRElTQUJMRSB8CisJCVIxX0RBVVNfQUxMX09OIHwKKwkJUjFfOF9CSVRTX05PX1BBUklUWSB8CisJCVIxX1ZDU19UT19TQ1MsCisKKwkJQ09NTUFORF9FTkQpIHx8CisJCWkyY19zZW5kZGF0YSh0LCBTQUE1MjQ2QV9SRUdJU1RFUl9SNCwKKworCQkvKiBXZSBkbyBub3QgY2FyZSBtdWNoIGZvciB0aGUgVFYgZGlzcGxheSBidXQgbmV2ZXJ0aGVsZXNzIHdlCisJCSAqIG5lZWQgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZSBsYXRlciBiZWNhdXNlIG9ubHkgb24gdGhhdAorCQkgKiBwYWdlIHRoZSB0aW1lIGlzIHVwZGF0ZWQuICovCisJCVI0X0RJU1BMQVlfUEFHRV80LAorCisJCUNPTU1BTkRfRU5EKSkKKwl7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwl2aWRlb19leGNsdXNpdmVfcmVsZWFzZShpbm9kZSxmaWxlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNhYTUyNDZhX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBzYWE1MjQ2YV9kZXZpY2UgKnQgPSB2ZC0+cHJpdjsKKworCS8qIFN0b3AgYWxsIGFjcXVpc2l0aW9uIGNpcmN1aXRzLiAqLworCWkyY19zZW5kZGF0YSh0LCBTQUE1MjQ2QV9SRUdJU1RFUl9SMSwKKworCQlSMV9JTlRFUkxBQ0VEXzMxMl9BTkRfSEFMRl8zMTJfQU5EX0hBTEZfTElORVMgfAorCQlSMV9ERVcgfAorCQlSMV9FWFRFTkRFRF9QQUNLRVRfRElTQUJMRSB8CisJCVIxX0RBVVNfQUxMX09GRiB8CisJCVIxXzhfQklUU19OT19QQVJJVFkgfAorCQlSMV9WQ1NfVE9fU0NTLAorCisJCUNPTU1BTkRfRU5EKTsKKwl2aWRlb19leGNsdXNpdmVfcmVsZWFzZShpbm9kZSxmaWxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zYWFfNTI0NmEgKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTworCQkiU0FBNTI0NkEgKG9yIGNvbXBhdGlibGUpIFRlbGV0ZXh0IGRlY29kZXIgZHJpdmVyIHZlcnNpb24gJWQuJWRcbiIsCisJCU1BSk9SX1ZFUlNJT04sIE1JTk9SX1ZFUlNJT04pOworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl92aWRlb3RleHQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zYWFfNTI0NmEgKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfdmlkZW90ZXh0KTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9zYWFfNTI0NmEpOworbW9kdWxlX2V4aXQoY2xlYW51cF9zYWFfNTI0NmEpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzYWFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4JID0gc2FhNTI0NmFfb3BlbiwKKwkucmVsZWFzZSA9IHNhYTUyNDZhX3JlbGVhc2UsCisJLmlvY3RsCSA9IHNhYTUyNDZhX2lvY3RsLAorCS5sbHNlZWsJID0gbm9fbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2FhX3RlbXBsYXRlID0KK3sKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5uYW1lCSAgPSBJRl9OQU1FLAorCS50eXBlCSAgPSBWSURfVFlQRV9URUxFVEVYVCwKKwkuaGFyZHdhcmUgPSBWSURfSEFSRFdBUkVfU0FBNTI0OSwKKwkuZm9wcwkgID0gJnNhYV9mb3BzLAorCS5yZWxlYXNlICA9IHZpZGVvX2RldmljZV9yZWxlYXNlLAorCS5taW5vciAgICA9IC0xLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjkxMTEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ2YS5oCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICAgRHJpdmVyIGZvciB0aGUgU0FBNTI0NkEgb3IgU0FBNTI4MSBUZWxldGV4dCAoPVZpZGVvdGV4dCkgZGVjb2RlciBjaGlwcyBmcm9tCisgICBQaGlsaXBzLgorCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgTWljaGFlbCBHZW5nIChsaW51eEBNaWNoYWVsR2VuZy5kZSkKKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICovCisjaWZuZGVmIF9fU0FBNTI0NkFfSF9fCisjZGVmaW5lIF9fU0FBNTI0NkFfSF9fCisKKyNkZWZpbmUgTUFKT1JfVkVSU0lPTiAxCQkvKiBkcml2ZXIgbWFqb3IgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgTUlOT1JfVkVSU0lPTiA4CQkvKiBkcml2ZXIgbWlub3IgdmVyc2lvbiBudW1iZXIgKi8KKworI2RlZmluZSBJRl9OQU1FICJTQUE1MjQ2QSIKKworI2RlZmluZSBJMkNfQUREUkVTUyAxNworCisvKiBOdW1iZXIgb2YgREFVcyA9IG51bWJlciBvZiBwYWdlcyB0aGF0IGNhbiBiZSBzZWFyY2hlZCBhdCB0aGUgc2FtZSB0aW1lLiAqLworI2RlZmluZSBOVU1fREFVUyA0CisKKyNkZWZpbmUgTlVNX1JPV1NfUEVSX1BBR0UgNDAKKworLyogZmlyc3QgY29sdW1uIGlzIDAgKG5vdCAxKSAqLworI2RlZmluZSBQT1NfVElNRV9TVEFSVCAzMgorI2RlZmluZSBQT1NfVElNRV9FTkQgMzkKKworI2RlZmluZSBQT1NfSEVBREVSX1NUQVJUIDcKKyNkZWZpbmUgUE9TX0hFQURFUl9FTkQgMzEKKworLyogUmV0dXJucyBUUlVFIGlmIHRoZSBwYXJ0IG9mIHRoZSB2aWRlb3RleHQgcGFnZSBkZXNjcmliZWQgd2l0aCByZXEgY29udGFpbnMKKyAgIChhdCBsZWFzdCBwYXJ0cyBvZikgdGhlIHRpbWUgZmllbGQgKi8KKyNkZWZpbmUgUkVRX0NPTlRBSU5TX1RJTUUocF9yZXEpIFwKKwkoKHBfcmVxKS0+c3RhcnQgPD0gUE9TX1RJTUVfRU5EICYmIFwKKwkgKHBfcmVxKS0+ZW5kICAgPj0gUE9TX1RJTUVfU1RBUlQpCisKKy8qIFJldHVybnMgVFJVRSBpZiB0aGUgcGFydCBvZiB0aGUgdmlkZW90ZXh0IHBhZ2UgZGVzY3JpYmVkIHdpdGggcmVxIGNvbnRhaW5zCisgICAoYXQgbGVhc3QgcGFydHMgb2YpIHRoZSBwYWdlIGhlYWRlciAqLworI2RlZmluZSBSRVFfQ09OVEFJTlNfSEVBREVSKHBfcmVxKSBcCisJKChwX3JlcSktPnN0YXJ0IDw9IFBPU19IRUFERVJfRU5EICYmIFwKKwkgKHBfcmVxKS0+ZW5kICAgPj0gUE9TX0hFQURFUl9TVEFSVCkKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZGUgcmVnaXN0ZXIgbnVtYmVycyBvZiB0aGUgU0FBNTI0NkEJCQkJICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SMCAgICAwCisjZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1IxICAgIDEKKyNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjIgICAgMgorI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SMyAgICAzCisjZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1I0ICAgIDQKKyNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjUgICAgNQorI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SNiAgICA2CisjZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1I3ICAgIDcKKyNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjggICAgOAorI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SOSAgICA5CisjZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1IxMCAgMTAKKyNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjExICAxMQorI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SMTFCIDExCisKKy8qIFNBQTUyNDZBIG1vZGUgcmVnaXN0ZXJzIG9mdGVuIGF1dG9pbmNyZW1lbnQgdG8gdGhlIG5leHQgcmVnaXN0ZXIuCisgICBUaGVyZWZvcmUgd2UgdXNlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3RzLiBUaGUgZm9sbG93aW5nIG1hY3JvIGluZGljYXRlcworICAgdGhlIGVuZCBvZiBhIGNvbW1hbmQgbGlzdC4gKi8KKyNkZWZpbmUgQ09NTUFORF9FTkQgKC0gMSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ29udGVudHMgb2YgdGhlIG1vZGUgcmVnaXN0ZXJzIG9mIHRoZSBTQUE1MjQ2QQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJlZ2lzdGVyIFIwIChBZHZhbmNlZCBDb250cm9sKSAqLworI2RlZmluZSBSMF9TRUxFQ1RfUjExCQkJCQkgICAweDAwCisjZGVmaW5lIFIwX1NFTEVDVF9SMTFCCQkJCQkgICAweDAxCisKKyNkZWZpbmUgUjBfUExMX1RJTUVfQ09OU1RBTlRfTE9ORwkJCSAgIDB4MDAKKyNkZWZpbmUgUjBfUExMX1RJTUVfQ09OU1RBTlRfU0hPUlQJCQkgICAweDAyCisKKyNkZWZpbmUgUjBfRU5BQkxFX25PRERfRVZFTl9PVVRQVVQJCQkgICAweDAwCisjZGVmaW5lIFIwX0RJU0FCTEVfbk9ERF9FVkVOX09VVFBVVAkJCSAgIDB4MDQKKworI2RlZmluZSBSMF9FTkFCTEVfSERSX1BPTEwJCQkJICAgMHgwMAorI2RlZmluZSBSMF9ESVNBQkxFX0hEUl9QT0xMCQkJCSAgIDB4MTAKKworI2RlZmluZSBSMF9ET19OT1RfRk9SQ0Vfbk9ERF9FVkVOX0xPV19JRl9QSUNUVVJFX0RJU1BMQVlFRCAweDAwCisjZGVmaW5lIFIwX0ZPUkNFX25PRERfRVZFTl9MT1dfSUZfUElDVFVSRV9ESVNQTEFZRUQJICAgMHgyMAorCisjZGVmaW5lIFIwX05PX0ZSRUVfUlVOX1BMTAkJCQkgICAweDAwCisjZGVmaW5lIFIwX0ZSRUVfUlVOX1BMTAkJCQkJICAgMHg0MAorCisjZGVmaW5lIFIwX05PX0FVVE9NQVRJQ19GQVNURVhUX1BST01QVAkJCSAgIDB4MDAKKyNkZWZpbmUgUjBfQVVUT01BVElDX0ZBU1RFWFRfUFJPTVBUCQkJICAgMHg4MAorCisvKiBSZWdpc3RlciBSMSAoTW9kZSkgKi8KKyNkZWZpbmUgUjFfSU5URVJMQUNFRF8zMTJfQU5EX0hBTEZfMzEyX0FORF9IQUxGX0xJTkVTCSAgIDB4MDAKKyNkZWZpbmUgUjFfTk9OX0lOVEVSTEFDRURfMzEyXzMxM19MSU5FUwkJCSAgIDB4MDEKKyNkZWZpbmUgUjFfTk9OX0lOVEVSTEFDRURfMzEyXzMxMl9MSU5FUwkJCSAgIDB4MDIKKyNkZWZpbmUgUjFfRkZCX0xFQURJTkdfRURHRV9JTl9GSVJTVF9CUk9BRF9QVUxTRQkgICAweDAzCisjZGVmaW5lIFIxX0ZGQl9MRUFESU5HX0VER0VfSU5fU0VDT05EX0JST0FEX1BVTFNFCSAgIDB4MDcKKworI2RlZmluZSBSMV9ERVcJCQkJCQkgICAweDAwCisjZGVmaW5lIFIxX0ZVTExfRklFTEQJCQkJCSAgIDB4MDgKKworI2RlZmluZSBSMV9FWFRFTkRFRF9QQUNLRVRfRElTQUJMRQkJCSAgIDB4MDAKKyNkZWZpbmUgUjFfRVhURU5ERURfUEFDS0VUX0VOQUJMRQkJCSAgIDB4MTAKKworI2RlZmluZSBSMV9EQVVTX0FMTF9PTgkJCQkJICAgMHgwMAorI2RlZmluZSBSMV9EQVVTX0FMTF9PRkYJCQkJCSAgIDB4MjAKKworI2RlZmluZSBSMV83X0JJVFNfUExVU19QQVJJVFkJCQkJICAgMHgwMAorI2RlZmluZSBSMV84X0JJVFNfTk9fUEFSSVRZCQkJCSAgIDB4NDAKKworI2RlZmluZSBSMV9WQ1NfVE9fU0NTCQkJCQkgICAweDAwCisjZGVmaW5lIFIxX05PX1ZDU19UT19TQ1MJCQkJICAgMHg4MAorCisvKiBSZWdpc3RlciBSMiAoUGFnZSByZXF1ZXN0IGFkZHJlc3MpICovCisjZGVmaW5lIFIyX0lOX1IzX1NFTEVDVF9QQUdFX0hVTkRSRURTCQkJICAgMHgwMAorI2RlZmluZSBSMl9JTl9SM19TRUxFQ1RfUEFHRV9URU5TCQkJICAgMHgwMQorI2RlZmluZSBSMl9JTl9SM19TRUxFQ1RfUEFHRV9VTklUUwkJCSAgIDB4MDIKKyNkZWZpbmUgUjJfSU5fUjNfU0VMRUNUX0hPVVJTX1RFTlMJCQkgICAweDAzCisjZGVmaW5lIFIyX0lOX1IzX1NFTEVDVF9IT1VSU19VTklUUwkJCSAgIDB4MDQKKyNkZWZpbmUgUjJfSU5fUjNfU0VMRUNUX01JTlVURVNfVEVOUwkJCSAgIDB4MDUKKyNkZWZpbmUgUjJfSU5fUjNfU0VMRUNUX01JTlVURVNfVU5JVFMJCQkgICAweDA2CisKKyNkZWZpbmUgUjJfREFVXzAJCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjJfREFVXzEJCQkJCSAgIDB4MTAKKyNkZWZpbmUgUjJfREFVXzIJCQkJCSAgIDB4MjAKKyNkZWZpbmUgUjJfREFVXzMJCQkJCSAgIDB4MzAKKworI2RlZmluZSBSMl9CQU5LXzAJCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjJfQkFOSyAxCQkJCQkgICAweDQwCisKKyNkZWZpbmUgUjJfSEFNTUlOR19DSEVDS19PTgkJCQkgICAweDgwCisjZGVmaW5lIFIyX0hBTU1JTkdfQ0hFQ0tfT0ZGCQkJCSAgIDB4MDAKKworLyogUmVnaXN0ZXIgUjMgKFBhZ2UgcmVxdWVzdCBkYXRhKSAqLworI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzAJCQkJICAgMHgwMAorI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzEJCQkJICAgMHgwMQorI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzIJCQkJICAgMHgwMgorI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzMJCQkJICAgMHgwMworI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzQJCQkJICAgMHgwNAorI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzUJCQkJICAgMHgwNQorI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzYJCQkJICAgMHgwNgorI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzcJCQkJICAgMHgwNworCisjZGVmaW5lIFIzX0hPTERfUEFHRQkJCQkJICAgMHgwMAorI2RlZmluZSBSM19VUERBVEVfUEFHRQkJCQkJICAgMHgwOAorCisjZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfRE9fTk9UX0NBUkUJCQkgICAweDAwCisjZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfRE9fQ0FSRQkJCSAgIDB4MTAKKworI2RlZmluZSBSM19QQUdFX1RFTlNfRE9fTk9UX0NBUkUJCQkgICAweDAwCisjZGVmaW5lIFIzX1BBR0VfVEVOU19ET19DQVJFCQkJCSAgIDB4MTAKKworI2RlZmluZSBSM19QQUdFX1VOSVRTX0RPX05PVF9DQVJFCQkJICAgMHgwMAorI2RlZmluZSBSM19QQUdFX1VOSVRTX0RPX0NBUkUJCQkJICAgMHgxMAorCisjZGVmaW5lIFIzX0hPVVJTX1RFTlNfRE9fTk9UX0NBUkUJCQkgICAweDAwCisjZGVmaW5lIFIzX0hPVVJTX1RFTlNfRE9fQ0FSRQkJCQkgICAweDEwCisKKyNkZWZpbmUgUjNfSE9VUlNfVU5JVFNfRE9fTk9UX0NBUkUJCQkgICAweDAwCisjZGVmaW5lIFIzX0hPVVJTX1VOSVRTX0RPX0NBUkUJCQkJICAgMHgxMAorCisjZGVmaW5lIFIzX01JTlVURVNfVEVOU19ET19OT1RfQ0FSRQkJCSAgIDB4MDAKKyNkZWZpbmUgUjNfTUlOVVRFU19URU5TX0RPX0NBUkUJCQkJICAgMHgxMAorCisjZGVmaW5lIFIzX01JTlVURVNfVU5JVFNfRE9fTk9UX0NBUkUJCQkgICAweDAwCisjZGVmaW5lIFIzX01JTlVURVNfVU5JVFNfRE9fQ0FSRQkJCSAgIDB4MTAKKworLyogUmVnaXN0ZXIgUjQgKERpc3BsYXkgY2hhcHRlcikgKi8KKyNkZWZpbmUgUjRfRElTUExBWV9QQUdFXzAJCQkJICAgMHgwMAorI2RlZmluZSBSNF9ESVNQTEFZX1BBR0VfMQkJCQkgICAweDAxCisjZGVmaW5lIFI0X0RJU1BMQVlfUEFHRV8yCQkJCSAgIDB4MDIKKyNkZWZpbmUgUjRfRElTUExBWV9QQUdFXzMJCQkJICAgMHgwMworI2RlZmluZSBSNF9ESVNQTEFZX1BBR0VfNAkJCQkgICAweDA0CisjZGVmaW5lIFI0X0RJU1BMQVlfUEFHRV81CQkJCSAgIDB4MDUKKyNkZWZpbmUgUjRfRElTUExBWV9QQUdFXzYJCQkJICAgMHgwNgorI2RlZmluZSBSNF9ESVNQTEFZX1BBR0VfNwkJCQkgICAweDA3CisKKy8qIFJlZ2lzdGVyIFI1IChOb3JtYWwgZGlzcGxheSBjb250cm9sKSAqLworI2RlZmluZSBSNV9QSUNUVVJFX0lOU0lERV9CT1hJTkdfT0ZGCQkJICAgMHgwMAorI2RlZmluZSBSNV9QSUNUVVJFX0lOU0lERV9CT1hJTkdfT04JCQkgICAweDAxCisKKyNkZWZpbmUgUjVfUElDVFVSRV9PVVRTSURFX0JPWElOR19PRkYJCQkgICAweDAwCisjZGVmaW5lIFI1X1BJQ1RVUkVfT1VUU0lERV9CT1hJTkdfT04JCQkgICAweDAyCisKKyNkZWZpbmUgUjVfVEVYVF9JTlNJREVfQk9YSU5HX09GRgkJCSAgIDB4MDAKKyNkZWZpbmUgUjVfVEVYVF9JTlNJREVfQk9YSU5HX09OCQkJICAgMHgwNAorCisjZGVmaW5lIFI1X1RFWFRfT1VUU0lERV9CT1hJTkdfT0ZGCQkJICAgMHgwMAorI2RlZmluZSBSNV9URVhUX09VVFNJREVfQk9YSU5HX09OCQkJICAgMHgwOAorCisjZGVmaW5lIFI1X0NPTlRSQVNUX1JFRFVDVElPTl9JTlNJREVfQk9YSU5HX09GRgkJICAgMHgwMAorI2RlZmluZSBSNV9DT05UUkFTVF9SRURVQ1RJT05fSU5TSURFX0JPWElOR19PTgkJICAgMHgxMAorCisjZGVmaW5lIFI1X0NPTlRSQVNUX1JFRFVDVElPTl9PVVRTSURFX0JPWElOR19PRkYJICAgMHgwMAorI2RlZmluZSBSNV9DT05UUkFTVF9SRURVQ1RJT05fT1VUU0lERV9CT1hJTkdfT04JCSAgIDB4MjAKKworI2RlZmluZSBSNV9CQUNLR1JPVU5EX0NPTE9SX0lOU0lERV9CT1hJTkdfT0ZGCQkgICAweDAwCisjZGVmaW5lIFI1X0JBQ0tHUk9VTkRfQ09MT1JfSU5TSURFX0JPWElOR19PTgkJICAgMHg0MAorCisjZGVmaW5lIFI1X0JBQ0tHUk9VTkRfQ09MT1JfT1VUU0lERV9CT1hJTkdfT0ZGCQkgICAweDAwCisjZGVmaW5lIFI1X0JBQ0tHUk9VTkRfQ09MT1JfT1VUU0lERV9CT1hJTkdfT04JCSAgIDB4ODAKKworLyogUmVnaXN0ZXIgUjYgKE5ld3NmbGFzaCBkaXNwbGF5KSAqLworI2RlZmluZSBSNl9ORVdTRkxBU0hfUElDVFVSRV9JTlNJREVfQk9YSU5HX09GRgkJICAgMHgwMAorI2RlZmluZSBSNl9ORVdTRkxBU0hfUElDVFVSRV9JTlNJREVfQk9YSU5HX09OCQkgICAweDAxCisKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX1BJQ1RVUkVfT1VUU0lERV9CT1hJTkdfT0ZGCQkgICAweDAwCisjZGVmaW5lIFI2X05FV1NGTEFTSF9QSUNUVVJFX09VVFNJREVfQk9YSU5HX09OCQkgICAweDAyCisKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX1RFWFRfSU5TSURFX0JPWElOR19PRkYJCSAgIDB4MDAKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX1RFWFRfSU5TSURFX0JPWElOR19PTgkJICAgMHgwNAorCisjZGVmaW5lIFI2X05FV1NGTEFTSF9URVhUX09VVFNJREVfQk9YSU5HX09GRgkJICAgMHgwMAorI2RlZmluZSBSNl9ORVdTRkxBU0hfVEVYVF9PVVRTSURFX0JPWElOR19PTgkJICAgMHgwOAorCisjZGVmaW5lIFI2X05FV1NGTEFTSF9DT05UUkFTVF9SRURVQ1RJT05fSU5TSURFX0JPWElOR19PRkYgIDB4MDAKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX0NPTlRSQVNUX1JFRFVDVElPTl9JTlNJREVfQk9YSU5HX09OICAgMHgxMAorCisjZGVmaW5lIFI2X05FV1NGTEFTSF9DT05UUkFTVF9SRURVQ1RJT05fT1VUU0lERV9CT1hJTkdfT0ZGIDB4MDAKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX0NPTlRSQVNUX1JFRFVDVElPTl9PVVRTSURFX0JPWElOR19PTiAgMHgyMAorCisjZGVmaW5lIFI2X05FV1NGTEFTSF9CQUNLR1JPVU5EX0NPTE9SX0lOU0lERV9CT1hJTkdfT0ZGICAgIDB4MDAKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX0JBQ0tHUk9VTkRfQ09MT1JfSU5TSURFX0JPWElOR19PTgkgICAweDQwCisKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX0JBQ0tHUk9VTkRfQ09MT1JfT1VUU0lERV9CT1hJTkdfT0ZGICAgMHgwMAorI2RlZmluZSBSNl9ORVdTRkxBU0hfQkFDS0dST1VORF9DT0xPUl9PVVRTSURFX0JPWElOR19PTiAgICAweDgwCisKKy8qIFJlZ2lzdGVyIFI3IChEaXNwbGF5IG1vZGUpICovCisjZGVmaW5lIFI3X0JPWF9PRkZfUk9XXzAJCQkJICAgMHgwMAorI2RlZmluZSBSN19CT1hfT05fUk9XXzAJCQkJCSAgIDB4MDEKKworI2RlZmluZSBSN19CT1hfT0ZGX1JPV18xX1RPXzIzCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjdfQk9YX09OX1JPV18xX1RPXzIzCQkJCSAgIDB4MDIKKworI2RlZmluZSBSN19CT1hfT0ZGX1JPV18yNAkJCQkgICAweDAwCisjZGVmaW5lIFI3X0JPWF9PTl9ST1dfMjQJCQkJICAgMHgwNAorCisjZGVmaW5lIFI3X1NJTkdMRV9IRUlHSFQJCQkJICAgMHgwMAorI2RlZmluZSBSN19ET1VCTEVfSEVJR0hUCQkJCSAgIDB4MDgKKworI2RlZmluZSBSN19UT1BfSEFMRgkJCQkJICAgMHgwMAorI2RlZmluZSBSN19CT1RUT01fSEFMRgkJCQkJICAgMHgxMAorCisjZGVmaW5lIFI3X1JFVkVBTF9PRkYJCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjdfUkVWRUFMX09OCQkJCQkgICAweDIwCisKKyNkZWZpbmUgUjdfQ1VSU0VSX09GRgkJCQkJICAgMHgwMAorI2RlZmluZSBSN19DVVJTRVJfT04JCQkJCSAgIDB4NDAKKworI2RlZmluZSBSN19TVEFUVVNfQk9UVE9NCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjdfU1RBVFVTX1RPUAkJCQkJICAgMHg4MAorCisvKiBSZWdpc3RlciBSOCAoQWN0aXZlIGNoYXB0ZXIpICovCisjZGVmaW5lIFI4X0FDVElWRV9DSEFQVEVSXzAJCQkJICAgMHgwMAorI2RlZmluZSBSOF9BQ1RJVkVfQ0hBUFRFUl8xCQkJCSAgIDB4MDEKKyNkZWZpbmUgUjhfQUNUSVZFX0NIQVBURVJfMgkJCQkgICAweDAyCisjZGVmaW5lIFI4X0FDVElWRV9DSEFQVEVSXzMJCQkJICAgMHgwMworI2RlZmluZSBSOF9BQ1RJVkVfQ0hBUFRFUl80CQkJCSAgIDB4MDQKKyNkZWZpbmUgUjhfQUNUSVZFX0NIQVBURVJfNQkJCQkgICAweDA1CisjZGVmaW5lIFI4X0FDVElWRV9DSEFQVEVSXzYJCQkJICAgMHgwNgorI2RlZmluZSBSOF9BQ1RJVkVfQ0hBUFRFUl83CQkJCSAgIDB4MDcKKworI2RlZmluZSBSOF9DTEVBUl9NRU1PUlkJCQkJCSAgIDB4MDgKKyNkZWZpbmUgUjhfRE9fTk9UX0NMRUFSX01FTU9SWQkJCQkgICAweDAwCisKKy8qIFJlZ2lzdGVyIFI5IChDdXJzZXIgcm93KSAqLworI2RlZmluZSBSOV9DVVJTRVJfUk9XXzAJCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjlfQ1VSU0VSX1JPV18xCQkJCQkgICAweDAxCisjZGVmaW5lIFI5X0NVUlNFUl9ST1dfMgkJCQkJICAgMHgwMgorI2RlZmluZSBSOV9DVVJTRVJfUk9XXzI1CQkJCSAgIDB4MTkKKworLyogUmVnaXN0ZXIgUjEwIChDdXJzZXIgY29sdW1uKSAqLworI2RlZmluZSBSMTBfQ1VSU0VSX0NPTFVNTl8wCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjEwX0NVUlNFUl9DT0xVTU5fNgkJCQkgICAweDA2CisjZGVmaW5lIFIxMF9DVVJTRVJfQ09MVU1OXzgJCQkJICAgMHgwOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSb3cgMjUgY29udHJvbCBkYXRhIGluIGNvbHVtbiAwIHRvIDkJCQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUk9XMjVfQ09MVU1OMF9QQUdFX1VOSVRTCQkJICAgMHgwRgorCisjZGVmaW5lIFJPVzI1X0NPTFVNTjFfUEFHRV9URU5TCQkJCSAgIDB4MEYKKworI2RlZmluZSBST1cyNV9DT0xVTU4yX01JTlVURVNfVU5JVFMJCQkgICAweDBGCisKKyNkZWZpbmUgUk9XMjVfQ09MVU1OM19NSU5VVEVTX1RFTlMJCQkgICAweDA3CisjZGVmaW5lIFJPVzI1X0NPTFVNTjNfREVMRVRFX1BBR0UJCQkgICAweDA4CisKKyNkZWZpbmUgUk9XMjVfQ09MVU1ONF9IT1VSX1VOSVRTCQkJICAgMHgwRgorCisjZGVmaW5lIFJPVzI1X0NPTFVNTjVfSE9VUl9URU5TCQkJCSAgIDB4MDMKKyNkZWZpbmUgUk9XMjVfQ09MVU1ONV9JTlNFUlRfSEVBRExJTkUJCQkgICAweDA0CisjZGVmaW5lIFJPVzI1X0NPTFVNTjVfSU5TRVJUX1NVQlRJVExFCQkJICAgMHgwOAorCisjZGVmaW5lIFJPVzI1X0NPTFVNTjZfU1VQUFJFU1NfSEVBREVSCQkJICAgMHgwMQorI2RlZmluZSBST1cyNV9DT0xVTU42X1VQREFURV9QQUdFCQkJICAgMHgwMgorI2RlZmluZSBST1cyNV9DT0xVTU42X0lOVEVSUlVQVEVEX1NFUVVFTkNFCQkgICAweDA0CisjZGVmaW5lIFJPVzI1X0NPTFVNTjZfU1VQUFJFU1NfRElTUExBWQkJCSAgIDB4MDgKKworI2RlZmluZSBST1cyNV9DT0xVTU43X1NFUklBTF9NT0RFCQkJICAgMHgwMQorI2RlZmluZSBST1cyNV9DT0xVTU43X0NIQVJBQ1RFUl9TRVQJCQkgICAweDBFCisKKyNkZWZpbmUgUk9XMjVfQ09MVU1OOF9QQUdFX0hVTkRSRURTCQkJICAgMHgwNworI2RlZmluZSBST1cyNV9DT0xVTU44X1BBR0VfTk9UX0ZPVU5ECQkJICAgMHgxMAorCisjZGVmaW5lIFJPVzI1X0NPTFVNTjlfUEFHRV9CRUlOR19MT09LRURfRk9SCQkgICAweDIwCisKKyNkZWZpbmUgUk9XMjVfQ09MVU1OMF9UT183X0hBTU1JTkdfRVJST1IJCSAgIDB4MTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSGVscGVyIG1hY3JvcyBmb3IgZXh0cmFjdGluZyBwYWdlLCBob3VyIGFuZCBtaW51dGUgZGlnaXRzCQkgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCWVRFX1BPUyAgMCBpcyBhdCByb3cgMCwgY29sdW1uIDAsCisgICBCWVRFX1BPUyAgMSBpcyBhdCByb3cgMCwgY29sdW1uIDEsCisgICBCWVRFX1BPUyA0MCBpcyBhdCByb3cgMSwgY29sdW1uIDAsICh3aXRoIE5VTV9ST1dTX1BFUl9QQUdFID0gNDApCisgICBCWVRFX1BPUyA0MSBpcyBhdCByb3cgMSwgY29sdW1uIDEsICh3aXRoIE5VTV9ST1dTX1BFUl9QQUdFID0gNDApLAorICAgLi4uICovCisjZGVmaW5lIFJPVyhCWVRFX1BPUykgICAgKEJZVEVfUE9TIC8gTlVNX1JPV1NfUEVSX1BBR0UpCisjZGVmaW5lIENPTFVNTihCWVRFX1BPUykgKEJZVEVfUE9TICUgTlVNX1JPV1NfUEVSX1BBR0UpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEhlbHBlciBtYWNyb3MgZm9yIGV4dHJhY3RpbmcgcGFnZSwgaG91ciBhbmQgbWludXRlIGRpZ2l0cwkJICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWFjcm9zIGZvciBleHRyYWN0aW5nIGh1bmRyZWRzLCB0ZW5zIGFuZCB1bml0cyBvZiBhIHBhZ2UgbnVtYmVyIHdoaWNoCisgICBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uLiAweDc5OS4KKyAgIE5vdGUgdGhhdCBwYWdlIGlzIGNvZGVkIGluIGhleGFkZWNpbWFsLCBpLmUuIDB4MTIzIG1lYW5zIHBhZ2UgMTIzLgorICAgcGFnZSAweC4uIG1lYW5zIHBhZ2UgOC4uICovCisjZGVmaW5lIEhVTkRSRURTX09GX1BBR0UocGFnZSkgKCgocGFnZSkgLyAweDEwMCkgJiAweDcpCisjZGVmaW5lIFRFTlNfT0ZfUEFHRShwYWdlKSAgICAgKCgocGFnZSkgLyAweDEwKSAgJiAweEYpCisjZGVmaW5lIFVOSVRTX09GX1BBR0UocGFnZSkgICAgICgocGFnZSkgJiAweEYpCisKKy8qIE1hY3JvcyBmb3IgZXh0cmFjdGluZyB0ZW5zIGFuZCB1bml0cyBvZiBhIGhvdXIgaW5mb3JtYXRpb24gd2hpY2gKKyAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgLi4uIDB4MjQuCisgICBOb3RlIHRoYXQgaG91ciBpcyBjb2RlZCBpbiBoZXhhZGVjaW1hbCwgaS5lLiAweDEyIG1lYW5zIDEyIGhvdXJzICovCisjZGVmaW5lIFRFTlNfT0ZfSE9VUihob3VyKSAgKChob3VyKSAvIDB4MTApCisjZGVmaW5lIFVOSVRTX09GX0hPVVIoaG91cikgKChob3VyKSAmIDB4RikKKworLyogTWFjcm9zIGZvciBleHRyYWN0aW5nIHRlbnMgYW5kIHVuaXRzIG9mIGEgbWludXRlIGluZm9ybWF0aW9uIHdoaWNoCisgICBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uLiAweDU5LgorICAgTm90ZSB0aGF0IG1pbnV0ZSBpcyBjb2RlZCBpbiBoZXhhZGVjaW1hbCwgaS5lLiAweDEyIG1lYW5zIDEyIG1pbnV0ZXMgKi8KKyNkZWZpbmUgVEVOU19PRl9NSU5VVEUobWludXRlKSAgKChtaW51dGUpIC8gMHgxMCkKKyNkZWZpbmUgVU5JVFNfT0ZfTUlOVVRFKG1pbnV0ZSkgKChtaW51dGUpICYgMHhGKQorCisjZGVmaW5lIEhPVVJfTUFYICAgMHgyMworI2RlZmluZSBNSU5VVEVfTUFYIDB4NTkKKyNkZWZpbmUgUEFHRV9NQVggICAweDhGRgorCisjZW5kaWYgIC8qIF9fU0FBNTI0NkFfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NGNhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDkuYwpAQCAtMCwwICsxLDcyNSBAQAorLyoKKyAqIE1vZGlmaWVkIGluIG9yZGVyIHRvIGtlZXAgaXQgY29tcGF0aWJsZSBib3RoIHdpdGggbmV3IGFuZCBvbGQgdmlkZW90ZXh0IElPQ1RMcyBieQorICogTWljaGFlbCBHZW5nIDxsaW51eEBNaWNoYWVsR2VuZy5kZT4KKyAqCisgKglDbGVhbmVkIHVwIHRvIHVzZSBleGlzdGluZyB2aWRlb2RldiBpbnRlcmZhY2UgYW5kIGFsbG93IHRoZSBpZGVhCisgKglvZiBtdWx0aXBsZSB0ZWxldGV4dCBkZWNvZGVycyBvbiB0aGUgdmlkZW80bGludXggaWZhY2UuIENoYW5nZWQgaTJjCisgKgl0byBjb3ZlciBhZGRyZXNzaW5nIGNsYXNoZXMgb24gZGV2aWNlIGJ1c3Nlcy4gSXQncyBhbHNvIHJlYnVpbHQgc28KKyAqCXlvdSBjYW4gYWRkIGFyYml0YXJ5IG11bHRpcGxlIHRlbGV0ZXh0IGRldmljZXMgdG8gTGludXggdmlkZW80bGludXgKKyAqCW5vdyAod2VsbCAzMiBhbnl3YXkpLgorICoKKyAqCUFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CisgKgorICoJVGhlIG9yaWdpbmFsIGRyaXZlciB3YXMgaGVhdmlseSBtb2RpZmllZCB0byBtYXRjaCB0aGUgaTJjIGludGVyZmFjZQorICoJSXQgd2FzIHRydW5jYXRlZCB0byB1c2UgdGhlIFdpblRWIGJvYXJkcywgdG9vLgorICoKKyAqCUNvcHlyaWdodCAoYykgMTk5OCBSaWNoYXJkIEd1ZW50aGVyIDxyaWNoYXJkLmd1ZW50aGVyQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZT4KKyAqCisgKiAkSWQ6IHNhYTUyNDkuYyx2IDEuMSAxOTk4LzAzLzMwIDIyOjIzOjIzIGFsYW4gRXhwICQKKyAqCisgKglEZXJpdmVkIEZyb20KKyAqCisgKiB2dHguYzoKKyAqIFRoaXMgaXMgYSBsb2FkYWJsZSBjaGFyYWN0ZXItZGV2aWNlLWRyaXZlciBmb3IgdmlkZW90ZXh0LWludGVyZmFjZXMKKyAqIChha2EgdGVsZXRleHQpLiBQbGVhc2UgY2hlY2sgdGhlIE1ha2VmaWxlL1JFQURNRSBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZAorICogaW50ZXJmYWNlcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtOTcgTWFydGluIEJ1Y2sgIDxtYXJ0aW4tMi5idWNrQHN0dWRlbnQudW5pLXVsbS5kZT4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb3RleHQuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBWVFhfVkVSX01BSiAxCisjZGVmaW5lIFZUWF9WRVJfTUlOIDgKKworCisKKyNkZWZpbmUgTlVNX0RBVVMgNAorI2RlZmluZSBOVU1fQlVGUyA4CisjZGVmaW5lIElGX05BTUUgIlNBQTUyNDkiCisKK3N0YXRpYyBjb25zdCBpbnQgZGlzcF9tb2Rlc1s4XVszXSA9IAoreworCXsgMHg0NiwgMHgwMywgMHgwMyB9LAkvKiBESVNQT0ZGICovCisJeyAweDQ2LCAweGNjLCAweGNjIH0sCS8qIERJU1BOT1JNICovCisJeyAweDQ0LCAweDBmLCAweDBmIH0sCS8qIERJU1BUUkFOUyAqLworCXsgMHg0NiwgMHhjYywgMHg0NiB9LAkvKiBESVNQSU5TICovCisJeyAweDQ0LCAweDAzLCAweDAzIH0sCS8qIERJU1BPRkYsIGludGVybGFjZWQgKi8KKwl7IDB4NDQsIDB4Y2MsIDB4Y2MgfSwJLyogRElTUE5PUk0sIGludGVybGFjZWQgKi8KKwl7IDB4NDQsIDB4MGYsIDB4MGYgfSwJLyogRElTUFRSQU5TLCBpbnRlcmxhY2VkICovCisJeyAweDQ0LCAweGNjLCAweDQ2IH0JLyogRElTUElOUywgaW50ZXJsYWNlZCAqLworfTsKKworCisKKyNkZWZpbmUgUEFHRV9XQUlUICgzMDAqSFovMTAwMCkJCQkvKiBUaW1lIGJldHdlZW4gcmVxdWVzdGluZyBwYWdlIGFuZCAqLworCQkJCQkJLyogY2hlY2tpbmcgc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgUEdCVUZfRVhQSVJFICgxNSpIWikJCQkvKiBUaW1lIHRvIHdhaXQgYmVmb3JlIHJldHJhbnNtaXR0aW5nICovCisJCQkJCQkvKiBwYWdlIHJlZ2FyZGxlc3Mgb2YgaW5mb2JpdHMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OCBwZ2J1ZltWVFhfVklSVFVBTFNJWkVdOwkJLyogUGFnZS1idWZmZXIgKi8KKwl1OCBsYXN0c3RhdFsxMF07CQkJLyogTGFzdCB2YWx1ZSBvZiBpbmZvYml0cyBmb3IgREFVICovCisJdTggc3JlZ3NbN107CQkJCS8qIFBhZ2UtcmVxdWVzdCByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBsb25nIGV4cGlyZTsJCQkvKiBUaW1lIHdoZW4gcGFnZSB3aWxsIGJlIGV4cGlyZWQgKi8KKwl1bnNpZ25lZCBjbHJmb3VuZCA6IDE7CQkJLyogVlRYSU9DQ0xSRk9VTkQgaGFzIGJlZW4gY2FsbGVkICovCisJdW5zaWduZWQgc3RvcHBlZCA6IDE7CQkJLyogVlRYSU9DU1RPUERBVSBoYXMgYmVlbiBjYWxsZWQgKi8KK30gdmRhdV90OworCitzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UKK3sKKwl2ZGF1X3QgdmRhdVtOVU1fREFVU107CQkJLyogRGF0YSBmb3IgdmlydHVhbCBEQVVzICh0aGUgNTI0OSBvbmx5IGhhcyBvbmUgKi8KKwkJCQkJCS8qIHJlYWwgREFVLCBzbyB3ZSBoYXZlIHRvIHNpbXVsYXRlIHNvbWUgbW9yZSkgKi8KKwlpbnQgdnR4X3VzZV9jb3VudDsKKwlpbnQgaXNfc2VhcmNoaW5nW05VTV9EQVVTXTsKKwlpbnQgZGlzcF9tb2RlOworCWludCB2aXJ0dWFsX21vZGU7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7Cit9OworCisKKyNkZWZpbmUgQ0NUV1IgMzQJCS8qIEmyQyB3cml0ZS9yZWFkLWFkZHJlc3Mgb2YgdnR4LWNoaXAgKi8KKyNkZWZpbmUgQ0NUUkQgMzUKKyNkZWZpbmUgTk9BQ0tfUkVQRUFUIDEwCQkvKiBSZXRyeSBhY2Nlc3MgdGhpcyBtYW55IHRpbWVzIG9uIGZhaWx1cmUgKi8KKyNkZWZpbmUgQ0xFQVJfREVMQVkgKEhaLzIwKQkvKiBUaW1lIHJlcXVpcmVkIHRvIGNsZWFyIGEgcGFnZSAqLworI2RlZmluZSBSRUFEWV9USU1FT1VUICgzMCpIWi8xMDAwKQkvKiBUaW1lIHRvIHdhaXQgZm9yIHJlYWR5IHNpZ25hbCBvZiBJskMtYnVzIGludGVyZmFjZSAqLworI2RlZmluZSBJTklUX0RFTEFZIDUwMAkJLyogVGltZSBpbiB1c2VjIHRvIHdhaXQgYXQgaW5pdGlhbGl6YXRpb24gb2YgQ0VBIGludGVyZmFjZSAqLworI2RlZmluZSBTVEFSVF9ERUxBWSAxMAkJLyogVGltZSBpbiB1c2VjIHRvIHdhaXQgYmVmb3JlIHN0YXJ0aW5nIHdyaXRlLWN5Y2xlIChDRUEpICovCisKKyNkZWZpbmUgVlRYX0RFVl9NSU5PUiAwCisKKy8qIEdlbmVyYWwgZGVmaW5lcyBhbmQgZGVidWdnaW5nIHN1cHBvcnQgKi8KKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisKKyNkZWZpbmUgUkVTQ0hFRCBkbyB7IGNvbmRfcmVzY2hlZCgpOyB9IHdoaWxlKDApCisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNhYV90ZW1wbGF0ZTsJLyogRGVjbGFyZWQgbmVhciBib3R0b20gKi8KKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7MzQ+PjEsSTJDX0NMSUVOVF9FTkR9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHtJMkNfQ0xJRU5UX0VORH07CitJMkNfQ0xJRU5UX0lOU01PRDsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKKworc3RhdGljIGludCBzYWE1MjQ5X2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlpbnQgcGdidWY7CisJaW50IGVycjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkOworCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdDsKKworCXByaW50ayhLRVJOX0lORk8gInNhYTUyNDk6IHRlbGV0ZXh0IGNoaXAgZm91bmQuXG4iKTsKKwljbGllbnQ9a21hbGxvYyhzaXplb2YoKmNsaWVudCksIEdGUF9LRVJORUwpOworCWlmKGNsaWVudD09TlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisgICAgICAgIGNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKKyAgICAgICAgY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOworCW1lbWNweShjbGllbnQsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZigqY2xpZW50KSk7CisJdCA9IGttYWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJaWYodD09TlVMTCkKKwl7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CisJc3RybGNweShjbGllbnQtPm5hbWUsIElGX05BTUUsIEkyQ19OQU1FX1NJWkUpOworCWluaXRfTVVURVgoJnQtPmxvY2spOworCQorCS8qCisJICoJTm93IGNyZWF0ZSBhIHZpZGVvNGxpbnV4IGRldmljZQorCSAqLworCSAKKwl2ZCA9IChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmKHZkPT1OVUxMKQorCXsKKwkJa2ZyZWUodCk7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB2ZCk7CisJbWVtY3B5KHZkLCAmc2FhX3RlbXBsYXRlLCBzaXplb2YoKnZkKSk7CisJCQorCWZvciAocGdidWYgPSAwOyBwZ2J1ZiA8IE5VTV9EQVVTOyBwZ2J1ZisrKSAKKwl7CisJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOworCQltZW1zZXQodC0+dmRhdVtwZ2J1Zl0uc3JlZ3MsIDAsIHNpemVvZih0LT52ZGF1WzBdLnNyZWdzKSk7CisJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5sYXN0c3RhdCwgMCwgc2l6ZW9mKHQtPnZkYXVbMF0ubGFzdHN0YXQpKTsKKwkJdC0+dmRhdVtwZ2J1Zl0uZXhwaXJlID0gMDsKKwkJdC0+dmRhdVtwZ2J1Zl0uY2xyZm91bmQgPSBUUlVFOworCQl0LT52ZGF1W3BnYnVmXS5zdG9wcGVkID0gVFJVRTsKKwkJdC0+aXNfc2VhcmNoaW5nW3BnYnVmXSA9IEZBTFNFOworCX0KKwl2ZC0+cHJpdj10OwkKKwkgCisJCisJLyoKKwkgKglSZWdpc3RlciBpdAorCSAqLworCisJaWYoKGVycj12aWRlb19yZWdpc3Rlcl9kZXZpY2UodmQsIFZGTF9UWVBFX1ZUWCwtMSkpPDApCisJeworCQlrZnJlZSh0KTsKKwkJa2ZyZWUodmQpOworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gZXJyOworCX0KKwl0LT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVdlIGRvIG1vc3Qgb2YgdGhlIGhhcmQgd29yayB3aGVuIHdlIGJlY29tZSBhIGRldmljZSBvbiB0aGUgaTJjLgorICovCisgCitzdGF0aWMgaW50IHNhYTUyNDlfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCisJCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgc2FhNTI0OV9hdHRhY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTUyNDlfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZkKTsKKwlrZnJlZSh2ZC0+cHJpdik7CisJa2ZyZWUodmQpOworCWtmcmVlKGNsaWVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNTI0OV9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpkZXZpY2UsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogbmV3IEkyQyBkcml2ZXIgc3VwcG9ydCAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl92aWRlb3RleHQgPSAKK3sKKwkub3duZXIgCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lIAkJPSBJRl9OQU1FLAkJLyogbmFtZSAqLworCS5pZCAJCT0gSTJDX0RSSVZFUklEX1NBQTUyNDksIC8qIGluIGkyYy5oICovCisJLmZsYWdzIAkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9IHNhYTUyNDlfcHJvYmUsCisJLmRldGFjaF9jbGllbnQgID0gc2FhNTI0OV9kZXRhY2gsCisJLmNvbW1hbmQgCT0gc2FhNTI0OV9jb21tYW5kCit9OworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0geworCS5kcml2ZXIJCT0gJmkyY19kcml2ZXJfdmlkZW90ZXh0LAorCS5uYW1lCQk9ICIodW5zZXQpIiwKK307CisKKy8qCisgKglXYWl0IHRoZSBnaXZlbiBudW1iZXIgb2YgamlmZmllcyAoMTBtcykuIFRoaXMgY2FsbHMgdGhlIHNjaGVkdWxlciwgc28gdGhlIGFjdHVhbAorICoJZGVsYXkgbWF5IGJlIGxvbmdlci4KKyAqLworCitzdGF0aWMgdm9pZCBqZGVsYXkodW5zaWduZWQgbG9uZyBkZWxheSkgCit7CisJc2lnc2V0X3Qgb2xkYmxvY2tlZCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhkZWxheSkpOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZGJsb2NrZWQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworfQorCisKKy8qCisgKglJMkMgaW50ZXJmYWNlcworICovCisgCitzdGF0aWMgaW50IGkyY19zZW5kYnVmKHN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCwgaW50IHJlZywgaW50IGNvdW50LCB1OCAqZGF0YSkgCit7CisJY2hhciBidWZbNjRdOworCQorCWJ1ZlswXSA9IHJlZzsKKwltZW1jcHkoYnVmKzEsIGRhdGEsIGNvdW50KTsKKwkKKwlpZihpMmNfbWFzdGVyX3NlbmQodC0+Y2xpZW50LCBidWYsIGNvdW50KzEpPT1jb3VudCsxKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3NlbmRkYXRhKHN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCwgLi4uKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKKwlpbnQgdjsKKwlpbnQgY3Q9MDsKKwl2YV9saXN0IGFyZ3A7CisJdmFfc3RhcnQoYXJncCx0KTsKKwkKKwl3aGlsZSgodj12YV9hcmcoYXJncCxpbnQpKSE9LTEpCisJCWJ1ZltjdCsrXT12OworCXJldHVybiBpMmNfc2VuZGJ1Zih0LCBidWZbMF0sIGN0LTEsIGJ1ZisxKTsKK30KKworLyogR2V0IGNvdW50IG51bWJlciBvZiBieXRlcyBmcm9tIEmyQy1kZXZpY2UgYXQgYWRkcmVzcyBhZHIsIHN0b3JlIHRoZW0gaW4gYnVmLiBTdGFydCAmIHN0b3AKKyAqIGhhbmRzaGFraW5nIGlzIGRvbmUgYnkgdGhpcyByb3V0aW5lLCBhY2sgd2lsbCBiZSBzZW50IGFmdGVyIHRoZSBsYXN0IGJ5dGUgdG8gaW5oaWJpdCBmdXJ0aGVyCisgKiBzZW5kaW5nIG9mIGRhdGEuIElmIHVhY2Nlc3MgaXMgVFJVRSwgZGF0YSBpcyB3cml0dGVuIHRvIHVzZXItc3BhY2Ugd2l0aCBwdXRfdXNlci4KKyAqIFJldHVybnMgLTEgaWYgSbJDLWRldmljZSBkaWRuJ3Qgc2VuZCBhY2tub3dsZWRnZSwgMCBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IGkyY19nZXRkYXRhKHN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCwgaW50IGNvdW50LCB1OCAqYnVmKSAKK3sKKwlpZihpMmNfbWFzdGVyX3JlY3YodC0+Y2xpZW50LCBidWYsIGNvdW50KSE9Y291bnQpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJU3RhbmRhcmQgY2hhcmFjdGVyLWRldmljZS1kcml2ZXIgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBkb19zYWE1MjQ5X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdGF0aWMgaW50IHZpcnR1YWxfbW9kZSA9IEZBTFNFOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQ9dmQtPnByaXY7CisKKwlzd2l0Y2goY21kKSAKKwl7CisJCWNhc2UgVlRYSU9DR0VUSU5GTzogCisJCXsKKwkJCXZ0eF9pbmZvX3QgKmluZm8gPSBhcmc7CisJCQlpbmZvLT52ZXJzaW9uX21ham9yID0gVlRYX1ZFUl9NQUo7CisJCQlpbmZvLT52ZXJzaW9uX21pbm9yID0gVlRYX1ZFUl9NSU47CisJCQlpbmZvLT5udW1wYWdlcyA9IE5VTV9EQVVTOworCQkJLyppbmZvLT5jY3RfdHlwZSA9IENDVF9UWVBFOyovCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVlRYSU9DQ0xSUEFHRTogCisJCXsKKwkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKKyAgICAgIAorCQkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQltZW1zZXQodC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOworCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IFRSVUU7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVlRYSU9DQ0xSRk9VTkQ6IAorCQl7CisJCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CisgICAgICAKKwkJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IFRSVUU7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVlRYSU9DUEFHRVJFUTogCisJCXsKKwkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKKwkJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfUEFHRSkpCisJCQkJcmVxLT5wYWdlID0gMDsKKwkJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfSE9VUikpCisJCQkJcmVxLT5ob3VyID0gMDsKKwkJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfTUlOVVRFKSkKKwkJCQlyZXEtPm1pbnV0ZSA9IDA7CisJCQlpZiAocmVxLT5wYWdlIDwgMCB8fCByZXEtPnBhZ2UgPiAweDhmZikgLyogN0ZGID8/ICovCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXEtPnBhZ2UgJj0gMHg3ZmY7CisJCQlpZiAocmVxLT5ob3VyIDwgMCB8fCByZXEtPmhvdXIgPiAweDNmIHx8IHJlcS0+bWludXRlIDwgMCB8fCByZXEtPm1pbnV0ZSA+IDB4N2YgfHwKKwkJCQlyZXEtPnBhZ2VtYXNrIDwgMCB8fCByZXEtPnBhZ2VtYXNrID49IFBHTUFTS19NQVggfHwgcmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbMF0gPSAocmVxLT5wYWdlbWFzayAmIFBHX0hVTkQgPyAweDEwIDogMCkgfCAocmVxLT5wYWdlIC8gMHgxMDApOworCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1sxXSA9IChyZXEtPnBhZ2VtYXNrICYgUEdfVEVOID8gMHgxMCA6IDApIHwgKChyZXEtPnBhZ2UgLyAweDEwKSAmIDB4Zik7CisJCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzJdID0gKHJlcS0+cGFnZW1hc2sgJiBQR19VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+cGFnZSAmIDB4Zik7CisJCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzNdID0gKHJlcS0+cGFnZW1hc2sgJiBIUl9URU4gPyAweDEwIDogMCkgfCAocmVxLT5ob3VyIC8gMHgxMCk7CisJCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzRdID0gKHJlcS0+cGFnZW1hc2sgJiBIUl9VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+aG91ciAmIDB4Zik7CisJCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzVdID0gKHJlcS0+cGFnZW1hc2sgJiBNSU5fVEVOID8gMHgxMCA6IDApIHwgKHJlcS0+bWludXRlIC8gMHgxMCk7CisJCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzZdID0gKHJlcS0+cGFnZW1hc2sgJiBNSU5fVU5JVCA/IDB4MTAgOiAwKSB8IChyZXEtPm1pbnV0ZSAmIDB4Zik7CisJCQl0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQgPSBGQUxTRTsKKwkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSBUUlVFOworCQkJdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdID0gVFJVRTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBWVFhJT0NHRVRTVEFUOiAKKwkJeworCQkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOworCQkJdTggaW5mb2JpdHNbMTBdOworCQkJdnR4X3BhZ2VpbmZvX3QgaW5mbzsKKwkJCWludCBhOworCisJCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghdC0+dmRhdVtyZXEtPnBnYnVmXS5zdG9wcGVkKSAKKwkJCXsKKwkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDIsIDAsIC0xKSB8fAorCQkJCQlpMmNfc2VuZGJ1Zih0LCAzLCBzaXplb2YodC0+dmRhdVswXS5zcmVncyksIHQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3MpIHx8CisJCQkJCWkyY19zZW5kZGF0YSh0LCA4LCAwLCAyNSwgMCwgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgLTEpIHx8CisJCQkJCWkyY19zZW5kZGF0YSh0LCAyLCAwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzBdIHwgOCwgLTEpIHx8CisJCQkJCWkyY19zZW5kZGF0YSh0LCA4LCAwLCAyNSwgMCwgLTEpKQorCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQlqZGVsYXkoUEFHRV9XQUlUKTsKKwkJCQlpZiAoaTJjX2dldGRhdGEodCwgMTAsIGluZm9iaXRzKSkKKwkJCQkJcmV0dXJuIC1FSU87CisKKwkJCQlpZiAoIShpbmZvYml0c1s4XSAmIDB4MTApICYmICEoaW5mb2JpdHNbN10gJiAweGYwKSAmJgkvKiBjaGVjayBGT1VORC1iaXQgKi8KKwkJCQkJKG1lbWNtcChpbmZvYml0cywgdC0+dmRhdVtyZXEtPnBnYnVmXS5sYXN0c3RhdCwgc2l6ZW9mKGluZm9iaXRzKSkgfHwgCisJCQkJCXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdC0+dmRhdVtyZXEtPnBnYnVmXS5leHBpcmUpKSkKKwkJCQl7CQkvKiBjaGVjayBpZiBuZXcgcGFnZSBhcnJpdmVkICovCisJCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMCwgMCwgLTEpIHx8CisJCQkJCQlpMmNfZ2V0ZGF0YSh0LCBWVFhfUEFHRVNJWkUsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYpKQorCQkJCQkJcmV0dXJuIC1FSU87CisJCQkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uZXhwaXJlID0gamlmZmllcyArIFBHQlVGX0VYUElSRTsKKwkJCQkJbWVtc2V0KHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUsICcgJywgVlRYX1ZJUlRVQUxTSVpFIC0gVlRYX1BBR0VTSVpFKTsKKwkJCQkJaWYgKHQtPnZpcnR1YWxfbW9kZSkgCisJCQkJCXsKKwkJCQkJCS8qIFBhY2tldCBYLzI0ICovCisJCQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDB4MjAsIDAsIC0xKSB8fAorCQkJCQkJCWkyY19nZXRkYXRhKHQsIDQwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmICsgVlRYX1BBR0VTSVpFICsgMjAgKiA0MCkpCisJCQkJCQkJcmV0dXJuIC1FSU87CisJCQkJCQkvKiBQYWNrZXQgWC8yNy8wICovCisJCQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDB4MjEsIDAsIC0xKSB8fAorCQkJCQkJCWkyY19nZXRkYXRhKHQsIDQwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmICsgVlRYX1BBR0VTSVpFICsgMTYgKiA0MCkpCisJCQkJCQkJcmV0dXJuIC1FSU87CisJCQkJCQkvKiBQYWNrZXQgOC8zMC8wLi4uOC8zMC8xNQorCQkJCQkJICogRklYTUU6IEFGQUlLLCB0aGUgNTI0OSBkb2VzIGhhbW1pbmctZGVjb2RpbmcgZm9yIHNvbWUgYnl0ZXMgaW4gcGFja2V0IDgvMzAsCisJCQkJCQkgKiAgICAgICAgc28gd2Ugc2hvdWxkIHVuZG8gdGhpcyBoZXJlLgorCQkJCQkJICovCisJCQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDB4MjIsIDAsIC0xKSB8fAorCQkJCQkJCWkyY19nZXRkYXRhKHQsIDQwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmICsgVlRYX1BBR0VTSVpFICsgMjMgKiA0MCkpCisJCQkJCQkJcmV0dXJuIC1FSU87CisJCQkJCX0KKwkJCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IEZBTFNFOworCQkJCQltZW1jcHkodC0+dmRhdVtyZXEtPnBnYnVmXS5sYXN0c3RhdCwgaW5mb2JpdHMsIHNpemVvZihpbmZvYml0cykpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltZW1jcHkoaW5mb2JpdHMsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ubGFzdHN0YXQsIHNpemVvZihpbmZvYml0cykpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltZW1jcHkoaW5mb2JpdHMsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ubGFzdHN0YXQsIHNpemVvZihpbmZvYml0cykpOworCQkJfQorCisJCQlpbmZvLnBhZ2VudW0gPSAoKGluZm9iaXRzWzhdIDw8IDgpICYgMHg3MDApIHwgKChpbmZvYml0c1sxXSA8PCA0KSAmIDB4ZjApIHwgKGluZm9iaXRzWzBdICYgMHgwZik7CisJCQlpZiAoaW5mby5wYWdlbnVtIDwgMHgxMDApCisJCQkJaW5mby5wYWdlbnVtICs9IDB4ODAwOworCQkJaW5mby5ob3VyID0gKChpbmZvYml0c1s1XSA8PCA0KSAmIDB4MzApIHwgKGluZm9iaXRzWzRdICYgMHgwZik7CisJCQlpbmZvLm1pbnV0ZSA9ICgoaW5mb2JpdHNbM10gPDwgNCkgJiAweDcwKSB8IChpbmZvYml0c1syXSAmIDB4MGYpOworCQkJaW5mby5jaGFyc2V0ID0gKChpbmZvYml0c1s3XSA+PiAxKSAmIDcpOworCQkJaW5mby5kZWxldGUgPSAhIShpbmZvYml0c1szXSAmIDgpOworCQkJaW5mby5oZWFkbGluZSA9ICEhKGluZm9iaXRzWzVdICYgNCk7CisJCQlpbmZvLnN1YnRpdGxlID0gISEoaW5mb2JpdHNbNV0gJiA4KTsKKwkJCWluZm8uc3VwcF9oZWFkZXIgPSAhIShpbmZvYml0c1s2XSAmIDEpOworCQkJaW5mby51cGRhdGUgPSAhIShpbmZvYml0c1s2XSAmIDIpOworCQkJaW5mby5pbnRlcl9zZXEgPSAhIShpbmZvYml0c1s2XSAmIDQpOworCQkJaW5mby5kaXNfZGlzcCA9ICEhKGluZm9iaXRzWzZdICYgOCk7CisJCQlpbmZvLnNlcmlhbCA9ICEhKGluZm9iaXRzWzddICYgMSk7CisJCQlpbmZvLm5vdGZvdW5kID0gISEoaW5mb2JpdHNbOF0gJiAweDEwKTsKKwkJCWluZm8ucGJsZiA9ICEhKGluZm9iaXRzWzldICYgMHgyMCk7CisJCQlpbmZvLmhhbW1pbmcgPSAwOworCQkJZm9yIChhID0gMDsgYSA8PSA3OyBhKyspIAorCQkJeworCQkJCWlmIChpbmZvYml0c1thXSAmIDB4ZjApIAorCQkJCXsKKwkJCQkJaW5mby5oYW1taW5nID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQpCisJCQkJaW5mby5ub3Rmb3VuZCA9IDE7CisJCQlpZihjb3B5X3RvX3VzZXIocmVxLT5idWZmZXIsICZpbmZvLCBzaXplb2YodnR4X3BhZ2VpbmZvX3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICghaW5mby5oYW1taW5nICYmICFpbmZvLm5vdGZvdW5kKSAKKwkJCXsKKwkJCQl0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0gPSBGQUxTRTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBWVFhJT0NHRVRQQUdFOiAKKwkJeworCQkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOworCQkJaW50IHN0YXJ0LCBlbmQ7CisKKwkJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTIHx8IHJlcS0+c3RhcnQgPCAwIHx8CisJCQkJcmVxLT5zdGFydCA+IHJlcS0+ZW5kIHx8IHJlcS0+ZW5kID49ICh2aXJ0dWFsX21vZGUgPyBWVFhfVklSVFVBTFNJWkUgOiBWVFhfUEFHRVNJWkUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYoY29weV90b191c2VyKHJlcS0+YnVmZmVyLCAmdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZltyZXEtPnN0YXJ0XSwgcmVxLT5lbmQgLSByZXEtPnN0YXJ0ICsgMSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCisJCQkgLyogCisJCQkgICoJQWx3YXlzIHJlYWQgdGhlIHRpbWUgZGlyZWN0bHkgZnJvbSBTQUE1MjQ5CisJCQkgICovCisJCQkgIAorCQkJaWYgKHJlcS0+c3RhcnQgPD0gMzkgJiYgcmVxLT5lbmQgPj0gMzIpIAorCQkJeworCQkJCWludCBsZW47CisJCQkJY2hhciBidWZbMTZdOyAgCisJCQkJc3RhcnQgPSBtYXgocmVxLT5zdGFydCwgMzIpOworCQkJCWVuZCA9IG1pbihyZXEtPmVuZCwgMzkpOworCQkJCWxlbj1lbmQtc3RhcnQrMTsKKwkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDAsIHN0YXJ0LCAtMSkgfHwKKwkJCQkJaTJjX2dldGRhdGEodCwgbGVuLCBidWYpKQorCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQlpZihjb3B5X3RvX3VzZXIocmVxLT5idWZmZXIrc3RhcnQtcmVxLT5zdGFydCwgYnVmLCBsZW4pKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCS8qIEluc2VydCB0aGUgY3VycmVudCBoZWFkZXIgaWYgREFVIGlzIHN0aWxsIHNlYXJjaGluZyBmb3IgYSBwYWdlICovCisJCQlpZiAocmVxLT5zdGFydCA8PSAzMSAmJiByZXEtPmVuZCA+PSA3ICYmIHQtPmlzX3NlYXJjaGluZ1tyZXEtPnBnYnVmXSkgCisJCQl7CisJCQkJY2hhciBidWZbMzJdOworCQkJCWludCBsZW47CisJCQkJc3RhcnQgPSBtYXgocmVxLT5zdGFydCwgNyk7CisJCQkJZW5kID0gbWluKHJlcS0+ZW5kLCAzMSk7CisJCQkJbGVuPWVuZC1zdGFydCsxOworCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMCwgc3RhcnQsIC0xKSB8fAorCQkJCQlpMmNfZ2V0ZGF0YSh0LCBsZW4sIGJ1ZikpCisJCQkJCXJldHVybiAtRUlPOworCQkJCWlmKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlcitzdGFydC1yZXEtPnN0YXJ0LCBidWYsIGxlbikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZUWElPQ1NUT1BEQVU6IAorCQl7CisJCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CisKKwkJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zdG9wcGVkID0gVFJVRTsKKwkJCXQtPmlzX3NlYXJjaGluZ1tyZXEtPnBnYnVmXSA9IEZBTFNFOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZUWElPQ1BVVFBBR0U6IAorCQljYXNlIFZUWElPQ1NFVERJU1A6IAorCQljYXNlIFZUWElPQ1BVVFNUQVQ6IAorCQkJcmV0dXJuIDA7CisJCQkKKwkJY2FzZSBWVFhJT0NDTFJDQUNIRTogCisJCXsKKwkJCWlmIChpMmNfc2VuZGRhdGEodCwgMCwgTlVNX0RBVVMsIDAsIDgsIC0xKSB8fCBpMmNfc2VuZGRhdGEodCwgMTEsCisJCQkJJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsCisJCQkJJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsIC0xKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWlmIChpMmNfc2VuZGRhdGEodCwgMywgMHgyMCwgLTEpKQorCQkJCXJldHVybiAtRUlPOworCQkJamRlbGF5KDEwICogQ0xFQVJfREVMQVkpOwkJCS8qIEkgaGF2ZSBubyBpZGVhIGhvdyBsb25nIHdlIGhhdmUgdG8gd2FpdCBoZXJlICovCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVlRYSU9DU0VUVklSVDogCisJCXsKKwkJCS8qIFRoZSBTQUE1MjQ5IGhhcyB2aXJ0dWFsLXJvdyByZWNlcHRpb24gdHVybmVkIG9uIGFsd2F5cyAqLworCQkJdC0+dmlydHVhbF9tb2RlID0gKGludCkobG9uZylhcmc7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFRyYW5zbGF0ZXMgb2xkIHZ0eCBJT0NUTHMgdG8gbmV3IG9uZXMKKyAqCisgKiBUaGlzIGtlZXBzIG5ldyBrZXJuZWwgdmVyc2lvbnMgY29tcGF0aWJsZSB3aXRoIG9sZCB1c2Vyc3BhY2UgcHJvZ3JhbXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHZ0eF9maXhfY29tbWFuZCh1bnNpZ25lZCBpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWVFhJT0NHRVRJTkZPX09MRDoKKwkJY21kID0gVlRYSU9DR0VUSU5GTzsKKwkJYnJlYWs7CisJY2FzZSBWVFhJT0NDTFJQQUdFX09MRDoKKwkJY21kID0gVlRYSU9DQ0xSUEFHRTsKKwkJYnJlYWs7CisJY2FzZSBWVFhJT0NDTFJGT1VORF9PTEQ6CisJCWNtZCA9IFZUWElPQ0NMUkZPVU5EOworCQlicmVhazsKKwljYXNlIFZUWElPQ1BBR0VSRVFfT0xEOgorCQljbWQgPSBWVFhJT0NQQUdFUkVROworCQlicmVhazsKKwljYXNlIFZUWElPQ0dFVFNUQVRfT0xEOgorCQljbWQgPSBWVFhJT0NHRVRTVEFUOworCQlicmVhazsKKwljYXNlIFZUWElPQ0dFVFBBR0VfT0xEOgorCQljbWQgPSBWVFhJT0NHRVRQQUdFOworCQlicmVhazsKKwljYXNlIFZUWElPQ1NUT1BEQVVfT0xEOgorCQljbWQgPSBWVFhJT0NTVE9QREFVOworCQlicmVhazsKKwljYXNlIFZUWElPQ1BVVFBBR0VfT0xEOgorCQljbWQgPSBWVFhJT0NQVVRQQUdFOworCQlicmVhazsKKwljYXNlIFZUWElPQ1NFVERJU1BfT0xEOgorCQljbWQgPSBWVFhJT0NTRVRESVNQOworCQlicmVhazsKKwljYXNlIFZUWElPQ1BVVFNUQVRfT0xEOgorCQljbWQgPSBWVFhJT0NQVVRTVEFUOworCQlicmVhazsKKwljYXNlIFZUWElPQ0NMUkNBQ0hFX09MRDoKKwkJY21kID0gVlRYSU9DQ0xSQ0FDSEU7CisJCWJyZWFrOworCWNhc2UgVlRYSU9DU0VUVklSVF9PTEQ6CisJCWNtZCA9IFZUWElPQ1NFVFZJUlQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY21kOworfQorCisvKgorICoJSGFuZGxlIHRoZSBsb2NraW5nCisgKi8KKyAKK3N0YXRpYyBpbnQgc2FhNTI0OV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykgCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdD12ZC0+cHJpdjsKKwlpbnQgZXJyOworCQorCWNtZCA9IHZ0eF9maXhfY29tbWFuZChjbWQpOworCWRvd24oJnQtPmxvY2spOworCWVyciA9IHZpZGVvX3VzZXJjb3B5KGlub2RlLGZpbGUsY21kLGFyZyxkb19zYWE1MjQ5X2lvY3RsKTsKKwl1cCgmdC0+bG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzYWE1MjQ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpIAoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQ9dmQtPnByaXY7CisJaW50IGVycixwZ2J1ZjsKKworCWVyciA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuKGlub2RlLGZpbGUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCQorCWlmICh0LT5jbGllbnQ9PU5VTEwpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChpMmNfc2VuZGRhdGEodCwgMCwgMCwgLTEpIHx8CQkvKiBTZWxlY3QgUjExICovCisJCQkJCQkvKiBUdXJuIG9mZiBwYXJpdHkgY2hlY2tzICh3ZSBkbyB0aGlzIG91cnNlbHZlcykgKi8KKwkJaTJjX3NlbmRkYXRhKHQsIDEsIGRpc3BfbW9kZXNbdC0+ZGlzcF9tb2RlXVswXSwgMCwgLTEpIHx8CisJCQkJCQkvKiBEaXNwbGF5IFRWLXBpY3R1cmUsIG5vIHZpcnR1YWwgcm93cyAqLworCQlpMmNfc2VuZGRhdGEodCwgNCwgTlVNX0RBVVMsIGRpc3BfbW9kZXNbdC0+ZGlzcF9tb2RlXVsxXSwgZGlzcF9tb2Rlc1t0LT5kaXNwX21vZGVdWzJdLCA3LCAtMSkpIC8qIFNldCBkaXNwbGF5IHRvIHBhZ2UgNCAqLworCQorCXsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBmYWlsOworCX0KKworCWZvciAocGdidWYgPSAwOyBwZ2J1ZiA8IE5VTV9EQVVTOyBwZ2J1ZisrKSAKKwl7CisJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOworCQltZW1zZXQodC0+dmRhdVtwZ2J1Zl0uc3JlZ3MsIDAsIHNpemVvZih0LT52ZGF1WzBdLnNyZWdzKSk7CisJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5sYXN0c3RhdCwgMCwgc2l6ZW9mKHQtPnZkYXVbMF0ubGFzdHN0YXQpKTsKKwkJdC0+dmRhdVtwZ2J1Zl0uZXhwaXJlID0gMDsKKwkJdC0+dmRhdVtwZ2J1Zl0uY2xyZm91bmQgPSBUUlVFOworCQl0LT52ZGF1W3BnYnVmXS5zdG9wcGVkID0gVFJVRTsKKwkJdC0+aXNfc2VhcmNoaW5nW3BnYnVmXSA9IEZBTFNFOworCX0KKwl0LT52aXJ0dWFsX21vZGU9RkFMU0U7CisJcmV0dXJuIDA7CisKKyBmYWlsOgorCXZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlKGlub2RlLGZpbGUpOworCXJldHVybiBlcnI7Cit9CisKKworCitzdGF0aWMgaW50IHNhYTUyNDlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkgCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdD12ZC0+cHJpdjsKKwlpMmNfc2VuZGRhdGEodCwgMSwgMHgyMCwgLTEpOwkJLyogVHVybiBvZmYgQ0NUICovCisJaTJjX3NlbmRkYXRhKHQsIDUsIDMsIDMsIC0xKTsJCS8qIFR1cm4gb2ZmIFRWLWRpc3BsYXkgKi8KKwl2aWRlb19leGNsdXNpdmVfcmVsZWFzZShpbm9kZSxmaWxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zYWFfNTI0OSAodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJTQUE1MjQ5IGRyaXZlciAoIiBJRl9OQU1FICIgaW50ZXJmYWNlKSBmb3IgVmlkZW9UZXh0IHZlcnNpb24gJWQuJWRcbiIsCisJCQlWVFhfVkVSX01BSiwgVlRYX1ZFUl9NSU4pOworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl92aWRlb3RleHQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zYWFfNTI0OSAodm9pZCkgCit7CisJaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfdmlkZW90ZXh0KTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9zYWFfNTI0OSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX3NhYV81MjQ5KTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2FhX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHNhYTUyNDlfb3BlbiwKKwkucmVsZWFzZSAgICAgICAJPSBzYWE1MjQ5X3JlbGVhc2UsCisJLmlvY3RsICAgICAgICAgID0gc2FhNTI0OV9pb2N0bCwKKwkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCit9OworCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzYWFfdGVtcGxhdGUgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSBJRl9OQU1FLAorCS50eXBlCQk9IFZJRF9UWVBFX1RFTEVURVhULAkvKnwgVklEX1RZUEVfVFVORVIgPz8gKi8KKwkuaGFyZHdhcmUJPSBWSURfSEFSRFdBUkVfU0FBNTI0OSwKKwkuZm9wcyAgICAgICAgICAgPSAmc2FhX2ZvcHMsCit9OworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MjczYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTAuYwpAQCAtMCwwICsxLDYyMyBAQAorLyoKKyAqIHNhYTcxMTAgLSBQaGlsaXBzIFNBQTcxMTAoQSkgdmlkZW8gZGVjb2RlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggUGF1bGluZSBNaWRkZWxpbmsgPG1pZGRlbGluQHBvbHl3YXJlLm5sPgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBXb2xmZ2FuZyBTY2hlcnIgPHNjaGVyckBuZXQ0eW91Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKyAqICAgIC0gc29tZSBjb3JyZWN0aW9ucyBmb3IgUGlubmFjbGUgU3lzdGVtcyBJbmMuIERDMTBwbHVzIGNhcmQuCisgKgorICogQ2hhbmdlcyBieSBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAtIG1vdmVkIG92ZXIgdG8gbGludXg+PTIuNC54IGkyYyBwcm90b2NvbCAoMS8xLzIwMDMpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgU0FBNzExMCB2aWRlbyBkZWNvZGVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiUGF1bGluZSBNaWRkZWxpbmsiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4KKworI2RlZmluZSBJMkNfTkFNRShzKSAocyktPm5hbWUKKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC0xKSIpOworCisjZGVmaW5lIGRwcmludGsobnVtLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGRlYnVnID49IG51bSkgXAorCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0FBNzExMF9NQVhfSU5QVVQJOQkvKiA2IENWQlMsIDMgU1ZIUyAqLworI2RlZmluZSBTQUE3MTEwX01BWF9PVVRQVVQJMAkvKiBpdHMgYSBkZWNvZGVyIG9ubHkgKi8KKworI2RlZmluZQlJMkNfU0FBNzExMAkJMHg5QwkvKiBvciAweDlFICovCisKKyNkZWZpbmUgU0FBNzExMF9OUl9SRUcJCTB4MzUKKworc3RydWN0IHNhYTcxMTAgeworCXU4IHJlZ1tTQUE3MTEwX05SX1JFR107CisKKwlpbnQgbm9ybTsKKwlpbnQgaW5wdXQ7CisJaW50IGVuYWJsZTsKKwlpbnQgYnJpZ2h0OworCWludCBjb250cmFzdDsKKwlpbnQgaHVlOworCWludCBzYXQ7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBJMkMgc3VwcG9ydCBmdW5jdGlvbnMJCQkJCQkgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAorc2FhNzExMF93cml0ZSAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkgICAgICAgdTggICAgICAgICAgICAgICAgIHJlZywKKwkgICAgICAgdTggICAgICAgICAgICAgICAgIHZhbHVlKQoreworCXN0cnVjdCBzYWE3MTEwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkZWNvZGVyLT5yZWdbcmVnXSA9IHZhbHVlOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3NhYTcxMTBfd3JpdGVfYmxvY2sgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCSAgICAgY29uc3QgdTggICAgICAgICAgKmRhdGEsCisJCSAgICAgdW5zaWduZWQgaW50ICAgICAgIGxlbikKK3sKKwlpbnQgcmV0ID0gLTE7CisJdTggcmVnID0gKmRhdGE7CQkvKiBmaXJzdCByZWdpc3RlciB0byB3cml0ZSB0byAqLworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKHJlZyArIChsZW4gLSAxKSA+IFNBQTcxMTBfTlJfUkVHKQorCQlyZXR1cm4gcmV0OworCisJLyogdGhlIHNhYTcxMTAgaGFzIGFuIGF1dG9pbmNyZW1lbnQgZnVuY3Rpb24sIHVzZSBpdCBpZgorCSAqIHRoZSBhZGFwdGVyIHVuZGVyc3RhbmRzIHJhdyBJMkMgKi8KKwlpZiAoaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7CisJCXN0cnVjdCBzYWE3MTEwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJCXN0cnVjdCBpMmNfbXNnIG1zZzsKKworCQltc2cubGVuID0gbGVuOworCQltc2cuYnVmID0gKGNoYXIgKikgZGF0YTsKKwkJbXNnLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJCW1zZy5mbGFncyA9IDA7CisJCXJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsICZtc2csIDEpOworCisJCS8qIENhY2hlIHRoZSB3cml0dGVuIGRhdGEgKi8KKwkJbWVtY3B5KGRlY29kZXItPnJlZyArIHJlZywgZGF0YSArIDEsIGxlbiAtIDEpOworCX0gZWxzZSB7CisJCWZvciAoKytkYXRhLCAtLWxlbjsgbGVuOyBsZW4tLSkgeworCQkJaWYgKChyZXQgPSBzYWE3MTEwX3dyaXRlKGNsaWVudCwgcmVnKyssCisJCQkJCQkgKmRhdGErKykpIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzYWE3MTEwX3JlYWQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFNBQTcxMTAgZnVuY3Rpb25zCQkJCQkJCSAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZSRVNQXzA2SF9DT01QU1QgMHgwMwkvLzB4MTMKKyNkZWZpbmUgRlJFU1BfMDZIX1NWSURFTyAweDgzCS8vMHhDMAorCisKK3N0YXRpYyBpbnQKK3NhYTcxMTBfc2VsbXV4IChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCSAgICAgICAgaW50ICAgICAgICAgICAgICAgIGNoYW4pCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbW9kZXNbOV1bOF0gPSB7CisJCS8qIG1vZGUgMCAqLworCQl7RlJFU1BfMDZIX0NPTVBTVCwgMHhEOSwgMHgxNywgMHg0MCwgMHgwMywKKwkJCSAgICAgIDB4NDQsIDB4NzUsIDB4MTZ9LAorCQkvKiBtb2RlIDEgKi8KKwkJe0ZSRVNQXzA2SF9DT01QU1QsIDB4RDgsIDB4MTcsIDB4NDAsIDB4MDMsCisJCQkgICAgICAweDQ0LCAweDc1LCAweDE2fSwKKwkJLyogbW9kZSAyICovCisJCXtGUkVTUF8wNkhfQ09NUFNULCAweEJBLCAweDA3LCAweDkxLCAweDAzLAorCQkJICAgICAgMHg2MCwgMHhCNSwgMHgwNX0sCisJCS8qIG1vZGUgMyAqLworCQl7RlJFU1BfMDZIX0NPTVBTVCwgMHhCOCwgMHgwNywgMHg5MSwgMHgwMywKKwkJCSAgICAgIDB4NjAsIDB4QjUsIDB4MDV9LAorCQkvKiBtb2RlIDQgKi8KKwkJe0ZSRVNQXzA2SF9DT01QU1QsIDB4N0MsIDB4MDcsIDB4RDIsIDB4ODMsCisJCQkgICAgICAweDYwLCAweEI1LCAweDAzfSwKKwkJLyogbW9kZSA1ICovCisJCXtGUkVTUF8wNkhfQ09NUFNULCAweDc4LCAweDA3LCAweEQyLCAweDgzLAorCQkJICAgICAgMHg2MCwgMHhCNSwgMHgwM30sCisJCS8qIG1vZGUgNiAqLworCQl7RlJFU1BfMDZIX1NWSURFTywgMHg1OSwgMHgxNywgMHg0MiwgMHhBMywKKwkJCSAgICAgIDB4NDQsIDB4NzUsIDB4MTJ9LAorCQkvKiBtb2RlIDcgKi8KKwkJe0ZSRVNQXzA2SF9TVklERU8sIDB4OUEsIDB4MTcsIDB4QjEsIDB4MTMsCisJCQkgICAgICAweDYwLCAweEI1LCAweDE0fSwKKwkJLyogbW9kZSA4ICovCisJCXtGUkVTUF8wNkhfU1ZJREVPLCAweDNDLCAweDI3LCAweEMxLCAweDIzLAorCQkJICAgICAgMHg0NCwgMHg3NSwgMHgyMX0KKwl9OworCXN0cnVjdCBzYWE3MTEwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gbW9kZXNbY2hhbl07CisKKwlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgwNiwgcHRyWzBdKTsJLyogTHVtaW5hbmNlIGNvbnRyb2wgICAgKi8KKwlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgyMCwgcHRyWzFdKTsJLyogQW5hbG9nIENvbnRyb2wgIzEgICAgKi8KKwlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgyMSwgcHRyWzJdKTsJLyogQW5hbG9nIENvbnRyb2wgIzIgICAgKi8KKwlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgyMiwgcHRyWzNdKTsJLyogTWl4ZXIgQ29udHJvbCAjMSAgICAgKi8KKwlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgyQywgcHRyWzRdKTsJLyogTWl4ZXIgQ29udHJvbCAjMiAgICAgKi8KKwlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgzMCwgcHRyWzVdKTsJLyogQURDcyBnYWluIGNvbnRyb2wgICAgKi8KKwlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgzMSwgcHRyWzZdKTsJLyogTWl4ZXIgQ29udHJvbCAjMyAgICAgKi8KKwlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgyMSwgcHRyWzddKTsJLyogQW5hbG9nIENvbnRyb2wgIzIgICAgKi8KKwlkZWNvZGVyLT5pbnB1dCA9IGNoYW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdHNlcVsxICsgU0FBNzExMF9OUl9SRUddID0geworCTAsIDB4NEMsIDB4M0MsIDB4MEQsIDB4RUYsIDB4QkQsIDB4RjIsIDB4MDMsIDB4MDAsCisJLyogMHgwOCAqLyAweEY4LCAweEY4LCAweDYwLCAweDYwLCAweDAwLCAweDg2LCAweDE4LCAweDkwLAorCS8qIDB4MTAgKi8gMHgwMCwgMHg1OSwgMHg0MCwgMHg0NiwgMHg0MiwgMHgxQSwgMHhGRiwgMHhEQSwKKwkvKiAweDE4ICovIDB4RjIsIDB4OEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogMHgyMCAqLyAweEQ5LCAweDE2LCAweDQwLCAweDQxLCAweDgwLCAweDQxLCAweDgwLCAweDRGLAorCS8qIDB4MjggKi8gMHhGRSwgMHgwMSwgMHhDRiwgMHgwRiwgMHgwMywgMHgwMSwgMHgwMywgMHgwQywKKwkvKiAweDMwICovIDB4NDQsIDB4NzEsIDB4MDIsIDB4OEMsIDB4MDIKK307CisKK3N0YXRpYyBpbnQKK2RldGVybWluZV9ub3JtIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCURFRklORV9XQUlUKHdhaXQpOworCXN0cnVjdCBzYWE3MTEwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHN0YXR1czsKKworCS8qIG1vZGUgY2hhbmdlZCwgc3RhcnQgYXV0b21hdGljIGRldGVjdGlvbiAqLworCXNhYTcxMTBfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0c2VxLCBzaXplb2YoaW5pdHNlcSkpOworCXNhYTcxMTBfc2VsbXV4KGNsaWVudCwgZGVjb2Rlci0+aW5wdXQpOworCXByZXBhcmVfdG9fd2FpdCgmZGVjb2Rlci0+d3EsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWi80KTsKKwlmaW5pc2hfd2FpdCgmZGVjb2Rlci0+d3EsICZ3YWl0KTsKKwlzdGF0dXMgPSBzYWE3MTEwX3JlYWQoY2xpZW50KTsKKwlpZiAoc3RhdHVzICYgMHg0MCkgeworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHN0YXR1cz0weCUwMnggKG5vIHNpZ25hbClcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBzdGF0dXMpOworCQlyZXR1cm4gZGVjb2Rlci0+bm9ybTsJLy8gbm8gY2hhbmdlCisJfQorCWlmICgoc3RhdHVzICYgMykgPT0gMCkgeworCQlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgwNiwgMHg4Myk7CisJCWlmIChzdGF0dXMgJiAweDIwKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9JTkZPCisJCQkJIiVzOiBzdGF0dXM9MHglMDJ4IChOVFNDL25vIGNvbG9yKVxuIiwKKwkJCQlJMkNfTkFNRShjbGllbnQpLCBzdGF0dXMpOworCQkJLy9zYWE3MTEwX3dyaXRlKGNsaWVudCwweDJFLDB4ODEpOworCQkJcmV0dXJuIFZJREVPX01PREVfTlRTQzsKKwkJfQorCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHN0YXR1cz0weCUwMnggKFBBTC9ubyBjb2xvcilcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBzdGF0dXMpOworCQkvL3NhYTcxMTBfd3JpdGUoY2xpZW50LDB4MkUsMHg5QSk7CisJCXJldHVybiBWSURFT19NT0RFX1BBTDsKKwl9CisJLy9zYWE3MTEwX3dyaXRlKGNsaWVudCwweDA2LDB4MDMpOworCWlmIChzdGF0dXMgJiAweDIwKSB7CS8qIDYwSHogKi8KKwkJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiBzdGF0dXM9MHglMDJ4IChOVFNDKVxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIHN0YXR1cyk7CisJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDBELCAweDg2KTsKKwkJc2FhNzExMF93cml0ZShjbGllbnQsIDB4MEYsIDB4NTApOworCQlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgxMSwgMHgyQyk7CisJCS8vc2FhNzExMF93cml0ZShjbGllbnQsMHgyRSwweDgxKTsKKwkJcmV0dXJuIFZJREVPX01PREVfTlRTQzsKKwl9CisKKwkvKiA1MEh6IC0+IFBBTC9TRUNBTSAqLworCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDBELCAweDg2KTsKKwlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgwRiwgMHgxMCk7CisJc2FhNzExMF93cml0ZShjbGllbnQsIDB4MTEsIDB4NTkpOworCS8vc2FhNzExMF93cml0ZShjbGllbnQsMHgyRSwweDlBKTsKKworCXByZXBhcmVfdG9fd2FpdCgmZGVjb2Rlci0+d3EsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWi80KTsKKwlmaW5pc2hfd2FpdCgmZGVjb2Rlci0+d3EsICZ3YWl0KTsKKworCXN0YXR1cyA9IHNhYTcxMTBfcmVhZChjbGllbnQpOworCWlmICgoc3RhdHVzICYgMHgwMykgPT0gMHgwMSkgeworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHN0YXR1cz0weCUwMnggKFNFQ0FNKVxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIHN0YXR1cyk7CisJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDBELCAweDg3KTsKKwkJcmV0dXJuIFZJREVPX01PREVfU0VDQU07CisJfQorCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogc3RhdHVzPTB4JTAyeCAoUEFMKVxuIiwgSTJDX05BTUUoY2xpZW50KSwKKwkJc3RhdHVzKTsKKwlyZXR1cm4gVklERU9fTU9ERV9QQUw7Cit9CisKK3N0YXRpYyBpbnQKK3NhYTcxMTBfY29tbWFuZCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJIHVuc2lnbmVkIGludCAgICAgICBjbWQsCisJCSB2b2lkICAgICAgICAgICAgICAqYXJnKQoreworCXN0cnVjdCBzYWE3MTEwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgMDoKKwkJLy9zYWE3MTEwX3dyaXRlX2Jsb2NrKGNsaWVudCwgaW5pdHNlcSwgc2l6ZW9mKGluaXRzZXEpKTsKKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfR0VUX0NBUEFCSUxJVElFUzoKKwl7CisJCXN0cnVjdCB2aWRlb19kZWNvZGVyX2NhcGFiaWxpdHkgKmRjID0gYXJnOworCisJCWRjLT5mbGFncyA9CisJCSAgICBWSURFT19ERUNPREVSX1BBTCB8IFZJREVPX0RFQ09ERVJfTlRTQyB8CisJCSAgICBWSURFT19ERUNPREVSX1NFQ0FNIHwgVklERU9fREVDT0RFUl9BVVRPOworCQlkYy0+aW5wdXRzID0gU0FBNzExMF9NQVhfSU5QVVQ7CisJCWRjLT5vdXRwdXRzID0gU0FBNzExMF9NQVhfT1VUUFVUOworCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfR0VUX1NUQVRVUzoKKwl7CisJCWludCBzdGF0dXM7CisJCWludCByZXMgPSAwOworCisJCXN0YXR1cyA9IHNhYTcxMTBfcmVhZChjbGllbnQpOworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHN0YXR1cz0weCUwMnggbm9ybT0lZFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIHN0YXR1cywgZGVjb2Rlci0+bm9ybSk7CisJCWlmICghKHN0YXR1cyAmIDB4NDApKQorCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX0dPT0Q7CisJCWlmIChzdGF0dXMgJiAweDAzKQorCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX0NPTE9SOworCisJCXN3aXRjaCAoZGVjb2Rlci0+bm9ybSkgeworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19OVFNDOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fTU9ERV9QQUw6CisJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfUEFMOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fTU9ERV9TRUNBTToKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19TRUNBTTsKKwkJCWJyZWFrOworCQl9CisJCSooaW50ICopIGFyZyA9IHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX1NFVF9OT1JNOgorCQl2ID0gKihpbnQgKikgYXJnOworCQlpZiAoZGVjb2Rlci0+bm9ybSAhPSB2KSB7CisJCQlkZWNvZGVyLT5ub3JtID0gdjsKKwkJCS8vc2FhNzExMF93cml0ZShjbGllbnQsIDB4MDYsIDB4MDMpOworCQkJc3dpdGNoICh2KSB7CisJCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCQlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgwRCwgMHg4Nik7CisJCQkJc2FhNzExMF93cml0ZShjbGllbnQsIDB4MEYsIDB4NTApOworCQkJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDExLCAweDJDKTsKKwkJCQkvL3NhYTcxMTBfd3JpdGUoY2xpZW50LCAweDJFLCAweDgxKTsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fSU5GTyAiJXM6IHN3aXRjaGVkIHRvIE5UU0NcbiIsCisJCQkJCUkyQ19OQU1FKGNsaWVudCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJCQlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgwRCwgMHg4Nik7CisJCQkJc2FhNzExMF93cml0ZShjbGllbnQsIDB4MEYsIDB4MTApOworCQkJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDExLCAweDU5KTsKKwkJCQkvL3NhYTcxMTBfd3JpdGUoY2xpZW50LCAweDJFLCAweDlBKTsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fSU5GTyAiJXM6IHN3aXRjaGVkIHRvIFBBTFxuIiwKKwkJCQkJSTJDX05BTUUoY2xpZW50KSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZJREVPX01PREVfU0VDQU06CisJCQkJc2FhNzExMF93cml0ZShjbGllbnQsIDB4MEQsIDB4ODcpOworCQkJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDBGLCAweDEwKTsKKwkJCQlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgxMSwgMHg1OSk7CisJCQkJLy9zYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgyRSwgMHg5QSk7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0lORk8KKwkJCQkJIiVzOiBzd2l0Y2hlZCB0byBTRUNBTVxuIiwKKwkJCQkJSTJDX05BTUUoY2xpZW50KSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZJREVPX01PREVfQVVUTzoKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fSU5GTworCQkJCQkiJXM6IFRWIHN0YW5kYXJkIGRldGVjdGlvbi4uLlxuIiwKKwkJCQkJSTJDX05BTUUoY2xpZW50KSk7CisJCQkJZGVjb2Rlci0+bm9ybSA9IGRldGVybWluZV9ub3JtKGNsaWVudCk7CisJCQkJKihpbnQgKikgYXJnID0gZGVjb2Rlci0+bm9ybTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfSU5QVVQ6CisJCXYgPSAqKGludCAqKSBhcmc7CisJCWlmICh2IDwgMCB8fCB2ID4gU0FBNzExMF9NQVhfSU5QVVQpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0lORk8gIiVzOiBpbnB1dD0lZCBub3QgYXZhaWxhYmxlXG4iLAorCQkJCUkyQ19OQU1FKGNsaWVudCksIHYpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGRlY29kZXItPmlucHV0ICE9IHYpIHsKKwkJCXNhYTcxMTBfc2VsbXV4KGNsaWVudCwgdik7CisJCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHN3aXRjaGVkIHRvIGlucHV0PSVkXG4iLAorCQkJCUkyQ19OQU1FKGNsaWVudCksIHYpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX1NFVF9PVVRQVVQ6CisJCXYgPSAqKGludCAqKSBhcmc7CisJCS8qIG5vdCBtdWNoIGNob2ljZSBvZiBvdXRwdXRzICovCisJCWlmICh2ICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfRU5BQkxFX09VVFBVVDoKKwkJdiA9ICooaW50ICopIGFyZzsKKwkJaWYgKGRlY29kZXItPmVuYWJsZSAhPSB2KSB7CisJCQlkZWNvZGVyLT5lbmFibGUgPSB2OworCQkJc2FhNzExMF93cml0ZShjbGllbnQsIDB4MEUsIHYgPyAweDE4IDogMHg4MCk7CisJCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IFlVViAlc1xuIiwgSTJDX05BTUUoY2xpZW50KSwKKwkJCQl2ID8gIm9uIiA6ICJvZmYiKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfUElDVFVSRToKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwaWMgPSBhcmc7CisKKwkJaWYgKGRlY29kZXItPmJyaWdodCAhPSBwaWMtPmJyaWdodG5lc3MpIHsKKwkJCS8qIFdlIHdhbnQgMCB0byAyNTUgd2UgZ2V0IDAtNjU1MzUgKi8KKwkJCWRlY29kZXItPmJyaWdodCA9IHBpYy0+YnJpZ2h0bmVzczsKKwkJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDE5LCBkZWNvZGVyLT5icmlnaHQgPj4gOCk7CisJCX0KKwkJaWYgKGRlY29kZXItPmNvbnRyYXN0ICE9IHBpYy0+Y29udHJhc3QpIHsKKwkJCS8qIFdlIHdhbnQgMCB0byAxMjcgd2UgZ2V0IDAtNjU1MzUgKi8KKwkJCWRlY29kZXItPmNvbnRyYXN0ID0gcGljLT5jb250cmFzdDsKKwkJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDEzLAorCQkJCSAgICAgIGRlY29kZXItPmNvbnRyYXN0ID4+IDkpOworCQl9CisJCWlmIChkZWNvZGVyLT5zYXQgIT0gcGljLT5jb2xvdXIpIHsKKwkJCS8qIFdlIHdhbnQgMCB0byAxMjcgd2UgZ2V0IDAtNjU1MzUgKi8KKwkJCWRlY29kZXItPnNhdCA9IHBpYy0+Y29sb3VyOworCQkJc2FhNzExMF93cml0ZShjbGllbnQsIDB4MTIsIGRlY29kZXItPnNhdCA+PiA5KTsKKwkJfQorCQlpZiAoZGVjb2Rlci0+aHVlICE9IHBpYy0+aHVlKSB7CisJCQkvKiBXZSB3YW50IC0xMjggdG8gMTI3IHdlIGdldCAwLTY1NTM1ICovCisJCQlkZWNvZGVyLT5odWUgPSBwaWMtPmh1ZTsKKwkJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDA3LAorCQkJCSAgICAgIChkZWNvZGVyLT5odWUgPj4gOCkgLSAxMjgpOworCQl9CisJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9EVU1QOgorCQlmb3IgKHYgPSAwOyB2IDwgMHgzNDsgdiArPSAxNikgeworCQkJaW50IGo7CisJCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6ICUwM3hcbiIsIEkyQ19OQU1FKGNsaWVudCksCisJCQkJdik7CisJCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJCWRwcmludGsoMSwgS0VSTl9JTkZPICIgJTAyeCIsCisJCQkJCWRlY29kZXItPnJlZ1t2ICsgal0pOworCQkJfQorCQkJZHByaW50aygxLCBLRVJOX0lORk8gIlxuIik7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAidW5rbm93biBzYWE3MTEwX2NvbW1hbmQ/PyglZClcbiIsCisJCQljbWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBHZW5lcmljIGkyYyBwcm9iZQorICogY29uY2VybmluZyB0aGUgYWRkcmVzc2VzOiBpMmMgd2FudHMgNyBiaXQgKHdpdGhvdXQgdGhlIHIvdyBiaXQpLCBzbyAnPj4xJworICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geworCUkyQ19TQUE3MTEwID4+IDEsCisJKEkyQ19TQUE3MTEwID4+IDEpICsgMSwKKwlJMkNfQ0xJRU5UX0VORAorfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjX3JhbmdlW10gPSB7IEkyQ19DTElFTlRfRU5EIH07CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHJvYmVfcmFuZ2VbMl0gPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGlnbm9yZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlX3JhbmdlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQgLCBJMkNfQ0xJRU5UX0VORCB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0geworCS5ub3JtYWxfaTJjCQk9IG5vcm1hbF9pMmMsCisJLm5vcm1hbF9pMmNfcmFuZ2UJPSBub3JtYWxfaTJjX3JhbmdlLAorCS5wcm9iZQkJCT0gcHJvYmUsCisJLnByb2JlX3JhbmdlCQk9IHByb2JlX3JhbmdlLAorCS5pZ25vcmUJCQk9IGlnbm9yZSwKKwkuaWdub3JlX3JhbmdlCQk9IGlnbm9yZV9yYW5nZSwKKwkuZm9yY2UJCQk9IGZvcmNlCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9zYWE3MTEwOworCitzdGF0aWMgaW50CitzYWE3MTEwX2RldGVjdF9jbGllbnQgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJICAgICAgIGludCAgICAgICAgICAgICAgICAgYWRkcmVzcywKKwkJICAgICAgIGludCAgICAgICAgICAgICAgICAga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBzYWE3MTEwICpkZWNvZGVyOworCWludCBydjsKKworCWRwcmludGsoMSwKKwkJS0VSTl9JTkZPCisJCSJzYWE3MTEwLmM6IGRldGVjdGluZyBzYWE3MTEwIGNsaWVudCBvbiBhZGRyZXNzIDB4JXhcbiIsCisJCWFkZHJlc3MgPDwgMSk7CisKKwkvKiBDaGVjayBpZiB0aGUgYWRhcHRlciBzdXBwb3J0cyB0aGUgbmVlZGVkIGZlYXR1cmVzICovCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eQorCSAgICAoYWRhcHRlciwKKwkgICAgIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURSB8IEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQSkpCisJCXJldHVybiAwOworCisJY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2xpZW50ID09IDApCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX3NhYTcxMTA7CisJY2xpZW50LT5mbGFncyA9IEkyQ19DTElFTlRfQUxMT1dfVVNFOworCXN0cmxjcHkoSTJDX05BTUUoY2xpZW50KSwgInNhYTcxMTAiLCBzaXplb2YoSTJDX05BTUUoY2xpZW50KSkpOworCisJZGVjb2RlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWE3MTEwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRlY29kZXIgPT0gMCkgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGRlY29kZXIsIDAsIHNpemVvZihzdHJ1Y3Qgc2FhNzExMCkpOworCWRlY29kZXItPm5vcm0gPSBWSURFT19NT0RFX1BBTDsKKwlkZWNvZGVyLT5pbnB1dCA9IDA7CisJZGVjb2Rlci0+ZW5hYmxlID0gMTsKKwlkZWNvZGVyLT5icmlnaHQgPSAzMjc2ODsKKwlkZWNvZGVyLT5jb250cmFzdCA9IDMyNzY4OworCWRlY29kZXItPmh1ZSA9IDMyNzY4OworCWRlY29kZXItPnNhdCA9IDMyNzY4OworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRlY29kZXItPndxKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkZWNvZGVyKTsKKworCXJ2ID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAocnYpIHsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZGVjb2Rlcik7CisJCXJldHVybiBydjsKKwl9CisKKwlydiA9IHNhYTcxMTBfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0c2VxLCBzaXplb2YoaW5pdHNlcSkpOworCWlmIChydiA8IDApCisJCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzX2F0dGFjaDogaW5pdCBzdGF0dXMgJWRcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBydik7CisJZWxzZSB7CisJCWludCB2ZXIsIHN0YXR1czsKKwkJc2FhNzExMF93cml0ZShjbGllbnQsIDB4MjEsIDB4MTApOworCQlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgwZSwgMHgxOCk7CisJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDBELCAweDA0KTsKKwkJdmVyID0gc2FhNzExMF9yZWFkKGNsaWVudCk7CisJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDBELCAweDA2KTsKKwkJLy9tZGVsYXkoMTUwKTsKKwkJc3RhdHVzID0gc2FhNzExMF9yZWFkKGNsaWVudCk7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fSU5GTworCQkJIiVzX2F0dGFjaDogU0FBNzExMEEgdmVyc2lvbiAleCBhdCAweCUwMngsIHN0YXR1cz0weCUwMnhcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCB2ZXIsIGNsaWVudC0+YWRkciA8PCAxLCBzdGF0dXMpOworCQlzYWE3MTEwX3dyaXRlKGNsaWVudCwgMHgwRCwgMHg4Nik7CisJCXNhYTcxMTBfd3JpdGUoY2xpZW50LCAweDBGLCAweDEwKTsKKwkJc2FhNzExMF93cml0ZShjbGllbnQsIDB4MTEsIDB4NTkpOworCQkvL3NhYTcxMTBfd3JpdGUoY2xpZW50LCAweDJFLCAweDlBKTsKKwl9CisKKwkvL3NhYTcxMTBfc2VsbXV4KGNsaWVudCwwKTsKKwkvL2RldGVybWluZV9ub3JtKGNsaWVudCk7CisJLyogc2V0dXAgYW5kIGltcGxpY2l0IG1vZGUgMCBzZWxlY3QgaGFzIGJlZW4gcGVyZm9ybWVkICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2FhNzExMF9hdHRhY2hfYWRhcHRlciAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWRwcmludGsoMSwKKwkJS0VSTl9JTkZPCisJCSJzYWE3MTEwLmM6IHN0YXJ0aW5nIHByb2JlIGZvciBhZGFwdGVyICVzICgweCV4KVxuIiwKKwkJSTJDX05BTUUoYWRhcHRlciksIGFkYXB0ZXItPmlkKTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsICZzYWE3MTEwX2RldGVjdF9jbGllbnQpOworfQorCitzdGF0aWMgaW50CitzYWE3MTEwX2RldGFjaF9jbGllbnQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHNhYTcxMTAgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoZGVjb2Rlcik7CisJa2ZyZWUoY2xpZW50KTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9zYWE3MTEwID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gInNhYTcxMTAiLAorCisJLmlkID0gSTJDX0RSSVZFUklEX1NBQTcxMTAsCisJLmZsYWdzID0gSTJDX0RGX05PVElGWSwKKworCS5hdHRhY2hfYWRhcHRlciA9IHNhYTcxMTBfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQgPSBzYWE3MTEwX2RldGFjaF9jbGllbnQsCisJLmNvbW1hbmQgPSBzYWE3MTEwX2NvbW1hbmQsCit9OworCitzdGF0aWMgaW50IF9faW5pdAorc2FhNzExMF9pbml0ICh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl9zYWE3MTEwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitzYWE3MTEwX2V4aXQgKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfc2FhNzExMCk7Cit9CisKK21vZHVsZV9pbml0KHNhYTcxMTBfaW5pdCk7Cittb2R1bGVfZXhpdChzYWE3MTEwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTg3MzExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTExLmMKQEAgLTAsMCArMSw2MjcgQEAKKy8qIAorICogc2FhNzExMSAtIFBoaWxpcHMgU0FBNzExMUEgdmlkZW8gZGVjb2RlciBkcml2ZXIgdmVyc2lvbiAwLjAuMworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZlIFBlcmtzIDxkcGVya3NAaWJtLm5ldD4KKyAqCisgKiBTbGlnaHQgY2hhbmdlcyBmb3IgdmlkZW8gdGltaW5nIGFuZCBhdHRhY2htZW50IG91dHB1dCBieQorICogV29sZmdhbmcgU2NoZXJyIDxzY2hlcnJAbmV0NHlvdS5uZXQ+CisgKgorICogQ2hhbmdlcyBieSBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAtIG1vdmVkIG92ZXIgdG8gbGludXg+PTIuNC54IGkyYyBwcm90b2NvbCAoMS8xLzIwMDMpCisgKgorICogQ2hhbmdlcyBieSBNaWNoYWVsIEh1bm9sZCA8bWljaGFlbEBtaWh1LmRlPgorICogICAgLSBpbXBsZW1lbnRlZCBERUNPREVSX1NFVF9HUElPLCBERUNPREVSX0lOSVQsIERFQ09ERVJfU0VUX1ZCSV9CWVBBU1MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgU0FBNzExMSB2aWRlbyBkZWNvZGVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiRGF2ZSBQZXJrcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWRldi5oPgorCisjZGVmaW5lIEkyQ19OQU1FKHMpIChzKS0+bmFtZQorCisjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC0xKSIpOworCisjZGVmaW5lIGRwcmludGsobnVtLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGRlYnVnID49IG51bSkgXAorCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBzYWE3MTExIHsKKwl1bnNpZ25lZCBjaGFyIHJlZ1szMl07CisKKwlpbnQgbm9ybTsKKwlpbnQgaW5wdXQ7CisJaW50IGVuYWJsZTsKKwlpbnQgYnJpZ2h0OworCWludCBjb250cmFzdDsKKwlpbnQgaHVlOworCWludCBzYXQ7Cit9OworCisjZGVmaW5lICAgSTJDX1NBQTcxMTEgICAgICAgIDB4NDgKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSBpbnQKK3NhYTcxMTFfd3JpdGUgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJICAgICAgIHU4ICAgICAgICAgICAgICAgICByZWcsCisJICAgICAgIHU4ICAgICAgICAgICAgICAgICB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2FhNzExMSAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZGVjb2Rlci0+cmVnW3JlZ10gPSB2YWx1ZTsKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworfQorCitzdGF0aWMgaW50CitzYWE3MTExX3dyaXRlX2Jsb2NrIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgICAgIGNvbnN0IHU4ICAgICAgICAgICpkYXRhLAorCQkgICAgIHVuc2lnbmVkIGludCAgICAgICBsZW4pCit7CisJaW50IHJldCA9IC0xOworCXU4IHJlZzsKKworCS8qIHRoZSBzYWE3MTExIGhhcyBhbiBhdXRvaW5jcmVtZW50IGZ1bmN0aW9uLCB1c2UgaXQgaWYKKwkgKiB0aGUgYWRhcHRlciB1bmRlcnN0YW5kcyByYXcgSTJDICovCisJaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgeworCQkvKiBkbyByYXcgSTJDLCBub3Qgc21idXMgY29tcGF0aWJsZSAqLworCQlzdHJ1Y3Qgc2FhNzExMSAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCQlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJCXU4IGJsb2NrX2RhdGFbMzJdOworCisJCW1zZy5hZGRyID0gY2xpZW50LT5hZGRyOworCQltc2cuZmxhZ3MgPSAwOworCQl3aGlsZSAobGVuID49IDIpIHsKKwkJCW1zZy5idWYgPSAoY2hhciAqKSBibG9ja19kYXRhOworCQkJbXNnLmxlbiA9IDA7CisJCQlibG9ja19kYXRhW21zZy5sZW4rK10gPSByZWcgPSBkYXRhWzBdOworCQkJZG8geworCQkJCWJsb2NrX2RhdGFbbXNnLmxlbisrXSA9CisJCQkJICAgIGRlY29kZXItPnJlZ1tyZWcrK10gPSBkYXRhWzFdOworCQkJCWxlbiAtPSAyOworCQkJCWRhdGEgKz0gMjsKKwkJCX0gd2hpbGUgKGxlbiA+PSAyICYmIGRhdGFbMF0gPT0gcmVnICYmCisJCQkJIG1zZy5sZW4gPCAzMik7CisJCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsCisJCQkJCQkmbXNnLCAxKSkgPCAwKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZG8gc29tZSBzbG93IEkyQyBlbXVsYXRpb24ga2luZCBvZiB0aGluZyAqLworCQl3aGlsZSAobGVuID49IDIpIHsKKwkJCXJlZyA9ICpkYXRhKys7CisJCQlpZiAoKHJldCA9IHNhYTcxMTFfd3JpdGUoY2xpZW50LCByZWcsCisJCQkJCQkgKmRhdGErKykpIDwgMCkKKwkJCQlicmVhazsKKwkJCWxlbiAtPSAyOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorc2FhNzExMV9pbml0X2RlY29kZXIgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJICAgICAgc3RydWN0IHZpZGVvX2RlY29kZXJfaW5pdCAqaW5pdCkKK3sKKwlyZXR1cm4gc2FhNzExMV93cml0ZV9ibG9jayhjbGllbnQsIGluaXQtPmRhdGEsIGluaXQtPmxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzYWE3MTExX3JlYWQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJICAgICAgdTggICAgICAgICAgICAgICAgIHJlZykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2FhNzExMV9pMmNfaW5pdFtdID0geworCTB4MDAsIDB4MDAsCQkvKiAwMCAtIElEIGJ5dGUgKi8KKwkweDAxLCAweDAwLAkJLyogMDEgLSByZXNlcnZlZCAqLworCisJLypmcm9udCBlbmQgKi8KKwkweDAyLCAweGQwLAkJLyogMDIgLSBGVVNFPTMsIEdVREw9MiwgTU9ERT0wICovCisJMHgwMywgMHgyMywJCS8qIDAzIC0gSExOUlM9MCwgVkJTTD0xLCBXUE9GRj0wLAorCQkJCSAqIEhPTERHPTAsIEdBRklYPTAsIEdBSTE9MjU2LCBHQUkyPTI1NiAqLworCTB4MDQsIDB4MDAsCQkvKiAwNCAtIEdBSTE9MjU2ICovCisJMHgwNSwgMHgwMCwJCS8qIDA1IC0gR0FJMj0yNTYgKi8KKworCS8qIGRlY29kZXIgKi8KKwkweDA2LCAweGYzLAkJLyogMDYgLSBIU0IgYXQgIDEzKDUwSHopIC8gIDE3KDYwSHopCisJCQkJICogcGl4ZWxzIGFmdGVyIGVuZCBvZiBsYXN0IGxpbmUgKi8KKwkvKjB4MDcsIDB4MTMsICAgICAqIDA3IC0gSFNTIGF0IDExMyg1MEh6KSAvIDExNyg2MEh6KSBwaXhlbHMKKwkJCQkgKiBhZnRlciBlbmQgb2YgbGFzdCBsaW5lICovCisJMHgwNywgMHhlOCwJCS8qIDA3IC0gSFNTIHNlZW1zIHRvIGJlIG5lZWRlZCB0bworCQkJCSAqIHdvcmsgd2l0aCBOVFNDLCB0b28gKi8KKwkweDA4LCAweGM4LAkJLyogMDggLSBBVUZEPTEsIEZTRUw9MSwgRVhGSUw9MCwKKwkJCQkgKiBWVFJDPTEsIEhQTEw9MCwgVk5PST0wICovCisJMHgwOSwgMHgwMSwJCS8qIDA5IC0gQllQUz0wLCBQUkVGPTAsIEJQU1M9MCwKKwkJCQkgKiBWQkxCPTAsIFVQVENWPTAsIEFQRVI9MSAqLworCTB4MGEsIDB4ODAsCQkvKiAwYSAtIEJSSUc9MTI4ICovCisJMHgwYiwgMHg0NywJCS8qIDBiIC0gQ09OVD0xLjEwOSAqLworCTB4MGMsIDB4NDAsCQkvKiAwYyAtIFNBVE49MS4wICovCisJMHgwZCwgMHgwMCwJCS8qIDBkIC0gSFVFPTAgKi8KKwkweDBlLCAweDAxLAkJLyogMGUgLSBDRFRPPTAsIENTVEQ9MCwgRENDRj0wLAorCQkJCSAqIEZDVEM9MCwgQ0hCVz0xICovCisJMHgwZiwgMHgwMCwJCS8qIDBmIC0gcmVzZXJ2ZWQgKi8KKwkweDEwLCAweDQ4LAkJLyogMTAgLSBPRlRTPTEsIEhERUw9MCwgVlJMTj0xLCBZREVMPTAgKi8KKwkweDExLCAweDFjLAkJLyogMTEgLSBHUFNXPTAsIENNOTk9MCwgRkVDTz0wLCBDT01QTz0xLAorCQkJCSAqIE9FWUM9MSwgT0VIVj0xLCBWSVBCPTAsIENPTE89MCAqLworCTB4MTIsIDB4MDAsCQkvKiAxMiAtIG91dHB1dCBjb250cm9sIDIgKi8KKwkweDEzLCAweDAwLAkJLyogMTMgLSBvdXRwdXQgY29udHJvbCAzICovCisJMHgxNCwgMHgwMCwJCS8qIDE0IC0gcmVzZXJ2ZWQgKi8KKwkweDE1LCAweDAwLAkJLyogMTUgLSBWQkkgKi8KKwkweDE2LCAweDAwLAkJLyogMTYgLSBWQkkgKi8KKwkweDE3LCAweDAwLAkJLyogMTcgLSBWQkkgKi8KK307CisKK3N0YXRpYyBpbnQKK3NhYTcxMTFfY29tbWFuZCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJIHVuc2lnbmVkIGludCAgICAgICBjbWQsCisJCSB2b2lkICAgICAgICAgICAgICAqYXJnKQoreworCXN0cnVjdCBzYWE3MTExICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSAwOgorCWNhc2UgREVDT0RFUl9JTklUOgorCXsKKwkJc3RydWN0IHZpZGVvX2RlY29kZXJfaW5pdCAqaW5pdCA9IGFyZzsKKwkJaWYgKE5VTEwgIT0gaW5pdCkKKwkJCXJldHVybiBzYWE3MTExX2luaXRfZGVjb2RlcihjbGllbnQsIGluaXQpOworCQllbHNlIHsKKwkJCXN0cnVjdCB2aWRlb19kZWNvZGVyX2luaXQgdmRpOworCQkJdmRpLmRhdGEgPSBzYWE3MTExX2kyY19pbml0OworCQkJdmRpLmxlbiA9IHNpemVvZihzYWE3MTExX2kyY19pbml0KTsKKwkJCXJldHVybiBzYWE3MTExX2luaXRfZGVjb2RlcihjbGllbnQsICZ2ZGkpOworCQl9CisJfQorCisJY2FzZSBERUNPREVSX0RVTVA6CisJeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gMTYpIHsKKwkJCWludCBqOworCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICUwM3giLCBJMkNfTkFNRShjbGllbnQpLCBpKTsKKwkJCWZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisJCQkJcHJpbnRrKCIgJTAyeCIsCisJCQkJICAgICAgIHNhYTcxMTFfcmVhZChjbGllbnQsIGkgKyBqKSk7CisJCQl9CisJCQlwcmludGsoIlxuIik7CisJCX0KKwl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX0dFVF9DQVBBQklMSVRJRVM6CisJeworCQlzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJY2FwLT5mbGFncyA9IFZJREVPX0RFQ09ERVJfUEFMIHwKKwkJCSAgICAgVklERU9fREVDT0RFUl9OVFNDIHwKKwkJCSAgICAgVklERU9fREVDT0RFUl9TRUNBTSB8CisJCQkgICAgIFZJREVPX0RFQ09ERVJfQVVUTyB8CisJCQkgICAgIFZJREVPX0RFQ09ERVJfQ0NJUjsKKwkJY2FwLT5pbnB1dHMgPSA4OworCQljYXAtPm91dHB1dHMgPSAxOworCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfR0VUX1NUQVRVUzoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKwkJaW50IHN0YXR1czsKKwkJaW50IHJlczsKKworCQlzdGF0dXMgPSBzYWE3MTExX3JlYWQoY2xpZW50LCAweDFmKTsKKwkJZHByaW50aygxLCBLRVJOX0RFQlVHICIlcyBzdGF0dXM6IDB4JTAyeFxuIiwgSTJDX05BTUUoY2xpZW50KSwKKwkJCXN0YXR1cyk7CisJCXJlcyA9IDA7CisJCWlmICgoc3RhdHVzICYgKDEgPDwgNikpID09IDApIHsKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19HT09EOworCQl9CisJCXN3aXRjaCAoZGVjb2Rlci0+bm9ybSkgeworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19OVFNDOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fTU9ERV9QQUw6CisJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfUEFMOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fTU9ERV9TRUNBTToKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19TRUNBTTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIFZJREVPX01PREVfQVVUTzoKKwkJCWlmICgoc3RhdHVzICYgKDEgPDwgNSkpICE9IDApIHsKKwkJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfTlRTQzsKKwkJCX0gZWxzZSB7CisJCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX1BBTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmICgoc3RhdHVzICYgKDEgPDwgMCkpICE9IDApIHsKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19DT0xPUjsKKwkJfQorCQkqaWFyZyA9IHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX1NFVF9HUElPOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCQlpZiAoMCAhPSAqaWFyZykgeworCQkJc2FhNzExMV93cml0ZShjbGllbnQsIDB4MTEsCisJCQkJKGRlY29kZXItPnJlZ1sweDExXSB8IDB4ODApKTsKKwkJfSBlbHNlIHsKKwkJCXNhYTcxMTFfd3JpdGUoY2xpZW50LCAweDExLAorCQkJCShkZWNvZGVyLT5yZWdbMHgxMV0gJiAweDdmKSk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBERUNPREVSX1NFVF9WQklfQllQQVNTOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCQlpZiAoMCAhPSAqaWFyZykgeworCQkJc2FhNzExMV93cml0ZShjbGllbnQsIDB4MTMsCisJCQkJKGRlY29kZXItPnJlZ1sweDEzXSAmIDB4ZjApIHwgMHgwYSk7CisJCX0gZWxzZSB7CisJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgxMywKKwkJCQkoZGVjb2Rlci0+cmVnWzB4MTNdICYgMHhmMCkpOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgREVDT0RFUl9TRVRfTk9STToKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQlzd2l0Y2ggKCppYXJnKSB7CisKKwkJY2FzZSBWSURFT19NT0RFX05UU0M6CisJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgwOCwKKwkJCQkgICAgICAoZGVjb2Rlci0+cmVnWzB4MDhdICYgMHgzZikgfCAweDQwKTsKKwkJCXNhYTcxMTFfd3JpdGUoY2xpZW50LCAweDBlLAorCQkJCSAgICAgIChkZWNvZGVyLT5yZWdbMHgwZV0gJiAweDhmKSk7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfUEFMOgorCQkJc2FhNzExMV93cml0ZShjbGllbnQsIDB4MDgsCisJCQkJICAgICAgKGRlY29kZXItPnJlZ1sweDA4XSAmIDB4M2YpIHwgMHgwMCk7CisJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgwZSwKKwkJCQkgICAgICAoZGVjb2Rlci0+cmVnWzB4MGVdICYgMHg4ZikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBWSURFT19NT0RFX1NFQ0FNOgorCQkJc2FhNzExMV93cml0ZShjbGllbnQsIDB4MDgsCisJCQkJICAgICAgKGRlY29kZXItPnJlZ1sweDA4XSAmIDB4M2YpIHwgMHgwMCk7CisJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgwZSwKKwkJCQkgICAgICAoZGVjb2Rlci0+cmVnWzB4MGVdICYgMHg4ZikgfCAweDUwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVklERU9fTU9ERV9BVVRPOgorCQkJc2FhNzExMV93cml0ZShjbGllbnQsIDB4MDgsCisJCQkJICAgICAgKGRlY29kZXItPnJlZ1sweDA4XSAmIDB4M2YpIHwgMHg4MCk7CisJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgwZSwKKwkJCQkgICAgICAoZGVjb2Rlci0+cmVnWzB4MGVdICYgMHg4ZikpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCisJCX0KKwkJZGVjb2Rlci0+bm9ybSA9ICppYXJnOworCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfU0VUX0lOUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCWlmICgqaWFyZyA8IDAgfHwgKmlhcmcgPiA3KSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChkZWNvZGVyLT5pbnB1dCAhPSAqaWFyZykgeworCQkJZGVjb2Rlci0+aW5wdXQgPSAqaWFyZzsKKwkJCS8qIHNlbGVjdCBtb2RlICovCisJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgwMiwKKwkJCQkgICAgICAoZGVjb2Rlci0+CisJCQkJICAgICAgIHJlZ1sweDAyXSAmIDB4ZjgpIHwgZGVjb2Rlci0+aW5wdXQpOworCQkJLyogYnlwYXNzIGNocm9taW5hbmNlIHRyYXAgZm9yIG1vZGVzIDQuLjcgKi8KKwkJCXNhYTcxMTFfd3JpdGUoY2xpZW50LCAweDA5LAorCQkJCSAgICAgIChkZWNvZGVyLT4KKwkJCQkgICAgICAgcmVnWzB4MDldICYgMHg3ZikgfCAoKGRlY29kZXItPgorCQkJCQkJCSAgICAgaW5wdXQgPgorCQkJCQkJCSAgICAgMykgPyAweDgwIDoKKwkJCQkJCQkgICAgMCkpOworCQl9CisJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfT1VUUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCS8qIG5vdCBtdWNoIGNob2ljZSBvZiBvdXRwdXRzICovCisJCWlmICgqaWFyZyAhPSAwKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfRU5BQkxFX09VVFBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKwkJaW50IGVuYWJsZSA9ICgqaWFyZyAhPSAwKTsKKworCQlpZiAoZGVjb2Rlci0+ZW5hYmxlICE9IGVuYWJsZSkgeworCQkJZGVjb2Rlci0+ZW5hYmxlID0gZW5hYmxlOworCisJCQkvKiBSSjogSWYgb3V0cHV0IHNob3VsZCBiZSBkaXNhYmxlZCAoZm9yCisJCQkgKiBwbGF5aW5nIHZpZGVvcyksIHdlIGFsc28gbmVlZCBhIG9wZW4gUExMLgorCQkJICogVGhlIGlucHV0IGlzIHNldCB0byAwICh3aGVyZSBubyBpbnB1dAorCQkJICogc291cmNlIGlzIGNvbm5lY3RlZCksIGFsdGhvdWdoIHRoaXMKKwkJCSAqIGlzIG5vdCBuZWNlc3NhcnkuCisJCQkgKgorCQkJICogSWYgb3V0cHV0IHNob3VsZCBiZSBlbmFibGVkLCB3ZSBoYXZlIHRvCisJCQkgKiByZXZlcnNlIHRoZSBhYm92ZS4KKwkJCSAqLworCisJCQlpZiAoZGVjb2Rlci0+ZW5hYmxlKSB7CisJCQkJc2FhNzExMV93cml0ZShjbGllbnQsIDB4MDIsCisJCQkJCSAgICAgIChkZWNvZGVyLT4KKwkJCQkJICAgICAgIHJlZ1sweDAyXSAmIDB4ZjgpIHwKKwkJCQkJICAgICAgZGVjb2Rlci0+aW5wdXQpOworCQkJCXNhYTcxMTFfd3JpdGUoY2xpZW50LCAweDA4LAorCQkJCQkgICAgICAoZGVjb2Rlci0+cmVnWzB4MDhdICYgMHhmYikpOworCQkJCXNhYTcxMTFfd3JpdGUoY2xpZW50LCAweDExLAorCQkJCQkgICAgICAoZGVjb2Rlci0+CisJCQkJCSAgICAgICByZWdbMHgxMV0gJiAweGYzKSB8IDB4MGMpOworCQkJfSBlbHNlIHsKKwkJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgwMiwKKwkJCQkJICAgICAgKGRlY29kZXItPnJlZ1sweDAyXSAmIDB4ZjgpKTsKKwkJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgwOCwKKwkJCQkJICAgICAgKGRlY29kZXItPgorCQkJCQkgICAgICAgcmVnWzB4MDhdICYgMHhmYikgfCAweDA0KTsKKwkJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgxMSwKKwkJCQkJICAgICAgKGRlY29kZXItPnJlZ1sweDExXSAmIDB4ZjMpKTsKKwkJCX0KKwkJfQorCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfU0VUX1BJQ1RVUkU6CisJeworCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcGljID0gYXJnOworCisJCWlmIChkZWNvZGVyLT5icmlnaHQgIT0gcGljLT5icmlnaHRuZXNzKSB7CisJCQkvKiBXZSB3YW50IDAgdG8gMjU1IHdlIGdldCAwLTY1NTM1ICovCisJCQlkZWNvZGVyLT5icmlnaHQgPSBwaWMtPmJyaWdodG5lc3M7CisJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgwYSwgZGVjb2Rlci0+YnJpZ2h0ID4+IDgpOworCQl9CisJCWlmIChkZWNvZGVyLT5jb250cmFzdCAhPSBwaWMtPmNvbnRyYXN0KSB7CisJCQkvKiBXZSB3YW50IDAgdG8gMTI3IHdlIGdldCAwLTY1NTM1ICovCisJCQlkZWNvZGVyLT5jb250cmFzdCA9IHBpYy0+Y29udHJhc3Q7CisJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgwYiwKKwkJCQkgICAgICBkZWNvZGVyLT5jb250cmFzdCA+PiA5KTsKKwkJfQorCQlpZiAoZGVjb2Rlci0+c2F0ICE9IHBpYy0+Y29sb3VyKSB7CisJCQkvKiBXZSB3YW50IDAgdG8gMTI3IHdlIGdldCAwLTY1NTM1ICovCisJCQlkZWNvZGVyLT5zYXQgPSBwaWMtPmNvbG91cjsKKwkJCXNhYTcxMTFfd3JpdGUoY2xpZW50LCAweDBjLCBkZWNvZGVyLT5zYXQgPj4gOSk7CisJCX0KKwkJaWYgKGRlY29kZXItPmh1ZSAhPSBwaWMtPmh1ZSkgeworCQkJLyogV2Ugd2FudCAtMTI4IHRvIDEyNyB3ZSBnZXQgMC02NTUzNSAqLworCQkJZGVjb2Rlci0+aHVlID0gcGljLT5odWU7CisJCQlzYWE3MTExX3dyaXRlKGNsaWVudCwgMHgwZCwKKwkJCQkgICAgICAoZGVjb2Rlci0+aHVlIC0gMzI3NjgpID4+IDgpOworCQl9CisJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogR2VuZXJpYyBpMmMgcHJvYmUKKyAqIGNvbmNlcm5pbmcgdGhlIGFkZHJlc3NlczogaTJjIHdhbnRzIDcgYml0ICh3aXRob3V0IHRoZSByL3cgYml0KSwgc28gJz4+MScKKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX1NBQTcxMTEgPj4gMSwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjX3JhbmdlW10gPSB7IEkyQ19DTElFTlRfRU5EIH07CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHJvYmVfcmFuZ2VbMl0gPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGlnbm9yZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlX3JhbmdlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQgLCBJMkNfQ0xJRU5UX0VORCB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0geworCS5ub3JtYWxfaTJjCQk9IG5vcm1hbF9pMmMsCisJLm5vcm1hbF9pMmNfcmFuZ2UJPSBub3JtYWxfaTJjX3JhbmdlLAorCS5wcm9iZQkJCT0gcHJvYmUsCisJLnByb2JlX3JhbmdlCQk9IHByb2JlX3JhbmdlLAorCS5pZ25vcmUJCQk9IGlnbm9yZSwKKwkuaWdub3JlX3JhbmdlCQk9IGlnbm9yZV9yYW5nZSwKKwkuZm9yY2UJCQk9IGZvcmNlCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9zYWE3MTExOworCitzdGF0aWMgaW50CitzYWE3MTExX2RldGVjdF9jbGllbnQgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJICAgICAgIGludCAgICAgICAgICAgICAgICAgYWRkcmVzcywKKwkJICAgICAgIGludCAgICAgICAgICAgICAgICAga2luZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBzYWE3MTExICpkZWNvZGVyOworCXN0cnVjdCB2aWRlb19kZWNvZGVyX2luaXQgdmRpOworCisJZHByaW50aygxLAorCQlLRVJOX0lORk8KKwkJInNhYTcxMTEuYzogZGV0ZWN0aW5nIHNhYTcxMTEgY2xpZW50IG9uIGFkZHJlc3MgMHgleFxuIiwKKwkJYWRkcmVzcyA8PCAxKTsKKworCS8qIENoZWNrIGlmIHRoZSBhZGFwdGVyIHN1cHBvcnRzIHRoZSBuZWVkZWQgZmVhdHVyZXMgKi8KKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCXJldHVybiAwOworCisJY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2xpZW50ID09IDApCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX3NhYTcxMTE7CisJY2xpZW50LT5mbGFncyA9IEkyQ19DTElFTlRfQUxMT1dfVVNFOworCXN0cmxjcHkoSTJDX05BTUUoY2xpZW50KSwgInNhYTcxMTEiLCBzaXplb2YoSTJDX05BTUUoY2xpZW50KSkpOworCisJZGVjb2RlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWE3MTExKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRlY29kZXIgPT0gTlVMTCkgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGRlY29kZXIsIDAsIHNpemVvZihzdHJ1Y3Qgc2FhNzExMSkpOworCWRlY29kZXItPm5vcm0gPSBWSURFT19NT0RFX05UU0M7CisJZGVjb2Rlci0+aW5wdXQgPSAwOworCWRlY29kZXItPmVuYWJsZSA9IDE7CisJZGVjb2Rlci0+YnJpZ2h0ID0gMzI3Njg7CisJZGVjb2Rlci0+Y29udHJhc3QgPSAzMjc2ODsKKwlkZWNvZGVyLT5odWUgPSAzMjc2ODsKKwlkZWNvZGVyLT5zYXQgPSAzMjc2ODsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkZWNvZGVyKTsKKworCWkgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChpKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCWtmcmVlKGRlY29kZXIpOworCQlyZXR1cm4gaTsKKwl9CisKKwl2ZGkuZGF0YSA9IHNhYTcxMTFfaTJjX2luaXQ7CisJdmRpLmxlbiA9IHNpemVvZihzYWE3MTExX2kyY19pbml0KTsKKwlpID0gc2FhNzExMV9pbml0X2RlY29kZXIoY2xpZW50LCAmdmRpKTsKKwlpZiAoaSA8IDApIHsKKwkJZHByaW50aygxLCBLRVJOX0VSUiAiJXNfYXR0YWNoIGVycm9yOiBpbml0IHN0YXR1cyAlZFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIGkpOworCX0gZWxzZSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fSU5GTworCQkJIiVzX2F0dGFjaDogY2hpcCB2ZXJzaW9uICV4IGF0IGFkZHJlc3MgMHgleFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIHNhYTcxMTFfcmVhZChjbGllbnQsIDB4MDApID4+IDQsCisJCQljbGllbnQtPmFkZHIgPDwgMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NhYTcxMTFfYXR0YWNoX2FkYXB0ZXIgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlkcHJpbnRrKDEsCisJCUtFUk5fSU5GTworCQkic2FhNzExMS5jOiBzdGFydGluZyBwcm9iZSBmb3IgYWRhcHRlciAlcyAoMHgleClcbiIsCisJCUkyQ19OQU1FKGFkYXB0ZXIpLCBhZGFwdGVyLT5pZCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCAmc2FhNzExMV9kZXRlY3RfY2xpZW50KTsKK30KKworc3RhdGljIGludAorc2FhNzExMV9kZXRhY2hfY2xpZW50IChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzYWE3MTExICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGVycjsKKworCWVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJaWYgKGVycikgeworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGRlY29kZXIpOworCWtmcmVlKGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXJfc2FhNzExMSA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJzYWE3MTExIiwKKworCS5pZCA9IEkyQ19EUklWRVJJRF9TQUE3MTExQSwKKwkuZmxhZ3MgPSBJMkNfREZfTk9USUZZLAorCisJLmF0dGFjaF9hZGFwdGVyID0gc2FhNzExMV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCA9IHNhYTcxMTFfZGV0YWNoX2NsaWVudCwKKwkuY29tbWFuZCA9IHNhYTcxMTFfY29tbWFuZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitzYWE3MTExX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX3NhYTcxMTEpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3NhYTcxMTFfZXhpdCAodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmaTJjX2RyaXZlcl9zYWE3MTExKTsKK30KKworbW9kdWxlX2luaXQoc2FhNzExMV9pbml0KTsKK21vZHVsZV9leGl0KHNhYTcxMTFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzAyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTQuYwpAQCAtMCwwICsxLDEyNDEgQEAKKy8qIAorICogc2FhNzExNCAtIFBoaWxpcHMgU0FBNzExNEggdmlkZW8gZGVjb2RlciBkcml2ZXIgdmVyc2lvbiAwLjAuMQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBNYXhpbSBZZXZ0eXVzaGtpbiA8bWF4QGxpbnV4bWVkaWFsYWJzLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBzYWE3MTExIGRyaXZlciBieSBEYXZlIFBlcmtzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IERhdmUgUGVya3MgPGRwZXJrc0BpYm0ubmV0PgorICoKKyAqIFNsaWdodCBjaGFuZ2VzIGZvciB2aWRlbyB0aW1pbmcgYW5kIGF0dGFjaG1lbnQgb3V0cHV0IGJ5CisgKiBXb2xmZ2FuZyBTY2hlcnIgPHNjaGVyckBuZXQ0eW91Lm5ldD4KKyAqCisgKiBDaGFuZ2VzIGJ5IFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgIC0gbW92ZWQgb3ZlciB0byBsaW51eD49Mi40LnggaTJjIHByb3RvY29sICgxLzEvMjAwMykKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJQaGlsaXBzIFNBQTcxMTRIIHZpZGVvIGRlY29kZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYXhpbSBZZXZ0eXVzaGtpbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWRldi5oPgorCisjZGVmaW5lIEkyQ19OQU1FKHgpICh4KS0+bmFtZQorCisjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC0xKSIpOworCisjZGVmaW5lIGRwcmludGsobnVtLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGRlYnVnID49IG51bSkgXAorCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBzYWE3MTE0IHsKKwl1bnNpZ25lZCBjaGFyIHJlZ1sweGYwICogMl07CisKKwlpbnQgbm9ybTsKKwlpbnQgaW5wdXQ7CisJaW50IGVuYWJsZTsKKwlpbnQgYnJpZ2h0OworCWludCBjb250cmFzdDsKKwlpbnQgaHVlOworCWludCBzYXQ7CisJaW50IHBsYXliYWNrOworfTsKKworI2RlZmluZSAgIEkyQ19TQUE3MTE0ICAgICAgICAweDQyCisjZGVmaW5lICAgSTJDX1NBQTcxMTRBICAgICAgIDB4NDAKKworI2RlZmluZSAgIEkyQ19ERUxBWSAgIDEwCisKKworLy8jZGVmaW5lIFNBQV83MTE0X05UU0NfSFNZTkNfU1RBUlQgICAgICAgKC0zKQorLy8jZGVmaW5lIFNBQV83MTE0X05UU0NfSFNZTkNfU1RPUCAgICAgICAgKC0xOCkKKworI2RlZmluZSBTQUFfNzExNF9OVFNDX0hTWU5DX1NUQVJUICAoLTE3KQorI2RlZmluZSBTQUFfNzExNF9OVFNDX0hTWU5DX1NUT1AgICAoLTMyKQorCisvLyNkZWZpbmUgU0FBXzcxMTRfTlRTQ19IT0ZGU0VUICAgICAgICAgICAoNSkKKyNkZWZpbmUgU0FBXzcxMTRfTlRTQ19IT0ZGU0VUCQkoNikKKyNkZWZpbmUgU0FBXzcxMTRfTlRTQ19WT0ZGU0VUICAgICAgICAgICAoMTApCisjZGVmaW5lIFNBQV83MTE0X05UU0NfV0lEVEggICAgICAgICAgICAgKDcyMCkKKyNkZWZpbmUgU0FBXzcxMTRfTlRTQ19IRUlHSFQgICAgICAgICAgICAoMjUwKQorCisjZGVmaW5lIFNBQV83MTE0X1NFQ0FNX0hTWU5DX1NUQVJUICAgICAgKC0xNykKKyNkZWZpbmUgU0FBXzcxMTRfU0VDQU1fSFNZTkNfU1RPUCAgICAgICAoLTMyKQorCisjZGVmaW5lIFNBQV83MTE0X1NFQ0FNX0hPRkZTRVQgICAgICAgICAgKDIpCisjZGVmaW5lIFNBQV83MTE0X1NFQ0FNX1ZPRkZTRVQgICAgICAgICAgKDEwKQorI2RlZmluZSBTQUFfNzExNF9TRUNBTV9XSURUSCAgICAgICAgICAgICg3MjApCisjZGVmaW5lIFNBQV83MTE0X1NFQ0FNX0hFSUdIVCAgICAgICAgICAgKDMwMCkKKworI2RlZmluZSBTQUFfNzExNF9QQUxfSFNZTkNfU1RBUlQgICAgICAgICgtMTcpCisjZGVmaW5lIFNBQV83MTE0X1BBTF9IU1lOQ19TVE9QICAgICAgICAgKC0zMikKKworI2RlZmluZSBTQUFfNzExNF9QQUxfSE9GRlNFVCAgICAgICAgICAgICgyKQorI2RlZmluZSBTQUFfNzExNF9QQUxfVk9GRlNFVCAgICAgICAgICAgICgxMCkKKyNkZWZpbmUgU0FBXzcxMTRfUEFMX1dJRFRIICAgICAgICAgICAgICAoNzIwKQorI2RlZmluZSBTQUFfNzExNF9QQUxfSEVJR0hUICAgICAgICAgICAgICgzMDApCisKKworCisjZGVmaW5lIFNBQV83MTE0X1ZFUlRJQ0FMX0NIUk9NQV9PRkZTRVQgICAgICAgICAwCS8vMHg1MDUwNDA0MAorI2RlZmluZSBTQUFfNzExNF9WRVJUSUNBTF9MVU1BX09GRlNFVCAgICAgICAgICAgMAorCisjZGVmaW5lIFJFR19BRERSKHgpICgoKHgpIDw8IDEpICsgMSkKKyNkZWZpbmUgTE9CWVRFKHgpICgodW5zaWduZWQgY2hhcikoKHgpICYgMHhmZikpCisjZGVmaW5lIEhJQllURSh4KSAoKHVuc2lnbmVkIGNoYXIpKCgoeCkgPj4gOCkgJiAweGZmKSkKKyNkZWZpbmUgTE9XT1JEKHgpICgodW5zaWduZWQgc2hvcnQgaW50KSgoeCkgJiAweGZmZmYpKQorI2RlZmluZSBISVdPUkQoeCkgKCh1bnNpZ25lZCBzaG9ydCBpbnQpKCgoeCkgPj4gMTYpICYgMHhmZmZmKSkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIGludAorc2FhNzExNF93cml0ZSAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkgICAgICAgdTggICAgICAgICAgICAgICAgIHJlZywKKwkgICAgICAgdTggICAgICAgICAgICAgICAgIHZhbHVlKQoreworCS8qc3RydWN0IHNhYTcxMTQgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsqLworCisJLypkZWNvZGVyLT5yZWdbcmVnXSA9IHZhbHVlOyovCisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIGludAorc2FhNzExNF93cml0ZV9ibG9jayAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICAgICBjb25zdCB1OCAgICAgICAgICAqZGF0YSwKKwkJICAgICB1bnNpZ25lZCBpbnQgICAgICAgbGVuKQoreworCWludCByZXQgPSAtMTsKKwl1OCByZWc7CisKKwkvKiB0aGUgc2FhNzExNCBoYXMgYW4gYXV0b2luY3JlbWVudCBmdW5jdGlvbiwgdXNlIGl0IGlmCisJICogdGhlIGFkYXB0ZXIgdW5kZXJzdGFuZHMgcmF3IEkyQyAqLworCWlmIChpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKKwkJLyogZG8gcmF3IEkyQywgbm90IHNtYnVzIGNvbXBhdGlibGUgKi8KKwkJLypzdHJ1Y3Qgc2FhNzExNCAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyovCisJCXN0cnVjdCBpMmNfbXNnIG1zZzsKKwkJdTggYmxvY2tfZGF0YVszMl07CisKKwkJbXNnLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJCW1zZy5mbGFncyA9IDA7CisJCXdoaWxlIChsZW4gPj0gMikgeworCQkJbXNnLmJ1ZiA9IChjaGFyICopIGJsb2NrX2RhdGE7CisJCQltc2cubGVuID0gMDsKKwkJCWJsb2NrX2RhdGFbbXNnLmxlbisrXSA9IHJlZyA9IGRhdGFbMF07CisJCQlkbyB7CisJCQkJYmxvY2tfZGF0YVttc2cubGVuKytdID0KKwkJCQkgICAgLypkZWNvZGVyLT5yZWdbcmVnKytdID0qLyBkYXRhWzFdOworCQkJCWxlbiAtPSAyOworCQkJCWRhdGEgKz0gMjsKKwkJCX0gd2hpbGUgKGxlbiA+PSAyICYmIGRhdGFbMF0gPT0gcmVnICYmCisJCQkJIG1zZy5sZW4gPCAzMik7CisJCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsCisJCQkJCQkmbXNnLCAxKSkgPCAwKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZG8gc29tZSBzbG93IEkyQyBlbXVsYXRpb24ga2luZCBvZiB0aGluZyAqLworCQl3aGlsZSAobGVuID49IDIpIHsKKwkJCXJlZyA9ICpkYXRhKys7CisJCQlpZiAoKHJldCA9IHNhYTcxMTRfd3JpdGUoY2xpZW50LCByZWcsCisJCQkJCQkgKmRhdGErKykpIDwgMCkKKwkJCQlicmVhazsKKwkJCWxlbiAtPSAyOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NhYTcxMTRfcmVhZCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkgICAgICB1OCAgICAgICAgICAgICAgICAgcmVnKQoreworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBpbml0aWFsbHkgc2V0IE5UU0MsIGNvbXBvc2l0ZQorCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGluaXRbXSA9IHsKKwkweDAwLCAweDAwLAkJLyogMDAgLSBJRCBieXRlICwgY2hpcCB2ZXJzaW9uLAorCQkJCSAqIHJlYWQgb25seSAqLworCTB4MDEsIDB4MDgsCQkvKiAwMSAtIFgsWCxYLFgsIElERUwzIHRvIElERUwwIC0KKwkJCQkgKiBob3Jpem9udGFsIGluY3JlbWVudCBkZWxheSwKKwkJCQkgKiByZWNvbW1lbmRlZCBwb3NpdGlvbiAqLworCTB4MDIsIDB4MDAsCQkvKiAwMiAtIEZVU0U9MywgR1VETD0yLCBNT0RFPTAgOworCQkJCSAqIGlucHV0IGNvbnRyb2wgKi8KKwkweDAzLCAweDEwLAkJLyogMDMgLSBITE5SUz0wLCBWQlNMPTEsIFdQT0ZGPTAsCisJCQkJICogSE9MREc9MCwgR0FGSVg9MCwgR0FJMT0yNTYsIEdBSTI9MjU2ICovCisJMHgwNCwgMHg5MCwJCS8qIDA0IC0gR0FJMT0yNTYgKi8KKwkweDA1LCAweDkwLAkJLyogMDUgLSBHQUkyPTI1NiAqLworCTB4MDYsIFNBQV83MTE0X05UU0NfSFNZTkNfU1RBUlQsCS8qIDA2IC0gSFNCOiBoc3luYyBzdGFydCwKKwkJCQkgKiBkZXBlbmRzIG9uIHRoZSB2aWRlbyBzdGFuZGFyZCAqLworCTB4MDcsIFNBQV83MTE0X05UU0NfSFNZTkNfU1RPUCwJLyogMDcgLSBIU1M6IGhzeW5jIHN0b3AsIGRlcGVuZHMKKwkJCQkgKm9uIHRoZSB2aWRlbyBzdGFuZGFyZCAqLworCTB4MDgsIDB4YjgsCQkvKiAwOCAtIEFVRkQ9MSwgRlNFTD0xLCBFWEZJTD0wLCBWVFJDPTEsCisJCQkJICogSFBMTDogZnJlZSBydW5uaW5nIGluIHBsYXliYWNrLCBsb2NrZWQKKwkJCQkgKiBpbiBjYXB0dXJlLCBWTk9JPTAgKi8KKwkweDA5LCAweDgwLAkJLyogMDkgLSBCWVBTPTAsIFBSRUY9MCwgQlBTUz0wLCBWQkxCPTAsCisJCQkJICogVVBUQ1Y9MCwgQVBFUj0xOyBkZXBlbmRzIGZyb20gaW5wdXQgKi8KKwkweDBhLCAweDgwLAkJLyogMGEgLSBCUklHPTEyOCAqLworCTB4MGIsIDB4NDQsCQkvKiAwYiAtIENPTlQ9MS4xMDkgKi8KKwkweDBjLCAweDQwLAkJLyogMGMgLSBTQVROPTEuMCAqLworCTB4MGQsIDB4MDAsCQkvKiAwZCAtIEhVRT0wICovCisJMHgwZSwgMHg4NCwJCS8qIDBlIC0gQ0RUTywgQ1NURDIgdG8gMCwgRENWRiwgRkNUQywKKwkJCQkgKiBDQ09NQjsgZGVwZW5kcyBmcm9tIHZpZGVvIHN0YW5kYXJkICovCisJMHgwZiwgMHgyNCwJCS8qIDBmIC0gQUNHQyxDR0FJTjYgdG8gQ0dBSU4wOyBkZXBlbmRzCisJCQkJICogZnJvbSB2aWRlbyBzdGFuZGFyZCAqLworCTB4MTAsIDB4MDMsCQkvKiAxMCAtIE9GRlUxIHRvIDAsIE9GRlYxIHRvIDAsIENIQlcsCisJCQkJICogTENCVzIgdG8gMCAqLworCTB4MTEsIDB4NTksCQkvKiAxMSAtIENPTE8sIFJUUDEsIEhFREwxIHRvIDAsIFJUUDAsCisJCQkJICogWURFTDIgdG8gMCAqLworCTB4MTIsIDB4YzksCQkvKiAxMiAtIFJUIHNpZ25hbCBjb250cm9sIFJUU0UxMyB0byAxMAorCQkJCSAqIGFuZCAwMyB0byAwMCAqLworCTB4MTMsIDB4ODAsCQkvKiAxMyAtIFJUL1ggcG9ydCBvdXRwdXQgY29udHJvbCAgKi8KKwkweDE0LCAweDAwLAkJLyogMTQgLSBhbmFsb2csIEFEQywgY29tcGF0aWJpbGl0eSBjb250cm9sICovCisJMHgxNSwgMHgwMCwJCS8qIDE1IC0gVkdBVEUgc3RhcnQgRklEIGNoYW5nZSAgKi8KKwkweDE2LCAweGZlLAkJLyogMTYgLSBWR0FURSBzdG9wICovCisJMHgxNywgMHgwMCwJCS8qIDE3IC0gTWlzYy4sIFZHQVRFIE1TQnMgKi8KKwkweDE4LCAweDQwLAkJLyogUkFXRyAqLworCTB4MTksIDB4ODAsCQkvKiBSQVdPICovCisJMHgxYSwgMHgwMCwKKwkweDFiLCAweDAwLAorCTB4MWMsIDB4MDAsCisJMHgxZCwgMHgwMCwKKwkweDFlLCAweDAwLAorCTB4MWYsIDB4MDAsCQkvKiBzdGF0dXMgYnl0ZSwgcmVhZCBvbmx5ICovCisJMHgyMCwgMHgwMCwJCS8qIHZpZGVvIGRlY29kZXIgcmVzZXJ2ZWQgcGFydCAqLworCTB4MjEsIDB4MDAsCisJMHgyMiwgMHgwMCwKKwkweDIzLCAweDAwLAorCTB4MjQsIDB4MDAsCisJMHgyNSwgMHgwMCwKKwkweDI2LCAweDAwLAorCTB4MjcsIDB4MDAsCisJMHgyOCwgMHgwMCwKKwkweDI5LCAweDAwLAorCTB4MmEsIDB4MDAsCisJMHgyYiwgMHgwMCwKKwkweDJjLCAweDAwLAorCTB4MmQsIDB4MDAsCisJMHgyZSwgMHgwMCwKKwkweDJmLCAweDAwLAorCTB4MzAsIDB4YmMsCQkvKiBhdWRpbyBjbG9jayBnZW5lcmF0b3IgKi8KKwkweDMxLCAweGRmLAorCTB4MzIsIDB4MDIsCisJMHgzMywgMHgwMCwKKwkweDM0LCAweGNkLAorCTB4MzUsIDB4Y2MsCisJMHgzNiwgMHgzYSwKKwkweDM3LCAweDAwLAorCTB4MzgsIDB4MDMsCisJMHgzOSwgMHgxMCwKKwkweDNhLCAweDAwLAorCTB4M2IsIDB4MDAsCisJMHgzYywgMHgwMCwKKwkweDNkLCAweDAwLAorCTB4M2UsIDB4MDAsCisJMHgzZiwgMHgwMCwKKwkweDQwLCAweDAwLAkJLyogVkJJIGRhdGEgc2xpY2VyICovCisJMHg0MSwgMHhmZiwKKwkweDQyLCAweGZmLAorCTB4NDMsIDB4ZmYsCisJMHg0NCwgMHhmZiwKKwkweDQ1LCAweGZmLAorCTB4NDYsIDB4ZmYsCisJMHg0NywgMHhmZiwKKwkweDQ4LCAweGZmLAorCTB4NDksIDB4ZmYsCisJMHg0YSwgMHhmZiwKKwkweDRiLCAweGZmLAorCTB4NGMsIDB4ZmYsCisJMHg0ZCwgMHhmZiwKKwkweDRlLCAweGZmLAorCTB4NGYsIDB4ZmYsCisJMHg1MCwgMHhmZiwKKwkweDUxLCAweGZmLAorCTB4NTIsIDB4ZmYsCisJMHg1MywgMHhmZiwKKwkweDU0LCAweGZmLAorCTB4NTUsIDB4ZmYsCisJMHg1NiwgMHhmZiwKKwkweDU3LCAweGZmLAorCTB4NTgsIDB4NDAsCQkvLyBmcmFtaW5nIGNvZGUgCisJMHg1OSwgMHg0NywJCS8vIGhvcml6b250YWwgb2Zmc2V0CisJMHg1YSwgMHgwNiwJCS8vIHZlcnRpY2FsIG9mZnNldAorCTB4NWIsIDB4ODMsCQkvLyBmaWVsZCBvZmZzZXQKKwkweDVjLCAweDAwLAkJLy8gcmVzZXJ2ZWQKKwkweDVkLCAweDNlLAkJLy8gaGVhZGVyIGFuZCBkYXRhCisJMHg1ZSwgMHgwMCwJCS8vIHNsaWNlZCBkYXRhCisJMHg1ZiwgMHgwMCwJCS8vIHJlc2VydmVkCisJMHg2MCwgMHgwMCwJCS8qIHZpZGVvIGRlY29kZXIgcmVzZXJ2ZWQgcGFydCAqLworCTB4NjEsIDB4MDAsCisJMHg2MiwgMHgwMCwKKwkweDYzLCAweDAwLAorCTB4NjQsIDB4MDAsCisJMHg2NSwgMHgwMCwKKwkweDY2LCAweDAwLAorCTB4NjcsIDB4MDAsCisJMHg2OCwgMHgwMCwKKwkweDY5LCAweDAwLAorCTB4NmEsIDB4MDAsCisJMHg2YiwgMHgwMCwKKwkweDZjLCAweDAwLAorCTB4NmQsIDB4MDAsCisJMHg2ZSwgMHgwMCwKKwkweDZmLCAweDAwLAorCTB4NzAsIDB4MDAsCQkvKiB2aWRlbyBkZWNvZGVyIHJlc2VydmVkIHBhcnQgKi8KKwkweDcxLCAweDAwLAorCTB4NzIsIDB4MDAsCisJMHg3MywgMHgwMCwKKwkweDc0LCAweDAwLAorCTB4NzUsIDB4MDAsCisJMHg3NiwgMHgwMCwKKwkweDc3LCAweDAwLAorCTB4NzgsIDB4MDAsCisJMHg3OSwgMHgwMCwKKwkweDdhLCAweDAwLAorCTB4N2IsIDB4MDAsCisJMHg3YywgMHgwMCwKKwkweDdkLCAweDAwLAorCTB4N2UsIDB4MDAsCisJMHg3ZiwgMHgwMCwKKwkweDgwLCAweDAwLAkJLyogWC1wb3J0LCBJLXBvcnQgYW5kIHNjYWxlciAqLworCTB4ODEsIDB4MDAsCisJMHg4MiwgMHgwMCwKKwkweDgzLCAweDAwLAorCTB4ODQsIDB4YzUsCisJMHg4NSwgMHgwZCwJCS8vIGhzeW5jIGFuZCB2c3luYyA/IAorCTB4ODYsIDB4NDAsCisJMHg4NywgMHgwMSwKKwkweDg4LCAweDAwLAorCTB4ODksIDB4MDAsCisJMHg4YSwgMHgwMCwKKwkweDhiLCAweDAwLAorCTB4OGMsIDB4MDAsCisJMHg4ZCwgMHgwMCwKKwkweDhlLCAweDAwLAorCTB4OGYsIDB4MDAsCisJMHg5MCwgMHgwMywJCS8qIFRhc2sgQSBkZWZpbml0aW9uICAgICAgICAgICAqLworCTB4OTEsIDB4MDgsCisJMHg5MiwgMHgwMCwKKwkweDkzLCAweDQwLAorCTB4OTQsIDB4MDAsCQkvLyB3aW5kb3cgc2V0dGluZ3MKKwkweDk1LCAweDAwLAorCTB4OTYsIDB4MDAsCisJMHg5NywgMHgwMCwKKwkweDk4LCAweDAwLAorCTB4OTksIDB4MDAsCisJMHg5YSwgMHgwMCwKKwkweDliLCAweDAwLAorCTB4OWMsIDB4MDAsCisJMHg5ZCwgMHgwMCwKKwkweDllLCAweDAwLAorCTB4OWYsIDB4MDAsCisJMHhhMCwgMHgwMSwJCS8qIGhvcml6b250YWwgaW50ZWdlciBwcmVzY2FsaW5nIHJhdGlvICovCisJMHhhMSwgMHgwMCwJCS8qIGhvcml6b250YWwgcHJlc2NhbGVyIGFjY3VtdWxhdGlvbgorCQkJCSAqIHNlcXVlbmNlIGxlbmd0aCAqLworCTB4YTIsIDB4MDAsCQkvKiBVViBGSVIgZmlsdGVyLCBZIEZJUiBmaWx0ZXIsIHByZXNjYWxlcgorCQkJCSAqIERDIGdhaW4gKi8KKwkweGEzLCAweDAwLAorCTB4YTQsIDB4ODAsCQkvLyBsdW1pbmFuY2UgYnJpZ2h0bmVzcworCTB4YTUsIDB4NDAsCQkvLyBsdW1pbmFuY2UgZ2FpbgorCTB4YTYsIDB4NDAsCQkvLyBjaHJvbWluYW5jZSBzYXR1cmF0aW9uCisJMHhhNywgMHgwMCwKKwkweGE4LCAweDAwLAkJLy8gaG9yaXpvbnRhbCBsdW1pbmFuY2Ugc2NhbGluZyBpbmNyZW1lbnQKKwkweGE5LCAweDA0LAorCTB4YWEsIDB4MDAsCQkvLyBob3Jpem9udGFsIGx1bWluYW5jZSBwaGFzZSBvZmZzZXQKKwkweGFiLCAweDAwLAorCTB4YWMsIDB4MDAsCQkvLyBob3Jpem9udGFsIGNocm9taW5hbmNlIHNjYWxpbmcgaW5jcmVtZW50CisJMHhhZCwgMHgwMiwKKwkweGFlLCAweDAwLAkJLy8gaG9yaXpvbnRhbCBjaHJvbWluYW5jZSBwaGFzZSBvZmZzZXQKKwkweGFmLCAweDAwLAorCTB4YjAsIDB4MDAsCQkvLyB2ZXJ0aWNhbCBsdW1pbmFuY2Ugc2NhbGluZyBpbmNyZW1lbnQKKwkweGIxLCAweDA0LAorCTB4YjIsIDB4MDAsCQkvLyB2ZXJ0aWNhbCBjaHJvbWluYW5jZSBzY2FsaW5nIGluY3JlbWVudAorCTB4YjMsIDB4MDQsCisJMHhiNCwgMHgwMCwKKwkweGI1LCAweDAwLAorCTB4YjYsIDB4MDAsCisJMHhiNywgMHgwMCwKKwkweGI4LCAweDAwLAorCTB4YjksIDB4MDAsCisJMHhiYSwgMHgwMCwKKwkweGJiLCAweDAwLAorCTB4YmMsIDB4MDAsCisJMHhiZCwgMHgwMCwKKwkweGJlLCAweDAwLAorCTB4YmYsIDB4MDAsCisJMHhjMCwgMHgwMiwJCS8vIFRhc2sgQiBkZWZpbml0aW9uCisJMHhjMSwgMHgwOCwKKwkweGMyLCAweDAwLAorCTB4YzMsIDB4NDAsCisJMHhjNCwgMHgwMCwJCS8vIHdpbmRvdyBzZXR0aW5ncworCTB4YzUsIDB4MDAsCisJMHhjNiwgMHgwMCwKKwkweGM3LCAweDAwLAorCTB4YzgsIDB4MDAsCisJMHhjOSwgMHgwMCwKKwkweGNhLCAweDAwLAorCTB4Y2IsIDB4MDAsCisJMHhjYywgMHgwMCwKKwkweGNkLCAweDAwLAorCTB4Y2UsIDB4MDAsCisJMHhjZiwgMHgwMCwKKwkweGQwLCAweDAxLAkJLy8gaG9yaXpvbnRhbCBpbnRlZ2VyIHByZXNjYWxpbmcgcmF0aW8KKwkweGQxLCAweDAwLAkJLy8gaG9yaXpvbnRhbCBwcmVzY2FsZXIgYWNjdW11bGF0aW9uIHNlcXVlbmNlIGxlbmd0aAorCTB4ZDIsIDB4MDAsCQkvLyBVViBGSVIgZmlsdGVyLCBZIEZJUiBmaWx0ZXIsIHByZXNjYWxlciBEQyBnYWluCisJMHhkMywgMHgwMCwKKwkweGQ0LCAweDgwLAkJLy8gbHVtaW5hbmNlIGJyaWdodG5lc3MKKwkweGQ1LCAweDQwLAkJLy8gbHVtaW5hbmNlIGdhaW4KKwkweGQ2LCAweDQwLAkJLy8gY2hyb21pbmFuY2Ugc2F0dXJhdGlvbgorCTB4ZDcsIDB4MDAsCisJMHhkOCwgMHgwMCwJCS8vIGhvcml6b250YWwgbHVtaW5hbmNlIHNjYWxpbmcgaW5jcmVtZW50CisJMHhkOSwgMHgwNCwKKwkweGRhLCAweDAwLAkJLy8gaG9yaXpvbnRhbCBsdW1pbmFuY2UgcGhhc2Ugb2Zmc2V0CisJMHhkYiwgMHgwMCwKKwkweGRjLCAweDAwLAkJLy8gaG9yaXpvbnRhbCBjaHJvbWluYW5jZSBzY2FsaW5nIGluY3JlbWVudCAKKwkweGRkLCAweDAyLAorCTB4ZGUsIDB4MDAsCQkvLyBob3Jpem9udGFsIGNocm9taW5hbmNlIHBoYXNlIG9mZnNldAorCTB4ZGYsIDB4MDAsCisJMHhlMCwgMHgwMCwJCS8vIHZlcnRpY2FsIGx1bWluYW5jZSBzY2FsaW5nIGluY3JlbWVudAorCTB4ZTEsIDB4MDQsCisJMHhlMiwgMHgwMCwJCS8vIHZlcnRpY2FsIGNocm9taW5hbmNlIHNjYWxpbmcgaW5jcmVtZW50CisJMHhlMywgMHgwNCwKKwkweGU0LCAweDAwLAorCTB4ZTUsIDB4MDAsCisJMHhlNiwgMHgwMCwKKwkweGU3LCAweDAwLAorCTB4ZTgsIDB4MDAsCisJMHhlOSwgMHgwMCwKKwkweGVhLCAweDAwLAorCTB4ZWIsIDB4MDAsCisJMHhlYywgMHgwMCwKKwkweGVkLCAweDAwLAorCTB4ZWUsIDB4MDAsCisJMHhlZiwgMHgwMAorfTsKKworc3RhdGljIGludAorc2FhNzExNF9jb21tYW5kIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgdW5zaWduZWQgaW50ICAgICAgIGNtZCwKKwkJIHZvaWQgICAgICAgICAgICAgICphcmcpCit7CisJc3RydWN0IHNhYTcxMTQgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIDA6CisJCS8vZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiB3cml0aW5nIGluaXRcbiIsIEkyQ19OQU1FKGNsaWVudCkpOworCQkvL3NhYTcxMTRfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0LCBzaXplb2YoaW5pdCkpOworCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9EVU1QOgorCXsKKwkJaW50IGk7CisKKwkJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiBkZWNvZGVyIGR1bXBcbiIsIEkyQ19OQU1FKGNsaWVudCkpOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSAxNikgeworCQkJaW50IGo7CisKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJTAzeCIsIEkyQ19OQU1FKGNsaWVudCksIGkpOworCQkJZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKwkJCQlwcmludGsoIiAlMDJ4IiwKKwkJCQkgICAgICAgc2FhNzExNF9yZWFkKGNsaWVudCwgaSArIGopKTsKKwkJCX0KKwkJCXByaW50aygiXG4iKTsKKwkJfQorCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfR0VUX0NBUEFCSUxJVElFUzoKKwl7CisJCXN0cnVjdCB2aWRlb19kZWNvZGVyX2NhcGFiaWxpdHkgKmNhcCA9IGFyZzsKKworCQlkcHJpbnRrKDEsIEtFUk5fREVCVUcgIiVzOiBkZWNvZGVyIGdldCBjYXBhYmlsaXRpZXNcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpKTsKKworCQljYXAtPmZsYWdzID0gVklERU9fREVDT0RFUl9QQUwgfAorCQkJICAgICBWSURFT19ERUNPREVSX05UU0MgfAorCQkJICAgICBWSURFT19ERUNPREVSX0FVVE8gfAorCQkJICAgICBWSURFT19ERUNPREVSX0NDSVI7CisJCWNhcC0+aW5wdXRzID0gODsKKwkJY2FwLT5vdXRwdXRzID0gMTsKKwl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX0dFVF9TVEFUVVM6CisJeworCQlpbnQgKmlhcmcgPSBhcmc7CisJCWludCBzdGF0dXM7CisJCWludCByZXM7CisKKwkJc3RhdHVzID0gc2FhNzExNF9yZWFkKGNsaWVudCwgMHgxZik7CisKKwkJZHByaW50aygxLCBLRVJOX0RFQlVHICIlcyBzdGF0dXM6IDB4JTAyeFxuIiwgSTJDX05BTUUoY2xpZW50KSwKKwkJCXN0YXR1cyk7CisJCXJlcyA9IDA7CisJCWlmICgoc3RhdHVzICYgKDEgPDwgNikpID09IDApIHsKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19HT09EOworCQl9CisJCXN3aXRjaCAoZGVjb2Rlci0+bm9ybSkgeworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19OVFNDOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fTU9ERV9QQUw6CisJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfUEFMOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fTU9ERV9TRUNBTToKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19TRUNBTTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIFZJREVPX01PREVfQVVUTzoKKwkJCWlmICgoc3RhdHVzICYgKDEgPDwgNSkpICE9IDApIHsKKwkJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfTlRTQzsKKwkJCX0gZWxzZSB7CisJCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX1BBTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmICgoc3RhdHVzICYgKDEgPDwgMCkpICE9IDApIHsKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19DT0xPUjsKKwkJfQorCQkqaWFyZyA9IHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX1NFVF9OT1JNOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCXNob3J0IGludCBob2ZmID0gMCwgdm9mZiA9IDAsIHcgPSAwLCBoID0gMDsKKworCQlkcHJpbnRrKDEsIEtFUk5fREVCVUcgIiVzOiBkZWNvZGVyIHNldCBub3JtICIsCisJCQlJMkNfTkFNRShjbGllbnQpKTsKKwkJc3dpdGNoICgqaWFyZykgeworCisJCWNhc2UgVklERU9fTU9ERV9OVFNDOgorCQkJZHByaW50aygxLCAiTlRTQ1xuIik7CisJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwNildID0KKwkJCSAgICBTQUFfNzExNF9OVFNDX0hTWU5DX1NUQVJUOworCQkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4MDcpXSA9CisJCQkgICAgU0FBXzcxMTRfTlRTQ19IU1lOQ19TVE9QOworCisJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwOCldID0gZGVjb2Rlci0+cGxheWJhY2sgPyAweDdjIDogMHhiODsJLy8gUExMIGZyZWUgd2hlbiBwbGF5YmFjaywgUExMIGNsb3NlIHdoZW4gY2FwdHVyZQorCisJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwZSldID0gMHg4NTsKKwkJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDBmKV0gPSAweDI0OworCisJCQlob2ZmID0gU0FBXzcxMTRfTlRTQ19IT0ZGU0VUOworCQkJdm9mZiA9IFNBQV83MTE0X05UU0NfVk9GRlNFVDsKKwkJCXcgPSBTQUFfNzExNF9OVFNDX1dJRFRIOworCQkJaCA9IFNBQV83MTE0X05UU0NfSEVJR0hUOworCisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfUEFMOgorCQkJZHByaW50aygxLCAiUEFMXG4iKTsKKwkJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDA2KV0gPQorCQkJICAgIFNBQV83MTE0X1BBTF9IU1lOQ19TVEFSVDsKKwkJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDA3KV0gPQorCQkJICAgIFNBQV83MTE0X1BBTF9IU1lOQ19TVE9QOworCisJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwOCldID0gZGVjb2Rlci0+cGxheWJhY2sgPyAweDdjIDogMHhiODsJLy8gUExMIGZyZWUgd2hlbiBwbGF5YmFjaywgUExMIGNsb3NlIHdoZW4gY2FwdHVyZQorCisJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwZSldID0gMHg4MTsKKwkJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDBmKV0gPSAweDI0OworCisJCQlob2ZmID0gU0FBXzcxMTRfUEFMX0hPRkZTRVQ7CisJCQl2b2ZmID0gU0FBXzcxMTRfUEFMX1ZPRkZTRVQ7CisJCQl3ID0gU0FBXzcxMTRfUEFMX1dJRFRIOworCQkJaCA9IFNBQV83MTE0X1BBTF9IRUlHSFQ7CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKDEsICIgVW5rbm93biB2aWRlbyBtb2RlISEhXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCisJCX0KKworCisJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDk0KV0gPSBMT0JZVEUoaG9mZik7CS8vIGhvZmZzZXQgbG93CisJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDk1KV0gPSBISUJZVEUoaG9mZikgJiAweDBmOwkvLyBob2Zmc2V0IGhpZ2gKKwkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4OTYpXSA9IExPQllURSh3KTsJLy8gd2lkdGggbG93CisJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDk3KV0gPSBISUJZVEUodykgJiAweDBmOwkvLyB3aWR0aCBoaWdoCisJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDk4KV0gPSBMT0JZVEUodm9mZik7CS8vIHZvZmZzZXQgbG93CisJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDk5KV0gPSBISUJZVEUodm9mZikgJiAweDBmOwkvLyB2b2Zmc2V0IGhpZ2gKKwkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4OWEpXSA9IExPQllURShoICsgMik7CS8vIGhlaWdodCBsb3cKKwkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4OWIpXSA9IEhJQllURShoICsgMikgJiAweDBmOwkvLyBoZWlnaHQgaGlnaAorCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHg5YyldID0gTE9CWVRFKHcpOwkvLyBvdXQgd2lkdGggbG93CisJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDlkKV0gPSBISUJZVEUodykgJiAweDBmOwkvLyBvdXQgd2lkdGggaGlnaAorCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHg5ZSldID0gTE9CWVRFKGgpOwkvLyBvdXQgaGVpZ2h0IGxvdworCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHg5ZildID0gSElCWVRFKGgpICYgMHgwZjsJLy8gb3V0IGhlaWdodCBoaWdoCisKKwkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YzQpXSA9IExPQllURShob2ZmKTsJLy8gaG9mZnNldCBsb3cKKwkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YzUpXSA9IEhJQllURShob2ZmKSAmIDB4MGY7CS8vIGhvZmZzZXQgaGlnaAorCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHhjNildID0gTE9CWVRFKHcpOwkvLyB3aWR0aCBsb3cKKwkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YzcpXSA9IEhJQllURSh3KSAmIDB4MGY7CS8vIHdpZHRoIGhpZ2gKKwkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YzgpXSA9IExPQllURSh2b2ZmKTsJLy8gdm9mZnNldCBsb3cKKwkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YzkpXSA9IEhJQllURSh2b2ZmKSAmIDB4MGY7CS8vIHZvZmZzZXQgaGlnaAorCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHhjYSldID0gTE9CWVRFKGggKyAyKTsJLy8gaGVpZ2h0IGxvdworCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHhjYildID0gSElCWVRFKGggKyAyKSAmIDB4MGY7CS8vIGhlaWdodCBoaWdoCisJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGNjKV0gPSBMT0JZVEUodyk7CS8vIG91dCB3aWR0aCBsb3cKKwkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4Y2QpXSA9IEhJQllURSh3KSAmIDB4MGY7CS8vIG91dCB3aWR0aCBoaWdoCisJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGNlKV0gPSBMT0JZVEUoaCk7CS8vIG91dCBoZWlnaHQgbG93CisJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGNmKV0gPSBISUJZVEUoaCkgJiAweDBmOwkvLyBvdXQgaGVpZ2h0IGhpZ2gKKworCisJCXNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDgwLCAweDA2KTsJLy8gaS1wb3J0IGFuZCBzY2FsZXIgYmFjayBlbmQgY2xvY2sgc2VsZWN0aW9uLCB0YXNrIEEmQiBvZmYKKwkJc2FhNzExNF93cml0ZShjbGllbnQsIDB4ODgsIDB4ZDgpOwkvLyBzdyByZXNldCBzY2FsZXIKKwkJc2FhNzExNF93cml0ZShjbGllbnQsIDB4ODgsIDB4ZjgpOwkvLyBzdyByZXNldCBzY2FsZXIgcmVsZWFzZQorCisJCXNhYTcxMTRfd3JpdGVfYmxvY2soY2xpZW50LCBkZWNvZGVyLT5yZWcgKyAoMHgwNiA8PCAxKSwKKwkJCQkgICAgMyA8PCAxKTsKKwkJc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGRlY29kZXItPnJlZyArICgweDBlIDw8IDEpLAorCQkJCSAgICAyIDw8IDEpOworCQlzYWE3MTE0X3dyaXRlX2Jsb2NrKGNsaWVudCwgZGVjb2Rlci0+cmVnICsgKDB4NWEgPDwgMSksCisJCQkJICAgIDIgPDwgMSk7CisKKwkJc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGRlY29kZXItPnJlZyArICgweDk0IDw8IDEpLAorCQkJCSAgICAoMHg5ZiArIDEgLSAweDk0KSA8PCAxKTsKKwkJc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGRlY29kZXItPnJlZyArICgweGM0IDw8IDEpLAorCQkJCSAgICAoMHhjZiArIDEgLSAweGM0KSA8PCAxKTsKKworCQlzYWE3MTE0X3dyaXRlKGNsaWVudCwgMHg4OCwgMHhkOCk7CS8vIHN3IHJlc2V0IHNjYWxlcgorCQlzYWE3MTE0X3dyaXRlKGNsaWVudCwgMHg4OCwgMHhmOCk7CS8vIHN3IHJlc2V0IHNjYWxlciByZWxlYXNlCisJCXNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDgwLCAweDM2KTsJLy8gaS1wb3J0IGFuZCBzY2FsZXIgYmFjayBlbmQgY2xvY2sgc2VsZWN0aW9uCisKKwkJZGVjb2Rlci0+bm9ybSA9ICppYXJnOworCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfU0VUX0lOUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCWRwcmludGsoMSwgS0VSTl9ERUJVRyAiJXM6IGRlY29kZXIgc2V0IGlucHV0ICglZClcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCAqaWFyZyk7CisJCWlmICgqaWFyZyA8IDAgfHwgKmlhcmcgPiA3KSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChkZWNvZGVyLT5pbnB1dCAhPSAqaWFyZykgeworCQkJZHByaW50aygxLCBLRVJOX0RFQlVHICIlczogbm93IHNldHRpbmcgJXMgaW5wdXRcbiIsCisJCQkJSTJDX05BTUUoY2xpZW50KSwKKwkJCQkqaWFyZyA+PSA2ID8gIlMtVmlkZW8iIDogIkNvbXBvc2l0ZSIpOworCQkJZGVjb2Rlci0+aW5wdXQgPSAqaWFyZzsKKworCQkJLyogc2VsZWN0IG1vZGUgKi8KKwkJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDAyKV0gPQorCQkJICAgIChkZWNvZGVyLT4KKwkJCSAgICAgcmVnW1JFR19BRERSKDB4MDIpXSAmIDB4ZjApIHwgKGRlY29kZXItPgorCQkJCQkJCSAgICBpbnB1dCA8CisJCQkJCQkJICAgIDYgPyAweDAgOiAweDkpOworCQkJc2FhNzExNF93cml0ZShjbGllbnQsIDB4MDIsCisJCQkJICAgICAgZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4MDIpXSk7CisKKwkJCS8qIGJ5cGFzcyBjaHJvbWluYW5jZSB0cmFwIGZvciBtb2RlcyA2Li45ICovCisJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwOSldID0KKwkJCSAgICAoZGVjb2Rlci0+CisJCQkgICAgIHJlZ1tSRUdfQUREUigweDA5KV0gJiAweDdmKSB8IChkZWNvZGVyLT4KKwkJCQkJCQkgICAgaW5wdXQgPAorCQkJCQkJCSAgICA2ID8gMHgwIDoKKwkJCQkJCQkgICAgMHg4MCk7CisJCQlzYWE3MTE0X3dyaXRlKGNsaWVudCwgMHgwOSwKKwkJCQkgICAgICBkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwOSldKTsKKworCQkJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4MGUpXSA9CisJCQkgICAgZGVjb2Rlci0+aW5wdXQgPAorCQkJICAgIDYgPyBkZWNvZGVyLT4KKwkJCSAgICByZWdbUkVHX0FERFIoMHgwZSldIHwgMSA6IGRlY29kZXItPgorCQkJICAgIHJlZ1tSRUdfQUREUigweDBlKV0gJiB+MTsKKwkJCXNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDBlLAorCQkJCSAgICAgIGRlY29kZXItPnJlZ1tSRUdfQUREUigweDBlKV0pOworCQl9CisJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfT1VUUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCWRwcmludGsoMSwgS0VSTl9ERUJVRyAiJXM6IGRlY29kZXIgc2V0IG91dHB1dFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCkpOworCisJCS8qIG5vdCBtdWNoIGNob2ljZSBvZiBvdXRwdXRzICovCisJCWlmICgqaWFyZyAhPSAwKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfRU5BQkxFX09VVFBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKwkJaW50IGVuYWJsZSA9ICgqaWFyZyAhPSAwKTsKKworCQlkcHJpbnRrKDEsIEtFUk5fREVCVUcgIiVzOiBkZWNvZGVyICVzIG91dHB1dFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIGVuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKworCQlkZWNvZGVyLT5wbGF5YmFjayA9ICFlbmFibGU7CisKKwkJaWYgKGRlY29kZXItPmVuYWJsZSAhPSBlbmFibGUpIHsKKwkJCWRlY29kZXItPmVuYWJsZSA9IGVuYWJsZTsKKworCQkJLyogUko6IElmIG91dHB1dCBzaG91bGQgYmUgZGlzYWJsZWQgKGZvcgorCQkJICogcGxheWluZyB2aWRlb3MpLCB3ZSBhbHNvIG5lZWQgYSBvcGVuIFBMTC4KKwkJCSAqIFRoZSBpbnB1dCBpcyBzZXQgdG8gMCAod2hlcmUgbm8gaW5wdXQKKwkJCSAqIHNvdXJjZSBpcyBjb25uZWN0ZWQpLCBhbHRob3VnaCB0aGlzCisJCQkgKiBpcyBub3QgbmVjZXNzYXJ5LgorCQkJICoKKwkJCSAqIElmIG91dHB1dCBzaG91bGQgYmUgZW5hYmxlZCwgd2UgaGF2ZSB0bworCQkJICogcmV2ZXJzZSB0aGUgYWJvdmUuCisJCQkgKi8KKworCQkJaWYgKGRlY29kZXItPmVuYWJsZSkgeworCQkJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDA4KV0gPSAweGI4OworCQkJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDEyKV0gPSAweGM5OworCQkJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDEzKV0gPSAweDgwOworCQkJCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDg3KV0gPSAweDAxOworCQkJfSBlbHNlIHsKKwkJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwOCldID0gMHg3YzsKKwkJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgxMildID0gMHgwMDsKKwkJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgxMyldID0gMHgwMDsKKwkJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHg4NyldID0gMHgwMDsKKwkJCX0KKworCQkJc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsCisJCQkJCSAgICBkZWNvZGVyLT5yZWcgKyAoMHgxMiA8PCAxKSwKKwkJCQkJICAgIDIgPDwgMSk7CisJCQlzYWE3MTE0X3dyaXRlKGNsaWVudCwgMHgwOCwKKwkJCQkgICAgICBkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwOCldKTsKKwkJCXNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDg3LAorCQkJCSAgICAgIGRlY29kZXItPnJlZ1tSRUdfQUREUigweDg3KV0pOworCQkJc2FhNzExNF93cml0ZShjbGllbnQsIDB4ODgsIDB4ZDgpOwkvLyBzdyByZXNldCBzY2FsZXIKKwkJCXNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDg4LCAweGY4KTsJLy8gc3cgcmVzZXQgc2NhbGVyIHJlbGVhc2UgICAgICAgICAgICAKKwkJCXNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDgwLCAweDM2KTsKKworCQl9CisJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfUElDVFVSRToKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwaWMgPSBhcmc7CisKKwkJZHByaW50aygxLAorCQkJS0VSTl9ERUJVRworCQkJIiVzOiBkZWNvZGVyIHNldCBwaWN0dXJlIGJyaWdodD0lZCBjb250cmFzdD0lZCBzYXR1cmF0aW9uPSVkIGh1ZT0lZFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIHBpYy0+YnJpZ2h0bmVzcywgcGljLT5jb250cmFzdCwKKwkJCXBpYy0+Y29sb3VyLCBwaWMtPmh1ZSk7CisKKwkJaWYgKGRlY29kZXItPmJyaWdodCAhPSBwaWMtPmJyaWdodG5lc3MpIHsKKwkJCS8qIFdlIHdhbnQgMCB0byAyNTUgd2UgZ2V0IDAtNjU1MzUgKi8KKwkJCWRlY29kZXItPmJyaWdodCA9IHBpYy0+YnJpZ2h0bmVzczsKKwkJCXNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDBhLCBkZWNvZGVyLT5icmlnaHQgPj4gOCk7CisJCX0KKwkJaWYgKGRlY29kZXItPmNvbnRyYXN0ICE9IHBpYy0+Y29udHJhc3QpIHsKKwkJCS8qIFdlIHdhbnQgMCB0byAxMjcgd2UgZ2V0IDAtNjU1MzUgKi8KKwkJCWRlY29kZXItPmNvbnRyYXN0ID0gcGljLT5jb250cmFzdDsKKwkJCXNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDBiLAorCQkJCSAgICAgIGRlY29kZXItPmNvbnRyYXN0ID4+IDkpOworCQl9CisJCWlmIChkZWNvZGVyLT5zYXQgIT0gcGljLT5jb2xvdXIpIHsKKwkJCS8qIFdlIHdhbnQgMCB0byAxMjcgd2UgZ2V0IDAtNjU1MzUgKi8KKwkJCWRlY29kZXItPnNhdCA9IHBpYy0+Y29sb3VyOworCQkJc2FhNzExNF93cml0ZShjbGllbnQsIDB4MGMsIGRlY29kZXItPnNhdCA+PiA5KTsKKwkJfQorCQlpZiAoZGVjb2Rlci0+aHVlICE9IHBpYy0+aHVlKSB7CisJCQkvKiBXZSB3YW50IC0xMjggdG8gMTI3IHdlIGdldCAwLTY1NTM1ICovCisJCQlkZWNvZGVyLT5odWUgPSBwaWMtPmh1ZTsKKwkJCXNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDBkLAorCQkJCSAgICAgIChkZWNvZGVyLT5odWUgLSAzMjc2OCkgPj4gOCk7CisJCX0KKwl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBHZW5lcmljIGkyYyBwcm9iZQorICogY29uY2VybmluZyB0aGUgYWRkcmVzc2VzOiBpMmMgd2FudHMgNyBiaXQgKHdpdGhvdXQgdGhlIHIvdyBiaXQpLCBzbyAnPj4xJworICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0KKyAgICB7IEkyQ19TQUE3MTE0ID4+IDEsIEkyQ19TQUE3MTE0QSA+PiAxLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb2JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZV9yYW5nZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmVfcmFuZ2VbMl0gPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlWzJdID0geyBJMkNfQ0xJRU5UX0VORCAsIEkyQ19DTElFTlRfRU5EIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKKwkubm9ybWFsX2kyY19yYW5nZQk9IG5vcm1hbF9pMmNfcmFuZ2UsCisJLnByb2JlCQkJPSBwcm9iZSwKKwkucHJvYmVfcmFuZ2UJCT0gcHJvYmVfcmFuZ2UsCisJLmlnbm9yZQkJCT0gaWdub3JlLAorCS5pZ25vcmVfcmFuZ2UJCT0gaWdub3JlX3JhbmdlLAorCS5mb3JjZQkJCT0gZm9yY2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX3NhYTcxMTQ7CisKK3N0YXRpYyBpbnQKK3NhYTcxMTRfZGV0ZWN0X2NsaWVudCAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICBhZGRyZXNzLAorCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICBraW5kKQoreworCWludCBpLCBlcnJbMzBdOworCXNob3J0IGludCBob2ZmID0gU0FBXzcxMTRfTlRTQ19IT0ZGU0VUOworCXNob3J0IGludCB2b2ZmID0gU0FBXzcxMTRfTlRTQ19WT0ZGU0VUOworCXNob3J0IGludCB3ID0gU0FBXzcxMTRfTlRTQ19XSURUSDsKKwlzaG9ydCBpbnQgaCA9IFNBQV83MTE0X05UU0NfSEVJR0hUOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IHNhYTcxMTQgKmRlY29kZXI7CisKKwlkcHJpbnRrKDEsCisJCUtFUk5fSU5GTworCQkic2FhNzExNC5jOiBkZXRlY3Rpbmcgc2FhNzExNCBjbGllbnQgb24gYWRkcmVzcyAweCV4XG4iLAorCQlhZGRyZXNzIDw8IDEpOworCisJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcyAqLworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJcmV0dXJuIDA7CisKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmIChjbGllbnQgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGNsaWVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfc2FhNzExNDsKKwljbGllbnQtPmZsYWdzID0gSTJDX0NMSUVOVF9BTExPV19VU0U7CisJc3RybGNweShJMkNfTkFNRShjbGllbnQpLCAic2FhNzExNCIsIHNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CisKKwlkZWNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxMTQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGVjb2RlciA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZGVjb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCBzYWE3MTE0KSk7CisJZGVjb2Rlci0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKKwlkZWNvZGVyLT5pbnB1dCA9IC0xOworCWRlY29kZXItPmVuYWJsZSA9IDE7CisJZGVjb2Rlci0+YnJpZ2h0ID0gMzI3Njg7CisJZGVjb2Rlci0+Y29udHJhc3QgPSAzMjc2ODsKKwlkZWNvZGVyLT5odWUgPSAzMjc2ODsKKwlkZWNvZGVyLT5zYXQgPSAzMjc2ODsKKwlkZWNvZGVyLT5wbGF5YmFjayA9IDA7CS8vIGluaXRpYWxseSBjYXB0dXJlIG1vZGUgdXNlZGEKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkZWNvZGVyKTsKKworCW1lbWNweShkZWNvZGVyLT5yZWcsIGluaXQsIHNpemVvZihpbml0KSk7CisKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHg5NCldID0gTE9CWVRFKGhvZmYpOwkvLyBob2Zmc2V0IGxvdworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDk1KV0gPSBISUJZVEUoaG9mZikgJiAweDBmOwkvLyBob2Zmc2V0IGhpZ2gKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHg5NildID0gTE9CWVRFKHcpOwkvLyB3aWR0aCBsb3cKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHg5NyldID0gSElCWVRFKHcpICYgMHgwZjsJLy8gd2lkdGggaGlnaAorCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDk4KV0gPSBMT0JZVEUodm9mZik7CS8vIHZvZmZzZXQgbG93CisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4OTkpXSA9IEhJQllURSh2b2ZmKSAmIDB4MGY7CS8vIHZvZmZzZXQgaGlnaAorCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDlhKV0gPSBMT0JZVEUoaCArIDIpOwkvLyBoZWlnaHQgbG93CisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4OWIpXSA9IEhJQllURShoICsgMikgJiAweDBmOwkvLyBoZWlnaHQgaGlnaAorCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDljKV0gPSBMT0JZVEUodyk7CS8vIG91dCB3aWR0aCBsb3cKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHg5ZCldID0gSElCWVRFKHcpICYgMHgwZjsJLy8gb3V0IHdpZHRoIGhpZ2gKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHg5ZSldID0gTE9CWVRFKGgpOwkvLyBvdXQgaGVpZ2h0IGxvdworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDlmKV0gPSBISUJZVEUoaCkgJiAweDBmOwkvLyBvdXQgaGVpZ2h0IGhpZ2gKKworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGM0KV0gPSBMT0JZVEUoaG9mZik7CS8vIGhvZmZzZXQgbG93CisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YzUpXSA9IEhJQllURShob2ZmKSAmIDB4MGY7CS8vIGhvZmZzZXQgaGlnaAorCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGM2KV0gPSBMT0JZVEUodyk7CS8vIHdpZHRoIGxvdworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGM3KV0gPSBISUJZVEUodykgJiAweDBmOwkvLyB3aWR0aCBoaWdoCisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YzgpXSA9IExPQllURSh2b2ZmKTsJLy8gdm9mZnNldCBsb3cKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHhjOSldID0gSElCWVRFKHZvZmYpICYgMHgwZjsJLy8gdm9mZnNldCBoaWdoCisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4Y2EpXSA9IExPQllURShoICsgMik7CS8vIGhlaWdodCBsb3cKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHhjYildID0gSElCWVRFKGggKyAyKSAmIDB4MGY7CS8vIGhlaWdodCBoaWdoCisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4Y2MpXSA9IExPQllURSh3KTsJLy8gb3V0IHdpZHRoIGxvdworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGNkKV0gPSBISUJZVEUodykgJiAweDBmOwkvLyBvdXQgd2lkdGggaGlnaAorCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGNlKV0gPSBMT0JZVEUoaCk7CS8vIG91dCBoZWlnaHQgbG93CisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4Y2YpXSA9IEhJQllURShoKSAmIDB4MGY7CS8vIG91dCBoZWlnaHQgaGlnaAorCisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YjgpXSA9CisJICAgIExPQllURShMT1dPUkQoU0FBXzcxMTRfVkVSVElDQUxfQ0hST01BX09GRlNFVCkpOworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGI5KV0gPQorCSAgICBISUJZVEUoTE9XT1JEKFNBQV83MTE0X1ZFUlRJQ0FMX0NIUk9NQV9PRkZTRVQpKTsKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHhiYSldID0KKwkgICAgTE9CWVRFKEhJV09SRChTQUFfNzExNF9WRVJUSUNBTF9DSFJPTUFfT0ZGU0VUKSk7CisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YmIpXSA9CisJICAgIEhJQllURShISVdPUkQoU0FBXzcxMTRfVkVSVElDQUxfQ0hST01BX09GRlNFVCkpOworCisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YmMpXSA9CisJICAgIExPQllURShMT1dPUkQoU0FBXzcxMTRfVkVSVElDQUxfTFVNQV9PRkZTRVQpKTsKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHhiZCldID0KKwkgICAgSElCWVRFKExPV09SRChTQUFfNzExNF9WRVJUSUNBTF9MVU1BX09GRlNFVCkpOworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGJlKV0gPQorCSAgICBMT0JZVEUoSElXT1JEKFNBQV83MTE0X1ZFUlRJQ0FMX0xVTUFfT0ZGU0VUKSk7CisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4YmYpXSA9CisJICAgIEhJQllURShISVdPUkQoU0FBXzcxMTRfVkVSVElDQUxfTFVNQV9PRkZTRVQpKTsKKworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGU4KV0gPQorCSAgICBMT0JZVEUoTE9XT1JEKFNBQV83MTE0X1ZFUlRJQ0FMX0NIUk9NQV9PRkZTRVQpKTsKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHhlOSldID0KKwkgICAgSElCWVRFKExPV09SRChTQUFfNzExNF9WRVJUSUNBTF9DSFJPTUFfT0ZGU0VUKSk7CisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4ZWEpXSA9CisJICAgIExPQllURShISVdPUkQoU0FBXzcxMTRfVkVSVElDQUxfQ0hST01BX09GRlNFVCkpOworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGViKV0gPQorCSAgICBISUJZVEUoSElXT1JEKFNBQV83MTE0X1ZFUlRJQ0FMX0NIUk9NQV9PRkZTRVQpKTsKKworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGVjKV0gPQorCSAgICBMT0JZVEUoTE9XT1JEKFNBQV83MTE0X1ZFUlRJQ0FMX0xVTUFfT0ZGU0VUKSk7CisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4ZWQpXSA9CisJICAgIEhJQllURShMT1dPUkQoU0FBXzcxMTRfVkVSVElDQUxfTFVNQV9PRkZTRVQpKTsKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHhlZSldID0KKwkgICAgTE9CWVRFKEhJV09SRChTQUFfNzExNF9WRVJUSUNBTF9MVU1BX09GRlNFVCkpOworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweGVmKV0gPQorCSAgICBISUJZVEUoSElXT1JEKFNBQV83MTE0X1ZFUlRJQ0FMX0xVTUFfT0ZGU0VUKSk7CisKKworCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDEzKV0gPSAweDgwOwkvLyBSVEMwIG9uCisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4ODcpXSA9IDB4MDE7CS8vIEktUG9ydAorCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDEyKV0gPSAweGM5OwkvLyBSVFMwCisKKwlkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwMildID0gMHhjMDsJLy8gc2V0IGNvbXBvc2l0ZTEgaW5wdXQsIGF2ZWFzeQorCWRlY29kZXItPnJlZ1tSRUdfQUREUigweDA5KV0gPSAweDAwOwkvLyBjaHJvbWluYW5jZSB0cmFwCisJZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4MGUpXSB8PSAxOwkvLyBjb21iZmlsdGVyIG9uCisKKworCWRwcmludGsoMSwgS0VSTl9ERUJVRyAiJXNfYXR0YWNoOiBzdGFydGluZyBkZWNvZGVyIGluaXRcbiIsCisJCUkyQ19OQU1FKGNsaWVudCkpOworCisJZXJyWzBdID0KKwkgICAgc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGRlY29kZXItPnJlZyArICgweDIwIDw8IDEpLAorCQkJCTB4MTAgPDwgMSk7CisJZXJyWzFdID0KKwkgICAgc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGRlY29kZXItPnJlZyArICgweDMwIDw8IDEpLAorCQkJCTB4MTAgPDwgMSk7CisJZXJyWzJdID0KKwkgICAgc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGRlY29kZXItPnJlZyArICgweDYzIDw8IDEpLAorCQkJCSgweDdmICsgMSAtIDB4NjMpIDw8IDEpOworCWVyclszXSA9CisJICAgIHNhYTcxMTRfd3JpdGVfYmxvY2soY2xpZW50LCBkZWNvZGVyLT5yZWcgKyAoMHg4OSA8PCAxKSwKKwkJCQk2IDw8IDEpOworCWVycls0XSA9CisJICAgIHNhYTcxMTRfd3JpdGVfYmxvY2soY2xpZW50LCBkZWNvZGVyLT5yZWcgKyAoMHhiOCA8PCAxKSwKKwkJCQk4IDw8IDEpOworCWVycls1XSA9CisJICAgIHNhYTcxMTRfd3JpdGVfYmxvY2soY2xpZW50LCBkZWNvZGVyLT5yZWcgKyAoMHhlOCA8PCAxKSwKKwkJCQk4IDw8IDEpOworCisKKwlmb3IgKGkgPSAwOyBpIDw9IDU7IGkrKykgeworCQlpZiAoZXJyW2ldIDwgMCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzX2F0dGFjaDogaW5pdCBlcnJvciAlZCBhdCBzdGFnZSAlZCwgbGVhdmluZyBhdHRhY2guXG4iLAorCQkJCUkyQ19OQU1FKGNsaWVudCksIGksIGVycltpXSk7CisJCQlrZnJlZShkZWNvZGVyKTsKKwkJCWtmcmVlKGNsaWVudCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWZvciAoaSA9IDY7IGkgPCA4OyBpKyspIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9ERUJVRworCQkJIiVzX2F0dGFjaDogcmVnWzB4JTAyeF0gPSAweCUwMnggKDB4JTAyeClcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBpLCBzYWE3MTE0X3JlYWQoY2xpZW50LCBpKSwKKwkJCWRlY29kZXItPnJlZ1tSRUdfQUREUihpKV0pOworCX0KKworCWRwcmludGsoMSwKKwkJS0VSTl9ERUJVRworCQkiJXNfYXR0YWNoOiBwZXJmb3JtaW5nIGRlY29kZXIgcmVzZXQgc2VxdWVuY2VcbiIsCisJCUkyQ19OQU1FKGNsaWVudCkpOworCisJZXJyWzZdID0gc2FhNzExNF93cml0ZShjbGllbnQsIDB4ODAsIDB4MDYpOwkvLyBpLXBvcnQgYW5kIHNjYWxlciBiYWNrZW5kIGNsb2NrIHNlbGVjdGlvbiwgdGFzayBBJkIgb2ZmCisJZXJyWzddID0gc2FhNzExNF93cml0ZShjbGllbnQsIDB4ODgsIDB4ZDgpOwkvLyBzdyByZXNldCBzY2FsZXIKKwllcnJbOF0gPSBzYWE3MTE0X3dyaXRlKGNsaWVudCwgMHg4OCwgMHhmOCk7CS8vIHN3IHJlc2V0IHNjYWxlciByZWxlYXNlCisKKwlmb3IgKGkgPSA2OyBpIDw9IDg7IGkrKykgeworCQlpZiAoZXJyW2ldIDwgMCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzX2F0dGFjaDogaW5pdCBlcnJvciAlZCBhdCBzdGFnZSAlZCwgbGVhdmluZyBhdHRhY2guXG4iLAorCQkJCUkyQ19OQU1FKGNsaWVudCksIGksIGVycltpXSk7CisJCQlrZnJlZShkZWNvZGVyKTsKKwkJCWtmcmVlKGNsaWVudCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWRwcmludGsoMSwgS0VSTl9JTkZPICIlc19hdHRhY2g6IHBlcmZvcm1pbmcgdGhlIHJlc3Qgb2YgaW5pdFxuIiwKKwkJSTJDX05BTUUoY2xpZW50KSk7CisKKworCWVycls5XSA9IHNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDAxLCBkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwMSldKTsKKwllcnJbMTBdID0gc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGRlY29kZXItPnJlZyArICgweDAzIDw8IDEpLCAoMHgxZSArIDEgLSAweDAzKSA8PCAxKTsJLy8gYmlnIHNlcQorCWVyclsxMV0gPSBzYWE3MTE0X3dyaXRlX2Jsb2NrKGNsaWVudCwgZGVjb2Rlci0+cmVnICsgKDB4NDAgPDwgMSksICgweDVmICsgMSAtIDB4NDApIDw8IDEpOwkvLyBzbGljZXIKKwllcnJbMTJdID0gc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGRlY29kZXItPnJlZyArICgweDgxIDw8IDEpLCAyIDw8IDEpOwkvLyA/CisJZXJyWzEzXSA9IHNhYTcxMTRfd3JpdGVfYmxvY2soY2xpZW50LCBkZWNvZGVyLT5yZWcgKyAoMHg4MyA8PCAxKSwgNSA8PCAxKTsJLy8gPworCWVyclsxNF0gPSBzYWE3MTE0X3dyaXRlX2Jsb2NrKGNsaWVudCwgZGVjb2Rlci0+cmVnICsgKDB4OTAgPDwgMSksIDQgPDwgMSk7CS8vIFRhc2sgQQorCWVyclsxNV0gPQorCSAgICBzYWE3MTE0X3dyaXRlX2Jsb2NrKGNsaWVudCwgZGVjb2Rlci0+cmVnICsgKDB4OTQgPDwgMSksCisJCQkJMTIgPDwgMSk7CisJZXJyWzE2XSA9CisJICAgIHNhYTcxMTRfd3JpdGVfYmxvY2soY2xpZW50LCBkZWNvZGVyLT5yZWcgKyAoMHhhMCA8PCAxKSwKKwkJCQk4IDw8IDEpOworCWVyclsxN10gPQorCSAgICBzYWE3MTE0X3dyaXRlX2Jsb2NrKGNsaWVudCwgZGVjb2Rlci0+cmVnICsgKDB4YTggPDwgMSksCisJCQkJOCA8PCAxKTsKKwllcnJbMThdID0KKwkgICAgc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGRlY29kZXItPnJlZyArICgweGIwIDw8IDEpLAorCQkJCTggPDwgMSk7CisJZXJyWzE5XSA9IHNhYTcxMTRfd3JpdGVfYmxvY2soY2xpZW50LCBkZWNvZGVyLT5yZWcgKyAoMHhjMCA8PCAxKSwgNCA8PCAxKTsJLy8gVGFzayBCCisJZXJyWzE1XSA9CisJICAgIHNhYTcxMTRfd3JpdGVfYmxvY2soY2xpZW50LCBkZWNvZGVyLT5yZWcgKyAoMHhjNCA8PCAxKSwKKwkJCQkxMiA8PCAxKTsKKwllcnJbMTZdID0KKwkgICAgc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGRlY29kZXItPnJlZyArICgweGQwIDw8IDEpLAorCQkJCTggPDwgMSk7CisJZXJyWzE3XSA9CisJICAgIHNhYTcxMTRfd3JpdGVfYmxvY2soY2xpZW50LCBkZWNvZGVyLT5yZWcgKyAoMHhkOCA8PCAxKSwKKwkJCQk4IDw8IDEpOworCWVyclsxOF0gPQorCSAgICBzYWE3MTE0X3dyaXRlX2Jsb2NrKGNsaWVudCwgZGVjb2Rlci0+cmVnICsgKDB4ZTAgPDwgMSksCisJCQkJOCA8PCAxKTsKKworCWZvciAoaSA9IDk7IGkgPD0gMTg7IGkrKykgeworCQlpZiAoZXJyW2ldIDwgMCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzX2F0dGFjaDogaW5pdCBlcnJvciAlZCBhdCBzdGFnZSAlZCwgbGVhdmluZyBhdHRhY2guXG4iLAorCQkJCUkyQ19OQU1FKGNsaWVudCksIGksIGVycltpXSk7CisJCQlrZnJlZShkZWNvZGVyKTsKKwkJCWtmcmVlKGNsaWVudCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCisJZm9yIChpID0gNjsgaSA8IDg7IGkrKykgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0RFQlVHCisJCQkiJXNfYXR0YWNoOiByZWdbMHglMDJ4XSA9IDB4JTAyeCAoMHglMDJ4KVxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIGksIHNhYTcxMTRfcmVhZChjbGllbnQsIGkpLAorCQkJZGVjb2Rlci0+cmVnW1JFR19BRERSKGkpXSk7CisJfQorCisKKwlmb3IgKGkgPSAweDExOyBpIDw9IDB4MTM7IGkrKykgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0RFQlVHCisJCQkiJXNfYXR0YWNoOiByZWdbMHglMDJ4XSA9IDB4JTAyeCAoMHglMDJ4KVxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIGksIHNhYTcxMTRfcmVhZChjbGllbnQsIGkpLAorCQkJZGVjb2Rlci0+cmVnW1JFR19BRERSKGkpXSk7CisJfQorCisKKwlkcHJpbnRrKDEsIEtFUk5fREVCVUcgIiVzX2F0dGFjaDogc2V0dGluZyB2aWRlbyBpbnB1dFxuIiwKKwkJSTJDX05BTUUoY2xpZW50KSk7CisKKwllcnJbMTldID0KKwkgICAgc2FhNzExNF93cml0ZShjbGllbnQsIDB4MDIsIGRlY29kZXItPnJlZ1tSRUdfQUREUigweDAyKV0pOworCWVyclsyMF0gPQorCSAgICBzYWE3MTE0X3dyaXRlKGNsaWVudCwgMHgwOSwgZGVjb2Rlci0+cmVnW1JFR19BRERSKDB4MDkpXSk7CisJZXJyWzIxXSA9CisJICAgIHNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDBlLCBkZWNvZGVyLT5yZWdbUkVHX0FERFIoMHgwZSldKTsKKworCWZvciAoaSA9IDE5OyBpIDw9IDIxOyBpKyspIHsKKwkJaWYgKGVycltpXSA8IDApIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlc19hdHRhY2g6IGluaXQgZXJyb3IgJWQgYXQgc3RhZ2UgJWQsIGxlYXZpbmcgYXR0YWNoLlxuIiwKKwkJCQlJMkNfTkFNRShjbGllbnQpLCBpLCBlcnJbaV0pOworCQkJa2ZyZWUoZGVjb2Rlcik7CisJCQlrZnJlZShjbGllbnQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlkcHJpbnRrKDEsCisJCUtFUk5fREVCVUcKKwkJIiVzX2F0dGFjaDogcGVyZm9ybWluZyBkZWNvZGVyIHJlc2V0IHNlcXVlbmNlXG4iLAorCQlJMkNfTkFNRShjbGllbnQpKTsKKworCWVyclsyMl0gPSBzYWE3MTE0X3dyaXRlKGNsaWVudCwgMHg4OCwgMHhkOCk7CS8vIHN3IHJlc2V0IHNjYWxlcgorCWVyclsyM10gPSBzYWE3MTE0X3dyaXRlKGNsaWVudCwgMHg4OCwgMHhmOCk7CS8vIHN3IHJlc2V0IHNjYWxlciByZWxlYXNlCisJZXJyWzI0XSA9IHNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDgwLCAweDM2KTsJLy8gaS1wb3J0IGFuZCBzY2FsZXIgYmFja2VuZCBjbG9jayBzZWxlY3Rpb24sIHRhc2sgQSZCIG9mZgorCisKKwlmb3IgKGkgPSAyMjsgaSA8PSAyNDsgaSsrKSB7CisJCWlmIChlcnJbaV0gPCAwKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXNfYXR0YWNoOiBpbml0IGVycm9yICVkIGF0IHN0YWdlICVkLCBsZWF2aW5nIGF0dGFjaC5cbiIsCisJCQkJSTJDX05BTUUoY2xpZW50KSwgaSwgZXJyW2ldKTsKKwkJCWtmcmVlKGRlY29kZXIpOworCQkJa2ZyZWUoY2xpZW50KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJZXJyWzI1XSA9IHNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDA2LCBpbml0W1JFR19BRERSKDB4MDYpXSk7CisJZXJyWzI2XSA9IHNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDA3LCBpbml0W1JFR19BRERSKDB4MDcpXSk7CisJZXJyWzI3XSA9IHNhYTcxMTRfd3JpdGUoY2xpZW50LCAweDEwLCBpbml0W1JFR19BRERSKDB4MTApXSk7CisKKwlkcHJpbnRrKDEsCisJCUtFUk5fSU5GTworCQkiJXNfYXR0YWNoOiBjaGlwIHZlcnNpb24gJXgsIGRlY29kZXIgc3RhdHVzIDB4JTAyeFxuIiwKKwkJSTJDX05BTUUoY2xpZW50KSwgc2FhNzExNF9yZWFkKGNsaWVudCwgMHgwMCkgPj4gNCwKKwkJc2FhNzExNF9yZWFkKGNsaWVudCwgMHgxZikpOworCWRwcmludGsoMSwKKwkJS0VSTl9ERUJVRworCQkiJXNfYXR0YWNoOiBwb3dlciBzYXZlIGNvbnRyb2w6IDB4JTAyeCwgc2NhbGVyIHN0YXR1czogMHglMDJ4XG4iLAorCQlJMkNfTkFNRShjbGllbnQpLCBzYWE3MTE0X3JlYWQoY2xpZW50LCAweDg4KSwKKwkJc2FhNzExNF9yZWFkKGNsaWVudCwgMHg4ZikpOworCisKKwlmb3IgKGkgPSAweDk0OyBpIDwgMHg5NjsgaSsrKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fREVCVUcKKwkJCSIlc19hdHRhY2g6IHJlZ1sweCUwMnhdID0gMHglMDJ4ICgweCUwMngpXG4iLAorCQkJSTJDX05BTUUoY2xpZW50KSwgaSwgc2FhNzExNF9yZWFkKGNsaWVudCwgaSksCisJCQlkZWNvZGVyLT5yZWdbUkVHX0FERFIoaSldKTsKKwl9CisKKwlpID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoaSkgeworCQlrZnJlZShjbGllbnQpOworCQlrZnJlZShkZWNvZGVyKTsKKwkJcmV0dXJuIGk7CisJfQorCisJLy9pID0gc2FhNzExNF93cml0ZV9ibG9jayhjbGllbnQsIGluaXQsIHNpemVvZihpbml0KSk7CisJaSA9IDA7CisJaWYgKGkgPCAwKSB7CisJCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzX2F0dGFjaCBlcnJvcjogaW5pdCBzdGF0dXMgJWRcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBpKTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0lORk8KKwkJCSIlc19hdHRhY2g6IGNoaXAgdmVyc2lvbiAleCBhdCBhZGRyZXNzIDB4JXhcbiIsCisJCQlJMkNfTkFNRShjbGllbnQpLCBzYWE3MTE0X3JlYWQoY2xpZW50LCAweDAwKSA+PiA0LAorCQkJY2xpZW50LT5hZGRyIDw8IDEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzYWE3MTE0X2F0dGFjaF9hZGFwdGVyIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJZHByaW50aygxLAorCQlLRVJOX0lORk8KKwkJInNhYTcxMTQuYzogc3RhcnRpbmcgcHJvYmUgZm9yIGFkYXB0ZXIgJXMgKDB4JXgpXG4iLAorCQlJMkNfTkFNRShhZGFwdGVyKSwgYWRhcHRlci0+aWQpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgJnNhYTcxMTRfZGV0ZWN0X2NsaWVudCk7Cit9CisKK3N0YXRpYyBpbnQKK3NhYTcxMTRfZGV0YWNoX2NsaWVudCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3Qgc2FhNzExNCAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBlcnI7CisKKwllcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShkZWNvZGVyKTsKKwlrZnJlZShjbGllbnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX3NhYTcxMTQgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAic2FhNzExNCIsCisKKwkuaWQgPSBJMkNfRFJJVkVSSURfU0FBNzExNCwKKwkuZmxhZ3MgPSBJMkNfREZfTk9USUZZLAorCisJLmF0dGFjaF9hZGFwdGVyID0gc2FhNzExNF9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCA9IHNhYTcxMTRfZGV0YWNoX2NsaWVudCwKKwkuY29tbWFuZCA9IHNhYTcxMTRfY29tbWFuZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitzYWE3MTE0X2luaXQgKHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX3NhYTcxMTQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3NhYTcxMTRfZXhpdCAodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmaTJjX2RyaXZlcl9zYWE3MTE0KTsKK30KKworbW9kdWxlX2luaXQoc2FhNzExNF9pbml0KTsKK21vZHVsZV9leGl0KHNhYTcxMTRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMjEuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEyMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTM3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMjEuaApAQCAtMCwwICsxLDEzMiBAQAorLyogc2FhNzEyMS5oIC0gc2FhNzEyMSBpbml0aWFsaXphdGlvbnMKKyAgIENvcHlyaWdodCAoQykgMTk5OSBOYXRoYW4gTGFyZWRvIChsYXJlZG9AZ251Lm9yZykKKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICovCisjaWZuZGVmIF9fU0FBNzEyMV9IX18KKyNkZWZpbmUgX19TQUE3MTIxX0hfXworCisjZGVmaW5lIE5UU0NfQlVSU1RfU1RBUlQJMHgxOQkvKiAyOCAqLworI2RlZmluZSBOVFNDX0JVUlNUX0VORAkJMHgxZAkvKiAyOSAqLworI2RlZmluZSBOVFNDX0NIUk9NQV9QSEFTRQkweDY3CS8qIDVhICovCisjZGVmaW5lIE5UU0NfR0FJTlUJCTB4NzYJLyogNWIgKi8KKyNkZWZpbmUgTlRTQ19HQUlOVgkJMHhhNQkvKiA1YyAqLworI2RlZmluZSBOVFNDX0JMQUNLX0xFVkVMCTB4MmEJLyogNWQgKi8KKyNkZWZpbmUgTlRTQ19CTEFOS0lOR19MRVZFTAkweDJlCS8qIDVlICovCisjZGVmaW5lIE5UU0NfVkJJX0JMQU5LSU5HCTB4MmUJLyogNWYgKi8KKyNkZWZpbmUgTlRTQ19EQUNfQ09OVFJPTAkweDExCS8qIDYxICovCisjZGVmaW5lIE5UU0NfQlVSU1RfQU1QCQkweDNmCS8qIDYyICovCisjZGVmaW5lIE5UU0NfU1VCQzMJCTB4MWYJLyogNjMgKi8KKyNkZWZpbmUgTlRTQ19TVUJDMgkJMHg3YwkvKiA2NCAqLworI2RlZmluZSBOVFNDX1NVQkMxCQkweGYwCS8qIDY1ICovCisjZGVmaW5lIE5UU0NfU1VCQzAJCTB4MjEJLyogNjYgKi8KKyNkZWZpbmUgTlRTQ19IVFJJRwkJMHg3MgkvKiA2YyAqLworI2RlZmluZSBOVFNDX1ZUUklHCQkweDAwCS8qIDZjICovCisjZGVmaW5lIE5UU0NfTVVMVEkJCTB4MzAJLyogNmUgKi8KKyNkZWZpbmUgTlRTQ19DQ1RUWAkJMHgxMQkvKiA2ZiAqLworI2RlZmluZSBOVFNDX0ZJUlNUX0FDVElWRQkweDEyCS8qIDdhICovCisjZGVmaW5lIE5UU0NfTEFTVF9BQ1RJVkUJMHgwMgkvKiA3YiAqLworI2RlZmluZSBOVFNDX01TQl9WRVJUSUNBTAkweDQwCS8qIDdjICovCisKKyNkZWZpbmUgUEFMX0JVUlNUX1NUQVJUCQkweDIxCS8qIDI4ICovCisjZGVmaW5lIFBBTF9CVVJTVF9FTkQJCTB4MWQJLyogMjkgKi8KKyNkZWZpbmUgUEFMX0NIUk9NQV9QSEFTRQkweDNmCS8qIDVhICovCisjZGVmaW5lIFBBTF9HQUlOVQkJMHg3ZAkvKiA1YiAqLworI2RlZmluZSBQQUxfR0FJTlYJCTB4YWYJLyogNWMgKi8KKyNkZWZpbmUgUEFMX0JMQUNLX0xFVkVMCQkweDIzCS8qIDVkICovCisjZGVmaW5lIFBBTF9CTEFOS0lOR19MRVZFTAkweDM1CS8qIDVlICovCisjZGVmaW5lIFBBTF9WQklfQkxBTktJTkcJMHgzNQkvKiA1ZiAqLworI2RlZmluZSBQQUxfREFDX0NPTlRST0wJCTB4MDIJLyogNjEgKi8KKyNkZWZpbmUgUEFMX0JVUlNUX0FNUAkJMHgyZgkvKiA2MiAqLworI2RlZmluZSBQQUxfU1VCQzMJCTB4Y2IJLyogNjMgKi8KKyNkZWZpbmUgUEFMX1NVQkMyCQkweDhhCS8qIDY0ICovCisjZGVmaW5lIFBBTF9TVUJDMQkJMHgwOQkvKiA2NSAqLworI2RlZmluZSBQQUxfU1VCQzAJCTB4MmEJLyogNjYgKi8KKyNkZWZpbmUgUEFMX0hUUklHCQkweDg2CS8qIDZjICovCisjZGVmaW5lIFBBTF9WVFJJRwkJMHgwNAkvKiA2ZCAqLworI2RlZmluZSBQQUxfTVVMVEkJCTB4MjAJLyogNmUgKi8KKyNkZWZpbmUgUEFMX0NDVFRYCQkweDE1CS8qIDZmICovCisjZGVmaW5lIFBBTF9GSVJTVF9BQ1RJVkUJMHgxNgkvKiA3YSAqLworI2RlZmluZSBQQUxfTEFTVF9BQ1RJVkUJCTB4MzYJLyogN2IgKi8KKyNkZWZpbmUgUEFMX01TQl9WRVJUSUNBTAkweDQwCS8qIDdjICovCisKKy8qIEluaXRpYWxpemF0aW9uIFNlcXVlbmNlICovCisJIAorc3RhdGljIF9fdTggaW5pdDcxMjFudHNjW10gPSB7CisJMHgyNiwgMHgwLAkweDI3LCAweDAsCisJMHgyOCwgTlRTQ19CVVJTVF9TVEFSVCwJCTB4MjksIE5UU0NfQlVSU1RfRU5ELAorCTB4MmEsIDB4MCwJMHgyYiwgMHgwLAkweDJjLCAweDAsCTB4MmQsIDB4MCwKKwkweDJlLCAweDAsCTB4MmYsIDB4MCwJMHgzMCwgMHgwLAkweDMxLCAweDAsCisJMHgzMiwgMHgwLAkweDMzLCAweDAsCTB4MzQsIDB4MCwJMHgzNSwgMHgwLAorCTB4MzYsIDB4MCwJMHgzNywgMHgwLAkweDM4LCAweDAsCTB4MzksIDB4MCwKKwkweDNhLCAweDAzLAkweDNiLCAweDAsCTB4M2MsIDB4MCwJMHgzZCwgMHgwLAorCTB4M2UsIDB4MCwJMHgzZiwgMHgwLAkweDQwLCAweDAsCTB4NDEsIDB4MCwKKwkweDQyLCAweDAsCTB4NDMsIDB4MCwJMHg0NCwgMHgwLAkweDQ1LCAweDAsCisJMHg0NiwgMHgwLAkweDQ3LCAweDAsCTB4NDgsIDB4MCwJMHg0OSwgMHgwLAorCTB4NGEsIDB4MCwJMHg0YiwgMHgwLAkweDRjLCAweDAsCTB4NGQsIDB4MCwKKwkweDRlLCAweDAsCTB4NGYsIDB4MCwJMHg1MCwgMHgwLAkweDUxLCAweDAsCisJMHg1MiwgMHgwLAkweDUzLCAweDAsCTB4NTQsIDB4MCwJMHg1NSwgMHgwLAorCTB4NTYsIDB4MCwJMHg1NywgMHgwLAkweDU4LCAweDAsCTB4NTksIDB4MCwKKwkweDVhLCBOVFNDX0NIUk9NQV9QSEFTRSwJMHg1YiwgTlRTQ19HQUlOVSwKKwkweDVjLCBOVFNDX0dBSU5WLAkJMHg1ZCwgTlRTQ19CTEFDS19MRVZFTCwKKwkweDVlLCBOVFNDX0JMQU5LSU5HX0xFVkVMLAkweDVmLCBOVFNDX1ZCSV9CTEFOS0lORywKKwkweDYwLCAweDAsCQkJMHg2MSwgTlRTQ19EQUNfQ09OVFJPTCwKKwkweDYyLCBOVFNDX0JVUlNUX0FNUCwJCTB4NjMsIE5UU0NfU1VCQzMsCisJMHg2NCwgTlRTQ19TVUJDMiwJCTB4NjUsIE5UU0NfU1VCQzEsCisJMHg2NiwgTlRTQ19TVUJDMCwJCTB4NjcsIDB4ODAsCTB4NjgsIDB4ODAsCisJMHg2OSwgMHg4MCwJMHg2YSwgMHg4MCwJMHg2YiwgMHgyOSwKKwkweDZjLCBOVFNDX0hUUklHLAkJMHg2ZCwgTlRTQ19WVFJJRywKKwkweDZlLCBOVFNDX01VTFRJLAkJMHg2ZiwgTlRTQ19DQ1RUWCwKKwkweDcwLCAweGM5LAkweDcxLCAweDY4LAkweDcyLCAweDYwLAkweDczLCAweDAsCisJMHg3NCwgMHgwLAkweDc1LCAweDAsCTB4NzYsIDB4MCwJMHg3NywgMHgwLAorCTB4NzgsIDB4MCwJMHg3OSwgMHgwLAkweDdhLCBOVFNDX0ZJUlNUX0FDVElWRSwKKwkweDdiLCBOVFNDX0xBU1RfQUNUSVZFLAkJMHg3YywgTlRTQ19NU0JfVkVSVElDQUwsCisJMHg3ZCwgMHgwLAkweDdlLCAweDAsCTB4N2YsIDB4MAorfTsgCisjZGVmaW5lIElOSVQ3MTIxTEVOCShzaXplb2YoaW5pdDcxMjFudHNjKS8yKQorCitzdGF0aWMgX191OCBpbml0NzEyMXBhbFtdID0geworCTB4MjYsIDB4MCwJMHgyNywgMHgwLAorCTB4MjgsIFBBTF9CVVJTVF9TVEFSVCwJCTB4MjksIFBBTF9CVVJTVF9FTkQsCisJMHgyYSwgMHgwLAkweDJiLCAweDAsCTB4MmMsIDB4MCwJMHgyZCwgMHgwLAorCTB4MmUsIDB4MCwJMHgyZiwgMHgwLAkweDMwLCAweDAsCTB4MzEsIDB4MCwKKwkweDMyLCAweDAsCTB4MzMsIDB4MCwJMHgzNCwgMHgwLAkweDM1LCAweDAsCisJMHgzNiwgMHgwLAkweDM3LCAweDAsCTB4MzgsIDB4MCwJMHgzOSwgMHgwLAorCTB4M2EsIDB4MDMsCTB4M2IsIDB4MCwJMHgzYywgMHgwLAkweDNkLCAweDAsCisJMHgzZSwgMHgwLAkweDNmLCAweDAsCTB4NDAsIDB4MCwJMHg0MSwgMHgwLAorCTB4NDIsIDB4MCwJMHg0MywgMHgwLAkweDQ0LCAweDAsCTB4NDUsIDB4MCwKKwkweDQ2LCAweDAsCTB4NDcsIDB4MCwJMHg0OCwgMHgwLAkweDQ5LCAweDAsCisJMHg0YSwgMHgwLAkweDRiLCAweDAsCTB4NGMsIDB4MCwJMHg0ZCwgMHgwLAorCTB4NGUsIDB4MCwJMHg0ZiwgMHgwLAkweDUwLCAweDAsCTB4NTEsIDB4MCwKKwkweDUyLCAweDAsCTB4NTMsIDB4MCwJMHg1NCwgMHgwLAkweDU1LCAweDAsCisJMHg1NiwgMHgwLAkweDU3LCAweDAsCTB4NTgsIDB4MCwJMHg1OSwgMHgwLAorCTB4NWEsIFBBTF9DSFJPTUFfUEhBU0UsCQkweDViLCBQQUxfR0FJTlUsCisJMHg1YywgUEFMX0dBSU5WLAkJMHg1ZCwgUEFMX0JMQUNLX0xFVkVMLAorCTB4NWUsIFBBTF9CTEFOS0lOR19MRVZFTCwJMHg1ZiwgUEFMX1ZCSV9CTEFOS0lORywKKwkweDYwLCAweDAsCQkJMHg2MSwgUEFMX0RBQ19DT05UUk9MLAorCTB4NjIsIFBBTF9CVVJTVF9BTVAsCQkweDYzLCBQQUxfU1VCQzMsCisJMHg2NCwgUEFMX1NVQkMyLAkJMHg2NSwgUEFMX1NVQkMxLAorCTB4NjYsIFBBTF9TVUJDMCwJCTB4NjcsIDB4ODAsCTB4NjgsIDB4ODAsCisJMHg2OSwgMHg4MCwJMHg2YSwgMHg4MCwJMHg2YiwgMHgyOSwKKwkweDZjLCBQQUxfSFRSSUcsCQkweDZkLCBQQUxfVlRSSUcsCisJMHg2ZSwgUEFMX01VTFRJLAkJMHg2ZiwgUEFMX0NDVFRYLAorCTB4NzAsIDB4YzksCTB4NzEsIDB4NjgsCTB4NzIsIDB4NjAsCTB4NzMsIDB4MCwKKwkweDc0LCAweDAsCTB4NzUsIDB4MCwJMHg3NiwgMHgwLAkweDc3LCAweDAsCisJMHg3OCwgMHgwLAkweDc5LCAweDAsCTB4N2EsIFBBTF9GSVJTVF9BQ1RJVkUsCisJMHg3YiwgUEFMX0xBU1RfQUNUSVZFLAkJMHg3YywgUEFMX01TQl9WRVJUSUNBTCwKKwkweDdkLCAweDAsCTB4N2UsIDB4MCwJMHg3ZiwgMHgwCit9OyAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzdhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorCitzYWE3MTM0LW9ianMgOj0Jc2FhNzEzNC1jYXJkcy5vIHNhYTcxMzQtY29yZS5vIHNhYTcxMzQtaTJjLm8JXAorCQlzYWE3MTM0LW9zcy5vIHNhYTcxMzQtdHMubyBzYWE3MTM0LXR2YXVkaW8ubwlcCisJCXNhYTcxMzQtdmJpLm8gc2FhNzEzNC12aWRlby5vIHNhYTcxMzQtaW5wdXQubworCitvYmotJChDT05GSUdfVklERU9fU0FBNzEzNCkgKz0gc2FhNzEzNC5vIHNhYTcxMzQtZW1wcmVzcy5vIHNhYTY3NTJocy5vCitvYmotJChDT05GSUdfVklERU9fU0FBNzEzNF9EVkIpICs9IHNhYTcxMzQtZHZiLm8KKworRVhUUkFfQ0ZMQUdTICs9IC1JJChzcmMpLy4uCitFWFRSQV9DRkxBR1MgKz0gLUkkKHNyY3RyZWUpL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitFWFRSQV9DRkxBR1MgKz0gLUkkKHNyY3RyZWUpL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTEzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMKQEAgLTAsMCArMSw1NDMgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCisjaW5jbHVkZSA8bWVkaWEvaWQuaD4KKworI2RlZmluZSBNUEVHX1ZJREVPX1RBUkdFVF9CSVRSQVRFX01BWCAgMjcwMDAKKyNkZWZpbmUgTVBFR19WSURFT19NQVhfQklUUkFURV9NQVggICAgIDI3MDAwCisjZGVmaW5lIE1QRUdfVE9UQUxfVEFSR0VUX0JJVFJBVEVfTUFYICAyNzAwMAorI2RlZmluZSBNUEVHX1BJRF9NQVggKCgxIDw8IDE0KSAtIDEpCisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0gezB4MjAsIEkyQ19DTElFTlRfRU5EfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjX3JhbmdlW10gPSB7STJDX0NMSUVOVF9FTkR9OworSTJDX0NMSUVOVF9JTlNNT0Q7CisKK01PRFVMRV9ERVNDUklQVElPTigiZGV2aWNlIGRyaXZlciBmb3Igc2FhNjc1MmhzIE1QRUcyIGVuY29kZXIiKTsKK01PRFVMRV9BVVRIT1IoIkFuZHJldyBkZSBRdWluY2V5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXI7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOworCitzdHJ1Y3Qgc2FhNjc1MmhzX3N0YXRlIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAgICAgICBjbGllbnQ7CisJc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAgcGFyYW1zOworfTsKKworZW51bSBzYWE2NzUyaHNfY29tbWFuZCB7CisJU0FBNjc1MkhTX0NPTU1BTkRfUkVTRVQgPSAwLAorICAgIAlTQUE2NzUySFNfQ09NTUFORF9TVE9QID0gMSwKKyAgICAJU0FBNjc1MkhTX0NPTU1BTkRfU1RBUlQgPSAyLAorICAgIAlTQUE2NzUySFNfQ09NTUFORF9QQVVTRSA9IDMsCisgICAgCVNBQTY3NTJIU19DT01NQU5EX1JFQ09ORklHVVJFID0gNCwKKyAgICAJU0FBNjc1MkhTX0NPTU1BTkRfU0xFRVAgPSA1LAorCVNBQTY3NTJIU19DT01NQU5EX1JFQ09ORklHVVJFX0ZPUkNFID0gNiwKKworCVNBQTY3NTJIU19DT01NQU5EX01BWAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdTggUEFUW10gPSB7CisJMHhjMiwgLy8gaTJjIHJlZ2lzdGVyCisJMHgwMCwgLy8gdGFibGUgbnVtYmVyIGZvciBlbmNvZGVyCisKKwkweDQ3LCAvLyBzeW5jCisJMHg0MCwgMHgwMCwgLy8gdHJhbnNwb3J0X2Vycm9yX2luZGljYXRvcigwKSwgcGF5bG9hZF91bml0X3N0YXJ0KDEpLCB0cmFuc3BvcnRfcHJpb3JpdHkoMCksIHBpZCgwKQorCTB4MTAsIC8vIHRyYW5zcG9ydF9zY3JhbWJsaW5nX2NvbnRyb2woMDApLCBhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2woMDEpLCBjb250aW51aXR5X2NvdW50ZXIoMCkKKworCTB4MDAsIC8vIFBTSSBwb2ludGVyIHRvIHN0YXJ0IG9mIHRhYmxlCisKKwkweDAwLCAvLyB0aWQoMCkKKwkweGIwLCAweDBkLCAvLyBzZWN0aW9uX3N5bnRheF9pbmRpY2F0b3IoMSksIHNlY3Rpb25fbGVuZ3RoKDEzKQorCisJMHgwMCwgMHgwMSwgLy8gdHJhbnNwb3J0X3N0cmVhbV9pZCgxKQorCisJMHhjMSwgLy8gdmVyc2lvbl9udW1iZXIoMCksIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IoMSkKKworCTB4MDAsIDB4MDAsIC8vIHNlY3Rpb25fbnVtYmVyKDApLCBsYXN0X3NlY3Rpb25fbnVtYmVyKDApCisKKwkweDAwLCAweDAxLCAvLyBwcm9ncmFtX251bWJlcigxKQorCisJMHhlMCwgMHgwMCwgLy8gUE1UIFBJRAorCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCAvLyBDUkMzMgorfTsKKworc3RhdGljIHU4IFBNVFtdID0geworCTB4YzIsIC8vIGkyYyByZWdpc3RlcgorCTB4MDEsIC8vIHRhYmxlIG51bWJlciBmb3IgZW5jb2RlcgorCisJMHg0NywgLy8gc3luYworCTB4NDAsIDB4MDAsIC8vIHRyYW5zcG9ydF9lcnJvcl9pbmRpY2F0b3IoMCksIHBheWxvYWRfdW5pdF9zdGFydCgxKSwgdHJhbnNwb3J0X3ByaW9yaXR5KDApLCBwaWQKKwkweDEwLCAvLyB0cmFuc3BvcnRfc2NyYW1ibGluZ19jb250cm9sKDAwKSwgYWRhcHRhdGlvbl9maWVsZF9jb250cm9sKDAxKSwgY29udGludWl0eV9jb3VudGVyKDApCisKKwkweDAwLCAvLyBQU0kgcG9pbnRlciB0byBzdGFydCBvZiB0YWJsZQorCisJMHgwMiwgLy8gdGlkKDIpCisJMHhiMCwgMHgxNywgLy8gc2VjdGlvbl9zeW50YXhfaW5kaWNhdG9yKDEpLCBzZWN0aW9uX2xlbmd0aCgyMykKKworCTB4MDAsIDB4MDEsIC8vIHByb2dyYW1fbnVtYmVyKDEpCisKKwkweGMxLCAvLyB2ZXJzaW9uX251bWJlcigwKSwgY3VycmVudF9uZXh0X2luZGljYXRvcigxKQorCisJMHgwMCwgMHgwMCwgLy8gc2VjdGlvbl9udW1iZXIoMCksIGxhc3Rfc2VjdGlvbl9udW1iZXIoMCkKKworCTB4ZTAsIDB4MDAsIC8vIFBDUl9QSUQKKworCTB4ZjAsIDB4MDAsIC8vIHByb2dyYW1faW5mb19sZW5ndGgoMCkKKworCTB4MDIsIDB4ZTAsIDB4MDAsIDB4ZjAsIDB4MDAsIC8vIHZpZGVvIHN0cmVhbSB0eXBlKDIpLCBwaWQKKwkweDA0LCAweGUwLCAweDAwLCAweGYwLCAweDAwLCAvLyBhdWRpbyBzdHJlYW0gdHlwZSg0KSwgcGlkCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwIC8vIENSQzMyCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiBwYXJhbV9kZWZhdWx0cyA9Cit7CisJLnN0X3R5cGUgICAgICAgICA9IFY0TDJfTVBFR19UU18yLAorCS5zdF9iaXRyYXRlICAgICAgPSB7CisJCS5tb2RlICAgID0gVjRMMl9CSVRSQVRFX0NCUiwKKwkJLnRhcmdldCAgPSA3MDAwLAorCX0sCisKKwkudHNfcGlkX3BtdCAgICAgID0gMTYsCisJLnRzX3BpZF92aWRlbyAgICA9IDI2MCwKKwkudHNfcGlkX2F1ZGlvICAgID0gMjU2LAorCS50c19waWRfcGNyICAgICAgPSAyNTksCisKKwkudmlfdHlwZSAgICAgICAgID0gVjRMMl9NUEVHX1ZJXzIsCisJLnZpX2FzcGVjdF9yYXRpbyA9IFY0TDJfTVBFR19BU1BFQ1RfNF8zLAorCS52aV9iaXRyYXRlICAgICAgPSB7CisJCS5tb2RlICAgID0gVjRMMl9CSVRSQVRFX1ZCUiwKKwkJLnRhcmdldCAgPSA0MDAwLAorCQkubWF4ICAgICA9IDYwMDAsCisJfSwKKworCS5hdV90eXBlICAgICAgICAgPSBWNEwyX01QRUdfQVVfMl9JSSwKKwkuYXVfYml0cmF0ZSAgICAgID0geworCQkubW9kZSAgICA9IFY0TDJfQklUUkFURV9DQlIsCisJCS50YXJnZXQgID0gMjU2LAorCX0sCisKKyNpZiAwCisJLyogRklYTUU6IHNpemU/IHZpYSBTX0ZNVD8gKi8KKwkudmlkZW9fZm9ybWF0ID0gTVBFR19WSURFT19GT1JNQVRfRDEsCisjZW5kaWYKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzYWE2NzUyaHNfY2hpcF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50KiBjbGllbnQsCisJCQkJICBlbnVtIHNhYTY3NTJoc19jb21tYW5kIGNvbW1hbmQpCit7CisJdW5zaWduZWQgY2hhciBidWZbM107CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBzdGF0dXMgPSAwOworCisJLy8gZXhlY3V0ZSB0aGUgY29tbWFuZAorCXN3aXRjaChjb21tYW5kKSB7CisgIAljYXNlIFNBQTY3NTJIU19DT01NQU5EX1JFU0VUOgorICAJCWJ1ZlswXSA9IDB4MDA7CisJCWJyZWFrOworCisJY2FzZSBTQUE2NzUySFNfQ09NTUFORF9TVE9QOgorCSAgCWJ1ZlswXSA9IDB4MDM7CisJCWJyZWFrOworCisJY2FzZSBTQUE2NzUySFNfQ09NTUFORF9TVEFSVDoKKyAgCQlidWZbMF0gPSAweDAyOworCQlicmVhazsKKworCWNhc2UgU0FBNjc1MkhTX0NPTU1BTkRfUEFVU0U6CisgIAkJYnVmWzBdID0gMHgwNDsKKwkJYnJlYWs7CisKKwljYXNlIFNBQTY3NTJIU19DT01NQU5EX1JFQ09ORklHVVJFOgorCQlidWZbMF0gPSAweDA1OworCQlicmVhazsKKworICAJY2FzZSBTQUE2NzUySFNfQ09NTUFORF9TTEVFUDoKKyAgCQlidWZbMF0gPSAweDA2OworCQlicmVhazsKKworICAJY2FzZSBTQUE2NzUySFNfQ09NTUFORF9SRUNPTkZJR1VSRV9GT1JDRToKKwkJYnVmWzBdID0gMHgwNzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyAgCS8vIHNldCBpdCBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgc28KKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDEpOworCXRpbWVvdXQgPSBqaWZmaWVzICsgSFogKiAzOworCWZvciAoOzspIHsKKwkJLy8gZ2V0IHRoZSBjdXJyZW50IHN0YXR1cworCQlidWZbMF0gPSAweDEwOworCSAgCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMSk7CisJCWkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1ZiwgMSk7CisKKwkJaWYgKCEoYnVmWzBdICYgMHgyMCkpCisJCQlicmVhazsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcyx0aW1lb3V0KSkgeworCQkJc3RhdHVzID0gLUVUSU1FRE9VVDsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gd2FpdCBhIGJpdAorCQltc2xlZXAoMTApOworCX0KKworCS8vIGRlbGF5IGEgYml0IHRvIGxldCBlbmNvZGVyIHNldHRsZQorCW1zbGVlcCg1MCk7CisKKwkvLyBkb25lCisgIAlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgc2FhNjc1MmhzX3NldF9iaXRyYXRlKHN0cnVjdCBpMmNfY2xpZW50KiBjbGllbnQsCisJCQkJIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24qIHBhcmFtcykKK3sKKyAgCXU4IGJ1ZlszXTsKKworCS8vIHNldCB0aGUgYml0cmF0ZSBtb2RlCisJYnVmWzBdID0gMHg3MTsKKwlidWZbMV0gPSAocGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPT0gVjRMMl9CSVRSQVRFX1ZCUikgPyAwIDogMTsKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpOworCisJLy8gc2V0IHRoZSB2aWRlbyBiaXRyYXRlCisJaWYgKHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9WQlIpIHsKKwkJLy8gc2V0IHRoZSB0YXJnZXQgYml0cmF0ZQorCQlidWZbMF0gPSAweDgwOworCSAgICAJYnVmWzFdID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCA+PiA4OworCSAgCWJ1ZlsyXSA9IHBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQgJiAweGZmOworCQlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDMpOworCisJCS8vIHNldCB0aGUgbWF4IGJpdHJhdGUKKwkJYnVmWzBdID0gMHg4MTsKKwkgICAgCWJ1ZlsxXSA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tYXggPj4gODsKKwkgIAlidWZbMl0gPSBwYXJhbXMtPnZpX2JpdHJhdGUubWF4ICYgMHhmZjsKKwkJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAzKTsKKwl9IGVsc2UgeworCQkvLyBzZXQgdGhlIHRhcmdldCBiaXRyYXRlIChubyBtYXggYml0cmF0ZSBmb3IgQ0JSKQorICAJCWJ1ZlswXSA9IDB4ODE7CisJICAgIAlidWZbMV0gPSBwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0ID4+IDg7CisJICAJYnVmWzJdID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCAmIDB4ZmY7CisJCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMyk7CisJfQorCisJLy8gc2V0IHRoZSBhdWRpbyBiaXRyYXRlCisgCWJ1ZlswXSA9IDB4OTQ7CisJYnVmWzFdID0gKDI1NiA9PSBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0KSA/IDAgOiAxOworCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMik7CisKKwkvLyBzZXQgdGhlIHRvdGFsIGJpdHJhdGUKKwlidWZbMF0gPSAweGIxOworICAJYnVmWzFdID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldCA+PiA4OworICAJYnVmWzJdID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldCAmIDB4ZmY7CisJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAzKTsKKworCS8vIHJldHVybiBzdWNjZXNzCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgc2FhNjc1MmhzX3NldF9wYXJhbXMoc3RydWN0IGkyY19jbGllbnQqIGNsaWVudCwKKwkJCQkgc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiogcGFyYW1zKQoreworCXN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgKmggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCS8qIGNoZWNrIFBJRHMgKi8KKwlpZiAocGFyYW1zLT50c19waWRfcG10IDw9IE1QRUdfUElEX01BWCkKKwkJaC0+cGFyYW1zLnRzX3BpZF9wbXQgPSBwYXJhbXMtPnRzX3BpZF9wbXQ7CisJaWYgKHBhcmFtcy0+dHNfcGlkX3BjciA8PSBNUEVHX1BJRF9NQVgpCisJCWgtPnBhcmFtcy50c19waWRfcGNyID0gcGFyYW1zLT50c19waWRfcGNyOworCWlmIChwYXJhbXMtPnRzX3BpZF92aWRlbyA8PSBNUEVHX1BJRF9NQVgpCisJCWgtPnBhcmFtcy50c19waWRfdmlkZW8gPSBwYXJhbXMtPnRzX3BpZF92aWRlbzsKKwlpZiAocGFyYW1zLT50c19waWRfYXVkaW8gPD0gTVBFR19QSURfTUFYKQorCQloLT5wYXJhbXMudHNfcGlkX2F1ZGlvID0gcGFyYW1zLT50c19waWRfYXVkaW87CisKKwkvKiBjaGVjayBiaXRyYXRlIHBhcmFtZXRlcnMgKi8KKwlpZiAoKHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9DQlIpIHx8CisJICAgIChwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSA9PSBWNEwyX0JJVFJBVEVfVkJSKSkKKwkJaC0+cGFyYW1zLnZpX2JpdHJhdGUubW9kZSA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlOworCWlmIChwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSAhPSBWNEwyX0JJVFJBVEVfTk9ORSkKKwkJaC0+cGFyYW1zLnN0X2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldDsKKwlpZiAocGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgIT0gVjRMMl9CSVRSQVRFX05PTkUpCisJCWgtPnBhcmFtcy52aV9iaXRyYXRlLnRhcmdldCA9IHBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQ7CisJaWYgKHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9WQlIpCisJCWgtPnBhcmFtcy52aV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tYXg7CisJaWYgKHBhcmFtcy0+YXVfYml0cmF0ZS5tb2RlICE9IFY0TDJfQklUUkFURV9OT05FKQorCQloLT5wYXJhbXMuYXVfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0OworCisJLyogYXNwZWN0IHJhdGlvICovCisJaWYgKHBhcmFtcy0+dmlfYXNwZWN0X3JhdGlvID09IFY0TDJfTVBFR19BU1BFQ1RfNF8zIHx8CisJICAgIHBhcmFtcy0+dmlfYXNwZWN0X3JhdGlvID09IFY0TDJfTVBFR19BU1BFQ1RfMTZfOSkKKwkJaC0+cGFyYW1zLnZpX2FzcGVjdF9yYXRpbyA9IHBhcmFtcy0+dmlfYXNwZWN0X3JhdGlvOworCisJLyogcmFuZ2UgY2hlY2tzICovCisJaWYgKGgtPnBhcmFtcy5zdF9iaXRyYXRlLnRhcmdldCA+IE1QRUdfVE9UQUxfVEFSR0VUX0JJVFJBVEVfTUFYKQorCQloLT5wYXJhbXMuc3RfYml0cmF0ZS50YXJnZXQgPSBNUEVHX1RPVEFMX1RBUkdFVF9CSVRSQVRFX01BWDsKKwlpZiAoaC0+cGFyYW1zLnZpX2JpdHJhdGUudGFyZ2V0ID4gTVBFR19WSURFT19UQVJHRVRfQklUUkFURV9NQVgpCisJCWgtPnBhcmFtcy52aV9iaXRyYXRlLnRhcmdldCA9IE1QRUdfVklERU9fVEFSR0VUX0JJVFJBVEVfTUFYOworCWlmIChoLT5wYXJhbXMudmlfYml0cmF0ZS5tYXggPiBNUEVHX1ZJREVPX01BWF9CSVRSQVRFX01BWCkKKwkJaC0+cGFyYW1zLnZpX2JpdHJhdGUubWF4ID0gTVBFR19WSURFT19NQVhfQklUUkFURV9NQVg7CisJaWYgKGgtPnBhcmFtcy5hdV9iaXRyYXRlLnRhcmdldCA8PSAyNTYpCisJCWgtPnBhcmFtcy5hdV9iaXRyYXRlLnRhcmdldCA9IDI1NjsKKwllbHNlCisJCWgtPnBhcmFtcy5hdV9iaXRyYXRlLnRhcmdldCA9IDM4NDsKK30KKworc3RhdGljIGludCBzYWE2NzUyaHNfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCogY2xpZW50KQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzldLCBidWYyWzRdOworCXN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgKmg7CisJdTMyIGNyYzsKKwl1bnNpZ25lZCBjaGFyIGxvY2FsUEFUWzI1Nl07CisJdW5zaWduZWQgY2hhciBsb2NhbFBNVFsyNTZdOworCisJaCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJLy8gU2V0IHZpZGVvIGZvcm1hdCAtIG11c3QgYmUgZG9uZSBmaXJzdCBhcyBpdCByZXNldHMgb3RoZXIgc2V0dGluZ3MKKwlidWZbMF0gPSAweDQxOworCWJ1ZlsxXSA9IDAgLyogTVBFR19WSURFT19GT1JNQVRfRDEgKi87CisJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAyKTsKKworICAgICAgICAvLyBzZXQgYml0cmF0ZQorICAgICAgICBzYWE2NzUyaHNfc2V0X2JpdHJhdGUoY2xpZW50LCAmaC0+cGFyYW1zKTsKKworCS8vIFNldCBHT1Agc3RydWN0dXJlIHszLCAxM30KKwlidWZbMF0gPSAweDcyOworCWJ1ZlsxXSA9IDB4MDM7CisJYnVmWzJdID0gMHgwRDsKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LGJ1ZiwzKTsKKworICAgIAkvLyBTZXQgbWluaW11bSBRLXNjYWxlIHs0fQorCWJ1ZlswXSA9IDB4ODI7CisJYnVmWzFdID0gMHgwNDsKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LGJ1ZiwyKTsKKworICAgIAkvLyBTZXQgbWF4aW11bSBRLXNjYWxlIHsxMn0KKwlidWZbMF0gPSAweDgzOworCWJ1ZlsxXSA9IDB4MEM7CisJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWYsMik7CisKKyAgICAJLy8gU2V0IE91dHB1dCBQcm90b2NvbAorCWJ1ZlswXSA9IDB4RDA7CisJYnVmWzFdID0gMHg4MTsKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LGJ1ZiwyKTsKKworICAgIAkvLyBTZXQgdmlkZW8gb3V0cHV0IHN0cmVhbSBmb3JtYXQge1RTfQorCWJ1ZlswXSA9IDB4QjA7CisJYnVmWzFdID0gMHgwNTsKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LGJ1ZiwyKTsKKworCS8qIGNvbXB1dGUgUEFUICovCisJbWVtY3B5KGxvY2FsUEFULCBQQVQsIHNpemVvZihQQVQpKTsKKwlsb2NhbFBBVFsxN10gPSAweGUwIHwgKChoLT5wYXJhbXMudHNfcGlkX3BtdCA+PiA4KSAmIDB4MGYpOworCWxvY2FsUEFUWzE4XSA9IGgtPnBhcmFtcy50c19waWRfcG10ICYgMHhmZjsKKwljcmMgPSBjcmMzMl9iZSh+MCwgJmxvY2FsUEFUWzddLCBzaXplb2YoUEFUKSAtIDcgLSA0KTsKKwlsb2NhbFBBVFtzaXplb2YoUEFUKSAtIDRdID0gKGNyYyA+PiAyNCkgJiAweEZGOworCWxvY2FsUEFUW3NpemVvZihQQVQpIC0gM10gPSAoY3JjID4+IDE2KSAmIDB4RkY7CisJbG9jYWxQQVRbc2l6ZW9mKFBBVCkgLSAyXSA9IChjcmMgPj4gOCkgJiAweEZGOworCWxvY2FsUEFUW3NpemVvZihQQVQpIC0gMV0gPSBjcmMgJiAweEZGOworCisJLyogY29tcHV0ZSBQTVQgKi8KKyAgICAgIAltZW1jcHkobG9jYWxQTVQsIFBNVCwgc2l6ZW9mKFBNVCkpOworICAgCWxvY2FsUE1UWzNdID0gMHg0MCB8ICgoaC0+cGFyYW1zLnRzX3BpZF9wbXQgPj4gOCkgJiAweDBmKTsKKyAgIAlsb2NhbFBNVFs0XSA9IGgtPnBhcmFtcy50c19waWRfcG10ICYgMHhmZjsKKwlsb2NhbFBNVFsxNV0gPSAweEUwIHwgKChoLT5wYXJhbXMudHNfcGlkX3BjciA+PiA4KSAmIDB4MEYpOworCWxvY2FsUE1UWzE2XSA9IGgtPnBhcmFtcy50c19waWRfcGNyICYgMHhGRjsKKwlsb2NhbFBNVFsyMF0gPSAweEUwIHwgKChoLT5wYXJhbXMudHNfcGlkX3ZpZGVvID4+IDgpICYgMHgwRik7CisJbG9jYWxQTVRbMjFdID0gaC0+cGFyYW1zLnRzX3BpZF92aWRlbyAmIDB4RkY7CisJbG9jYWxQTVRbMjVdID0gMHhFMCB8ICgoaC0+cGFyYW1zLnRzX3BpZF9hdWRpbyA+PiA4KSAmIDB4MEYpOworCWxvY2FsUE1UWzI2XSA9IGgtPnBhcmFtcy50c19waWRfYXVkaW8gJiAweEZGOworCWNyYyA9IGNyYzMyX2JlKH4wLCAmbG9jYWxQTVRbN10sIHNpemVvZihQTVQpIC0gNyAtIDQpOworCWxvY2FsUE1UW3NpemVvZihQTVQpIC0gNF0gPSAoY3JjID4+IDI0KSAmIDB4RkY7CisJbG9jYWxQTVRbc2l6ZW9mKFBNVCkgLSAzXSA9IChjcmMgPj4gMTYpICYgMHhGRjsKKwlsb2NhbFBNVFtzaXplb2YoUE1UKSAtIDJdID0gKGNyYyA+PiA4KSAmIDB4RkY7CisJbG9jYWxQTVRbc2l6ZW9mKFBNVCkgLSAxXSA9IGNyYyAmIDB4RkY7CisKKyAgICAJLy8gU2V0IEF1ZGlvIFBJRAorCWJ1ZlswXSA9IDB4QzE7CisJYnVmWzFdID0gKGgtPnBhcmFtcy50c19waWRfYXVkaW8gPj4gOCkgJiAweEZGOworCWJ1ZlsyXSA9IGgtPnBhcmFtcy50c19waWRfYXVkaW8gJiAweEZGOworCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDMpOworCisJLy8gU2V0IFZpZGVvIFBJRAorCWJ1ZlswXSA9IDB4QzA7CisJYnVmWzFdID0gKGgtPnBhcmFtcy50c19waWRfdmlkZW8gPj4gOCkgJiAweEZGOworCWJ1ZlsyXSA9IGgtPnBhcmFtcy50c19waWRfdmlkZW8gJiAweEZGOworCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDMpOworCisgCS8vIFNldCBQQ1IgUElECisJYnVmWzBdID0gMHhDNDsKKwlidWZbMV0gPSAoaC0+cGFyYW1zLnRzX3BpZF9wY3IgPj4gOCkgJiAweEZGOworCWJ1ZlsyXSA9IGgtPnBhcmFtcy50c19waWRfcGNyICYgMHhGRjsKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LGJ1ZiwzKTsKKworCS8vIFNlbmQgU0kgdGFibGVzCisJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxsb2NhbFBBVCxzaXplb2YoUEFUKSk7CisJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxsb2NhbFBNVCxzaXplb2YoUE1UKSk7CisKKwkvLyBtdXRlIHRoZW4gdW5tdXRlIGF1ZGlvLiBUaGlzIHJlbW92ZXMgYnV6emluZyBhcnRlZmFjdHMKKwlidWZbMF0gPSAweGE0OworCWJ1ZlsxXSA9IDE7CisJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAyKTsKKyAgCWJ1ZlsxXSA9IDA7CisJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAyKTsKKworCS8vIHN0YXJ0IGl0IGdvaW5nCisJc2FhNjc1MmhzX2NoaXBfY29tbWFuZChjbGllbnQsIFNBQTY3NTJIU19DT01NQU5EX1NUQVJUKTsKKworCS8vIHJlYWRvdXQgY3VycmVudCBzdGF0ZQorCWJ1ZlswXSA9IDB4RTE7CisJYnVmWzFdID0gMHhBNzsKKwlidWZbMl0gPSAweEZFOworCWJ1ZlszXSA9IDB4ODI7CisJYnVmWzRdID0gMHhCMDsKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDUpOworCWkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1ZjIsIDQpOworCisJLy8gY2hhbmdlIGFzcGVjdCByYXRpbworCWJ1ZlswXSA9IDB4RTA7CisJYnVmWzFdID0gMHhBNzsKKwlidWZbMl0gPSAweEZFOworCWJ1ZlszXSA9IDB4ODI7CisJYnVmWzRdID0gMHhCMDsKKwlidWZbNV0gPSBidWYyWzBdOworCXN3aXRjaChoLT5wYXJhbXMudmlfYXNwZWN0X3JhdGlvKSB7CisJY2FzZSBWNEwyX01QRUdfQVNQRUNUXzE2Xzk6CisJCWJ1Zls2XSA9IGJ1ZjJbMV0gfCAweDQwOworCQlicmVhazsKKwljYXNlIFY0TDJfTVBFR19BU1BFQ1RfNF8zOgorCWRlZmF1bHQ6CisJCWJ1Zls2XSA9IGJ1ZjJbMV0gJiAweEJGOworCQlicmVhazsKKwkJYnJlYWs7CisJfQorCWJ1Zls3XSA9IGJ1ZjJbMl07CisJYnVmWzhdID0gYnVmMlszXTsKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDkpOworCisgICAJLy8gcmV0dXJuIHN1Y2Nlc3MKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWE2NzUyaHNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQoreworCXN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgKmg7CisKKyAgICAgICAgcHJpbnRrKCJzYWE2NzUyaHM6IGNoaXAgZm91bmQgQCAweCV4XG4iLCBhZGRyPDwxKTsKKworICAgICAgICBpZiAoTlVMTCA9PSAoaCA9IGttYWxsb2Moc2l6ZW9mKCpoKSwgR0ZQX0tFUk5FTCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworCW1lbXNldChoLDAsc2l6ZW9mKCpoKSk7CisJaC0+Y2xpZW50ID0gY2xpZW50X3RlbXBsYXRlOworCWgtPnBhcmFtcyA9IHBhcmFtX2RlZmF1bHRzOworCWgtPmNsaWVudC5hZGFwdGVyID0gYWRhcDsKKwloLT5jbGllbnQuYWRkciA9IGFkZHI7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoJmgtPmNsaWVudCwgaCk7CisgICAgICAgIGkyY19hdHRhY2hfY2xpZW50KCZoLT5jbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTY3NTJoc19wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBzYWE2NzUyaHNfYXR0YWNoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWE2NzUyaHNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHNhYTY3NTJoc19zdGF0ZSAqaDsKKworCWggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWtmcmVlKGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzYWE2NzUyaHNfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHNhYTY3NTJoc19zdGF0ZSAqaCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gKnBhcmFtcyA9IGFyZzsKKwlpbnQgZXJyID0gMDsKKworICAgICAgICBzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX1NfTVBFR0NPTVA6CisJCWlmIChOVUxMID09IHBhcmFtcykgeworCQkJLyogYXBwbHkgc2V0dGluZ3MgYW5kIHN0YXJ0IGVuY29kZXIgKi8KKwkJCXNhYTY3NTJoc19pbml0KGNsaWVudCk7CisJCQlicmVhazsKKwkJfQorCQlzYWE2NzUyaHNfc2V0X3BhcmFtcyhjbGllbnQsIHBhcmFtcyk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVklESU9DX0dfTVBFR0NPTVA6CisJCSpwYXJhbXMgPSBoLT5wYXJhbXM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImkyYyBzYWE2NzUyaHMgTVBFRyBlbmNvZGVyIiwKKyAgICAgICAgLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1NBQTY3NTJIUywKKyAgICAgICAgLmZsYWdzICAgICAgICAgID0gSTJDX0RGX05PVElGWSwKKyAgICAgICAgLmF0dGFjaF9hZGFwdGVyID0gc2FhNjc1MmhzX3Byb2JlLAorICAgICAgICAuZGV0YWNoX2NsaWVudCAgPSBzYWE2NzUyaHNfZGV0YWNoLAorICAgICAgICAuY29tbWFuZCAgICAgICAgPSBzYWE2NzUyaHNfY29tbWFuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQoreworCUkyQ19ERVZOQU1FKCJzYWE2NzUyaHMiKSwKKwkuZmxhZ3MgICAgICA9IEkyQ19DTElFTlRfQUxMT1dfVVNFLAorICAgICAgICAuZHJpdmVyICAgICA9ICZkcml2ZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzYWE2NzUyaHNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzYWE2NzUyaHNfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2FhNjc1MmhzX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHNhYTY3NTJoc19jbGVhbnVwX21vZHVsZSk7CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwZDMxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKQEAgLTAsMCArMSwyMDE4IEBACisKKy8qCisgKiAkSWQ6IHNhYTcxMzQtY2FyZHMuYyx2IDEuNTQgMjAwNS8wMy8wNyAxMjowMTo1MSBrcmF4ZWwgRXhwICQKKyAqCisgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKKyAqIGNhcmQtc3BlY2lmaWMgc3R1ZmYuCisgKgorICogKGMpIDIwMDEtMDQgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgInNhYTcxMzQtcmVnLmgiCisjaW5jbHVkZSAic2FhNzEzNC5oIgorCisvKiBjb21tbHkgdXNlZCBzdHJpbmdzICovCitzdGF0aWMgY2hhciBuYW1lX211dGVbXSAgICA9ICJtdXRlIjsKK3N0YXRpYyBjaGFyIG5hbWVfcmFkaW9bXSAgID0gIlJhZGlvIjsKK3N0YXRpYyBjaGFyIG5hbWVfdHZbXSAgICAgID0gIlRlbGV2aXNpb24iOworc3RhdGljIGNoYXIgbmFtZV90dl9tb25vW10gPSAiVFYgKG1vbm8gb25seSkiOworc3RhdGljIGNoYXIgbmFtZV9jb21wMVtdICAgPSAiQ29tcG9zaXRlMSI7CitzdGF0aWMgY2hhciBuYW1lX2NvbXAyW10gICA9ICJDb21wb3NpdGUyIjsKK3N0YXRpYyBjaGFyIG5hbWVfY29tcDNbXSAgID0gIkNvbXBvc2l0ZTMiOworc3RhdGljIGNoYXIgbmFtZV9jb21wNFtdICAgPSAiQ29tcG9zaXRlNCI7CitzdGF0aWMgY2hhciBuYW1lX3N2aWRlb1tdICA9ICJTLVZpZGVvIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBib2FyZCBjb25maWcgaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RydWN0IHNhYTcxMzRfYm9hcmQgc2FhNzEzNF9ib2FyZHNbXSA9IHsKKwlbU0FBNzEzNF9CT0FSRF9VTktOT1dOXSA9IHsKKwkJLm5hbWUJCT0gIlVOS05PV04vR0VORVJJQyIsCisJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlCT0gVFVORVJfQUJTRU5ULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSAiZGVmYXVsdCIsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUxLAorCQl9fSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX1BST1RFVVNfUFJPXSA9IHsKKwkJLyogL21lICovCisJCS5uYW1lCQk9ICJQcm90ZXVzIFBybyBbcGhpbGlwcyByZWZlcmVuY2UgZGVzaWduXSIsCisJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMF0gPSB7CisJCS8qICJNYXJjbyBkJ0l0cmkiIDxtZEBMaW51eC5JVD4gKi8KKwkJLm5hbWUJCT0gIkxpZmVWaWV3IEZseVZJREVPMzAwMCIsCisJCS5hdWRpb19jbG9jawk9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJCS5ncGlvbWFzayAgICAgICA9IDB4ZTAwMCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4ODAwMCwKKwkJCS50diAgID0gMSwKKyAgICAgICAgICAgICAgICB9LHsKKwkJCS5uYW1lID0gbmFtZV90dl9tb25vLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgwMDAwLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4NDAwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDQwMDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4NDAwMCwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MjAwMCwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMjAwMF0gPSB7CisJCS8qICJUQyBXYW4iIDx0Y3dhbkBjcy51c20ubXk+ICovCisJCS5uYW1lICAgICAgICAgICA9ICJMaWZlVmlldyBGbHlWSURFTzIwMDAiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19QQUxfTkVXX1RBUEMsCisJCS5ncGlvbWFzayAgICAgICA9IDB4ZTAwMCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDAwMCwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDQwMDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHg0MDAwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDQwMDAsCisJCX19LAorICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9yYWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MjAwMCwKKyAgICAgICAgICAgICAgICB9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHg4MDAwLAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9NSU5JXSA9IHsKKwkJLyogIkFybmF1ZCBRdWV0dGUiIDxhcXVldHRlQGZyZWUuZnI+ICovCisJCS5uYW1lICAgICAgICAgICA9ICJMaWZlVmlldyBGbHlUViBQbGF0aW51bSBNaW5pIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0ZMWVRWUExBVElOVU1fRk1dID0geworCQkvKiBMaWZlVmlldyBGbHlUViBQbGF0aW51bSBGTSAoTFIyMTRXRikgKi8KKwkJLyogIlBldGVyIE1pc3NlbCA8cGV0ZXIubWlzc2VsQG9ubGluZWhvbWUuZGU+ICovCisJCS5uYW1lICAgICAgICAgICA9ICJMaWZlVmlldyBGbHlUViBQbGF0aW51bSBGTSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKy8vCQkuZ3Bpb21hc2sgICAgICAgPSAweGUwMDAsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorLy8JCQkuZ3BpbyA9IDB4MDAwMCwKKwkJCS50diAgID0gMSwKKyAgICAgICAgICAgICAgICB9LHsKKy8qCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDAwMDAsCisJCQkudHYgICA9IDEsCisJCX0seworKi8JCQkubmFtZSA9IG5hbWVfY29tcDEsCS8qIENvbXBvc2l0ZSBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLworCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMiwKKy8vCQkJLmdwaW8gPSAweDQwMDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAkvKiBDb21wb3NpdGUgaW5wdXQgKi8KKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTIsCisvLwkJCS5ncGlvID0gMHg0MDAwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCS8qIFMtVmlkZW8gc2lnbmFsIG9uIFMtVmlkZW8gaW5wdXQgKi8KKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisvLwkJCS5ncGlvID0gMHg0MDAwLAorCQl9fSwKKy8qCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDIwMDAsCisJCX0sCisqLwl9LAorCVtTQUE3MTM0X0JPQVJEX0VNUFJFU1NdID0geworCQkvKiAiR2VydCBWZXJ2b29ydCIgPGdlcnQudmVydm9vcnRAcGhpbGlwcy5jb20+ICovCisJCS5uYW1lCQk9ICJFTVBSRVNTIiwKKwkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0sCisJCS5tcGVnICAgICAgPSBTQUE3MTM0X01QRUdfRU1QUkVTUywKKwkJLnZpZGVvX291dCA9IENDSVI2NTYsCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9NT05TVEVSVFZdID0geworICAgICAgICAgICAgICAgLyogIksuT2h0YSIgPGFscGhhMjkyQGJyZW1lbi5vci5qcD4gKi8KKyAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJTS05ldCBNb25zdGVyIFRWIiwKKyAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKyAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKKyAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAorICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCisgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAorICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorICAgICAgICAgICAgICAgfX0sCisgICAgICAgICAgICAgICAucmFkaW8gPSB7CisgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9yYWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKyAgICAgICAgICAgICAgIH0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9NRDk3MTddID0geworCQkubmFtZQkJPSAiVGV2aW9uIE1EIDk3MTciLAorCQkuYXVkaW9fY2xvY2sJPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkvKiB3b3JrYXJvdW5kIGZvciBwcm9ibGVtcyB3aXRoIG5vcm1hbCBUViBzb3VuZCAqLworCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMiwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9UVlNUQVRJT05fUkRTXSA9IHsKKyAgICAgICAgICAgICAgICAvKiBUeXBob29uIFRWIFR1bmVyIFJEUzogQXJ0Lk5yLiA1MDY5NCAqLworCQkubmFtZQkJPSAiS05DIE9uZSBUVi1TdGF0aW9uIFJEUyAvIFR5cGhvb24gVFYgVHVuZXIgUkRTIiwKKwkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHZfbW9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKKyAgICAgICAgICAgICAgICB9LHsKKworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gIkNWaWQgb3ZlciBTVmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisgICAgICAgICAgICAgICAgfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9UVlNUQVRJT05fRFZSXSA9IHsKKwkJLm5hbWUJCT0gIktOQyBPbmUgVFYtU3RhdGlvbiBEVlIiLAorCQkuYXVkaW9fY2xvY2sJPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkudGRhOTg4N19jb25mCT0gVERBOTg4N19QUkVTRU5ULAorCQkuZ3Bpb21hc2sJPSAweDgyMDAwMCwKKwkJLmlucHV0cwkJPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJCS5ncGlvID0gMHgyMDAwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHgyMDAwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDIwMDAwLAorCQl9fSwKKwkJLnJhZGlvCQk9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MjAwMDAsCisJCX0sCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19FTVBSRVNTLAorCQkudmlkZW9fb3V0CT0gQ0NJUjY1NiwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDBdID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IDQwMCBUViIsCisgICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKKyAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKyAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKKyAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMiwgLy8gQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9fQorICAgICAgICB9LAorCVtTQUE3MTM0X0JPQVJEX01ENTA0NF0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJNZWRpb24gNTA0NCIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsIC8vIHdhczogMHgwMDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLyogd29ya2Fyb3VuZCBmb3IgcHJvYmxlbXMgd2l0aCBub3JtYWwgVFYgc291bmQgKi8KKwkJCS5uYW1lID0gbmFtZV90dl9tb25vLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfS1dPUkxEXSA9IHsKKyAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiS3dvcmxkL0t1cm91dG9TaGlrb3UgU0FBNzEzMC1UVlBDSSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorICAgICAgICAgICAgICAgIH19LAorICAgICAgICB9LAorCVtTQUE3MTM0X0JPQVJEX0NJTkVSR1k2MDBdID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IDYwMCBUViIsCisgICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKKyAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLCAvLyBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorICAgICAgICAgICAgICAgIH19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAorICAgICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKwlbU0FBNzEzNF9CT0FSRF9NRDcxMzRdID0geworCQkubmFtZSAgICAgICAgICAgPSAiTWVkaW9uIDcxMzQiLAorCQkvLy5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisJCS5pbnB1dHMgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDAsCisJCQkuYW11eCAgID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggICA9IDgsCisJCQkuYW11eCAgID0gTElORTEsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX1RZUEhPT05fOTAwMzFdID0geworCQkvKiBha2EgVHlwaG9vbiAiVFYrUmFkaW8iLCBBcnQuTnIgOTAwMzEgKi8KKwkJLyogVG9tIFpvZXJuZXIgPHRvbXpvIGF0IHVzZXJzIHNvdXJjZWZvcmdlIG5ldD4gKi8KKwkJLm5hbWUgICAgICAgICAgID0gIlR5cGhvb24gVFYrUmFkaW8gOTAwMzEiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDMsCisJCQkuYW11eCAgID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggICA9IDgsCisJCQkuYW11eCAgID0gTElORTEsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJfSwKKyAgICAgICAgfSwKKwlbU0FBNzEzNF9CT0FSRF9FTFNBXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkVMU0EgRVgtVklTSU9OIDMwMFRWIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfSElUQUNISV9OVFNDLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfY29tcDEsCisJCQkudm11eCAgID0gMCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDQsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9fSwKKyAgICAgICAgfSwKKwlbU0FBNzEzNF9CT0FSRF9FTFNBXzUwMFRWXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkVMU0EgRVgtVklTSU9OIDUwMFRWIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfSElUQUNISV9OVFNDLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gNywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHZfbW9ubywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX19LAorICAgICAgICB9LAorCVtTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzRdID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBU1VTIFRWLUZNIDcxMzQiLAorICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisgICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisgICAgICAgICAgICAgICAgLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorICAgICAgICAgICAgICAgIH19LAorICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9yYWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisgICAgICAgICAgICAgICAgfSwKKwl9LAorCVtTQUE3MTM1X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzVdID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBU1VTIFRWLUZNIDcxMzUiLAorICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisgICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkuZ3Bpb21hc2sgICAgICAgPSAweDIwMDAwMCwKKyAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHgwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgwMDAwLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDAwMCwKKyAgICAgICAgICAgICAgICB9fSwKKyAgICAgICAgICAgICAgICAucmFkaW8gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfcmFkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDIwMDAwMCwKKyAgICAgICAgICAgICAgICB9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfVkExMDAwUE9XRVJdID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBT1BFTiBWQTEwMDAgUE9XRVIiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCisgICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisgICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCisgICAgICAgICAgICAgICAgfX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF8xME1PT05TVFZNQVNURVJdID0geworCQkvKiAibGlsaWNoZW5nIiA8bGxjQGxpbnV4ZmFucy5vcmc+ICovCisJCS5uYW1lICAgICAgICAgICA9ICIxME1PT05TIFBDSSBUViBDQVBUVVJFIENBUkQiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19QQUxfTkVXX1RBUEMsCisJCS5ncGlvbWFzayAgICAgICA9IDB4ZTAwMCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDAwMCwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDQwMDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHg0MDAwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDQwMDAsCisJCX19LAorICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9yYWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MjAwMCwKKyAgICAgICAgICAgICAgICB9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHg4MDAwLAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfQk1LX01QRVhfTk9UVU5FUl0gPSB7CisJCS8qICJBbmRyZXcgZGUgUXVpbmNleSIgPGFkcUBsaWRza2lhbGYubmV0PiAqLworCQkubmFtZQkJPSAiQk1LIE1QRVggTm8gVHVuZXIiLAorCQkuYXVkaW9fY2xvY2sJPSAweDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUJPSBUVU5FUl9BQlNFTlQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDQsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAzLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDQsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9fSwKKwkJLm1wZWcgICAgICA9IFNBQTcxMzRfTVBFR19FTVBSRVNTLAorCQkudmlkZW9fb3V0ID0gQ0NJUjY1NiwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJDb21wcm8gVmlkZW9NYXRlIFRWIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisgICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisgICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCisgICAgICAgICAgICAgICAgfX0sCisgICAgICAgIH0sCisgICAgW1NBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX0dPTERfUExVU10gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJDb21wcm8gVmlkZW9NYXRlIFRWIEdvbGQrIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJCS5ncGlvbWFzayAgICAgICA9IDB4ODAwYzAwMDAsCisgICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8gPSAweDA2YzAwMDEyLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvID0gMHgwYWMyMDAxMiwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbyA9IDB4MDhjMjAwMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCisgICAgICAgICAgICAgICAgfX0sCisgICAgICAgIH0sCisJW1NBQTcxMzRfQk9BUkRfQ1JPTk9TX1BMVVNdID0geworCQkvKiBncGlvIHBpbnM6CisJCSAgIDAgIC4uIDMgICBCQVNFX0lECisJCSAgIDQgIC4uIDcgICBQUk9URUNUX0lECisJCSAgIDggIC4uIDExICBVU0VSX09VVAorCQkgICAxMiAuLiAxMyAgVVNFUl9JTgorCQkgICAxNCAuLiAxNSAgVklESU5fU0VMICovCisJCS5uYW1lICAgICAgICAgICA9ICJNYXRyb3ggQ3Jvbm9zUGx1cyIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKwkJLmdwaW9tYXNrICAgICAgID0gMHhjZjAwLAorICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCisJCQkuZ3BpbyA9IDIgPDwgMTQsCisJCX0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAorCQkJLmdwaW8gPSAxIDw8IDE0LAorCQl9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMywKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKKwkJCS5ncGlvID0gMCA8PCAxNCwKKwkJfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDQsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCisJCQkuZ3BpbyA9IDMgPDwgMTQsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5ncGlvID0gMiA8PCAxNCwKKyAgICAgICAgICAgICAgICB9fSwKKyAgICAgICAgfSwKKwlbU0FBNzEzNF9CT0FSRF9NRDI4MTldID0geworCQkubmFtZSAgICAgICAgICAgPSAiQXZlck1lZGlhIE0xNTYgLyBNZWRpb24gMjgxOSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9CTUtfTVBFWF9UVU5FUl0gPSB7CisJCS8qICJHcmVnIFdpY2toYW0gPGdyZWcud2lja2hhbUBncmFuZ2VuZXQubmV0PiAqLworCQkubmFtZSAgICAgICAgICAgPSAiQk1LIE1QRVggVHVuZXIiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX19LAorCQkubXBlZyAgICAgID0gU0FBNzEzNF9NUEVHX0VNUFJFU1MsCisJCS52aWRlb19vdXQgPSBDQ0lSNjU2LAorICAgICAgICB9LAorICAgICAgICBbU0FBNzEzNF9CT0FSRF9BU1VTVEVLX1RWRk03MTMzXSA9IHsKKyAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQVNVUyBUVi1GTSA3MTMzIiwKKyAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkvLyBwcm9iYWJseSB3cm9uZywgdGhlIDcxMzMgb25lIGlzIHRoZSBOVFNDIHZlcnNpb24gLi4uCisJCS8vIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMworICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX0xHX05UU0NfTkVXX1RBUEMsCisgICAgICAgICAgICAgICAgLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorCQl9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA2LAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKyAgICAgICAgICAgICAgICB9fSwKKyAgICAgICAgICAgICAgICAucmFkaW8gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfcmFkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisJW1NBQTcxMzRfQk9BUkRfUElOTkFDTEVfUENUVl9TVEVSRU9dID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFN0ZXJlbyAoc2FhNzEzNCkiLAorICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisgICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTVQyMDMyLAorICAgICAgICAgICAgICAgIC50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCB8IFREQTk4ODdfSU5URVJDQVJSSUVSLAorICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKyAgICAgICAgICAgICAgICB9fSwKKyAgICAgICAgfSwKKwlbU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDJdID0geworCQkvKiBPZ25qZW4gTmFzdGljIDxvZ25qZW5AbG9nb3NvZnQuYmE+ICovCisJCS5uYW1lICAgICAgICAgICA9ICJNYW5saSBNdWNoVFYgTS1UVjAwMiIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfY29tcDEsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDFdID0geworCQkvKiBPZ25qZW4gTmFzdGljIDxvZ25qZW5AbG9nb3NvZnQuYmE+IFVOVEVTVEVEICovCisJCS5uYW1lICAgICAgICAgICA9ICJNYW5saSBNdWNoVFYgTS1UVjAwMSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9fSwKKyAgICAgICAgfSwKKwlbU0FBNzEzNF9CT0FSRF9URzMwMDBUVl0gPSB7CisJCS8qIFRyYW5zR2VhciAzMDAwVFYgKi8KKwkJLm5hbWUgICAgICAgICAgID0gIk5hZ2FzZSBTYW5neW8gVHJhbnNHZWFyIDMwMDBUViIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwl9LAorICAgICAgICBbU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXSA9IHsKKyAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiRWxpdGVncm91cCBFQ1MgVFZQM1hQIEZNMTIxNiBUdW5lciBDYXJkKFBBTC1CRyxGTSkgIiwKKyAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDE4N2RlNywgIC8vIHh0YWwgMzIuMSBNSHoKKyAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKyAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfdHYsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBUViwKKyAgICAgICAgICAgICAgICAgICAgICAgIC50diAgICAgPSAxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfdHZfbW9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IExJTkUyLAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgICA9IDEsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV9jb21wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAzLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IExJTkUxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDgsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9ICJDVmlkIG92ZXIgU1ZpZCIsCisJCQkudm11eCAgID0gMCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJfX0sCisgICAgICAgICAgICAgICAgLnJhZGlvID0geworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfcmFkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTIsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgW1NBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF80Q0I1XSA9IHsKKyAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiRWxpdGVncm91cCBFQ1MgVFZQM1hQIEZNMTIzNiBUdW5lciBDYXJkIChOVFNDLEZNKSIsCisgICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsCisgICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAorICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV90diwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IFRWLAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgICA9IDEsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV90dl9tb25vLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTIsCisgICAgICAgICAgICAgICAgICAgICAgICAudHYgICAgID0gMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTEsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSAiQ1ZpZCBvdmVyIFNWaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTEsCisgICAgICAgICAgICAgICAgfX0sCisgICAgICAgICAgICAgICAgLnJhZGlvID0geworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfcmFkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTIsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKwlbU0FBNzEzNF9CT0FSRF9BVkFDU1NNQVJUVFZdID0geworCQkvKiBSb21hbiBQc3pvbmN6ZW5rbyA8cm9ta2FAa29sb3MubWF0aC51bmkubG9kei5wbD4gKi8KKwkJLm5hbWUgICAgICAgICAgID0gIkFWQUNTIFNtYXJ0VFYiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisgICAgICAgICAgICAgICAgfSx7CisJCQkubmFtZSA9IG5hbWVfdHZfbW9ubywKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgyMDAwMDAsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfRFZEX0VaTUFLRVJdID0geworCQkvKiBNaWNoYWVsIFNtaXRoIDxtc21pdGhAY2JuY28uY29tPiAqLworCQkubmFtZSAgICAgICAgICAgPSAiQVZlck1lZGlhIERWRCBFWk1ha2VyIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCX19LAorCX0sCisgICAgICAgIFtTQUE3MTM0X0JPQVJEX05PVkFDX1BSSU1FVFY3MTMzXSA9IHsKKyAgICAgICAgICAgICAgICAvKiB0b3NoaWlAbmV0YnNkLm9yZyAqLworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJOb3ZhbCBQcmltZSBUViA3MTMzIiwKKyAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX0FMUFNfVFNCSDFfTlRTQywKKyAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKKyAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCisgICAgICAgICAgICAgICAgfX0sCisgICAgICAgIH0sCisJW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDVdID0geworCQkubmFtZSAgICAgICAgICAgPSAiQXZlck1lZGlhIEF2ZXJUViBTdHVkaW8gMzA1IiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyNTZfSUgzLAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5ncGlvbWFzayA9IDB4MywKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJIC5uYW1lID0gbmFtZV9yYWRpbywKKwkJCSAuYW11eCA9IExJTkUyLAorCQkgfSwKKwkJLm11dGUgPSB7CisJCQkgLm5hbWUgPSBuYW1lX211dGUsCisJCQkgLmFtdXggPSBMSU5FMSwKKwkJfSwKKwl9LAorICAJW1NBQTcxMzNfQk9BUkRfVVBNT1NUX1BVUlBMRV9UVl0gPSB7CisgIAkJLm5hbWUgICAgICAgICAgID0gIlVQTU9TVCBQVVJQTEUgVFYiLAorICAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisgIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszLAorICAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKyAgCQkuaW5wdXRzICAgICAgICAgPSB7eworICAJCQkubmFtZSA9IG5hbWVfdHYsCisgIAkJCS52bXV4ID0gNywKKyAgCQkJLmFtdXggPSBUViwKKyAgCQkJLnR2ICAgPSAxLAorICAJCX0seworICAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorICAJCQkudm11eCA9IDcsCisgIAkJCS5hbXV4ID0gTElORTEsCisgIAkJfX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9JVEVNU19NVFYwMDVdID0geworCQkvKiBOb3JtYW4gSm9uYXMgPG5vcm1hbmpvbmFzQGFyY29yLmRlPiAqLworCQkubmFtZSAgICAgICAgICAgPSAiSXRlbXMgTXVjaFRWIFBsdXMgLyBJVC0wMDUiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfY29tcDEsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9DSU5FUkdZMjAwXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgMjAwIFRWIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisgICAgICAgCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMiwgLy8gQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKwkJfX0sCisJCS5tdXRlID0geworCQkJIC5uYW1lID0gbmFtZV9tdXRlLAorCQkJIC5hbXV4ID0gTElORTIsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfUFZSXSA9IHsKKwkJLyogQWxhaW4gU3QtRGVuaXMgPGFsYWluQHRvcGF6ZS5ob21laXAubmV0PiAqLworCQkubmFtZSAgICAgICAgICAgPSAiQ29tcHJvIFZpZGVvTWF0ZSBUViBQVlIvRk0iLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKwkJLmdwaW9tYXNrCT0gMHg4MDhjMDA4MCwKKyAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4MDAwODAsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDAwMDgwLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMl9MRUZULAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorCQkJLmdwaW8gPSAweDAwMDgwLAorICAgICAgICAgICAgICAgIH19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDgwMDAwLAorCQkgfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4NDAwMDAsCisJCX0sCisgICAgICAgIH0sCisgICAgICAgIFtTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTV0gPSB7CisJCS8qIE1pY2hhZWwgUm9kcmlndWV6LVRvcnJlbnQgPG1ydG9ycmVudEBhc3UuZWR1PiAqLworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJTYWJyZW50IFNCVC1UVkZNIChzYWE3MTMwKSIsCisgICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKyAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKyAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisgICAgICAgICAgICAgICAgfX0sCisgICAgICAgICAgICAgICAgLnJhZGlvID0geworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfcmFkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTIsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKwlbU0FBNzEzNF9CT0FSRF9aT0xJRF9YUEVSVF9UVjcxMzRdID0geworCQkvKiBIZWxnZSBKZW5zZW4gPGhlbGdlLmplbnNlbkBzbG9nLmRrPiAqLworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICI6Wm9saWQgWHBlcnQgVFY3MTM0IiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAorICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorICAgICAgICAgICAgICAgIH19LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfRU1QSVJFX1BDSV9UVl9SQURJT19MRV0gPSB7CisJCS8qICJNYXR0ZW8gQXoiIDxtYXR0ZS5hekBub3NwYW0ubGliZXJvLml0PiA7LSkgKi8KKwkJLm5hbWUgICAgICAgICAgID0gIkVtcGlyZSBQQ0kgVFYtUmFkaW8gTEUiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLmdwaW9tYXNrICAgICAgID0gMHg0MDAwLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDgwMDAsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHg4MDAwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDYsCisJCQkuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDgwMDAsCisJCX19LAorICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKKwkJCSAubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkgLmFtdXggPSBMSU5FMSwKKwkJCSAuZ3BpbyA9IDB4ODAwMCwKKwkJIH0sCisJCS5tdXRlID0geworCQkJIC5uYW1lID0gbmFtZV9tdXRlLAorCQkJIC5hbXV4ID0gVFYsCisJCQkgLmdwaW8gPTB4ODAwMCwKKwkJIH0KKwl9LAorICAgICAgICBbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA3XSA9IHsKKwkJLyoKKwkJTmlja29sYXkgVi4gU2hteXJldiA8bnNobXlyZXZAeWFuZGV4LnJ1PgorCQlMb3RzIG9mIHRoYW5rcyB0byBBbmRyZXkgWm9sb3RhcmV2IDx6b2xvdGFyZXZfYW5kcmV5QG1haWwucnU+CisJCSovCisJCS5uYW1lICAgICAgICAgICA9ICJBdmVybWVkaWEgQVZlclRWIFN0dWRpbyAzMDciLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDMsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmdwaW9tYXNrICAgICAgID0gMHgwMywKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCQkuZ3BpbyA9IDB4MDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDAwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDAwLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHgwMSwKKwkJfSwKKyAgICAgICAgfSwKKwlbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQ0FSREJVU10gPSB7CisJCS8qIEpvbiBXZXN0Z2F0ZSA8b3J5bkBvcnluLmZzY2sudHY+ICovCisJCS5uYW1lICAgICAgICAgICA9ICJBVmVyTWVkaWEgQ2FyZGJ1cyBUVi9SYWRpbyIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwkJLnJhZGlvID0geworICAgICAgICAgICAgICAgIAkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUxLAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfQ0lORVJHWTQwMF9DQVJEQlVTXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNDAwIG1vYmlsZSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkU1X1BBTCwKKyAgCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisgICAgICAgCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKyAgICAgICAgICAgICAgIH0seworCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorCQl9fSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0NJTkVSR1k2MDBfTUszXSA9IHsKKyAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSA2MDAgVFYgTUszIiwKKyAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorICAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKyAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKKyAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMiwgLy8gQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKyAgICAgICAgICAgICAgICB9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKKyAgICAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgCVtTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9HT0xEX1BMVVNdID0geworIAkJLyogRHlsYW4gV2Fsa2RlbiA8ZHlsYW5fd2Fsa2RlbkBob3RtYWlsLmNvbT4gKi8KKyAJCS5uYW1lCQk9ICJDb21wcm8gVmlkZW9NYXRlIEdvbGQrIFBhbCIsCisgCQkuYXVkaW9fY2xvY2sJPSAweDAwMTg3ZGU3LAorIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKyAJCS5ncGlvbWFzawk9IDB4MWNlNzgwLAorIAkJLmlucHV0cwkJPSB7eworIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisgCQkJLnZtdXggPSAwLAkJLy8gQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvciAtIG9rPworIAkJCS5hbXV4ID0gTElORTEsCisgCQkJLmdwaW8gPSAweDAwODA4MCwKKyAJCX0seworIAkJCS5uYW1lID0gbmFtZV9jb21wMSwKKyAJCQkudm11eCA9IDMsCisgCQkJLmFtdXggPSBMSU5FMSwKKyAJCQkuZ3BpbyA9IDB4MDA4MDgwLAorIAkJfSx7CisgCQkJLm5hbWUgPSBuYW1lX3R2LAorIAkJCS52bXV4ID0gMSwKKyAJCQkuYW11eCA9IFRWLAorIAkJCS50diAgID0gMSwKKyAJCQkuZ3BpbyA9IDB4MDA4MDgwLAorIAkJfX0sCisgCQkucmFkaW8gPSB7CisgCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorIAkJCS5hbXV4ID0gTElORTIsCisgCQkJLmdwaW8gPSAweDgwMDAwLAorIAkJfSwKKyAJCS5tdXRlID0geworIAkJCS5uYW1lID0gbmFtZV9tdXRlLAorIAkJCS5hbXV4ID0gTElORTIsCisgCQkJLmdwaW8gPSAweDBjODAwMCwKKyAJCX0sCisgCX0sCisJW1NBQTcxMzRfQk9BUkRfUElOTkFDTEVfMzAwSV9EVkJUX1BBTF0gPSB7CisgICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlBpbm5hY2xlIFBDVFYgMzAwaSBEVkItVCArIFBBTCIsCisgICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKyAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCisgICAgICAgICAgICAgICAgLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19JTlRFUkNBUlJJRVIsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisgICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCisgICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCisgICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorICAgICAgICAgICAgICAgIH19LAorICAgICAgICB9LAorCVtTQUE3MTM0X0JPQVJEX1BST1ZJREVPX1BWOTUyXSA9IHsKKwkJLyogYW5kcmVhcy5rcmV0c2NobWVyQHdlYi5kZSAqLworCQkubmFtZQkJPSAiUHJvVmlkZW8gUFY5NTIiLAorCQkuYXVkaW9fY2xvY2sJPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDVdID0geworCQkvKiBtdWNoIGxpa2UgdGhlICJzdHVkaW8iIHZlcnNpb24gYnV0IHdpdGhvdXQgcmFkaW8KKwkJICogYW5kIGFub3RoZXIgdHVuZXIgKHNpcnNwaXJpdHVzQHlhbmRleC5ydSkgKi8KKwkJLm5hbWUgICAgICAgICAgID0gIkF2ZXJNZWRpYSBBdmVyVFYvMzA1IiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GUTEyMTZNRSwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkuZ3Bpb21hc2sgPSAweDMsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfX0sCisJCS5tdXRlID0geworCQkJIC5uYW1lID0gbmFtZV9tdXRlLAorCQkJIC5hbXV4ID0gTElORTEsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9GTFlEVkJURFVPXSA9IHsKKwkJLyogTGlmZVZpZXcgRmx5RFZCLVQgRFVPICovCisJCS8qICJOaWNvIFNhYmJpIDxuc2FiYmlAdGlzY2FsaS5pdD4gKi8KKwkJLm5hbWUgICAgICAgICAgID0gIkxpZmVWaWV3IEZseURWQi1UIERVTyIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKy8vCQkuZ3Bpb21hc2sgICAgICAgPSAweGUwMDAsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorLy8JCQkuZ3BpbyA9IDB4MDAwMCwKKwkJCS50diAgID0gMSwKKyAgICAgICAgICAgICAgICB9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwJLyogQ29tcG9zaXRlIHNpZ25hbCBvbiBTLVZpZGVvIGlucHV0ICovCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorLy8JCQkuZ3BpbyA9IDB4NDAwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCS8qIENvbXBvc2l0ZSBpbnB1dCAqLworCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMiwKKy8vCQkJLmdwaW8gPSAweDQwMDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywJLyogUy1WaWRlbyBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLworCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMiwKKy8vCQkJLmdwaW8gPSAweDQwMDAsCisJCX19LAorCX0sCit9OworY29uc3QgdW5zaWduZWQgaW50IHNhYTcxMzRfYmNvdW50ID0gQVJSQVlfU0laRShzYWE3MTM0X2JvYXJkcyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUENJIGlkcyArIHN1YnN5c3RlbSBJRHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0cnVjdCBwY2lfZGV2aWNlX2lkIHNhYTcxMzRfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuc3ViZGV2aWNlICAgID0gMHgyMDAxLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QUk9URVVTX1BSTywKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLnN1YmRldmljZSAgICA9IDB4MjAwMSwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfUFJPVEVVU19QUk8sCisgICAgICAgIH0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5zdWJkZXZpY2UgICAgPSAweDY3NTIsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0VNUFJFU1MsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMTMxLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDRlODUsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX01PTlNURVJUViwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKyAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTUzQiwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgxMTQyLAorICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDAsCisgICAgICAgIH0seworICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisgICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDE1M0IsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MTE0MywKKyAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwLAorICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNTNCLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDExNTgsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMF9NSzMsCisgICAgICAgIH0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE1M2IsCisJCS5zdWJkZXZpY2UgICAgPSAweDExNjIsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDBfQ0FSREJVUywKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4NTE2OCwKKwkJLnN1YmRldmljZSAgICA9IDB4MDEzOCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwLAorICAgICAgICB9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKyAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4NGU0MiwJCQkJLy8iVHlwaG9vbiBQQ0kgQ2FwdHVyZSBUViBDYXJkIiBBcnQuTm8uIDUwNjczCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MDEzOCwKKyAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlWSURFTzMwMDAsCisgICAgICAgIH0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDUxNjgsCisJCS5zdWJkZXZpY2UgICAgPSAweDAxMzgsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMjAwMCwKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNSwKKwkJLnN1YnZlbmRvciAgICA9IDB4NTE2OCwKKwkJLnN1YmRldmljZSAgICA9IDB4MDIxMiwgLyogbWluaXBjaSwgTFIyMTIgKi8KKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9NSU5JLAorICAgICAgICB9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAorCQkuc3ViZGV2aWNlICAgID0gMHgwMjE0LCAvKiBTdGFuZGFyZCBQQ0ksIExSMjE0V0YgKi8KKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTSwKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTZiZSwKKwkJLnN1YmRldmljZSAgICA9IDB4MDAwMywKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfTUQ3MTM0LAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDEwNDgsCisJCS5zdWJkZXZpY2UgICAgPSAweDIyNmIsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0VMU0EsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTA0OCwKKwkJLnN1YmRldmljZSAgICA9IDB4MjI2YiwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRUxTQV81MDBUViwKKwl9LHsKKyAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4NDIsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNCwKKwl9LHsKKyAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4NDUsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzVfQk9BUkRfQVNVU1RlS19UVkZNNzEzNSwKKwl9LHsKKyAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4MzAsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNCwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKyAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0ODQzLAorICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNURUtfVFZGTTcxMzMsCisJfSx7CisgICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKyAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0ODQwLAorICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzQsCisgICAgICAgIH0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5zdWJkZXZpY2UgICAgPSAweGZlMDEsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1RWU1RBVElPTl9SRFMsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTg5NCwKKwkJLnN1YmRldmljZSAgICA9IDB4ZmUwMSwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVFZTVEFUSU9OX1JEUywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxODk0LAorCQkuc3ViZGV2aWNlICAgID0gMHhhMDA2LAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9UVlNUQVRJT05fRFZSLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTEzMSwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg3MTMzLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9WQTEwMDBQT1dFUiwKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDIwMDEsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEXzEwTU9PTlNUVk1BU1RFUiwKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxODViLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweGMxMDAsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UViwKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxODViLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweGMxMDAsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVMsCisgICAgICAgIH0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfTUFUUk9YLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4ZDAsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NST05PU19QTFVTLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHhhNzBiLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9NRDI4MTksCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDIxMTUsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA1LAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgyMTA4LAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA1LAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgxMGZmLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfRFZEX0VaTUFLRVIsCisgICAgICAgIH0seworCQkvKiBBVmVyTWVkaWEgQ2FyZEJ1cyAqLworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHhkNmVlLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQ0FSREJVUywKKwl9LHsKKwkJLyogVHJhbnNHZWFyIDMwMDBUViAqLworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgwNTBjLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9URzMwMDBUViwKKwl9LHsKKyAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMWJkLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDAwMmIsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfUElOTkFDTEVfUENUVl9TVEVSRU8sCisgICAgICAgIH0seworICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisgICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDExYmQsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MDAyZCwKKyAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV8zMDBJX0RWQlRfUEFMLAorICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMDE5LAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDRjYjQsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUCwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKyAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTAxOSwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0Y2I1LAorICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBfNENCNSwKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisgCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTJhYiwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgwODAwLAorIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzNfQk9BUkRfVVBNT1NUX1BVUlBMRV9UViwKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAorCQkuc3VidmVuZG9yICAgID0gMHgxNTNCLAorCQkuc3ViZGV2aWNlICAgID0gMHgxMTUyLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZMjAwLAorIAl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDE4NWIsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4YzEwMCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX1BWUiwKKyAJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMTMxLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAwLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9TQUJSRU5UX1NCVFRWRk0sCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KKwkJLnN1YmRldmljZSAgICA9IDB4OTcxNSwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxODViLAorCQkuc3ViZGV2aWNlICAgID0gMHhjMjAwLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfR09MRF9QTFVTLAorICAgICAgICB9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxNTQwLAorCQkuc3ViZGV2aWNlICAgID0gMHg5NTI0LAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QUk9WSURFT19QVjk1MiwKKworIAl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAorCQkuc3ViZGV2aWNlICAgID0gMHgwMzA2LAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlEVkJURFVPLAorCisgCX0seworCQkvKiAtLS0gYm9hcmRzIHdpdGhvdXQgZWVwcm9tICsgc3Vic3lzdGVtIElEIC0tLSAqLworICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisgICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5zdWJkZXZpY2UgICAgPSAwLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9OT0FVVE8sCisgICAgICAgIH0seworICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisgICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5zdWJkZXZpY2UgICAgPSAwLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9OT0FVVE8sCisJfSx7CisKKwkJLyogLS0tIGRlZmF1bHQgY2F0Y2ggLS0tICovCisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVU5LTk9XTiwKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVU5LTk9XTiwKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVU5LTk9XTiwKKyAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNSwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVU5LTk9XTiwKKwl9LHsKKwkJLyogLS0tIGVuZCBvZiBsaXN0IC0tLSAqLworCX0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2FhNzEzNF9wY2lfdGJsKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGZseXZpZGVvIHR3ZWFrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAwCitzdGF0aWMgc3RydWN0IHsKKwljaGFyICAqbW9kZWw7CisJaW50ICAgdHVuZXJfdHlwZTsKK30gZmx5X2xpc3RbMHgyMF0gPSB7CisJLyogZGVmYXVsdCBjYXRjaCAuLi4gKi8KKwlbIDAgLi4uIDB4MWYgXSA9IHsKKwkJLm1vZGVsICAgICAgPSAiVU5LTk9XTiIsCisJCS50dW5lcl90eXBlID0gVFVORVJfQUJTRU5ULAorCX0sCisJLyogLi4uIHRoZSBvbmVzIGtub3duIHNvIGZhciAqLworCVsgMHgwNSBdID0geworCQkubW9kZWwgICAgICA9ICJQQUwtQkciLAorCQkudHVuZXJfdHlwZSA9IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywKKwl9LAorCVsgMHgxMCBdID0geworCQkubW9kZWwgICAgICA9ICJQQUwtQkcgLyBQQUwtREsiLAorCQkudHVuZXJfdHlwZSA9IFRVTkVSX1BISUxJUFNfUEFMLAorCX0sCisJWyAweDE1IF0gPSB7CisJCS5tb2RlbCAgICAgID0gIk5UU0MiLAorCQkudHVuZXJfdHlwZSA9IFRVTkVSX0FCU0VOVCAvKiBGSVhNRSAqLywKKwl9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBib2FyZF9mbHl2aWRlbyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKyNpZiAwCisJLyogbm9uLXdvcmtpbmcgYXR0ZW1wdCB0byBkZXRlY3QgdGhlIGNvcnJlY3QgdHVuZXIgdHlwZSAuLi4gKi8KKwl1MzIgdmFsdWU7CisJaW50IGluZGV4OworCisJdmFsdWUgPSBkZXYtPmdwaW9fdmFsdWU7CisJaW5kZXggPSAodmFsdWUgJiAweDFmMDApID4+IDg7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZseXZpZGVvOiBncGlvIGlzIDB4JXggW21vZGVsPSVzLHR1bmVyPSVkXVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCB2YWx1ZSwgZmx5X2xpc3RbaW5kZXhdLm1vZGVsLAorCSAgICAgICBmbHlfbGlzdFtpbmRleF0udHVuZXJfdHlwZSk7CisJZGV2LT50dW5lcl90eXBlID0gZmx5X2xpc3RbaW5kZXhdLnR1bmVyX3R5cGU7CisjZW5kaWYKKwlwcmludGsoIiVzOiB0aGVyZSBhcmUgZGlmZmVyZW50IGZseXZpZGVvIGNhcmRzIHdpdGggZGlmZmVyZW50IHR1bmVyc1xuIgorCSAgICAgICAiJXM6IG91dCB0aGVyZSwgeW91IG1pZ2h0IGhhdmUgdG8gdXNlIHRoZSB0dW5lcj08bnI+IGluc21vZFxuIgorCSAgICAgICAiJXM6IG9wdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZS5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgZGV2LT5uYW1lLCBkZXYtPm5hbWUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgc2FhNzEzNF9ib2FyZF9pbml0MShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwkvLyBBbHdheXMgcHJpbnQgZ3Bpbywgb2Z0ZW4gbWFudWZhY3R1cmVycyBlbmNvZGUgdHVuZXIgdHlwZSBhbmQgb3RoZXIgaW5mby4KKwlzYWFfd3JpdGVsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsIDApOworCWRldi0+Z3Bpb192YWx1ZSA9IHNhYV9yZWFkbChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBib2FyZCBpbml0OiBncGlvIGlzICV4XG4iLCBkZXYtPm5hbWUsIGRldi0+Z3Bpb192YWx1ZSk7CisKKwlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKwljYXNlIFNBQTcxMzRfQk9BUkRfRkxZVklERU8yMDAwOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlWSURFTzMwMDA6CisJCWRldi0+aGFzX3JlbW90ZSA9IDE7CisJCWJvYXJkX2ZseXZpZGVvKGRldik7CisJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZNDAwOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwX01LMzoKKwljYXNlIFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUDoKKwljYXNlIFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF80Q0I1OgorCWNhc2UgU0FBNzEzNF9CT0FSRF9NRDI4MTk6CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA1OgorCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA1OgorCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA3OgorLy8JY2FzZSBTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTTogIC8qIG5vdCBmaW5pc2hlZCB5ZXQgKi8KKwljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX1BWUjoKKwkJZGV2LT5oYXNfcmVtb3RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FWQUNTU01BUlRUVjoKKwkJZGV2LT5oYXNfcmVtb3RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX01ENTA0NDoKKwkJcHJpbnRrKCIlczogc2VlbXMgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIE1ENTA0NFxuIgorCQkgICAgICAgIiVzOiAod2l0aCB0aGUgc2FtZSBJRCkgb3V0IHRoZXJlLiAgSWYgc291bmQgZG9lc24ndCB3b3JrIGZvclxuIgorCQkgICAgICAgIiVzOiB5b3UgdHJ5IHRoZSBhdWRpb19jbG9ja19vdmVycmlkZT0weDIwMDAwMCBpbnNtb2Qgb3B0aW9uLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSxkZXYtPm5hbWUsZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDBfQ0FSREJVUzoKKwkJLyogcG93ZXItdXAgdHVuZXIgY2hpcCAqLworCQlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsICAgMHgwMDA0MDAwMCwgMHgwMDA0MDAwMCk7CisJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAweDAwMDQwMDAwLCAweDAwMDAwMDAwKTsKKwkJbXNsZWVwKDEpOworCQlicmVhazsKKwl9CisJaWYgKGRldi0+aGFzX3JlbW90ZSkKKwkJZGV2LT5pcnEyX21hc2sgfD0gKFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xOCAgfAorCQkJCSAgIFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xOEEgfAorCQkJCSAgIFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xNiAgKTsKKwlyZXR1cm4gMDsKK30KKworLyogc3R1ZmYgd2hpY2ggbmVlZHMgd29ya2luZyBpMmMgKi8KK2ludCBzYWE3MTM0X2JvYXJkX2luaXQyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCBib2FyZDsKKworCXN3aXRjaCAoZGV2LT5ib2FyZCkgeworCWNhc2UgU0FBNzEzNF9CT0FSRF9CTUtfTVBFWF9OT1RVTkVSOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9CTUtfTVBFWF9UVU5FUjoKKwkJZGV2LT5pMmNfY2xpZW50LmFkZHIgPSAweDYwOworCQlib2FyZCA9IChpMmNfbWFzdGVyX3JlY3YoJmRldi0+aTJjX2NsaWVudCwmYnVmLDApIDwgMCkKKwkJCT8gU0FBNzEzNF9CT0FSRF9CTUtfTVBFWF9OT1RVTkVSCisJCQk6IFNBQTcxMzRfQk9BUkRfQk1LX01QRVhfVFVORVI7CisJCWlmIChib2FyZCA9PSBkZXYtPmJvYXJkKQorCQkJYnJlYWs7CisJCWRldi0+Ym9hcmQgPSBib2FyZDsKKwkJcHJpbnRrKCIlczogYm9hcmQgdHlwZSBmaXh1cDogJXNcbiIsIGRldi0+bmFtZSwKKwkJICAgICAgIHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUpOworCQlkZXYtPnR1bmVyX3R5cGUgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS50dW5lcl90eXBlOworCQlpZiAoVFVORVJfQUJTRU5UICE9IGRldi0+dHVuZXJfdHlwZSkKKwkJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVFVORVJfU0VUX1RZUEUsJmRldi0+dHVuZXJfdHlwZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwNmNhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwpAQCAtMCwwICsxLDEyMzcgQEAKKy8qCisgKiAkSWQ6IHNhYTcxMzQtY29yZS5jLHYgMS4yOCAyMDA1LzAyLzIyIDA5OjU2OjI5IGtyYXhlbCBFeHAgJAorICoKKyAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcworICogZHJpdmVyIGNvcmUKKyAqCisgKiAoYykgMjAwMS0wMyBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKKyNpbmNsdWRlICJzYWE3MTM0LmgiCisKK01PRFVMRV9ERVNDUklQVElPTigidjRsMiBkcml2ZXIgbW9kdWxlIGZvciBzYWE3MTMwLzM0IGJhc2VkIFRWIGNhcmRzIik7CitNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGlycV9kZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oaXJxX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpcnFfZGVidWcsImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbSVJRIGhhbmRsZXJdIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29yZV9kZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oY29yZV9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY29yZV9kZWJ1ZywiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFtjb3JlXSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9fdHJhY2tpbmcgPSAwOworbW9kdWxlX3BhcmFtKGdwaW9fdHJhY2tpbmcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGdwaW9fdHJhY2tpbmcsImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbZ3Bpb10iKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBvc3MgPSAwOworbW9kdWxlX3BhcmFtKG9zcywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mob3NzLCJyZWdpc3RlciBvc3MgZGV2aWNlcyAoZGVmYXVsdDogbm8pIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeSA9IFVOU0VUOworbW9kdWxlX3BhcmFtKGxhdGVuY3ksIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGxhdGVuY3ksInBjaSBsYXRlbmN5IHRpbWVyIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fbnJbXSA9IHtbMCAuLi4gKFNBQTcxMzRfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmJpX25yW10gICA9IHtbMCAuLi4gKFNBQTcxMzRfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmFkaW9fbnJbXSA9IHtbMCAuLi4gKFNBQTcxMzRfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHNwX25yW10gICA9IHtbMCAuLi4gKFNBQTcxMzRfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWl4ZXJfbnJbXSA9IHtbMCAuLi4gKFNBQTcxMzRfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHVuZXJbXSAgICA9IHtbMCAuLi4gKFNBQTcxMzRfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtdICAgICA9IHtbMCAuLi4gKFNBQTcxMzRfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHZpZGVvX25yLCBpbnQsIE5VTEwsIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KHZiaV9uciwgICBpbnQsIE5VTEwsIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KHJhZGlvX25yLCBpbnQsIE5VTEwsIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGRzcF9uciwgICBpbnQsIE5VTEwsIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KG1peGVyX25yLCBpbnQsIE5VTEwsIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KHR1bmVyLCAgICBpbnQsIE5VTEwsIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICAgICBpbnQsIE5VTEwsIDA0NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLCAidmlkZW8gZGV2aWNlIG51bWJlciIpOworTU9EVUxFX1BBUk1fREVTQyh2YmlfbnIsICAgInZiaSBkZXZpY2UgbnVtYmVyIik7CitNT0RVTEVfUEFSTV9ERVNDKHJhZGlvX25yLCAicmFkaW8gZGV2aWNlIG51bWJlciIpOworTU9EVUxFX1BBUk1fREVTQyhkc3BfbnIsICAgIm9zcyBkc3AgZGV2aWNlIG51bWJlciIpOworTU9EVUxFX1BBUk1fREVTQyhtaXhlcl9uciwgIm9zcyBtaXhlciBkZXZpY2UgbnVtYmVyIik7CitNT0RVTEVfUEFSTV9ERVNDKHR1bmVyLCAgICAidHVuZXIgdHlwZSIpOworTU9EVUxFX1BBUk1fREVTQyhjYXJkLCAgICAgImNhcmQgdHlwZSIpOworCitzdGF0aWMgREVDTEFSRV9NVVRFWChkZXZsaXN0X2xvY2spOworTElTVF9IRUFEKHNhYTcxMzRfZGV2bGlzdCk7CitzdGF0aWMgTElTVF9IRUFEKG1vcHNfbGlzdCk7CitzdGF0aWMgdW5zaWduZWQgaW50IHNhYTcxMzRfZGV2Y291bnQ7CisKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZy4uLikJaWYgKGNvcmVfZGVidWcpIFwKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMvY29yZTogIiBmbXQsIGRldi0+bmFtZSAsICMjIGFyZykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBkZWJ1ZyBoZWxwIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnY0bDFfaW9jdGxzW10gPSB7CisJIjAiLCAiR0NBUCIsICJHQ0hBTiIsICJTQ0hBTiIsICJHVFVORVIiLCAiU1RVTkVSIiwgIkdQSUNUIiwgIlNQSUNUIiwKKwkiQ0NBUFRVUkUiLCAiR1dJTiIsICJTV0lOIiwgIkdGQlVGIiwgIlNGQlVGIiwgIktFWSIsICJHRlJFUSIsCisJIlNGUkVRIiwgIkdBVURJTyIsICJTQVVESU8iLCAiU1lOQyIsICJNQ0FQVFVSRSIsICJHTUJVRiIsICJHVU5JVCIsCisJIkdDQVBUVVJFIiwgIlNDQVBUVVJFIiwgIlNQTEFZTU9ERSIsICJTV1JJVEVNT0RFIiwgIkdQTEFZSU5GTyIsCisJIlNNSUNST0NPREUiLCAiR1ZCSUZNVCIsICJTVkJJRk1UIiB9OworI2RlZmluZSBWNEwxX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDFfaW9jdGxzKQorCitzdGF0aWMgY29uc3QgY2hhciAqdjRsMl9pb2N0bHNbXSA9IHsKKwkiUVVFUllDQVAiLCAiMSIsICJFTlVNX1BJWEZNVCIsICJFTlVNX0ZCVUZGTVQiLCAiR19GTVQiLCAiU19GTVQiLAorCSJHX0NPTVAiLCAiU19DT01QIiwgIlJFUUJVRlMiLCAiUVVFUllCVUYiLCAiR19GQlVGIiwgIlNfRkJVRiIsCisJIkdfV0lOIiwgIlNfV0lOIiwgIlBSRVZJRVciLCAiUUJVRiIsICIxNiIsICJEUUJVRiIsICJTVFJFQU1PTiIsCisJIlNUUkVBTU9GRiIsICJHX1BFUkYiLCAiR19QQVJNIiwgIlNfUEFSTSIsICJHX1NURCIsICJTX1NURCIsCisJIkVOVU1TVEQiLCAiRU5VTUlOUFVUIiwgIkdfQ1RSTCIsICJTX0NUUkwiLCAiR19UVU5FUiIsICJTX1RVTkVSIiwKKwkiR19GUkVRIiwgIlNfRlJFUSIsICJHX0FVRElPIiwgIlNfQVVESU8iLCAiMzUiLCAiUVVFUllDVFJMIiwKKwkiUVVFUllNRU5VIiwgIkdfSU5QVVQiLCAiU19JTlBVVCIsICJFTlVNQ1ZUIiwgIjQxIiwgIjQyIiwgIjQzIiwKKwkiNDQiLCAiNDUiLCAgIkdfT1VUUFVUIiwgIlNfT1VUUFVUIiwgIkVOVU1PVVRQVVQiLCAiR19BVURPVVQiLAorCSJTX0FVRE9VVCIsICJFTlVNRlgiLCAiR19FRkZFQ1QiLCAiU19FRkZFQ1QiLCAiR19NT0RVTEFUT1IiLAorCSJTX01PRFVMQVRPUiIKK307CisjZGVmaW5lIFY0TDJfSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pb2N0bHMpCisKK3N0YXRpYyBjb25zdCBjaGFyICpvc3NwY21faW9jdGxzW10gPSB7CisJIlJFU0VUIiwgIlNZTkMiLCAiU1BFRUQiLCAiU1RFUkVPIiwgIkdFVEJMS1NJWkUiLCAiU0VURk1UIiwKKwkiQ0hBTk5FTFMiLCAiPyIsICJQT1NUIiwgIlNVQkRJVklERSIsICJTRVRGUkFHTUVOVCIsICJHRVRGTVRTIiwKKwkiR0VUT1NQQUNFIiwgIkdFVElTUEFDRSIsICJOT05CTE9DSyIsICJHRVRDQVBTIiwgIkdFVC9TRVRUUklHR0VSIiwKKwkiR0VUSVBUUiIsICJHRVRPUFRSIiwgIk1BUElOQlVGIiwgIk1BUE9VVEJVRiIsICJTRVRTWU5DUk8iLAorCSJTRVREVVBMRVgiLCAiR0VUT0RFTEFZIgorfTsKKyNkZWZpbmUgT1NTUENNX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDJfaW9jdGxzKQorCit2b2lkIHNhYTcxMzRfcHJpbnRfaW9jdGwoY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGNtZCkKK3sKKwljaGFyICpkaXI7CisKKwlzd2l0Y2ggKF9JT0NfRElSKGNtZCkpIHsKKwljYXNlIF9JT0NfTk9ORTogICAgICAgICAgICAgIGRpciA9ICItLSI7IGJyZWFrOworCWNhc2UgX0lPQ19SRUFEOiAgICAgICAgICAgICAgZGlyID0gInItIjsgYnJlYWs7CisJY2FzZSBfSU9DX1dSSVRFOiAgICAgICAgICAgICBkaXIgPSAiLXciOyBicmVhazsKKwljYXNlIF9JT0NfUkVBRCB8IF9JT0NfV1JJVEU6IGRpciA9ICJydyI7IGJyZWFrOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgZGlyID0gIj8/IjsgYnJlYWs7CisJfQorCXN3aXRjaCAoX0lPQ19UWVBFKGNtZCkpIHsKKwljYXNlICd2JzoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKHY0bDEsICVzLCBWSURJT0MlcylcbiIsCisJCSAgICAgICBuYW1lLCBjbWQsIGRpciwgKF9JT0NfTlIoY21kKSA8IFY0TDFfSU9DVExTKSA/CisJCSAgICAgICB2NGwxX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIj8/PyIpOworCQlicmVhazsKKwljYXNlICdWJzoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKHY0bDIsICVzLCBWSURJT0NfJXMpXG4iLAorCQkgICAgICAgbmFtZSwgY21kLCBkaXIsIChfSU9DX05SKGNtZCkgPCBWNEwyX0lPQ1RMUykgPworCQkgICAgICAgdjRsMl9pb2N0bHNbX0lPQ19OUihjbWQpXSA6ICI/Pz8iKTsKKwkJYnJlYWs7CisJY2FzZSAnUCc6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW9jdGwgMHglMDh4IChvc3MgZHNwLCAlcywgU05EQ1RMX0RTUF8lcylcbiIsCisJCSAgICAgICBuYW1lLCBjbWQsIGRpciwgKF9JT0NfTlIoY21kKSA8IE9TU1BDTV9JT0NUTFMpID8KKwkJICAgICAgIG9zc3BjbV9pb2N0bHNbX0lPQ19OUihjbWQpXSA6ICI/Pz8iKTsKKwkJYnJlYWs7CisJY2FzZSAnTSc6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW9jdGwgMHglMDh4IChvc3MgbWl4ZXIsICVzLCAjJWQpXG4iLAorCQkgICAgICAgbmFtZSwgY21kLCBkaXIsIF9JT0NfTlIoY21kKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW9jdGwgMHglMDh4ICg/Pz8sICVzLCAjJWQpXG4iLAorCQkgICAgICAgbmFtZSwgY21kLCBkaXIsIF9JT0NfTlIoY21kKSk7CisJfQorfQorCit2b2lkIHNhYTcxMzRfdHJhY2tfZ3BpbyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgY2hhciAqbXNnKQoreworCXVuc2lnbmVkIGxvbmcgbW9kZSxzdGF0dXM7CisKKwlpZiAoIWdwaW9fdHJhY2tpbmcpCisJCXJldHVybjsKKwkvKiByaXNpbmcgU0FBNzEzNF9HUElPX0dQUkVTQ0FOIHJlYWRzIHRoZSBzdGF0dXMgKi8KKwlzYWFfYW5kb3JiKFNBQTcxMzRfR1BJT19HUE1PREUzLFNBQTcxMzRfR1BJT19HUFJFU0NBTiwwKTsKKwlzYWFfYW5kb3JiKFNBQTcxMzRfR1BJT19HUE1PREUzLFNBQTcxMzRfR1BJT19HUFJFU0NBTixTQUE3MTM0X0dQSU9fR1BSRVNDQU4pOworCW1vZGUgICA9IHNhYV9yZWFkbChTQUE3MTM0X0dQSU9fR1BNT0RFMCAgID4+IDIpICYgMHhmZmZmZmZmOworCXN0YXR1cyA9IHNhYV9yZWFkbChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIpICYgMHhmZmZmZmZmOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICIlczogZ3BpbzogbW9kZT0weCUwN2x4IGluPTB4JTA3bHggb3V0PTB4JTA3bHggWyVzXVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBtb2RlLCAofm1vZGUpICYgc3RhdHVzLCBtb2RlICYgc3RhdHVzLCBtc2cpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIDAKK3N0YXRpYyBjaGFyICpkZWMxX2JpdHNbOF0gPSB7CisJIkRDU1REMCIsICJEQ1NDVDEiLCAiV0lQQSIsICJHTElNQiIsCisJIkdMSU1UIiwgIlNMVENBIiwgIkhMQ0siCit9Oworc3RhdGljIGNoYXIgKmRlYzJfYml0c1s4XSA9IHsKKwkiUkRDQVAiLCAiQ09QUk8iLCAiQ09MU1RSIiwgIlRZUEUzIiwKKwlOVUxMLCAiRklEVCIsICJITFZMTiIsICJJTlRMIgorfTsKK3N0YXRpYyBjaGFyICpzY2FsZTFfYml0c1s4XSA9IHsKKwkiVklEX0EiLCAiVkJJX0EiLCBOVUxMLCBOVUxMLCAiVklEX0IiLCAiVkJJX0IiCit9Oworc3RhdGljIGNoYXIgKnNjYWxlMl9iaXRzWzhdID0geworCSJUUkVSUiIsICJDRkVSUiIsICJMREVSUiIsICJXQVNSU1QiLAorCSJGSURTQ0kiLCAiRklEU0NPIiwgIkQ2XkQ1IiwgIlRBU0siCit9OworCitzdGF0aWMgdm9pZCBkdW1wX3N0YXR1c3JlZyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IHJlZywKKwkJCSAgIGNoYXIgKnJlZ25hbWUsIGNoYXIgKipiaXRzKQoreworCWludCB2YWx1ZSxpOworCisJdmFsdWUgPSBzYWFfcmVhZGIocmVnKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiIsIGRldi0+bmFtZSwgcmVnbmFtZSk7CisJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKE5VTEwgPT0gYml0c1tpXSkKKwkJCWNvbnRpbnVlOworCQlwcmludGsoIiAlcz0lZCIsIGJpdHNbaV0sICh2YWx1ZSAmICgxIDw8IGkpKSA/IDEgOiAwKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3N0YXR1c3JlZ3Moc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJZHVtcF9zdGF0dXNyZWcoZGV2LFNBQTcxMzRfU1RBVFVTX1ZJREVPMSwiZGVjMSIsZGVjMV9iaXRzKTsKKwlkdW1wX3N0YXR1c3JlZyhkZXYsU0FBNzEzNF9TVEFUVVNfVklERU8yLCJkZWMyIixkZWMyX2JpdHMpOworCWR1bXBfc3RhdHVzcmVnKGRldixTQUE3MTM0X1NDQUxFUl9TVEFUVVMwLCJzY2FsZTAiLHNjYWxlMV9iaXRzKTsKKwlkdW1wX3N0YXR1c3JlZyhkZXYsU0FBNzEzNF9TQ0FMRVJfU1RBVFVTMSwic2NhbGUxIixzY2FsZTJfYml0cyk7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGRlbGF5ZWQgcmVxdWVzdF9tb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZmRlZiBDT05GSUdfTU9EVUxFUworCitzdGF0aWMgaW50IG5lZWRfZW1wcmVzczsKK3N0YXRpYyBpbnQgbmVlZF9kdmI7CisKK3N0YXRpYyBpbnQgcGVuZGluZ19jYWxsKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBzdGF0ZSwKKwkJCXZvaWQgKm1vZHVsZSkKK3sKKwlpZiAobW9kdWxlICE9IFRISVNfTU9EVUxFIHx8IHN0YXRlICE9IE1PRFVMRV9TVEFURV9MSVZFKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKyAgICAgICAgaWYgKG5lZWRfZW1wcmVzcykKKyAgICAgICAgICAgICAgICByZXF1ZXN0X21vZHVsZSgic2FhNzEzNC1lbXByZXNzIik7CisgICAgICAgIGlmIChuZWVkX2R2YikKKyAgICAgICAgICAgICAgICByZXF1ZXN0X21vZHVsZSgic2FhNzEzNC1kdmIiKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBpbnQgcGVuZGluZ19yZWdpc3RlcmVkOworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwZW5kaW5nX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gcGVuZGluZ19jYWxsLAorfTsKKworc3RhdGljIHZvaWQgcmVxdWVzdF9tb2R1bGVfZGVwZW5kKGNoYXIgKm5hbWUsIGludCAqZmxhZykKK3sKKwlzd2l0Y2ggKFRISVNfTU9EVUxFLT5zdGF0ZSkgeworCWNhc2UgTU9EVUxFX1NUQVRFX0NPTUlORzoKKwkJaWYgKCFwZW5kaW5nX3JlZ2lzdGVyZWQpIHsKKwkJCXJlZ2lzdGVyX21vZHVsZV9ub3RpZmllcigmcGVuZGluZ19ub3RpZmllcik7CisJCQlwZW5kaW5nX3JlZ2lzdGVyZWQgPSAxOworCQl9CisJCSpmbGFnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNT0RVTEVfU1RBVEVfTElWRToKKwkJcmVxdWVzdF9tb2R1bGUobmFtZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5vdGhpbmcgKi87CisJCWJyZWFrOworCX0KK30KKworI2Vsc2UKKworI2RlZmluZSByZXF1ZXN0X21vZHVsZV9kZXBlbmQobmFtZSxmbGFnKQorCisjZW5kaWYgLyogQ09ORklHX01PRFVMRVMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIG5yIG9mIChzYWE3MTM0LSlwYWdlcyBmb3IgdGhlIGdpdmVuIGJ1ZmZlciBzaXplICovCitzdGF0aWMgaW50IHNhYTcxMzRfYnVmZmVyX3BhZ2VzKGludCBzaXplKQoreworCXNpemUgID0gUEFHRV9BTElHTihzaXplKTsKKwlzaXplICs9IFBBR0VfU0laRTsgLyogZm9yIG5vbi1wYWdlLWFsaWduZWQgYnVmZmVycyAqLworCXNpemUgLz0gNDA5NjsKKwlyZXR1cm4gc2l6ZTsKK30KKworLyogY2FsYyBtYXggIyBvZiBidWZmZXJzIGZyb20gc2l6ZSAobXVzdCBub3QgZXhjZWVkIHRoZSA0TUIgdmlydHVhbAorICogYWRkcmVzcyBzcGFjZSBwZXIgRE1BIGNoYW5uZWwpICovCitpbnQgc2FhNzEzNF9idWZmZXJfY291bnQodW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgbWF4Y291bnQ7CisKKwltYXhjb3VudCA9IDEwMjQgLyBzYWE3MTM0X2J1ZmZlcl9wYWdlcyhzaXplKTsKKwlpZiAoY291bnQgPiBtYXhjb3VudCkKKwkJY291bnQgPSBtYXhjb3VudDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBzYWE3MTM0X2J1ZmZlcl9zdGFydHBhZ2Uoc3RydWN0IHNhYTcxMzRfYnVmICpidWYpCit7CisJcmV0dXJuIHNhYTcxMzRfYnVmZmVyX3BhZ2VzKGJ1Zi0+dmIuYnNpemUpICogYnVmLT52Yi5pOworfQorCit1bnNpZ25lZCBsb25nIHNhYTcxMzRfYnVmZmVyX2Jhc2Uoc3RydWN0IHNhYTcxMzRfYnVmICpidWYpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCisJYmFzZSAgPSBzYWE3MTM0X2J1ZmZlcl9zdGFydHBhZ2UoYnVmKSAqIDQwOTY7CisJYmFzZSArPSBidWYtPnZiLmRtYS5zZ2xpc3RbMF0ub2Zmc2V0OworCXJldHVybiBiYXNlOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IHNhYTcxMzRfcGd0YWJsZV9hbGxvYyhzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3Qgc2FhNzEzNF9wZ3RhYmxlICpwdCkKK3sKKyAgICAgICAgdTMyICAgICAgICAgICpjcHU7CisgICAgICAgIGRtYV9hZGRyX3QgICBkbWFfYWRkcjsKKworCWNwdSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaSwgU0FBNzEzNF9QR1RBQkxFX1NJWkUsICZkbWFfYWRkcik7CisJaWYgKE5VTEwgPT0gY3B1KQorCQlyZXR1cm4gLUVOT01FTTsKKwlwdC0+c2l6ZSA9IFNBQTcxMzRfUEdUQUJMRV9TSVpFOworCXB0LT5jcHUgID0gY3B1OworCXB0LT5kbWEgID0gZG1hX2FkZHI7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzYWE3MTM0X3BndGFibGVfYnVpbGQoc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IHNhYTcxMzRfcGd0YWJsZSAqcHQsCisJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqbGlzdCwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCSAgdW5zaWduZWQgaW50IHN0YXJ0cGFnZSkKK3sKKwl1MzIgICAgICAgICAgICpwdHI7CisJdW5zaWduZWQgaW50ICBpLHA7CisKKwlCVUdfT04oTlVMTCA9PSBwdCB8fCBOVUxMID09IHB0LT5jcHUpOworCisJcHRyID0gcHQtPmNwdSArIHN0YXJ0cGFnZTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyssIGxpc3QrKykKKwkJZm9yIChwID0gMDsgcCAqIDQwOTYgPCBsaXN0LT5sZW5ndGg7IHArKywgcHRyKyspCisJCQkqcHRyID0gc2dfZG1hX2FkZHJlc3MobGlzdCkgLSBsaXN0LT5vZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2FhNzEzNF9wZ3RhYmxlX2ZyZWUoc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IHNhYTcxMzRfcGd0YWJsZSAqcHQpCit7CisJaWYgKE5VTEwgPT0gcHQtPmNwdSkKKwkJcmV0dXJuOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpLCBwdC0+c2l6ZSwgcHQtPmNwdSwgcHQtPmRtYSk7CisJcHQtPmNwdSA9IE5VTEw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIHNhYTcxMzRfZG1hX2ZyZWUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsc3RydWN0IHNhYTcxMzRfYnVmICpidWYpCit7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlCVUcoKTsKKworCXZpZGVvYnVmX3dhaXRvbigmYnVmLT52YiwwLDApOworCXZpZGVvYnVmX2RtYV9wY2lfdW5tYXAoZGV2LT5wY2ksICZidWYtPnZiLmRtYSk7CisJdmlkZW9idWZfZG1hX2ZyZWUoJmJ1Zi0+dmIuZG1hKTsKKwlidWYtPnZiLnN0YXRlID0gU1RBVEVfTkVFRFNfSU5JVDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBzYWE3MTM0X2J1ZmZlcl9xdWV1ZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwKKwkJCSBzdHJ1Y3Qgc2FhNzEzNF9kbWFxdWV1ZSAqcSwKKwkJCSBzdHJ1Y3Qgc2FhNzEzNF9idWYgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9idWYgKm5leHQgPSBOVUxMOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkZXYtPnNsb2NrKTsKKwlkcHJpbnRrKCJidWZmZXJfcXVldWUgJXBcbiIsYnVmKTsKKwlpZiAoTlVMTCA9PSBxLT5jdXJyKSB7CisJCWlmICghcS0+bmVlZF90d28pIHsKKwkJCXEtPmN1cnIgPSBidWY7CisJCQlidWYtPmFjdGl2YXRlKGRldixidWYsTlVMTCk7CisJCX0gZWxzZSBpZiAobGlzdF9lbXB0eSgmcS0+cXVldWUpKSB7CisJCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5xdWV1ZSk7CisJCQlidWYtPnZiLnN0YXRlID0gU1RBVEVfUVVFVUVEOworCQl9IGVsc2UgeworCQkJbmV4dCA9IGxpc3RfZW50cnkocS0+cXVldWUubmV4dCxzdHJ1Y3Qgc2FhNzEzNF9idWYsCisJCQkJCSAgdmIucXVldWUpOworCQkJcS0+Y3VyciA9IGJ1ZjsKKwkJCWJ1Zi0+YWN0aXZhdGUoZGV2LGJ1ZixuZXh0KTsKKwkJfQorCX0gZWxzZSB7CisJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsJnEtPnF1ZXVlKTsKKwkJYnVmLT52Yi5zdGF0ZSA9IFNUQVRFX1FVRVVFRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2FhNzEzNF9idWZmZXJfZmluaXNoKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LAorCQkJICAgc3RydWN0IHNhYTcxMzRfZG1hcXVldWUgKnEsCisJCQkgICB1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkZXYtPnNsb2NrKTsKKwlkcHJpbnRrKCJidWZmZXJfZmluaXNoICVwXG4iLHEtPmN1cnIpOworCisJLyogZmluaXNoIGN1cnJlbnQgYnVmZmVyICovCisJcS0+Y3Vyci0+dmIuc3RhdGUgPSBzdGF0ZTsKKwlkb19nZXR0aW1lb2ZkYXkoJnEtPmN1cnItPnZiLnRzKTsKKwl3YWtlX3VwKCZxLT5jdXJyLT52Yi5kb25lKTsKKwlxLT5jdXJyID0gTlVMTDsKK30KKwordm9pZCBzYWE3MTM0X2J1ZmZlcl9uZXh0KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LAorCQkJIHN0cnVjdCBzYWE3MTM0X2RtYXF1ZXVlICpxKQoreworCXN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmLCpuZXh0ID0gTlVMTDsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmZGV2LT5zbG9jayk7CisJQlVHX09OKE5VTEwgIT0gcS0+Y3Vycik7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlKSkgeworCQkvKiBhY3RpdmF0ZSBuZXh0IG9uZSBmcm9tIHF1ZXVlICovCisJCWJ1ZiA9IGxpc3RfZW50cnkocS0+cXVldWUubmV4dCxzdHJ1Y3Qgc2FhNzEzNF9idWYsdmIucXVldWUpOworCQlkcHJpbnRrKCJidWZmZXJfbmV4dCAlcCBbcHJldj0lcC9uZXh0PSVwXVxuIiwKKwkJCWJ1ZixxLT5xdWV1ZS5wcmV2LHEtPnF1ZXVlLm5leHQpOworCQlsaXN0X2RlbCgmYnVmLT52Yi5xdWV1ZSk7CisJCWlmICghbGlzdF9lbXB0eSgmcS0+cXVldWUpKQorCQkJbmV4dCA9IGxpc3RfZW50cnkocS0+cXVldWUubmV4dCxzdHJ1Y3Qgc2FhNzEzNF9idWYsCisJCQkJCSAgdmIucXVldWUpOworCQlxLT5jdXJyID0gYnVmOworCQlidWYtPmFjdGl2YXRlKGRldixidWYsbmV4dCk7CisJCWRwcmludGsoImJ1ZmZlcl9uZXh0ICMyIHByZXY9JXAvbmV4dD0lcFxuIiwKKwkJCXEtPnF1ZXVlLnByZXYscS0+cXVldWUubmV4dCk7CisJfSBlbHNlIHsKKwkJLyogbm90aGluZyB0byBkbyAtLSBqdXN0IHN0b3AgRE1BICovCisJCWRwcmludGsoImJ1ZmZlcl9uZXh0ICVwXG4iLE5VTEwpOworCQlzYWE3MTM0X3NldF9kbWFiaXRzKGRldik7CisJCWRlbF90aW1lcigmcS0+dGltZW91dCk7CisJfQorfQorCit2b2lkIHNhYTcxMzRfYnVmZmVyX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzYWE3MTM0X2RtYXF1ZXVlICpxID0gKHN0cnVjdCBzYWE3MTM0X2RtYXF1ZXVlKilkYXRhOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gcS0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jayxmbGFncyk7CisKKwkvKiB0cnkgdG8gcmVzZXQgdGhlIGhhcmR3YXJlIChTV1JTVCkgKi8KKwlzYWFfd3JpdGViKFNBQTcxMzRfUkVHSU9OX0VOQUJMRSwgMHgwMCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X1JFR0lPTl9FTkFCTEUsIDB4ODApOworCXNhYV93cml0ZWIoU0FBNzEzNF9SRUdJT05fRU5BQkxFLCAweDAwKTsKKworCS8qIGZsYWcgY3VycmVudCBidWZmZXIgYXMgZmFpbGVkLAorCSAgIHRyeSB0byBzdGFydCBvdmVyIHdpdGggdGhlIG5leHQgb25lLiAqLworCWlmIChxLT5jdXJyKSB7CisJCWRwcmludGsoInRpbWVvdXQgb24gJXBcbiIscS0+Y3Vycik7CisJCXNhYTcxMzRfYnVmZmVyX2ZpbmlzaChkZXYscSxTVEFURV9FUlJPUik7CisJfQorCXNhYTcxMzRfYnVmZmVyX25leHQoZGV2LHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IHNhYTcxMzRfc2V0X2RtYWJpdHMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJdTMyIHNwbGl0LCB0YXNrPTAsIGN0cmw9MCwgaXJxPTA7CisJZW51bSB2NGwyX2ZpZWxkIGNhcCA9IFY0TDJfRklFTERfQU5ZOworCWVudW0gdjRsMl9maWVsZCBvdiAgPSBWNEwyX0ZJRUxEX0FOWTsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmZGV2LT5zbG9jayk7CisKKwkvKiB2aWRlbyBjYXB0dXJlIC0tIGRtYSAwICsgdmlkZW8gdGFzayBBICovCisJaWYgKGRldi0+dmlkZW9fcS5jdXJyKSB7CisJCXRhc2sgfD0gMHgwMTsKKwkJY3RybCB8PSBTQUE3MTM0X01BSU5fQ1RSTF9URTA7CisJCWlycSAgfD0gU0FBNzEzNF9JUlExX0lOVEVfUkEwXzEgfAorCQkJU0FBNzEzNF9JUlExX0lOVEVfUkEwXzA7CisJICAgICAgICBjYXAgPSBkZXYtPnZpZGVvX3EuY3Vyci0+dmIuZmllbGQ7CisJfQorCisJLyogdmlkZW8gY2FwdHVyZSAtLSBkbWEgMSsyIChwbGFuYXIgbW9kZXMpICovCisJaWYgKGRldi0+dmlkZW9fcS5jdXJyICYmCisJICAgIGRldi0+dmlkZW9fcS5jdXJyLT5mbXQtPnBsYW5hcikgeworCQljdHJsIHw9IFNBQTcxMzRfTUFJTl9DVFJMX1RFNCB8CisJCQlTQUE3MTM0X01BSU5fQ1RSTF9URTU7CisJfQorCisJLyogc2NyZWVuIG92ZXJsYXkgLS0gZG1hIDAgKyB2aWRlbyB0YXNrIEIgKi8KKwlpZiAoZGV2LT5vdmVuYWJsZSkgeworCQl0YXNrIHw9IDB4MTA7CisJCWN0cmwgfD0gU0FBNzEzNF9NQUlOX0NUUkxfVEUxOworCQlvdiA9IGRldi0+b3ZmaWVsZDsKKwl9CisKKwkvKiB2YmkgY2FwdHVyZSAtLSBkbWEgMCArIHZiaSB0YXNrIEErQiAqLworCWlmIChkZXYtPnZiaV9xLmN1cnIpIHsKKwkJdGFzayB8PSAweDIyOworCQljdHJsIHw9IFNBQTcxMzRfTUFJTl9DVFJMX1RFMiB8CisJCQlTQUE3MTM0X01BSU5fQ1RSTF9URTM7CisJCWlycSAgfD0gU0FBNzEzNF9JUlExX0lOVEVfUkEwXzcgfAorCQkJU0FBNzEzNF9JUlExX0lOVEVfUkEwXzYgfAorCQkJU0FBNzEzNF9JUlExX0lOVEVfUkEwXzUgfAorCQkJU0FBNzEzNF9JUlExX0lOVEVfUkEwXzQ7CisJfQorCisJLyogYXVkaW8gY2FwdHVyZSAtLSBkbWEgMyAqLworCWlmIChkZXYtPm9zcy5kbWFfcnVubmluZykgeworCQljdHJsIHw9IFNBQTcxMzRfTUFJTl9DVFJMX1RFNjsKKwkJaXJxICB8PSBTQUE3MTM0X0lSUTFfSU5URV9SQTNfMSB8CisJCQlTQUE3MTM0X0lSUTFfSU5URV9SQTNfMDsKKwl9CisKKwkvKiBUUyBjYXB0dXJlIC0tIGRtYSA1ICovCisJaWYgKGRldi0+dHNfcS5jdXJyKSB7CisJCWN0cmwgfD0gU0FBNzEzNF9NQUlOX0NUUkxfVEU1OworCQlpcnEgIHw9IFNBQTcxMzRfSVJRMV9JTlRFX1JBMl8zIHwKKwkJCVNBQTcxMzRfSVJRMV9JTlRFX1JBMl8yIHwKKwkJCVNBQTcxMzRfSVJRMV9JTlRFX1JBMl8xIHwKKwkJCVNBQTcxMzRfSVJRMV9JTlRFX1JBMl8wOworCX0KKworCS8qIHNldCB0YXNrIGNvbmRpdGlvbnMgKyBmaWVsZCBoYW5kbGluZyAqLworCWlmIChWNEwyX0ZJRUxEX0hBU19CT1RIKGNhcCkgfHwgVjRMMl9GSUVMRF9IQVNfQk9USChvdikgfHwgY2FwID09IG92KSB7CisJCS8qIGRlZmF1bHQgY29uZmlnIC0tIHVzZSBmdWxsIGZyYW1lcyAqLworCQlzYWFfd3JpdGViKFNBQTcxMzRfVEFTS19DT05ESVRJT05TKFRBU0tfQSksIDB4MGQpOworCQlzYWFfd3JpdGViKFNBQTcxMzRfVEFTS19DT05ESVRJT05TKFRBU0tfQiksIDB4MGQpOworCQlzYWFfd3JpdGViKFNBQTcxMzRfRklFTERfSEFORExJTkcoVEFTS19BKSwgIDB4MDIpOworCQlzYWFfd3JpdGViKFNBQTcxMzRfRklFTERfSEFORExJTkcoVEFTS19CKSwgIDB4MDIpOworCQlzcGxpdCA9IDA7CisJfSBlbHNlIHsKKwkJLyogc3BsaXQgZmllbGRzIGJldHdlZW4gdGFza3MgKi8KKwkJaWYgKFY0TDJfRklFTERfVE9QID09IGNhcCkgeworCQkJLyogb2RkIEEsIGV2ZW4gQiwgcmVwZWF0ICovCisJCQlzYWFfd3JpdGViKFNBQTcxMzRfVEFTS19DT05ESVRJT05TKFRBU0tfQSksIDB4MGQpOworCQkJc2FhX3dyaXRlYihTQUE3MTM0X1RBU0tfQ09ORElUSU9OUyhUQVNLX0IpLCAweDBlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG9kZCBCLCBldmVuIEEsIHJlcGVhdCAqLworCQkJc2FhX3dyaXRlYihTQUE3MTM0X1RBU0tfQ09ORElUSU9OUyhUQVNLX0EpLCAweDBlKTsKKwkJCXNhYV93cml0ZWIoU0FBNzEzNF9UQVNLX0NPTkRJVElPTlMoVEFTS19CKSwgMHgwZCk7CisJCX0KKwkJc2FhX3dyaXRlYihTQUE3MTM0X0ZJRUxEX0hBTkRMSU5HKFRBU0tfQSksICAweDAxKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0ZJRUxEX0hBTkRMSU5HKFRBU0tfQiksICAweDAxKTsKKwkJc3BsaXQgPSAxOworCX0KKworCS8qIGlycXMgKi8KKwlzYWFfd3JpdGViKFNBQTcxMzRfUkVHSU9OX0VOQUJMRSwgdGFzayk7CisJc2FhX3dyaXRlbChTQUE3MTM0X0lSUTEsICAgICAgICAgIGlycSk7CisJc2FhX2FuZG9ybChTQUE3MTM0X01BSU5fQ1RSTCwKKwkJICAgU0FBNzEzNF9NQUlOX0NUUkxfVEUwIHwKKwkJICAgU0FBNzEzNF9NQUlOX0NUUkxfVEUxIHwKKwkJICAgU0FBNzEzNF9NQUlOX0NUUkxfVEUyIHwKKwkJICAgU0FBNzEzNF9NQUlOX0NUUkxfVEUzIHwKKwkJICAgU0FBNzEzNF9NQUlOX0NUUkxfVEU0IHwKKwkJICAgU0FBNzEzNF9NQUlOX0NUUkxfVEU1IHwKKwkJICAgU0FBNzEzNF9NQUlOX0NUUkxfVEU2LAorCQkgICBjdHJsKTsKKwlkcHJpbnRrKCJkbWFiaXRzOiB0YXNrPTB4JTAyeCBjdHJsPTB4JTAyeCBpcnE9MHgleCBzcGxpdD0lc1xuIiwKKwkJdGFzaywgY3RybCwgaXJxLCBzcGxpdCA/ICJubyIgOiAieWVzIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBJUlEgaGFuZGxlciArIGhlbHBlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGNoYXIgKmlycWJpdHNbXSA9IHsKKwkiRE9ORV9SQTAiLCAiRE9ORV9SQTEiLCAiRE9ORV9SQTIiLCAiRE9ORV9SQTMiLAorCSJBUiIsICJQRSIsICJQV1JfT04iLCAiUkRDQVAiLCAiSU5UTCIsICJGSURUIiwgIk1NQyIsCisJIlRSSUdfRVJSIiwgIkNPTkZfRVJSIiwgIkxPQURfRVJSIiwKKwkiR1BJTzE2PyIsICJHUElPMTgiLCAiR1BJTzIyIiwgIkdQSU8yMyIKK307CisjZGVmaW5lIElSUUJJVFMgQVJSQVlfU0laRShpcnFiaXRzKQorCitzdGF0aWMgdm9pZCBwcmludF9pcnFzdGF0dXMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCBsb29wLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgcmVwb3J0LCB1bnNpZ25lZCBsb25nIHN0YXR1cykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlcy9pcnFbJWQsJWxkXTogcj0weCVseCBzPTB4JTAybHgiLAorCSAgICAgICBkZXYtPm5hbWUsbG9vcCxqaWZmaWVzLHJlcG9ydCxzdGF0dXMpOworCWZvciAoaSA9IDA7IGkgPCBJUlFCSVRTOyBpKyspIHsKKwkJaWYgKCEocmVwb3J0ICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisJCXByaW50aygiICVzIixpcnFiaXRzW2ldKTsKKwl9CisJaWYgKHJlcG9ydCAmIFNBQTcxMzRfSVJRX1JFUE9SVF9ET05FX1JBMCkgeworCQlwcmludGsoIiB8IFJBMD0lcywlcywlcywlbGQiLAorCQkgICAgICAgKHN0YXR1cyAmIDB4NDApID8gInZiaSIgIDogInZpZGVvIiwKKwkJICAgICAgIChzdGF0dXMgJiAweDIwKSA/ICJiIiAgICA6ICJhIiwKKwkJICAgICAgIChzdGF0dXMgJiAweDEwKSA/ICJvZGQiICA6ICJldmVuIiwKKwkJICAgICAgIChzdGF0dXMgJiAweDBmKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNhYTcxMzRfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSAoc3RydWN0IHNhYTcxMzRfZGV2KikgZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgcmVwb3J0LHN0YXR1czsKKwlpbnQgbG9vcCwgaGFuZGxlZCA9IDA7CisKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgMTA7IGxvb3ArKykgeworCQlyZXBvcnQgPSBzYWFfcmVhZGwoU0FBNzEzNF9JUlFfUkVQT1JUKTsKKwkJc3RhdHVzID0gc2FhX3JlYWRsKFNBQTcxMzRfSVJRX1NUQVRVUyk7CisJCWlmICgwID09IHJlcG9ydCkgeworCQkJaWYgKGlycV9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzL2lycTogbm8gKG1vcmUpIHdvcmtcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQloYW5kbGVkID0gMTsKKwkJc2FhX3dyaXRlbChTQUE3MTM0X0lSUV9SRVBPUlQscmVwb3J0KTsKKwkJaWYgKGlycV9kZWJ1ZykKKwkJCXByaW50X2lycXN0YXR1cyhkZXYsbG9vcCxyZXBvcnQsc3RhdHVzKTsKKworI2lmIDAKKwkJaWYgKHJlcG9ydCAmIFNBQTcxMzRfSVJRX1JFUE9SVF9DT05GX0VSUikKKwkJCWR1bXBfc3RhdHVzcmVncyhkZXYpOworI2VuZGlmCisKKwkJaWYgKHJlcG9ydCAmIFNBQTcxMzRfSVJRX1JFUE9SVF9SRENBUCAvKiBfSU5UTCAqLykKKwkJCXNhYTcxMzRfaXJxX3ZpZGVvX2ludGwoZGV2KTsKKworCQlpZiAoKHJlcG9ydCAmIFNBQTcxMzRfSVJRX1JFUE9SVF9ET05FX1JBMCkgJiYKKwkJICAgIChzdGF0dXMgJiAweDYwKSA9PSAwKQorCQkJc2FhNzEzNF9pcnFfdmlkZW9fZG9uZShkZXYsc3RhdHVzKTsKKworCQlpZiAoKHJlcG9ydCAmIFNBQTcxMzRfSVJRX1JFUE9SVF9ET05FX1JBMCkgJiYKKwkJICAgIChzdGF0dXMgJiAweDQwKSA9PSAweDQwKQorCQkJc2FhNzEzNF9pcnFfdmJpX2RvbmUoZGV2LHN0YXR1cyk7CisKKwkJaWYgKChyZXBvcnQgJiBTQUE3MTM0X0lSUV9SRVBPUlRfRE9ORV9SQTIpICYmCisJCSAgICBjYXJkX2hhc19tcGVnKGRldikpCisJCQlzYWE3MTM0X2lycV90c19kb25lKGRldixzdGF0dXMpOworCisJCWlmICgocmVwb3J0ICYgU0FBNzEzNF9JUlFfUkVQT1JUX0RPTkVfUkEzKSkKKwkJCXNhYTcxMzRfaXJxX29zc19kb25lKGRldixzdGF0dXMpOworCisJCWlmICgocmVwb3J0ICYgKFNBQTcxMzRfSVJRX1JFUE9SVF9HUElPMTYgfAorCQkJICAgICAgIFNBQTcxMzRfSVJRX1JFUE9SVF9HUElPMTgpKSAmJgorCQkgICAgZGV2LT5yZW1vdGUpCisJCQlzYWE3MTM0X2lucHV0X2lycShkZXYpOworCX0KKworCWlmICgxMCA9PSBsb29wKSB7CisJCXByaW50X2lycXN0YXR1cyhkZXYsbG9vcCxyZXBvcnQsc3RhdHVzKTsKKwkJaWYgKHJlcG9ydCAmIFNBQTcxMzRfSVJRX1JFUE9SVF9QRSkgeworCQkJLyogZGlzYWJsZSBhbGwgcGFyaXR5IGVycm9yICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy9pcnE6IGxvb3BpbmcgLS0gIgorCQkJICAgICAgICJjbGVhcmluZyBQRSAocGFyaXR5IGVycm9yISkgZW5hYmxlIGJpdFxuIixkZXYtPm5hbWUpOworCQkJc2FhX2NsZWFybChTQUE3MTM0X0lSUTIsU0FBNzEzNF9JUlEyX0lOVEVfUEUpOworCQl9IGVsc2UgaWYgKHJlcG9ydCAmIChTQUE3MTM0X0lSUV9SRVBPUlRfR1BJTzE2IHwKKwkJCQkgICAgIFNBQTcxMzRfSVJRX1JFUE9SVF9HUElPMTgpKSB7CisJCQkvKiBkaXNhYmxlIGdwaW8gSVJRcyAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMvaXJxOiBsb29waW5nIC0tICIKKwkJCSAgICAgICAiY2xlYXJpbmcgR1BJTyBlbmFibGUgYml0c1xuIixkZXYtPm5hbWUpOworCQkJc2FhX2NsZWFybChTQUE3MTM0X0lSUTIsIChTQUE3MTM0X0lSUTJfSU5URV9HUElPMTYgfAorCQkJCQkJICBTQUE3MTM0X0lSUTJfSU5URV9HUElPMTgpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGRpc2FibGUgYWxsIGlycXMgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzL2lycTogbG9vcGluZyAtLSAiCisJCQkgICAgICAgImNsZWFyaW5nIGFsbCBlbmFibGUgYml0c1xuIixkZXYtPm5hbWUpOworCQkJc2FhX3dyaXRlbChTQUE3MTM0X0lSUTEsMCk7CisJCQlzYWFfd3JpdGVsKFNBQTcxMzRfSVJRMiwwKTsKKwkJfQorCX0KKworIG91dDoKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGVhcmx5IGluaXQgKG5vIGkyYywgbm8gaXJxKSAqLworc3RhdGljIGludCBzYWE3MTM0X2h3aW5pdDEoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJZHByaW50aygiaHdpbml0MVxuIik7CisKKwlzYWFfd3JpdGVsKFNBQTcxMzRfSVJRMSwgMCk7CisJc2FhX3dyaXRlbChTQUE3MTM0X0lSUTIsIDApOworICAgICAgICBpbml0X01VVEVYKCZkZXYtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZkZXYtPnNsb2NrKTsKKworCXNhYTcxMzRfdHJhY2tfZ3BpbyhkZXYsInByZS1pbml0Iik7CisJc2FhNzEzNF92aWRlb19pbml0MShkZXYpOworCXNhYTcxMzRfdmJpX2luaXQxKGRldik7CisJaWYgKGNhcmRfaGFzX21wZWcoZGV2KSkKKwkJc2FhNzEzNF90c19pbml0MShkZXYpOworCXNhYTcxMzRfaW5wdXRfaW5pdDEoZGV2KTsKKworCXN3aXRjaCAoZGV2LT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQ6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM1OgorCQlzYWE3MTM0X29zc19pbml0MShkZXYpOworCQlicmVhazsKKwl9CisKKwkvKiBSQU0gRklGTyBjb25maWcgKi8KKwlzYWFfd3JpdGVsKFNBQTcxMzRfRklGT19TSVpFLCAweDA4MDcwNTAzKTsKKwlzYWFfd3JpdGVsKFNBQTcxMzRfVEhSRVNIT1VMRCwweDAyMDIwMjAyKTsKKworCS8qIGVuYWJsZSBhdWRpbyArIHZpZGVvIHByb2Nlc3NpbmcgKi8KKwlzYWFfd3JpdGVsKFNBQTcxMzRfTUFJTl9DVFJMLAorCQkgICBTQUE3MTM0X01BSU5fQ1RSTF9WUExMRSB8CisJCSAgIFNBQTcxMzRfTUFJTl9DVFJMX0FQTExFIHwKKwkJICAgU0FBNzEzNF9NQUlOX0NUUkxfRVhPU0MgfAorCQkgICBTQUE3MTM0X01BSU5fQ1RSTF9FVkZFMSB8CisJCSAgIFNBQTcxMzRfTUFJTl9DVFJMX0VWRkUyIHwKKwkJICAgU0FBNzEzNF9NQUlOX0NUUkxfRVNGRSAgfAorCQkgICBTQUE3MTM0X01BSU5fQ1RSTF9FQkFEQyB8CisJCSAgIFNBQTcxMzRfTUFJTl9DVFJMX0VCREFDKTsKKworCS8qIGVuYWJsZSBwZXJpcGhlcmFsIGRldmljZXMgKi8KKwlzYWFfd3JpdGViKFNBQTcxMzRfU1BFQ0lBTF9NT0RFLCAweDAxKTsKKworCS8qIHNldCB2ZXJ0aWNhbCBsaW5lIG51bWJlcmluZyBzdGFydCAodmJpIG5lZWRzIHRoaXMpICovCisJc2FhX3dyaXRlYihTQUE3MTM0X1NPVVJDRV9USU1JTkcyLCAweDIwKTsKKworCXJldHVybiAwOworfQorCisvKiBsYXRlIGluaXQgKHdpdGggaTJjICsgaXJxKSAqLworc3RhdGljIGludCBzYWE3MTM0X2h3aW5pdDIoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJZHByaW50aygiaHdpbml0MlxuIik7CisKKwlzYWE3MTM0X3ZpZGVvX2luaXQyKGRldik7CisJc2FhNzEzNF90dmF1ZGlvX2luaXQyKGRldik7CisKKwkvKiBlbmFibGUgSVJRJ3MgKi8KKwlzYWFfd3JpdGVsKFNBQTcxMzRfSVJRMSwgMCk7CisJc2FhX3dyaXRlbChTQUE3MTM0X0lSUTIsIGRldi0+aXJxMl9tYXNrKTsKKworCXJldHVybiAwOworfQorCisvKiBzaHV0ZG93biAqLworc3RhdGljIGludCBzYWE3MTM0X2h3ZmluaShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlkcHJpbnRrKCJod2ZpbmlcbiIpOworCisJc3dpdGNoIChkZXYtPnBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzOgorCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzU6CisJCXNhYTcxMzRfb3NzX2ZpbmkoZGV2KTsKKwkJYnJlYWs7CisJfQorCWlmIChjYXJkX2hhc19tcGVnKGRldikpCisJCXNhYTcxMzRfdHNfZmluaShkZXYpOworCXNhYTcxMzRfaW5wdXRfZmluaShkZXYpOworCXNhYTcxMzRfdmJpX2ZpbmkoZGV2KTsKKwlzYWE3MTM0X3ZpZGVvX2ZpbmkoZGV2KTsKKwlzYWE3MTM0X3R2YXVkaW9fZmluaShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgbXVzdF9jb25maWd1cmVfbWFudWFsbHkodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaSxwOworCisJcHJpbnRrKEtFUk5fV0FSTklORworCSAgICAgICAic2FhNzEzNDogPHJhbnQ+XG4iCisJICAgICAgICJzYWE3MTM0OiAgQ29uZ3JhdHVsYXRpb25zISAgWW91ciBUViBjYXJkIHZlbmRvciBzYXZlZCBhIGZld1xuIgorCSAgICAgICAic2FhNzEzNDogIGNlbnRzIGZvciBhIGVlcHJvbSwgdGh1cyB5b3VyIHBjaSBib2FyZCBoYXMgbm9cbiIKKwkgICAgICAgInNhYTcxMzQ6ICBzdWJzeXN0ZW0gSUQgYW5kIEkgY2FuJ3QgaWRlbnRpZnkgaXQgYXV0b21hdGljYWxseVxuIgorCSAgICAgICAic2FhNzEzNDogPC9yYW50PlxuIgorCSAgICAgICAic2FhNzEzNDogSSBmZWVsIGJldHRlciBub3cuICBPaywgaGVyZSBhcmUgdGhlIGdvb2QgbmV3czpcbiIKKwkgICAgICAgInNhYTcxMzQ6IFlvdSBjYW4gdXNlIHRoZSBjYXJkPTxucj4gaW5zbW9kIG9wdGlvbiB0byBzcGVjaWZ5XG4iCisJICAgICAgICJzYWE3MTM0OiB3aGljaCBib2FyZCBkbyB5b3UgaGF2ZS4gIFRoZSBsaXN0OlxuIik7CisJZm9yIChpID0gMDsgaSA8IHNhYTcxMzRfYmNvdW50OyBpKyspIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2FhNzEzNDogICBjYXJkPSVkIC0+ICUtNDAuNDBzIiwKKwkJICAgICAgIGksc2FhNzEzNF9ib2FyZHNbaV0ubmFtZSk7CisJCWZvciAocCA9IDA7IHNhYTcxMzRfcGNpX3RibFtwXS5kcml2ZXJfZGF0YTsgcCsrKSB7CisJCQlpZiAoc2FhNzEzNF9wY2lfdGJsW3BdLmRyaXZlcl9kYXRhICE9IGkpCisJCQkJY29udGludWU7CisJCQlwcmludGsoIiAlMDR4OiUwNHgiLAorCQkJICAgICAgIHNhYTcxMzRfcGNpX3RibFtwXS5zdWJ2ZW5kb3IsCisJCQkgICAgICAgc2FhNzEzNF9wY2lfdGJsW3BdLnN1YmRldmljZSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KK30KKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXZfaW5pdChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp0ZW1wbGF0ZSwKKwkJCQkgICAgICBjaGFyICp0eXBlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKKworCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmIChOVUxMID09IHZmZCkKKwkJcmV0dXJuIE5VTEw7CisJKnZmZCA9ICp0ZW1wbGF0ZTsKKwl2ZmQtPm1pbm9yICAgPSAtMTsKKwl2ZmQtPmRldiAgICAgPSAmZGV2LT5wY2ktPmRldjsKKwl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKKwlzbnByaW50Zih2ZmQtPm5hbWUsIHNpemVvZih2ZmQtPm5hbWUpLCAiJXMgJXMgKCVzKSIsCisJCSBkZXYtPm5hbWUsIHR5cGUsIHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUpOworCXJldHVybiB2ZmQ7Cit9CisKK3N0YXRpYyB2b2lkIHNhYTcxMzRfdW5yZWdpc3Rlcl92aWRlbyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlpZiAoZGV2LT52aWRlb19kZXYpIHsKKwkJaWYgKC0xICE9IGRldi0+dmlkZW9fZGV2LT5taW5vcikKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmlkZW9fZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT52aWRlb19kZXYpOworCQlkZXYtPnZpZGVvX2RldiA9IE5VTEw7CisJfQorCWlmIChkZXYtPnZiaV9kZXYpIHsKKwkJaWYgKC0xICE9IGRldi0+dmJpX2Rldi0+bWlub3IpCisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnZiaV9kZXYpOworCQllbHNlCisJCQl2aWRlb19kZXZpY2VfcmVsZWFzZShkZXYtPnZiaV9kZXYpOworCQlkZXYtPnZiaV9kZXYgPSBOVUxMOworCX0KKwlpZiAoZGV2LT5yYWRpb19kZXYpIHsKKwkJaWYgKC0xICE9IGRldi0+cmFkaW9fZGV2LT5taW5vcikKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+cmFkaW9fZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT5yYWRpb19kZXYpOworCQlkZXYtPnJhZGlvX2RldiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBtcGVnX29wc19hdHRhY2goc3RydWN0IHNhYTcxMzRfbXBlZ19vcHMgKm9wcywKKwkJCSAgICBzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlpbnQgZXJyOworCisJaWYgKE5VTEwgIT0gZGV2LT5tb3BzKQorCQlyZXR1cm47CisJaWYgKHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm1wZWcgIT0gb3BzLT50eXBlKQorCQlyZXR1cm47CisJZXJyID0gb3BzLT5pbml0KGRldik7CisJaWYgKDAgIT0gZXJyKQorCQlyZXR1cm47CisJZGV2LT5tb3BzID0gb3BzOworfQorCitzdGF0aWMgdm9pZCBtcGVnX29wc19kZXRhY2goc3RydWN0IHNhYTcxMzRfbXBlZ19vcHMgKm9wcywKKwkJCSAgICBzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlpZiAoTlVMTCA9PSBkZXYtPm1vcHMpCisJCXJldHVybjsKKwlpZiAoZGV2LT5tb3BzICE9IG9wcykKKwkJcmV0dXJuOworCWRldi0+bW9wcy0+ZmluaShkZXYpOworCWRldi0+bW9wcyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNhYTcxMzRfaW5pdGRldihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXY7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKKwlzdHJ1Y3Qgc2FhNzEzNF9tcGVnX29wcyAqbW9wczsKKwlpbnQgZXJyOworCisJZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZGV2LDAsc2l6ZW9mKCpkZXYpKTsKKworCS8qIHBjaSBpbml0ICovCisJZGV2LT5wY2kgPSBwY2lfZGV2OworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGZhaWwxOworCX0KKworCWRldi0+bnIgPSBzYWE3MTM0X2RldmNvdW50OworCXNwcmludGYoZGV2LT5uYW1lLCJzYWEleFslZF0iLHBjaV9kZXYtPmRldmljZSxkZXYtPm5yKTsKKworCS8qIHBjaSBxdWlya3MgKi8KKwlpZiAocGNpX3BjaV9wcm9ibGVtcykgeworCQlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9UUklUT04pCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcXVpcms6IFBDSVBDSV9UUklUT05cbiIsIGRldi0+bmFtZSk7CisJCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX05BVE9NQSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBxdWlyazogUENJUENJX05BVE9NQVxuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfVklBRVRCRikKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBxdWlyazogUENJUENJX1ZJQUVUQkZcbiIsIGRldi0+bmFtZSk7CisJCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX1ZTRlgpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcXVpcms6IFBDSVBDSV9WU0ZYXG4iLGRldi0+bmFtZSk7CisjaWZkZWYgUENJUENJX0FMSU1BR0lLCisJCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX0FMSU1BR0lLKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcXVpcms6IFBDSVBDSV9BTElNQUdJSyAtLSBsYXRlbmN5IGZpeHVwXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlsYXRlbmN5ID0gMHgwQTsKKwkJfQorI2VuZGlmCisJfQorCWlmIChVTlNFVCAhPSBsYXRlbmN5KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzZXR0aW5nIHBjaSBsYXRlbmN5IHRpbWVyIHRvICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLGxhdGVuY3kpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0xBVEVOQ1lfVElNRVIsIGxhdGVuY3kpOworCX0KKworCS8qIHByaW50IHBjaSBpbmZvICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmZGV2LT5wY2lfcmV2KTsKKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0xBVEVOQ1lfVElNRVIsICAmZGV2LT5wY2lfbGF0KTsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZvdW5kIGF0ICVzLCByZXY6ICVkLCBpcnE6ICVkLCAiCisJICAgICAgICJsYXRlbmN5OiAlZCwgbW1pbzogMHglbHhcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgcGNpX25hbWUocGNpX2RldiksIGRldi0+cGNpX3JldiwgcGNpX2Rldi0+aXJxLAorCSAgICAgICBkZXYtPnBjaV9sYXQscGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCkpOworCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOworCWlmICghcGNpX2RtYV9zdXBwb3J0ZWQocGNpX2RldiwweGZmZmZmZmZmKSkgeworCQlwcmludGsoIiVzOiBPb3BzOiBubyAzMmJpdCBQQ0kgRE1BID8/P1xuIixkZXYtPm5hbWUpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGZhaWwxOworCX0KKworCS8qIGJvYXJkIGNvbmZpZyAqLworCWRldi0+Ym9hcmQgPSBwY2lfaWQtPmRyaXZlcl9kYXRhOworCWlmIChjYXJkW2Rldi0+bnJdID49IDAgJiYKKwkgICAgY2FyZFtkZXYtPm5yXSA8IHNhYTcxMzRfYmNvdW50KQorCQlkZXYtPmJvYXJkID0gY2FyZFtkZXYtPm5yXTsKKwlpZiAoU0FBNzEzNF9CT0FSRF9OT0FVVE8gPT0gZGV2LT5ib2FyZCkgeworCQltdXN0X2NvbmZpZ3VyZV9tYW51YWxseSgpOworCQlkZXYtPmJvYXJkID0gU0FBNzEzNF9CT0FSRF9VTktOT1dOOworCX0KKwlkZXYtPnR1bmVyX3R5cGUgICA9IHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLnR1bmVyX3R5cGU7CisJZGV2LT50ZGE5ODg3X2NvbmYgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS50ZGE5ODg3X2NvbmY7CisJaWYgKFVOU0VUICE9IHR1bmVyW2Rldi0+bnJdKQorCQlkZXYtPnR1bmVyX3R5cGUgPSB0dW5lcltkZXYtPm5yXTsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN1YnN5c3RlbTogJTA0eDolMDR4LCBib2FyZDogJXMgW2NhcmQ9JWQsJXNdXG4iLAorCSAgICAgICBkZXYtPm5hbWUscGNpX2Rldi0+c3Vic3lzdGVtX3ZlbmRvciwKKwkgICAgICAgcGNpX2Rldi0+c3Vic3lzdGVtX2RldmljZSxzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lLAorCSAgICAgICBkZXYtPmJvYXJkLCBjYXJkW2Rldi0+bnJdID09IGRldi0+Ym9hcmQgPworCSAgICAgICAiaW5zbW9kIG9wdGlvbiIgOiAiYXV0b2RldGVjdGVkIik7CisKKwkvKiBnZXQgbW1pbyAqLworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LDApLAorCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwwKSwKKwkJCQlkZXYtPm5hbWUpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZ2V0IE1NSU8gbWVtb3J5IEAgMHglbHhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUscGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCkpOworCQlnb3RvIGZhaWwxOworCX0KKwlkZXYtPmxtbWlvID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwwKSwgMHgxMDAwKTsKKwlkZXYtPmJtbWlvID0gKF9fdTggX19pb21lbSAqKWRldi0+bG1taW87CisJaWYgKE5VTEwgPT0gZGV2LT5sbW1pbykgeworCQllcnIgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBpb3JlbWFwKCkgTU1JTyBtZW1vcnlcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIGZhaWwyOworCX0KKworCS8qIGluaXRpYWxpemUgaGFyZHdhcmUgIzEgKi8KKyAgIAlkZXYtPmlycTJfbWFzayA9CisJCVNBQTcxMzRfSVJRMl9JTlRFX0RFQzMgICAgfAorCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMyICAgIHwKKwkJU0FBNzEzNF9JUlEyX0lOVEVfREVDMSAgICB8CisJCVNBQTcxMzRfSVJRMl9JTlRFX0RFQzAgICAgfAorCQlTQUE3MTM0X0lSUTJfSU5URV9QRSAgICAgIHwKKwkJU0FBNzEzNF9JUlEyX0lOVEVfQVI7CisJc2FhNzEzNF9ib2FyZF9pbml0MShkZXYpOworCXNhYTcxMzRfaHdpbml0MShkZXYpOworCisJLyogZ2V0IGlycSAqLworCWVyciA9IHJlcXVlc3RfaXJxKHBjaV9kZXYtPmlycSwgc2FhNzEzNF9pcnEsCisJCQkgIFNBX1NISVJRIHwgU0FfSU5URVJSVVBULCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZ2V0IElSUSAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSxwY2lfZGV2LT5pcnEpOworCQlnb3RvIGZhaWwzOworCX0KKworCS8qIHdhaXQgYSBiaXQsIHJlZ2lzdGVyIGkyYyBidXMgKi8KKwltc2xlZXAoMTAwKTsKKwlzYWE3MTM0X2kyY19yZWdpc3RlcihkZXYpOworCisJLyogaW5pdGlhbGl6ZSBoYXJkd2FyZSAjMiAqLworCXNhYTcxMzRfYm9hcmRfaW5pdDIoZGV2KTsKKwlzYWE3MTM0X2h3aW5pdDIoZGV2KTsKKworCS8qIGxvYWQgaTJjIGhlbHBlcnMgKi8KKwlpZiAoVFVORVJfQUJTRU5UICE9IGRldi0+dHVuZXJfdHlwZSkKKwkJcmVxdWVzdF9tb2R1bGUoInR1bmVyIik7CisJaWYgKGRldi0+dGRhOTg4N19jb25mKQorCQlyZXF1ZXN0X21vZHVsZSgidGRhOTg4NyIpOworICAJaWYgKGNhcmRfaXNfZW1wcmVzcyhkZXYpKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJzYWE2NzUyaHMiKTsKKwkJcmVxdWVzdF9tb2R1bGVfZGVwZW5kKCJzYWE3MTM0LWVtcHJlc3MiLCZuZWVkX2VtcHJlc3MpOworCX0KKyAgCWlmIChjYXJkX2lzX2R2YihkZXYpKQorCQlyZXF1ZXN0X21vZHVsZV9kZXBlbmQoInNhYTcxMzQtZHZiIiwmbmVlZF9kdmIpOworCisJdjRsMl9wcmlvX2luaXQoJmRldi0+cHJpbyk7CisKKwkvKiByZWdpc3RlciB2NGwgZGV2aWNlcyAqLworCWRldi0+dmlkZW9fZGV2ID0gdmRldl9pbml0KGRldiwmc2FhNzEzNF92aWRlb190ZW1wbGF0ZSwidmlkZW8iKTsKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT52aWRlb19kZXYsVkZMX1RZUEVfR1JBQkJFUiwKKwkJCQkgICAgdmlkZW9fbnJbZGV2LT5ucl0pOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjYW4ndCByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIGZhaWw0OworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgdmlkZW8lZCBbdjRsMl1cbiIsCisJICAgICAgIGRldi0+bmFtZSxkZXYtPnZpZGVvX2Rldi0+bWlub3IgJiAweDFmKTsKKworCWRldi0+dmJpX2RldiA9IHZkZXZfaW5pdChkZXYsJnNhYTcxMzRfdmJpX3RlbXBsYXRlLCJ2YmkiKTsKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT52YmlfZGV2LFZGTF9UWVBFX1ZCSSwKKwkJCQkgICAgdmJpX25yW2Rldi0+bnJdKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsNDsKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgdmJpJWRcbiIsCisJICAgICAgIGRldi0+bmFtZSxkZXYtPnZiaV9kZXYtPm1pbm9yICYgMHgxZik7CisKKwlpZiAoY2FyZF9oYXNfcmFkaW8oZGV2KSkgeworCQlkZXYtPnJhZGlvX2RldiA9IHZkZXZfaW5pdChkZXYsJnNhYTcxMzRfcmFkaW9fdGVtcGxhdGUsInJhZGlvIik7CisJCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShkZXYtPnJhZGlvX2RldixWRkxfVFlQRV9SQURJTywKKwkJCQkJICAgIHJhZGlvX25yW2Rldi0+bnJdKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGZhaWw0OworCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgcmFkaW8lZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSxkZXYtPnJhZGlvX2Rldi0+bWlub3IgJiAweDFmKTsKKwl9CisKKwkvKiByZWdpc3RlciBvc3MgZGV2aWNlcyAqLworCXN3aXRjaCAoZGV2LT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQ6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM1OgorCQlpZiAob3NzKSB7CisJCQllcnIgPSBkZXYtPm9zcy5taW5vcl9kc3AgPQorCQkJCXJlZ2lzdGVyX3NvdW5kX2RzcCgmc2FhNzEzNF9kc3BfZm9wcywKKwkJCQkJCSAgIGRzcF9ucltkZXYtPm5yXSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWdvdG8gZmFpbDQ7CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgZHNwJWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLGRldi0+b3NzLm1pbm9yX2RzcCA+PiA0KTsKKworCQkJZXJyID0gZGV2LT5vc3MubWlub3JfbWl4ZXIgPQorCQkJCXJlZ2lzdGVyX3NvdW5kX21peGVyKCZzYWE3MTM0X21peGVyX2ZvcHMsCisJCQkJCQkgICAgIG1peGVyX25yW2Rldi0+bnJdKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWdvdG8gZmFpbDU7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgbWl4ZXIlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsZGV2LT5vc3MubWlub3JfbWl4ZXIgPj4gNCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogZXZlcnl0aGluZyB3b3JrZWQgKi8KKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldixkZXYpOworCXNhYTcxMzRfZGV2Y291bnQrKzsKKworCWRvd24oJmRldmxpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChpdGVtLCZtb3BzX2xpc3QpIHsKKwkJbW9wcyA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IHNhYTcxMzRfbXBlZ19vcHMsIG5leHQpOworCQltcGVnX29wc19hdHRhY2gobW9wcywgZGV2KTsKKwl9CisJbGlzdF9hZGRfdGFpbCgmZGV2LT5kZXZsaXN0LCZzYWE3MTM0X2Rldmxpc3QpOworCXVwKCZkZXZsaXN0X2xvY2spOworCisJLyogY2hlY2sgZm9yIHNpZ25hbCAqLworCXNhYTcxMzRfaXJxX3ZpZGVvX2ludGwoZGV2KTsKKwlyZXR1cm4gMDsKKworIGZhaWw1OgorCXN3aXRjaCAoZGV2LT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQ6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM1OgorCQlpZiAob3NzKQorCQkJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2LT5vc3MubWlub3JfZHNwKTsKKwkJYnJlYWs7CisJfQorIGZhaWw0OgorCXNhYTcxMzRfdW5yZWdpc3Rlcl92aWRlbyhkZXYpOworCXNhYTcxMzRfaTJjX3VucmVnaXN0ZXIoZGV2KTsKKwlmcmVlX2lycShwY2lfZGV2LT5pcnEsIGRldik7CisgZmFpbDM6CisJc2FhNzEzNF9od2ZpbmkoZGV2KTsKKwlpb3VubWFwKGRldi0+bG1taW8pOworIGZhaWwyOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwwKSwKKwkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwwKSk7CisgZmFpbDE6CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc2FhNzEzNF9maW5pZGV2KHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworICAgICAgICBzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOworCXN0cnVjdCBzYWE3MTM0X21wZWdfb3BzICptb3BzOworCisJLyogZGVidWdnaW5nIC4uLiAqLworCWlmIChpcnFfZGVidWcpIHsKKwkJdTMyIHJlcG9ydCA9IHNhYV9yZWFkbChTQUE3MTM0X0lSUV9SRVBPUlQpOworCQl1MzIgc3RhdHVzID0gc2FhX3JlYWRsKFNBQTcxMzRfSVJRX1NUQVRVUyk7CisJCXByaW50X2lycXN0YXR1cyhkZXYsNDIscmVwb3J0LHN0YXR1cyk7CisJfQorCisJLyogZGlzYWJsZSBwZXJpcGhlcmFsIGRldmljZXMgKi8KKwlzYWFfd3JpdGViKFNBQTcxMzRfU1BFQ0lBTF9NT0RFLDApOworCisJLyogc2h1dGRvd24gaGFyZHdhcmUgKi8KKwlzYWFfd3JpdGVsKFNBQTcxMzRfSVJRMSwwKTsKKwlzYWFfd3JpdGVsKFNBQTcxMzRfSVJRMiwwKTsKKwlzYWFfd3JpdGVsKFNBQTcxMzRfTUFJTl9DVFJMLDApOworCisJLyogc2h1dGRvd24gc3Vic3lzdGVtcyAqLworCXNhYTcxMzRfaHdmaW5pKGRldik7CisKKwkvKiB1bnJlZ2lzdGVyICovCisJZG93bigmZGV2bGlzdF9sb2NrKTsKKwlsaXN0X2RlbCgmZGV2LT5kZXZsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoKGl0ZW0sJm1vcHNfbGlzdCkgeworCQltb3BzID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3Qgc2FhNzEzNF9tcGVnX29wcywgbmV4dCk7CisJCW1wZWdfb3BzX2RldGFjaChtb3BzLCBkZXYpOworCX0KKwl1cCgmZGV2bGlzdF9sb2NrKTsKKwlzYWE3MTM0X2RldmNvdW50LS07CisKKwlzYWE3MTM0X2kyY191bnJlZ2lzdGVyKGRldik7CisJc3dpdGNoIChkZXYtPnBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzOgorCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzU6CisJCWlmIChvc3MpIHsKKwkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoZGV2LT5vc3MubWlub3JfbWl4ZXIpOworCQkJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2LT5vc3MubWlub3JfZHNwKTsKKwkJfQorCQlicmVhazsKKwl9CisJc2FhNzEzNF91bnJlZ2lzdGVyX3ZpZGVvKGRldik7CisKKwkvKiByZWxlYXNlIHJlc3NvdXJjZXMgKi8KKwlmcmVlX2lycShwY2lfZGV2LT5pcnEsIGRldik7CisJaW91bm1hcChkZXYtPmxtbWlvKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCksCisJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsMCkpOworCisjaWYgMCAgLyogY2F1c2VzIHNvbWUgdHJvdWJsZSB3aGVuIHJlaW5zZXJ0aW5nIHRoZSBkcml2ZXIgLi4uICovCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworI2VuZGlmCisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOworCisJLyogZnJlZSBtZW1vcnkgKi8KKwlrZnJlZShkZXYpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgc2FhNzEzNF90c19yZWdpc3RlcihzdHJ1Y3Qgc2FhNzEzNF9tcGVnX29wcyAqb3BzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXY7CisKKwlkb3duKCZkZXZsaXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2goaXRlbSwmc2FhNzEzNF9kZXZsaXN0KSB7CisJCWRldiA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IHNhYTcxMzRfZGV2LCBkZXZsaXN0KTsKKwkJbXBlZ19vcHNfYXR0YWNoKG9wcywgZGV2KTsKKwl9CisJbGlzdF9hZGRfdGFpbCgmb3BzLT5uZXh0LCZtb3BzX2xpc3QpOworCXVwKCZkZXZsaXN0X2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIHNhYTcxMzRfdHNfdW5yZWdpc3RlcihzdHJ1Y3Qgc2FhNzEzNF9tcGVnX29wcyAqb3BzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXY7CisKKwlkb3duKCZkZXZsaXN0X2xvY2spOworCWxpc3RfZGVsKCZvcHMtPm5leHQpOworCWxpc3RfZm9yX2VhY2goaXRlbSwmc2FhNzEzNF9kZXZsaXN0KSB7CisJCWRldiA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IHNhYTcxMzRfZGV2LCBkZXZsaXN0KTsKKwkJbXBlZ19vcHNfZGV0YWNoKG9wcywgZGV2KTsKKwl9CisJdXAoJmRldmxpc3RfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woc2FhNzEzNF90c19yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHNhYTcxMzRfdHNfdW5yZWdpc3Rlcik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzYWE3MTM0X3BjaV9kcml2ZXIgPSB7CisgICAgICAgIC5uYW1lICAgICA9ICJzYWE3MTM0IiwKKyAgICAgICAgLmlkX3RhYmxlID0gc2FhNzEzNF9wY2lfdGJsLAorICAgICAgICAucHJvYmUgICAgPSBzYWE3MTM0X2luaXRkZXYsCisgICAgICAgIC5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKHNhYTcxMzRfZmluaWRldiksCit9OworCitzdGF0aWMgaW50IHNhYTcxMzRfaW5pdCh2b2lkKQoreworCUlOSVRfTElTVF9IRUFEKCZzYWE3MTM0X2Rldmxpc3QpOworCXByaW50ayhLRVJOX0lORk8gInNhYTcxMzAvMzQ6IHY0bDIgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLAorCSAgICAgICAoU0FBNzEzNF9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKKwkgICAgICAgKFNBQTcxMzRfVkVSU0lPTl9DT0RFID4+ICA4KSAmIDB4ZmYsCisJICAgICAgIFNBQTcxMzRfVkVSU0lPTl9DT0RFICYgMHhmZik7CisjaWZkZWYgU05BUFNIT1QKKwlwcmludGsoS0VSTl9JTkZPICJzYWE3MTMwLzM0OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAorCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOworI2VuZGlmCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc2FhNzEzNF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgc2FhNzEzNF9maW5pKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX01PRFVMRVMKKwlpZiAocGVuZGluZ19yZWdpc3RlcmVkKQorCQl1bnJlZ2lzdGVyX21vZHVsZV9ub3RpZmllcigmcGVuZGluZ19ub3RpZmllcik7CisjZW5kaWYKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNhYTcxMzRfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNhYTcxMzRfaW5pdCk7Cittb2R1bGVfZXhpdChzYWE3MTM0X2ZpbmkpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitFWFBPUlRfU1lNQk9MKHNhYTcxMzRfcHJpbnRfaW9jdGwpOworRVhQT1JUX1NZTUJPTChzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMpOworRVhQT1JUX1NZTUJPTChzYWE3MTM0X2Rldmxpc3QpOworRVhQT1JUX1NZTUJPTChzYWE3MTM0X2JvYXJkcyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDRhNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiAkSWQ6IHNhYTcxMzQtZHZiLmMsdiAxLjEyIDIwMDUvMDIvMTggMTI6Mjg6Mjkga3JheGVsIEV4cCAkCisgKgorICogKGMpIDIwMDQgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKworI2luY2x1ZGUgInNhYTcxMzQtcmVnLmgiCisjaW5jbHVkZSAic2FhNzEzNC5oIgorCisjaW5jbHVkZSAiZHZiLXBsbC5oIgorI2luY2x1ZGUgIm10MzUyLmgiCisjaW5jbHVkZSAibXQzNTJfcHJpdi5oIiAvKiBGSVhNRSAqLworI2luY2x1ZGUgInRkYTEwMDR4LmgiCisKK01PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBhbnRlbm5hX3B3ciA9IDA7Cittb2R1bGVfcGFyYW0oYW50ZW5uYV9wd3IsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFudGVubmFfcHdyLCJlbmFibGUgYW50ZW5uYSBwb3dlciAoUGlubmFjbGUgMzAwaSkiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcGlubmFjbGVfYW50ZW5uYV9wd3Ioc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCBvbikKK3sKKwl1MzIgb2s7CisKKwlpZiAoIW9uKSB7CisJCXNhYV9zZXRsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsICAgICAoMSA8PCAyNikpOworCQlzYWFfY2xlYXJsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMiwgKDEgPDwgMjYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2FhX3NldGwoU0FBNzEzNF9HUElPX0dQTU9ERTAgPj4gMiwgICAgICgxIDw8IDI2KSk7CisJc2FhX3NldGwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAgICgxIDw8IDI2KSk7CisJdWRlbGF5KDEwKTsKKworCXNhYV9zZXRsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsICAgICAoMSA8PCAyOCkpOworCXNhYV9jbGVhcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAoMSA8PCAyOCkpOworCXVkZWxheSgxMCk7CisJc2FhX3NldGwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAgICgxIDw8IDI4KSk7CisJdWRlbGF5KDEwKTsKKwlvayA9IHNhYV9yZWFkbChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwKSAmICgxIDw8IDI3KTsKKwlwcmludGsoIiVzOiAlcyAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18sCisJICAgICAgIG9rID8gIm9uIiA6ICJvZmYiKTsKKworCWlmICghb2spCisJCXNhYV9jbGVhcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAgICgxIDw8IDI2KSk7CisJcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IG10MzUyX3Bpbm5hY2xlX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RhdGljIHU4IGNsb2NrX2NvbmZpZyBbXSAgPSB7IENMT0NLX0NUTCwgIDB4M2QsIDB4MjggfTsKKwlzdGF0aWMgdTggcmVzZXQgW10gICAgICAgICA9IHsgUkVTRVQsICAgICAgMHg4MCB9OworCXN0YXRpYyB1OCBhZGNfY3RsXzFfY2ZnIFtdID0geyBBRENfQ1RMXzEsICAweDQwIH07CisJc3RhdGljIHU4IGFnY19jZmcgW10gICAgICAgPSB7IEFHQ19UQVJHRVQsIDB4MjgsIDB4YTAgfTsKKwlzdGF0aWMgdTggY2FwdF9yYW5nZV9jZmdbXSA9IHsgQ0FQVF9SQU5HRSwgMHgzMSB9OworCXN0YXRpYyB1OCBmc21fY3RsX2NmZ1tdICAgID0geyAweDdiLCAgICAgICAweDA0IH07CisJc3RhdGljIHU4IGdwcF9jdGxfY2ZnIFtdICAgPSB7IEdQUF9DVEwsICAgIDB4MGYgfTsKKwlzdGF0aWMgdTggc2Nhbl9jdGxfY2ZnIFtdICA9IHsgU0NBTl9DVEwsICAgMHgwZCB9OworCXN0YXRpYyB1OCBpcnFfY2ZnIFtdICAgICAgID0geyBJTlRFUlJVUFRfRU5fMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OworCisJcHJpbnRrKCIlczogJXMgY2FsbGVkXG4iLGRldi0+bmFtZSxfX0ZVTkNUSU9OX18pOworCisJbXQzNTJfd3JpdGUoZmUsIGNsb2NrX2NvbmZpZywgICBzaXplb2YoY2xvY2tfY29uZmlnKSk7CisJdWRlbGF5KDIwMCk7CisJbXQzNTJfd3JpdGUoZmUsIHJlc2V0LCAgICAgICAgICBzaXplb2YocmVzZXQpKTsKKwltdDM1Ml93cml0ZShmZSwgYWRjX2N0bF8xX2NmZywgIHNpemVvZihhZGNfY3RsXzFfY2ZnKSk7CisJbXQzNTJfd3JpdGUoZmUsIGFnY19jZmcsICAgICAgICBzaXplb2YoYWdjX2NmZykpOworCW10MzUyX3dyaXRlKGZlLCBjYXB0X3JhbmdlX2NmZywgc2l6ZW9mKGNhcHRfcmFuZ2VfY2ZnKSk7CisJbXQzNTJfd3JpdGUoZmUsIGdwcF9jdGxfY2ZnLCAgICBzaXplb2YoZ3BwX2N0bF9jZmcpKTsKKworCW10MzUyX3dyaXRlKGZlLCBmc21fY3RsX2NmZywgICAgc2l6ZW9mKGZzbV9jdGxfY2ZnKSk7CisJbXQzNTJfd3JpdGUoZmUsIHNjYW5fY3RsX2NmZywgICBzaXplb2Yoc2Nhbl9jdGxfY2ZnKSk7CisJbXQzNTJfd3JpdGUoZmUsIGlycV9jZmcsICAgICAgICBzaXplb2YoaXJxX2NmZykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10MzUyX3Bpbm5hY2xlX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywKKwkJCQkgIHU4KiBwbGxidWYpCit7CisJc3RhdGljIGludCBvbiAgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X1BPUlQyX0lOQUNUSVZFOworCXN0YXRpYyBpbnQgb2ZmID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19QT1JUMl9BQ1RJVkU7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSBmOworCisJLyogc2V0IGZyZXF1ZW5jeSAobXQyMDUwKSAqLworCWYudHVuZXIgICAgID0gMDsKKwlmLnR5cGUgICAgICA9IFY0TDJfVFVORVJfRElHSVRBTF9UVjsKKwlmLmZyZXF1ZW5jeSA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTAwMCAqIDE2IC8gMTAwMDsKKwlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFREQTk4ODdfU0VUX0NPTkZJRywmb24pOworCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVklESU9DX1NfRlJFUVVFTkNZLCZmKTsKKwlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFREQTk4ODdfU0VUX0NPTkZJRywmb2ZmKTsKKworCXBpbm5hY2xlX2FudGVubmFfcHdyKGRldiwgYW50ZW5uYV9wd3IpOworCisJLyogbXQzNTIgc2V0dXAgKi8KKwltdDM1Ml9waW5uYWNsZV9pbml0KGZlKTsKKwlwbGxidWZbMF0gPSAweGMyOworCXBsbGJ1ZlsxXSA9IDB4MDA7CisJcGxsYnVmWzJdID0gMHgwMDsKKwlwbGxidWZbM10gPSAweDgwOworCXBsbGJ1Zls0XSA9IDB4MDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIHBpbm5hY2xlXzMwMGkgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDNjID4+IDEsCisJLmFkY19jbG9jayAgICAgPSAyMDMzMywKKwkuaWYyICAgICAgICAgICA9IDM2MTUwLAorCS5ub190dW5lciAgICAgID0gMSwKKwkuZGVtb2RfaW5pdCAgICA9IG10MzUyX3Bpbm5hY2xlX2luaXQsCisJLnBsbF9zZXQgICAgICAgPSBtdDM1Ml9waW5uYWNsZV9wbGxfc2V0LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbWVkaW9uX2NhcmRidXNfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwkvKiBhbnl0aGluZyB0byBkbyBoZXJlID8/PyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lZGlvbl9jYXJkYnVzX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJc3RydWN0IHY0bDJfZnJlcXVlbmN5IGY7CisKKwkvKgorCSAqIHRoaXMgaW5zdHJ1Y3RzIHR1bmVyLm8gdG8gc2V0IHRoZSBmcmVxdWVuY3ksIHRoZSBjYWxsIHdpbGwKKwkgKiBlbmQgdXAgaW4gdHVuZXJfY29tbWFuZCgpLCBWSURJT0NfU19GUkVRVUVOQ1kgc3dpdGNoLgorCSAqIHRkYTk4ODcubyB3aWxsIHNlZSB0aGF0IGFzIHdlbGwuCisJICovCisJZi50dW5lciAgICAgPSAwOworCWYudHlwZSAgICAgID0gVjRMMl9UVU5FUl9ESUdJVEFMX1RWOworCWYuZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3kgLyAxMDAwICogMTYgLyAxMDAwOworCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVklESU9DX1NfRlJFUVVFTkNZLCZmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZV9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwlyZXR1cm4gcmVxdWVzdF9maXJtd2FyZShmdywgbmFtZSwgJmRldi0+cGNpLT5kZXYpOworfQorCitzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIG1lZGlvbl9jYXJkYnVzID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwgIC8qIG5vdCBzdXJlIHRoaXMgaXMgY29ycmVjdCAqLworCS5pbnZlcnQgICAgICAgID0gMCwKKyAgICAgICAgLmludmVydF9vY2xrICAgPSAwLAorICAgICAgICAucGxsX2luaXQgICAgICA9IG1lZGlvbl9jYXJkYnVzX2luaXQsCisgICAgICAgIC5wbGxfc2V0ICAgICAgID0gbWVkaW9uX2NhcmRidXNfcGxsX3NldCwKKyAgICAgICAgLnJlcXVlc3RfZmlybXdhcmUgPSBmZV9yZXF1ZXN0X2Zpcm13YXJlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHZiX2luaXQoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJLyogaW5pdCBzdHJ1Y3QgdmlkZW9idWZfZHZiICovCisJZGV2LT50cy5ucl9idWZzICAgID0gMzI7CisJZGV2LT50cy5ucl9wYWNrZXRzID0gMzIqNDsKKwlkZXYtPmR2Yi5uYW1lID0gZGV2LT5uYW1lOworCXZpZGVvYnVmX3F1ZXVlX2luaXQoJmRldi0+ZHZiLmR2YnEsICZzYWE3MTM0X3RzX3FvcHMsCisJCQkgICAgZGV2LT5wY2ksICZkZXYtPnNsb2NrLAorCQkJICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKKwkJCSAgICBWNEwyX0ZJRUxEX0FMVEVSTkFURSwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNhYTcxMzRfYnVmKSwKKwkJCSAgICBkZXYpOworCisJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisJY2FzZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFXzMwMElfRFZCVF9QQUw6CisJCXByaW50aygiJXM6IHBpbm5hY2xlIDMwMGkgZHZiIHNldHVwXG4iLGRldi0+bmFtZSk7CisJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZwaW5uYWNsZV8zMDBpLAorCQkJCQkJICZkZXYtPmkyY19hZGFwKTsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX01ENzEzNDoKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJm1lZGlvbl9jYXJkYnVzLAorCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKE5VTEwgPT0gZGV2LT5kdmIuZnJvbnRlbmQpCisJCQlwcmludGsoIiVzOiBIbW0sIGxvb2tzIGxpa2UgdGhpcyBpcyB0aGUgb2xkIE1ENzEzNCAiCisJCQkgICAgICAgInZlcnNpb24gd2l0aG91dCBEVkItVCBzdXBwb3J0XG4iLGRldi0+bmFtZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiJXM6IEh1aD8gdW5rbm93biBEVkIgY2FyZD9cbiIsZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKE5VTEwgPT0gZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJcHJpbnRrKCIlczogZnJvbnRlbmQgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiByZWdpc3RlciBldmVyeXRoaW5nIGVsc2UgKi8KKwlyZXR1cm4gdmlkZW9idWZfZHZiX3JlZ2lzdGVyKCZkZXYtPmR2YiwgVEhJU19NT0RVTEUsIGRldik7Cit9CisKK3N0YXRpYyBpbnQgZHZiX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJc3RhdGljIGludCBvbiAgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X1BPUlQyX0lOQUNUSVZFOworCisJcHJpbnRrKCIlczogJXNcbiIsZGV2LT5uYW1lLF9fRlVOQ1RJT05fXyk7CisKKwlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKwljYXNlIFNBQTcxMzRfQk9BUkRfUElOTkFDTEVfMzAwSV9EVkJUX1BBTDoKKwkJLyogb3RoZXJ3aXNlIHdlIGRvbid0IGRldGVjdCB0aGUgdHVuZXIgb24gbmV4dCBpbnNtb2QgKi8KKwkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixUREE5ODg3X1NFVF9DT05GSUcsJm9uKTsKKwkJYnJlYWs7CisJfTsKKwl2aWRlb2J1Zl9kdmJfdW5yZWdpc3RlcigmZGV2LT5kdmIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNhYTcxMzRfbXBlZ19vcHMgZHZiX29wcyA9IHsKKwkudHlwZSAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisJLmluaXQgICAgICAgICAgPSBkdmJfaW5pdCwKKwkuZmluaSAgICAgICAgICA9IGR2Yl9maW5pLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHZiX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIHNhYTcxMzRfdHNfcmVnaXN0ZXIoJmR2Yl9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHZiX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlzYWE3MTM0X3RzX3VucmVnaXN0ZXIoJmR2Yl9vcHMpOworfQorCittb2R1bGVfaW5pdChkdmJfcmVnaXN0ZXIpOworbW9kdWxlX2V4aXQoZHZiX3VucmVnaXN0ZXIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyMWUwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYwpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqICRJZDogc2FhNzEzNC1lbXByZXNzLmMsdiAxLjEwIDIwMDUvMDIvMDMgMTA6MjQ6MzMga3JheGVsIEV4cCAkCisgKgorICogKGMpIDIwMDQgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgInNhYTcxMzQtcmVnLmgiCisjaW5jbHVkZSAic2FhNzEzNC5oIgorCisjaW5jbHVkZSA8bWVkaWEvc2FhNjc1MmhzLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZW1wcmVzc19ucltdID0ge1swIC4uLiAoU0FBNzEzNF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9OworbW9kdWxlX3BhcmFtX2FycmF5KGVtcHJlc3NfbnIsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVtcHJlc3NfbnIsInRzIGRldmljZSBudW1iZXIiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKKworI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAoZGVidWcpCQkJXAorCXByaW50ayhLRVJOX0RFQlVHICIlcy9lbXByZXNzOiAiIGZtdCwgZGV2LT5uYW1lICwgIyMgYXJnKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgdHNfcmVzZXRfZW5jb2RlcihzdHJ1Y3Qgc2FhNzEzNF9kZXYqIGRldikKK3sKKwlpZiAoIWRldi0+ZW1wcmVzc19zdGFydGVkKQorCQlyZXR1cm47CisKKwlzYWFfd3JpdGViKFNBQTcxMzRfU1BFQ0lBTF9NT0RFLCAweDAwKTsKKwltc2xlZXAoMTApOworICAgCXNhYV93cml0ZWIoU0FBNzEzNF9TUEVDSUFMX01PREUsIDB4MDEpOworCW1zbGVlcCgxMDApOworCWRldi0+ZW1wcmVzc19zdGFydGVkID0gMDsKK30KKworc3RhdGljIGludCB0c19pbml0X2VuY29kZXIoc3RydWN0IHNhYTcxMzRfZGV2KiBkZXYpCit7CisJdHNfcmVzZXRfZW5jb2RlcihkZXYpOworCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19TX01QRUdDT01QLCBOVUxMKTsKKwlkZXYtPmVtcHJlc3Nfc3RhcnRlZCA9IDE7CisgCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB0c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpoLCpkZXYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJaW50IGVycjsKKworCWxpc3RfZm9yX2VhY2gobGlzdCwmc2FhNzEzNF9kZXZsaXN0KSB7CisJCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzYWE3MTM0X2RldiwgZGV2bGlzdCk7CisJCWlmIChoLT5lbXByZXNzX2RldiAmJiBoLT5lbXByZXNzX2Rldi0+bWlub3IgPT0gbWlub3IpCisJCQlkZXYgPSBoOworCX0KKwlpZiAoTlVMTCA9PSBkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJZHByaW50aygib3BlbiBtaW5vcj0lZFxuIixtaW5vcik7CisJZXJyID0gLUVCVVNZOworCWlmIChkb3duX3RyeWxvY2soJmRldi0+ZW1wcmVzc190c3EubG9jaykpCisJCWdvdG8gZG9uZTsKKwlpZiAoZGV2LT5lbXByZXNzX3VzZXJzKQorCQlnb3RvIGRvbmVfdXA7CisKKwlkZXYtPmVtcHJlc3NfdXNlcnMrKzsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7CisJZXJyID0gMDsKKworZG9uZV91cDoKKwl1cCgmZGV2LT5lbXByZXNzX3RzcS5sb2NrKTsKK2RvbmU6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0c19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRldi0+ZW1wcmVzc190c3Euc3RyZWFtaW5nKQorCQl2aWRlb2J1Zl9zdHJlYW1vZmYoJmRldi0+ZW1wcmVzc190c3EpOworCWRvd24oJmRldi0+ZW1wcmVzc190c3EubG9jayk7CisJaWYgKGRldi0+ZW1wcmVzc190c3EucmVhZGluZykKKwkJdmlkZW9idWZfcmVhZF9zdG9wKCZkZXYtPmVtcHJlc3NfdHNxKTsKKwl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmRldi0+ZW1wcmVzc190c3EpOworCWRldi0+ZW1wcmVzc191c2Vycy0tOworCisJLyogc3RvcCB0aGUgZW5jb2RlciAqLworCXRzX3Jlc2V0X2VuY29kZXIoZGV2KTsKKworCXVwKCZkZXYtPmVtcHJlc3NfdHNxLmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAordHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFkZXYtPmVtcHJlc3Nfc3RhcnRlZCkKKwkJdHNfaW5pdF9lbmNvZGVyKGRldik7CisKKwlyZXR1cm4gdmlkZW9idWZfcmVhZF9zdHJlYW0oJmRldi0+ZW1wcmVzc190c3EsCisJCQkJICAgIGRhdGEsIGNvdW50LCBwcG9zLCAwLAorCQkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3RzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxlLCAmZGV2LT5lbXByZXNzX3RzcSwgd2FpdCk7Cit9CisKKworc3RhdGljIGludAordHNfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHZpZGVvYnVmX21tYXBfbWFwcGVyKCZkZXYtPmVtcHJlc3NfdHNxLCB2bWEpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBfbm90XyBjYWxsZWQgZGlyZWN0bHksIGJ1dCBmcm9tCisgKiB2aWRlb19nZW5lcmljX2lvY3RsIChhbmQgbWF5YmUgb3RoZXJzKS4gIHVzZXJzcGFjZQorICogY29weWluZyBpcyBkb25lIGFscmVhZHksIGFyZyBpcyBhIGtlcm5lbCBwb2ludGVyLgorICovCitzdGF0aWMgaW50IHRzX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRlYnVnID4gMSkKKwkJc2FhNzEzNF9wcmludF9pb2N0bChkZXYtPm5hbWUsY21kKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX1FVRVJZQ0FQOgorCXsKKwkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOworCisJCW1lbXNldChjYXAsMCxzaXplb2YoKmNhcCkpOworICAgICAgICAgICAgICAgIHN0cmNweShjYXAtPmRyaXZlciwgInNhYTcxMzQiKTsKKwkJc3RybGNweShjYXAtPmNhcmQsIHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUsCisJCQlzaXplb2YoY2FwLT5jYXJkKSk7CisJCXNwcmludGYoY2FwLT5idXNfaW5mbywiUENJOiVzIixwY2lfbmFtZShkZXYtPnBjaSkpOworCQljYXAtPnZlcnNpb24gPSBTQUE3MTM0X1ZFUlNJT05fQ09ERTsKKwkJY2FwLT5jYXBhYmlsaXRpZXMgPQorCQkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CisJCQlWNEwyX0NBUF9SRUFEV1JJVEUgfAorCQkJVjRMMl9DQVBfU1RSRUFNSU5HOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiAtLS0gaW5wdXQgc3dpdGNoaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwl7CisJCXN0cnVjdCB2NGwyX2lucHV0ICppID0gYXJnOworCisJCWlmIChpLT5pbmRleCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCQlzdHJjcHkoaS0+bmFtZSwiQ0NJUjY1NiIpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19JTlBVVDoKKwl7CisJCWludCAqaSA9IGFyZzsKKwkJKmkgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19JTlBVVDoKKwl7CisJCWludCAqaSA9IGFyZzsKKworCQlpZiAoKmkgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9CisJLyogLS0tIGNhcHR1cmUgaW9jdGxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWNhc2UgVklESU9DX0VOVU1fRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZiA9IGFyZzsKKwkJaW50IGluZGV4OworCisJCWluZGV4ID0gZi0+aW5kZXg7CisJCWlmIChpbmRleCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtc2V0KGYsMCxzaXplb2YoKmYpKTsKKwkJZi0+aW5kZXggPSBpbmRleDsKKwkJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgIk1QRUcgVFMiLCBzaXplb2YoZi0+ZGVzY3JpcHRpb24pKTsKKwkJZi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJZi0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfR19GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSBhcmc7CisKKwkJbWVtc2V0KGYsMCxzaXplb2YoKmYpKTsKKwkJZi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKworCQkvKiBGSVhNRTogdHJhbnNsYXRlIHN1YnNhbXBsaW5nIHR5cGUgRU1QUkVTUyBpbnRvCisJCSAqICAgICAgICB3aWR0aC9oZWlnaHQ6ICovCisJCWYtPmZtdC5waXgud2lkdGggICAgICAgID0gNzIwOyAvKiBEMSAqLworCQlmLT5mbXQucGl4LmhlaWdodCAgICAgICA9IDU3NjsKKwkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAgPSBWNEwyX1BJWF9GTVRfTVBFRzsKKwkJZi0+Zm10LnBpeC5zaXplaW1hZ2UgICAgPSBUU19QQUNLRVRfU0laRSAqIGRldi0+dHMubnJfcGFja2V0czsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfU19GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSBhcmc7CisKKwkJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkgICAgcmV0dXJuIC1FSU5WQUw7CisKKwkJLyoKKwkJICBGSVhNRTogdHJhbnNsYXRlIGFuZCByb3VuZCB3aWR0aC9oZWlnaHQgaW50byBFTVBSRVNTCisJCSAgc3Vic2FtcGxlIHR5cGU6CisKKwkJICAgICAgICAgIHR5cGUgIHwgICBQQUwgICB8ICBOVFNDCisJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAgU0lGICAgfCAzNTJ4Mjg4IHwgMzUyeDI0MAorCQkJIDEvMiBEMSB8IDM1Mng1NzYgfCAzNTJ4NDgwCisJCQkgMi8zIEQxIHwgNDgweDU3NiB8IDQ4MHg0ODAKKwkJCSAgRDEgICAgfCA3MjB4NTc2IHwgNzIweDQ4MAorCQkqLworCisJCWYtPmZtdC5waXgud2lkdGggICAgICAgID0gNzIwOyAvKiBEMSAqLworCQlmLT5mbXQucGl4LmhlaWdodCAgICAgICA9IDU3NjsKKwkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAgPSBWNEwyX1BJWF9GTVRfTVBFRzsKKwkJZi0+Zm10LnBpeC5zaXplaW1hZ2UgICAgPSBUU19QQUNLRVRfU0laRSogZGV2LT50cy5ucl9wYWNrZXRzOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19SRVFCVUZTOgorCQlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcygmZGV2LT5lbXByZXNzX3RzcSxhcmcpOworCisJY2FzZSBWSURJT0NfUVVFUllCVUY6CisJCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1ZigmZGV2LT5lbXByZXNzX3RzcSxhcmcpOworCisJY2FzZSBWSURJT0NfUUJVRjoKKwkJcmV0dXJuIHZpZGVvYnVmX3FidWYoJmRldi0+ZW1wcmVzc190c3EsYXJnKTsKKworCWNhc2UgVklESU9DX0RRQlVGOgorCQlyZXR1cm4gdmlkZW9idWZfZHFidWYoJmRldi0+ZW1wcmVzc190c3EsYXJnLAorCQkJCSAgICAgIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworCWNhc2UgVklESU9DX1NUUkVBTU9OOgorCQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb24oJmRldi0+ZW1wcmVzc190c3EpOworCisJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgorCQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb2ZmKCZkZXYtPmVtcHJlc3NfdHNxKTsKKworCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwljYXNlIFZJRElPQ19HX0NUUkw6CisJY2FzZSBWSURJT0NfU19DVFJMOgorCQlyZXR1cm4gc2FhNzEzNF9jb21tb25faW9jdGwoZGV2LCBjbWQsIGFyZyk7CisKKwljYXNlIFZJRElPQ19TX01QRUdDT01QOgorCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU19NUEVHQ09NUCwgYXJnKTsKKwkJdHNfaW5pdF9lbmNvZGVyKGRldik7CisJCXJldHVybiAwOworCWNhc2UgVklESU9DX0dfTVBFR0NPTVA6CisJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19HX01QRUdDT01QLCBhcmcpOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHRzX2RvX2lvY3RsKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHNfZm9wcyA9Cit7CisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgID0gdHNfb3BlbiwKKwkucmVsZWFzZSAgPSB0c19yZWxlYXNlLAorCS5yZWFkCSAgPSB0c19yZWFkLAorCS5wb2xsCSAgPSB0c19wb2xsLAorCS5tbWFwCSAgPSB0c19tbWFwLAorCS5pb2N0bAkgID0gdHNfaW9jdGwsCisJLmxsc2VlayAgID0gbm9fbGxzZWVrLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2FhNzEzNF9lbXByZXNzX3RlbXBsYXRlID0KK3sKKwkubmFtZSAgICAgICAgICA9ICJzYWE3MTM0LWVtcHJlc3MiLAorCS50eXBlICAgICAgICAgID0gMCAvKiBGSVhNRSAqLywKKwkudHlwZTIgICAgICAgICA9IDAgLyogRklYTUUgKi8sCisJLmhhcmR3YXJlICAgICAgPSAwLAorCS5mb3BzICAgICAgICAgID0gJnRzX2ZvcHMsCisJLm1pbm9yCSAgICAgICA9IC0xLAorfTsKKworc3RhdGljIHZvaWQgZW1wcmVzc19zaWduYWxfdXBkYXRlKHZvaWQqIGRhdGEpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2KiBkZXYgPSAoc3RydWN0IHNhYTcxMzRfZGV2KikgZGF0YTsKKworCWlmIChkZXYtPm5vc2lnbmFsKSB7CisJCWRwcmludGsoIm5vIHZpZGVvIHNpZ25hbFxuIik7CisJCXRzX3Jlc2V0X2VuY29kZXIoZGV2KTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKCJ2aWRlbyBzaWduYWwgYWNxdWlyZWRcbiIpOworCQlpZiAoZGV2LT5lbXByZXNzX3VzZXJzKQorCQkJdHNfaW5pdF9lbmNvZGVyKGRldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbXByZXNzX3NpZ25hbF9jaGFuZ2Uoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJc2NoZWR1bGVfd29yaygmZGV2LT5lbXByZXNzX3dvcmtxdWV1ZSk7Cit9CisKKworc3RhdGljIGludCBlbXByZXNzX2luaXQoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJaW50IGVycjsKKworCWRwcmludGsoIiVzOiAlc1xuIixkZXYtPm5hbWUsX19GVU5DVElPTl9fKTsKKwlkZXYtPmVtcHJlc3NfZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKE5VTEwgPT0gZGV2LT5lbXByZXNzX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisJKihkZXYtPmVtcHJlc3NfZGV2KSA9IHNhYTcxMzRfZW1wcmVzc190ZW1wbGF0ZTsKKwlkZXYtPmVtcHJlc3NfZGV2LT5kZXYgICAgID0gJmRldi0+cGNpLT5kZXY7CisJZGV2LT5lbXByZXNzX2Rldi0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlOworCXNucHJpbnRmKGRldi0+ZW1wcmVzc19kZXYtPm5hbWUsIHNpemVvZihkZXYtPmVtcHJlc3NfZGV2LT5uYW1lKSwKKwkJICIlcyBlbXByZXNzICglcykiLCBkZXYtPm5hbWUsCisJCSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lKTsKKworCUlOSVRfV09SSygmZGV2LT5lbXByZXNzX3dvcmtxdWV1ZSwgZW1wcmVzc19zaWduYWxfdXBkYXRlLCAodm9pZCopIGRldik7CisKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT5lbXByZXNzX2RldixWRkxfVFlQRV9HUkFCQkVSLAorCQkJCSAgICBlbXByZXNzX25yW2Rldi0+bnJdKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT5lbXByZXNzX2Rldik7CisJCWRldi0+ZW1wcmVzc19kZXYgPSBOVUxMOworCQlyZXR1cm4gZXJyOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgdmlkZW8lZCBbbXBlZ11cbiIsCisJICAgICAgIGRldi0+bmFtZSxkZXYtPmVtcHJlc3NfZGV2LT5taW5vciAmIDB4MWYpOworCisJdmlkZW9idWZfcXVldWVfaW5pdCgmZGV2LT5lbXByZXNzX3RzcSwgJnNhYTcxMzRfdHNfcW9wcywKKwkJCSAgICBkZXYtPnBjaSwgJmRldi0+c2xvY2ssCisJCQkgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkJICAgIFY0TDJfRklFTERfQUxURVJOQVRFLAorCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2FhNzEzNF9idWYpLAorCQkJICAgIGRldik7CisKKwllbXByZXNzX3NpZ25hbF91cGRhdGUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbXByZXNzX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJZHByaW50aygiJXM6ICVzXG4iLGRldi0+bmFtZSxfX0ZVTkNUSU9OX18pOworCisJaWYgKE5VTEwgPT0gZGV2LT5lbXByZXNzX2RldikKKwkJcmV0dXJuIDA7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPmVtcHJlc3NfZGV2KTsKKwlkZXYtPmVtcHJlc3NfZGV2ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzYWE3MTM0X21wZWdfb3BzIGVtcHJlc3Nfb3BzID0geworCS50eXBlICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0VNUFJFU1MsCisJLmluaXQgICAgICAgICAgPSBlbXByZXNzX2luaXQsCisJLmZpbmkgICAgICAgICAgPSBlbXByZXNzX2ZpbmksCisJLnNpZ25hbF9jaGFuZ2UgPSBlbXByZXNzX3NpZ25hbF9jaGFuZ2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlbXByZXNzX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIHNhYTcxMzRfdHNfcmVnaXN0ZXIoJmVtcHJlc3Nfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVtcHJlc3NfdW5yZWdpc3Rlcih2b2lkKQoreworCXNhYTcxMzRfdHNfdW5yZWdpc3RlcigmZW1wcmVzc19vcHMpOworfQorCittb2R1bGVfaW5pdChlbXByZXNzX3JlZ2lzdGVyKTsKK21vZHVsZV9leGl0KGVtcHJlc3NfdW5yZWdpc3Rlcik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDJiYjYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKiAkSWQ6IHNhYTcxMzQtaTJjLmMsdiAxLjEwIDIwMDUvMDEvMjQgMTc6Mzc6MjMga3JheGVsIEV4cCAkCisgKgorICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCisgKiBpMmMgaW50ZXJmYWNlIHN1cHBvcnQKKyAqCisgKiAoYykgMjAwMSwwMiBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKKyNpbmNsdWRlICJzYWE3MTM0LmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTJjX2RlYnVnID0gMDsKK21vZHVsZV9wYXJhbShpMmNfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGkyY19kZWJ1ZywiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFtpMmNdIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTJjX3NjYW4gPSAwOworbW9kdWxlX3BhcmFtKGkyY19zY2FuLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpMmNfc2Nhbiwic2NhbiBpMmMgYnVzIGF0IGluc21vZCB0aW1lIik7CisKKyNkZWZpbmUgZDFwcmludGsgaWYgKDEgPT0gaTJjX2RlYnVnKSBwcmludGsKKyNkZWZpbmUgZDJwcmludGsgaWYgKDIgPT0gaTJjX2RlYnVnKSBwcmludGsKKworI2RlZmluZSBJMkNfV0FJVF9ERUxBWSAgMzIKKyNkZWZpbmUgSTJDX1dBSVRfUkVUUlkgIDE2CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjaGFyICpzdHJfaTJjX3N0YXR1c1tdID0geworCSJJRExFIiwgIkRPTkVfU1RPUCIsICJCVVNZIiwgIlRPX1NDTCIsICJUT19BUkIiLCAiRE9ORV9XUklURSIsCisJIkRPTkVfUkVBRCIsICJET05FX1dSSVRFX1RPIiwgIkRPTkVfUkVBRF9UTyIsICJOT19ERVZJQ0UiLAorCSJOT19BQ0tOIiwgIkJVU19FUlIiLCAiQVJCX0xPU1QiLCAiU0VRX0VSUiIsICJTVF9FUlIiLCAiU1dfRVJSIgorfTsKKworZW51bSBpMmNfc3RhdHVzIHsKKwlJRExFICAgICAgICAgID0gMCwgIC8vIG5vIEkyQyBjb21tYW5kIHBlbmRpbmcKKwlET05FX1NUT1AgICAgID0gMSwgIC8vIEkyQyBjb21tYW5kIGRvbmUgYW5kIFNUT1AgZXhlY3V0ZWQKKwlCVVNZICAgICAgICAgID0gMiwgIC8vIGV4ZWN1dGluZyBJMkMgY29tbWFuZAorCVRPX1NDTCAgICAgICAgPSAzLCAgLy8gZXhlY3V0aW5nIEkyQyBjb21tYW5kLCB0aW1lIG91dCBvbiBjbG9jayBzdHJldGNoaW5nCisJVE9fQVJCICAgICAgICA9IDQsICAvLyB0aW1lIG91dCBvbiBhcmJpdHJhdGlvbiB0cmlhbCwgc3RpbGwgdHJ5aW5nCisJRE9ORV9XUklURSAgICA9IDUsICAvLyBJMkMgY29tbWFuZCBkb25lIGFuZCBhd2FpdGluZyBuZXh0IHdyaXRlIGNvbW1hbmQKKwlET05FX1JFQUQgICAgID0gNiwgIC8vIEkyQyBjb21tYW5kIGRvbmUgYW5kIGF3YWl0aW5nIG5leHQgcmVhZCBjb21tYW5kCisJRE9ORV9XUklURV9UTyA9IDcsICAvLyBzZWUgNSwgYW5kIHRpbWUgb3V0IG9uIHN0YXR1cyBlY2hvCisJRE9ORV9SRUFEX1RPICA9IDgsICAvLyBzZWUgNiwgYW5kIHRpbWUgb3V0IG9uIHN0YXR1cyBlY2hvCisJTk9fREVWSUNFICAgICA9IDksICAvLyBubyBhY2tub3dsZWRnZSBvbiBkZXZpY2Ugc2xhdmUgYWRkcmVzcworCU5PX0FDS04gICAgICAgPSAxMCwgLy8gbm8gYWNrbm93bGVkZ2UgYWZ0ZXIgZGF0YSBieXRlIHRyYW5zZmVyCisJQlVTX0VSUiAgICAgICA9IDExLCAvLyBidXMgZXJyb3IKKwlBUkJfTE9TVCAgICAgID0gMTIsIC8vIGFyYml0cmF0aW9uIGxvc3QgZHVyaW5nIHRyYW5zZmVyCisJU0VRX0VSUiAgICAgICA9IDEzLCAvLyBlcnJvbmVvdXMgcHJvZ3JhbW1pbmcgc2VxdWVuY2UKKwlTVF9FUlIgICAgICAgID0gMTQsIC8vIHdyb25nIHN0YXR1cyBlY2hvaW5nCisJU1dfRVJSICAgICAgICA9IDE1ICAvLyBzb2Z0d2FyZSBlcnJvcgorfTsKKworc3RhdGljIGNoYXIgKnN0cl9pMmNfYXR0cltdID0geworCSJOT1AiLCAiU1RPUCIsICJDT05USU5VRSIsICJTVEFSVCIKK307CisKK2VudW0gaTJjX2F0dHIgeworCU5PUCAgICAgICAgICAgPSAwLCAgLy8gbm8gb3BlcmF0aW9uIG9uIEkyQyBidXMKKwlTVE9QICAgICAgICAgID0gMSwgIC8vIHN0b3AgY29uZGl0aW9uLCBubyBhc3NvY2lhdGVkIGJ5dGUgdHJhbnNmZXIKKwlDT05USU5VRSAgICAgID0gMiwgIC8vIGNvbnRpbnVlIHdpdGggYnl0ZSB0cmFuc2ZlcgorCVNUQVJUICAgICAgICAgPSAzICAgLy8gc3RhcnQgY29uZGl0aW9uIHdpdGggYnl0ZSB0cmFuc2ZlcgorfTsKKworc3RhdGljIGlubGluZSBlbnVtIGkyY19zdGF0dXMgaTJjX2dldF9zdGF0dXMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJZW51bSBpMmNfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHNhYV9yZWFkYihTQUE3MTM0X0kyQ19BVFRSX1NUQVRVUykgJiAweDBmOworCWQycHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpMmMgc3RhdCA8PSAlc1xuIixkZXYtPm5hbWUsCisJCSBzdHJfaTJjX3N0YXR1c1tzdGF0dXNdKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaTJjX3NldF9zdGF0dXMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsCisJCQkJICBlbnVtIGkyY19zdGF0dXMgc3RhdHVzKQoreworCWQycHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpMmMgc3RhdCA9PiAlc1xuIixkZXYtPm5hbWUsCisJCSBzdHJfaTJjX3N0YXR1c1tzdGF0dXNdKTsKKwlzYWFfYW5kb3JiKFNBQTcxMzRfSTJDX0FUVFJfU1RBVFVTLDB4MGYsc3RhdHVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGkyY19zZXRfYXR0cihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgZW51bSBpMmNfYXR0ciBhdHRyKQoreworCWQycHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpMmMgYXR0ciA9PiAlc1xuIixkZXYtPm5hbWUsCisJCSBzdHJfaTJjX2F0dHJbYXR0cl0pOworCXNhYV9hbmRvcmIoU0FBNzEzNF9JMkNfQVRUUl9TVEFUVVMsMHhjMCxhdHRyIDw8IDYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpMmNfaXNfZXJyb3IoZW51bSBpMmNfc3RhdHVzIHN0YXR1cykKK3sKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgTk9fREVWSUNFOgorCWNhc2UgTk9fQUNLTjoKKwljYXNlIEJVU19FUlI6CisJY2FzZSBBUkJfTE9TVDoKKwljYXNlIFNFUV9FUlI6CisJY2FzZSBTVF9FUlI6CisJCXJldHVybiBUUlVFOworCWRlZmF1bHQ6CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGkyY19pc19pZGxlKGVudW0gaTJjX3N0YXR1cyBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIElETEU6CisJY2FzZSBET05FX1NUT1A6CisJCXJldHVybiBUUlVFOworCWRlZmF1bHQ6CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGkyY19pc19idXN5KGVudW0gaTJjX3N0YXR1cyBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEJVU1k6CisJCXJldHVybiBUUlVFOworCWRlZmF1bHQ6CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaTJjX2lzX2J1c3lfd2FpdChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwllbnVtIGkyY19zdGF0dXMgc3RhdHVzOworCWludCBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEkyQ19XQUlUX1JFVFJZOyBjb3VudCsrKSB7CisJCXN0YXR1cyA9IGkyY19nZXRfc3RhdHVzKGRldik7CisJCWlmICghaTJjX2lzX2J1c3koc3RhdHVzKSkKKwkJCWJyZWFrOworCQlzYWFfd2FpdChJMkNfV0FJVF9ERUxBWSk7CisJfQorCWlmIChJMkNfV0FJVF9SRVRSWSA9PSBjb3VudCkKKwkJcmV0dXJuIEZBTFNFOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGkyY19yZXNldChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwllbnVtIGkyY19zdGF0dXMgc3RhdHVzOworCWludCBjb3VudDsKKworCWQycHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpMmMgcmVzZXRcbiIsZGV2LT5uYW1lKTsKKwlzdGF0dXMgPSBpMmNfZ2V0X3N0YXR1cyhkZXYpOworCWlmICghaTJjX2lzX2Vycm9yKHN0YXR1cykpCisJCXJldHVybiBUUlVFOworCWkyY19zZXRfc3RhdHVzKGRldixzdGF0dXMpOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgSTJDX1dBSVRfUkVUUlk7IGNvdW50KyspIHsKKwkJc3RhdHVzID0gaTJjX2dldF9zdGF0dXMoZGV2KTsKKwkJaWYgKCFpMmNfaXNfZXJyb3Ioc3RhdHVzKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoSTJDX1dBSVRfREVMQVkpOworCX0KKwlpZiAoSTJDX1dBSVRfUkVUUlkgPT0gY291bnQpCisJCXJldHVybiBGQUxTRTsKKworCWlmICghaTJjX2lzX2lkbGUoc3RhdHVzKSkKKwkJcmV0dXJuIEZBTFNFOworCisJaTJjX3NldF9hdHRyKGRldixOT1ApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW5saW5lIGludCBpMmNfc2VuZF9ieXRlKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LAorCQkJCWVudW0gaTJjX2F0dHIgYXR0ciwKKwkJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJZW51bSBpMmNfc3RhdHVzIHN0YXR1czsKKwlfX3UzMiBkd29yZDsKKworI2lmIDAKKwlpMmNfc2V0X2F0dHIoZGV2LGF0dHIpOworCXNhYV93cml0ZWIoU0FBNzEzNF9JMkNfREFUQSwgZGF0YSk7CisjZWxzZQorCS8qIGhhdmUgdG8gd3JpdGUgYm90aCBhdHRyICsgZGF0YSBpbiBvbmUgMzJiaXQgd29yZCAqLworCWR3b3JkICA9IHNhYV9yZWFkbChTQUE3MTM0X0kyQ19BVFRSX1NUQVRVUyA+PiAyKTsKKwlkd29yZCAmPSAweDBmOworCWR3b3JkIHw9IChhdHRyIDw8IDYpOworCWR3b3JkIHw9ICgoX191MzIpZGF0YSA8PCA4KTsKKwlkd29yZCB8PSAweDAwIDw8IDE2OyAgLyogMTAwIGtIeiAqLworLy8JZHdvcmQgfD0gMHg0MCA8PCAxNjsgIC8qIDQwMCBrSHogKi8KKwlkd29yZCB8PSAweGYwIDw8IDI0OworCXNhYV93cml0ZWwoU0FBNzEzNF9JMkNfQVRUUl9TVEFUVVMgPj4gMiwgZHdvcmQpOworI2VuZGlmCisJZDJwcmludGsoS0VSTl9ERUJVRyAiJXM6IGkyYyBkYXRhID0+IDB4JXhcbiIsZGV2LT5uYW1lLGRhdGEpOworCisJaWYgKCFpMmNfaXNfYnVzeV93YWl0KGRldikpCisJCXJldHVybiAtRUlPOworCXN0YXR1cyA9IGkyY19nZXRfc3RhdHVzKGRldik7CisJaWYgKGkyY19pc19lcnJvcihzdGF0dXMpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaTJjX3JlY3ZfYnl0ZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwllbnVtIGkyY19zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKworCWkyY19zZXRfYXR0cihkZXYsQ09OVElOVUUpOworCWlmICghaTJjX2lzX2J1c3lfd2FpdChkZXYpKQorCQlyZXR1cm4gLUVJTzsKKwlzdGF0dXMgPSBpMmNfZ2V0X3N0YXR1cyhkZXYpOworCWlmIChpMmNfaXNfZXJyb3Ioc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisJZGF0YSA9IHNhYV9yZWFkYihTQUE3MTM0X0kyQ19EQVRBKTsKKwlkMnByaW50ayhLRVJOX0RFQlVHICIlczogaTJjIGRhdGEgPD0gMHgleFxuIixkZXYtPm5hbWUsZGF0YSk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzEzNF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAorCQkJICAgIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwllbnVtIGkyY19zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwlpbnQgYWRkcixyYyxpLGJ5dGU7CisKKyAgCXN0YXR1cyA9IGkyY19nZXRfc3RhdHVzKGRldik7CisJaWYgKCFpMmNfaXNfaWRsZShzdGF0dXMpKQorCQlpZiAoIWkyY19yZXNldChkZXYpKQorCQkJcmV0dXJuIC1FSU87CisKKwlkMnByaW50aygic3RhcnQgeGZlclxuIik7CisJZDFwcmludGsoS0VSTl9ERUJVRyAiJXM6IGkyYyB4ZmVyOiIsZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKCEobXNnc1tpXS5mbGFncyAmIEkyQ19NX05PU1RBUlQpIHx8IDAgPT0gaSkgeworCQkJLyogc2VuZCBhZGRyZXNzICovCisJCQlkMnByaW50aygic2VuZCBhZGRyZXNzXG4iKTsKKwkJCWFkZHIgID0gbXNnc1tpXS5hZGRyIDw8IDE7CisJCQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKQorCQkJCWFkZHIgfD0gMTsKKwkJCWlmIChpID4gMCAmJiBtc2dzW2ldLmZsYWdzICYgSTJDX01fUkQpIHsKKwkJCQkvKiB3b3JrYXJvdW5kIGZvciBhIHNhYTcxMzQgaTJjIGJ1ZworCQkJCSAqIG5lZWRlZCB0byB0YWxrIHRvIHRoZSBtdDM1MiBkZW11eAorCQkJCSAqIHRoYW5rcyB0byBwaW5uYWNsZSBmb3IgdGhlIGhpbnQgKi8KKwkJCQlpbnQgcXVpcmsgPSAweGZkOworCQkJCWQxcHJpbnRrKCIgWyUwMnggcXVpcmtdIixxdWlyayk7CisJCQkJaTJjX3NlbmRfYnl0ZShkZXYsU1RBUlQscXVpcmspOworCQkJCWkyY19yZWN2X2J5dGUoZGV2KTsKKwkJCX0KKwkJCWQxcHJpbnRrKCIgPCAlMDJ4IiwgYWRkcik7CisJCQlyYyA9IGkyY19zZW5kX2J5dGUoZGV2LFNUQVJULGFkZHIpOworCQkJaWYgKHJjIDwgMCkKKwkJCQkgZ290byBlcnI7CisJCX0KKwkJaWYgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgeworCQkJLyogcmVhZCBieXRlcyAqLworCQkJZDJwcmludGsoInJlYWQgYnl0ZXNcbiIpOworCQkJZm9yIChieXRlID0gMDsgYnl0ZSA8IG1zZ3NbaV0ubGVuOyBieXRlKyspIHsKKwkJCQlkMXByaW50aygiID0iKTsKKwkJCQlyYyA9IGkyY19yZWN2X2J5dGUoZGV2KTsKKwkJCQlpZiAocmMgPCAwKQorCQkJCQlnb3RvIGVycjsKKwkJCQlkMXByaW50aygiJTAyeCIsIHJjKTsKKwkJCQltc2dzW2ldLmJ1ZltieXRlXSA9IHJjOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogd3JpdGUgYnl0ZXMgKi8KKwkJCWQycHJpbnRrKCJ3cml0ZSBieXRlc1xuIik7CisJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpXS5sZW47IGJ5dGUrKykgeworCQkJCWRhdGEgPSBtc2dzW2ldLmJ1ZltieXRlXTsKKwkJCQlkMXByaW50aygiICUwMngiLCBkYXRhKTsKKwkJCQlyYyA9IGkyY19zZW5kX2J5dGUoZGV2LENPTlRJTlVFLGRhdGEpOworCQkJCWlmIChyYyA8IDApCisJCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJfQorCWQycHJpbnRrKCJ4ZmVyIGRvbmVcbiIpOworCWQxcHJpbnRrKCIgPiIpOworCWkyY19zZXRfYXR0cihkZXYsU1RPUCk7CisJcmMgPSAtRUlPOworCWlmICghaTJjX2lzX2J1c3lfd2FpdChkZXYpKQorCQlnb3RvIGVycjsKKyAgCXN0YXR1cyA9IGkyY19nZXRfc3RhdHVzKGRldik7CisJaWYgKGkyY19pc19lcnJvcihzdGF0dXMpKQorCQlnb3RvIGVycjsKKworCWQxcHJpbnRrKCJcbiIpOworCXJldHVybiBudW07CisgZXJyOgorCWlmICgxID09IGkyY19kZWJ1ZykgeworCQlzdGF0dXMgPSBpMmNfZ2V0X3N0YXR1cyhkZXYpOworCQlwcmludGsoIiBFUlJPUjogJXNcbiIsc3RyX2kyY19zdGF0dXNbc3RhdHVzXSk7CisJfQorCXJldHVybiByYzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBhbGdvX2NvbnRyb2woc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX0VNVUw7Cit9CisKK3N0YXRpYyBpbnQgYXR0YWNoX2luZm9ybShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworICAgICAgICBzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGNsaWVudC0+YWRhcHRlci0+YWxnb19kYXRhOworCWludCB0dW5lciA9IGRldi0+dHVuZXJfdHlwZTsKKwlpbnQgY29uZiAgPSBkZXYtPnRkYTk4ODdfY29uZjsKKworCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVFVORVJfU0VUX1RZUEUsJnR1bmVyKTsKKwlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFREQTk4ODdfU0VUX0NPTkZJRywmY29uZik7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc2FhNzEzNF9hbGdvID0geworCS5uYW1lICAgICAgICAgID0gInNhYTcxMzQiLAorCS5pZCAgICAgICAgICAgID0gSTJDX0FMR09fU0FBNzEzNCwKKwkubWFzdGVyX3hmZXIgICA9IHNhYTcxMzRfaTJjX3hmZXIsCisJLmFsZ29fY29udHJvbCAgPSBhbGdvX2NvbnRyb2wsCisJLmZ1bmN0aW9uYWxpdHkgPSBmdW5jdGlvbmFsaXR5LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBzYWE3MTM0X2FkYXBfdGVtcGxhdGUgPSB7CisJLm93bmVyICAgICAgICAgPSBUSElTX01PRFVMRSwKKyNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCisJLmNsYXNzICAgICAgICAgPSBJMkNfQ0xBU1NfVFZfQU5BTE9HLAorI2VuZGlmCisJSTJDX0RFVk5BTUUoInNhYTcxMzQiKSwKKwkuaWQgICAgICAgICAgICA9IEkyQ19BTEdPX1NBQTcxMzQsCisJLmFsZ28gICAgICAgICAgPSAmc2FhNzEzNF9hbGdvLAorCS5jbGllbnRfcmVnaXN0ZXIgPSBhdHRhY2hfaW5mb3JtLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IHNhYTcxMzRfY2xpZW50X3RlbXBsYXRlID0geworCUkyQ19ERVZOQU1FKCJzYWE3MTM0IGludGVybmFsIiksCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50CitzYWE3MTM0X2kyY19lZXByb20oc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHVuc2lnbmVkIGNoYXIgKmVlZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgaSxlcnI7CisKKwlkZXYtPmkyY19jbGllbnQuYWRkciA9IDB4YTAgPj4gMTsKKwlidWYgPSAwOworCWlmICgxICE9IChlcnIgPSBpMmNfbWFzdGVyX3NlbmQoJmRldi0+aTJjX2NsaWVudCwmYnVmLDEpKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSHVoLCBubyBlZXByb20gcHJlc2VudCAoZXJyPSVkKT9cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsZXJyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAobGVuICE9IChlcnIgPSBpMmNfbWFzdGVyX3JlY3YoJmRldi0+aTJjX2NsaWVudCxlZWRhdGEsbGVuKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGkyYyBlZXByb20gcmVhZCBlcnJvciAoZXJyPSVkKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSxlcnIpOworCQlyZXR1cm4gLTE7CisJfQorCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoMCA9PSAoaSAlIDE2KSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpMmMgZWVwcm9tICUwMng6IixkZXYtPm5hbWUsaSk7CisJCXByaW50aygiICUwMngiLGVlZGF0YVtpXSk7CisJCWlmICgxNSA9PSAoaSAlIDE2KSkKKwkJCXByaW50aygiXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICppMmNfZGV2c1sxMjhdID0geworCVsgMHgyMCAgICAgIF0gPSAibXBlZyBlbmNvZGVyIChzYWE2NzUyaHMpIiwKKwlbIDB4YTAgPj4gMSBdID0gImVlcHJvbSIsCisJWyAweGMwID4+IDEgXSA9ICJ0dW5lciAoYW5hbG9nKSIsCisJWyAweDg2ID4+IDEgXSA9ICJ0ZGE5ODg3IiwKK307CisKK3N0YXRpYyB2b2lkIGRvX2kyY19zY2FuKGNoYXIgKm5hbWUsIHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCBpLHJjOworCisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCWMtPmFkZHIgPSBpOworCQlyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCZidWYsMCk7CisJCWlmIChyYyA8IDApCisJCQljb250aW51ZTsKKwkJcHJpbnRrKCIlczogaTJjIHNjYW46IGZvdW5kIGRldmljZSBAIDB4JXggIFslc11cbiIsCisJCSAgICAgICBuYW1lLCBpIDw8IDEsIGkyY19kZXZzW2ldID8gaTJjX2RldnNbaV0gOiAiPz8/Iik7CisJfQorfQorCit2b2lkIHNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlCVUdfT04oTlVMTCA9PSBkZXYtPmkyY19hZGFwLmFsZ29fZGF0YSk7CisJaTJjX2NsaWVudHNfY29tbWFuZCgmZGV2LT5pMmNfYWRhcCwgY21kLCBhcmcpOworfQorCitpbnQgc2FhNzEzNF9pMmNfcmVnaXN0ZXIoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJZGV2LT5pMmNfYWRhcCA9IHNhYTcxMzRfYWRhcF90ZW1wbGF0ZTsKKwlkZXYtPmkyY19hZGFwLmRldi5wYXJlbnQgPSAmZGV2LT5wY2ktPmRldjsKKwlzdHJjcHkoZGV2LT5pMmNfYWRhcC5uYW1lLGRldi0+bmFtZSk7CisJZGV2LT5pMmNfYWRhcC5hbGdvX2RhdGEgPSBkZXY7CisJaTJjX2FkZF9hZGFwdGVyKCZkZXYtPmkyY19hZGFwKTsKKworCWRldi0+aTJjX2NsaWVudCA9IHNhYTcxMzRfY2xpZW50X3RlbXBsYXRlOworCWRldi0+aTJjX2NsaWVudC5hZGFwdGVyID0gJmRldi0+aTJjX2FkYXA7CisKKwlzYWE3MTM0X2kyY19lZXByb20oZGV2LGRldi0+ZWVkYXRhLHNpemVvZihkZXYtPmVlZGF0YSkpOworCWlmIChpMmNfc2NhbikKKwkJZG9faTJjX3NjYW4oZGV2LT5uYW1lLCZkZXYtPmkyY19jbGllbnQpOworCXJldHVybiAwOworfQorCitpbnQgc2FhNzEzNF9pMmNfdW5yZWdpc3RlcihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlpMmNfZGVsX2FkYXB0ZXIoJmRldi0+aTJjX2FkYXApOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2Q0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCkBAIC0wLDAgKzEsNDkxIEBACisvKgorICogJElkOiBzYWE3MTM0LWlucHV0LmMsdiAxLjE2IDIwMDQvMTIvMTAgMTI6MzM6Mzkga3JheGVsIEV4cCAkCisgKgorICogaGFuZGxlIHNhYTcxMzQgSVIgcmVtb3RlcyB2aWEgbGludXgga2VybmVsIGlucHV0IGxheWVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2luY2x1ZGUgInNhYTcxMzQtcmVnLmgiCisjaW5jbHVkZSAic2FhNzEzNC5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGRpc2FibGVfaXIgPSAwOworbW9kdWxlX3BhcmFtKGRpc2FibGVfaXIsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfaXIsImRpc2FibGUgaW5mcmFyZWQgcmVtb3RlIHN1cHBvcnQiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBpcl9kZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oaXJfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW0lSXSIpOworCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pCWlmIChpcl9kZWJ1ZykgXAorCXByaW50ayhLRVJOX0RFQlVHICIlcy9pcjogIiBmbXQsIGRldi0+bmFtZSAsICMjIGFyZykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgSVJfS0VZVEFCX1RZUEUgZmx5dmlkZW9fY29kZXNbSVJfS0VZVEFCX1NJWkVdID0geworCVsgICAxNSBdID0gS0VZX0tQMCwKKwlbICAgIDMgXSA9IEtFWV9LUDEsCisJWyAgICA0IF0gPSBLRVlfS1AyLAorCVsgICAgNSBdID0gS0VZX0tQMywKKwlbICAgIDcgXSA9IEtFWV9LUDQsCisJWyAgICA4IF0gPSBLRVlfS1A1LAorCVsgICAgOSBdID0gS0VZX0tQNiwKKwlbICAgMTEgXSA9IEtFWV9LUDcsCisJWyAgIDEyIF0gPSBLRVlfS1A4LAorCVsgICAxMyBdID0gS0VZX0tQOSwKKworCVsgICAxNCBdID0gS0VZX1RVTkVSLCAgICAgICAgLy8gQWlyL0NhYmxlCisJWyAgIDE3IF0gPSBLRVlfVklERU8sICAgICAgICAvLyBWaWRlbworCVsgICAyMSBdID0gS0VZX0FVRElPLCAgICAgICAgLy8gQXVkaW8KKwlbICAgIDAgXSA9IEtFWV9QT1dFUiwgICAgICAgIC8vIFBvdmVyCisJWyAgICAyIF0gPSBLRVlfWk9PTSwgICAgICAgICAvLyBGdWxsc2NyZWVuCisJWyAgIDI3IF0gPSBLRVlfTVVURSwgICAgICAgICAvLyBNdXRlCisJWyAgIDIwIF0gPSBLRVlfVk9MVU1FVVAsCisJWyAgIDIzIF0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbICAgMTggXSA9IEtFWV9DSEFOTkVMVVAsICAgIC8vIENoYW5uZWwgKworCVsgICAxOSBdID0gS0VZX0NIQU5ORUxET1dOLCAgLy8gQ2hhbm5lbCAtCisJWyAgICA2IF0gPSBLRVlfQUdBSU4sICAgICAgICAvLyBSZWNhbAorCVsgICAxNiBdID0gS0VZX0tQRU5URVIsICAgICAgLy8gRW50ZXIKKworI2lmIDEgLyogRklYTUUgKi8KKwlbICAgMjYgXSA9IEtFWV9GMjIsICAgICAgICAgIC8vIFN0ZXJlbworCVsgICAyNCBdID0gS0VZX0VESVQsICAgICAgICAgLy8gQVYgU291cmNlCisjZW5kaWYKK307CisKK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSBjaW5lcmd5X2NvZGVzW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbICAgIDAgXSA9IEtFWV9LUDAsCisJWyAgICAxIF0gPSBLRVlfS1AxLAorCVsgICAgMiBdID0gS0VZX0tQMiwKKwlbICAgIDMgXSA9IEtFWV9LUDMsCisJWyAgICA0IF0gPSBLRVlfS1A0LAorCVsgICAgNSBdID0gS0VZX0tQNSwKKwlbICAgIDYgXSA9IEtFWV9LUDYsCisJWyAgICA3IF0gPSBLRVlfS1A3LAorCVsgICAgOCBdID0gS0VZX0tQOCwKKwlbICAgIDkgXSA9IEtFWV9LUDksCisKKwlbIDB4MGEgXSA9IEtFWV9QT1dFUiwKKwlbIDB4MGIgXSA9IEtFWV9QUk9HMSwgICAgICAgICAgIC8vIGFwcAorCVsgMHgwYyBdID0gS0VZX1pPT00sICAgICAgICAgICAgLy8gem9vbS9mdWxsc2NyZWVuCisJWyAweDBkIF0gPSBLRVlfQ0hBTk5FTFVQLCAgICAgICAvLyBjaGFubmVsCisJWyAweDBlIF0gPSBLRVlfQ0hBTk5FTERPV04sICAgICAvLyBjaGFubmVsLQorCVsgMHgwZiBdID0gS0VZX1ZPTFVNRVVQLAorCVsgMHgxMCBdID0gS0VZX1ZPTFVNRURPV04sCisJWyAweDExIF0gPSBLRVlfVFVORVIsICAgICAgICAgICAvLyBBVgorCVsgMHgxMiBdID0gS0VZX05VTUxPQ0ssICAgICAgICAgLy8gLS8tLQorCVsgMHgxMyBdID0gS0VZX0FVRElPLCAgICAgICAgICAgLy8gYXVkaW8KKwlbIDB4MTQgXSA9IEtFWV9NVVRFLAorCVsgMHgxNSBdID0gS0VZX1VQLAorCVsgMHgxNiBdID0gS0VZX0RPV04sCisJWyAweDE3IF0gPSBLRVlfTEVGVCwKKwlbIDB4MTggXSA9IEtFWV9SSUdIVCwKKwlbIDB4MTkgXSA9IEJUTl9MRUZULAorCVsgMHgxYSBdID0gQlROX1JJR0hULAorCVsgMHgxYiBdID0gS0VZX1dXVywgICAgICAgICAgICAgLy8gdGV4dAorCVsgMHgxYyBdID0gS0VZX1JFV0lORCwKKwlbIDB4MWQgXSA9IEtFWV9GT1JXQVJELAorCVsgMHgxZSBdID0gS0VZX1JFQ09SRCwKKwlbIDB4MWYgXSA9IEtFWV9QTEFZLAorCVsgMHgyMCBdID0gS0VZX1BSRVZJT1VTU09ORywKKwlbIDB4MjEgXSA9IEtFWV9ORVhUU09ORywKKwlbIDB4MjIgXSA9IEtFWV9QQVVTRSwKKwlbIDB4MjMgXSA9IEtFWV9TVE9QLAorfTsKKworLyogQWxmb25zIEdlc2VyIDxhLmdlc2VyQGNveC5uZXQ+CisgKiB1cGRhdGVzIGZyb20gSm9iIEQuIFIuIEJvcmdlcyA8am9iZHJiQGlnLmNvbS5icj4gKi8KK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSBlenR2X2NvZGVzW0lSX0tFWVRBQl9TSVpFXSA9IHsKKyAgICAgICAgWyAxOCBdID0gS0VZX1BPV0VSLAorICAgICAgICBbICAxIF0gPSBLRVlfVFYsICAgICAgICAgICAgIC8vIERWUgorICAgICAgICBbIDIxIF0gPSBLRVlfRFZELCAgICAgICAgICAgIC8vIERWRAorICAgICAgICBbIDIzIF0gPSBLRVlfQVVESU8sICAgICAgICAgIC8vIG11c2ljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRFZSIG1vZGUgLyBEVkQgbW9kZSAvIG11c2ljIG1vZGUKKworICAgICAgICBbIDI3IF0gPSBLRVlfTVVURSwgICAgICAgICAgIC8vIG11dGUKKyAgICAgICAgWyAgMiBdID0gS0VZX0xBTkdVQUdFLCAgICAgICAvLyBNVFMvU0FQIC8gYXVkaW8gLyBhdXRvc2VlaworICAgICAgICBbIDMwIF0gPSBLRVlfU1VCVElUTEUsICAgICAgIC8vIGNsb3NlZCBjYXB0aW9uaW5nIC8gc3VidGl0bGUgLyBzZWVrCisgICAgICAgIFsgMjIgXSA9IEtFWV9aT09NLCAgICAgICAgICAgLy8gZnVsbCBzY3JlZW4KKyAgICAgICAgWyAyOCBdID0gS0VZX1ZJREVPLCAgICAgICAgICAvLyB2aWRlbyBzb3VyY2UgLyBlamVjdCAvIGRlbGFsbAorICAgICAgICBbIDI5IF0gPSBLRVlfUkVTVEFSVCwgICAgICAgIC8vIHBsYXliYWNrIC8gYW5nbGUgLyBkZWwKKyAgICAgICAgWyA0NyBdID0gS0VZX1NFQVJDSCwgICAgICAgICAvLyBzY2FuIC8gbWVudSAvIHBsYXlsaXN0CisgICAgICAgIFsgNDggXSA9IEtFWV9DSEFOTkVMLCAgICAgICAgLy8gQ0ggc3VyZmluZyAvIGJvb2ttYXJrIC8gbWVtbworCisgICAgICAgIFsgNDkgXSA9IEtFWV9IRUxQLCAgICAgICAgICAgLy8gaGVscAorICAgICAgICBbIDUwIF0gPSBLRVlfTU9ERSwgICAgICAgICAgIC8vIG51bS9tZW1vCisgICAgICAgIFsgNTEgXSA9IEtFWV9FU0MsICAgICAgICAgICAgLy8gY2FuY2VsCisKKwlbIDEyIF0gPSBLRVlfVVAsICAgICAgICAgICAgIC8vIHVwCisJWyAxNiBdID0gS0VZX0RPV04sICAgICAgICAgICAvLyBkb3duCisJWyAgOCBdID0gS0VZX0xFRlQsICAgICAgICAgICAvLyBsZWZ0CisJWyAgNCBdID0gS0VZX1JJR0hULCAgICAgICAgICAvLyByaWdodAorCVsgIDMgXSA9IEtFWV9TRUxFQ1QsICAgICAgICAgLy8gc2VsZWN0CisKKwlbIDMxIF0gPSBLRVlfUkVXSU5ELCAgICAgICAgIC8vIHJld2luZAorCVsgMzIgXSA9IEtFWV9QTEFZUEFVU0UsICAgICAgLy8gcGxheS9wYXVzZQorCVsgNDEgXSA9IEtFWV9GT1JXQVJELCAgICAgICAgLy8gZm9yd2FyZAorCVsgMjAgXSA9IEtFWV9BR0FJTiwgICAgICAgICAgLy8gcmVwZWF0CisJWyA0MyBdID0gS0VZX1JFQ09SRCwgICAgICAgICAvLyByZWNvcmRpbmcKKwlbIDQ0IF0gPSBLRVlfU1RPUCwgICAgICAgICAgIC8vIHN0b3AKKwlbIDQ1IF0gPSBLRVlfUExBWSwgICAgICAgICAgIC8vIHBsYXkKKwlbIDQ2IF0gPSBLRVlfU0hVRkZMRSwgICAgICAgIC8vIHNuYXBzaG90IC8gc2h1ZmZsZQorCisgICAgICAgIFsgIDAgXSA9IEtFWV9LUDAsCisgICAgICAgIFsgIDUgXSA9IEtFWV9LUDEsCisgICAgICAgIFsgIDYgXSA9IEtFWV9LUDIsCisgICAgICAgIFsgIDcgXSA9IEtFWV9LUDMsCisgICAgICAgIFsgIDkgXSA9IEtFWV9LUDQsCisgICAgICAgIFsgMTAgXSA9IEtFWV9LUDUsCisgICAgICAgIFsgMTEgXSA9IEtFWV9LUDYsCisgICAgICAgIFsgMTMgXSA9IEtFWV9LUDcsCisgICAgICAgIFsgMTQgXSA9IEtFWV9LUDgsCisgICAgICAgIFsgMTUgXSA9IEtFWV9LUDksCisKKyAgICAgICAgWyA0MiBdID0gS0VZX1ZPTFVNRVVQLAorICAgICAgICBbIDE3IF0gPSBLRVlfVk9MVU1FRE9XTiwKKyAgICAgICAgWyAyNCBdID0gS0VZX0NIQU5ORUxVUCwgICAgICAvLyBDSC50cmFja2luZyB1cAorICAgICAgICBbIDI1IF0gPSBLRVlfQ0hBTk5FTERPV04sICAgIC8vIENILnRyYWNraW5nIGRvd24KKworICAgICAgICBbIDE5IF0gPSBLRVlfS1BFTlRFUiwgICAgICAgIC8vIGVudGVyCisgICAgICAgIFsgMzMgXSA9IEtFWV9LUERPVCwgICAgICAgICAgLy8gLiAoZGVjaW1hbCBkb3QpCit9OworCitzdGF0aWMgSVJfS0VZVEFCX1RZUEUgYXZhY3NzbWFydF9jb2Rlc1tJUl9LRVlUQUJfU0laRV0gPSB7CisgICAgICAgIFsgMzAgXSA9IEtFWV9QT1dFUiwJCS8vIHBvd2VyCisJWyAyOCBdID0gS0VZX1NFQVJDSCwJCS8vIHNjYW4KKyAgICAgICAgWyAgNyBdID0gS0VZX1NFTEVDVCwJCS8vIHNvdXJjZQorCisJWyAyMiBdID0gS0VZX1ZPTFVNRVVQLAorCVsgMjAgXSA9IEtFWV9WT0xVTUVET1dOLAorICAgICAgICBbIDMxIF0gPSBLRVlfQ0hBTk5FTFVQLAorCVsgMjMgXSA9IEtFWV9DSEFOTkVMRE9XTiwKKwlbIDI0IF0gPSBLRVlfTVVURSwKKworCVsgIDIgXSA9IEtFWV9LUDAsCisgICAgICAgIFsgIDEgXSA9IEtFWV9LUDEsCisgICAgICAgIFsgMTEgXSA9IEtFWV9LUDIsCisgICAgICAgIFsgMjcgXSA9IEtFWV9LUDMsCisgICAgICAgIFsgIDUgXSA9IEtFWV9LUDQsCisgICAgICAgIFsgIDkgXSA9IEtFWV9LUDUsCisgICAgICAgIFsgMjEgXSA9IEtFWV9LUDYsCisJWyAgNiBdID0gS0VZX0tQNywKKyAgICAgICAgWyAxMCBdID0gS0VZX0tQOCwKKwlbIDE4IF0gPSBLRVlfS1A5LAorCVsgMTYgXSA9IEtFWV9LUERPVCwKKworCVsgIDMgXSA9IEtFWV9UVU5FUiwJCS8vIHR2L2ZtCisgICAgICAgIFsgIDQgXSA9IEtFWV9SRVdJTkQsCQkvLyBmbSB0dW5pbmcgbGVmdCBvciBmdW5jdGlvbiBsZWZ0CisgICAgICAgIFsgMTIgXSA9IEtFWV9GT1JXQVJELAkJLy8gZm0gdHVuaW5nIHJpZ2h0IG9yIGZ1bmN0aW9uIHJpZ2h0CisKKwlbICAwIF0gPSBLRVlfUkVDT1JELAorICAgICAgICBbICA4IF0gPSBLRVlfU1RPUCwKKyAgICAgICAgWyAxNyBdID0gS0VZX1BMQVksCisKKwlbIDI1IF0gPSBLRVlfWk9PTSwKKwlbIDE0IF0gPSBLRVlfTUVOVSwJCS8vIGZ1bmN0aW9uCisJWyAxOSBdID0gS0VZX0FHQUlOLAkJLy8gcmVjYWxsCisJWyAyOSBdID0gS0VZX1JFU1RBUlQsCQkvLyByZXNldAorCisvLyBGSVhNRQorCVsgMTMgXSA9IEtFWV9GMjEsCQkvLyBtdHMKKyAgICAgICAgWyAxNSBdID0gS0VZX0YyMiwJCS8vIG1pbgorCVsgMjYgXSA9IEtFWV9GMjMsCQkvLyBmcmVlemUKK307CisKKy8qIEFsZXggSGVybWFubiA8Z2FhZkBnbXgubmV0PiAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIG1kMjgxOV9jb2Rlc1tJUl9LRVlUQUJfU0laRV0gPSB7CisJWyA0MCBdID0gS0VZX0tQMSwKKwlbIDI0IF0gPSBLRVlfS1AyLAorCVsgNTYgXSA9IEtFWV9LUDMsCisJWyAzNiBdID0gS0VZX0tQNCwKKwlbIDIwIF0gPSBLRVlfS1A1LAorCVsgNTIgXSA9IEtFWV9LUDYsCisJWyA0NCBdID0gS0VZX0tQNywKKwlbIDI4IF0gPSBLRVlfS1A4LAorCVsgNjAgXSA9IEtFWV9LUDksCisJWyAzNCBdID0gS0VZX0tQMCwKKworCVsgMzIgXSA9IEtFWV9UViwJCS8vIFRWL0ZNCisJWyAxNiBdID0gS0VZX0NELAkJLy8gQ0QKKwlbIDQ4IF0gPSBLRVlfVEVYVCwJCS8vIFRFTEVURVhUCisJWyAgMCBdID0gS0VZX1BPV0VSLAkJLy8gUE9XRVIKKworCVsgIDggXSA9IEtFWV9WSURFTywJCS8vIFZJREVPCisJWyAgNCBdID0gS0VZX0FVRElPLAkJLy8gQVVESU8KKwlbIDEyIF0gPSBLRVlfWk9PTSwJCS8vIEZVTEwgU0NSRUVOCisKKwlbIDE4IF0gPSBLRVlfU1VCVElUTEUsCQkvLyBESVNQTEFZCS0gPz8/CisJWyA1MCBdID0gS0VZX1JFV0lORCwJCS8vIExPT1AJCS0gPz8/CisJWyAgMiBdID0gS0VZX1BSSU5ULAkJLy8gUFJFVklFVwktID8/PworCisJWyA0MiBdID0gS0VZX1NFQVJDSCwJCS8vIEFVVE9TQ0FOCisJWyAyNiBdID0gS0VZX1NMRUVQLAkJLy8gRlJFRVpFCS0gPz8/CisJWyA1OCBdID0gS0VZX1NIVUZGTEUsCQkvLyBTTkFQU0hPVAktID8/PworCVsgMTAgXSA9IEtFWV9NVVRFLAkJLy8gTVVURQorCisJWyAzOCBdID0gS0VZX1JFQ09SRCwJCS8vIFJFQ09SRAorCVsgMjIgXSA9IEtFWV9QQVVTRSwJCS8vIFBBVVNFCisJWyA1NCBdID0gS0VZX1NUT1AsCQkvLyBTVE9QCisJWyAgNiBdID0gS0VZX1BMQVksCQkvLyBQTEFZCisKKwlbIDQ2IF0gPSBLRVlfUkVELAkJLy8gPFJFRD4KKwlbIDMzIF0gPSBLRVlfR1JFRU4sCQkvLyA8R1JFRU4+CisJWyAxNCBdID0gS0VZX1lFTExPVywJCS8vIDxZRUxMT1c+CisJWyAgMSBdID0gS0VZX0JMVUUsCQkvLyA8QkxVRT4KKworCVsgMzAgXSA9IEtFWV9WT0xVTUVET1dOLAkvLyBWT0xVTUUtCisJWyA2MiBdID0gS0VZX1ZPTFVNRVVQLAkJLy8gVk9MVU1FKworCVsgMTcgXSA9IEtFWV9DSEFOTkVMRE9XTiwJLy8gQ0hBTk5FTC9QQUdFLQorCVsgNDkgXSA9IEtFWV9DSEFOTkVMVVAJCS8vIENIQU5ORUwvUEFHRSsKK307CisKK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSB2aWRlb21hdGVfdHZfcHZyX2NvZGVzW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbIDIwIF0gPSBLRVlfTVVURSwKKwlbIDM2IF0gPSBLRVlfWk9PTSwKKworCVsgIDEgXSA9IEtFWV9EVkQsCisJWyAzNSBdID0gS0VZX1JBRElPLAorCVsgIDAgXSA9IEtFWV9UViwKKworCVsgMTAgXSA9IEtFWV9SRVdJTkQsCisJWyAgOCBdID0gS0VZX1BMQVlQQVVTRSwKKwlbIDE1IF0gPSBLRVlfRk9SV0FSRCwKKworCVsgIDIgXSA9IEtFWV9QUkVWSU9VUywKKwlbICA3IF0gPSBLRVlfU1RPUCwKKwlbICA2IF0gPSBLRVlfTkVYVCwKKworCVsgMTIgXSA9IEtFWV9VUCwKKwlbIDE0IF0gPSBLRVlfRE9XTiwKKwlbIDExIF0gPSBLRVlfTEVGVCwKKwlbIDEzIF0gPSBLRVlfUklHSFQsCisJWyAxNyBdID0gS0VZX09LLAorCisJWyAgMyBdID0gS0VZX01FTlUsCisJWyAgOSBdID0gS0VZX1NFVFVQLAorCVsgIDUgXSA9IEtFWV9WSURFTywKKwlbIDM0IF0gPSBLRVlfQ0hBTk5FTCwKKworCVsgMTggXSA9IEtFWV9WT0xVTUVVUCwKKwlbIDIxIF0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbIDE2IF0gPSBLRVlfQ0hBTk5FTFVQLAorCVsgMTkgXSA9IEtFWV9DSEFOTkVMRE9XTiwKKworCVsgIDQgXSA9IEtFWV9SRUNPUkQsCisKKwlbIDIyIF0gPSBLRVlfS1AxLAorCVsgMjMgXSA9IEtFWV9LUDIsCisJWyAyNCBdID0gS0VZX0tQMywKKwlbIDI1IF0gPSBLRVlfS1A0LAorCVsgMjYgXSA9IEtFWV9LUDUsCisJWyAyNyBdID0gS0VZX0tQNiwKKwlbIDI4IF0gPSBLRVlfS1A3LAorCVsgMjkgXSA9IEtFWV9LUDgsCisJWyAzMCBdID0gS0VZX0tQOSwKKwlbIDMxIF0gPSBLRVlfS1AwLAorCisJWyAzMiBdID0gS0VZX0xBTkdVQUdFLAorCVsgMzMgXSA9IEtFWV9TTEVFUCwKK307CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYnVpbGRfa2V5KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworCXN0cnVjdCBzYWE3MTM0X2lyICppciA9IGRldi0+cmVtb3RlOworCXUzMiBncGlvLCBkYXRhOworCisJLyogcmlzaW5nIFNBQTcxMzRfR1BJT19HUFJFU0NBTiByZWFkcyB0aGUgc3RhdHVzICovCisJc2FhX2NsZWFyYihTQUE3MTM0X0dQSU9fR1BNT0RFMyxTQUE3MTM0X0dQSU9fR1BSRVNDQU4pOworCXNhYV9zZXRiKFNBQTcxMzRfR1BJT19HUE1PREUzLFNBQTcxMzRfR1BJT19HUFJFU0NBTik7CisKKwlncGlvID0gc2FhX3JlYWRsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMik7CisgICAgICAgIGlmIChpci0+cG9sbGluZykgeworICAgICAgICAgICAgICAgIGlmIChpci0+bGFzdF9ncGlvID09IGdwaW8pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBpci0+bGFzdF9ncGlvID0gZ3BpbzsKKyAgICAgICAgfQorCisgCWRhdGEgPSBpcl9leHRyYWN0X2JpdHMoZ3BpbywgaXItPm1hc2tfa2V5Y29kZSk7CisJZHByaW50aygiYnVpbGRfa2V5IGdwaW89MHgleCBtYXNrPTB4JXggZGF0YT0lZFxuIiwKKwkJZ3BpbywgaXItPm1hc2tfa2V5Y29kZSwgZGF0YSk7CisKKwlpZiAoKGlyLT5tYXNrX2tleWRvd24gICYmICAoMCAhPSAoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pKSkgfHwKKwkgICAgKGlyLT5tYXNrX2tleXVwICAgICYmICAoMCA9PSAoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSkpKSB7CisJCWlyX2lucHV0X2tleWRvd24oJmlyLT5kZXYsJmlyLT5pcixkYXRhLGRhdGEpOworCX0gZWxzZSB7CisJCWlyX2lucHV0X25va2V5KCZpci0+ZGV2LCZpci0+aXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIHNhYTcxMzRfaW5wdXRfaXJxKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworICAgICAgICBzdHJ1Y3Qgc2FhNzEzNF9pciAqaXIgPSBkZXYtPnJlbW90ZTsKKworICAgICAgICBpZiAoIWlyLT5wb2xsaW5nKQorCQlidWlsZF9rZXkoZGV2KTsKK30KKworc3RhdGljIHZvaWQgc2FhNzEzNF9pbnB1dF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSAoc3RydWN0IHNhYTcxMzRfZGV2KilkYXRhOworCXN0cnVjdCBzYWE3MTM0X2lyICppciA9IGRldi0+cmVtb3RlOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWJ1aWxkX2tleShkZXYpOworCXRpbWVvdXQgPSBqaWZmaWVzICsgKGlyLT5wb2xsaW5nICogSFogLyAxMDAwKTsKKwltb2RfdGltZXIoJmlyLT50aW1lciwgdGltZW91dCk7Cit9CisKK2ludCBzYWE3MTM0X2lucHV0X2luaXQxKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworCXN0cnVjdCBzYWE3MTM0X2lyICppcjsKKwlJUl9LRVlUQUJfVFlQRSAqaXJfY29kZXMgPSBOVUxMOworCXUzMiBtYXNrX2tleWNvZGUgPSAwOworCXUzMiBtYXNrX2tleWRvd24gPSAwOworCXUzMiBtYXNrX2tleXVwICAgPSAwOworCWludCBwb2xsaW5nICAgICAgPSAwOworCWludCBpcl90eXBlICAgICAgPSBJUl9UWVBFX09USEVSOworCisJaWYgKCFkZXYtPmhhc19yZW1vdGUpCisJCXJldHVybiAtRU5PREVWOworCWlmIChkaXNhYmxlX2lyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGRldGVjdCAmIGNvbmZpZ3VyZSAqLworCXN3aXRjaCAoZGV2LT5ib2FyZCkgeworCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlWSURFTzIwMDA6CisJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMDoKKwkJaXJfY29kZXMgICAgID0gZmx5dmlkZW9fY29kZXM7CisJCW1hc2tfa2V5Y29kZSA9IDB4RUMwMDAwMDsKKwkJbWFza19rZXlkb3duID0gMHgwMDQwMDAwOworCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTQwMDoKKwljYXNlIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMDoKKwljYXNlIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMF9NSzM6CisJCWlyX2NvZGVzICAgICA9IGNpbmVyZ3lfY29kZXM7CisJCW1hc2tfa2V5Y29kZSA9IDB4MDAwMDNmOworCQltYXNrX2tleXVwICAgPSAweDA0MDAwMDsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFA6CisJY2FzZSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBfNENCNToKKyAgICAgICAgICAgICAgICBpcl9jb2RlcyAgICAgPSBlenR2X2NvZGVzOworICAgICAgICAgICAgICAgIG1hc2tfa2V5Y29kZSA9IDB4MDAwMTdjOworICAgICAgICAgICAgICAgIG1hc2tfa2V5dXAgICA9IDB4MDAwMDAyOworCQlwb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKKyAgICAgICAgICAgICAgICBicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZBQ1NTTUFSVFRWOgorCSAgICAgICAgaXJfY29kZXMgICAgID0gYXZhY3NzbWFydF9jb2RlczsKKwkJbWFza19rZXljb2RlID0gMHgwMDAwMUY7CisJCW1hc2tfa2V5dXAgICA9IDB4MDAwMDIwOworCQlwb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX01EMjgxOToKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNToKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNzoKKwkJaXJfY29kZXMgICAgID0gbWQyODE5X2NvZGVzOworCQltYXNrX2tleWNvZGUgPSAweDAwMDdDODsKKwkJbWFza19rZXlkb3duID0gMHgwMDAwMTA7CisJCXBvbGxpbmcgICAgICA9IDUwOyAvLyBtcworCQkvKiBTZXQgR1BJTyBwaW4yIHRvIGhpZ2ggdG8gZW5hYmxlIHRoZSBJUiBjb250cm9sbGVyICovCisJCXNhYV9zZXRiKFNBQTcxMzRfR1BJT19HUE1PREUwLCAweDQpOworCQlzYWFfc2V0YihTQUE3MTM0X0dQSU9fR1BTVEFUVVMwLCAweDQpOworCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX1BWUjoKKwkJaXJfY29kZXMgICAgID0gdmlkZW9tYXRlX3R2X3B2cl9jb2RlczsKKwkJbWFza19rZXljb2RlID0gMHgwMDAwM0Y7CisJCW1hc2tfa2V5dXAgICA9IDB4NDAwMDAwOworCQlwb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKKwkJYnJlYWs7CisJfQorCWlmIChOVUxMID09IGlyX2NvZGVzKSB7CisJCXByaW50aygiJXM6IE9vcHM6IElSIGNvbmZpZyBlcnJvciBbY2FyZD0lZF1cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+Ym9hcmQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpciA9IGttYWxsb2Moc2l6ZW9mKCppciksR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gaXIpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChpciwwLHNpemVvZigqaXIpKTsKKworCS8qIGluaXQgaGFyZHdhcmUtc3BlY2lmaWMgc3R1ZmYgKi8KKwlpci0+bWFza19rZXljb2RlID0gbWFza19rZXljb2RlOworCWlyLT5tYXNrX2tleWRvd24gPSBtYXNrX2tleWRvd247CisJaXItPm1hc2tfa2V5dXAgICA9IG1hc2tfa2V5dXA7CisgICAgICAgIGlyLT5wb2xsaW5nICAgICAgPSBwb2xsaW5nOworCisJLyogaW5pdCBpbnB1dCBkZXZpY2UgKi8KKwlzbnByaW50Zihpci0+bmFtZSwgc2l6ZW9mKGlyLT5uYW1lKSwgInNhYTcxMzQgSVIgKCVzKSIsCisJCSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lKTsKKwlzbnByaW50Zihpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSwgInBjaS0lcy9pcjAiLAorCQkgcGNpX25hbWUoZGV2LT5wY2kpKTsKKworCWlyX2lucHV0X2luaXQoJmlyLT5kZXYsICZpci0+aXIsIGlyX3R5cGUsIGlyX2NvZGVzKTsKKwlpci0+ZGV2Lm5hbWUgPSBpci0+bmFtZTsKKwlpci0+ZGV2LnBoeXMgPSBpci0+cGh5czsKKwlpci0+ZGV2LmlkLmJ1c3R5cGUgPSBCVVNfUENJOworCWlyLT5kZXYuaWQudmVyc2lvbiA9IDE7CisJaWYgKGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yKSB7CisJCWlyLT5kZXYuaWQudmVuZG9yICA9IGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yOworCQlpci0+ZGV2LmlkLnByb2R1Y3QgPSBkZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZTsKKwl9IGVsc2UgeworCQlpci0+ZGV2LmlkLnZlbmRvciAgPSBkZXYtPnBjaS0+dmVuZG9yOworCQlpci0+ZGV2LmlkLnByb2R1Y3QgPSBkZXYtPnBjaS0+ZGV2aWNlOworCX0KKworCS8qIGFsbCBkb25lICovCisJZGV2LT5yZW1vdGUgPSBpcjsKKwlpZiAoaXItPnBvbGxpbmcpIHsKKwkJaW5pdF90aW1lcigmaXItPnRpbWVyKTsKKwkJaXItPnRpbWVyLmZ1bmN0aW9uID0gc2FhNzEzNF9pbnB1dF90aW1lcjsKKwkJaXItPnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCQlpci0+dGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgSFo7CisJCWFkZF90aW1lcigmaXItPnRpbWVyKTsKKwl9CisKKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJmRldi0+cmVtb3RlLT5kZXYpOworCXByaW50aygiJXM6IHJlZ2lzdGVyZWQgaW5wdXQgZGV2aWNlIGZvciBJUlxuIixkZXYtPm5hbWUpOworCXJldHVybiAwOworfQorCit2b2lkIHNhYTcxMzRfaW5wdXRfZmluaShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlpZiAoTlVMTCA9PSBkZXYtPnJlbW90ZSkKKwkJcmV0dXJuOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJmRldi0+cmVtb3RlLT5kZXYpOworCWlmIChkZXYtPnJlbW90ZS0+cG9sbGluZykKKwkJZGVsX3RpbWVyX3N5bmMoJmRldi0+cmVtb3RlLT50aW1lcik7CisJa2ZyZWUoZGV2LT5yZW1vdGUpOworCWRldi0+cmVtb3RlID0gTlVMTDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjZhNjQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMKQEAgLTAsMCArMSw4NTcgQEAKKy8qCisgKiAkSWQ6IHNhYTcxMzQtb3NzLmMsdiAxLjEzIDIwMDQvMTIvMTAgMTI6MzM6Mzkga3JheGVsIEV4cCAkCisgKgorICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCisgKiBvc3MgZHNwIGludGVyZmFjZQorICoKKyAqIChjKSAyMDAxLDAyIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorCisjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKKyNpbmNsdWRlICJzYWE3MTM0LmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IG9zc19kZWJ1ZyAgPSAwOworbW9kdWxlX3BhcmFtKG9zc19kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mob3NzX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW29zc10iKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBvc3NfcmF0ZSAgPSAwOworbW9kdWxlX3BhcmFtKG9zc19yYXRlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhvc3NfcmF0ZSwic2FtcGxlIHJhdGUgKHZhbGlkIGFyZTogMzIwMDAsNDgwMDApIik7CisKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZy4uLikJaWYgKG9zc19kZWJ1ZykgXAorCXByaW50ayhLRVJOX0RFQlVHICIlcy9vc3M6ICIgZm10LCBkZXYtPm5hbWUgLCAjIyBhcmcpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGRzcF9idWZmZXJfY29uZihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IGJsa3NpemUsIGludCBibG9ja3MpCit7CisJYmxrc2l6ZSAmPSB+MHhmZjsKKwlpZiAoYmxrc2l6ZSA8IDB4MTAwKQorCQlibGtzaXplID0gMHgxMDA7CisJaWYgKGJsa3NpemUgPiAweDEwMDAwKQorCQlibGtzaXplID0gMHgxMDAwMDsKKworCWlmIChibG9ja3MgPCAyKQorCQlibG9ja3MgPSAyOworICAgICAgICB3aGlsZSAoKGJsa3NpemUgKiBibG9ja3MpICYgflBBR0VfTUFTSykKKwkJYmxvY2tzKys7CisJaWYgKChibGtzaXplICogYmxvY2tzKSA+IDEwMjQqMTAyNCkKKwkJYmxvY2tzID0gMTAyNCoxMDI0IC8gYmxrc2l6ZTsKKworCWRldi0+b3NzLmJsb2NrcyAgPSBibG9ja3M7CisJZGV2LT5vc3MuYmxrc2l6ZSA9IGJsa3NpemU7CisJZGV2LT5vc3MuYnVmc2l6ZSA9IGJsa3NpemUgKiBibG9ja3M7CisKKwlkcHJpbnRrKCJidWZmZXIgY29uZmlnOiAlZCBibG9ja3MgLyAlZCBieXRlcywgJWQga0IgdG90YWxcbiIsCisgCQlibG9ja3MsYmxrc2l6ZSxibGtzaXplICogYmxvY2tzIC8gMTAyNCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNwX2J1ZmZlcl9pbml0KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworCWludCBlcnI7CisKKwlpZiAoIWRldi0+b3NzLmJ1ZnNpemUpCisJCUJVRygpOworCXZpZGVvYnVmX2RtYV9pbml0KCZkZXYtPm9zcy5kbWEpOworCWVyciA9IHZpZGVvYnVmX2RtYV9pbml0X2tlcm5lbCgmZGV2LT5vc3MuZG1hLCBQQ0lfRE1BX0ZST01ERVZJQ0UsCisJCQkJICAgICAgIGRldi0+b3NzLmJ1ZnNpemUgPj4gUEFHRV9TSElGVCk7CisJaWYgKDAgIT0gZXJyKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzcF9idWZmZXJfZnJlZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlpZiAoIWRldi0+b3NzLmJsa3NpemUpCisJCUJVRygpOworCXZpZGVvYnVmX2RtYV9mcmVlKCZkZXYtPm9zcy5kbWEpOworCWRldi0+b3NzLmJsb2NrcyAgPSAwOworCWRldi0+b3NzLmJsa3NpemUgPSAwOworCWRldi0+b3NzLmJ1ZnNpemUgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc3BfZG1hX3N0YXJ0KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworCWRldi0+b3NzLmRtYV9ibGsgICAgID0gMDsKKwlkZXYtPm9zcy5kbWFfcnVubmluZyA9IDE7CisJc2FhNzEzNF9zZXRfZG1hYml0cyhkZXYpOworfQorCitzdGF0aWMgdm9pZCBkc3BfZG1hX3N0b3Aoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJZGV2LT5vc3MuZG1hX2JsayAgICAgPSAtMTsKKwlkZXYtPm9zcy5kbWFfcnVubmluZyA9IDA7CisJc2FhNzEzNF9zZXRfZG1hYml0cyhkZXYpOworfQorCitzdGF0aWMgaW50IGRzcF9yZWNfc3RhcnQoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJaW50IGVyciwgYnN3YXAsIHNpZ247CisJdTMyIGZtdCwgY29udHJvbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogcHJlcGFyZSBidWZmZXIgKi8KKwlpZiAoMCAhPSAoZXJyID0gdmlkZW9idWZfZG1hX3BjaV9tYXAoZGV2LT5wY2ksJmRldi0+b3NzLmRtYSkpKQorCQlyZXR1cm4gZXJyOworCWlmICgwICE9IChlcnIgPSBzYWE3MTM0X3BndGFibGVfYWxsb2MoZGV2LT5wY2ksJmRldi0+b3NzLnB0KSkpCisJCWdvdG8gZmFpbDE7CisJaWYgKDAgIT0gKGVyciA9IHNhYTcxMzRfcGd0YWJsZV9idWlsZChkZXYtPnBjaSwmZGV2LT5vc3MucHQsCisJCQkJCSAgICAgIGRldi0+b3NzLmRtYS5zZ2xpc3QsCisJCQkJCSAgICAgIGRldi0+b3NzLmRtYS5zZ2xlbiwKKwkJCQkJICAgICAgMCkpKQorCQlnb3RvIGZhaWwyOworCisJLyogc2FtcGxlIGZvcm1hdCAqLworCXN3aXRjaCAoZGV2LT5vc3MuYWZtdCkgeworCWNhc2UgQUZNVF9VODoKKwljYXNlIEFGTVRfUzg6ICAgICBmbXQgPSAweDAwOyAgYnJlYWs7CisJY2FzZSBBRk1UX1UxNl9MRToKKwljYXNlIEFGTVRfVTE2X0JFOgorCWNhc2UgQUZNVF9TMTZfTEU6CisJY2FzZSBBRk1UX1MxNl9CRTogZm10ID0gMHgwMTsgIGJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDI7CisJfQorCisJc3dpdGNoIChkZXYtPm9zcy5hZm10KSB7CisJY2FzZSBBRk1UX1M4OgorCWNhc2UgQUZNVF9TMTZfTEU6CisJY2FzZSBBRk1UX1MxNl9CRTogc2lnbiA9IDE7IGJyZWFrOworCWRlZmF1bHQ6ICAgICAgICAgIHNpZ24gPSAwOyBicmVhazsKKwl9CisKKwlzd2l0Y2ggKGRldi0+b3NzLmFmbXQpIHsKKwljYXNlIEFGTVRfVTE2X0JFOgorCWNhc2UgQUZNVF9TMTZfQkU6IGJzd2FwID0gMTsgYnJlYWs7CisJZGVmYXVsdDogICAgICAgICAgYnN3YXAgPSAwOyBicmVhazsKKwl9CisKKwlzd2l0Y2ggKGRldi0+cGNpLT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0OgorCQlpZiAoMSA9PSBkZXYtPm9zcy5jaGFubmVscykKKwkJCWZtdCB8PSAoMSA8PCAzKTsKKwkJaWYgKDIgPT0gZGV2LT5vc3MuY2hhbm5lbHMpCisJCQlmbXQgfD0gKDMgPDwgMyk7CisJCWlmIChzaWduKQorCQkJZm10IHw9IDB4MDQ7CisJCWZtdCB8PSAoVFYgPT0gZGV2LT5vc3MuaW5wdXQpID8gMHhjMCA6IDB4ODA7CisKKwkJc2FhX3dyaXRlYihTQUE3MTM0X05VTV9TQU1QTEVTMCwgKGRldi0+b3NzLmJsa3NpemUgJiAweDAwMDBmZikpOworCQlzYWFfd3JpdGViKFNBQTcxMzRfTlVNX1NBTVBMRVMxLCAoZGV2LT5vc3MuYmxrc2l6ZSAmIDB4MDBmZjAwKSA+PiAgOCk7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9OVU1fU0FNUExFUzIsIChkZXYtPm9zcy5ibGtzaXplICYgMHhmZjAwMDApID4+IDE2KTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX0ZPUk1BVF9DVFJMLCBmbXQpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzOgorCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzU6CisJCWlmICgxID09IGRldi0+b3NzLmNoYW5uZWxzKQorCQkJZm10IHw9ICgxIDw8IDQpOworCQlpZiAoMiA9PSBkZXYtPm9zcy5jaGFubmVscykKKwkJCWZtdCB8PSAoMiA8PCA0KTsKKwkJaWYgKCFzaWduKQorCQkJZm10IHw9IDB4MDQ7CisJCXNhYV93cml0ZWwoMHg1ODggPj4gMiwgZGV2LT5vc3MuYmxrc2l6ZSAtNCk7CisJCXNhYV93cml0ZWwoMHg1OGMgPj4gMiwgMHg1NDMyMTAgfCAoZm10IDw8IDI0KSk7CisJCWJyZWFrOworCX0KKwlkcHJpbnRrKCJyZWNfc3RhcnQ6IGFmbXQ9JWQgY2g9JWQgID0+ICBmbXQ9MHgleCBzd2FwPSVjXG4iLAorCQlkZXYtPm9zcy5hZm10LCBkZXYtPm9zcy5jaGFubmVscywgZm10LAorCQlic3dhcCA/ICdiJyA6ICctJyk7CisKKwkvKiBkbWE6IHNldHVwIGNoYW5uZWwgNiAoPSBBVURJTykgKi8KKwljb250cm9sID0gU0FBNzEzNF9SU19DT05UUk9MX0JVUlNUXzE2IHwKKwkJU0FBNzEzNF9SU19DT05UUk9MX01FIHwKKwkJKGRldi0+b3NzLnB0LmRtYSA+PiAxMik7CisJaWYgKGJzd2FwKQorCQljb250cm9sIHw9IFNBQTcxMzRfUlNfQ09OVFJPTF9CU1dBUDsKKwlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkExKDYpLDApOworCXNhYV93cml0ZWwoU0FBNzEzNF9SU19CQTIoNiksZGV2LT5vc3MuYmxrc2l6ZSk7CisJc2FhX3dyaXRlbChTQUE3MTM0X1JTX1BJVENIKDYpLDApOworCXNhYV93cml0ZWwoU0FBNzEzNF9SU19DT05UUk9MKDYpLGNvbnRyb2wpOworCisJLyogc3RhcnQgZG1hICovCisJZGV2LT5vc3MucmVjb3JkaW5nX29uID0gMTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jayxmbGFncyk7CisJZHNwX2RtYV9zdGFydChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssZmxhZ3MpOworCXJldHVybiAwOworCisgZmFpbDI6CisJc2FhNzEzNF9wZ3RhYmxlX2ZyZWUoZGV2LT5wY2ksJmRldi0+b3NzLnB0KTsKKyBmYWlsMToKKwl2aWRlb2J1Zl9kbWFfcGNpX3VubWFwKGRldi0+cGNpLCZkZXYtPm9zcy5kbWEpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZHNwX3JlY19zdG9wKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKCJyZWNfc3RvcCBkbWFfYmxrPSVkXG4iLGRldi0+b3NzLmRtYV9ibGspOworCisJLyogc3RvcCBkbWEgKi8KKwlkZXYtPm9zcy5yZWNvcmRpbmdfb24gPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNsb2NrLGZsYWdzKTsKKwlkc3BfZG1hX3N0b3AoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLGZsYWdzKTsKKworCS8qIHVubG9jayBidWZmZXIgKi8KKwlzYWE3MTM0X3BndGFibGVfZnJlZShkZXYtPnBjaSwmZGV2LT5vc3MucHQpOworCXZpZGVvYnVmX2RtYV9wY2lfdW5tYXAoZGV2LT5wY2ksJmRldi0+b3NzLmRtYSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGRzcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpoLCpkZXYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJaW50IGVycjsKKworCWxpc3RfZm9yX2VhY2gobGlzdCwmc2FhNzEzNF9kZXZsaXN0KSB7CisJCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzYWE3MTM0X2RldiwgZGV2bGlzdCk7CisJCWlmIChoLT5vc3MubWlub3JfZHNwID09IG1pbm9yKQorCQkJZGV2ID0gaDsKKwl9CisJaWYgKE5VTEwgPT0gZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRvd24oJmRldi0+b3NzLmxvY2spOworCWVyciA9IC1FQlVTWTsKKwlpZiAoZGV2LT5vc3MudXNlcnNfZHNwKQorCQlnb3RvIGZhaWwxOworCWRldi0+b3NzLnVzZXJzX2RzcCsrOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKworCWRldi0+b3NzLmFmbXQgICAgICAgID0gQUZNVF9VODsKKwlkZXYtPm9zcy5jaGFubmVscyAgICA9IDE7CisJZGV2LT5vc3MucmVhZF9jb3VudCAgPSAwOworCWRldi0+b3NzLnJlYWRfb2Zmc2V0ID0gMDsKKwlkc3BfYnVmZmVyX2NvbmYoZGV2LFBBR0VfU0laRSw2NCk7CisJZXJyID0gZHNwX2J1ZmZlcl9pbml0KGRldik7CisJaWYgKDAgIT0gZXJyKQorCQlnb3RvIGZhaWwyOworCisJdXAoJmRldi0+b3NzLmxvY2spOworCXJldHVybiAwOworCisgZmFpbDI6CisJZGV2LT5vc3MudXNlcnNfZHNwLS07CisgZmFpbDE6CisJdXAoJmRldi0+b3NzLmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZHNwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlkb3duKCZkZXYtPm9zcy5sb2NrKTsKKwlpZiAoZGV2LT5vc3MucmVjb3JkaW5nX29uKQorCQlkc3BfcmVjX3N0b3AoZGV2KTsKKwlkc3BfYnVmZmVyX2ZyZWUoZGV2KTsKKwlkZXYtPm9zcy51c2Vyc19kc3AtLTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXVwKCZkZXYtPm9zcy5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZHNwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBpbnQgYnl0ZXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyLHJldCA9IDA7CisKKwlhZGRfd2FpdF9xdWV1ZSgmZGV2LT5vc3Mud3EsICZ3YWl0KTsKKwlkb3duKCZkZXYtPm9zcy5sb2NrKTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8qIHdhaXQgZm9yIGRhdGEgaWYgbmVlZGVkICovCisJCWlmICgwID09IGRldi0+b3NzLnJlYWRfY291bnQpIHsKKwkJCWlmICghZGV2LT5vc3MucmVjb3JkaW5nX29uKSB7CisJCQkJZXJyID0gZHNwX3JlY19zdGFydChkZXYpOworCQkJCWlmIChlcnIgPCAwKSB7CisJCQkJCWlmICgwID09IHJldCkKKwkJCQkJCXJldCA9IGVycjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGRldi0+b3NzLnJlY29yZGluZ19vbiAmJgorCQkJICAgICFkZXYtPm9zcy5kbWFfcnVubmluZykgeworCQkJCS8qIHJlY292ZXIgZnJvbSBvdmVycnVucyAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNsb2NrLGZsYWdzKTsKKwkJCQlkc3BfZG1hX3N0YXJ0KGRldik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jayxmbGFncyk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoMCA9PSByZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQl1cCgmZGV2LT5vc3MubG9jayk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJaWYgKDAgPT0gZGV2LT5vc3MucmVhZF9jb3VudCkKKwkJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCWRvd24oJmRldi0+b3NzLmxvY2spOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKDAgPT0gcmV0KQorCQkJCQlyZXQgPSAtRUlOVFI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBjb3B5IGRhdGEgdG8gdXNlcnNwYWNlICovCisJCWJ5dGVzID0gY291bnQ7CisJCWlmIChieXRlcyA+IGRldi0+b3NzLnJlYWRfY291bnQpCisJCQlieXRlcyA9IGRldi0+b3NzLnJlYWRfY291bnQ7CisJCWlmIChieXRlcyA+IGRldi0+b3NzLmJ1ZnNpemUgLSBkZXYtPm9zcy5yZWFkX29mZnNldCkKKwkJCWJ5dGVzID0gZGV2LT5vc3MuYnVmc2l6ZSAtIGRldi0+b3NzLnJlYWRfb2Zmc2V0OworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldCwKKwkJCQkgZGV2LT5vc3MuZG1hLnZtYWxsb2MgKyBkZXYtPm9zcy5yZWFkX29mZnNldCwKKwkJCQkgYnl0ZXMpKSB7CisJCQlpZiAoMCA9PSByZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ICAgKz0gYnl0ZXM7CisJCWNvdW50IC09IGJ5dGVzOworCQlkZXYtPm9zcy5yZWFkX2NvdW50ICAtPSBieXRlczsKKwkJZGV2LT5vc3MucmVhZF9vZmZzZXQgKz0gYnl0ZXM7CisJCWlmIChkZXYtPm9zcy5yZWFkX29mZnNldCA9PSBkZXYtPm9zcy5idWZzaXplKQorCQkJZGV2LT5vc3MucmVhZF9vZmZzZXQgPSAwOworCX0KKwl1cCgmZGV2LT5vc3MubG9jayk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+b3NzLndxLCAmd2FpdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZHNwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGRzcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJaW50IHZhbCA9IDA7CisKKwlpZiAob3NzX2RlYnVnID4gMSkKKwkJc2FhNzEzNF9wcmludF9pb2N0bChkZXYtPm5hbWUsY21kKTsKKyAgICAgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBPU1NfR0VUVkVSU0lPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcihkZXYtPm9zcy5yYXRlLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlkb3duKCZkZXYtPm9zcy5sb2NrKTsKKwkJZGV2LT5vc3MuY2hhbm5lbHMgPSB2YWwgPyAyIDogMTsKKwkJaWYgKGRldi0+b3NzLnJlY29yZGluZ19vbikgeworCQkJZHNwX3JlY19zdG9wKGRldik7CisJCQlkc3BfcmVjX3N0YXJ0KGRldik7CisJCX0KKwkJdXAoJmRldi0+b3NzLmxvY2spOworCQlyZXR1cm4gcHV0X3VzZXIoZGV2LT5vc3MuY2hhbm5lbHMtMSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG93bigmZGV2LT5vc3MubG9jayk7CisJCWRldi0+b3NzLmNoYW5uZWxzID0gdmFsOworCQlpZiAoZGV2LT5vc3MucmVjb3JkaW5nX29uKSB7CisJCQlkc3BfcmVjX3N0b3AoZGV2KTsKKwkJCWRzcF9yZWNfc3RhcnQoZGV2KTsKKwkJfQorCQl1cCgmZGV2LT5vc3MubG9jayk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlyZXR1cm4gcHV0X3VzZXIoZGV2LT5vc3MuY2hhbm5lbHMsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9VOCAgICAgfCBBRk1UX1M4ICAgICB8CisJCQkJQUZNVF9VMTZfTEUgfCBBRk1UX1UxNl9CRSB8CisJCQkJQUZNVF9TMTZfTEUgfCBBRk1UX1MxNl9CRSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10ICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgQUZNVF9RVUVSWToKKwkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwkJCWJyZWFrOworCQljYXNlIEFGTVRfVTg6CisJCWNhc2UgQUZNVF9TODoKKwkJY2FzZSBBRk1UX1UxNl9MRToKKwkJY2FzZSBBRk1UX1UxNl9CRToKKwkJY2FzZSBBRk1UX1MxNl9MRToKKwkJY2FzZSBBRk1UX1MxNl9CRToKKwkJCWRvd24oJmRldi0+b3NzLmxvY2spOworCQkJZGV2LT5vc3MuYWZtdCA9IHZhbDsKKwkJCWlmIChkZXYtPm9zcy5yZWNvcmRpbmdfb24pIHsKKwkJCQlkc3BfcmVjX3N0b3AoZGV2KTsKKwkJCQlkc3BfcmVjX3N0YXJ0KGRldik7CisJCQl9CisJCQl1cCgmZGV2LT5vc3MubG9jayk7CisJCQlyZXR1cm4gcHV0X3VzZXIoZGV2LT5vc3MuYWZtdCwgcCk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJc3dpdGNoIChkZXYtPm9zcy5hZm10KSB7CisJCWNhc2UgQUZNVF9VODoKKwkJY2FzZSBBRk1UX1M4OgorCQkJcmV0dXJuIHB1dF91c2VyKDgsIHApOworCQljYXNlIEFGTVRfVTE2X0xFOgorCQljYXNlIEFGTVRfVTE2X0JFOgorCQljYXNlIEFGTVRfUzE2X0xFOgorCQljYXNlIEFGTVRfUzE2X0JFOgorCQkJcmV0dXJuIHB1dF91c2VyKDE2LCBwKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorICAgICAgICAgICAgICAgIGZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCWRvd24oJmRldi0+b3NzLmxvY2spOworCQlpZiAoZGV2LT5vc3MucmVjb3JkaW5nX29uKQorCQkJZHNwX3JlY19zdG9wKGRldik7CisJCXVwKCZkZXYtPm9zcy5sb2NrKTsKKwkJcmV0dXJuIDA7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlyZXR1cm4gcHV0X3VzZXIoZGV2LT5vc3MuYmxrc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZGV2LT5vc3MucmVjb3JkaW5nX29uKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJZHNwX2J1ZmZlcl9mcmVlKGRldik7CisJCS8qIHVzZWQgdG8gYmUgYXJnID4+IDE2IGluc3RlYWQgb2YgdmFsID4+IDE2OyBmaXhlZCAqLworCQlkc3BfYnVmZmVyX2NvbmYoZGV2LDEgPDwgKHZhbCAmIDB4ZmZmZiksICh2YWwgPj4gMTYpICYgMHhmZmZmKTsKKwkJZHNwX2J1ZmZlcl9pbml0KGRldik7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQkvKiBOT1AgKi8KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCXsKKwkJYXVkaW9fYnVmX2luZm8gaW5mbzsKKwkJaW5mby5mcmFnc2l6ZSAgID0gZGV2LT5vc3MuYmxrc2l6ZTsKKwkJaW5mby5mcmFnc3RvdGFsID0gZGV2LT5vc3MuYmxvY2tzOworCQlpbmZvLmJ5dGVzICAgICAgPSBkZXYtPm9zcy5yZWFkX2NvdW50OworCQlpbmZvLmZyYWdtZW50cyAgPSBpbmZvLmJ5dGVzIC8gaW5mby5mcmFnc2l6ZTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRzcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJcG9sbF93YWl0KGZpbGUsICZkZXYtPm9zcy53cSwgd2FpdCk7CisKKwlpZiAoMCA9PSBkZXYtPm9zcy5yZWFkX2NvdW50KSB7CisJCWRvd24oJmRldi0+b3NzLmxvY2spOworCQlpZiAoIWRldi0+b3NzLnJlY29yZGluZ19vbikKKwkJCWRzcF9yZWNfc3RhcnQoZGV2KTsKKwkJdXAoJmRldi0+b3NzLmxvY2spOworCX0gZWxzZQorCQltYXNrIHw9IChQT0xMSU4gfCBQT0xMUkROT1JNKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzYWE3MTM0X2RzcF9mb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBkc3Bfb3BlbiwKKwkucmVsZWFzZSA9IGRzcF9yZWxlYXNlLAorCS5yZWFkICAgID0gZHNwX3JlYWQsCisJLndyaXRlICAgPSBkc3Bfd3JpdGUsCisJLmlvY3RsICAgPSBkc3BfaW9jdGwsCisJLnBvbGwgICAgPSBkc3BfcG9sbCwKKwkubGxzZWVrICA9IG5vX2xsc2VlaywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50CittaXhlcl9yZWNzcmNfNzEzNChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlpbnQgYW5hbG9nX2lvLHJhdGU7CisKKwlzd2l0Y2ggKGRldi0+b3NzLmlucHV0KSB7CisJY2FzZSBUVjoKKwkJc2FhX2FuZG9yYihTQUE3MTM0X0FVRElPX0ZPUk1BVF9DVFJMLCAweGMwLCAweGMwKTsKKwkJc2FhX2FuZG9yYihTQUE3MTM0X1NJRl9TQU1QTEVfRlJFUSwgICAweDAzLCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBMSU5FMToKKwljYXNlIExJTkUyOgorCWNhc2UgTElORTJfTEVGVDoKKwkJYW5hbG9nX2lvID0gKExJTkUxID09IGRldi0+b3NzLmlucHV0KSA/IDB4MDAgOiAweDA4OworCQlyYXRlID0gKDMyMDAwID09IGRldi0+b3NzLnJhdGUpID8gMHgwMSA6IDB4MDM7CisJCXNhYV9hbmRvcmIoU0FBNzEzNF9BTkFMT0dfSU9fU0VMRUNULCAgMHgwOCwgYW5hbG9nX2lvKTsKKwkJc2FhX2FuZG9yYihTQUE3MTM0X0FVRElPX0ZPUk1BVF9DVFJMLCAweGMwLCAweDgwKTsKKwkJc2FhX2FuZG9yYihTQUE3MTM0X1NJRl9TQU1QTEVfRlJFUSwgICAweDAzLCByYXRlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittaXhlcl9yZWNzcmNfNzEzMyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwl1MzIgdmFsdWUgPSAweGJiYmJiYjsKKworCXN3aXRjaCAoZGV2LT5vc3MuaW5wdXQpIHsKKwljYXNlIFRWOgorCQl2YWx1ZSA9IDB4YmJiYjEwOyAgLyogTUFJTiAqLworCQlicmVhazsKKwljYXNlIExJTkUxOgorCQl2YWx1ZSA9IDB4YmJiYjMyOyAgLyogQVVYMSAqLworCQlicmVhazsKKwljYXNlIExJTkUyOgorCWNhc2UgTElORTJfTEVGVDoKKwkJdmFsdWUgPSAweGJiYmI1NDsgIC8qIEFVWDIgKi8KKwkJYnJlYWs7CisJfQorCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NmMgPj4gMiwgdmFsdWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittaXhlcl9yZWNzcmMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGVudW0gc2FhNzEzNF9hdWRpb19pbiBzcmMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmluYW1lW10gPSB7ICJPb3BzIiwgIlRWIiwgIkxJTkUxIiwgIkxJTkUyIiB9OworCisJZGV2LT5vc3MuY291bnQrKzsKKwlkZXYtPm9zcy5pbnB1dCA9IHNyYzsKKwlkcHJpbnRrKCJtaXhlciBpbnB1dCA9ICVzXG4iLGluYW1lW2Rldi0+b3NzLmlucHV0XSk7CisKKwlzd2l0Y2ggKGRldi0+cGNpLT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0OgorCQltaXhlcl9yZWNzcmNfNzEzNChkZXYpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzOgorCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzU6CisJCW1peGVyX3JlY3NyY183MTMzKGRldik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbWl4ZXJfbGV2ZWwoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGVudW0gc2FhNzEzNF9hdWRpb19pbiBzcmMsIGludCBsZXZlbCkKK3sKKwlzd2l0Y2ggKGRldi0+cGNpLT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0OgorCQlzd2l0Y2ggKHNyYykgeworCQljYXNlIFRWOgorCQkJLyogbm90aGluZyAqLworCQkJYnJlYWs7CisJCWNhc2UgTElORTE6CisJCQlzYWFfYW5kb3JiKFNBQTcxMzRfQU5BTE9HX0lPX1NFTEVDVCwgIDB4MTAsCisJCQkJICAgKDEwMCA9PSBsZXZlbCkgPyAweDAwIDogMHgxMCk7CisJCQlicmVhazsKKwkJY2FzZSBMSU5FMjoKKwkJY2FzZSBMSU5FMl9MRUZUOgorCQkJc2FhX2FuZG9yYihTQUE3MTM0X0FOQUxPR19JT19TRUxFQ1QsICAweDIwLAorCQkJCSAgICgxMDAgPT0gbGV2ZWwpID8gMHgwMCA6IDB4MjApOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM1OgorCQkvKiBub3RoaW5nICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBzYWE3MTM0X2RldiAqaCwqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJbGlzdF9mb3JfZWFjaChsaXN0LCZzYWE3MTM0X2Rldmxpc3QpIHsKKwkJaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHNhYTcxMzRfZGV2LCBkZXZsaXN0KTsKKwkJaWYgKGgtPm9zcy5taW5vcl9taXhlciA9PSBtaW5vcikKKwkJCWRldiA9IGg7CisJfQorCWlmIChOVUxMID09IGRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWl4ZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1peGVyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWVudW0gc2FhNzEzNF9hdWRpb19pbiBpbnB1dDsKKwlpbnQgdmFsLHJldDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlpZiAob3NzX2RlYnVnID4gMSkKKwkJc2FhNzEzNF9wcmludF9pb2N0bChkZXYtPm5hbWUsY21kKTsKKyAgICAgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBPU1NfR0VUVkVSU0lPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisJY2FzZSBTT1VORF9NSVhFUl9JTkZPOgorCXsKKwkJbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sMCxzaXplb2YoaW5mbykpOworICAgICAgICAgICAgICAgIHN0cmxjcHkoaW5mby5pZCwgICAiVFYgYXVkaW8iLCBzaXplb2YoaW5mby5pZCkpOworICAgICAgICAgICAgICAgIHN0cmxjcHkoaW5mby5uYW1lLCBkZXYtPm5hbWUsICBzaXplb2YoaW5mby5uYW1lKSk7CisgICAgICAgICAgICAgICAgaW5mby5tb2RpZnlfY291bnRlciA9IGRldi0+b3NzLmNvdW50OworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihpbmZvKSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgU09VTkRfT0xEX01JWEVSX0lORk86CisJeworCQlfb2xkX21peGVyX2luZm8gaW5mbzsKKwkJbWVtc2V0KCZpbmZvLDAsc2l6ZW9mKGluZm8pKTsKKyAgICAgICAgICAgICAgICBzdHJsY3B5KGluZm8uaWQsICAgIlRWIGF1ZGlvIiwgc2l6ZW9mKGluZm8uaWQpKTsKKyAgICAgICAgICAgICAgICBzdHJsY3B5KGluZm8ubmFtZSwgZGV2LT5uYW1lLCAgc2l6ZW9mKGluZm8ubmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihpbmZvKSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9DQVBTKToKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX0NBUF9FWENMX0lOUFVULCBwKTsKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfU1RFUkVPREVWUyk6CisJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUkVDTUFTSyk6CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0RFVk1BU0spOgorCQl2YWwgPSBTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19MSU5FMjsKKwkJaWYgKDMyMDAwID09IGRldi0+b3NzLnJhdGUpCisJCQl2YWwgfD0gU09VTkRfTUFTS19WSURFTzsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1JFQ1NSQyk6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlucHV0ID0gZGV2LT5vc3MuaW5wdXQ7CisJCWlmICgzMjAwMCA9PSBkZXYtPm9zcy5yYXRlICAmJgorCQkgICAgdmFsICYgU09VTkRfTUFTS19WSURFTyAgJiYgIGRldi0+b3NzLmlucHV0ICE9IFRWKQorCQkJaW5wdXQgPSBUVjsKKwkJaWYgKHZhbCAmIFNPVU5EX01BU0tfTElORTEgICYmICBkZXYtPm9zcy5pbnB1dCAhPSBMSU5FMSkKKwkJCWlucHV0ID0gTElORTE7CisJCWlmICh2YWwgJiBTT1VORF9NQVNLX0xJTkUyICAmJiAgZGV2LT5vc3MuaW5wdXQgIT0gTElORTIpCisJCQlpbnB1dCA9IExJTkUyOworCQlpZiAoaW5wdXQgIT0gZGV2LT5vc3MuaW5wdXQpCisJCQltaXhlcl9yZWNzcmMoZGV2LGlucHV0KTsKKwkJLyogZmFsbCB0aHJvdXRoICovCisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JFQ1NSQyk6CisJCXN3aXRjaCAoZGV2LT5vc3MuaW5wdXQpIHsKKwkJY2FzZSBUVjogICAgcmV0ID0gU09VTkRfTUFTS19WSURFTzsgYnJlYWs7CisJCWNhc2UgTElORTE6IHJldCA9IFNPVU5EX01BU0tfTElORTE7IGJyZWFrOworCQljYXNlIExJTkUyOiByZXQgPSBTT1VORF9NQVNLX0xJTkUyOyBicmVhazsKKwkJZGVmYXVsdDogICAgcmV0ID0gMDsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIocmV0LCBwKTsKKworCWNhc2UgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfVklERU8pOgorCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9WSURFTyk6CisJCWlmICgzMjAwMCAhPSBkZXYtPm9zcy5yYXRlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBwdXRfdXNlcigxMDAgfCAxMDAgPDwgOCwgcCk7CisKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUxKToKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdmFsICY9IDB4ZmY7CisJCXZhbCA9ICh2YWwgPD0gNTApID8gNTAgOiAxMDA7CisJCWRldi0+b3NzLmxpbmUxID0gdmFsOworCQltaXhlcl9sZXZlbChkZXYsTElORTEsZGV2LT5vc3MubGluZTEpOworCQkvKiBmYWxsIHRocm91dGggKi8KKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTElORTEpOgorCQlyZXR1cm4gcHV0X3VzZXIoZGV2LT5vc3MubGluZTEgfCBkZXYtPm9zcy5saW5lMSA8PCA4LCBwKTsKKworCWNhc2UgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTElORTIpOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2YWwgJj0gMHhmZjsKKwkJdmFsID0gKHZhbCA8PSA1MCkgPyA1MCA6IDEwMDsKKwkJZGV2LT5vc3MubGluZTIgPSB2YWw7CisJCW1peGVyX2xldmVsKGRldixMSU5FMixkZXYtPm9zcy5saW5lMik7CisJCS8qIGZhbGwgdGhyb3V0aCAqLworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMik6CisJCXJldHVybiBwdXRfdXNlcihkZXYtPm9zcy5saW5lMiB8IGRldi0+b3NzLmxpbmUyIDw8IDgsIHApOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNhYTcxMzRfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gbWl4ZXJfb3BlbiwKKwkucmVsZWFzZSA9IG1peGVyX3JlbGVhc2UsCisJLmlvY3RsICAgPSBtaXhlcl9pb2N0bCwKKwkubGxzZWVrICA9IG5vX2xsc2VlaywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgc2FhNzEzNF9vc3NfaW5pdDEoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJLyogZ2VuZXJhbCAqLworICAgICAgICBpbml0X01VVEVYKCZkZXYtPm9zcy5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPm9zcy53cSk7CisKKwlzd2l0Y2ggKGRldi0+cGNpLT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzOgorCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzU6CisJCXNhYV93cml0ZWwoMHg1ODggPj4gMiwgMHgwMDAwMGZmZik7CisJCXNhYV93cml0ZWwoMHg1OGMgPj4gMiwgMHgwMDU0MzIxMCk7CisJCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NmMgPj4gMiwgMHhiYmJiYmIpOworCQlicmVhazsKKwl9CisKKwkvKiBkc3AgKi8KKwlkZXYtPm9zcy5yYXRlID0gMzIwMDA7CisJaWYgKG9zc19yYXRlKQorCQlkZXYtPm9zcy5yYXRlID0gb3NzX3JhdGU7CisJZGV2LT5vc3MucmF0ZSA9IChkZXYtPm9zcy5yYXRlID4gNDAwMDApID8gNDgwMDAgOiAzMjAwMDsKKworCS8qIG1peGVyICovCisJZGV2LT5vc3MubGluZTEgPSA1MDsKKwlkZXYtPm9zcy5saW5lMiA9IDUwOworCW1peGVyX2xldmVsKGRldixMSU5FMSxkZXYtPm9zcy5saW5lMSk7CisJbWl4ZXJfbGV2ZWwoZGV2LExJTkUyLGRldi0+b3NzLmxpbmUyKTsKKwltaXhlcl9yZWNzcmMoZGV2LCAoZGV2LT5vc3MucmF0ZSA9PSAzMjAwMCkgPyBUViA6IExJTkUyKTsKKworCXJldHVybiAwOworfQorCitpbnQgc2FhNzEzNF9vc3NfZmluaShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwkvKiBub3RoaW5nICovCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2FhNzEzNF9pcnFfb3NzX2RvbmUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgc3RhdHVzKQoreworCWludCBuZXh0X2JsaywgcmVnID0gMDsKKworCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CisJaWYgKFVOU0VUID09IGRldi0+b3NzLmRtYV9ibGspIHsKKwkJZHByaW50aygiaXJxOiByZWNvcmRpbmcgc3RvcHBlZFxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKDAgIT0gKHN0YXR1cyAmIDB4MGYwMDAwMDApKQorCQlkcHJpbnRrKCJpcnE6IGxvc3QgJWxkXG4iLCAoc3RhdHVzID4+IDI0KSAmIDB4MGYpOworCWlmICgwID09IChzdGF0dXMgJiAweDEwMDAwMDAwKSkgeworCQkvKiBvZGQgKi8KKwkJaWYgKDAgPT0gKGRldi0+b3NzLmRtYV9ibGsgJiAweDAxKSkKKwkJCXJlZyA9IFNBQTcxMzRfUlNfQkExKDYpOworCX0gZWxzZSB7CisJCS8qIGV2ZW4gKi8KKwkJaWYgKDAgPT0gKGRldi0+b3NzLmRtYV9ibGsgJiAweDAwKSkKKwkJCXJlZyA9IFNBQTcxMzRfUlNfQkEyKDYpOworCX0KKwlpZiAoMCA9PSByZWcpIHsKKwkJZHByaW50aygiaXJxOiBmaWVsZCBvb3BzIFslc11cbiIsCisJCQkoc3RhdHVzICYgMHgxMDAwMDAwMCkgPyAiZXZlbiIgOiAib2RkIik7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKGRldi0+b3NzLnJlYWRfY291bnQgPj0gZGV2LT5vc3MuYmxrc2l6ZSAqIChkZXYtPm9zcy5ibG9ja3MtMikpIHsKKwkJZHByaW50aygiaXJxOiBvdmVycnVuIFtmdWxsPSVkLyVkXVxuIixkZXYtPm9zcy5yZWFkX2NvdW50LAorCQkJZGV2LT5vc3MuYnVmc2l6ZSk7CisJCWRzcF9kbWFfc3RvcChkZXYpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogbmV4dCBibG9jayBhZGRyICovCisJbmV4dF9ibGsgPSAoZGV2LT5vc3MuZG1hX2JsayArIDIpICUgZGV2LT5vc3MuYmxvY2tzOworCXNhYV93cml0ZWwocmVnLG5leHRfYmxrICogZGV2LT5vc3MuYmxrc2l6ZSk7CisJaWYgKG9zc19kZWJ1ZyA+IDIpCisJCWRwcmludGsoImlycTogb2ssICVzLCBuZXh0X2Jsaz0lZCwgYWRkcj0leFxuIiwKKwkJCShzdGF0dXMgJiAweDEwMDAwMDAwKSA/ICJldmVuIiA6ICJvZGQgIiwgbmV4dF9ibGssCisJCQluZXh0X2JsayAqIGRldi0+b3NzLmJsa3NpemUpOworCisJLyogdXBkYXRlIHN0YXR1cyAmIHdha2Ugd2FpdGluZyByZWFkZXJzICovCisJZGV2LT5vc3MuZG1hX2JsayA9IChkZXYtPm9zcy5kbWFfYmxrICsgMSkgJSBkZXYtPm9zcy5ibG9ja3M7CisJZGV2LT5vc3MucmVhZF9jb3VudCArPSBkZXYtPm9zcy5ibGtzaXplOworCXdha2VfdXAoJmRldi0+b3NzLndxKTsKKworIGRvbmU6CisJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXJlZy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3MzRmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXJlZy5oCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogJElkOiBzYWE3MTM0LXJlZy5oLHYgMS4yIDIwMDQvMDkvMTUgMTY6MTU6MjQga3JheGVsIEV4cCAkCisgKgorICogcGhpbGlwcyBzYWE3MTM0IHJlZ2lzdGVycworICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFBDSSBJRCdzCisgKi8KKyNpZm5kZWYgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAKKyMgZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwIDB4NzEzMAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzCisjIGRlZmluZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMyAweDcxMzMKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNAorIyBkZWZpbmUgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQgMHg3MTM0CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzUKKyMgZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM1IDB4NzEzNQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqICByZWdpc3RlcnMgLS0gMzIgYml0CisgKi8KKworLyogRE1BIGNoYW5uZWxzLCBuID0gMCAuLi4gNiAqLworI2RlZmluZSBTQUE3MTM0X1JTX0JBMShuKQkJCSgoMHgyMDAgPj4gMikgKyA0Km4pCisjZGVmaW5lIFNBQTcxMzRfUlNfQkEyKG4pCSAgICAgICAJCSgoMHgyMDQgPj4gMikgKyA0Km4pCisjZGVmaW5lIFNBQTcxMzRfUlNfUElUQ0gobikJCQkoKDB4MjA4ID4+IDIpICsgNCpuKQorI2RlZmluZSBTQUE3MTM0X1JTX0NPTlRST0wobikJCQkoKDB4MjBjID4+IDIpICsgNCpuKQorI2RlZmluZSAgIFNBQTcxMzRfUlNfQ09OVFJPTF9XU1dBUAkJKDB4MDEgPDwgMjUpCisjZGVmaW5lICAgU0FBNzEzNF9SU19DT05UUk9MX0JTV0FQCQkoMHgwMSA8PCAyNCkKKyNkZWZpbmUgICBTQUE3MTM0X1JTX0NPTlRST0xfQlVSU1RfMgkJKDB4MDEgPDwgMjEpCisjZGVmaW5lICAgU0FBNzEzNF9SU19DT05UUk9MX0JVUlNUXzQJCSgweDAyIDw8IDIxKQorI2RlZmluZSAgIFNBQTcxMzRfUlNfQ09OVFJPTF9CVVJTVF84CQkoMHgwMyA8PCAyMSkKKyNkZWZpbmUgICBTQUE3MTM0X1JTX0NPTlRST0xfQlVSU1RfMTYJCSgweDA0IDw8IDIxKQorI2RlZmluZSAgIFNBQTcxMzRfUlNfQ09OVFJPTF9CVVJTVF8zMgkJKDB4MDUgPDwgMjEpCisjZGVmaW5lICAgU0FBNzEzNF9SU19DT05UUk9MX0JVUlNUXzY0CQkoMHgwNiA8PCAyMSkKKyNkZWZpbmUgICBTQUE3MTM0X1JTX0NPTlRST0xfQlVSU1RfTUFYCQkoMHgwNyA8PCAyMSkKKyNkZWZpbmUgICBTQUE3MTM0X1JTX0NPTlRST0xfTUUJCQkoMHgwMSA8PCAyMCkKKyNkZWZpbmUgU0FBNzEzNF9GSUZPX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICgweDJhMCA+PiAyKQorI2RlZmluZSBTQUE3MTM0X1RIUkVTSE9VTEQgICAgICAgICAgICAgICAgICAgICAgKDB4MmE0ID4+IDIpCisKKy8qIG1haW4gY29udHJvbCAqLworI2RlZmluZSBTQUE3MTM0X01BSU5fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgKDB4MmE4ID4+IDIpCisjZGVmaW5lICAgU0FBNzEzNF9NQUlOX0NUUkxfVlBMTEUJICAgICAgIAkoMSA8PCAxNSkKKyNkZWZpbmUgICBTQUE3MTM0X01BSU5fQ1RSTF9BUExMRQkgICAgICAgCSgxIDw8IDE0KQorI2RlZmluZSAgIFNBQTcxMzRfTUFJTl9DVFJMX0VYT1NDCSAgICAgICAJKDEgPDwgMTMpCisjZGVmaW5lICAgU0FBNzEzNF9NQUlOX0NUUkxfRVZGRTEJICAgICAgIAkoMSA8PCAxMikKKyNkZWZpbmUgICBTQUE3MTM0X01BSU5fQ1RSTF9FVkZFMgkgICAgICAgCSgxIDw8IDExKQorI2RlZmluZSAgIFNBQTcxMzRfTUFJTl9DVFJMX0VTRkUJICAgICAgIAkoMSA8PCAxMCkKKyNkZWZpbmUgICBTQUE3MTM0X01BSU5fQ1RSTF9FQkFEQwkgICAgICAgCSgxIDw8IDkpCisjZGVmaW5lICAgU0FBNzEzNF9NQUlOX0NUUkxfRUJEQUMJICAgICAgIAkoMSA8PCA4KQorI2RlZmluZSAgIFNBQTcxMzRfTUFJTl9DVFJMX1RFNgkJCSgxIDw8IDYpCisjZGVmaW5lICAgU0FBNzEzNF9NQUlOX0NUUkxfVEU1CQkJKDEgPDwgNSkKKyNkZWZpbmUgICBTQUE3MTM0X01BSU5fQ1RSTF9URTQJCQkoMSA8PCA0KQorI2RlZmluZSAgIFNBQTcxMzRfTUFJTl9DVFJMX1RFMwkJCSgxIDw8IDMpCisjZGVmaW5lICAgU0FBNzEzNF9NQUlOX0NUUkxfVEUyCQkJKDEgPDwgMikKKyNkZWZpbmUgICBTQUE3MTM0X01BSU5fQ1RSTF9URTEJCQkoMSA8PCAxKQorI2RlZmluZSAgIFNBQTcxMzRfTUFJTl9DVFJMX1RFMAkJCSgxIDw8IDApCisKKy8qIERNQSBzdGF0dXMgKi8KKyNkZWZpbmUgU0FBNzEzNF9ETUFfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICgweDJhYyA+PiAyKQorCisvKiBhdWRpbyAvIHZpZGVvIHN0YXR1cyAqLworI2RlZmluZSBTQUE3MTM0X0FWX1NUQVRVUwkJCSgweDJjMCA+PiAyKQorI2RlZmluZSAgIFNBQTcxMzRfQVZfU1RBVFVTX1NURVJFTwkJKDEgPDwgMTcpCisjZGVmaW5lICAgU0FBNzEzNF9BVl9TVEFUVVNfRFVBTCAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgICBTQUE3MTM0X0FWX1NUQVRVU19QSUxPVCAgICAgICAgICAgICAgICgxIDw8IDE1KQorI2RlZmluZSAgIFNBQTcxMzRfQVZfU1RBVFVTX1NNQiAgICAgICAgICAgICAgICAgKDEgPDwgMTQpCisjZGVmaW5lICAgU0FBNzEzNF9BVl9TVEFUVVNfRE1CICAgICAgICAgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgICBTQUE3MTM0X0FWX1NUQVRVU19WRFNQICAgICAgICAgICAgICAgICgxIDw8IDEyKQorI2RlZmluZSAgIFNBQTcxMzRfQVZfU1RBVFVTX0lJQ19TVEFUVVMgICAgICAgICAgKDMgPDwgMTApCisjZGVmaW5lICAgU0FBNzEzNF9BVl9TVEFUVVNfTVZNICAgICAgICAgICAgICAgICAoNyA8PCA3KQorI2RlZmluZSAgIFNBQTcxMzRfQVZfU1RBVFVTX0ZJRFQgICAgICAgICAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgICBTQUE3MTM0X0FWX1NUQVRVU19JTlRMICAgICAgICAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lICAgU0FBNzEzNF9BVl9TVEFUVVNfUkRDQVAgICAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSAgIFNBQTcxMzRfQVZfU1RBVFVTX1BXUl9PTiAgICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgICBTQUE3MTM0X0FWX1NUQVRVU19MT0FEX0VSUiAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lICAgU0FBNzEzNF9BVl9TVEFUVVNfVFJJR19FUlIgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSAgIFNBQTcxMzRfQVZfU1RBVFVTX0NPTkZfRVJSICAgICAgICAgICAgKDEgPDwgMCkKKworLyogaW50ZXJydXB0ICovCisjZGVmaW5lIFNBQTcxMzRfSVJRMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyYzQgPj4gMikKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTFfSU5URV9SQTNfMSAgICAgICAgICAgICAgICgxIDw8IDI1KQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMV9JTlRFX1JBM18wICAgICAgICAgICAgICAgKDEgPDwgMjQpCisjZGVmaW5lICAgU0FBNzEzNF9JUlExX0lOVEVfUkEyXzMgICAgICAgICAgICAgICAoMSA8PCAxOSkKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTFfSU5URV9SQTJfMiAgICAgICAgICAgICAgICgxIDw8IDE4KQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMV9JTlRFX1JBMl8xICAgICAgICAgICAgICAgKDEgPDwgMTcpCisjZGVmaW5lICAgU0FBNzEzNF9JUlExX0lOVEVfUkEyXzAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTFfSU5URV9SQTFfMyAgICAgICAgICAgICAgICgxIDw8IDExKQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMV9JTlRFX1JBMV8yICAgICAgICAgICAgICAgKDEgPDwgMTApCisjZGVmaW5lICAgU0FBNzEzNF9JUlExX0lOVEVfUkExXzEgICAgICAgICAgICAgICAoMSA8PCAgOSkKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTFfSU5URV9SQTFfMCAgICAgICAgICAgICAgICgxIDw8ICA4KQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMV9JTlRFX1JBMF83ICAgICAgICAgICAgICAgKDEgPDwgIDcpCisjZGVmaW5lICAgU0FBNzEzNF9JUlExX0lOVEVfUkEwXzYgICAgICAgICAgICAgICAoMSA8PCAgNikKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTFfSU5URV9SQTBfNSAgICAgICAgICAgICAgICgxIDw8ICA1KQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMV9JTlRFX1JBMF80ICAgICAgICAgICAgICAgKDEgPDwgIDQpCisjZGVmaW5lICAgU0FBNzEzNF9JUlExX0lOVEVfUkEwXzMgICAgICAgICAgICAgICAoMSA8PCAgMykKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTFfSU5URV9SQTBfMiAgICAgICAgICAgICAgICgxIDw8ICAyKQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMV9JTlRFX1JBMF8xICAgICAgICAgICAgICAgKDEgPDwgIDEpCisjZGVmaW5lICAgU0FBNzEzNF9JUlExX0lOVEVfUkEwXzAgICAgICAgICAgICAgICAoMSA8PCAgMCkKKworI2RlZmluZSBTQUE3MTM0X0lSUTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MmM4ID4+IDIpCisjZGVmaW5lICAgU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzIzQSAgICAgICAgICAgICAoMSA8PCAxNykKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTJfSU5URV9HUElPMjMgICAgICAgICAgICAgICgxIDw8IDE2KQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8yMkEgICAgICAgICAgICAgKDEgPDwgMTUpCisjZGVmaW5lICAgU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzIyICAgICAgICAgICAgICAoMSA8PCAxNCkKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTJfSU5URV9HUElPMThBICAgICAgICAgICAgICgxIDw8IDEzKQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xOCAgICAgICAgICAgICAgKDEgPDwgMTIpCisjZGVmaW5lICAgU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE2ICAgICAgICAgICAgICAoMSA8PCAxMSkgLyogbm90IGNlcnRhaW4gKi8KKyNkZWZpbmUgICBTQUE3MTM0X0lSUTJfSU5URV9TQzIgICAgICAgICAgICAgICAgICgxIDw8IDEwKQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMl9JTlRFX1NDMSAgICAgICAgICAgICAgICAgKDEgPDwgIDkpCisjZGVmaW5lICAgU0FBNzEzNF9JUlEyX0lOVEVfU0MwICAgICAgICAgICAgICAgICAoMSA8PCAgOCkKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTJfSU5URV9ERUM1ICAgICAgICAgICAgICAgICgxIDw8ICA3KQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMl9JTlRFX0RFQzQgICAgICAgICAgICAgICAgKDEgPDwgIDYpCisjZGVmaW5lICAgU0FBNzEzNF9JUlEyX0lOVEVfREVDMyAgICAgICAgICAgICAgICAoMSA8PCAgNSkKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTJfSU5URV9ERUMyICAgICAgICAgICAgICAgICgxIDw8ICA0KQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMl9JTlRFX0RFQzEgICAgICAgICAgICAgICAgKDEgPDwgIDMpCisjZGVmaW5lICAgU0FBNzEzNF9JUlEyX0lOVEVfREVDMCAgICAgICAgICAgICAgICAoMSA8PCAgMikKKyNkZWZpbmUgICBTQUE3MTM0X0lSUTJfSU5URV9QRSAgICAgICAgICAgICAgICAgICgxIDw8ICAxKQorI2RlZmluZSAgIFNBQTcxMzRfSVJRMl9JTlRFX0FSICAgICAgICAgICAgICAgICAgKDEgPDwgIDApCisKKyNkZWZpbmUgU0FBNzEzNF9JUlFfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgICgweDJjYyA+PiAyKQorI2RlZmluZSAgIFNBQTcxMzRfSVJRX1JFUE9SVF9HUElPMjMgICAgICAgICAgICAgKDEgPDwgMTcpCisjZGVmaW5lICAgU0FBNzEzNF9JUlFfUkVQT1JUX0dQSU8yMiAgICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgICBTQUE3MTM0X0lSUV9SRVBPUlRfR1BJTzE4ICAgICAgICAgICAgICgxIDw8IDE1KQorI2RlZmluZSAgIFNBQTcxMzRfSVJRX1JFUE9SVF9HUElPMTYgICAgICAgICAgICAgKDEgPDwgMTQpIC8qIG5vdCBjZXJ0YWluICovCisjZGVmaW5lICAgU0FBNzEzNF9JUlFfUkVQT1JUX0xPQURfRVJSICAgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgICBTQUE3MTM0X0lSUV9SRVBPUlRfQ09ORl9FUlIgICAgICAgICAgICgxIDw8IDEyKQorI2RlZmluZSAgIFNBQTcxMzRfSVJRX1JFUE9SVF9UUklHX0VSUiAgICAgICAgICAgKDEgPDwgMTEpCisjZGVmaW5lICAgU0FBNzEzNF9JUlFfUkVQT1JUX01NQyAgICAgICAgICAgICAgICAoMSA8PCAxMCkKKyNkZWZpbmUgICBTQUE3MTM0X0lSUV9SRVBPUlRfRklEVCAgICAgICAgICAgICAgICgxIDw8ICA5KQorI2RlZmluZSAgIFNBQTcxMzRfSVJRX1JFUE9SVF9JTlRMICAgICAgICAgICAgICAgKDEgPDwgIDgpCisjZGVmaW5lICAgU0FBNzEzNF9JUlFfUkVQT1JUX1JEQ0FQICAgICAgICAgICAgICAoMSA8PCAgNykKKyNkZWZpbmUgICBTQUE3MTM0X0lSUV9SRVBPUlRfUFdSX09OICAgICAgICAgICAgICgxIDw8ICA2KQorI2RlZmluZSAgIFNBQTcxMzRfSVJRX1JFUE9SVF9QRSAgICAgICAgICAgICAgICAgKDEgPDwgIDUpCisjZGVmaW5lICAgU0FBNzEzNF9JUlFfUkVQT1JUX0FSICAgICAgICAgICAgICAgICAoMSA8PCAgNCkKKyNkZWZpbmUgICBTQUE3MTM0X0lSUV9SRVBPUlRfRE9ORV9SQTMgICAgICAgICAgICgxIDw8ICAzKQorI2RlZmluZSAgIFNBQTcxMzRfSVJRX1JFUE9SVF9ET05FX1JBMiAgICAgICAgICAgKDEgPDwgIDIpCisjZGVmaW5lICAgU0FBNzEzNF9JUlFfUkVQT1JUX0RPTkVfUkExICAgICAgICAgICAoMSA8PCAgMSkKKyNkZWZpbmUgICBTQUE3MTM0X0lSUV9SRVBPUlRfRE9ORV9SQTAgICAgICAgICAgICgxIDw8ICAwKQorI2RlZmluZSBTQUE3MTM0X0lSUV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgKDB4MmQwID4+IDIpCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogIHJlZ2lzdGVycyAtLSA4IGJpdAorICovCisKKy8qIHZpZGVvIGRlY29kZXIgKi8KKyNkZWZpbmUgU0FBNzEzNF9JTkNSX0RFTEFZICAgICAgICAgICAgICAgICAgICAgIDB4MTAxCisjZGVmaW5lIFNBQTcxMzRfQU5BTE9HX0lOX0NUUkwxICAgICAgICAgICAgICAgICAweDEwMgorI2RlZmluZSBTQUE3MTM0X0FOQUxPR19JTl9DVFJMMiAgICAgICAgICAgICAgICAgMHgxMDMKKyNkZWZpbmUgU0FBNzEzNF9BTkFMT0dfSU5fQ1RSTDMgICAgICAgICAgICAgICAgIDB4MTA0CisjZGVmaW5lIFNBQTcxMzRfQU5BTE9HX0lOX0NUUkw0ICAgICAgICAgICAgICAgICAweDEwNQorI2RlZmluZSBTQUE3MTM0X0hTWU5DX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMHgxMDYKKyNkZWZpbmUgU0FBNzEzNF9IU1lOQ19TVE9QICAgICAgICAgICAgICAgICAgICAgIDB4MTA3CisjZGVmaW5lIFNBQTcxMzRfU1lOQ19DVFJMICAgICAgICAgICAgICAgICAgICAgICAweDEwOAorI2RlZmluZSBTQUE3MTM0X0xVTUFfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDkKKyNkZWZpbmUgU0FBNzEzNF9ERUNfTFVNQV9CUklHSFQgICAgICAgICAgICAgICAgIDB4MTBhCisjZGVmaW5lIFNBQTcxMzRfREVDX0xVTUFfQ09OVFJBU1QgICAgICAgICAgICAgICAweDEwYgorI2RlZmluZSBTQUE3MTM0X0RFQ19DSFJPTUFfU0FUVVJBVElPTiAgICAgICAgICAgMHgxMGMKKyNkZWZpbmUgU0FBNzEzNF9ERUNfQ0hST01BX0hVRSAgICAgICAgICAgICAgICAgIDB4MTBkCisjZGVmaW5lIFNBQTcxMzRfQ0hST01BX0NUUkwxICAgICAgICAgICAgICAgICAgICAweDEwZQorI2RlZmluZSBTQUE3MTM0X0NIUk9NQV9HQUlOICAgICAgICAgICAgICAgICAgICAgMHgxMGYKKyNkZWZpbmUgU0FBNzEzNF9DSFJPTUFfQ1RSTDIgICAgICAgICAgICAgICAgICAgIDB4MTEwCisjZGVmaW5lIFNBQTcxMzRfTU9ERV9ERUxBWV9DVFJMICAgICAgICAgICAgICAgICAweDExMQorCisjZGVmaW5lIFNBQTcxMzRfQU5BTE9HX0FEQyAgICAgICAgICAgICAgICAgICAgICAweDExNAorI2RlZmluZSBTQUE3MTM0X1ZHQVRFX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMHgxMTUKKyNkZWZpbmUgU0FBNzEzNF9WR0FURV9TVE9QICAgICAgICAgICAgICAgICAgICAgIDB4MTE2CisjZGVmaW5lIFNBQTcxMzRfTUlTQ19WR0FURV9NU0IgICAgICAgICAgICAgICAgICAweDExNworI2RlZmluZSBTQUE3MTM0X1JBV19EQVRBX0dBSU4gICAgICAgICAgICAgICAgICAgMHgxMTgKKyNkZWZpbmUgU0FBNzEzNF9SQVdfREFUQV9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MTE5CisjZGVmaW5lIFNBQTcxMzRfU1RBVFVTX1ZJREVPMSAgICAgICAgICAgICAgICAgICAweDExZQorI2RlZmluZSBTQUE3MTM0X1NUQVRVU19WSURFTzIgICAgICAgICAgICAgICAgICAgMHgxMWYKKworLyogdmlkZW8gc2NhbGVyICovCisjZGVmaW5lIFNBQTcxMzRfU09VUkNFX1RJTUlORzEgICAgICAgICAgICAgICAgICAweDAwMAorI2RlZmluZSBTQUE3MTM0X1NPVVJDRV9USU1JTkcyICAgICAgICAgICAgICAgICAgMHgwMDEKKyNkZWZpbmUgU0FBNzEzNF9SRUdJT05fRU5BQkxFICAgICAgICAgICAgICAgICAgIDB4MDA0CisjZGVmaW5lIFNBQTcxMzRfU0NBTEVSX1NUQVRVUzAgICAgICAgICAgICAgICAgICAweDAwNgorI2RlZmluZSBTQUE3MTM0X1NDQUxFUl9TVEFUVVMxICAgICAgICAgICAgICAgICAgMHgwMDcKKyNkZWZpbmUgU0FBNzEzNF9TVEFSVF9HUkVFTiAgICAgICAgICAgICAgICAgICAgIDB4MDBjCisjZGVmaW5lIFNBQTcxMzRfU1RBUlRfQkxVRSAgICAgICAgICAgICAgICAgICAgICAweDAwZAorI2RlZmluZSBTQUE3MTM0X1NUQVJUX1JFRCAgICAgICAgICAgICAgICAgICAgICAgMHgwMGUKKyNkZWZpbmUgU0FBNzEzNF9HUkVFTl9QQVRIKHgpICAgICAgICAgICAgICAgICAgICgweDAxMCAreCkKKyNkZWZpbmUgU0FBNzEzNF9CTFVFX1BBVEgoeCkgICAgICAgICAgICAgICAgICAgICgweDAyMCAreCkKKyNkZWZpbmUgU0FBNzEzNF9SRURfUEFUSCh4KSAgICAgICAgICAgICAgICAgICAgICgweDAzMCAreCkKKworI2RlZmluZSBUQVNLX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAKKyNkZWZpbmUgVEFTS19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwCisjZGVmaW5lIFNBQTcxMzRfVEFTS19DT05ESVRJT05TKHQpICAgICAgICAgICAgICAoMHgwMDAgK3QpCisjZGVmaW5lIFNBQTcxMzRfRklFTERfSEFORExJTkcodCkgICAgICAgICAgICAgICAoMHgwMDEgK3QpCisjZGVmaW5lIFNBQTcxMzRfREFUQV9QQVRIKHQpICAgICAgICAgICAgICAgICAgICAoMHgwMDIgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX0hfU1RBUlQxKHQpICAgICAgICAgICAgICAgICAoMHgwMDQgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX0hfU1RBUlQyKHQpICAgICAgICAgICAgICAgICAoMHgwMDUgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX0hfU1RPUDEodCkgICAgICAgICAgICAgICAgICAoMHgwMDYgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX0hfU1RPUDIodCkgICAgICAgICAgICAgICAgICAoMHgwMDcgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX1ZfU1RBUlQxKHQpICAgICAgICAgICAgICAgICAoMHgwMDggK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX1ZfU1RBUlQyKHQpICAgICAgICAgICAgICAgICAoMHgwMDkgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX1ZfU1RPUDEodCkgICAgICAgICAgICAgICAgICAoMHgwMGEgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX1ZfU1RPUDIodCkgICAgICAgICAgICAgICAgICAoMHgwMGIgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX0hfTEVOMSh0KSAgICAgICAgICAgICAgICAgICAoMHgwMGMgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX0hfTEVOMih0KSAgICAgICAgICAgICAgICAgICAoMHgwMGQgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX1ZfTEVOMSh0KSAgICAgICAgICAgICAgICAgICAoMHgwMGUgK3QpCisjZGVmaW5lIFNBQTcxMzRfVkJJX1ZfTEVOMih0KSAgICAgICAgICAgICAgICAgICAoMHgwMGYgK3QpCisKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19IX1NUQVJUMSh0KSAgICAgICAgICAgICAgICgweDAxNCArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19IX1NUQVJUMih0KSAgICAgICAgICAgICAgICgweDAxNSArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19IX1NUT1AxKHQpICAgICAgICAgICAgICAgICgweDAxNiArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19IX1NUT1AyKHQpICAgICAgICAgICAgICAgICgweDAxNyArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19WX1NUQVJUMSh0KSAgICAgICAgICAgICAgICgweDAxOCArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19WX1NUQVJUMih0KSAgICAgICAgICAgICAgICgweDAxOSArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19WX1NUT1AxKHQpICAgICAgICAgICAgICAgICgweDAxYSArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19WX1NUT1AyKHQpICAgICAgICAgICAgICAgICgweDAxYiArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19QSVhFTFMxKHQpICAgICAgICAgICAgICAgICgweDAxYyArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19QSVhFTFMyKHQpICAgICAgICAgICAgICAgICgweDAxZCArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19MSU5FUzEodCkgICAgICAgICAgICAgICAgICgweDAxZSArdCkKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19MSU5FUzIodCkgICAgICAgICAgICAgICAgICgweDAxZiArdCkKKworI2RlZmluZSBTQUE3MTM0X0hfUFJFU0NBTEUodCkgICAgICAgICAgICAgICAgICAgKDB4MDIwICt0KQorI2RlZmluZSBTQUE3MTM0X0FDQ19MRU5HVEgodCkgICAgICAgICAgICAgICAgICAgKDB4MDIxICt0KQorI2RlZmluZSBTQUE3MTM0X0xFVkVMX0NUUkwodCkgICAgICAgICAgICAgICAgICAgKDB4MDIyICt0KQorI2RlZmluZSBTQUE3MTM0X0ZJUl9QUkVGSUxURVJfQ1RSTCh0KSAgICAgICAgICAgKDB4MDIzICt0KQorI2RlZmluZSBTQUE3MTM0X0xVTUFfQlJJR0hUKHQpICAgICAgICAgICAgICAgICAgKDB4MDI0ICt0KQorI2RlZmluZSBTQUE3MTM0X0xVTUFfQ09OVFJBU1QodCkgICAgICAgICAgICAgICAgKDB4MDI1ICt0KQorI2RlZmluZSBTQUE3MTM0X0NIUk9NQV9TQVRVUkFUSU9OKHQpICAgICAgICAgICAgKDB4MDI2ICt0KQorI2RlZmluZSBTQUE3MTM0X1ZCSV9IX1NDQUxFX0lOQzEodCkgICAgICAgICAgICAgKDB4MDI4ICt0KQorI2RlZmluZSBTQUE3MTM0X1ZCSV9IX1NDQUxFX0lOQzIodCkgICAgICAgICAgICAgKDB4MDI5ICt0KQorI2RlZmluZSBTQUE3MTM0X1ZCSV9QSEFTRV9PRkZTRVRfTFVNQSh0KSAgICAgICAgKDB4MDJhICt0KQorI2RlZmluZSBTQUE3MTM0X1ZCSV9QSEFTRV9PRkZTRVRfQ0hST01BKHQpICAgICAgKDB4MDJiICt0KQorI2RlZmluZSBTQUE3MTM0X0hfU0NBTEVfSU5DMSh0KSAgICAgICAgICAgICAgICAgKDB4MDJjICt0KQorI2RlZmluZSBTQUE3MTM0X0hfU0NBTEVfSU5DMih0KSAgICAgICAgICAgICAgICAgKDB4MDJkICt0KQorI2RlZmluZSBTQUE3MTM0X0hfUEhBU0VfT0ZGX0xVTUEodCkgICAgICAgICAgICAgKDB4MDJlICt0KQorI2RlZmluZSBTQUE3MTM0X0hfUEhBU0VfT0ZGX0NIUk9NQSh0KSAgICAgICAgICAgKDB4MDJmICt0KQorI2RlZmluZSBTQUE3MTM0X1ZfU0NBTEVfUkFUSU8xKHQpICAgICAgICAgICAgICAgKDB4MDMwICt0KQorI2RlZmluZSBTQUE3MTM0X1ZfU0NBTEVfUkFUSU8yKHQpICAgICAgICAgICAgICAgKDB4MDMxICt0KQorI2RlZmluZSBTQUE3MTM0X1ZfRklMVEVSKHQpICAgICAgICAgICAgICAgICAgICAgKDB4MDMyICt0KQorI2RlZmluZSBTQUE3MTM0X1ZfUEhBU0VfT0ZGU0VUMCh0KSAgICAgICAgICAgICAgKDB4MDM0ICt0KQorI2RlZmluZSBTQUE3MTM0X1ZfUEhBU0VfT0ZGU0VUMSh0KSAgICAgICAgICAgICAgKDB4MDM1ICt0KQorI2RlZmluZSBTQUE3MTM0X1ZfUEhBU0VfT0ZGU0VUMih0KSAgICAgICAgICAgICAgKDB4MDM2ICt0KQorI2RlZmluZSBTQUE3MTM0X1ZfUEhBU0VfT0ZGU0VUMyh0KSAgICAgICAgICAgICAgKDB4MDM3ICt0KQorCisvKiBjbGlwcGluZyAmIGRtYSAqLworI2RlZmluZSBTQUE3MTM0X09GTVRfVklERU9fQSAgICAgICAgICAgICAgICAgICAgMHgzMDAKKyNkZWZpbmUgU0FBNzEzNF9PRk1UX0RBVEFfQSAgICAgICAgICAgICAgICAgICAgIDB4MzAxCisjZGVmaW5lIFNBQTcxMzRfT0ZNVF9WSURFT19CICAgICAgICAgICAgICAgICAgICAweDMwMgorI2RlZmluZSBTQUE3MTM0X09GTVRfREFUQV9CICAgICAgICAgICAgICAgICAgICAgMHgzMDMKKyNkZWZpbmUgU0FBNzEzNF9BTFBIQV9OT0NMSVAgICAgICAgICAgICAgICAgICAgIDB4MzA0CisjZGVmaW5lIFNBQTcxMzRfQUxQSEFfQ0xJUCAgICAgICAgICAgICAgICAgICAgICAweDMwNQorI2RlZmluZSBTQUE3MTM0X1VWX1BJWEVMICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDgKKyNkZWZpbmUgU0FBNzEzNF9DTElQX1JFRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA5CisjZGVmaW5lIFNBQTcxMzRfQ0xJUF9HUkVFTiAgICAgICAgICAgICAgICAgICAgICAweDMwYQorI2RlZmluZSBTQUE3MTM0X0NMSVBfQkxVRSAgICAgICAgICAgICAgICAgICAgICAgMHgzMGIKKworLyogaTJjIGJ1cyAqLworI2RlZmluZSBTQUE3MTM0X0kyQ19BVFRSX1NUQVRVUyAgICAgICAgICAgICAgICAgMHgxODAKKyNkZWZpbmUgU0FBNzEzNF9JMkNfREFUQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgxCisjZGVmaW5lIFNBQTcxMzRfSTJDX0NMT0NLX1NFTEVDVCAgICAgICAgICAgICAgICAweDE4MgorI2RlZmluZSBTQUE3MTM0X0kyQ19USU1FUiAgICAgICAgICAgICAgICAgICAgICAgMHgxODMKKworLyogYXVkaW8gKi8KKyNkZWZpbmUgU0FBNzEzNF9OSUNBTV9BRERfREFUQTEgICAgICAgICAgICAgICAgIDB4MTQwCisjZGVmaW5lIFNBQTcxMzRfTklDQU1fQUREX0RBVEEyICAgICAgICAgICAgICAgICAweDE0MQorI2RlZmluZSBTQUE3MTM0X05JQ0FNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHgxNDIKKyNkZWZpbmUgU0FBNzEzNF9BVURJT19TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4MTQzCisjZGVmaW5lIFNBQTcxMzRfTklDQU1fRVJST1JfQ09VTlQgICAgICAgICAgICAgICAweDE0NAorI2RlZmluZSBTQUE3MTM0X0lERU5UX1NJRiAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUKKyNkZWZpbmUgU0FBNzEzNF9MRVZFTF9SRUFET1VUMSAgICAgICAgICAgICAgICAgIDB4MTQ2CisjZGVmaW5lIFNBQTcxMzRfTEVWRUxfUkVBRE9VVDIgICAgICAgICAgICAgICAgICAweDE0NworI2RlZmluZSBTQUE3MTM0X05JQ0FNX0VSUk9SX0xPVyAgICAgICAgICAgICAgICAgMHgxNDgKKyNkZWZpbmUgU0FBNzEzNF9OSUNBTV9FUlJPUl9ISUdIICAgICAgICAgICAgICAgIDB4MTQ5CisjZGVmaW5lIFNBQTcxMzRfRENYT19JREVOVF9DVFJMICAgICAgICAgICAgICAgICAweDE0YQorI2RlZmluZSBTQUE3MTM0X0RFTU9EVUxBVE9SICAgICAgICAgICAgICAgICAgICAgMHgxNGIKKyNkZWZpbmUgU0FBNzEzNF9BR0NfR0FJTl9TRUxFQ1QgICAgICAgICAgICAgICAgIDB4MTRjCisjZGVmaW5lIFNBQTcxMzRfQ0FSUklFUjFfRlJFUTAgICAgICAgICAgICAgICAgICAweDE1MAorI2RlZmluZSBTQUE3MTM0X0NBUlJJRVIxX0ZSRVExICAgICAgICAgICAgICAgICAgMHgxNTEKKyNkZWZpbmUgU0FBNzEzNF9DQVJSSUVSMV9GUkVRMiAgICAgICAgICAgICAgICAgIDB4MTUyCisjZGVmaW5lIFNBQTcxMzRfQ0FSUklFUjJfRlJFUTAgICAgICAgICAgICAgICAgICAweDE1NAorI2RlZmluZSBTQUE3MTM0X0NBUlJJRVIyX0ZSRVExICAgICAgICAgICAgICAgICAgMHgxNTUKKyNkZWZpbmUgU0FBNzEzNF9DQVJSSUVSMl9GUkVRMiAgICAgICAgICAgICAgICAgIDB4MTU2CisjZGVmaW5lIFNBQTcxMzRfTlVNX1NBTVBMRVMwICAgICAgICAgICAgICAgICAgICAweDE1OAorI2RlZmluZSBTQUE3MTM0X05VTV9TQU1QTEVTMSAgICAgICAgICAgICAgICAgICAgMHgxNTkKKyNkZWZpbmUgU0FBNzEzNF9OVU1fU0FNUExFUzIgICAgICAgICAgICAgICAgICAgIDB4MTVhCisjZGVmaW5lIFNBQTcxMzRfQVVESU9fRk9STUFUX0NUUkwgICAgICAgICAgICAgICAweDE1YgorI2RlZmluZSBTQUE3MTM0X01PTklUT1JfU0VMRUNUICAgICAgICAgICAgICAgICAgMHgxNjAKKyNkZWZpbmUgU0FBNzEzNF9GTV9ERUVNUEhBU0lTICAgICAgICAgICAgICAgICAgIDB4MTYxCisjZGVmaW5lIFNBQTcxMzRfRk1fREVNQVRSSVggICAgICAgICAgICAgICAgICAgICAweDE2MgorI2RlZmluZSBTQUE3MTM0X0NIQU5ORUwxX0xFVkVMICAgICAgICAgICAgICAgICAgMHgxNjMKKyNkZWZpbmUgU0FBNzEzNF9DSEFOTkVMMl9MRVZFTCAgICAgICAgICAgICAgICAgIDB4MTY0CisjZGVmaW5lIFNBQTcxMzRfTklDQU1fQ09ORklHICAgICAgICAgICAgICAgICAgICAweDE2NQorI2RlZmluZSBTQUE3MTM0X05JQ0FNX0xFVkVMX0FESlVTVCAgICAgICAgICAgICAgMHgxNjYKKyNkZWZpbmUgU0FBNzEzNF9TVEVSRU9fREFDX09VVFBVVF9TRUxFQ1QgICAgICAgIDB4MTY3CisjZGVmaW5lIFNBQTcxMzRfSTJTX09VVFBVVF9GT1JNQVQgICAgICAgICAgICAgICAweDE2OAorI2RlZmluZSBTQUE3MTM0X0kyU19PVVRQVVRfU0VMRUNUICAgICAgICAgICAgICAgMHgxNjkKKyNkZWZpbmUgU0FBNzEzNF9JMlNfT1VUUFVUX0xFVkVMICAgICAgICAgICAgICAgIDB4MTZhCisjZGVmaW5lIFNBQTcxMzRfRFNQX09VVFBVVF9TRUxFQ1QgICAgICAgICAgICAgICAweDE2YgorI2RlZmluZSBTQUE3MTM0X0FVRElPX01VVEVfQ1RSTCAgICAgICAgICAgICAgICAgMHgxNmMKKyNkZWZpbmUgU0FBNzEzNF9TSUZfU0FNUExFX0ZSRVEgICAgICAgICAgICAgICAgIDB4MTZkCisjZGVmaW5lIFNBQTcxMzRfQU5BTE9HX0lPX1NFTEVDVCAgICAgICAgICAgICAgICAweDE2ZQorI2RlZmluZSBTQUE3MTM0X0FVRElPX0NMT0NLMCAgICAgICAgICAgICAgICAgICAgMHgxNzAKKyNkZWZpbmUgU0FBNzEzNF9BVURJT19DTE9DSzEgICAgICAgICAgICAgICAgICAgIDB4MTcxCisjZGVmaW5lIFNBQTcxMzRfQVVESU9fQ0xPQ0syICAgICAgICAgICAgICAgICAgICAweDE3MgorI2RlZmluZSBTQUE3MTM0X0FVRElPX1BMTF9DVFJMICAgICAgICAgICAgICAgICAgMHgxNzMKKyNkZWZpbmUgU0FBNzEzNF9BVURJT19DTE9DS1NfUEVSX0ZJRUxEMCAgICAgICAgIDB4MTc0CisjZGVmaW5lIFNBQTcxMzRfQVVESU9fQ0xPQ0tTX1BFUl9GSUVMRDEgICAgICAgICAweDE3NQorI2RlZmluZSBTQUE3MTM0X0FVRElPX0NMT0NLU19QRVJfRklFTEQyICAgICAgICAgMHgxNzYKKworLyogdmlkZW8gcG9ydCBvdXRwdXQgKi8KKyNkZWZpbmUgU0FBNzEzNF9WSURFT19QT1JUX0NUUkwwICAgICAgICAgICAgICAgIDB4MTkwCisjZGVmaW5lIFNBQTcxMzRfVklERU9fUE9SVF9DVFJMMSAgICAgICAgICAgICAgICAweDE5MQorI2RlZmluZSBTQUE3MTM0X1ZJREVPX1BPUlRfQ1RSTDIgICAgICAgICAgICAgICAgMHgxOTIKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19QT1JUX0NUUkwzICAgICAgICAgICAgICAgIDB4MTkzCisjZGVmaW5lIFNBQTcxMzRfVklERU9fUE9SVF9DVFJMNCAgICAgICAgICAgICAgICAweDE5NAorI2RlZmluZSBTQUE3MTM0X1ZJREVPX1BPUlRfQ1RSTDUgICAgICAgICAgICAgICAgMHgxOTUKKyNkZWZpbmUgU0FBNzEzNF9WSURFT19QT1JUX0NUUkw2ICAgICAgICAgICAgICAgIDB4MTk2CisjZGVmaW5lIFNBQTcxMzRfVklERU9fUE9SVF9DVFJMNyAgICAgICAgICAgICAgICAweDE5NworI2RlZmluZSBTQUE3MTM0X1ZJREVPX1BPUlRfQ1RSTDggICAgICAgICAgICAgICAgMHgxOTgKKworLyogdHJhbnNwb3J0IHN0cmVhbSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgU0FBNzEzNF9UU19QQVJBTExFTCAgICAgICAgICAgICAgICAgICAgIDB4MWEwCisjZGVmaW5lIFNBQTcxMzRfVFNfUEFSQUxMRUxfU0VSSUFMICAgICAgICAgICAgICAweDFhMQorI2RlZmluZSBTQUE3MTM0X1RTX1NFUklBTDAgICAgICAgICAgICAgICAgICAgICAgMHgxYTIKKyNkZWZpbmUgU0FBNzEzNF9UU19TRVJJQUwxICAgICAgICAgICAgICAgICAgICAgIDB4MWEzCisjZGVmaW5lIFNBQTcxMzRfVFNfRE1BMCAgICAgICAgICAgICAgICAgICAgICAgICAweDFhNAorI2RlZmluZSBTQUE3MTM0X1RTX0RNQTEgICAgICAgICAgICAgICAgICAgICAgICAgMHgxYTUKKyNkZWZpbmUgU0FBNzEzNF9UU19ETUEyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWE2CisKKy8qIEdQSU8gQ29udHJvbHMgKi8KKyNkZWZpbmUgU0FBNzEzNF9HUElPX0dQUkVTQ0FOICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgU0FBNzEzNF9HUElPXzI3XzI1ICAgICAgICAgICAgICAgICAgICAgIDB4MEUKKworI2RlZmluZSBTQUE3MTM0X0dQSU9fR1BNT0RFMCAgICAgICAgICAgICAgICAgICAgMHgxQjAKKyNkZWZpbmUgU0FBNzEzNF9HUElPX0dQTU9ERTEgICAgICAgICAgICAgICAgICAgIDB4MUIxCisjZGVmaW5lIFNBQTcxMzRfR1BJT19HUE1PREUyICAgICAgICAgICAgICAgICAgICAweDFCMgorI2RlZmluZSBTQUE3MTM0X0dQSU9fR1BNT0RFMyAgICAgICAgICAgICAgICAgICAgMHgxQjMKKyNkZWZpbmUgU0FBNzEzNF9HUElPX0dQU1RBVFVTMCAgICAgICAgICAgICAgICAgIDB4MUI0CisjZGVmaW5lIFNBQTcxMzRfR1BJT19HUFNUQVRVUzEgICAgICAgICAgICAgICAgICAweDFCNQorI2RlZmluZSBTQUE3MTM0X0dQSU9fR1BTVEFUVVMyICAgICAgICAgICAgICAgICAgMHgxQjYKKyNkZWZpbmUgU0FBNzEzNF9HUElPX0dQU1RBVFVTMyAgICAgICAgICAgICAgICAgIDB4MUI3CisKKy8qIEkyUyBvdXRwdXQgKi8KKyNkZWZpbmUgU0FBNzEzNF9JMlNfQVVESU9fT1VUUFVUICAgICAgICAgICAgICAgIDB4MWMwCisKKy8qIHRlc3QgbW9kZXMgKi8KKyNkZWZpbmUgU0FBNzEzNF9TUEVDSUFMX01PREUgICAgICAgICAgICAgICAgICAgIDB4MWQwCisKKy8qIGF1ZGlvIC0tIHNhYTcxMzMgKyBzYWE3MTM1IG9ubHkgKi8KKyNkZWZpbmUgU0FBNzEzNV9EU1BfUldTVEFURSAgICAgICAgICAgICAgICAgICAgIDB4NTgwCisjZGVmaW5lIFNBQTcxMzVfRFNQX1JXU1RBVEVfRVJSICAgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBTQUE3MTM1X0RTUF9SV1NUQVRFX0lEQSAgICAgICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgU0FBNzEzNV9EU1BfUldTVEFURV9SREIgICAgICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIFNBQTcxMzVfRFNQX1JXU1RBVEVfV1JSICAgICAgICAgICAgICAgICAoMSA8PCAwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NWViMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10cy5jCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogJElkOiBzYWE3MTM0LXRzLmMsdiAxLjE0IDIwMDUvMDIvMDMgMTA6MjQ6MzMga3JheGVsIEV4cCAkCisgKgorICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCisgKiB2aWRlbzRsaW51eCB2aWRlbyBpbnRlcmZhY2UKKyAqCisgKiAoYykgMjAwMSwwMiBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKKyNpbmNsdWRlICJzYWE3MTM0LmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHRzX2RlYnVnICA9IDA7Cittb2R1bGVfcGFyYW0odHNfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHRzX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW3RzXSIpOworCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pCWlmICh0c19kZWJ1ZykgXAorCXByaW50ayhLRVJOX0RFQlVHICIlcy90czogIiBmbXQsIGRldi0+bmFtZSAsICMjIGFyZykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYnVmZmVyX2FjdGl2YXRlKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LAorCQkJICAgc3RydWN0IHNhYTcxMzRfYnVmICpidWYsCisJCQkgICBzdHJ1Y3Qgc2FhNzEzNF9idWYgKm5leHQpCit7CisJdTMyIGNvbnRyb2w7CisKKwlkcHJpbnRrKCJidWZmZXJfYWN0aXZhdGUgWyVwXSIsYnVmKTsKKwlidWYtPnZiLnN0YXRlID0gU1RBVEVfQUNUSVZFOworCWJ1Zi0+dG9wX3NlZW4gPSAwOworCisgICAgICAgIC8qIGRtYTogc2V0dXAgY2hhbm5lbCA1ICg9IFRTKSAqLworICAgICAgICBjb250cm9sID0gU0FBNzEzNF9SU19DT05UUk9MX0JVUlNUXzE2IHwKKyAgICAgICAgICAgICAgICBTQUE3MTM0X1JTX0NPTlRST0xfTUUgfAorICAgICAgICAgICAgICAgIChidWYtPnB0LT5kbWEgPj4gMTIpOworCisJaWYgKE5VTEwgPT0gbmV4dCkKKwkJbmV4dCA9IGJ1ZjsKKwlpZiAoVjRMMl9GSUVMRF9UT1AgPT0gYnVmLT52Yi5maWVsZCkgeworCQlkcHJpbnRrKCItIFt0b3BdICAgICBidWY9JXAgbmV4dD0lcFxuIixidWYsbmV4dCk7CisJCXNhYV93cml0ZWwoU0FBNzEzNF9SU19CQTEoNSksc2FhNzEzNF9idWZmZXJfYmFzZShidWYpKTsKKwkJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0JBMig1KSxzYWE3MTM0X2J1ZmZlcl9iYXNlKG5leHQpKTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKCItIFtib3R0b21dICBidWY9JXAgbmV4dD0lcFxuIixidWYsbmV4dCk7CisJCXNhYV93cml0ZWwoU0FBNzEzNF9SU19CQTEoNSksc2FhNzEzNF9idWZmZXJfYmFzZShuZXh0KSk7CisJCXNhYV93cml0ZWwoU0FBNzEzNF9SU19CQTIoNSksc2FhNzEzNF9idWZmZXJfYmFzZShidWYpKTsKKwl9CisJc2FhX3dyaXRlbChTQUE3MTM0X1JTX1BJVENIKDUpLFRTX1BBQ0tFVF9TSVpFKTsKKwlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQ09OVFJPTCg1KSxjb250cm9sKTsKKworCS8qIHN0YXJ0IERNQSAqLworCXNhYTcxMzRfc2V0X2RtYWJpdHMoZGV2KTsKKworCW1vZF90aW1lcigmZGV2LT50c19xLnRpbWVvdXQsIGppZmZpZXMrQlVGRkVSX1RJTUVPVVQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCisJCQkgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3Qgc2FhNzEzNF9idWYgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2YixzdHJ1Y3Qgc2FhNzEzNF9idWYsdmIpOworCXVuc2lnbmVkIGludCBsaW5lcywgbGxlbmd0aCwgc2l6ZTsKKwlpbnQgZXJyOworCisJZHByaW50aygiYnVmZmVyX3ByZXBhcmUgWyVwLCVzXVxuIixidWYsdjRsMl9maWVsZF9uYW1lc1tmaWVsZF0pOworCisJbGxlbmd0aCA9IFRTX1BBQ0tFVF9TSVpFOworCWxpbmVzID0gZGV2LT50cy5ucl9wYWNrZXRzOworCisJc2l6ZSA9IGxpbmVzICogbGxlbmd0aDsKKwlpZiAoMCAhPSBidWYtPnZiLmJhZGRyICAmJiAgYnVmLT52Yi5ic2l6ZSA8IHNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJ1Zi0+dmIuc2l6ZSAhPSBzaXplKSB7CisJCXNhYTcxMzRfZG1hX2ZyZWUoZGV2LGJ1Zik7CisJfQorCisJaWYgKFNUQVRFX05FRURTX0lOSVQgPT0gYnVmLT52Yi5zdGF0ZSkgeworCQlidWYtPnZiLndpZHRoICA9IGxsZW5ndGg7CisJCWJ1Zi0+dmIuaGVpZ2h0ID0gbGluZXM7CisJCWJ1Zi0+dmIuc2l6ZSAgID0gc2l6ZTsKKwkJYnVmLT5wdCAgICAgICAgPSAmZGV2LT50cy5wdF90czsKKworCQllcnIgPSB2aWRlb2J1Zl9pb2xvY2soZGV2LT5wY2ksJmJ1Zi0+dmIsTlVMTCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG9vcHM7CisJCWVyciA9IHNhYTcxMzRfcGd0YWJsZV9idWlsZChkZXYtPnBjaSxidWYtPnB0LAorCQkJCQkgICAgYnVmLT52Yi5kbWEuc2dsaXN0LAorCQkJCQkgICAgYnVmLT52Yi5kbWEuc2dsZW4sCisJCQkJCSAgICBzYWE3MTM0X2J1ZmZlcl9zdGFydHBhZ2UoYnVmKSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG9vcHM7CisJfQorCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKKwlidWYtPmFjdGl2YXRlID0gYnVmZmVyX2FjdGl2YXRlOworCWJ1Zi0+dmIuZmllbGQgPSBmaWVsZDsKKwlyZXR1cm4gMDsKKworIG9vcHM6CisJc2FhNzEzNF9kbWFfZnJlZShkZXYsYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitidWZmZXJfc2V0dXAoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKnNpemUpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBxLT5wcml2X2RhdGE7CisKKwkqc2l6ZSA9IFRTX1BBQ0tFVF9TSVpFICogZGV2LT50cy5ucl9wYWNrZXRzOworCWlmICgwID09ICpjb3VudCkKKwkJKmNvdW50ID0gZGV2LT50cy5ucl9idWZzOworCSpjb3VudCA9IHNhYTcxMzRfYnVmZmVyX2NvdW50KCpzaXplLCpjb3VudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBzYWE3MTM0X2J1Zix2Yik7CisKKwlzYWE3MTM0X2J1ZmZlcl9xdWV1ZShkZXYsJmRldi0+dHNfcSxidWYpOworfQorCitzdGF0aWMgdm9pZCBidWZmZXJfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBzYWE3MTM0X2J1Zix2Yik7CisKKwlzYWE3MTM0X2RtYV9mcmVlKGRldixidWYpOworfQorCitzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIHNhYTcxMzRfdHNfcW9wcyA9IHsKKwkuYnVmX3NldHVwICAgID0gYnVmZmVyX3NldHVwLAorCS5idWZfcHJlcGFyZSAgPSBidWZmZXJfcHJlcGFyZSwKKwkuYnVmX3F1ZXVlICAgID0gYnVmZmVyX3F1ZXVlLAorCS5idWZfcmVsZWFzZSAgPSBidWZmZXJfcmVsZWFzZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTM0X3RzX3FvcHMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZXhwb3J0ZWQgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCB0c2J1ZnMgPSA0OworbW9kdWxlX3BhcmFtKHRzYnVmcywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModHNidWZzLCJudW1iZXIgb2YgdHMgYnVmZmVycywgcmFuZ2UgMi0zMiIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHRzX25yX3BhY2tldHMgPSAzMDsKK21vZHVsZV9wYXJhbSh0c19ucl9wYWNrZXRzLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyh0c19ucl9wYWNrZXRzLCJzaXplIG9mIGEgdHMgYnVmZmVycyAoaW4gdHMgcGFja2V0cykiKTsKKworaW50IHNhYTcxMzRfdHNfaW5pdDEoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJLyogc2FuaXR5Y2hlY2sgaW5zbW9kIG9wdGlvbnMgKi8KKwlpZiAodHNidWZzIDwgMikKKwkJdHNidWZzID0gMjsKKwlpZiAodHNidWZzID4gVklERU9fTUFYX0ZSQU1FKQorCQl0c2J1ZnMgPSBWSURFT19NQVhfRlJBTUU7CisJaWYgKHRzX25yX3BhY2tldHMgPCA0KQorCQl0c19ucl9wYWNrZXRzID0gNDsKKwlpZiAodHNfbnJfcGFja2V0cyA+IDMxMikKKwkJdHNfbnJfcGFja2V0cyA9IDMxMjsKKwlkZXYtPnRzLm5yX2J1ZnMgICAgPSB0c2J1ZnM7CisJZGV2LT50cy5ucl9wYWNrZXRzID0gdHNfbnJfcGFja2V0czsKKworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnRzX3EucXVldWUpOworCWluaXRfdGltZXIoJmRldi0+dHNfcS50aW1lb3V0KTsKKwlkZXYtPnRzX3EudGltZW91dC5mdW5jdGlvbiA9IHNhYTcxMzRfYnVmZmVyX3RpbWVvdXQ7CisJZGV2LT50c19xLnRpbWVvdXQuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZykoJmRldi0+dHNfcSk7CisJZGV2LT50c19xLmRldiAgICAgICAgICAgICAgPSBkZXY7CisJZGV2LT50c19xLm5lZWRfdHdvICAgICAgICAgPSAxOworCXNhYTcxMzRfcGd0YWJsZV9hbGxvYyhkZXYtPnBjaSwmZGV2LT50cy5wdF90cyk7CisKKwkvKiBpbml0IFRTIGh3ICovCisJc2FhX3dyaXRlYihTQUE3MTM0X1RTX1NFUklBTDEsIDB4MDApOyAgLyogZGVhY3RpdmF0ZSBUUyBzb2Z0cmVzZXQgKi8KKwlzYWFfd3JpdGViKFNBQTcxMzRfVFNfUEFSQUxMRUwsIDB4ZWMpOyAvKiBUU1NPUCBoaWdoIGFjdGl2ZSwgVFNWQUwgaGlnaCBhY3RpdmUsIFRTTE9DSyBpZ25vcmVkICovCisJc2FhX3dyaXRlYihTQUE3MTM0X1RTX1BBUkFMTEVMX1NFUklBTCwgKFRTX1BBQ0tFVF9TSVpFLTEpKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVFNfRE1BMCwgKChkZXYtPnRzLm5yX3BhY2tldHMtMSkmMHhmZikpOworCXNhYV93cml0ZWIoU0FBNzEzNF9UU19ETUExLCAoKChkZXYtPnRzLm5yX3BhY2tldHMtMSk+PjgpJjB4ZmYpKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVFNfRE1BMiwgKCgoKGRldi0+dHMubnJfcGFja2V0cy0xKT4+MTYpJjB4M2YpIHwgMHgwMCkpOyAvKiBUU05PUElUPTAsIFRTQ09MQVA9MCAqLworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzYWE3MTM0X3RzX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJc2FhNzEzNF9wZ3RhYmxlX2ZyZWUoZGV2LT5wY2ksJmRldi0+dHMucHRfdHMpOworCXJldHVybiAwOworfQorCisKK3ZvaWQgc2FhNzEzNF9pcnFfdHNfZG9uZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBzdGF0dXMpCit7CisJZW51bSB2NGwyX2ZpZWxkIGZpZWxkOworCisJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwlpZiAoZGV2LT50c19xLmN1cnIpIHsKKwkJZmllbGQgPSBkZXYtPnRzX3EuY3Vyci0+dmIuZmllbGQ7CisJCWlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX1RPUCkgeworCQkJaWYgKChzdGF0dXMgJiAweDEwMDAwMCkgIT0gMHgwMDAwMDApCisJCQkJZ290byBkb25lOworCQl9IGVsc2UgeworCQkJaWYgKChzdGF0dXMgJiAweDEwMDAwMCkgIT0gMHgxMDAwMDApCisJCQkJZ290byBkb25lOworCQl9CisJCXNhYTcxMzRfYnVmZmVyX2ZpbmlzaChkZXYsJmRldi0+dHNfcSxTVEFURV9ET05FKTsKKwl9CisJc2FhNzEzNF9idWZmZXJfbmV4dChkZXYsJmRldi0+dHNfcSk7CisKKyBkb25lOgorCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10dmF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhYzEzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXR2YXVkaW8uYwpAQCAtMCwwICsxLDEwMzEgQEAKKy8qCisgKiAkSWQ6IHNhYTcxMzQtdHZhdWRpby5jLHYgMS4yMiAyMDA1LzAxLzA3IDEzOjExOjE5IGtyYXhlbCBFeHAgJAorICoKKyAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcworICogdHYgYXVkaW8gZGVjb2RlciAoZm0gc3RlcmVvLCBuaWNhbSwgLi4uKQorICoKKyAqIChjKSAyMDAxLTAzIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2luY2x1ZGUgInNhYTcxMzQtcmVnLmgiCisjaW5jbHVkZSAic2FhNzEzNC5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBhdWRpb19kZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oYXVkaW9fZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1ZGlvX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW3R2IGF1ZGlvXSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvX2RkZXAgPSAwOworbW9kdWxlX3BhcmFtKGF1ZGlvX2RkZXAsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1ZGlvX2RkZXAsImF1ZGlvIGRkZXAgb3ZlcndyaXRlIik7CisKK3N0YXRpYyBpbnQgYXVkaW9fY2xvY2tfb3ZlcnJpZGUgPSBVTlNFVDsKK21vZHVsZV9wYXJhbShhdWRpb19jbG9ja19vdmVycmlkZSwgaW50LCAwNjQ0KTsKKworc3RhdGljIGludCBhdWRpb19jbG9ja190d2VhayA9IDA7Cittb2R1bGVfcGFyYW0oYXVkaW9fY2xvY2tfdHdlYWssIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1ZGlvX2Nsb2NrX3R3ZWFrLCAiQXVkaW8gY2xvY2sgdGljayBmaW5lIHR1bmluZyBmb3IgY2FyZHMgd2l0aCBhdWRpbyBjcnlzdGFsIHRoYXQncyBzbGlnaHRseSBvZmYgKHJhbmdlIFstMTAyNCAuLiAxMDI0XSkiKTsKKworI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAoYXVkaW9fZGVidWcpIFwKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMvYXVkaW86ICIgZm10LCBkZXYtPm5hbWUgLCAjIyBhcmcpCisjZGVmaW5lIGQycHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAoYXVkaW9fZGVidWcgPiAxKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzL2F1ZGlvOiAiIGZtdCwgZGV2LT5uYW1lLCAjIyBhcmcpCisKKyNkZWZpbmUgcHJpbnRfcmVnYihyZWcpIHByaW50aygiJXM6ICAgcmVnIDB4JTAzeCBbJS0xNnNdOiAweCUwMnhcbiIsIFwKKwkJZGV2LT5uYW1lLChTQUE3MTM0XyMjcmVnKSwoI3JlZyksc2FhX3JlYWRiKChTQUE3MTM0XyMjcmVnKSkpCisKKy8qIG1zZWNzICovCisjZGVmaW5lIFNDQU5fSU5JVElBTF9ERUxBWSAgICAgMTAwMAorI2RlZmluZSBTQ0FOX1NBTVBMRV9ERUxBWSAgICAgICAyMDAKKyNkZWZpbmUgU0NBTl9TVUJDQVJSSUVSX0RFTEFZICAyMDAwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc2FhNzEzNCBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBzdHJ1Y3QgbWFpbnNjYW4geworCWNoYXIgICAgICAgICAqbmFtZTsKKwl2NGwyX3N0ZF9pZCAgc3RkOworCWludCAgICAgICAgICBjYXJyOworfSBtYWluc2NhbltdID0geworCXsKKwkJLm5hbWUgPSAiTSIsCisJCS5zdGQgID0gVjRMMl9TVERfTlRTQyB8IFY0TDJfU1REX1BBTF9NLAorCQkuY2FyciA9IDQ1MDAsCisJfSx7CisJCS5uYW1lID0gIkJHIiwKKwkJLnN0ZCAgPSBWNEwyX1NURF9QQUxfQkcsCisJCS5jYXJyID0gNTUwMCwKKwl9LHsKKwkJLm5hbWUgPSAiSSIsCisJCS5zdGQgID0gVjRMMl9TVERfUEFMX0ksCisJCS5jYXJyID0gNjAwMCwKKwl9LHsKKwkJLm5hbWUgPSAiREtMIiwKKwkJLnN0ZCAgPSBWNEwyX1NURF9QQUxfREsgfCBWNEwyX1NURF9TRUNBTSwKKwkJLmNhcnIgPSA2NTAwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2FhNzEzNF90dmF1ZGlvIHR2YXVkaW9bXSA9IHsKKwl7CisJCS5uYW1lICAgICAgICAgID0gIlBBTC1CL0cgRk0tc3RlcmVvIiwKKwkJLnN0ZCAgICAgICAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5tb2RlICAgICAgICAgID0gVFZBVURJT19GTV9CR19TVEVSRU8sCisJCS5jYXJyMSAgICAgICAgID0gNTUwMCwKKwkJLmNhcnIyICAgICAgICAgPSA1NzQyLAorCX0seworCQkubmFtZSAgICAgICAgICA9ICJQQUwtRC9LMSBGTS1zdGVyZW8iLAorCQkuc3RkICAgICAgICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLmNhcnIxICAgICAgICAgPSA2NTAwLAorCQkuY2FycjIgICAgICAgICA9IDYyNTgsCisJCS5tb2RlICAgICAgICAgID0gVFZBVURJT19GTV9CR19TVEVSRU8sCisJfSx7CisJCS5uYW1lICAgICAgICAgID0gIlBBTC1EL0syIEZNLXN0ZXJlbyIsCisJCS5zdGQgICAgICAgICAgID0gVjRMMl9TVERfUEFMLAorCQkuY2FycjEgICAgICAgICA9IDY1MDAsCisJCS5jYXJyMiAgICAgICAgID0gNjc0MiwKKwkJLm1vZGUgICAgICAgICAgPSBUVkFVRElPX0ZNX0JHX1NURVJFTywKKwl9LHsKKwkJLm5hbWUgICAgICAgICAgPSAiUEFMLUQvSzMgRk0tc3RlcmVvIiwKKwkJLnN0ZCAgICAgICAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5jYXJyMSAgICAgICAgID0gNjUwMCwKKwkJLmNhcnIyICAgICAgICAgPSA1NzQyLAorCQkubW9kZSAgICAgICAgICA9IFRWQVVESU9fRk1fQkdfU1RFUkVPLAorCX0seworCQkubmFtZSAgICAgICAgICA9ICJQQUwtQi9HIE5JQ0FNIiwKKwkJLnN0ZCAgICAgICAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5jYXJyMSAgICAgICAgID0gNTUwMCwKKwkJLmNhcnIyICAgICAgICAgPSA1ODUwLAorCQkubW9kZSAgICAgICAgICA9IFRWQVVESU9fTklDQU1fRk0sCisJfSx7CisJCS5uYW1lICAgICAgICAgID0gIlBBTC1JIE5JQ0FNIiwKKwkJLnN0ZCAgICAgICAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5jYXJyMSAgICAgICAgID0gNjAwMCwKKwkJLmNhcnIyICAgICAgICAgPSA2NTUyLAorCQkubW9kZSAgICAgICAgICA9IFRWQVVESU9fTklDQU1fRk0sCisJfSx7CisJCS5uYW1lICAgICAgICAgID0gIlBBTC1EL0sgTklDQU0iLAorCQkuc3RkICAgICAgICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLmNhcnIxICAgICAgICAgPSA2NTAwLAorCQkuY2FycjIgICAgICAgICA9IDU4NTAsCisJCS5tb2RlICAgICAgICAgID0gVFZBVURJT19OSUNBTV9GTSwKKwl9LHsKKwkJLm5hbWUgICAgICAgICAgPSAiU0VDQU0tTCBOSUNBTSIsCisJCS5zdGQgICAgICAgICAgID0gVjRMMl9TVERfU0VDQU0sCisJCS5jYXJyMSAgICAgICAgID0gNjUwMCwKKwkJLmNhcnIyICAgICAgICAgPSA1ODUwLAorCQkubW9kZSAgICAgICAgICA9IFRWQVVESU9fTklDQU1fQU0sCisJfSx7CisJCS5uYW1lICAgICAgICAgID0gIlNFQ0FNLUQvSyIsCisJCS5zdGQgICAgICAgICAgID0gVjRMMl9TVERfU0VDQU0sCisJCS5jYXJyMSAgICAgICAgID0gNjUwMCwKKwkJLmNhcnIyICAgICAgICAgPSAtMSwKKwkJLm1vZGUgICAgICAgICAgPSBUVkFVRElPX0ZNX01PTk8sCisJfSx7CisJCS5uYW1lICAgICAgICAgID0gIk5UU0MtTSIsCisJCS5zdGQgICAgICAgICAgID0gVjRMMl9TVERfTlRTQywKKwkJLmNhcnIxICAgICAgICAgPSA0NTAwLAorCQkuY2FycjIgICAgICAgICA9IC0xLAorCQkubW9kZSAgICAgICAgICA9IFRWQVVESU9fRk1fTU9OTywKKwl9LHsKKwkJLm5hbWUgICAgICAgICAgPSAiTlRTQy1BMiBGTS1zdGVyZW8iLAorCQkuc3RkICAgICAgICAgICA9IFY0TDJfU1REX05UU0MsCisJCS5jYXJyMSAgICAgICAgID0gNDUwMCwKKwkJLmNhcnIyICAgICAgICAgPSA0NzI0LAorCQkubW9kZSAgICAgICAgICA9IFRWQVVESU9fRk1fS19TVEVSRU8sCisJfQorfTsKKyNkZWZpbmUgVFZBVURJTyAoc2l6ZW9mKHR2YXVkaW8pL3NpemVvZihzdHJ1Y3Qgc2FhNzEzNF90dmF1ZGlvKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHR2YXVkaW9faW5pdChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlpbnQgY2xvY2sgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5hdWRpb19jbG9jazsKKworCWlmIChVTlNFVCAhPSBhdWRpb19jbG9ja19vdmVycmlkZSkKKwkgICAgICAgIGNsb2NrID0gYXVkaW9fY2xvY2tfb3ZlcnJpZGU7CisKKwkvKiBpbml0IGFsbCBhdWRpbyByZWdpc3RlcnMgKi8KKwlzYWFfd3JpdGViKFNBQTcxMzRfQVVESU9fUExMX0NUUkwsICAgMHgwMCk7CisJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQlzY2hlZHVsZSgpOworCWVsc2UKKwkJdWRlbGF5KDEwKTsKKworCXNhYV93cml0ZWIoU0FBNzEzNF9BVURJT19DTE9DSzAsICAgICAgY2xvY2sgICAgICAgICYgMHhmZik7CisJc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX0NMT0NLMSwgICAgIChjbG9jayA+PiAgOCkgJiAweGZmKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfQVVESU9fQ0xPQ0syLCAgICAgKGNsb2NrID4+IDE2KSAmIDB4ZmYpOworCXNhYV93cml0ZWIoU0FBNzEzNF9BVURJT19QTExfQ1RSTCwgICAweDAxKTsKKworCXNhYV93cml0ZWIoU0FBNzEzNF9OSUNBTV9FUlJPUl9MT1csICAweDE0KTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfTklDQU1fRVJST1JfSElHSCwgMHg1MCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X01PTklUT1JfU0VMRUNULCAgIDB4YTApOworCXNhYV93cml0ZWIoU0FBNzEzNF9GTV9ERU1BVFJJWCwgICAgICAweDgwKTsKK30KKworc3RhdGljIHUzMiB0dmF1ZGlvX2NhcnIycmVnKHUzMiBjYXJyaWVyKQoreworCXU2NCBhID0gY2FycmllcjsKKworCWEgPDw9IDI0OworCWRvX2RpdihhLDEyMjg4KTsKKwlyZXR1cm4gYTsKK30KKworc3RhdGljIHZvaWQgdHZhdWRpb19zZXRjYXJyaWVyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LAorCQkJICAgICAgIGludCBwcmltYXJ5LCBpbnQgc2Vjb25kYXJ5KQoreworCWlmICgtMSA9PSBzZWNvbmRhcnkpCisJCXNlY29uZGFyeSA9IHByaW1hcnk7CisJc2FhX3dyaXRlbChTQUE3MTM0X0NBUlJJRVIxX0ZSRVEwID4+IDIsIHR2YXVkaW9fY2FycjJyZWcocHJpbWFyeSkpOworCXNhYV93cml0ZWwoU0FBNzEzNF9DQVJSSUVSMl9GUkVRMCA+PiAyLCB0dmF1ZGlvX2NhcnIycmVnKHNlY29uZGFyeSkpOworfQorCitzdGF0aWMgdm9pZCBtdXRlX2lucHV0XzcxMzQoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgaW50IG11dGU7CisJc3RydWN0IHNhYTcxMzRfaW5wdXQgKmluOworCWludCBhdXNlbD0wLCBpY3M9MCwgb2NzPTA7CisJaW50IG1hc2s7CisKKwkvKiBsb29rIHdoYXQgaXMgdG8gZG8gLi4uICovCisJaW4gICA9IGRldi0+aW5wdXQ7CisJbXV0ZSA9IChkZXYtPmN0bF9tdXRlIHx8CisJCShkZXYtPmF1dG9tdXRlICAmJiAgKCZjYXJkKGRldikucmFkaW8pICE9IGluKSk7CisJaWYgKFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwID09IGRldi0+cGNpLT5kZXZpY2UgJiYKKwkgICAgY2FyZChkZXYpLm11dGUubmFtZSkgeworCQkvKiA3MTMwIC0gd2UnbGwgbXV0ZSB1c2luZyBzb21lIHVuY29ubmVjdGVkIGF1ZGlvIGlucHV0ICovCisJCWlmIChtdXRlKQorCQkJaW4gPSAmY2FyZChkZXYpLm11dGU7CisJfQorCWlmIChkZXYtPmh3X211dGUgID09IG11dGUgJiYKKwkgICAgZGV2LT5od19pbnB1dCA9PSBpbikgeworCQlkcHJpbnRrKCJtdXRlL2lucHV0OiBub3RoaW5nIHRvIGRvIFttdXRlPSVkLGlucHV0PSVzXVxuIiwKKwkJCW11dGUsaW4tPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJZHByaW50aygiY3RsX211dGU9JWQgYXV0b211dGU9JWQgaW5wdXQ9JXMgID0+ICBtdXRlPSVkIGlucHV0PSVzXG4iLAorCQlkZXYtPmN0bF9tdXRlLGRldi0+YXV0b211dGUsZGV2LT5pbnB1dC0+bmFtZSxtdXRlLGluLT5uYW1lKTsKKwlkZXYtPmh3X211dGUgID0gbXV0ZTsKKwlkZXYtPmh3X2lucHV0ID0gaW47CisKKwlpZiAoUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQgPT0gZGV2LT5wY2ktPmRldmljZSkKKwkJLyogNzEzNCBtdXRlICovCisJCXNhYV93cml0ZWIoU0FBNzEzNF9BVURJT19NVVRFX0NUUkwsIG11dGUgPyAweGJmIDogMHhiYik7CisKKwkvKiBzd2l0Y2ggaW50ZXJuYWwgYXVkaW8gbXV4ICovCisJc3dpdGNoIChpbi0+YW11eCkgeworCWNhc2UgVFY6ICAgICAgICAgYXVzZWw9MHhjMDsgaWNzPTB4MDA7IG9jcz0weDAyOyBicmVhazsKKwljYXNlIExJTkUxOiAgICAgIGF1c2VsPTB4ODA7IGljcz0weDAwOyBvY3M9MHgwMDsgYnJlYWs7CisJY2FzZSBMSU5FMjogICAgICBhdXNlbD0weDgwOyBpY3M9MHgwODsgb2NzPTB4MDE7IGJyZWFrOworCWNhc2UgTElORTJfTEVGVDogYXVzZWw9MHg4MDsgaWNzPTB4MDg7IG9jcz0weDA1OyBicmVhazsKKwl9CisJc2FhX2FuZG9yYihTQUE3MTM0X0FVRElPX0ZPUk1BVF9DVFJMLCAweGMwLCBhdXNlbCk7CisJc2FhX2FuZG9yYihTQUE3MTM0X0FOQUxPR19JT19TRUxFQ1QsIDB4MDgsIGljcyk7CisJc2FhX2FuZG9yYihTQUE3MTM0X0FOQUxPR19JT19TRUxFQ1QsIDB4MDcsIG9jcyk7CisKKwkvKiBzd2l0Y2ggZ3Bpby1jb25uZWN0ZWQgZXh0ZXJuYWwgYXVkaW8gbXV4ICovCisJaWYgKDAgPT0gY2FyZChkZXYpLmdwaW9tYXNrKQorCQlyZXR1cm47CisJbWFzayA9IGNhcmQoZGV2KS5ncGlvbWFzazsKKwlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsICAgbWFzaywgbWFzayk7CisJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIG1hc2ssIGluLT5ncGlvKTsKKwlzYWE3MTM0X3RyYWNrX2dwaW8oZGV2LGluLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgdHZhdWRpb19zZXRtb2RlKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LAorCQkJICAgIHN0cnVjdCBzYWE3MTM0X3R2YXVkaW8gKmF1ZGlvLAorCQkJICAgIGNoYXIgKm5vdGUpCit7CisJaW50IGFjcGYsIHR3ZWFrID0gMDsKKworCWlmIChkZXYtPnR2bm9ybS0+aWQgPT0gVjRMMl9TVERfTlRTQykgeworCQlhY3BmID0gMHgxOTA2NjsKKwl9IGVsc2UgeworCQlhY3BmID0gMHgxZTAwMDsKKwl9CisJaWYgKGF1ZGlvX2Nsb2NrX3R3ZWFrID4gLTEwMjQgJiYgYXVkaW9fY2xvY2tfdHdlYWsgPCAxMDI0KQorCQl0d2VhayA9IGF1ZGlvX2Nsb2NrX3R3ZWFrOworCisJaWYgKG5vdGUpCisJCWRwcmludGsoInR2YXVkaW9fc2V0bW9kZTogJXMgJXMgWyVkLiUwM2QvJWQuJTAzZCBNSHpdIGFjcGY9JWQlK2RcbiIsCisJCQlub3RlLGF1ZGlvLT5uYW1lLAorCQkJYXVkaW8tPmNhcnIxIC8gMTAwMCwgYXVkaW8tPmNhcnIxICUgMTAwMCwKKwkJCWF1ZGlvLT5jYXJyMiAvIDEwMDAsIGF1ZGlvLT5jYXJyMiAlIDEwMDAsCisJCQlhY3BmLCB0d2Vhayk7CisKKwlhY3BmICs9IHR3ZWFrOworCXNhYV93cml0ZWIoU0FBNzEzNF9BVURJT19DTE9DS1NfUEVSX0ZJRUxEMCwgKGFjcGYgJiAweDAwMDBmZikgPj4gMCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX0NMT0NLU19QRVJfRklFTEQxLCAoYWNwZiAmIDB4MDBmZjAwKSA+PiA4KTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfQVVESU9fQ0xPQ0tTX1BFUl9GSUVMRDIsIChhY3BmICYgMHgwMzAwMDApID4+IDE2KTsKKwl0dmF1ZGlvX3NldGNhcnJpZXIoZGV2LGF1ZGlvLT5jYXJyMSxhdWRpby0+Y2FycjIpOworCisJc3dpdGNoIChhdWRpby0+bW9kZSkgeworCWNhc2UgVFZBVURJT19GTV9NT05POgorCWNhc2UgVFZBVURJT19GTV9CR19TVEVSRU86CisJCXNhYV93cml0ZWIoU0FBNzEzNF9ERU1PRFVMQVRPUiwgICAgICAgICAgICAgICAweDAwKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0RDWE9fSURFTlRfQ1RSTCwgICAgICAgICAgIDB4MDApOworCQlzYWFfd3JpdGViKFNBQTcxMzRfRk1fREVFTVBIQVNJUywgICAgICAgICAgICAgMHgyMik7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9GTV9ERU1BVFJJWCwgICAgICAgICAgICAgICAweDgwKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X1NURVJFT19EQUNfT1VUUFVUX1NFTEVDVCwgIDB4YTApOworCQlicmVhazsKKwljYXNlIFRWQVVESU9fRk1fS19TVEVSRU86CisJCXNhYV93cml0ZWIoU0FBNzEzNF9ERU1PRFVMQVRPUiwgICAgICAgICAgICAgICAweDAwKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0RDWE9fSURFTlRfQ1RSTCwgICAgICAgICAgIDB4MDEpOworCQlzYWFfd3JpdGViKFNBQTcxMzRfRk1fREVFTVBIQVNJUywgICAgICAgICAgICAgMHgyMik7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9GTV9ERU1BVFJJWCwgICAgICAgICAgICAgICAweDgwKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X1NURVJFT19EQUNfT1VUUFVUX1NFTEVDVCwgIDB4YTApOworCQlicmVhazsKKwljYXNlIFRWQVVESU9fTklDQU1fRk06CisJCXNhYV93cml0ZWIoU0FBNzEzNF9ERU1PRFVMQVRPUiwgICAgICAgICAgICAgICAweDEwKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0RDWE9fSURFTlRfQ1RSTCwgICAgICAgICAgIDB4MDApOworCQlzYWFfd3JpdGViKFNBQTcxMzRfRk1fREVFTVBIQVNJUywgICAgICAgICAgICAgMHg0NCk7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9TVEVSRU9fREFDX09VVFBVVF9TRUxFQ1QsICAweGExKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X05JQ0FNX0NPTkZJRywgICAgICAgICAgICAgIDB4MDApOworCQlicmVhazsKKwljYXNlIFRWQVVESU9fTklDQU1fQU06CisJCXNhYV93cml0ZWIoU0FBNzEzNF9ERU1PRFVMQVRPUiwgICAgICAgICAgICAgICAweDEyKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0RDWE9fSURFTlRfQ1RSTCwgICAgICAgICAgIDB4MDApOworCQlzYWFfd3JpdGViKFNBQTcxMzRfRk1fREVFTVBIQVNJUywgICAgICAgICAgICAgMHg0NCk7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9TVEVSRU9fREFDX09VVFBVVF9TRUxFQ1QsICAweGExKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X05JQ0FNX0NPTkZJRywgICAgICAgICAgICAgIDB4MDApOworCQlicmVhazsKKwljYXNlIFRWQVVESU9fRk1fU0FUX1NURVJFTzoKKwkJLyogbm90IGltcGxlbWVudGVkICh5ZXQpICovCisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCB0dmF1ZGlvX3NsZWVwKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBpbnQgdGltZW91dCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWFkZF93YWl0X3F1ZXVlKCZkZXYtPnRocmVhZC53cSwgJndhaXQpOworCWlmIChkZXYtPnRocmVhZC5zY2FuMSA9PSBkZXYtPnRocmVhZC5zY2FuMiAmJiAhZGV2LT50aHJlYWQuc2h1dGRvd24pIHsKKwkJaWYgKHRpbWVvdXQgPCAwKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGUoKTsKKwkJfSBlbHNlIHsKKyNpZiAwCisJCQkvKiBobW0sIHRoYXQgb25lIGRvZXNuJ3QgcmV0dXJuIG9uIHdha2V1cCAuLi4gKi8KKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHRpbWVvdXQpOworI2Vsc2UKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOworI2VuZGlmCisJCX0KKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+dGhyZWFkLndxLCAmd2FpdCk7CisJcmV0dXJuIGRldi0+dGhyZWFkLnNjYW4xICE9IGRldi0+dGhyZWFkLnNjYW4yOworfQorCitzdGF0aWMgaW50IHR2YXVkaW9fY2hlY2tjYXJyaWVyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3QgbWFpbnNjYW4gKnNjYW4pCit7CisJX19zMzIgbGVmdCxyaWdodCx2YWx1ZTsKKworCWlmIChhdWRpb19kZWJ1ZyA+IDEpIHsKKwkJaW50IGk7CisJCWRwcmludGsoImRlYnVnICVkOiIsc2Nhbi0+Y2Fycik7CisJCWZvciAoaSA9IC0xNTA7IGkgPD0gMTUwOyBpICs9IDMwKSB7CisJCQl0dmF1ZGlvX3NldGNhcnJpZXIoZGV2LHNjYW4tPmNhcnIraSxzY2FuLT5jYXJyK2kpOworCQkJc2FhX3JlYWRsKFNBQTcxMzRfTEVWRUxfUkVBRE9VVDEgPj4gMik7CisJCQlpZiAodHZhdWRpb19zbGVlcChkZXYsU0NBTl9TQU1QTEVfREVMQVkpKQorCQkJCXJldHVybiAtMTsKKwkJCXZhbHVlID0gc2FhX3JlYWRsKFNBQTcxMzRfTEVWRUxfUkVBRE9VVDEgPj4gMik7CisJCQlpZiAoMCA9PSBpKQorCQkJCXByaW50aygiICAjICAlNmQgICMgIix2YWx1ZSA+PiAxNik7CisJCQllbHNlCisJCQkJcHJpbnRrKCIgJTZkIix2YWx1ZSA+PiAxNik7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKworCWlmIChkZXYtPnR2bm9ybS0+aWQgJiBzY2FuLT5zdGQpIHsKKwkJdHZhdWRpb19zZXRjYXJyaWVyKGRldixzY2FuLT5jYXJyLTkwLHNjYW4tPmNhcnItOTApOworCQlzYWFfcmVhZGwoU0FBNzEzNF9MRVZFTF9SRUFET1VUMSA+PiAyKTsKKwkJaWYgKHR2YXVkaW9fc2xlZXAoZGV2LFNDQU5fU0FNUExFX0RFTEFZKSkKKwkJCXJldHVybiAtMTsKKwkJbGVmdCA9IHNhYV9yZWFkbChTQUE3MTM0X0xFVkVMX1JFQURPVVQxID4+IDIpOworCisJCXR2YXVkaW9fc2V0Y2FycmllcihkZXYsc2Nhbi0+Y2Fycis5MCxzY2FuLT5jYXJyKzkwKTsKKwkJc2FhX3JlYWRsKFNBQTcxMzRfTEVWRUxfUkVBRE9VVDEgPj4gMik7CisJCWlmICh0dmF1ZGlvX3NsZWVwKGRldixTQ0FOX1NBTVBMRV9ERUxBWSkpCisJCQlyZXR1cm4gLTE7CisJCXJpZ2h0ID0gc2FhX3JlYWRsKFNBQTcxMzRfTEVWRUxfUkVBRE9VVDEgPj4gMik7CisKKwkJbGVmdCA+Pj0gMTY7CisJCXJpZ2h0ID4+PSAxNjsKKwkJdmFsdWUgPSBsZWZ0ID4gcmlnaHQgPyBsZWZ0IC0gcmlnaHQgOiByaWdodCAtIGxlZnQ7CisJCWRwcmludGsoInNjYW5uaW5nICVkLiUwM2QgTUh6IFslNHNdID0+ICBkYyBpcyAlNWQgWyVkLyVkXVxuIiwKKwkJCXNjYW4tPmNhcnIgLyAxMDAwLCBzY2FuLT5jYXJyICUgMTAwMCwKKwkJCXNjYW4tPm5hbWUsIHZhbHVlLCBsZWZ0LCByaWdodCk7CisJfSBlbHNlIHsKKwkJdmFsdWUgPSAwOworCQlkcHJpbnRrKCJza2lwcGluZyAlZC4lMDNkIE1IeiBbJTRzXVxuIiwKKwkJCXNjYW4tPmNhcnIgLyAxMDAwLCBzY2FuLT5jYXJyICUgMTAwMCwgc2Nhbi0+bmFtZSk7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHNpZmRlYnVnX2R1bXBfcmVncyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlwcmludF9yZWdiKEFVRElPX1NUQVRVUyk7CisJcHJpbnRfcmVnYihJREVOVF9TSUYpOworCXByaW50X3JlZ2IoTEVWRUxfUkVBRE9VVDEpOworCXByaW50X3JlZ2IoTEVWRUxfUkVBRE9VVDIpOworCXByaW50X3JlZ2IoRENYT19JREVOVF9DVFJMKTsKKwlwcmludF9yZWdiKERFTU9EVUxBVE9SKTsKKwlwcmludF9yZWdiKEFHQ19HQUlOX1NFTEVDVCk7CisJcHJpbnRfcmVnYihNT05JVE9SX1NFTEVDVCk7CisJcHJpbnRfcmVnYihGTV9ERUVNUEhBU0lTKTsKKwlwcmludF9yZWdiKEZNX0RFTUFUUklYKTsKKwlwcmludF9yZWdiKFNJRl9TQU1QTEVfRlJFUSk7CisJcHJpbnRfcmVnYihBTkFMT0dfSU9fU0VMRUNUKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHR2YXVkaW9fZ2V0c3RlcmVvKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF90dmF1ZGlvICphdWRpbykKK3sKKwlfX3UzMiBpZHAsbmljYW07CisJaW50IHJldHZhbCA9IC0xOworCisJc3dpdGNoIChhdWRpby0+bW9kZSkgeworCWNhc2UgVFZBVURJT19GTV9NT05POgorCQlyZXR1cm4gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwljYXNlIFRWQVVESU9fRk1fS19TVEVSRU86CisJY2FzZSBUVkFVRElPX0ZNX0JHX1NURVJFTzoKKwkJaWRwID0gKHNhYV9yZWFkYihTQUE3MTM0X0lERU5UX1NJRikgJiAweGUwKSA+PiA1OworCQlkcHJpbnRrKCJnZXRzdGVyZW86IGZtL3N0ZXJlbzogaWRwPTB4JXhcbiIsaWRwKTsKKwkJaWYgKDB4MDMgPT0gKGlkcCAmIDB4MDMpKQorCQkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTEFORzEgfCBWNEwyX1RVTkVSX1NVQl9MQU5HMjsKKwkJZWxzZSBpZiAoMHgwNSA9PSAoaWRwICYgMHgwNSkpCisJCQlyZXR2YWwgPSBWNEwyX1RVTkVSX1NVQl9NT05PIHwgVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworCQllbHNlIGlmICgweDAxID09IChpZHAgJiAweDAxKSkKKwkJCXJldHZhbCA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJCWJyZWFrOworCWNhc2UgVFZBVURJT19GTV9TQVRfU1RFUkVPOgorCQkvKiBub3QgaW1wbGVtZW50ZWQgKHlldCkgKi8KKwkJYnJlYWs7CisJY2FzZSBUVkFVRElPX05JQ0FNX0ZNOgorCWNhc2UgVFZBVURJT19OSUNBTV9BTToKKwkJbmljYW0gPSBzYWFfcmVhZGIoU0FBNzEzNF9OSUNBTV9TVEFUVVMpOworCQlkcHJpbnRrKCJnZXRzdGVyZW86IG5pY2FtPTB4JXhcbiIsbmljYW0pOworCQlzd2l0Y2ggKG5pY2FtICYgMHgwYikgeworCQljYXNlIDB4MDk6CisJCQlyZXR2YWwgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8IFY0TDJfVFVORVJfU1VCX0xBTkcyOworCQkJYnJlYWs7CisJCWNhc2UgMHgwYToKKwkJCXJldHZhbCA9IFY0TDJfVFVORVJfU1VCX01PTk8gfCBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJCQlicmVhazsKKwkJY2FzZSAweDA4OgorCQlkZWZhdWx0OgorCQkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAocmV0dmFsICE9IC0xKQorCQlkcHJpbnRrKCJmb3VuZCBhdWRpbyBzdWJjaGFubmVsczolcyVzJXMlc1xuIiwKKwkJCShyZXR2YWwgJiBWNEwyX1RVTkVSX1NVQl9NT05PKSAgID8gIiBtb25vIiAgIDogIiIsCisJCQkocmV0dmFsICYgVjRMMl9UVU5FUl9TVUJfU1RFUkVPKSA/ICIgc3RlcmVvIiA6ICIiLAorCQkJKHJldHZhbCAmIFY0TDJfVFVORVJfU1VCX0xBTkcxKSAgPyAiIGxhbmcxIiAgOiAiIiwKKwkJCShyZXR2YWwgJiBWNEwyX1RVTkVSX1NVQl9MQU5HMikgID8gIiBsYW5nMiIgIDogIiIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdHZhdWRpb19zZXRzdGVyZW8oc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHN0cnVjdCBzYWE3MTM0X3R2YXVkaW8gKmF1ZGlvLAorCQkJICAgICB1MzIgbW9kZSkKK3sKKwlzdGF0aWMgY2hhciAqbmFtZVtdID0geworCQlbIFY0TDJfVFVORVJfTU9ERV9NT05PICAgXSA9ICJtb25vIiwKKwkJWyBWNEwyX1RVTkVSX01PREVfU1RFUkVPIF0gPSAic3RlcmVvIiwKKwkJWyBWNEwyX1RVTkVSX01PREVfTEFORzEgIF0gPSAibGFuZzEiLAorCQlbIFY0TDJfVFVORVJfTU9ERV9MQU5HMiAgXSA9ICJsYW5nMiIsCisJfTsKKwlzdGF0aWMgdTMyIGZtW10gPSB7CisJCVsgVjRMMl9UVU5FUl9NT0RFX01PTk8gICBdID0gMHgwMCwgIC8qIGNoMSAgKi8KKwkJWyBWNEwyX1RVTkVSX01PREVfU1RFUkVPIF0gPSAweDgwLCAgLyogYXV0byAqLworCQlbIFY0TDJfVFVORVJfTU9ERV9MQU5HMSAgXSA9IDB4MDAsICAvKiBjaDEgICovCisJCVsgVjRMMl9UVU5FUl9NT0RFX0xBTkcyICBdID0gMHgwMSwgIC8qIGNoMiAgKi8KKwl9OworCXUzMiByZWc7CisKKwlzd2l0Y2ggKGF1ZGlvLT5tb2RlKSB7CisJY2FzZSBUVkFVRElPX0ZNX01PTk86CisJCS8qIG5vdGhpbmcgdG8gZG8gLi4uICovCisJCWJyZWFrOworCWNhc2UgVFZBVURJT19GTV9LX1NURVJFTzoKKwljYXNlIFRWQVVESU9fRk1fQkdfU1RFUkVPOgorCQlkcHJpbnRrKCJzZXRzdGVyZW8gW2ZtXSA9PiAlc1xuIiwKKwkJCW5hbWVbIG1vZGUgJSBBUlJBWV9TSVpFKG5hbWUpIF0pOworCQlyZWcgPSBmbVsgbW9kZSAlIEFSUkFZX1NJWkUoZm0pIF07CisJCXNhYV93cml0ZWIoU0FBNzEzNF9GTV9ERU1BVFJJWCwgcmVnKTsKKwkJYnJlYWs7CisJY2FzZSBUVkFVRElPX0ZNX1NBVF9TVEVSRU86CisJY2FzZSBUVkFVRElPX05JQ0FNX0FNOgorCWNhc2UgVFZBVURJT19OSUNBTV9GTToKKwkJLyogRklYTUUgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR2YXVkaW9fdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBkYXRhOworCWludCBjYXJyX3ZhbHNbQVJSQVlfU0laRShtYWluc2NhbildOworCXVuc2lnbmVkIGludCBpLCBhdWRpbywgbnNjYW47CisJaW50IG1heDEsbWF4MixjYXJyaWVyLHJ4LG1vZGUsbGFzdG1vZGUsZGVmYXVsdF9jYXJyaWVyOworCisJZGFlbW9uaXplKCIlcyIsIGRldi0+bmFtZSk7CisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCWZvciAoOzspIHsKKwkJdHZhdWRpb19zbGVlcChkZXYsLTEpOworCQlpZiAoZGV2LT50aHJlYWQuc2h1dGRvd24gfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlnb3RvIGRvbmU7CisKKwlyZXN0YXJ0OgorCQlkZXYtPnRocmVhZC5zY2FuMSA9IGRldi0+dGhyZWFkLnNjYW4yOworCQlkcHJpbnRrKCJ0dmF1ZGlvIHRocmVhZCBzY2FuIHN0YXJ0IFslZF1cbiIsZGV2LT50aHJlYWQuc2NhbjEpOworCQlkZXYtPnR2YXVkaW8gID0gTlVMTDsKKwkJdHZhdWRpb19pbml0KGRldik7CisJCWlmIChkZXYtPmN0bF9hdXRvbXV0ZSkKKwkJCWRldi0+YXV0b211dGUgPSAxOworCQltdXRlX2lucHV0XzcxMzQoZGV2KTsKKworCQkvKiBnaXZlIHRoZSB0dW5lciBzb21lIHRpbWUgKi8KKwkJaWYgKHR2YXVkaW9fc2xlZXAoZGV2LFNDQU5fSU5JVElBTF9ERUxBWSkpCisJCQlnb3RvIHJlc3RhcnQ7CisKKwkJbWF4MSA9IDA7CisJCW1heDIgPSAwOworCQluc2NhbiA9IDA7CisJCWNhcnJpZXIgPSAwOworCQlkZWZhdWx0X2NhcnJpZXIgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYWluc2Nhbik7IGkrKykgeworCQkJaWYgKCEoZGV2LT50dm5vcm0tPmlkICYgbWFpbnNjYW5baV0uc3RkKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghZGVmYXVsdF9jYXJyaWVyKQorCQkJCWRlZmF1bHRfY2FycmllciA9IG1haW5zY2FuW2ldLmNhcnI7CisJCQluc2NhbisrOworCQl9CisKKwkJaWYgKDEgPT0gbnNjYW4pIHsKKwkJCS8qIG9ubHkgb25lIGNhbmRpZGF0ZSAtLSBza2lwIHNjYW4gOykgKi8KKwkJCW1heDEgPSAxMjM0NTsKKwkJCWNhcnJpZXIgPSBkZWZhdWx0X2NhcnJpZXI7CisJCX0gZWxzZSB7CisJCQkvKiBzY2FuIGZvciB0aGUgbWFpbiBjYXJyaWVyICovCisJCQlzYWFfd3JpdGViKFNBQTcxMzRfTU9OSVRPUl9TRUxFQ1QsMHgwMCk7CisJCQl0dmF1ZGlvX3NldG1vZGUoZGV2LCZ0dmF1ZGlvWzBdLE5VTEwpOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWFpbnNjYW4pOyBpKyspIHsKKwkJCQljYXJyX3ZhbHNbaV0gPSB0dmF1ZGlvX2NoZWNrY2FycmllcihkZXYsIG1haW5zY2FuK2kpOworCQkJCWlmIChkZXYtPnRocmVhZC5zY2FuMSAhPSBkZXYtPnRocmVhZC5zY2FuMikKKwkJCQkJZ290byByZXN0YXJ0OworCQkJfQorCQkJZm9yIChtYXgxID0gMCwgbWF4MiA9IDAsIGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYWluc2Nhbik7IGkrKykgeworCQkJCWlmIChtYXgxIDwgY2Fycl92YWxzW2ldKSB7CisJCQkJCW1heDIgPSBtYXgxOworCQkJCQltYXgxID0gY2Fycl92YWxzW2ldOworCQkJCQljYXJyaWVyID0gbWFpbnNjYW5baV0uY2FycjsKKwkJCQl9IGVsc2UgaWYgKG1heDIgPCBjYXJyX3ZhbHNbaV0pIHsKKwkJCQkJbWF4MiA9IGNhcnJfdmFsc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoMCAhPSBjYXJyaWVyICYmIG1heDEgPiAyMDAwICYmIG1heDEgPiBtYXgyKjMpIHsKKwkJCS8qIGZvdW5kIGdvb2QgY2FycmllciAqLworCQkJZHByaW50aygiZm91bmQgJXMgbWFpbiBzb3VuZCBjYXJyaWVyIEAgJWQuJTAzZCBNSHogWyVkLyVkXVxuIiwKKwkJCQlkZXYtPnR2bm9ybS0+bmFtZSwgY2Fycmllci8xMDAwLCBjYXJyaWVyJTEwMDAsCisJCQkJbWF4MSwgbWF4Mik7CisJCQlkZXYtPmxhc3RfY2FycmllciA9IGNhcnJpZXI7CisKKwkJfSBlbHNlIGlmICgwICE9IGRldi0+bGFzdF9jYXJyaWVyKSB7CisJCQkvKiBubyBjYXJyaWVyIC0tIHRyeSBsYXN0IGRldGVjdGVkIG9uZSBhcyBmYWxsYmFjayAqLworCQkJY2FycmllciA9IGRldi0+bGFzdF9jYXJyaWVyOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMvYXVkaW86IGF1ZGlvIGNhcnJpZXIgc2NhbiBmYWlsZWQsICIKKwkJCSAgICAgICAidXNpbmcgJWQuJTAzZCBNSHogW2xhc3QgZGV0ZWN0ZWRdXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgY2Fycmllci8xMDAwLCBjYXJyaWVyJTEwMDApOworCisJCX0gZWxzZSB7CisJCQkvKiBubyBjYXJyaWVyICsgbm8gZmFsbGJhY2sgLS0gdXNlIGRlZmF1bHQgKi8KKwkJCWNhcnJpZXIgPSBkZWZhdWx0X2NhcnJpZXI7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy9hdWRpbzogYXVkaW8gY2FycmllciBzY2FuIGZhaWxlZCwgIgorCQkJICAgICAgICJ1c2luZyAlZC4lMDNkIE1IeiBbZGVmYXVsdF1cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBjYXJyaWVyLzEwMDAsIGNhcnJpZXIlMTAwMCk7CisJCX0KKwkJdHZhdWRpb19zZXRjYXJyaWVyKGRldixjYXJyaWVyLGNhcnJpZXIpOworCQlkZXYtPmF1dG9tdXRlID0gMDsKKwkJc2FhX2FuZG9yYihTQUE3MTM0X1NURVJFT19EQUNfT1VUUFVUX1NFTEVDVCwgMHgzMCwgMHgwMCk7CisJCXNhYTcxMzRfdHZhdWRpb19zZXRtdXRlKGRldik7CisKKwkJLyogZmluZCB0aGUgZXhhY3QgdHYgYXVkaW8gbm9ybSAqLworCQlmb3IgKGF1ZGlvID0gVU5TRVQsIGkgPSAwOyBpIDwgVFZBVURJTzsgaSsrKSB7CisJCQlpZiAoZGV2LT50dm5vcm0tPmlkICE9IFVOU0VUICYmCisJCQkgICAgIShkZXYtPnR2bm9ybS0+aWQgJiB0dmF1ZGlvW2ldLnN0ZCkpCisJCQkJY29udGludWU7CisJCQlpZiAodHZhdWRpb1tpXS5jYXJyMSAhPSBjYXJyaWVyKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoVU5TRVQgPT0gYXVkaW8pCisJCQkJYXVkaW8gPSBpOworCQkJdHZhdWRpb19zZXRtb2RlKGRldiwmdHZhdWRpb1tpXSwidHJ5aW5nIik7CisJCQlpZiAodHZhdWRpb19zbGVlcChkZXYsU0NBTl9TVUJDQVJSSUVSX0RFTEFZKSkKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQlpZiAoLTEgIT0gdHZhdWRpb19nZXRzdGVyZW8oZGV2LCZ0dmF1ZGlvW2ldKSkgeworCQkJCWF1ZGlvID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlzYWFfYW5kb3JiKFNBQTcxMzRfU1RFUkVPX0RBQ19PVVRQVVRfU0VMRUNULCAweDMwLCAweDMwKTsKKwkJaWYgKFVOU0VUID09IGF1ZGlvKQorCQkJY29udGludWU7CisJCXR2YXVkaW9fc2V0bW9kZShkZXYsJnR2YXVkaW9bYXVkaW9dLCJ1c2luZyIpOworCQl0dmF1ZGlvX3NldHN0ZXJlbyhkZXYsJnR2YXVkaW9bYXVkaW9dLFY0TDJfVFVORVJfTU9ERV9NT05PKTsKKwkJZGV2LT50dmF1ZGlvID0gJnR2YXVkaW9bYXVkaW9dOworCisJCWxhc3Rtb2RlID0gNDI7CisJCWZvciAoOzspIHsKKwkJCWlmICh0dmF1ZGlvX3NsZWVwKGRldiw1MDAwKSkKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQlpZiAoZGV2LT50aHJlYWQuc2h1dGRvd24gfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJYnJlYWs7CisJCQlpZiAoVU5TRVQgPT0gZGV2LT50aHJlYWQubW9kZSkgeworCQkJCXJ4ID0gdHZhdWRpb19nZXRzdGVyZW8oZGV2LCZ0dmF1ZGlvW2ldKTsKKwkJCQltb2RlID0gc2FhNzEzNF90dmF1ZGlvX3J4Mm1vZGUocngpOworCQkJfSBlbHNlIHsKKwkJCQltb2RlID0gZGV2LT50aHJlYWQubW9kZTsKKwkJCX0KKwkJCWlmIChsYXN0bW9kZSAhPSBtb2RlKSB7CisJCQkJdHZhdWRpb19zZXRzdGVyZW8oZGV2LCZ0dmF1ZGlvW2F1ZGlvXSxtb2RlKTsKKwkJCQlsYXN0bW9kZSA9IG1vZGU7CisJCQl9CisJCX0KKwl9CisKKyBkb25lOgorCWNvbXBsZXRlX2FuZF9leGl0KCZkZXYtPnRocmVhZC5leGl0LCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBzYWE3MTMzIC8gc2FhNzEzNSBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGNoYXIgKnN0ZHJlc1sweDIwXSA9IHsKKwlbMHgwMF0gPSAibm8gc3RhbmRhcmQgZGV0ZWN0ZWQiLAorCVsweDAxXSA9ICJCL0cgKGluIHByb2dyZXNzKSIsCisJWzB4MDJdID0gIkQvSyAoaW4gcHJvZ3Jlc3MpIiwKKwlbMHgwM10gPSAiTSAoaW4gcHJvZ3Jlc3MpIiwKKworCVsweDA0XSA9ICJCL0cgQTIiLAorCVsweDA1XSA9ICJCL0cgTklDQU0iLAorCVsweDA2XSA9ICJEL0sgQTIgKDEpIiwKKwlbMHgwN10gPSAiRC9LIEEyICgyKSIsCisJWzB4MDhdID0gIkQvSyBBMiAoMykiLAorCVsweDA5XSA9ICJEL0sgTklDQU0iLAorCVsweDBhXSA9ICJMIE5JQ0FNIiwKKwlbMHgwYl0gPSAiSSBOSUNBTSIsCisKKwlbMHgwY10gPSAiTSBLb3JlYSIsCisJWzB4MGRdID0gIk0gQlRTQyAiLAorCVsweDBlXSA9ICJNIEVJQUoiLAorCisJWzB4MGZdID0gIkZNIHJhZGlvIC8gSUYgMTAuNyAvIDUwIGRlZW1wIiwKKwlbMHgxMF0gPSAiRk0gcmFkaW8gLyBJRiAxMC43IC8gNzUgZGVlbXAiLAorCVsweDExXSA9ICJGTSByYWRpbyAvIElGIHNlbCAvIDUwIGRlZW1wIiwKKwlbMHgxMl0gPSAiRk0gcmFkaW8gLyBJRiBzZWwgLyA3NSBkZWVtcCIsCisKKwlbMHgxMyAuLi4gMHgxZSBdID0gInVua25vd24iLAorCVsweDFmXSA9ICI/Pz8gW2luIHByb2dyZXNzXSIsCit9OworCisjZGVmaW5lIERTUF9SRVRSWSAzMgorI2RlZmluZSBEU1BfREVMQVkgMTYKKworc3RhdGljIGlubGluZSBpbnQgc2FhX2RzcF93YWl0X2JpdChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IGJpdCkKK3sKKwlpbnQgc3RhdGUsIGNvdW50ID0gRFNQX1JFVFJZOworCisJc3RhdGUgPSBzYWFfcmVhZGIoU0FBNzEzNV9EU1BfUldTVEFURSk7CisJaWYgKHVubGlrZWx5KHN0YXRlICYgU0FBNzEzNV9EU1BfUldTVEFURV9FUlIpKSB7CisJCXByaW50aygiJXM6IGRzcCBhY2Nlc3MgZXJyb3JcbiIsZGV2LT5uYW1lKTsKKwkJLyogRklYTUU6IHNlbmQgYWNrIC4uLiAqLworCQlyZXR1cm4gLUVJTzsKKwl9CisJd2hpbGUgKDAgPT0gKHN0YXRlICYgYml0KSkgeworCQlpZiAodW5saWtlbHkoMCA9PSBjb3VudCkpIHsKKwkJCXByaW50aygiJXM6IGRzcCBhY2Nlc3Mgd2FpdCB0aW1lb3V0IFtiaXQ9JXNdXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwKKwkJCSAgICAgICAoYml0ICYgU0FBNzEzNV9EU1BfUldTVEFURV9XUlIpID8gIldSUiIgOgorCQkJICAgICAgIChiaXQgJiBTQUE3MTM1X0RTUF9SV1NUQVRFX1JEQikgPyAiUkRCIiA6CisJCQkgICAgICAgKGJpdCAmIFNBQTcxMzVfRFNQX1JXU1RBVEVfSURBKSA/ICJJREEiIDoKKwkJCSAgICAgICAiPz8/Iik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlzYWFfd2FpdChEU1BfREVMQVkpOworCQlzdGF0ZSA9IHNhYV9yZWFkYihTQUE3MTM1X0RTUF9SV1NUQVRFKTsKKwkJY291bnQtLTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IHNhYV9kc3BfcmVhZGwoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCByZWcsIHUzMiAqdmFsdWUpCit7CisJaW50IGVycjsKKworCWQycHJpbnRrKCJkc3AgcmVhZCByZWcgMHgleFxuIiwgcmVnPDwyKTsKKwlzYWFfcmVhZGwocmVnKTsKKwllcnIgPSBzYWFfZHNwX3dhaXRfYml0KGRldixTQUE3MTM1X0RTUF9SV1NUQVRFX1JEQik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJKnZhbHVlID0gc2FhX3JlYWRsKHJlZyk7CisJZDJwcmludGsoImRzcCByZWFkICAgPT4gMHglMDZ4XG4iLCAqdmFsdWUgJiAweGZmZmZmZik7CisJZXJyID0gc2FhX2RzcF93YWl0X2JpdChkZXYsU0FBNzEzNV9EU1BfUldTVEFURV9JREEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBzYWFfZHNwX3dyaXRlbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IHJlZywgdTMyIHZhbHVlKQoreworCWludCBlcnI7CisKKwlkMnByaW50aygiZHNwIHdyaXRlIHJlZyAweCV4ID0gMHglMDZ4XG4iLHJlZzw8Mix2YWx1ZSk7CisJZXJyID0gc2FhX2RzcF93YWl0X2JpdChkZXYsU0FBNzEzNV9EU1BfUldTVEFURV9XUlIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXNhYV93cml0ZWwocmVnLHZhbHVlKTsKKwllcnIgPSBzYWFfZHNwX3dhaXRfYml0KGRldixTQUE3MTM1X0RTUF9SV1NUQVRFX1dSUik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0c3RlcmVvXzcxMzMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJaW50IHJldHZhbCA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJdTMyIHZhbHVlOworCisJdmFsdWUgPSBzYWFfcmVhZGwoMHg1MjggPj4gMik7CisJaWYgKHZhbHVlICYgMHgyMCkKKwkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwlpZiAodmFsdWUgJiAweDQwKQorCQlyZXR2YWwgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8IFY0TDJfVFVORVJfU1VCX0xBTkcyOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgbXV0ZV9pbnB1dF83MTMzKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworCXUzMiByZWcgPSAwOworCWludCBtYXNrOworCisJc3dpdGNoIChkZXYtPmlucHV0LT5hbXV4KSB7CisJY2FzZSBUVjoKKwkJcmVnID0gMHgwMjsKKwkJYnJlYWs7CisJY2FzZSBMSU5FMToKKwkJcmVnID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSBMSU5FMjoKKwljYXNlIExJTkUyX0xFRlQ6CisJCXJlZyA9IDB4MDE7CisJCWJyZWFrOworCX0KKwlpZiAoZGV2LT5jdGxfbXV0ZSkKKwkJcmVnID0gMHgwNzsKKwlzYWFfd3JpdGVsKDB4NTk0ID4+IDIsIHJlZyk7CisKKwkvKiBzd2l0Y2ggZ3Bpby1jb25uZWN0ZWQgZXh0ZXJuYWwgYXVkaW8gbXV4ICovCisgICAgICAgIGlmICgwICE9IGNhcmQoZGV2KS5ncGlvbWFzaykgeworICAgICAgICAJbWFzayA9IGNhcmQoZGV2KS5ncGlvbWFzazsKKyAgICAgICAgCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQTU9ERTAgPj4gMiwgICBtYXNrLCBtYXNrKTsKKyAgICAgICAgCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCBtYXNrLCBkZXYtPmlucHV0LT5ncGlvKTsKKyAgICAgICAgCXNhYTcxMzRfdHJhY2tfZ3BpbyhkZXYsZGV2LT5pbnB1dC0+bmFtZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR2YXVkaW9fdGhyZWFkX2RkZXAodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGRhdGE7CisJdTMyIHZhbHVlLCBub3JtcywgY2xvY2s7CisKKwlkYWVtb25pemUoIiVzIiwgZGV2LT5uYW1lKTsKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisKKwljbG9jayA9IHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLmF1ZGlvX2Nsb2NrOworCWlmIChVTlNFVCAhPSBhdWRpb19jbG9ja19vdmVycmlkZSkKKwkJY2xvY2sgPSBhdWRpb19jbG9ja19vdmVycmlkZTsKKwlzYWFfd3JpdGVsKDB4NTk4ID4+IDIsIGNsb2NrKTsKKworCS8qIHVubXV0ZSAqLworCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NzQgPj4gMiwgMHgwMCk7CisJc2FhX2RzcF93cml0ZWwoZGV2LCAweDQ1MCA+PiAyLCAweDAwKTsKKworCWZvciAoOzspIHsKKwkJdHZhdWRpb19zbGVlcChkZXYsLTEpOworCQlpZiAoZGV2LT50aHJlYWQuc2h1dGRvd24gfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlnb3RvIGRvbmU7CisKKwlyZXN0YXJ0OgorCQlkZXYtPnRocmVhZC5zY2FuMSA9IGRldi0+dGhyZWFkLnNjYW4yOworCQlkcHJpbnRrKCJ0dmF1ZGlvIHRocmVhZCBzY2FuIHN0YXJ0IFslZF1cbiIsZGV2LT50aHJlYWQuc2NhbjEpOworCisJCWlmIChhdWRpb19kZGVwID49IDB4MDQgJiYgYXVkaW9fZGRlcCA8PSAweDBlKSB7CisJCQkvKiBpbnNtb2Qgb3B0aW9uIG92ZXJyaWRlICovCisJCQlub3JtcyA9IChhdWRpb19kZGVwIDw8IDIpIHwgMHgwMTsKKwkJCWRwcmludGsoImRkZXAgb3ZlcnJpZGU6ICVzXG4iLHN0ZHJlc1thdWRpb19kZGVwXSk7CisJCX0gZWxzZSBpZiAoJmNhcmQoZGV2KS5yYWRpbyA9PSBkZXYtPmlucHV0KSB7CisJCQlkcHJpbnRrKCJGTSBSYWRpb1xuIik7CisJCQlub3JtcyA9ICgweDBmIDw8IDIpIHwgMHgwMTsKKwkJfSBlbHNlIHsKKwkJCS8qIChsZXQgY2hpcCkgc2NhbiBmb3Igc291bmQgY2FycmllciAqLworCQkJbm9ybXMgPSAwOworCQkJaWYgKGRldi0+dHZub3JtLT5pZCAmIFY0TDJfU1REX1BBTCkgeworCQkJCWRwcmludGsoIlBBTCBzY2FuXG4iKTsKKwkJCQlub3JtcyB8PSAweDJjOyAvKiBCL0cgKyBEL0sgKyBJICovCisJCQl9CisJCQlpZiAoZGV2LT50dm5vcm0tPmlkICYgVjRMMl9TVERfTlRTQykgeworCQkJCWRwcmludGsoIk5UU0Mgc2NhblxuIik7CisJCQkJbm9ybXMgfD0gMHg0MDsgLyogTSAqLworCQkJfQorCQkJaWYgKGRldi0+dHZub3JtLT5pZCAmIFY0TDJfU1REX1NFQ0FNKSB7CisJCQkJZHByaW50aygiU0VDQU0gc2NhblxuIik7CisJCQkJbm9ybXMgfD0gMHgxODsgLyogTCArIEQvSyAqLworCQkJfQorCQkJaWYgKDAgPT0gbm9ybXMpCisJCQkJbm9ybXMgPSAweDdjOyAvKiBhbGwgKi8KKwkJCWRwcmludGsoInNjYW5uaW5nOiVzJXMlcyVzJXNcbiIsCisJCQkJKG5vcm1zICYgMHgwNCkgPyAiIEIvRyIgIDogIiIsCisJCQkJKG5vcm1zICYgMHgwOCkgPyAiIEQvSyIgIDogIiIsCisJCQkJKG5vcm1zICYgMHgxMCkgPyAiIEwvTCciIDogIiIsCisJCQkJKG5vcm1zICYgMHgyMCkgPyAiIEkiICAgIDogIiIsCisJCQkJKG5vcm1zICYgMHg0MCkgPyAiIE0iICAgIDogIiIpOworCQl9CisKKwkJLyoga2ljayBhdXRvbWF0aWMgc3RhbmRhcmQgZGV0ZWN0aW9uICovCisJCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NTQgPj4gMiwgMCk7CisJCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NTQgPj4gMiwgbm9ybXMgfCAweDgwKTsKKworCQkvKiBzZXR1cCBjcm9zc2JhcnMgKi8KKwkJc2FhX2RzcF93cml0ZWwoZGV2LCAweDQ2NCA+PiAyLCAweDAwMDAwMCk7CisJCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NzAgPj4gMiwgMHgxMDEwMTApOworCisJCWlmICh0dmF1ZGlvX3NsZWVwKGRldiwzMDAwKSkKKwkJCWdvdG8gcmVzdGFydDsKKwkJdmFsdWUgPSBzYWFfcmVhZGwoMHg1MjggPj4gMikgJiAweGZmZmZmZjsKKworCQlkcHJpbnRrKCJ0dmF1ZGlvIHRocmVhZCBzdGF0dXM6IDB4JXggWyVzJXMlc11cbiIsCisJCQl2YWx1ZSwgc3RkcmVzW3ZhbHVlICYgMHgxZl0sCisJCQkodmFsdWUgJiAweDAwMDAyMCkgPyAiLHN0ZXJlbyIgOiAiIiwKKwkJCSh2YWx1ZSAmIDB4MDAwMDQwKSA/ICIsZHVhbCIgICA6ICIiKTsKKwkJZHByaW50aygiZGV0YWlsZWQgc3RhdHVzOiAiCisJCQkiJXMjJXMjJXMjJXMjJXMjJXMjJXMjJXMjJXMjJXMjJXMjJXMjJXMjJXNcbiIsCisJCQkodmFsdWUgJiAweDAwMDA4MCkgPyAiIEEyL0VJQUogcGlsb3QgdG9uZSAiICAgICA6ICIiLAorCQkJKHZhbHVlICYgMHgwMDAxMDApID8gIiBBMi9FSUFKIGR1YWwgIiAgICAgICAgICAgOiAiIiwKKwkJCSh2YWx1ZSAmIDB4MDAwMjAwKSA/ICIgQTIvRUlBSiBzdGVyZW8gIiAgICAgICAgIDogIiIsCisJCQkodmFsdWUgJiAweDAwMDQwMCkgPyAiIEEyL0VJQUogbm9pc2UgbXV0ZSAiICAgICA6ICIiLAorCisJCQkodmFsdWUgJiAweDAwMDgwMCkgPyAiIEJUU0MvRk0gcmFkaW8gcGlsb3QgIiAgICA6ICIiLAorCQkJKHZhbHVlICYgMHgwMDEwMDApID8gIiBTQVAgY2FycmllciAiICAgICAgICAgICAgOiAiIiwKKwkJCSh2YWx1ZSAmIDB4MDAyMDAwKSA/ICIgQlRTQyBzdGVyZW8gbm9pc2UgbXV0ZSAiIDogIiIsCisJCQkodmFsdWUgJiAweDAwNDAwMCkgPyAiIFNBUCBub2lzZSBtdXRlICIgICAgICAgICA6ICIiLAorCQkJKHZhbHVlICYgMHgwMDgwMDApID8gIiBWRFNQICIgICAgICAgICAgICAgICAgICAgOiAiIiwKKworCQkJKHZhbHVlICYgMHgwMTAwMDApID8gIiBOSUNTVCAiICAgICAgICAgICAgICAgICAgOiAiIiwKKwkJCSh2YWx1ZSAmIDB4MDIwMDAwKSA/ICIgTklDRFUgIiAgICAgICAgICAgICAgICAgIDogIiIsCisJCQkodmFsdWUgJiAweDA0MDAwMCkgPyAiIE5JQ0FNIG11dGVkICIgICAgICAgICAgICA6ICIiLAorCQkJKHZhbHVlICYgMHgwODAwMDApID8gIiBOSUNBTSByZXNlcnZlIHNvdW5kICIgICAgOiAiIiwKKworCQkJKHZhbHVlICYgMHgxMDAwMDApID8gIiBpbml0IGRvbmUgIiAgICAgICAgICAgICAgOiAiIik7CisJfQorCisgZG9uZToKKwljb21wbGV0ZV9hbmRfZXhpdCgmZGV2LT50aHJlYWQuZXhpdCwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogY29tbW9uIHN0dWZmICsgZXh0ZXJuYWwgZW50cnkgcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyB2b2lkIHNhYTcxMzRfZW5hYmxlX2kycyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlpbnQgaTJzX2Zvcm1hdDsKKworCWlmICghY2FyZF9pc19lbXByZXNzKGRldikpCisJCXJldHVybjsKKwlpMnNfZm9ybWF0ID0gKGRldi0+aW5wdXQtPmFtdXggPT0gVFYpID8gMHgwMCA6IDB4MDE7CisKKwkvKiBlbmFibGUgSTJTIGF1ZGlvIG91dHB1dCBmb3IgdGhlIG1wZWcgZW5jb2RlciAqLworCXNhYV93cml0ZWIoU0FBNzEzNF9JMlNfT1VUUFVUX1NFTEVDVCwgIDB4ODApOworCXNhYV93cml0ZWIoU0FBNzEzNF9JMlNfT1VUUFVUX0ZPUk1BVCwgIGkyc19mb3JtYXQpOworCXNhYV93cml0ZWIoU0FBNzEzNF9JMlNfT1VUUFVUX0xFVkVMLCAgIDB4MEYpOworCXNhYV93cml0ZWIoU0FBNzEzNF9JMlNfQVVESU9fT1VUUFVULCAgIDB4MDEpOworfQorCitpbnQgc2FhNzEzNF90dmF1ZGlvX3J4Mm1vZGUodTMyIHJ4KQoreworCXUzMiBtb2RlOworCisJbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POworCWlmIChyeCAmIFY0TDJfVFVORVJfU1VCX1NURVJFTykKKwkJbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJZWxzZSBpZiAocnggJiBWNEwyX1RVTkVSX1NVQl9MQU5HMSkKKwkJbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMTsKKwllbHNlIGlmIChyeCAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKQorCQltb2RlID0gVjRMMl9UVU5FUl9NT0RFX0xBTkcyOworCXJldHVybiBtb2RlOworfQorCit2b2lkIHNhYTcxMzRfdHZhdWRpb19zZXRtdXRlKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworCXN3aXRjaCAoZGV2LT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNDoKKwkJbXV0ZV9pbnB1dF83MTM0KGRldik7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNToKKwkJbXV0ZV9pbnB1dF83MTMzKGRldik7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBzYWE3MTM0X3R2YXVkaW9fc2V0aW5wdXQoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsCisJCQkgICAgICBzdHJ1Y3Qgc2FhNzEzNF9pbnB1dCAqaW4pCit7CisJZGV2LT5pbnB1dCA9IGluOworCXN3aXRjaCAoZGV2LT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNDoKKwkJbXV0ZV9pbnB1dF83MTM0KGRldik7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNToKKwkJbXV0ZV9pbnB1dF83MTMzKGRldik7CisJCWJyZWFrOworCX0KKwlzYWE3MTM0X2VuYWJsZV9pMnMoZGV2KTsKK30KKwordm9pZCBzYWE3MTM0X3R2YXVkaW9fc2V0dm9sdW1lKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBpbnQgbGV2ZWwpCit7CisJc3dpdGNoIChkZXYtPnBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNDoKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0NIQU5ORUwxX0xFVkVMLCAgICAgbGV2ZWwgJiAweDFmKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0NIQU5ORUwyX0xFVkVMLCAgICAgbGV2ZWwgJiAweDFmKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X05JQ0FNX0xFVkVMX0FESlVTVCwgbGV2ZWwgJiAweDFmKTsKKwkJYnJlYWs7CisJfQorfQorCitpbnQgc2FhNzEzNF90dmF1ZGlvX2dldHN0ZXJlbyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlpbnQgcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKworCXN3aXRjaCAoZGV2LT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQ6CisJCWlmIChkZXYtPnR2YXVkaW8pCisJCQlyZXR2YWwgPSB0dmF1ZGlvX2dldHN0ZXJlbyhkZXYsZGV2LT50dmF1ZGlvKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM1OgorCQlyZXR2YWwgPSBnZXRzdGVyZW9fNzEzMyhkZXYpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IHNhYTcxMzRfdHZhdWRpb19pbml0MihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlERUNMQVJFX01VVEVYX0xPQ0tFRChzZW0pOworCWludCAoKm15X3RocmVhZCkodm9pZCAqZGF0YSkgPSBOVUxMOworCisJc3dpdGNoIChkZXYtPnBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNDoKKwkJbXlfdGhyZWFkID0gdHZhdWRpb190aHJlYWQ7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNToKKwkJbXlfdGhyZWFkID0gdHZhdWRpb190aHJlYWRfZGRlcDsKKwkJYnJlYWs7CisJfQorCisJZGV2LT50aHJlYWQucGlkID0gLTE7CisJaWYgKG15X3RocmVhZCkgeworCQkvKiBzdGFydCB0dmF1ZGlvIHRocmVhZCAqLworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnRocmVhZC53cSk7CisJCWluaXRfY29tcGxldGlvbigmZGV2LT50aHJlYWQuZXhpdCk7CisJCWRldi0+dGhyZWFkLnBpZCA9IGtlcm5lbF90aHJlYWQobXlfdGhyZWFkLGRldiwwKTsKKwkJaWYgKGRldi0+dGhyZWFkLnBpZCA8IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczoga2VybmVsX3RocmVhZCgpIGZhaWxlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQlzYWE3MTM0X3R2YXVkaW9fZG9fc2NhbihkZXYpOworCX0KKworCXNhYTcxMzRfZW5hYmxlX2kycyhkZXYpOworCXJldHVybiAwOworfQorCitpbnQgc2FhNzEzNF90dmF1ZGlvX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJLyogc2h1dGRvd24gdHZhdWRpbyB0aHJlYWQgKi8KKwlpZiAoZGV2LT50aHJlYWQucGlkID49IDApIHsKKwkJZGV2LT50aHJlYWQuc2h1dGRvd24gPSAxOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+dGhyZWFkLndxKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZGV2LT50aHJlYWQuZXhpdCk7CisJfQorCXNhYV9hbmRvcmIoU0FBNzEzNF9BTkFMT0dfSU9fU0VMRUNULCAweDA3LCAweDAwKTsgLyogTElORTEgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IHNhYTcxMzRfdHZhdWRpb19kb19zY2FuKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworCWlmIChkZXYtPnRocmVhZC5waWQgPj0gMCkgeworCQlkZXYtPnRocmVhZC5tb2RlID0gVU5TRVQ7CisJCWRldi0+dGhyZWFkLnNjYW4yKys7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT50aHJlYWQud3EpOworCX0gZWxzZSB7CisJCWRldi0+YXV0b211dGUgPSAwOworCQlzYWE3MTM0X3R2YXVkaW9fc2V0bXV0ZShkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZiaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTU0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12YmkuYwpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqICRJZDogc2FhNzEzNC12YmkuYyx2IDEuNiAyMDA0LzEyLzEwIDEyOjMzOjM5IGtyYXhlbCBFeHAgJAorICoKKyAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcworICogdmlkZW80bGludXggdmlkZW8gaW50ZXJmYWNlCisgKgorICogKGMpIDIwMDEsMDIgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJzYWE3MTM0LXJlZy5oIgorI2luY2x1ZGUgInNhYTcxMzQuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmJpX2RlYnVnICA9IDA7Cittb2R1bGVfcGFyYW0odmJpX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh2YmlfZGVidWcsImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbdmJpXSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHZiaWJ1ZnMgPSA0OworbW9kdWxlX3BhcmFtKHZiaWJ1ZnMsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZiaWJ1ZnMsIm51bWJlciBvZiB2YmkgYnVmZmVycywgcmFuZ2UgMi0zMiIpOworCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pCWlmICh2YmlfZGVidWcpIFwKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMvdmJpOiAiIGZtdCwgZGV2LT5uYW1lICwgIyMgYXJnKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBWQklfTElORV9DT1VOVCAgICAgMTYKKyNkZWZpbmUgVkJJX0xJTkVfTEVOR1RIICAyMDQ4CisjZGVmaW5lIFZCSV9TQ0FMRSAgICAgICAweDIwMAorCitzdGF0aWMgdm9pZCB0YXNrX2luaXQoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmLAorCQkgICAgICBpbnQgdGFzaykKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF90dm5vcm0gKm5vcm0gPSBkZXYtPnR2bm9ybTsKKworCS8qIHNldHVwIHZpZGVvIHNjYWxlciAqLworCXNhYV93cml0ZWIoU0FBNzEzNF9WQklfSF9TVEFSVDEodGFzayksIG5vcm0tPmhfc3RhcnQgICAgICYgIDB4ZmYpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WQklfSF9TVEFSVDIodGFzayksIG5vcm0tPmhfc3RhcnQgICAgID4+IDgpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WQklfSF9TVE9QMSh0YXNrKSwgIG5vcm0tPmhfc3RvcCAgICAgICYgIDB4ZmYpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WQklfSF9TVE9QMih0YXNrKSwgIG5vcm0tPmhfc3RvcCAgICAgID4+IDgpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WQklfVl9TVEFSVDEodGFzayksIG5vcm0tPnZiaV92X3N0YXJ0ICYgIDB4ZmYpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WQklfVl9TVEFSVDIodGFzayksIG5vcm0tPnZiaV92X3N0YXJ0ID4+IDgpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WQklfVl9TVE9QMSh0YXNrKSwgIG5vcm0tPnZiaV92X3N0b3AgICYgIDB4ZmYpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WQklfVl9TVE9QMih0YXNrKSwgIG5vcm0tPnZiaV92X3N0b3AgID4+IDgpOworCisJc2FhX3dyaXRlYihTQUE3MTM0X1ZCSV9IX1NDQUxFX0lOQzEodGFzayksICAgICAgICBWQklfU0NBTEUgJiAweGZmKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX0hfU0NBTEVfSU5DMih0YXNrKSwgICAgICAgIFZCSV9TQ0FMRSA+PiA4KTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX1BIQVNFX09GRlNFVF9MVU1BKHRhc2spLCAgIDB4MDApOworCXNhYV93cml0ZWIoU0FBNzEzNF9WQklfUEhBU0VfT0ZGU0VUX0NIUk9NQSh0YXNrKSwgMHgwMCk7CisKKwlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX0hfTEVOMSh0YXNrKSwgYnVmLT52Yi53aWR0aCAgICYgMHhmZik7CisJc2FhX3dyaXRlYihTQUE3MTM0X1ZCSV9IX0xFTjIodGFzayksIGJ1Zi0+dmIud2lkdGggICA+PiA4KTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX1ZfTEVOMSh0YXNrKSwgYnVmLT52Yi5oZWlnaHQgICYgMHhmZik7CisJc2FhX3dyaXRlYihTQUE3MTM0X1ZCSV9WX0xFTjIodGFzayksIGJ1Zi0+dmIuaGVpZ2h0ICA+PiA4KTsKKworCXNhYV9hbmRvcmIoU0FBNzEzNF9EQVRBX1BBVEgodGFzayksIDB4YzAsIDB4MDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBidWZmZXJfYWN0aXZhdGUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsCisJCQkgICBzdHJ1Y3Qgc2FhNzEzNF9idWYgKmJ1ZiwKKwkJCSAgIHN0cnVjdCBzYWE3MTM0X2J1ZiAqbmV4dCkKK3sKKwl1bnNpZ25lZCBsb25nIGNvbnRyb2wsYmFzZTsKKworCWRwcmludGsoImJ1ZmZlcl9hY3RpdmF0ZSBbJXBdXG4iLGJ1Zik7CisJYnVmLT52Yi5zdGF0ZSA9IFNUQVRFX0FDVElWRTsKKwlidWYtPnRvcF9zZWVuID0gMDsKKworCXRhc2tfaW5pdChkZXYsYnVmLFRBU0tfQSk7CisJdGFza19pbml0KGRldixidWYsVEFTS19CKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfT0ZNVF9EQVRBX0EsIDB4MDYpOworCXNhYV93cml0ZWIoU0FBNzEzNF9PRk1UX0RBVEFfQiwgMHgwNik7CisKKwkvKiBETUE6IHNldHVwIGNoYW5uZWwgMiszICg9IFZCSSBUYXNrIEErQikgKi8KKwliYXNlICAgID0gc2FhNzEzNF9idWZmZXJfYmFzZShidWYpOworCWNvbnRyb2wgPSBTQUE3MTM0X1JTX0NPTlRST0xfQlVSU1RfMTYgfAorCQlTQUE3MTM0X1JTX0NPTlRST0xfTUUgfAorCQkoYnVmLT5wdC0+ZG1hID4+IDEyKTsKKwlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkExKDIpLGJhc2UpOworCXNhYV93cml0ZWwoU0FBNzEzNF9SU19CQTIoMiksYmFzZSArIGJ1Zi0+dmIuc2l6ZS8yKTsKKwlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfUElUQ0goMiksYnVmLT52Yi53aWR0aCk7CisJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0NPTlRST0woMiksY29udHJvbCk7CisJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0JBMSgzKSxiYXNlKTsKKwlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkEyKDMpLGJhc2UgKyBidWYtPnZiLnNpemUvMik7CisJc2FhX3dyaXRlbChTQUE3MTM0X1JTX1BJVENIKDMpLGJ1Zi0+dmIud2lkdGgpOworCXNhYV93cml0ZWwoU0FBNzEzNF9SU19DT05UUk9MKDMpLGNvbnRyb2wpOworCisJLyogc3RhcnQgRE1BICovCisJc2FhNzEzNF9zZXRfZG1hYml0cyhkZXYpOworCW1vZF90aW1lcigmZGV2LT52YmlfcS50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKKwkJCSAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCisJCQkgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggICA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfYnVmICpidWYgPSBjb250YWluZXJfb2YodmIsc3RydWN0IHNhYTcxMzRfYnVmLHZiKTsKKwlzdHJ1Y3Qgc2FhNzEzNF90dm5vcm0gKm5vcm0gPSBkZXYtPnR2bm9ybTsKKwl1bnNpZ25lZCBpbnQgbGluZXMsIGxsZW5ndGgsIHNpemU7CisJaW50IGVycjsKKworCWxpbmVzICAgPSBub3JtLT52Ymlfdl9zdG9wIC0gbm9ybS0+dmJpX3Zfc3RhcnQgKzE7CisJaWYgKGxpbmVzID4gVkJJX0xJTkVfQ09VTlQpCisJCWxpbmVzID0gVkJJX0xJTkVfQ09VTlQ7CisjaWYgMQorCWxsZW5ndGggPSBWQklfTElORV9MRU5HVEg7CisjZWxzZQorCWxsZW5ndGggPSAobm9ybS0+aF9zdG9wIC0gbm9ybS0+aF9zdGFydCArMSkgKiAyOworCWlmIChsbGVuZ3RoID4gVkJJX0xJTkVfTEVOR1RIKQorCQlsbGVuZ3RoID0gVkJJX0xJTkVfTEVOR1RIOworI2VuZGlmCisJc2l6ZSA9IGxpbmVzICogbGxlbmd0aCAqIDI7CisJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBzaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChidWYtPnZiLnNpemUgIT0gc2l6ZSkKKwkJc2FhNzEzNF9kbWFfZnJlZShkZXYsYnVmKTsKKworCWlmIChTVEFURV9ORUVEU19JTklUID09IGJ1Zi0+dmIuc3RhdGUpIHsKKwkJYnVmLT52Yi53aWR0aCAgPSBsbGVuZ3RoOworCQlidWYtPnZiLmhlaWdodCA9IGxpbmVzOworCQlidWYtPnZiLnNpemUgICA9IHNpemU7CisJCWJ1Zi0+cHQgICAgICAgID0gJmZoLT5wdF92Ymk7CisKKwkJZXJyID0gdmlkZW9idWZfaW9sb2NrKGRldi0+cGNpLCZidWYtPnZiLE5VTEwpOworCQlpZiAoZXJyKQorCQkJZ290byBvb3BzOworCQllcnIgPSBzYWE3MTM0X3BndGFibGVfYnVpbGQoZGV2LT5wY2ksYnVmLT5wdCwKKwkJCQkJICAgIGJ1Zi0+dmIuZG1hLnNnbGlzdCwKKwkJCQkJICAgIGJ1Zi0+dmIuZG1hLnNnbGVuLAorCQkJCQkgICAgc2FhNzEzNF9idWZmZXJfc3RhcnRwYWdlKGJ1ZikpOworCQlpZiAoZXJyKQorCQkJZ290byBvb3BzOworCX0KKwlidWYtPnZiLnN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7CisJYnVmLT5hY3RpdmF0ZSA9IGJ1ZmZlcl9hY3RpdmF0ZTsKKwlidWYtPnZiLmZpZWxkID0gZmllbGQ7CisJcmV0dXJuIDA7CisKKyBvb3BzOgorCXNhYTcxMzRfZG1hX2ZyZWUoZGV2LGJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorYnVmZmVyX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50ICpjb3VudCwgdW5zaWduZWQgaW50ICpzaXplKQoreworCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCAgID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlpbnQgbGxlbmd0aCxsaW5lczsKKworCWxpbmVzICAgPSBkZXYtPnR2bm9ybS0+dmJpX3Zfc3RvcCAtIGRldi0+dHZub3JtLT52Ymlfdl9zdGFydCArMTsKKyNpZiAxCisJbGxlbmd0aCA9IFZCSV9MSU5FX0xFTkdUSDsKKyNlbHNlCisJbGxlbmd0aCA9IChub3JtLT5oX3N0b3AgLSBub3JtLT5oX3N0YXJ0ICsxKSAqIDI7CisJaWYgKGxsZW5ndGggPiBWQklfTElORV9MRU5HVEgpCisJCWxsZW5ndGggPSBWQklfTElORV9MRU5HVEg7CisjZW5kaWYKKwkqc2l6ZSA9IGxpbmVzICogbGxlbmd0aCAqIDI7CisJaWYgKDAgPT0gKmNvdW50KQorCQkqY291bnQgPSB2YmlidWZzOworCSpjb3VudCA9IHNhYTcxMzRfYnVmZmVyX2NvdW50KCpzaXplLCpjb3VudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfYnVmICpidWYgPSBjb250YWluZXJfb2YodmIsc3RydWN0IHNhYTcxMzRfYnVmLHZiKTsKKworCXNhYTcxMzRfYnVmZmVyX3F1ZXVlKGRldiwmZGV2LT52YmlfcSxidWYpOworfQorCitzdGF0aWMgdm9pZCBidWZmZXJfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCAgID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9idWYgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2YixzdHJ1Y3Qgc2FhNzEzNF9idWYsdmIpOworCisJc2FhNzEzNF9kbWFfZnJlZShkZXYsYnVmKTsKK30KKworc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyBzYWE3MTM0X3ZiaV9xb3BzID0geworCS5idWZfc2V0dXAgICAgPSBidWZmZXJfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlICA9IGJ1ZmZlcl9wcmVwYXJlLAorCS5idWZfcXVldWUgICAgPSBidWZmZXJfcXVldWUsCisJLmJ1Zl9yZWxlYXNlICA9IGJ1ZmZlcl9yZWxlYXNlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBzYWE3MTM0X3ZiaV9pbml0MShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT52YmlfcS5xdWV1ZSk7CisJaW5pdF90aW1lcigmZGV2LT52YmlfcS50aW1lb3V0KTsKKwlkZXYtPnZiaV9xLnRpbWVvdXQuZnVuY3Rpb24gPSBzYWE3MTM0X2J1ZmZlcl90aW1lb3V0OworCWRldi0+dmJpX3EudGltZW91dC5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKSgmZGV2LT52YmlfcSk7CisJZGV2LT52YmlfcS5kZXYgICAgICAgICAgICAgID0gZGV2OworCisJaWYgKHZiaWJ1ZnMgPCAyKQorCQl2YmlidWZzID0gMjsKKwlpZiAodmJpYnVmcyA+IFZJREVPX01BWF9GUkFNRSkKKwkJdmJpYnVmcyA9IFZJREVPX01BWF9GUkFNRTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNhYTcxMzRfdmJpX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJLyogbm90aGluZyAqLworCXJldHVybiAwOworfQorCit2b2lkIHNhYTcxMzRfaXJxX3ZiaV9kb25lKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIHN0YXR1cykKK3sKKwlzcGluX2xvY2soJmRldi0+c2xvY2spOworCWlmIChkZXYtPnZiaV9xLmN1cnIpIHsKKwkJZGV2LT52YmlfZmllbGRjb3VudCsrOworCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBzZWVuIGJvdGggZmllbGRzICovCisJCWlmICgoc3RhdHVzICYgMHgxMCkgPT0gMHgwMCkgeworCQkJZGV2LT52YmlfcS5jdXJyLT50b3Bfc2VlbiA9IDE7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJaWYgKCFkZXYtPnZiaV9xLmN1cnItPnRvcF9zZWVuKQorCQkJZ290byBkb25lOworCisJCWRldi0+dmJpX3EuY3Vyci0+dmIuZmllbGRfY291bnQgPSBkZXYtPnZiaV9maWVsZGNvdW50OworCQlzYWE3MTM0X2J1ZmZlcl9maW5pc2goZGV2LCZkZXYtPnZiaV9xLFNUQVRFX0RPTkUpOworCX0KKwlzYWE3MTM0X2J1ZmZlcl9uZXh0KGRldiwmZGV2LT52YmlfcSk7CisKKyBkb25lOgorCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDY2MDYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwpAQCAtMCwwICsxLDI0MDYgQEAKKy8qCisgKiAkSWQ6IHNhYTcxMzQtdmlkZW8uYyx2IDEuMjggMjAwNS8wMi8xNSAxNTo1OTozNSBrcmF4ZWwgRXhwICQKKyAqCisgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKKyAqIHZpZGVvNGxpbnV4IHZpZGVvIGludGVyZmFjZQorICoKKyAqIChjKSAyMDAxLTAzIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKKyNpbmNsdWRlICJzYWE3MTM0LmgiCisKKyNkZWZpbmUgVjRMMl9JMkNfQ0xJRU5UUyAxCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX2RlYnVnICAgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBnYnVmZmVycyAgICAgID0gODsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9uaW50ZXJsYWNlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGdidWZzaXplICAgICAgPSA3MjAqNTc2KjQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGdidWZzaXplX21heCAgPSA3MjAqNTc2KjQ7Cittb2R1bGVfcGFyYW0odmlkZW9fZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW3ZpZGVvXSIpOworbW9kdWxlX3BhcmFtKGdidWZmZXJzLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhnYnVmZmVycywibnVtYmVyIG9mIGNhcHR1cmUgYnVmZmVycywgcmFuZ2UgMi0zMiIpOworbW9kdWxlX3BhcmFtKG5vbmludGVybGFjZWQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vbmludGVybGFjZWQsInZpZGVvIGlucHV0IGlzIG5vbmludGVybGFjZWQiKTsKKworI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAodmlkZW9fZGVidWcpIFwKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMvdmlkZW86ICIgZm10LCBkZXYtPm5hbWUgLCAjIyBhcmcpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZGF0YSBzdHJ1Y3RzIGZvciB2aWRlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBpbnQgdmlkZW9fb3V0W11bOV0gPSB7CisJW0NDSVI2NTZdID0geyAweDAwLCAweGIxLCAweDAwLCAweGExLCAweDAwLCAweDA0LCAweDA2LCAweDAwLCAweDAwIH0sCit9OworCitzdGF0aWMgc3RydWN0IHNhYTcxMzRfZm9ybWF0IGZvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lICAgICA9ICI4IGJwcCBncmF5IiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX0dSRVksCisJCS5kZXB0aCAgICA9IDgsCisJCS5wbSAgICAgICA9IDB4MDYsCisJfSx7CisJCS5uYW1lICAgICA9ICIxNSBicHAgUkdCLCBsZSIsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9SR0I1NTUsCisJCS5kZXB0aCAgICA9IDE2LAorCQkucG0gICAgICAgPSAweDEzIHwgMHg4MCwKKwl9LHsKKwkJLm5hbWUgICAgID0gIjE1IGJwcCBSR0IsIGJlIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1JHQjU1NVgsCisJCS5kZXB0aCAgICA9IDE2LAorCQkucG0gICAgICAgPSAweDEzIHwgMHg4MCwKKwkJLmJzd2FwICAgID0gMSwKKwl9LHsKKwkJLm5hbWUgICAgID0gIjE2IGJwcCBSR0IsIGxlIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKKwkJLmRlcHRoICAgID0gMTYsCisJCS5wbSAgICAgICA9IDB4MTAgfCAweDgwLAorCX0seworCQkubmFtZSAgICAgPSAiMTYgYnBwIFJHQiwgYmUiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfUkdCNTY1WCwKKwkJLmRlcHRoICAgID0gMTYsCisJCS5wbSAgICAgICA9IDB4MTAgfCAweDgwLAorCQkuYnN3YXAgICAgPSAxLAorCX0seworCQkubmFtZSAgICAgPSAiMjQgYnBwIFJHQiwgbGUiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfQkdSMjQsCisJCS5kZXB0aCAgICA9IDI0LAorCQkucG0gICAgICAgPSAweDExLAorCX0seworCQkubmFtZSAgICAgPSAiMjQgYnBwIFJHQiwgYmUiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfUkdCMjQsCisJCS5kZXB0aCAgICA9IDI0LAorCQkucG0gICAgICAgPSAweDExLAorCQkuYnN3YXAgICAgPSAxLAorCX0seworCQkubmFtZSAgICAgPSAiMzIgYnBwIFJHQiwgbGUiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfQkdSMzIsCisJCS5kZXB0aCAgICA9IDMyLAorCQkucG0gICAgICAgPSAweDEyLAorCX0seworCQkubmFtZSAgICAgPSAiMzIgYnBwIFJHQiwgYmUiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfUkdCMzIsCisJCS5kZXB0aCAgICA9IDMyLAorCQkucG0gICAgICAgPSAweDEyLAorCQkuYnN3YXAgICAgPSAxLAorCQkud3N3YXAgICAgPSAxLAorCX0seworCQkubmFtZSAgICAgPSAiNDoyOjIgcGFja2VkLCBZVVlWIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1lVWVYsCisJCS5kZXB0aCAgICA9IDE2LAorCQkucG0gICAgICAgPSAweDAwLAorCQkuYnN3YXAgICAgPSAxLAorCQkueXV2ICAgICAgPSAxLAorCX0seworCQkubmFtZSAgICAgPSAiNDoyOjIgcGFja2VkLCBVWVZZIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1VZVlksCisJCS5kZXB0aCAgICA9IDE2LAorCQkucG0gICAgICAgPSAweDAwLAorCQkueXV2ICAgICAgPSAxLAorCX0seworCQkubmFtZSAgICAgPSAiNDoyOjIgcGxhbmFyLCBZLUNiLUNyIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1lVVjQyMlAsCisJCS5kZXB0aCAgICA9IDE2LAorCQkucG0gICAgICAgPSAweDA5LAorCQkueXV2ICAgICAgPSAxLAorCQkucGxhbmFyICAgPSAxLAorCQkuaHNoaWZ0ICAgPSAxLAorCQkudnNoaWZ0ICAgPSAwLAorCX0seworCQkubmFtZSAgICAgPSAiNDoyOjAgcGxhbmFyLCBZLUNiLUNyIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1lVVjQyMCwKKwkJLmRlcHRoICAgID0gMTIsCisJCS5wbSAgICAgICA9IDB4MGEsCisJCS55dXYgICAgICA9IDEsCisJCS5wbGFuYXIgICA9IDEsCisJCS5oc2hpZnQgICA9IDEsCisJCS52c2hpZnQgICA9IDEsCisJfSx7CisJCS5uYW1lICAgICA9ICI0OjI6MCBwbGFuYXIsIFktQ2ItQ3IiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfWVZVNDIwLAorCQkuZGVwdGggICAgPSAxMiwKKwkJLnBtICAgICAgID0gMHgwYSwKKwkJLnl1diAgICAgID0gMSwKKwkJLnBsYW5hciAgID0gMSwKKwkJLnV2c3dhcCAgID0gMSwKKwkJLmhzaGlmdCAgID0gMSwKKwkJLnZzaGlmdCAgID0gMSwKKwl9Cit9OworI2RlZmluZSBGT1JNQVRTIEFSUkFZX1NJWkUoZm9ybWF0cykKKworI2RlZmluZSBOT1JNXzYyNV81MAkJCVwKKwkJLmhfc3RhcnQgICAgICAgPSAwLAlcCisJCS5oX3N0b3AgICAgICAgID0gNzE5LAlcCisJCS52aWRlb192X3N0YXJ0ID0gMjQsCVwKKwkJLnZpZGVvX3Zfc3RvcCAgPSAzMTEsCVwKKwkJLnZiaV92X3N0YXJ0ICAgPSA3LAlcCisJCS52Ymlfdl9zdG9wICAgID0gMjIsCVwKKwkJLnNyY190aW1pbmcgICAgPSA0CisKKyNkZWZpbmUgTk9STV81MjVfNjAJCQlcCisJCS5oX3N0YXJ0ICAgICAgID0gMCwJXAorCQkuaF9zdG9wICAgICAgICA9IDcwMywJXAorCQkudmlkZW9fdl9zdGFydCA9IDIyLAlcCisJCS52aWRlb192X3N0b3AgID0gMjIrMjM5LCBcCisJCS52Ymlfdl9zdGFydCAgID0gMTAsIC8qIEZJWE1FICovIFwKKwkJLnZiaV92X3N0b3AgICAgPSAyMSwgLyogRklYTUUgKi8gXAorCQkuc3JjX3RpbWluZyAgICA9IDEKKworc3RhdGljIHN0cnVjdCBzYWE3MTM0X3R2bm9ybSB0dm5vcm1zW10gPSB7CisJeworCQkubmFtZSAgICAgICAgICA9ICJQQUwiLCAvKiBhdXRvZGV0ZWN0ICovCisJCS5pZCAgICAgICAgICAgID0gVjRMMl9TVERfUEFMLAorCQlOT1JNXzYyNV81MCwKKworCQkuc3luY19jb250cm9sICA9IDB4MTgsCisJCS5sdW1hX2NvbnRyb2wgID0gMHg0MCwKKwkJLmNocm9tYV9jdHJsMSAgPSAweDgxLAorCQkuY2hyb21hX2dhaW4gICA9IDB4MmEsCisJCS5jaHJvbWFfY3RybDIgID0gMHgwNiwKKwkJLnZnYXRlX21pc2MgICAgPSAweDFjLAorCisJfSx7CisJCS5uYW1lICAgICAgICAgID0gIlBBTC1CRyIsCisJCS5pZCAgICAgICAgICAgID0gVjRMMl9TVERfUEFMX0JHLAorCQlOT1JNXzYyNV81MCwKKworCQkuc3luY19jb250cm9sICA9IDB4MTgsCisJCS5sdW1hX2NvbnRyb2wgID0gMHg0MCwKKwkJLmNocm9tYV9jdHJsMSAgPSAweDgxLAorCQkuY2hyb21hX2dhaW4gICA9IDB4MmEsCisJCS5jaHJvbWFfY3RybDIgID0gMHgwNiwKKwkJLnZnYXRlX21pc2MgICAgPSAweDFjLAorCisJfSx7CisJCS5uYW1lICAgICAgICAgID0gIlBBTC1JIiwKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX1NURF9QQUxfSSwKKwkJTk9STV82MjVfNTAsCisKKwkJLnN5bmNfY29udHJvbCAgPSAweDE4LAorCQkubHVtYV9jb250cm9sICA9IDB4NDAsCisJCS5jaHJvbWFfY3RybDEgID0gMHg4MSwKKwkJLmNocm9tYV9nYWluICAgPSAweDJhLAorCQkuY2hyb21hX2N0cmwyICA9IDB4MDYsCisJCS52Z2F0ZV9taXNjICAgID0gMHgxYywKKworCX0seworCQkubmFtZSAgICAgICAgICA9ICJQQUwtREsiLAorCQkuaWQgICAgICAgICAgICA9IFY0TDJfU1REX1BBTF9ESywKKwkJTk9STV82MjVfNTAsCisKKwkJLnN5bmNfY29udHJvbCAgPSAweDE4LAorCQkubHVtYV9jb250cm9sICA9IDB4NDAsCisJCS5jaHJvbWFfY3RybDEgID0gMHg4MSwKKwkJLmNocm9tYV9nYWluICAgPSAweDJhLAorCQkuY2hyb21hX2N0cmwyICA9IDB4MDYsCisJCS52Z2F0ZV9taXNjICAgID0gMHgxYywKKworCX0seworCQkubmFtZSAgICAgICAgICA9ICJOVFNDIiwKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX1NURF9OVFNDLAorCQlOT1JNXzUyNV82MCwKKworCQkuc3luY19jb250cm9sICA9IDB4NTksCisJCS5sdW1hX2NvbnRyb2wgID0gMHg0MCwKKwkJLmNocm9tYV9jdHJsMSAgPSAweDg5LAorCQkuY2hyb21hX2dhaW4gICA9IDB4MmEsCisJCS5jaHJvbWFfY3RybDIgID0gMHgwZSwKKwkJLnZnYXRlX21pc2MgICAgPSAweDE4LAorCisJfSx7CisJCS5uYW1lICAgICAgICAgID0gIlNFQ0FNIiwKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX1NURF9TRUNBTSwKKwkJTk9STV82MjVfNTAsCisKKwkJLnN5bmNfY29udHJvbCAgPSAweDE4LCAvKiBvbGQ6IDB4NTgsICovCisJCS5sdW1hX2NvbnRyb2wgID0gMHgxYiwKKwkJLmNocm9tYV9jdHJsMSAgPSAweGQxLAorCQkuY2hyb21hX2dhaW4gICA9IDB4ODAsCisJCS5jaHJvbWFfY3RybDIgID0gMHgwMCwKKwkJLnZnYXRlX21pc2MgICAgPSAweDFjLAorCisJfSx7CisJCS5uYW1lICAgICAgICAgID0gIlBBTC1NIiwKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX1NURF9QQUxfTSwKKwkJTk9STV81MjVfNjAsCisKKwkJLnN5bmNfY29udHJvbCAgPSAweDU5LAorCQkubHVtYV9jb250cm9sICA9IDB4NDAsCisJCS5jaHJvbWFfY3RybDEgID0gMHhiOSwKKwkJLmNocm9tYV9nYWluICAgPSAweDJhLAorCQkuY2hyb21hX2N0cmwyICA9IDB4MGUsCisJCS52Z2F0ZV9taXNjICAgID0gMHgxOCwKKworCX0seworCQkubmFtZSAgICAgICAgICA9ICJQQUwtTmMiLAorCQkuaWQgICAgICAgICAgICA9IFY0TDJfU1REX1BBTF9OYywKKwkJTk9STV82MjVfNTAsCisKKwkJLnN5bmNfY29udHJvbCAgPSAweDE4LAorCQkubHVtYV9jb250cm9sICA9IDB4NDAsCisJCS5jaHJvbWFfY3RybDEgID0gMHhhMSwKKwkJLmNocm9tYV9nYWluICAgPSAweDJhLAorCQkuY2hyb21hX2N0cmwyICA9IDB4MDYsCisJCS52Z2F0ZV9taXNjICAgID0gMHgxYywKKworCX0seworCQkubmFtZSAgICAgICAgICA9ICJQQUwtNjAiLAorCQkuaWQgICAgICAgICAgICA9IFY0TDJfU1REX1BBTF82MCwKKworCQkuaF9zdGFydCAgICAgICA9IDAsCisJCS5oX3N0b3AgICAgICAgID0gNzE5LAorCQkudmlkZW9fdl9zdGFydCA9IDIyLAorCQkudmlkZW9fdl9zdG9wICA9IDIyKzIzOSwKKwkJLnZiaV92X3N0YXJ0ICAgPSAxMCwgLyogRklYTUUgKi8KKwkJLnZiaV92X3N0b3AgICAgPSAyMSwgLyogRklYTUUgKi8KKwkJLnNyY190aW1pbmcgICAgPSAxLAorCisJCS5zeW5jX2NvbnRyb2wgID0gMHgxOCwKKwkJLmx1bWFfY29udHJvbCAgPSAweDQwLAorCQkuY2hyb21hX2N0cmwxICA9IDB4ODEsCisJCS5jaHJvbWFfZ2FpbiAgID0gMHgyYSwKKwkJLmNocm9tYV9jdHJsMiAgPSAweDA2LAorCQkudmdhdGVfbWlzYyAgICA9IDB4MWMsCisJfQorfTsKKyNkZWZpbmUgVFZOT1JNUyBBUlJBWV9TSVpFKHR2bm9ybXMpCisKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9JTlZFUlQgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMCkKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9ZX09ERCAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9ZX0VWRU4gICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMikKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9BVVRPTVVURSAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMykKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9MQVNUUDEgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNCkKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBub19jdHJsID0geworCS5uYW1lICA9ICI0MiIsCisJLmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB2aWRlb19jdHJsc1tdID0geworCS8qIC0tLSB2aWRlbyAtLS0gKi8KKwl7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJLm5hbWUgICAgICAgICAgPSAiQnJpZ2h0bmVzcyIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAyNTUsCisJCS5zdGVwICAgICAgICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxMjgsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkJLm5hbWUgICAgICAgICAgPSAiQ29udHJhc3QiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gMTI3LAorCQkuc3RlcCAgICAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gNjgsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAorCQkubmFtZSAgICAgICAgICA9ICJTYXR1cmF0aW9uIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEyNywKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDY0LAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfSFVFLAorCQkubmFtZSAgICAgICAgICA9ICJIdWUiLAorCQkubWluaW11bSAgICAgICA9IC0xMjgsCisJCS5tYXhpbXVtICAgICAgID0gMTI3LAorCQkuc3RlcCAgICAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCX0seworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1ZGTElQLAorCQkubmFtZSAgICAgICAgICA9ICJ2ZXJ0aWNhbCBmbGlwIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwl9LAorCS8qIC0tLSBhdWRpbyAtLS0gKi8KKwl7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKKwkJLm5hbWUgICAgICAgICAgPSAiTXV0ZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAxLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAorCQkubmFtZSAgICAgICAgICA9ICJWb2x1bWUiLAorCQkubWluaW11bSAgICAgICA9IC0xNSwKKwkJLm1heGltdW0gICAgICAgPSAxNSwKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LAorCS8qIC0tLSBwcml2YXRlIC0tLSAqLworCXsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0lOVkVSVCwKKwkJLm5hbWUgICAgICAgICAgPSAiSW52ZXJ0IiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1lfT0RELAorCQkubmFtZSAgICAgICAgICA9ICJ5IG9mZnNldCBvZGQgZmllbGQiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gMTI4LAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1lfRVZFTiwKKwkJLm5hbWUgICAgICAgICAgPSAieSBvZmZzZXQgZXZlbiBmaWVsZCIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAxMjgsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCX0seworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfQVVUT01VVEUsCisJCS5uYW1lICAgICAgICAgID0gImF1dG9tdXRlIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCX0KK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IENUUkxTID0gQVJSQVlfU0laRSh2aWRlb19jdHJscyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwqIGN0cmxfYnlfaWQodW5zaWduZWQgaW50IGlkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IENUUkxTOyBpKyspCisJCWlmICh2aWRlb19jdHJsc1tpXS5pZCA9PSBpZCkKKwkJCXJldHVybiB2aWRlb19jdHJscytpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHNhYTcxMzRfZm9ybWF0KiBmb3JtYXRfYnlfZm91cmNjKHVuc2lnbmVkIGludCBmb3VyY2MpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRk9STUFUUzsgaSsrKQorCQlpZiAoZm9ybWF0c1tpXS5mb3VyY2MgPT0gZm91cmNjKQorCQkJcmV0dXJuIGZvcm1hdHMraTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHJlc291cmNlIG1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBpbnQgcmVzX2dldChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHNhYTcxMzRfZmggKmZoLCB1bnNpZ25lZCBpbnQgYml0KQoreworCWlmIChmaC0+cmVzb3VyY2VzICYgYml0KQorCQkvKiBoYXZlIGl0IGFscmVhZHkgYWxsb2NhdGVkICovCisJCXJldHVybiAxOworCisJLyogaXMgaXQgZnJlZT8gKi8KKwlkb3duKCZkZXYtPmxvY2spOworCWlmIChkZXYtPnJlc291cmNlcyAmIGJpdCkgeworCQkvKiBubywgc29tZW9uZSBlbHNlIHVzZXMgaXQgKi8KKwkJdXAoJmRldi0+bG9jayk7CisJCXJldHVybiAwOworCX0KKwkvKiBpdCdzIGZyZWUsIGdyYWIgaXQgKi8KKwlmaC0+cmVzb3VyY2VzICB8PSBiaXQ7CisJZGV2LT5yZXNvdXJjZXMgfD0gYml0OworCWRwcmludGsoInJlczogZ2V0ICVkXG4iLGJpdCk7CisJdXAoJmRldi0+bG9jayk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYworaW50IHJlc19jaGVjayhzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCit7CisJcmV0dXJuIChmaC0+cmVzb3VyY2VzICYgYml0KTsKK30KKworc3RhdGljCitpbnQgcmVzX2xvY2tlZChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlyZXR1cm4gKGRldi0+cmVzb3VyY2VzICYgYml0KTsKK30KKworc3RhdGljCit2b2lkIHJlc19mcmVlKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsIHVuc2lnbmVkIGludCBiaXRzKQoreworCWlmICgoZmgtPnJlc291cmNlcyAmIGJpdHMpICE9IGJpdHMpCisJCUJVRygpOworCisJZG93bigmZGV2LT5sb2NrKTsKKwlmaC0+cmVzb3VyY2VzICAmPSB+Yml0czsKKwlkZXYtPnJlc291cmNlcyAmPSB+Yml0czsKKwlkcHJpbnRrKCJyZXM6IHB1dCAlZFxuIixiaXRzKTsKKwl1cCgmZGV2LT5sb2NrKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHNldF90dm5vcm0oc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHN0cnVjdCBzYWE3MTM0X3R2bm9ybSAqbm9ybSkKK3sKKwlpbnQgbHVtYV9jb250cm9sLHN5bmNfY29udHJvbCxtdXg7CisKKwlkcHJpbnRrKCJzZXQgdHYgbm9ybSA9ICVzXG4iLG5vcm0tPm5hbWUpOworCWRldi0+dHZub3JtID0gbm9ybTsKKworCW11eCA9IGNhcmRfaW4oZGV2LGRldi0+Y3RsX2lucHV0KS52bXV4OworCWx1bWFfY29udHJvbCA9IG5vcm0tPmx1bWFfY29udHJvbDsKKwlzeW5jX2NvbnRyb2wgPSBub3JtLT5zeW5jX2NvbnRyb2w7CisKKwlpZiAobXV4ID4gNSkKKwkJbHVtYV9jb250cm9sIHw9IDB4ODA7IC8qIHN2aWRlbyAqLworCWlmIChub25pbnRlcmxhY2VkIHx8IGRldi0+bm9zaWduYWwpCisJCXN5bmNfY29udHJvbCB8PSAweDIwOworCisJLyogc2V0dXAgY3JvcHBpbmcgKi8KKwlkZXYtPmNyb3BfYm91bmRzLmxlZnQgICAgPSBub3JtLT5oX3N0YXJ0OworCWRldi0+Y3JvcF9kZWZyZWN0LmxlZnQgICA9IG5vcm0tPmhfc3RhcnQ7CisJZGV2LT5jcm9wX2JvdW5kcy53aWR0aCAgID0gbm9ybS0+aF9zdG9wIC0gbm9ybS0+aF9zdGFydCArMTsKKwlkZXYtPmNyb3BfZGVmcmVjdC53aWR0aCAgPSBub3JtLT5oX3N0b3AgLSBub3JtLT5oX3N0YXJ0ICsxOworCisJZGV2LT5jcm9wX2JvdW5kcy50b3AgICAgID0gKG5vcm0tPnZiaV92X3N0b3ArMSkqMjsKKwlkZXYtPmNyb3BfZGVmcmVjdC50b3AgICAgPSBub3JtLT52aWRlb192X3N0YXJ0KjI7CisJZGV2LT5jcm9wX2JvdW5kcy5oZWlnaHQgID0gKChub3JtLT5pZCAmIFY0TDJfU1REXzUyNV82MCkgPyA1MjQgOiA2MjQpCisJCS0gZGV2LT5jcm9wX2JvdW5kcy50b3A7CisJZGV2LT5jcm9wX2RlZnJlY3QuaGVpZ2h0ID0gKG5vcm0tPnZpZGVvX3Zfc3RvcCAtIG5vcm0tPnZpZGVvX3Zfc3RhcnQgKzEpKjI7CisKKwlkZXYtPmNyb3BfY3VycmVudCA9IGRldi0+Y3JvcF9kZWZyZWN0OworCisJLyogc2V0dXAgdmlkZW8gZGVjb2RlciAqLworCXNhYV93cml0ZWIoU0FBNzEzNF9JTkNSX0RFTEFZLCAgICAgICAgICAgIDB4MDgpOworCXNhYV93cml0ZWIoU0FBNzEzNF9BTkFMT0dfSU5fQ1RSTDEsICAgICAgIDB4YzAgfCBtdXgpOworCXNhYV93cml0ZWIoU0FBNzEzNF9BTkFMT0dfSU5fQ1RSTDIsICAgICAgIDB4MDApOworCisJc2FhX3dyaXRlYihTQUE3MTM0X0FOQUxPR19JTl9DVFJMMywgICAgICAgMHg5MCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X0FOQUxPR19JTl9DVFJMNCwgICAgICAgMHg5MCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X0hTWU5DX1NUQVJULCAgICAgICAgICAgMHhlYik7CisJc2FhX3dyaXRlYihTQUE3MTM0X0hTWU5DX1NUT1AsICAgICAgICAgICAgMHhlMCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X1NPVVJDRV9USU1JTkcxLCAgICAgICAgbm9ybS0+c3JjX3RpbWluZyk7CisKKwlzYWFfd3JpdGViKFNBQTcxMzRfU1lOQ19DVFJMLCAgICAgICAgICAgICBzeW5jX2NvbnRyb2wpOworCXNhYV93cml0ZWIoU0FBNzEzNF9MVU1BX0NUUkwsICAgICAgICAgICAgIGx1bWFfY29udHJvbCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X0RFQ19MVU1BX0JSSUdIVCwgICAgICAgZGV2LT5jdGxfYnJpZ2h0KTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfREVDX0xVTUFfQ09OVFJBU1QsICAgICBkZXYtPmN0bF9jb250cmFzdCk7CisKKwlzYWFfd3JpdGViKFNBQTcxMzRfREVDX0NIUk9NQV9TQVRVUkFUSU9OLCBkZXYtPmN0bF9zYXR1cmF0aW9uKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfREVDX0NIUk9NQV9IVUUsICAgICAgICBkZXYtPmN0bF9odWUpOworCXNhYV93cml0ZWIoU0FBNzEzNF9DSFJPTUFfQ1RSTDEsICAgICAgICAgIG5vcm0tPmNocm9tYV9jdHJsMSk7CisJc2FhX3dyaXRlYihTQUE3MTM0X0NIUk9NQV9HQUlOLCAgICAgICAgICAgbm9ybS0+Y2hyb21hX2dhaW4pOworCisJc2FhX3dyaXRlYihTQUE3MTM0X0NIUk9NQV9DVFJMMiwgICAgICAgICAgbm9ybS0+Y2hyb21hX2N0cmwyKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfTU9ERV9ERUxBWV9DVFJMLCAgICAgICAweDAwKTsKKworCXNhYV93cml0ZWIoU0FBNzEzNF9BTkFMT0dfQURDLCAgICAgICAgICAgIDB4MDEpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WR0FURV9TVEFSVCwgICAgICAgICAgIDB4MTEpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WR0FURV9TVE9QLCAgICAgICAgICAgIDB4ZmUpOworCXNhYV93cml0ZWIoU0FBNzEzNF9NSVNDX1ZHQVRFX01TQiwgICAgICAgIG5vcm0tPnZnYXRlX21pc2MpOworCXNhYV93cml0ZWIoU0FBNzEzNF9SQVdfREFUQV9HQUlOLCAgICAgICAgIDB4NDApOworCXNhYV93cml0ZWIoU0FBNzEzNF9SQVdfREFUQV9PRkZTRVQsICAgICAgIDB4ODApOworCisjaWZkZWYgVjRMMl9JMkNfQ0xJRU5UUworCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVklESU9DX1NfU1RELCZub3JtLT5pZCk7CisjZWxzZQorCXsKKwkJLyogcGFzcyBkb3duIGluZm8gdG8gdGhlIGkyYyBjaGlwcyAodjRsMSkgKi8KKwkJc3RydWN0IHZpZGVvX2NoYW5uZWwgYzsKKwkJbWVtc2V0KCZjLDAsc2l6ZW9mKGMpKTsKKwkJYy5jaGFubmVsID0gZGV2LT5jdGxfaW5wdXQ7CisJCWMubm9ybSA9IFZJREVPX01PREVfUEFMOworCQlpZiAobm9ybS0+aWQgJiBWNEwyX1NURF9OVFNDKQorCQkJYy5ub3JtID0gVklERU9fTU9ERV9OVFNDOworCQlpZiAobm9ybS0+aWQgJiBWNEwyX1NURF9TRUNBTSkKKwkJCWMubm9ybSA9IFZJREVPX01PREVfU0VDQU07CisJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVklESU9DU0NIQU4sJmMpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB2aWRlb19tdXgoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCBpbnB1dCkKK3sKKwlkcHJpbnRrKCJ2aWRlbyBpbnB1dCA9ICVkIFslc11cbiIsaW5wdXQsY2FyZF9pbihkZXYsaW5wdXQpLm5hbWUpOworCWRldi0+Y3RsX2lucHV0ID0gaW5wdXQ7CisJc2V0X3R2bm9ybShkZXYsZGV2LT50dm5vcm0pOworCXNhYTcxMzRfdHZhdWRpb19zZXRpbnB1dChkZXYsJmNhcmRfaW4oZGV2LGlucHV0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9oX3ByZXNjYWxlKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBpbnQgdGFzaywgaW50IHByZXNjYWxlKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQlpbnQgeHBzYzsKKwkJaW50IHhhY2w7CisJCWludCB4YzJfMTsKKwkJaW50IHhkY2c7CisJCWludCB2cGZ5OworCX0gdmFsc1tdID0geworCQkvKiBYUFNDIFhBQ0wgWEMyXzEgWERDRyBWUEZZICovCisJCXsgICAgMSwgICAwLCAgICAwLCAgICAwLCAgIDAgfSwKKwkJeyAgICAyLCAgIDIsICAgIDEsICAgIDIsICAgMiB9LAorCQl7ICAgIDMsICAgNCwgICAgMSwgICAgMywgICAyIH0sCisJCXsgICAgNCwgICA4LCAgICAxLCAgICA0LCAgIDIgfSwKKwkJeyAgICA1LCAgIDgsICAgIDEsICAgIDQsICAgMiB9LAorCQl7ICAgIDYsICAgOCwgICAgMSwgICAgNCwgICAzIH0sCisJCXsgICAgNywgICA4LCAgICAxLCAgICA0LCAgIDMgfSwKKwkJeyAgICA4LCAgMTUsICAgIDAsICAgIDQsICAgMyB9LAorCQl7ICAgIDksICAxNSwgICAgMCwgICAgNCwgICAzIH0sCisJCXsgICAxMCwgIDE2LCAgICAxLCAgICA1LCAgIDMgfSwKKwl9OworCXN0YXRpYyBjb25zdCBpbnQgY291bnQgPSBBUlJBWV9TSVpFKHZhbHMpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWlmICh2YWxzW2ldLnhwc2MgPT0gcHJlc2NhbGUpCisJCQlicmVhazsKKwlpZiAoaSA9PSBjb3VudCkKKwkJcmV0dXJuOworCisJc2FhX3dyaXRlYihTQUE3MTM0X0hfUFJFU0NBTEUodGFzayksIHZhbHNbaV0ueHBzYyk7CisJc2FhX3dyaXRlYihTQUE3MTM0X0FDQ19MRU5HVEgodGFzayksIHZhbHNbaV0ueGFjbCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X0xFVkVMX0NUUkwodGFzayksCisJCSAgICh2YWxzW2ldLnhjMl8xIDw8IDMpIHwgKHZhbHNbaV0ueGRjZykpOworCXNhYV9hbmRvcmIoU0FBNzEzNF9GSVJfUFJFRklMVEVSX0NUUkwodGFzayksIDB4MGYsCisJCSAgICh2YWxzW2ldLnZwZnkgPDwgMikgfCB2YWxzW2ldLnZwZnkpOworfQorCitzdGF0aWMgdm9pZCBzZXRfdl9zY2FsZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IHRhc2ssIGludCB5c2NhbGUpCit7CisJaW50IHZhbCxtaXJyb3I7CisKKwlzYWFfd3JpdGViKFNBQTcxMzRfVl9TQ0FMRV9SQVRJTzEodGFzayksIHlzY2FsZSAmICAweGZmKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVl9TQ0FMRV9SQVRJTzIodGFzayksIHlzY2FsZSA+PiA4KTsKKworCW1pcnJvciA9IChkZXYtPmN0bF9taXJyb3IpID8gMHgwMiA6IDB4MDA7CisJaWYgKHlzY2FsZSA8IDIwNDgpIHsKKwkJLyogTFBJICovCisJCWRwcmludGsoInlzY2FsZSBMUEkgeXNjYWxlPSVkXG4iLHlzY2FsZSk7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9WX0ZJTFRFUih0YXNrKSwgMHgwMCB8IG1pcnJvcik7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9MVU1BX0NPTlRSQVNUKHRhc2spLCAweDQwKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0NIUk9NQV9TQVRVUkFUSU9OKHRhc2spLCAweDQwKTsKKwl9IGVsc2UgeworCQkvKiBBQ00gKi8KKwkJdmFsID0gMHg0MCAqIDEwMjQgLyB5c2NhbGU7CisJCWRwcmludGsoInlzY2FsZSBBQ00geXNjYWxlPSVkIHZhbD0weCV4XG4iLHlzY2FsZSx2YWwpOworCQlzYWFfd3JpdGViKFNBQTcxMzRfVl9GSUxURVIodGFzayksIDB4MDEgfCBtaXJyb3IpOworCQlzYWFfd3JpdGViKFNBQTcxMzRfTFVNQV9DT05UUkFTVCh0YXNrKSwgdmFsKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0NIUk9NQV9TQVRVUkFUSU9OKHRhc2spLCB2YWwpOworCX0KKwlzYWFfd3JpdGViKFNBQTcxMzRfTFVNQV9CUklHSFQodGFzayksICAgICAgIDB4ODApOworfQorCitzdGF0aWMgdm9pZCBzZXRfc2l6ZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IHRhc2ssCisJCSAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgaW50ZXJsYWNlKQoreworCWludCBwcmVzY2FsZSx4c2NhbGUseXNjYWxlLHlfZXZlbix5X29kZDsKKwlpbnQgaF9zdGFydCwgaF9zdG9wLCB2X3N0YXJ0LCB2X3N0b3A7CisJaW50IGRpdiA9IGludGVybGFjZSA/IDIgOiAxOworCisJLyogc2V0dXAgdmlkZW8gc2NhbGVyICovCisJaF9zdGFydCA9IGRldi0+Y3JvcF9jdXJyZW50LmxlZnQ7CisJdl9zdGFydCA9IGRldi0+Y3JvcF9jdXJyZW50LnRvcC8yOworCWhfc3RvcCAgPSAoZGV2LT5jcm9wX2N1cnJlbnQubGVmdCArIGRldi0+Y3JvcF9jdXJyZW50LndpZHRoIC0xKTsKKwl2X3N0b3AgID0gKGRldi0+Y3JvcF9jdXJyZW50LnRvcCArIGRldi0+Y3JvcF9jdXJyZW50LmhlaWdodCAtMSkvMjsKKworCXNhYV93cml0ZWIoU0FBNzEzNF9WSURFT19IX1NUQVJUMSh0YXNrKSwgaF9zdGFydCAmICAweGZmKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVklERU9fSF9TVEFSVDIodGFzayksIGhfc3RhcnQgPj4gOCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X1ZJREVPX0hfU1RPUDEodGFzayksICBoX3N0b3AgICYgIDB4ZmYpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WSURFT19IX1NUT1AyKHRhc2spLCAgaF9zdG9wICA+PiA4KTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVklERU9fVl9TVEFSVDEodGFzayksIHZfc3RhcnQgJiAgMHhmZik7CisJc2FhX3dyaXRlYihTQUE3MTM0X1ZJREVPX1ZfU1RBUlQyKHRhc2spLCB2X3N0YXJ0ID4+IDgpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WSURFT19WX1NUT1AxKHRhc2spLCAgdl9zdG9wICAmICAweGZmKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVklERU9fVl9TVE9QMih0YXNrKSwgIHZfc3RvcCAgPj4gOCk7CisKKwlwcmVzY2FsZSA9IGRldi0+Y3JvcF9jdXJyZW50LndpZHRoIC8gd2lkdGg7CisJaWYgKDAgPT0gcHJlc2NhbGUpCisJCXByZXNjYWxlID0gMTsKKwl4c2NhbGUgPSAxMDI0ICogZGV2LT5jcm9wX2N1cnJlbnQud2lkdGggLyBwcmVzY2FsZSAvIHdpZHRoOworCXlzY2FsZSA9IDUxMiAqIGRpdiAqIGRldi0+Y3JvcF9jdXJyZW50LmhlaWdodCAvIGhlaWdodDsKKyAgICAgICAJZHByaW50aygicHJlc2NhbGU9JWQgeHNjYWxlPSVkIHlzY2FsZT0lZFxuIixwcmVzY2FsZSx4c2NhbGUseXNjYWxlKTsKKwlzZXRfaF9wcmVzY2FsZShkZXYsdGFzayxwcmVzY2FsZSk7CisJc2FhX3dyaXRlYihTQUE3MTM0X0hfU0NBTEVfSU5DMSh0YXNrKSwgICAgICB4c2NhbGUgJiAgMHhmZik7CisJc2FhX3dyaXRlYihTQUE3MTM0X0hfU0NBTEVfSU5DMih0YXNrKSwgICAgICB4c2NhbGUgPj4gOCk7CisJc2V0X3Zfc2NhbGUoZGV2LHRhc2sseXNjYWxlKTsKKworCXNhYV93cml0ZWIoU0FBNzEzNF9WSURFT19QSVhFTFMxKHRhc2spLCAgICAgd2lkdGggICYgMHhmZik7CisJc2FhX3dyaXRlYihTQUE3MTM0X1ZJREVPX1BJWEVMUzIodGFzayksICAgICB3aWR0aCAgPj4gOCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X1ZJREVPX0xJTkVTMSh0YXNrKSwgICAgICBoZWlnaHQvZGl2ICYgMHhmZik7CisJc2FhX3dyaXRlYihTQUE3MTM0X1ZJREVPX0xJTkVTMih0YXNrKSwgICAgICBoZWlnaHQvZGl2ID4+IDgpOworCisJLyogZGVpbnRlcmxhY2UgeSBvZmZzZXRzICovCisJeV9vZGQgID0gZGV2LT5jdGxfeV9vZGQ7CisJeV9ldmVuID0gZGV2LT5jdGxfeV9ldmVuOworCXNhYV93cml0ZWIoU0FBNzEzNF9WX1BIQVNFX09GRlNFVDAodGFzayksIHlfb2RkKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVl9QSEFTRV9PRkZTRVQxKHRhc2spLCB5X2V2ZW4pOworCXNhYV93cml0ZWIoU0FBNzEzNF9WX1BIQVNFX09GRlNFVDIodGFzayksIHlfb2RkKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVl9QSEFTRV9PRkZTRVQzKHRhc2spLCB5X2V2ZW4pOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGNsaXBsaXN0IHsKKwlfX3UxNiBwb3NpdGlvbjsKKwlfX3U4ICBlbmFibGU7CisJX191OCAgZGlzYWJsZTsKK307CisKK3N0YXRpYyB2b2lkIHNvcnRfY2xpcGxpc3Qoc3RydWN0IGNsaXBsaXN0ICpjbCwgaW50IGVudHJpZXMpCit7CisJc3RydWN0IGNsaXBsaXN0IHN3YXA7CisJaW50IGksaixuOworCisJZm9yIChpID0gZW50cmllcy0yOyBpID49IDA7IGktLSkgeworCQlmb3IgKG4gPSAwLCBqID0gMDsgaiA8PSBpOyBqKyspIHsKKwkJCWlmIChjbFtqXS5wb3NpdGlvbiA+IGNsW2orMV0ucG9zaXRpb24pIHsKKwkJCQlzd2FwID0gY2xbal07CisJCQkJY2xbal0gPSBjbFtqKzFdOworCQkJCWNsW2orMV0gPSBzd2FwOworCQkJCW4rKzsKKwkJCX0KKwkJfQorCQlpZiAoMCA9PSBuKQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfY2xpcGxpc3Qoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCByZWcsCisJCQlzdHJ1Y3QgY2xpcGxpc3QgKmNsLCBpbnQgZW50cmllcywgY2hhciAqbmFtZSkKK3sKKwlfX3U4IHdpbmJpdHMgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQl3aW5iaXRzIHw9IGNsW2ldLmVuYWJsZTsKKwkJd2luYml0cyAmPSB+Y2xbaV0uZGlzYWJsZTsKKwkJaWYgKGkgPCAxNSAmJiBjbFtpXS5wb3NpdGlvbiA9PSBjbFtpKzFdLnBvc2l0aW9uKQorCQkJY29udGludWU7CisJCXNhYV93cml0ZWIocmVnICsgMCwgd2luYml0cyk7CisJCXNhYV93cml0ZWIocmVnICsgMiwgY2xbaV0ucG9zaXRpb24gJiAweGZmKTsKKwkJc2FhX3dyaXRlYihyZWcgKyAzLCBjbFtpXS5wb3NpdGlvbiA+PiA4KTsKKwkJZHByaW50aygiY2xpcDogJXMgd2luYml0cz0lMDJ4IHBvcz0lZFxuIiwKKwkJCW5hbWUsd2luYml0cyxjbFtpXS5wb3NpdGlvbik7CisJCXJlZyArPSA4OworCX0KKwlmb3IgKDsgcmVnIDwgMHg0MDA7IHJlZyArPSA4KSB7CisJCXNhYV93cml0ZWIocmVnKyAwLCAwKTsKKwkJc2FhX3dyaXRlYihyZWcgKyAxLCAwKTsKKwkJc2FhX3dyaXRlYihyZWcgKyAyLCAwKTsKKwkJc2FhX3dyaXRlYihyZWcgKyAzLCAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2xpcF9yYW5nZShpbnQgdmFsKQoreworCWlmICh2YWwgPCAwKQorCQl2YWwgPSAwOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfY2xpcHBpbmcoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2NsaXAgKmNsaXBzLAorCQkJICBpbnQgbmNsaXBzLCBpbnQgaW50ZXJsYWNlKQoreworCXN0cnVjdCBjbGlwbGlzdCBjb2xbMTZdLCByb3dbMTZdOworCWludCBjb2xzLCByb3dzLCBpOworCWludCBkaXYgPSBpbnRlcmxhY2UgPyAyIDogMTsKKworCW1lbXNldChjb2wsMCxzaXplb2YoY29sKSk7IGNvbHMgPSAwOworCW1lbXNldChyb3csMCxzaXplb2Yocm93KSk7IHJvd3MgPSAwOworCWZvciAoaSA9IDA7IGkgPCBuY2xpcHMgJiYgaSA8IDg7IGkrKykgeworCQljb2xbY29sc10ucG9zaXRpb24gPSBjbGlwX3JhbmdlKGNsaXBzW2ldLmMubGVmdCk7CisJCWNvbFtjb2xzXS5lbmFibGUgICA9ICgxIDw8IGkpOworCQljb2xzKys7CisJCWNvbFtjb2xzXS5wb3NpdGlvbiA9IGNsaXBfcmFuZ2UoY2xpcHNbaV0uYy5sZWZ0K2NsaXBzW2ldLmMud2lkdGgpOworCQljb2xbY29sc10uZGlzYWJsZSAgPSAoMSA8PCBpKTsKKwkJY29scysrOworCQlyb3dbcm93c10ucG9zaXRpb24gPSBjbGlwX3JhbmdlKGNsaXBzW2ldLmMudG9wIC8gZGl2KTsKKwkJcm93W3Jvd3NdLmVuYWJsZSAgID0gKDEgPDwgaSk7CisJCXJvd3MrKzsKKwkJcm93W3Jvd3NdLnBvc2l0aW9uID0gY2xpcF9yYW5nZSgoY2xpcHNbaV0uYy50b3AgKyBjbGlwc1tpXS5jLmhlaWdodCkKKwkJCQkJCS8gZGl2KTsKKwkJcm93W3Jvd3NdLmRpc2FibGUgID0gKDEgPDwgaSk7CisJCXJvd3MrKzsKKwl9CisJc29ydF9jbGlwbGlzdChjb2wsY29scyk7CisJc29ydF9jbGlwbGlzdChyb3cscm93cyk7CisJc2V0X2NsaXBsaXN0KGRldiwweDM4MCxjb2wsY29scywiY29scyIpOworCXNldF9jbGlwbGlzdChkZXYsMHgzODQscm93LHJvd3MsInJvd3MiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfcHJldmlldyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHY0bDJfd2luZG93ICp3aW4pCit7CisJZW51bSB2NGwyX2ZpZWxkIGZpZWxkOworCWludCBtYXh3LCBtYXhoOworCisJaWYgKE5VTEwgPT0gZGV2LT5vdmJ1Zi5iYXNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoTlVMTCA9PSBkZXYtPm92Zm10KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAod2luLT53LndpZHRoIDwgNDggfHwgd2luLT53LmhlaWdodCA8ICAzMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHdpbi0+Y2xpcGNvdW50ID4gMjA0OCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmaWVsZCA9IHdpbi0+ZmllbGQ7CisJbWF4dyAgPSBkZXYtPmNyb3BfY3VycmVudC53aWR0aDsKKwltYXhoICA9IGRldi0+Y3JvcF9jdXJyZW50LmhlaWdodDsKKworCWlmIChWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCkgeworICAgICAgICAgICAgICAgIGZpZWxkID0gKHdpbi0+dy5oZWlnaHQgPiBtYXhoLzIpCisgICAgICAgICAgICAgICAgICAgICAgICA/IFY0TDJfRklFTERfSU5URVJMQUNFRAorICAgICAgICAgICAgICAgICAgICAgICAgOiBWNEwyX0ZJRUxEX1RPUDsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICAgIGNhc2UgVjRMMl9GSUVMRF9UT1A6CisgICAgICAgIGNhc2UgVjRMMl9GSUVMRF9CT1RUT006CisgICAgICAgICAgICAgICAgbWF4aCA9IG1heGggLyAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisJd2luLT5maWVsZCA9IGZpZWxkOworCWlmICh3aW4tPncud2lkdGggPiBtYXh3KQorCQl3aW4tPncud2lkdGggPSBtYXh3OworCWlmICh3aW4tPncuaGVpZ2h0ID4gbWF4aCkKKwkJd2luLT53LmhlaWdodCA9IG1heGg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfcHJldmlldyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHNhYTcxMzRfZmggKmZoKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSxjb250cm9sLGJwbDsKKwlpbnQgZXJyOworCisJZXJyID0gdmVyaWZ5X3ByZXZpZXcoZGV2LCZmaC0+d2luKTsKKwlpZiAoMCAhPSBlcnIpCisJCXJldHVybiBlcnI7CisKKwlkZXYtPm92ZmllbGQgPSBmaC0+d2luLmZpZWxkOworCWRwcmludGsoInN0YXJ0X3ByZXZpZXcgJWR4JWQrJWQrJWQgJXMgZmllbGQ9JXNcbiIsCisJCWZoLT53aW4udy53aWR0aCxmaC0+d2luLncuaGVpZ2h0LAorCQlmaC0+d2luLncubGVmdCxmaC0+d2luLncudG9wLAorCQlkZXYtPm92Zm10LT5uYW1lLHY0bDJfZmllbGRfbmFtZXNbZGV2LT5vdmZpZWxkXSk7CisKKwkvKiBzZXR1cCB3aW5kb3cgKyBjbGlwcGluZyAqLworCXNldF9zaXplKGRldixUQVNLX0IsZmgtPndpbi53LndpZHRoLGZoLT53aW4udy5oZWlnaHQsCisJCSBWNEwyX0ZJRUxEX0hBU19CT1RIKGRldi0+b3ZmaWVsZCkpOworCXNldHVwX2NsaXBwaW5nKGRldixmaC0+Y2xpcHMsZmgtPm5jbGlwcywKKwkJICAgICAgIFY0TDJfRklFTERfSEFTX0JPVEgoZGV2LT5vdmZpZWxkKSk7CisJaWYgKGRldi0+b3ZmbXQtPnl1dikKKwkJc2FhX2FuZG9yYihTQUE3MTM0X0RBVEFfUEFUSChUQVNLX0IpLCAweDNmLCAweDAzKTsKKwllbHNlCisJCXNhYV9hbmRvcmIoU0FBNzEzNF9EQVRBX1BBVEgoVEFTS19CKSwgMHgzZiwgMHgwMSk7CisJc2FhX3dyaXRlYihTQUE3MTM0X09GTVRfVklERU9fQiwgZGV2LT5vdmZtdC0+cG0gfCAweDIwKTsKKworCS8qIGRtYTogc2V0dXAgY2hhbm5lbCAxICg9IFZpZGVvIFRhc2sgQikgKi8KKwliYXNlICA9ICh1bnNpZ25lZCBsb25nKWRldi0+b3ZidWYuYmFzZTsKKwliYXNlICs9IGRldi0+b3ZidWYuZm10LmJ5dGVzcGVybGluZSAqIGZoLT53aW4udy50b3A7CisJYmFzZSArPSBkZXYtPm92Zm10LT5kZXB0aC84ICAgICAgICAgKiBmaC0+d2luLncubGVmdDsKKwlicGwgICA9IGRldi0+b3ZidWYuZm10LmJ5dGVzcGVybGluZTsKKwljb250cm9sID0gU0FBNzEzNF9SU19DT05UUk9MX0JVUlNUXzE2OworCWlmIChkZXYtPm92Zm10LT5ic3dhcCkKKwkJY29udHJvbCB8PSBTQUE3MTM0X1JTX0NPTlRST0xfQlNXQVA7CisJaWYgKGRldi0+b3ZmbXQtPndzd2FwKQorCQljb250cm9sIHw9IFNBQTcxMzRfUlNfQ09OVFJPTF9XU1dBUDsKKwlpZiAoVjRMMl9GSUVMRF9IQVNfQk9USChkZXYtPm92ZmllbGQpKSB7CisJCXNhYV93cml0ZWwoU0FBNzEzNF9SU19CQTEoMSksYmFzZSk7CisJCXNhYV93cml0ZWwoU0FBNzEzNF9SU19CQTIoMSksYmFzZSticGwpOworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfUElUQ0goMSksYnBsKjIpOworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQ09OVFJPTCgxKSxjb250cm9sKTsKKwl9IGVsc2UgeworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkExKDEpLGJhc2UpOworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkEyKDEpLGJhc2UpOworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfUElUQ0goMSksYnBsKTsKKwkJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0NPTlRST0woMSksY29udHJvbCk7CisJfQorCisJLyogc3RhcnQgZG1hICovCisJZGV2LT5vdmVuYWJsZSA9IDE7CisJc2FhNzEzNF9zZXRfZG1hYml0cyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RvcF9wcmV2aWV3KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgpCit7CisJZGV2LT5vdmVuYWJsZSA9IDA7CisJc2FhNzEzNF9zZXRfZG1hYml0cyhkZXYpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBidWZmZXJfYWN0aXZhdGUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsCisJCQkgICBzdHJ1Y3Qgc2FhNzEzNF9idWYgKmJ1ZiwKKwkJCSAgIHN0cnVjdCBzYWE3MTM0X2J1ZiAqbmV4dCkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UsY29udHJvbCxicGw7CisJdW5zaWduZWQgbG9uZyBicGxfdXYsbGluZXNfdXYsYmFzZTIsYmFzZTMsdG1wOyAvKiBwbGFuYXIgKi8KKworCWRwcmludGsoImJ1ZmZlcl9hY3RpdmF0ZSBidWY9JXBcbiIsYnVmKTsKKwlidWYtPnZiLnN0YXRlID0gU1RBVEVfQUNUSVZFOworCWJ1Zi0+dG9wX3NlZW4gPSAwOworCisJc2V0X3NpemUoZGV2LFRBU0tfQSxidWYtPnZiLndpZHRoLGJ1Zi0+dmIuaGVpZ2h0LAorCQkgVjRMMl9GSUVMRF9IQVNfQk9USChidWYtPnZiLmZpZWxkKSk7CisJaWYgKGJ1Zi0+Zm10LT55dXYpCisJCXNhYV9hbmRvcmIoU0FBNzEzNF9EQVRBX1BBVEgoVEFTS19BKSwgMHgzZiwgMHgwMyk7CisJZWxzZQorCQlzYWFfYW5kb3JiKFNBQTcxMzRfREFUQV9QQVRIKFRBU0tfQSksIDB4M2YsIDB4MDEpOworCXNhYV93cml0ZWIoU0FBNzEzNF9PRk1UX1ZJREVPX0EsIGJ1Zi0+Zm10LT5wbSk7CisKKwkvKiBETUE6IHNldHVwIGNoYW5uZWwgMCAoPSBWaWRlbyBUYXNrIEEwKSAqLworCWJhc2UgID0gc2FhNzEzNF9idWZmZXJfYmFzZShidWYpOworCWlmIChidWYtPmZtdC0+cGxhbmFyKQorCQlicGwgPSBidWYtPnZiLndpZHRoOworCWVsc2UKKwkJYnBsID0gKGJ1Zi0+dmIud2lkdGggKiBidWYtPmZtdC0+ZGVwdGgpIC8gODsKKwljb250cm9sID0gU0FBNzEzNF9SU19DT05UUk9MX0JVUlNUXzE2IHwKKwkJU0FBNzEzNF9SU19DT05UUk9MX01FIHwKKwkJKGJ1Zi0+cHQtPmRtYSA+PiAxMik7CisJaWYgKGJ1Zi0+Zm10LT5ic3dhcCkKKwkJY29udHJvbCB8PSBTQUE3MTM0X1JTX0NPTlRST0xfQlNXQVA7CisJaWYgKGJ1Zi0+Zm10LT53c3dhcCkKKwkJY29udHJvbCB8PSBTQUE3MTM0X1JTX0NPTlRST0xfV1NXQVA7CisJaWYgKFY0TDJfRklFTERfSEFTX0JPVEgoYnVmLT52Yi5maWVsZCkpIHsKKwkJLyogaW50ZXJsYWNlZCAqLworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkExKDApLGJhc2UpOworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkEyKDApLGJhc2UrYnBsKTsKKwkJc2FhX3dyaXRlbChTQUE3MTM0X1JTX1BJVENIKDApLGJwbCoyKTsKKwl9IGVsc2UgeworCQkvKiBub24taW50ZXJsYWNlZCAqLworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkExKDApLGJhc2UpOworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkEyKDApLGJhc2UpOworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfUElUQ0goMCksYnBsKTsKKwl9CisJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0NPTlRST0woMCksY29udHJvbCk7CisKKwlpZiAoYnVmLT5mbXQtPnBsYW5hcikgeworCQkvKiBETUE6IHNldHVwIGNoYW5uZWwgNCs1ICg9IHBsYW5hciB0YXNrIEEpICovCisJCWJwbF91diAgID0gYnBsID4+IGJ1Zi0+Zm10LT5oc2hpZnQ7CisJCWxpbmVzX3V2ID0gYnVmLT52Yi5oZWlnaHQgPj4gYnVmLT5mbXQtPnZzaGlmdDsKKwkJYmFzZTIgICAgPSBiYXNlICsgYnBsICogYnVmLT52Yi5oZWlnaHQ7CisJCWJhc2UzICAgID0gYmFzZTIgKyBicGxfdXYgKiBsaW5lc191djsKKwkJaWYgKGJ1Zi0+Zm10LT51dnN3YXApCisJCQl0bXAgPSBiYXNlMiwgYmFzZTIgPSBiYXNlMywgYmFzZTMgPSB0bXA7CisJCWRwcmludGsoInV2OiBicGw9JWxkIGxpbmVzPSVsZCBiYXNlMi8zPSVsZC8lbGRcbiIsCisJCQlicGxfdXYsbGluZXNfdXYsYmFzZTIsYmFzZTMpOworCQlpZiAoVjRMMl9GSUVMRF9IQVNfQk9USChidWYtPnZiLmZpZWxkKSkgeworCQkJLyogaW50ZXJsYWNlZCAqLworCQkJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0JBMSg0KSxiYXNlMik7CisJCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkEyKDQpLGJhc2UyK2JwbF91dik7CisJCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfUElUQ0goNCksYnBsX3V2KjIpOworCQkJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0JBMSg1KSxiYXNlMyk7CisJCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQkEyKDUpLGJhc2UzK2JwbF91dik7CisJCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfUElUQ0goNSksYnBsX3V2KjIpOworCQl9IGVsc2UgeworCQkJLyogbm9uLWludGVybGFjZWQgKi8KKwkJCXNhYV93cml0ZWwoU0FBNzEzNF9SU19CQTEoNCksYmFzZTIpOworCQkJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0JBMig0KSxiYXNlMik7CisJCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfUElUQ0goNCksYnBsX3V2KTsKKwkJCXNhYV93cml0ZWwoU0FBNzEzNF9SU19CQTEoNSksYmFzZTMpOworCQkJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0JBMig1KSxiYXNlMyk7CisJCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfUElUQ0goNSksYnBsX3V2KTsKKwkJfQorCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfQ09OVFJPTCg0KSxjb250cm9sKTsKKwkJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0NPTlRST0woNSksY29udHJvbCk7CisJfQorCisJLyogc3RhcnQgRE1BICovCisJc2FhNzEzNF9zZXRfZG1hYml0cyhkZXYpOworCW1vZF90aW1lcigmZGV2LT52aWRlb19xLnRpbWVvdXQsIGppZmZpZXMrQlVGRkVSX1RJTUVPVVQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKKwkJCSAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCisJCQkgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBxLT5wcml2X2RhdGE7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBzYWE3MTM0X2J1Zix2Yik7CisJdW5zaWduZWQgaW50IHNpemU7CisJaW50IGVycjsKKworCS8qIHNhbml0eSBjaGVja3MgKi8KKwlpZiAoTlVMTCA9PSBmaC0+Zm10KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZmgtPndpZHRoICAgIDwgNDggfHwKKwkgICAgZmgtPmhlaWdodCAgIDwgMzIgfHwKKwkgICAgZmgtPndpZHRoLzQgID4gZGV2LT5jcm9wX2N1cnJlbnQud2lkdGggIHx8CisJICAgIGZoLT5oZWlnaHQvNCA+IGRldi0+Y3JvcF9jdXJyZW50LmhlaWdodCB8fAorCSAgICBmaC0+d2lkdGggICAgPiBkZXYtPmNyb3BfYm91bmRzLndpZHRoICB8fAorCSAgICBmaC0+aGVpZ2h0ICAgPiBkZXYtPmNyb3BfYm91bmRzLmhlaWdodCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2l6ZSA9IChmaC0+d2lkdGggKiBmaC0+aGVpZ2h0ICogZmgtPmZtdC0+ZGVwdGgpID4+IDM7CisJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBzaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRwcmludGsoImJ1ZmZlcl9wcmVwYXJlIFslZCxzaXplPSVkeCVkLGJ5dGVzPSVkLGZpZWxkcz0lcywlc11cbiIsCisJCXZiLT5pLGZoLT53aWR0aCxmaC0+aGVpZ2h0LHNpemUsdjRsMl9maWVsZF9uYW1lc1tmaWVsZF0sCisJCWZoLT5mbXQtPm5hbWUpOworCWlmIChidWYtPnZiLndpZHRoICAhPSBmaC0+d2lkdGggIHx8CisJICAgIGJ1Zi0+dmIuaGVpZ2h0ICE9IGZoLT5oZWlnaHQgfHwKKwkgICAgYnVmLT52Yi5zaXplICAgIT0gc2l6ZSAgICAgICB8fAorCSAgICBidWYtPnZiLmZpZWxkICAhPSBmaWVsZCAgICAgIHx8CisJICAgIGJ1Zi0+Zm10ICAgICAgICE9IGZoLT5mbXQpIHsKKwkJc2FhNzEzNF9kbWFfZnJlZShkZXYsYnVmKTsKKwl9CisKKwlpZiAoU1RBVEVfTkVFRFNfSU5JVCA9PSBidWYtPnZiLnN0YXRlKSB7CisJCWJ1Zi0+dmIud2lkdGggID0gZmgtPndpZHRoOworCQlidWYtPnZiLmhlaWdodCA9IGZoLT5oZWlnaHQ7CisJCWJ1Zi0+dmIuc2l6ZSAgID0gc2l6ZTsKKwkJYnVmLT52Yi5maWVsZCAgPSBmaWVsZDsKKwkJYnVmLT5mbXQgICAgICAgPSBmaC0+Zm10OworCQlidWYtPnB0ICAgICAgICA9ICZmaC0+cHRfY2FwOworCisJCWVyciA9IHZpZGVvYnVmX2lvbG9jayhkZXYtPnBjaSwmYnVmLT52YiwmZGV2LT5vdmJ1Zik7CisJCWlmIChlcnIpCisJCQlnb3RvIG9vcHM7CisJCWVyciA9IHNhYTcxMzRfcGd0YWJsZV9idWlsZChkZXYtPnBjaSxidWYtPnB0LAorCQkJCQkgICAgYnVmLT52Yi5kbWEuc2dsaXN0LAorCQkJCQkgICAgYnVmLT52Yi5kbWEuc2dsZW4sCisJCQkJCSAgICBzYWE3MTM0X2J1ZmZlcl9zdGFydHBhZ2UoYnVmKSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG9vcHM7CisJfQorCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKKwlidWYtPmFjdGl2YXRlID0gYnVmZmVyX2FjdGl2YXRlOworCXJldHVybiAwOworCisgb29wczoKKwlzYWE3MTM0X2RtYV9mcmVlKGRldixidWYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK2J1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHVuc2lnbmVkIGludCAqY291bnQsIHVuc2lnbmVkIGludCAqc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBxLT5wcml2X2RhdGE7CisKKwkqc2l6ZSA9IGZoLT5mbXQtPmRlcHRoICogZmgtPndpZHRoICogZmgtPmhlaWdodCA+PiAzOworCWlmICgwID09ICpjb3VudCkKKwkJKmNvdW50ID0gZ2J1ZmZlcnM7CisJKmNvdW50ID0gc2FhNzEzNF9idWZmZXJfY291bnQoKnNpemUsKmNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBzYWE3MTM0X2J1Zix2Yik7CisKKwlzYWE3MTM0X2J1ZmZlcl9xdWV1ZShmaC0+ZGV2LCZmaC0+ZGV2LT52aWRlb19xLGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBzYWE3MTM0X2J1Zix2Yik7CisKKwlzYWE3MTM0X2RtYV9mcmVlKGZoLT5kZXYsYnVmKTsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgdmlkZW9fcW9wcyA9IHsKKwkuYnVmX3NldHVwICAgID0gYnVmZmVyX3NldHVwLAorCS5idWZfcHJlcGFyZSAgPSBidWZmZXJfcHJlcGFyZSwKKwkuYnVmX3F1ZXVlICAgID0gYnVmZmVyX3F1ZXVlLAorCS5idWZfcmVsZWFzZSAgPSBidWZmZXJfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGdldF9jb250cm9sKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjKQoreworCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCogY3RybDsKKworCWN0cmwgPSBjdHJsX2J5X2lkKGMtPmlkKTsKKwlpZiAoTlVMTCA9PSBjdHJsKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2ggKGMtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQljLT52YWx1ZSA9IGRldi0+Y3RsX2JyaWdodDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCWMtPnZhbHVlID0gZGV2LT5jdGxfaHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQljLT52YWx1ZSA9IGRldi0+Y3RsX2NvbnRyYXN0OworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCWMtPnZhbHVlID0gZGV2LT5jdGxfc2F0dXJhdGlvbjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQljLT52YWx1ZSA9IGRldi0+Y3RsX211dGU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQljLT52YWx1ZSA9IGRldi0+Y3RsX3ZvbHVtZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0lOVkVSVDoKKwkJYy0+dmFsdWUgPSBkZXYtPmN0bF9pbnZlcnQ7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfVkZMSVA6CisJCWMtPnZhbHVlID0gZGV2LT5jdGxfbWlycm9yOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfWV9FVkVOOgorCQljLT52YWx1ZSA9IGRldi0+Y3RsX3lfZXZlbjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1lfT0REOgorCQljLT52YWx1ZSA9IGRldi0+Y3RsX3lfb2RkOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT01VVEU6CisJCWMtPnZhbHVlID0gZGV2LT5jdGxfYXV0b211dGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfY29udHJvbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHNhYTcxMzRfZmggKmZoLAorCQkgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCAqYykKK3sKKwljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwqIGN0cmw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzdGFydF9vdmVybGF5ID0gMDsKKworCWN0cmwgPSBjdHJsX2J5X2lkKGMtPmlkKTsKKwlpZiAoTlVMTCA9PSBjdHJsKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkcHJpbnRrKCJzZXRfY29udHJvbCBuYW1lPSVzIHZhbD0lZFxuIixjdHJsLT5uYW1lLGMtPnZhbHVlKTsKKwlzd2l0Y2ggKGN0cmwtPnR5cGUpIHsKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU46CisJY2FzZSBWNEwyX0NUUkxfVFlQRV9NRU5VOgorCWNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUjoKKwkJaWYgKGMtPnZhbHVlIDwgY3RybC0+bWluaW11bSkKKwkJCWMtPnZhbHVlID0gY3RybC0+bWluaW11bTsKKwkJaWYgKGMtPnZhbHVlID4gY3RybC0+bWF4aW11bSkKKwkJCWMtPnZhbHVlID0gY3RybC0+bWF4aW11bTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogbm90aGluZyAqLzsKKwl9OworCXN3aXRjaCAoYy0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWRldi0+Y3RsX2JyaWdodCA9IGMtPnZhbHVlOworCQlzYWFfd3JpdGViKFNBQTcxMzRfREVDX0xVTUFfQlJJR0hULCBkZXYtPmN0bF9icmlnaHQpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0hVRToKKwkJZGV2LT5jdGxfaHVlID0gYy0+dmFsdWU7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9ERUNfQ0hST01BX0hVRSwgZGV2LT5jdGxfaHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJZGV2LT5jdGxfY29udHJhc3QgPSBjLT52YWx1ZTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0RFQ19MVU1BX0NPTlRSQVNULAorCQkJICAgZGV2LT5jdGxfaW52ZXJ0ID8gLWRldi0+Y3RsX2NvbnRyYXN0IDogZGV2LT5jdGxfY29udHJhc3QpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCWRldi0+Y3RsX3NhdHVyYXRpb24gPSBjLT52YWx1ZTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0RFQ19DSFJPTUFfU0FUVVJBVElPTiwKKwkJCSAgIGRldi0+Y3RsX2ludmVydCA/IC1kZXYtPmN0bF9zYXR1cmF0aW9uIDogZGV2LT5jdGxfc2F0dXJhdGlvbik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJZGV2LT5jdGxfbXV0ZSA9IGMtPnZhbHVlOworCQlzYWE3MTM0X3R2YXVkaW9fc2V0bXV0ZShkZXYpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwkJZGV2LT5jdGxfdm9sdW1lID0gYy0+dmFsdWU7CisJCXNhYTcxMzRfdHZhdWRpb19zZXR2b2x1bWUoZGV2LGRldi0+Y3RsX3ZvbHVtZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUFJJVkFURV9JTlZFUlQ6CisJCWRldi0+Y3RsX2ludmVydCA9IGMtPnZhbHVlOworCQlzYWFfd3JpdGViKFNBQTcxMzRfREVDX0xVTUFfQ09OVFJBU1QsCisJCQkgICBkZXYtPmN0bF9pbnZlcnQgPyAtZGV2LT5jdGxfY29udHJhc3QgOiBkZXYtPmN0bF9jb250cmFzdCk7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9ERUNfQ0hST01BX1NBVFVSQVRJT04sCisJCQkgICBkZXYtPmN0bF9pbnZlcnQgPyAtZGV2LT5jdGxfc2F0dXJhdGlvbiA6IGRldi0+Y3RsX3NhdHVyYXRpb24pOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQlkZXYtPmN0bF9taXJyb3IgPSBjLT52YWx1ZTsKKwkJcmVzdGFydF9vdmVybGF5ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1lfRVZFTjoKKwkJZGV2LT5jdGxfeV9ldmVuID0gYy0+dmFsdWU7CisJCXJlc3RhcnRfb3ZlcmxheSA9IDE7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUFJJVkFURV9ZX09ERDoKKwkJZGV2LT5jdGxfeV9vZGQgPSBjLT52YWx1ZTsKKwkJcmVzdGFydF9vdmVybGF5ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0FVVE9NVVRFOgorCQlkZXYtPmN0bF9hdXRvbXV0ZSA9IGMtPnZhbHVlOworCQlpZiAoZGV2LT50ZGE5ODg3X2NvbmYpIHsKKwkJCWlmIChkZXYtPmN0bF9hdXRvbXV0ZSkKKwkJCQlkZXYtPnRkYTk4ODdfY29uZiB8PSBUREE5ODg3X0FVVE9NVVRFOworCQkJZWxzZQorCQkJCWRldi0+dGRhOTg4N19jb25mICY9IH5UREE5ODg3X0FVVE9NVVRFOworCQkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVERBOTg4N19TRVRfQ09ORklHLAorCQkJCQkJICZkZXYtPnRkYTk4ODdfY29uZik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZXN0YXJ0X292ZXJsYXkgJiYgZmggJiYgcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9PVkVSTEFZKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jayxmbGFncyk7CisJCXN0b3BfcHJldmlldyhkZXYsZmgpOworCQlzdGFydF9wcmV2aWV3KGRldixmaCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWUqIHNhYTcxMzRfcXVldWUoc3RydWN0IHNhYTcxMzRfZmggKmZoKQoreworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSogcSA9IE5VTEw7CisKKwlzd2l0Y2ggKGZoLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCXEgPSAmZmgtPmNhcDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlxID0gJmZoLT52Ymk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlyZXR1cm4gcTsKK30KKworc3RhdGljIGludCBzYWE3MTM0X3Jlc291cmNlKHN0cnVjdCBzYWE3MTM0X2ZoICpmaCkKK3sKKwlpbnQgcmVzID0gMDsKKworCXN3aXRjaCAoZmgtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJcmVzID0gUkVTT1VSQ0VfVklERU87CisJCWJyZWFrOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRToKKwkJcmVzID0gUkVTT1VSQ0VfVkJJOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCB2aWRlb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpoLCpkZXYgPSBOVUxMOworCXN0cnVjdCBzYWE3MTM0X2ZoICpmaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWludCByYWRpbyA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsJnNhYTcxMzRfZGV2bGlzdCkgeworCQloID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc2FhNzEzNF9kZXYsIGRldmxpc3QpOworCQlpZiAoaC0+dmlkZW9fZGV2ICYmIChoLT52aWRlb19kZXYtPm1pbm9yID09IG1pbm9yKSkKKwkJCWRldiA9IGg7CisJCWlmIChoLT5yYWRpb19kZXYgJiYgKGgtPnJhZGlvX2Rldi0+bWlub3IgPT0gbWlub3IpKSB7CisJCQlyYWRpbyA9IDE7CisJCQlkZXYgPSBoOworCQl9CisJCWlmIChoLT52YmlfZGV2ICYmIChoLT52YmlfZGV2LT5taW5vciA9PSBtaW5vcikpIHsKKwkJCXR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOworCQkJZGV2ID0gaDsKKwkJfQorCX0KKwlpZiAoTlVMTCA9PSBkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJZHByaW50aygib3BlbiBtaW5vcj0lZCByYWRpbz0lZCB0eXBlPSVzXG4iLG1pbm9yLHJhZGlvLAorCQl2NGwyX3R5cGVfbmFtZXNbdHlwZV0pOworCisJLyogYWxsb2NhdGUgKyBpbml0aWFsaXplIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KKwlmaCA9IGttYWxsb2Moc2l6ZW9mKCpmaCksR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gZmgpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChmaCwwLHNpemVvZigqZmgpKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKKwlmaC0+ZGV2ICAgICAgPSBkZXY7CisJZmgtPnJhZGlvICAgID0gcmFkaW87CisJZmgtPnR5cGUgICAgID0gdHlwZTsKKwlmaC0+Zm10ICAgICAgPSBmb3JtYXRfYnlfZm91cmNjKFY0TDJfUElYX0ZNVF9CR1IyNCk7CisJZmgtPndpZHRoICAgID0gNzIwOworCWZoLT5oZWlnaHQgICA9IDU3NjsKKwl2NGwyX3ByaW9fb3BlbigmZGV2LT5wcmlvLCZmaC0+cHJpbyk7CisKKwl2aWRlb2J1Zl9xdWV1ZV9pbml0KCZmaC0+Y2FwLCAmdmlkZW9fcW9wcywKKwkJCSAgICBkZXYtPnBjaSwgJmRldi0+c2xvY2ssCisJCQkgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkJICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNhYTcxMzRfYnVmKSwKKwkJCSAgICBmaCk7CisJdmlkZW9idWZfcXVldWVfaW5pdCgmZmgtPnZiaSwgJnNhYTcxMzRfdmJpX3FvcHMsCisJCQkgICAgZGV2LT5wY2ksICZkZXYtPnNsb2NrLAorCQkJICAgIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUsCisJCQkgICAgVjRMMl9GSUVMRF9TRVFfVEIsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYWE3MTM0X2J1ZiksCisJCQkgICAgZmgpOworCXNhYTcxMzRfcGd0YWJsZV9hbGxvYyhkZXYtPnBjaSwmZmgtPnB0X2NhcCk7CisJc2FhNzEzNF9wZ3RhYmxlX2FsbG9jKGRldi0+cGNpLCZmaC0+cHRfdmJpKTsKKworCWlmIChmaC0+cmFkaW8pIHsKKwkJLyogc3dpdGNoIHRvIHJhZGlvIG1vZGUgKi8KKwkJc2FhNzEzNF90dmF1ZGlvX3NldGlucHV0KGRldiwmY2FyZChkZXYpLnJhZGlvKTsKKwkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixBVURDX1NFVF9SQURJTyxOVUxMKTsKKwl9IGVsc2UgeworCQkvKiBzd2l0Y2ggdG8gdmlkZW8vdmJpIG1vZGUgKi8KKwkJdmlkZW9fbXV4KGRldixkZXYtPmN0bF9pbnB1dCk7CisJfQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK3ZpZGVvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGZoLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCWlmIChyZXNfbG9ja2VkKGZoLT5kZXYsUkVTT1VSQ0VfVklERU8pKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfb25lKHNhYTcxMzRfcXVldWUoZmgpLAorCQkJCQkgZGF0YSwgY291bnQsIHBwb3MsCisJCQkJCSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlpZiAoIXJlc19nZXQoZmgtPmRldixmaCxSRVNPVVJDRV9WQkkpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfc3RyZWFtKHNhYTcxMzRfcXVldWUoZmgpLAorCQkJCQkgICAgZGF0YSwgY291bnQsIHBwb3MsIDEsCisJCQkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3ZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqYnVmID0gTlVMTDsKKworCWlmIChWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFID09IGZoLT50eXBlKQorCQlyZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmZoLT52YmksIHdhaXQpOworCisJaWYgKHJlc19jaGVjayhmaCxSRVNPVVJDRV9WSURFTykpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZmaC0+Y2FwLnN0cmVhbSkpCisJCQlidWYgPSBsaXN0X2VudHJ5KGZoLT5jYXAuc3RyZWFtLm5leHQsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIsIHN0cmVhbSk7CisJfSBlbHNlIHsKKwkJZG93bigmZmgtPmNhcC5sb2NrKTsKKwkJaWYgKFVOU0VUID09IGZoLT5jYXAucmVhZF9vZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWQgdG8gY2FwdHVyZSBhIG5ldyBmcmFtZSAqLworCQkJaWYgKHJlc19sb2NrZWQoZmgtPmRldixSRVNPVVJDRV9WSURFTykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZoLT5jYXAubG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQT0xMRVJSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT0gZmgtPmNhcC5vcHMtPmJ1Zl9wcmVwYXJlKCZmaC0+Y2FwLGZoLT5jYXAucmVhZF9idWYsZmgtPmNhcC5maWVsZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZoLT5jYXAubG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQT0xMRVJSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmgtPmNhcC5vcHMtPmJ1Zl9xdWV1ZSgmZmgtPmNhcCxmaC0+Y2FwLnJlYWRfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZoLT5jYXAucmVhZF9vZmYgPSAwOworCQl9CisJCXVwKCZmaC0+Y2FwLmxvY2spOworCQlidWYgPSBmaC0+Y2FwLnJlYWRfYnVmOworCX0KKworCWlmICghYnVmKQorCQlyZXR1cm4gUE9MTEVSUjsKKworCXBvbGxfd2FpdChmaWxlLCAmYnVmLT5kb25lLCB3YWl0KTsKKwlpZiAoYnVmLT5zdGF0ZSA9PSBTVEFURV9ET05FIHx8CisJICAgIGJ1Zi0+c3RhdGUgPT0gU1RBVEVfRVJST1IpCisJCXJldHVybiBQT0xMSU58UE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzYWE3MTM0X2ZoICAqZmggID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogdHVybiBvZmYgb3ZlcmxheSAqLworCWlmIChyZXNfY2hlY2soZmgsIFJFU09VUkNFX09WRVJMQVkpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNsb2NrLGZsYWdzKTsKKwkJc3RvcF9wcmV2aWV3KGRldixmaCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssZmxhZ3MpOworCQlyZXNfZnJlZShkZXYsZmgsUkVTT1VSQ0VfT1ZFUkxBWSk7CisJfQorCisJLyogc3RvcCB2aWRlbyBjYXB0dXJlICovCisJaWYgKHJlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU8pKSB7CisJCXZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPmNhcCk7CisJCXJlc19mcmVlKGRldixmaCxSRVNPVVJDRV9WSURFTyk7CisJfQorCWlmIChmaC0+Y2FwLnJlYWRfYnVmKSB7CisJCWJ1ZmZlcl9yZWxlYXNlKCZmaC0+Y2FwLGZoLT5jYXAucmVhZF9idWYpOworCQlrZnJlZShmaC0+Y2FwLnJlYWRfYnVmKTsKKwl9CisKKwkvKiBzdG9wIHZiaSBjYXB0dXJlICovCisJaWYgKHJlc19jaGVjayhmaCwgUkVTT1VSQ0VfVkJJKSkgeworCQlpZiAoZmgtPnZiaS5zdHJlYW1pbmcpCisJCQl2aWRlb2J1Zl9zdHJlYW1vZmYoJmZoLT52YmkpOworCQlpZiAoZmgtPnZiaS5yZWFkaW5nKQorCQkJdmlkZW9idWZfcmVhZF9zdG9wKCZmaC0+dmJpKTsKKwkJcmVzX2ZyZWUoZGV2LGZoLFJFU09VUkNFX1ZCSSk7CisJfQorCisJLyogZnJlZSBzdHVmZiAqLworCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPmNhcCk7CisJdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmJpKTsKKwlzYWE3MTM0X3BndGFibGVfZnJlZShkZXYtPnBjaSwmZmgtPnB0X2NhcCk7CisJc2FhNzEzNF9wZ3RhYmxlX2ZyZWUoZGV2LT5wY2ksJmZoLT5wdF92YmkpOworCisJdjRsMl9wcmlvX2Nsb3NlKCZkZXYtPnByaW8sJmZoLT5wcmlvKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWtmcmVlKGZoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordmlkZW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2aWRlb2J1Zl9tbWFwX21hcHBlcihzYWE3MTM0X3F1ZXVlKGZoKSwgdm1hKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHNhYTcxMzRfdmJpX2ZtdChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBzYWE3MTM0X3R2bm9ybSAqbm9ybSA9IGRldi0+dHZub3JtOworCisJZi0+Zm10LnZiaS5zYW1wbGluZ19yYXRlID0gNjc1MDAwMCAqIDQ7CisJZi0+Zm10LnZiaS5zYW1wbGVzX3Blcl9saW5lID0gMjA0OCAvKiBWQklfTElORV9MRU5HVEggKi87CisJZi0+Zm10LnZiaS5zYW1wbGVfZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVk7CisJZi0+Zm10LnZiaS5vZmZzZXQgPSA2NCAqIDQ7CisJZi0+Zm10LnZiaS5zdGFydFswXSA9IG5vcm0tPnZiaV92X3N0YXJ0OworCWYtPmZtdC52YmkuY291bnRbMF0gPSBub3JtLT52Ymlfdl9zdG9wIC0gbm9ybS0+dmJpX3Zfc3RhcnQgKzE7CisJZi0+Zm10LnZiaS5zdGFydFsxXSA9IG5vcm0tPnZpZGVvX3Zfc3RvcCArIG5vcm0tPnZiaV92X3N0YXJ0ICsxOworCWYtPmZtdC52YmkuY291bnRbMV0gPSBmLT5mbXQudmJpLmNvdW50WzBdOworCWYtPmZtdC52YmkuZmxhZ3MgPSAwOyAvKiBWQklfVU5TWU5DIFZCSV9JTlRFUkxBQ0VEICovCisKKyNpZiAwCisJaWYgKFY0TDJfU1REX1BBTCA9PSBub3JtLT5pZCkgeworCQkvKiBGSVhNRSAqLworCQlmLT5mbXQudmJpLnN0YXJ0WzBdICs9IDM7CisJCWYtPmZtdC52Ymkuc3RhcnRbMV0gKz0gMyoyOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHNhYTcxMzRfZ19mbXQoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHN0cnVjdCBzYWE3MTM0X2ZoICpmaCwKKwkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3dpdGNoIChmLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCW1lbXNldCgmZi0+Zm10LnBpeCwwLHNpemVvZihmLT5mbXQucGl4KSk7CisJCWYtPmZtdC5waXgud2lkdGggICAgICAgID0gZmgtPndpZHRoOworCQlmLT5mbXQucGl4LmhlaWdodCAgICAgICA9IGZoLT5oZWlnaHQ7CisJCWYtPmZtdC5waXguZmllbGQgICAgICAgID0gZmgtPmNhcC5maWVsZDsKKwkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAgPSBmaC0+Zm10LT5mb3VyY2M7CisJCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0KKwkJCShmLT5mbXQucGl4LndpZHRoICogZmgtPmZtdC0+ZGVwdGgpID4+IDM7CisJCWYtPmZtdC5waXguc2l6ZWltYWdlID0KKwkJCWYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCQlmLT5mbXQud2luID0gZmgtPndpbjsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlzYWE3MTM0X3ZiaV9mbXQoZGV2LGYpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2FhNzEzNF90cnlfZm10KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAoZi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCXsKKwkJc3RydWN0IHNhYTcxMzRfZm9ybWF0ICpmbXQ7CisJCWVudW0gdjRsMl9maWVsZCBmaWVsZDsKKwkJdW5zaWduZWQgaW50IG1heHcsIG1heGg7CisKKwkJZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKwkJaWYgKE5VTEwgPT0gZm10KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOworCQltYXh3ICA9IG1pbihkZXYtPmNyb3BfY3VycmVudC53aWR0aCo0LCAgZGV2LT5jcm9wX2JvdW5kcy53aWR0aCk7CisJCW1heGggID0gbWluKGRldi0+Y3JvcF9jdXJyZW50LmhlaWdodCo0LCBkZXYtPmNyb3BfYm91bmRzLmhlaWdodCk7CisKKwkJaWYgKFY0TDJfRklFTERfQU5ZID09IGZpZWxkKSB7CisJCQlmaWVsZCA9IChmLT5mbXQucGl4LmhlaWdodCA+IG1heGgvMikKKwkJCQk/IFY0TDJfRklFTERfSU5URVJMQUNFRAorCQkJCTogVjRMMl9GSUVMRF9CT1RUT007CisJCX0KKwkJc3dpdGNoIChmaWVsZCkgeworCQljYXNlIFY0TDJfRklFTERfVE9QOgorCQljYXNlIFY0TDJfRklFTERfQk9UVE9NOgorCQkJbWF4aCA9IG1heGggLyAyOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWYtPmZtdC5waXguZmllbGQgPSBmaWVsZDsKKwkJaWYgKGYtPmZtdC5waXgud2lkdGggIDwgNDgpCisJCQlmLT5mbXQucGl4LndpZHRoICA9IDQ4OworCQlpZiAoZi0+Zm10LnBpeC5oZWlnaHQgPCAzMikKKwkJCWYtPmZtdC5waXguaGVpZ2h0ID0gMzI7CisJCWlmIChmLT5mbXQucGl4LndpZHRoID4gbWF4dykKKwkJCWYtPmZtdC5waXgud2lkdGggPSBtYXh3OworCQlpZiAoZi0+Zm10LnBpeC5oZWlnaHQgPiBtYXhoKQorCQkJZi0+Zm10LnBpeC5oZWlnaHQgPSBtYXhoOworCQlmLT5mbXQucGl4LndpZHRoICY9IH4weDAzOworCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9CisJCQkoZi0+Zm10LnBpeC53aWR0aCAqIGZtdC0+ZGVwdGgpID4+IDM7CisJCWYtPmZtdC5waXguc2l6ZWltYWdlID0KKwkJCWYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCQllcnIgPSB2ZXJpZnlfcHJldmlldyhkZXYsJmYtPmZtdC53aW4pOworCQlpZiAoMCAhPSBlcnIpCisJCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCXNhYTcxMzRfdmJpX2ZtdChkZXYsZik7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBzYWE3MTM0X3NfZm10KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsCisJCQkgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCXN3aXRjaCAoZi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQllcnIgPSBzYWE3MTM0X3RyeV9mbXQoZGV2LGZoLGYpOworCQlpZiAoMCAhPSBlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWZoLT5mbXQgICAgICAgPSBmb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworCQlmaC0+d2lkdGggICAgID0gZi0+Zm10LnBpeC53aWR0aDsKKwkJZmgtPmhlaWdodCAgICA9IGYtPmZtdC5waXguaGVpZ2h0OworCQlmaC0+Y2FwLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCWVyciA9IHZlcmlmeV9wcmV2aWV3KGRldiwmZi0+Zm10Lndpbik7CisJCWlmICgwICE9IGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZG93bigmZGV2LT5sb2NrKTsKKwkJZmgtPndpbiAgICA9IGYtPmZtdC53aW47CisJCWZoLT5uY2xpcHMgPSBmLT5mbXQud2luLmNsaXBjb3VudDsKKwkJaWYgKGZoLT5uY2xpcHMgPiA4KQorCQkJZmgtPm5jbGlwcyA9IDg7CisJCWlmIChjb3B5X2Zyb21fdXNlcihmaC0+Y2xpcHMsZi0+Zm10Lndpbi5jbGlwcywKKwkJCQkgICBzaXplb2Yoc3RydWN0IHY0bDJfY2xpcCkqZmgtPm5jbGlwcykpIHsKKwkJCXVwKCZkZXYtPmxvY2spOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAocmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9PVkVSTEFZKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssZmxhZ3MpOworCQkJc3RvcF9wcmV2aWV3KGRldixmaCk7CisJCQlzdGFydF9wcmV2aWV3KGRldixmaCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLGZsYWdzKTsKKwkJfQorCQl1cCgmZGV2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlzYWE3MTM0X3ZiaV9mbXQoZGV2LGYpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK2ludCBzYWE3MTM0X2NvbW1vbl9pb2N0bChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCXsKKwkJY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsOworCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmMgPSBhcmc7CisKKwkJaWYgKChjLT5pZCA8ICBWNEwyX0NJRF9CQVNFIHx8CisJCSAgICAgYy0+aWQgPj0gVjRMMl9DSURfTEFTVFAxKSAmJgorCQkgICAgKGMtPmlkIDwgIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSB8fAorCQkgICAgIGMtPmlkID49IFY0TDJfQ0lEX1BSSVZBVEVfTEFTVFAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQljdHJsID0gY3RybF9ieV9pZChjLT5pZCk7CisJCSpjID0gKE5VTEwgIT0gY3RybCkgPyAqY3RybCA6IG5vX2N0cmw7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19HX0NUUkw6CisJCXJldHVybiBnZXRfY29udHJvbChkZXYsYXJnKTsKKwljYXNlIFZJRElPQ19TX0NUUkw6CisJeworCQlkb3duKCZkZXYtPmxvY2spOworCQllcnIgPSBzZXRfY29udHJvbChkZXYsTlVMTCxhcmcpOworCQl1cCgmZGV2LT5sb2NrKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLyogLS0tIGlucHV0IHN3aXRjaGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaSA9IGFyZzsKKwkJdW5zaWduZWQgaW50IG47CisKKwkJbiA9IGktPmluZGV4OworCQlpZiAobiA+PSBTQUE3MTM0X0lOUFVUX01BWCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoTlVMTCA9PSBjYXJkX2luKGRldixpLT5pbmRleCkubmFtZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1zZXQoaSwwLHNpemVvZigqaSkpOworCQlpLT5pbmRleCA9IG47CisJCWktPnR5cGUgID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwkJc3RyY3B5KGktPm5hbWUsY2FyZF9pbihkZXYsbikubmFtZSk7CisJCWlmIChjYXJkX2luKGRldixuKS50dikKKwkJCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7CisJCWktPmF1ZGlvc2V0ID0gMTsKKwkJaWYgKG4gPT0gZGV2LT5jdGxfaW5wdXQpIHsKKwkJCWludCB2MSA9IHNhYV9yZWFkYihTQUE3MTM0X1NUQVRVU19WSURFTzEpOworCQkJaW50IHYyID0gc2FhX3JlYWRiKFNBQTcxMzRfU1RBVFVTX1ZJREVPMik7CisKKwkJCWlmICgwICE9ICh2MSAmIDB4NDApKQorCQkJCWktPnN0YXR1cyB8PSBWNEwyX0lOX1NUX05PX0hfTE9DSzsKKwkJCWlmICgwICE9ICh2MiAmIDB4NDApKQorCQkJCWktPnN0YXR1cyB8PSBWNEwyX0lOX1NUX05PX1NZTkM7CisJCQlpZiAoMCAhPSAodjIgJiAweDBlKSkKKwkJCQlpLT5zdGF0dXMgfD0gVjRMMl9JTl9TVF9NQUNST1ZJU0lPTjsKKwkJfQorCQlmb3IgKG4gPSAwOyBuIDwgVFZOT1JNUzsgbisrKQorCQkJaS0+c3RkIHw9IHR2bm9ybXNbbl0uaWQ7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19HX0lOUFVUOgorCXsKKwkJaW50ICppID0gYXJnOworCQkqaSA9IGRldi0+Y3RsX2lucHV0OworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19JTlBVVDoKKwl7CisJCWludCAqaSA9IGFyZzsKKworCQlpZiAoKmkgPCAwICB8fCAgKmkgPj0gU0FBNzEzNF9JTlBVVF9NQVgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKE5VTEwgPT0gY2FyZF9pbihkZXYsKmkpLm5hbWUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG93bigmZGV2LT5sb2NrKTsKKwkJdmlkZW9fbXV4KGRldiwqaSk7CisJCXVwKCZkZXYtPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNhYTcxMzRfY29tbW9uX2lvY3RsKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgX25vdF8gY2FsbGVkIGRpcmVjdGx5LCBidXQgZnJvbQorICogdmlkZW9fZ2VuZXJpY19pb2N0bCAoYW5kIG1heWJlIG90aGVycykuICB1c2Vyc3BhY2UKKyAqIGNvcHlpbmcgaXMgZG9uZSBhbHJlYWR5LCBhcmcgaXMgYSBrZXJuZWwgcG9pbnRlci4KKyAqLworc3RhdGljIGludCB2aWRlb19kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKHZpZGVvX2RlYnVnID4gMSkKKwkJc2FhNzEzNF9wcmludF9pb2N0bChkZXYtPm5hbWUsY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfU19DVFJMOgorCWNhc2UgVklESU9DX1NfU1REOgorCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJY2FzZSBWSURJT0NfU19UVU5FUjoKKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPnByaW8sJmZoLT5wcmlvKTsKKwkJaWYgKDAgIT0gZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX1FVRVJZQ0FQOgorCXsKKwkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOworCisJCW1lbXNldChjYXAsMCxzaXplb2YoKmNhcCkpOworICAgICAgICAgICAgICAgIHN0cmNweShjYXAtPmRyaXZlciwgInNhYTcxMzQiKTsKKwkJc3RybGNweShjYXAtPmNhcmQsIHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUsCisJCQlzaXplb2YoY2FwLT5jYXJkKSk7CisJCXNwcmludGYoY2FwLT5idXNfaW5mbywiUENJOiVzIixwY2lfbmFtZShkZXYtPnBjaSkpOworCQljYXAtPnZlcnNpb24gPSBTQUE3MTM0X1ZFUlNJT05fQ09ERTsKKwkJY2FwLT5jYXBhYmlsaXRpZXMgPQorCQkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CisJCQlWNEwyX0NBUF9WSURFT19PVkVSTEFZIHwKKwkJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwKKwkJCVY0TDJfQ0FQX1RVTkVSIHwKKwkJCVY0TDJfQ0FQX1JFQURXUklURSB8CisJCQlWNEwyX0NBUF9TVFJFQU1JTkc7CisJCXJldHVybiAwOworCX0KKworCS8qIC0tLSB0diBzdGFuZGFyZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfRU5VTVNURDoKKwl7CisJCXN0cnVjdCB2NGwyX3N0YW5kYXJkICplID0gYXJnOworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlpID0gZS0+aW5kZXg7CisJCWlmIChpID49IFRWTk9STVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gdjRsMl92aWRlb19zdGRfY29uc3RydWN0KGUsIHR2bm9ybXNbZS0+aW5kZXhdLmlkLAorCQkJCQkgICAgICAgdHZub3Jtc1tlLT5pbmRleF0ubmFtZSk7CisJCWUtPmluZGV4ID0gaTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisKKwkJKmlkID0gZGV2LT50dm5vcm0tPmlkOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisJCXVuc2lnbmVkIGludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBUVk5PUk1TOyBpKyspCisJCQlpZiAoKmlkID09IHR2bm9ybXNbaV0uaWQpCisJCQkJYnJlYWs7CisJCWlmIChpID09IFRWTk9STVMpCisJCQlmb3IgKGkgPSAwOyBpIDwgVFZOT1JNUzsgaSsrKQorCQkJCWlmICgqaWQgJiB0dm5vcm1zW2ldLmlkKQorCQkJCQlicmVhazsKKwkJaWYgKGkgPT0gVFZOT1JNUykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRvd24oJmRldi0+bG9jayk7CisJCWlmIChyZXNfY2hlY2soZmgsIFJFU09VUkNFX09WRVJMQVkpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jayxmbGFncyk7CisJCQlzdG9wX3ByZXZpZXcoZGV2LGZoKTsKKwkJCXNldF90dm5vcm0oZGV2LCZ0dm5vcm1zW2ldKTsKKwkJCXN0YXJ0X3ByZXZpZXcoZGV2LGZoKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssZmxhZ3MpOworCQl9IGVsc2UKKwkJCXNldF90dm5vcm0oZGV2LCZ0dm5vcm1zW2ldKTsKKwkJc2FhNzEzNF90dmF1ZGlvX2RvX3NjYW4oZGV2KTsKKwkJdXAoJmRldi0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX0NST1BDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjYXAgPSBhcmc7CisKKwkJaWYgKGNhcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgJiYKKwkJICAgIGNhcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FwLT5ib3VuZHMgID0gZGV2LT5jcm9wX2JvdW5kczsKKwkJY2FwLT5kZWZyZWN0ID0gZGV2LT5jcm9wX2RlZnJlY3Q7CisJCWNhcC0+cGl4ZWxhc3BlY3QubnVtZXJhdG9yICAgPSAxOworCQljYXAtPnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yID0gMTsKKwkJaWYgKGRldi0+dHZub3JtLT5pZCAmIFY0TDJfU1REXzUyNV82MCkgeworCQkJY2FwLT5waXhlbGFzcGVjdC5udW1lcmF0b3IgICA9IDExOworCQkJY2FwLT5waXhlbGFzcGVjdC5kZW5vbWluYXRvciA9IDEwOworCQl9CisJCWlmIChkZXYtPnR2bm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApIHsKKwkJCWNhcC0+cGl4ZWxhc3BlY3QubnVtZXJhdG9yICAgPSA1NDsKKwkJCWNhcC0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IgPSA1OTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19HX0NST1A6CisJeworCQlzdHJ1Y3QgdjRsMl9jcm9wICogY3JvcCA9IGFyZzsKKworCQlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgJiYKKwkJICAgIGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNyb3AtPmMgPSBkZXYtPmNyb3BfY3VycmVudDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1NfQ1JPUDoKKwl7CisJCXN0cnVjdCB2NGwyX2Nyb3AgKmNyb3AgPSBhcmc7CisJCXN0cnVjdCB2NGwyX3JlY3QgKmIgPSAmZGV2LT5jcm9wX2JvdW5kczsKKworCQlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgJiYKKwkJICAgIGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjcm9wLT5jLmhlaWdodCA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNyb3AtPmMud2lkdGggPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHJlc19sb2NrZWQoZmgtPmRldixSRVNPVVJDRV9PVkVSTEFZKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWlmIChyZXNfbG9ja2VkKGZoLT5kZXYsUkVTT1VSQ0VfVklERU8pKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoY3JvcC0+Yy50b3AgPCBiLT50b3ApCisJCQljcm9wLT5jLnRvcCA9IGItPnRvcDsKKwkJaWYgKGNyb3AtPmMudG9wID4gYi0+dG9wICsgYi0+aGVpZ2h0KQorCQkJY3JvcC0+Yy50b3AgPSBiLT50b3AgKyBiLT5oZWlnaHQ7CisJCWlmIChjcm9wLT5jLmhlaWdodCA+IGItPnRvcCAtIGNyb3AtPmMudG9wICsgYi0+aGVpZ2h0KQorCQkJY3JvcC0+Yy5oZWlnaHQgPSBiLT50b3AgLSBjcm9wLT5jLnRvcCArIGItPmhlaWdodDsKKworCQlpZiAoY3JvcC0+Yy5sZWZ0IDwgYi0+bGVmdCkKKwkJCWNyb3AtPmMudG9wID0gYi0+bGVmdDsKKwkJaWYgKGNyb3AtPmMubGVmdCA+IGItPmxlZnQgKyBiLT53aWR0aCkKKwkJCWNyb3AtPmMudG9wID0gYi0+bGVmdCArIGItPndpZHRoOworCQlpZiAoY3JvcC0+Yy53aWR0aCA+IGItPmxlZnQgLSBjcm9wLT5jLmxlZnQgKyBiLT53aWR0aCkKKwkJCWNyb3AtPmMud2lkdGggPSBiLT5sZWZ0IC0gY3JvcC0+Yy5sZWZ0ICsgYi0+d2lkdGg7CisKKwkJZGV2LT5jcm9wX2N1cnJlbnQgPSBjcm9wLT5jOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiAtLS0gdHVuZXIgaW9jdGxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0dfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKKwkJaW50IG47CisKKwkJaWYgKDAgIT0gdC0+aW5kZXgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVtc2V0KHQsMCxzaXplb2YoKnQpKTsKKwkJZm9yIChuID0gMDsgbiA8IFNBQTcxMzRfSU5QVVRfTUFYOyBuKyspCisJCQlpZiAoY2FyZF9pbihkZXYsbikudHYpCisJCQkJYnJlYWs7CisJCWlmIChOVUxMICE9IGNhcmRfaW4oZGV2LG4pLm5hbWUpIHsKKwkJCXN0cmNweSh0LT5uYW1lLCAiVGVsZXZpc2lvbiIpOworCQkJdC0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX05PUk0gfAorCQkJCVY0TDJfVFVORVJfQ0FQX1NURVJFTyB8CisJCQkJVjRMMl9UVU5FUl9DQVBfTEFORzEgfAorCQkJCVY0TDJfVFVORVJfQ0FQX0xBTkcyOworCQkJdC0+cmFuZ2VoaWdoID0gMHhmZmZmZmZmZlVMOworCQkJdC0+cnhzdWJjaGFucyA9IHNhYTcxMzRfdHZhdWRpb19nZXRzdGVyZW8oZGV2KTsKKwkJCXQtPmF1ZG1vZGUgPSBzYWE3MTM0X3R2YXVkaW9fcngybW9kZSh0LT5yeHN1YmNoYW5zKTsKKwkJfQorCQlpZiAoMCAhPSAoc2FhX3JlYWRiKFNBQTcxMzRfU1RBVFVTX1ZJREVPMSkgJiAweDAzKSkKKwkJCXQtPnNpZ25hbCA9IDB4ZmZmZjsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1NfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKKwkJaW50IHJ4LG1vZGU7CisKKwkJbW9kZSA9IGRldi0+dGhyZWFkLm1vZGU7CisJCWlmIChVTlNFVCA9PSBtb2RlKSB7CisJCQlyeCAgID0gc2FhNzEzNF90dmF1ZGlvX2dldHN0ZXJlbyhkZXYpOworCQkJbW9kZSA9IHNhYTcxMzRfdHZhdWRpb19yeDJtb2RlKHQtPnJ4c3ViY2hhbnMpOworCQl9CisJCWlmIChtb2RlICE9IHQtPmF1ZG1vZGUpIHsKKwkJCWRldi0+dGhyZWFkLm1vZGUgPSB0LT5hdWRtb2RlOworCQl9CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwl7CisJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKKworCQltZW1zZXQoZiwwLHNpemVvZigqZikpOworCQlmLT50eXBlID0gZmgtPnJhZGlvID8gVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCQlmLT5mcmVxdWVuY3kgPSBkZXYtPmN0bF9mcmVxOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CisJeworCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CisKKwkJaWYgKDAgIT0gZi0+dHVuZXIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKDAgPT0gZmgtPnJhZGlvICYmIFY0TDJfVFVORVJfQU5BTE9HX1RWICE9IGYtPnR5cGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKDEgPT0gZmgtPnJhZGlvICYmIFY0TDJfVFVORVJfUkFESU8gIT0gZi0+dHlwZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlkb3duKCZkZXYtPmxvY2spOworCQlkZXYtPmN0bF9mcmVxID0gZi0+ZnJlcXVlbmN5OworI2lmZGVmIFY0TDJfSTJDX0NMSUVOVFMKKwkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixWSURJT0NfU19GUkVRVUVOQ1ksZik7CisjZWxzZQorCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFZJRElPQ1NGUkVRLCZkZXYtPmN0bF9mcmVxKTsKKyNlbmRpZgorCQlzYWE3MTM0X3R2YXVkaW9fZG9fc2NhbihkZXYpOworCQl1cCgmZGV2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogLS0tIGNvbnRyb2wgaW9jdGxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CisJY2FzZSBWSURJT0NfR19JTlBVVDoKKwljYXNlIFZJRElPQ19TX0lOUFVUOgorCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwljYXNlIFZJRElPQ19HX0NUUkw6CisJY2FzZSBWSURJT0NfU19DVFJMOgorCQlyZXR1cm4gc2FhNzEzNF9jb21tb25faW9jdGwoZGV2LCBjbWQsIGFyZyk7CisKKwljYXNlIFZJRElPQ19HX0FVRElPOgorCXsKKwkJc3RydWN0IHY0bDJfYXVkaW8gKmEgPSBhcmc7CisKKwkJbWVtc2V0KGEsMCxzaXplb2YoKmEpKTsKKwkJc3RyY3B5KGEtPm5hbWUsImF1ZGlvIik7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19TX0FVRElPOgorCQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBWSURJT0NfR19QQVJNOgorICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0gKnBhcm0gPSBhcmc7CisgICAgICAgICAgICAgICAgbWVtc2V0KHBhcm0sMCxzaXplb2YoKnBhcm0pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgVklESU9DX0dfUFJJT1JJVFk6CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgKnAgPSBhcmc7CisKKyAgICAgICAgICAgICAgICAqcCA9IHY0bDJfcHJpb19tYXgoJmRldi0+cHJpbyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBWSURJT0NfU19QUklPUklUWToKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGVudW0gdjRsMl9wcmlvcml0eSAqcHJpbyA9IGFyZzsKKworICAgICAgICAgICAgICAgIHJldHVybiB2NGwyX3ByaW9fY2hhbmdlKCZkZXYtPnByaW8sICZmaC0+cHJpbywgKnByaW8pOworICAgICAgICB9CisKKwkvKiAtLS0gcHJldmlldyBpb2N0bHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0VOVU1fRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZiA9IGFyZzsKKwkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlpbmRleCA9IGYtPmluZGV4OworCQl0eXBlICA9IGYtPnR5cGU7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCQlpZiAoaW5kZXggPj0gRk9STUFUUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWSAmJgorCQkJICAgIGZvcm1hdHNbaW5kZXhdLnBsYW5hcikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW1lbXNldChmLDAsc2l6ZW9mKCpmKSk7CisJCQlmLT5pbmRleCA9IGluZGV4OworCQkJZi0+dHlwZSAgPSB0eXBlOworCQkJc3RybGNweShmLT5kZXNjcmlwdGlvbixmb3JtYXRzW2luZGV4XS5uYW1lLHNpemVvZihmLT5kZXNjcmlwdGlvbikpOworCQkJZi0+cGl4ZWxmb3JtYXQgPSBmb3JtYXRzW2luZGV4XS5mb3VyY2M7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQkJaWYgKDAgIT0gaW5kZXgpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQltZW1zZXQoZiwwLHNpemVvZigqZikpOworCQkJZi0+aW5kZXggPSBpbmRleDsKKwkJCWYtPnR5cGUgID0gdHlwZTsKKwkJCWYtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVk7CisJCQlzdHJjcHkoZi0+ZGVzY3JpcHRpb24sInZiaSBkYXRhIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19HX0ZCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmIgPSBhcmc7CisKKwkJKmZiID0gZGV2LT5vdmJ1ZjsKKwkJZmItPmNhcGFiaWxpdHkgPSBWNEwyX0ZCVUZfQ0FQX0xJU1RfQ0xJUFBJTkc7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19TX0ZCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmIgPSBhcmc7CisJCXN0cnVjdCBzYWE3MTM0X2Zvcm1hdCAqZm10OworCisJCWlmKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pICYmCisJCSAgICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQkvKiBjaGVjayBhcmdzICovCisJCWZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZmItPmZtdC5waXhlbGZvcm1hdCk7CisJCWlmIChOVUxMID09IGZtdCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIG9rLCBhY2NlcHQgaXQgKi8KKwkJZGV2LT5vdmJ1ZiA9ICpmYjsKKwkJZGV2LT5vdmZtdCA9IGZtdDsKKwkJaWYgKDAgPT0gZGV2LT5vdmJ1Zi5mbXQuYnl0ZXNwZXJsaW5lKQorCQkJZGV2LT5vdmJ1Zi5mbXQuYnl0ZXNwZXJsaW5lID0KKwkJCQlkZXYtPm92YnVmLmZtdC53aWR0aCpmbXQtPmRlcHRoLzg7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19PVkVSTEFZOgorCXsKKwkJaW50ICpvbiA9IGFyZzsKKworCQlpZiAoKm9uKSB7CisJCQlpZiAoIXJlc19nZXQoZGV2LGZoLFJFU09VUkNFX09WRVJMQVkpKQorCQkJCXJldHVybiAtRUJVU1k7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jayxmbGFncyk7CisJCQlzdGFydF9wcmV2aWV3KGRldixmaCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLGZsYWdzKTsKKwkJfQorCQlpZiAoISpvbikgeworCQkJaWYgKCFyZXNfY2hlY2soZmgsIFJFU09VUkNFX09WRVJMQVkpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssZmxhZ3MpOworCQkJc3RvcF9wcmV2aWV3KGRldixmaCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLGZsYWdzKTsKKwkJCXJlc19mcmVlKGRldixmaCxSRVNPVVJDRV9PVkVSTEFZKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiAtLS0gY2FwdHVyZSBpb2N0bHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0dfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOworCQlyZXR1cm4gc2FhNzEzNF9nX2ZtdChkZXYsZmgsZik7CisJfQorCWNhc2UgVklESU9DX1NfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOworCQlyZXR1cm4gc2FhNzEzNF9zX2ZtdChkZXYsZmgsZik7CisJfQorCWNhc2UgVklESU9DX1RSWV9GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSBhcmc7CisJCXJldHVybiBzYWE3MTM0X3RyeV9mbXQoZGV2LGZoLGYpOworCX0KKworCWNhc2UgVklESU9DR01CVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqbWJ1ZiA9IGFyZzsKKwkJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxOworCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyByZXE7CisJCXVuc2lnbmVkIGludCBpOworCisJCXEgPSBzYWE3MTM0X3F1ZXVlKGZoKTsKKwkJbWVtc2V0KCZyZXEsMCxzaXplb2YocmVxKSk7CisJCXJlcS50eXBlICAgPSBxLT50eXBlOworCQlyZXEuY291bnQgID0gZ2J1ZmZlcnM7CisJCXJlcS5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCQllcnIgPSB2aWRlb2J1Zl9yZXFidWZzKHEsJnJlcSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJbWVtc2V0KG1idWYsMCxzaXplb2YoKm1idWYpKTsKKwkJbWJ1Zi0+ZnJhbWVzID0gcmVxLmNvdW50OworCQltYnVmLT5zaXplICAgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbWJ1Zi0+ZnJhbWVzOyBpKyspIHsKKwkJCW1idWYtPm9mZnNldHNbaV0gID0gcS0+YnVmc1tpXS0+Ym9mZjsKKwkJCW1idWYtPnNpemUgICAgICAgKz0gcS0+YnVmc1tpXS0+YnNpemU7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1JFUUJVRlM6CisJCXJldHVybiB2aWRlb2J1Zl9yZXFidWZzKHNhYTcxMzRfcXVldWUoZmgpLGFyZyk7CisKKwljYXNlIFZJRElPQ19RVUVSWUJVRjoKKwkJcmV0dXJuIHZpZGVvYnVmX3F1ZXJ5YnVmKHNhYTcxMzRfcXVldWUoZmgpLGFyZyk7CisKKwljYXNlIFZJRElPQ19RQlVGOgorCQlyZXR1cm4gdmlkZW9idWZfcWJ1ZihzYWE3MTM0X3F1ZXVlKGZoKSxhcmcpOworCisJY2FzZSBWSURJT0NfRFFCVUY6CisJCXJldHVybiB2aWRlb2J1Zl9kcWJ1ZihzYWE3MTM0X3F1ZXVlKGZoKSxhcmcsCisJCQkJICAgICAgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCisJY2FzZSBWSURJT0NfU1RSRUFNT046CisJeworCQlpbnQgcmVzID0gc2FhNzEzNF9yZXNvdXJjZShmaCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXJlc19nZXQoZGV2LGZoLHJlcykpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb24oc2FhNzEzNF9xdWV1ZShmaCkpOworCX0KKwljYXNlIFZJRElPQ19TVFJFQU1PRkY6CisJeworCQlpbnQgcmVzID0gc2FhNzEzNF9yZXNvdXJjZShmaCk7CisKKwkJZXJyID0gdmlkZW9idWZfc3RyZWFtb2ZmKHNhYTcxMzRfcXVldWUoZmgpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlyZXNfZnJlZShkZXYsZmgscmVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKKwkJCQkJCSAgdmlkZW9fZG9faW9jdGwpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRlb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHZpZGVvX2RvX2lvY3RsKTsKK30KKworc3RhdGljIGludCByYWRpb19kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAodmlkZW9fZGVidWcgPiAxKQorCQlzYWE3MTM0X3ByaW50X2lvY3RsKGRldi0+bmFtZSxjbWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJbWVtc2V0KGNhcCwwLHNpemVvZigqY2FwKSk7CisgICAgICAgICAgICAgICAgc3RyY3B5KGNhcC0+ZHJpdmVyLCAic2FhNzEzNCIpOworCQlzdHJsY3B5KGNhcC0+Y2FyZCwgc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSwKKwkJCXNpemVvZihjYXAtPmNhcmQpKTsKKwkJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCJQQ0k6JXMiLHBjaV9uYW1lKGRldi0+cGNpKSk7CisJCWNhcC0+dmVyc2lvbiA9IFNBQTcxMzRfVkVSU0lPTl9DT0RFOworCQljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19UVU5FUjoKKwl7CisJCXN0cnVjdCB2NGwyX3R1bmVyICp0ID0gYXJnOworCisJCWlmICgwICE9IHQtPmluZGV4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtc2V0KHQsMCxzaXplb2YoKnQpKTsKKwkJc3RyY3B5KHQtPm5hbWUsICJSYWRpbyIpOworICAgICAgICAgICAgICAgIHQtPnJhbmdlbG93ICA9IChpbnQpKDY1KjE2KTsKKyAgICAgICAgICAgICAgICB0LT5yYW5nZWhpZ2ggPSAoaW50KSgxMDgqMTYpOworCisjaWZkZWYgVjRMMl9JMkNfQ0xJRU5UUworCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFZJRElPQ19HX1RVTkVSLHQpOworI2Vsc2UKKwkJeworCQkJc3RydWN0IHZpZGVvX3R1bmVyIHZ0OworCQkJbWVtc2V0KCZ2dCwwLHNpemVvZih2dCkpOworCQkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixWSURJT0NHVFVORVIsJnZ0KTsKKwkJCXQtPnNpZ25hbCA9IHZ0LnNpZ25hbDsKKwkJfQorI2VuZGlmCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaSA9IGFyZzsKKworCQlpZiAoaS0+aW5kZXggIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzdHJjcHkoaS0+bmFtZSwiUmFkaW8iKTsKKwkJaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJeworCQlpbnQgKmkgPSBhcmc7CisJCSppID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfQVVESU86CisJeworCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSA9IGFyZzsKKworCQltZW1zZXQoYSwwLHNpemVvZigqYSkpOworCQlzdHJjcHkoYS0+bmFtZSwiUmFkaW8iKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOworCQkqaWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19BVURJTzoKKwljYXNlIFZJRElPQ19TX1RVTkVSOgorCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJY2FzZSBWSURJT0NfU19TVEQ6CisJCXJldHVybiAwOworCisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCXsKKwkJY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsOworCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmMgPSBhcmc7CisKKwkJaWYgKGMtPmlkIDwgIFY0TDJfQ0lEX0JBU0UgfHwKKwkJICAgIGMtPmlkID49IFY0TDJfQ0lEX0xBU1RQMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoYy0+aWQgPT0gVjRMMl9DSURfQVVESU9fTVVURSkgeworCQkJY3RybCA9IGN0cmxfYnlfaWQoYy0+aWQpOworCQkJKmMgPSAqY3RybDsKKwkJfSBlbHNlCisJCQkqYyA9IG5vX2N0cmw7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX0dfQ1RSTDoKKwljYXNlIFZJRElPQ19TX0NUUkw6CisJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6CisJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CisJCXJldHVybiB2aWRlb19kb19pb2N0bChpbm9kZSxmaWxlLGNtZCxhcmcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKKwkJCQkJCSAgcmFkaW9fZG9faW9jdGwpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHJhZGlvX2RvX2lvY3RsKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmlkZW9fZm9wcyA9Cit7CisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgID0gdmlkZW9fb3BlbiwKKwkucmVsZWFzZSAgPSB2aWRlb19yZWxlYXNlLAorCS5yZWFkCSAgPSB2aWRlb19yZWFkLAorCS5wb2xsICAgICA9IHZpZGVvX3BvbGwsCisJLm1tYXAJICA9IHZpZGVvX21tYXAsCisJLmlvY3RsCSAgPSB2aWRlb19pb2N0bCwKKwkubGxzZWVrICAgPSBub19sbHNlZWssCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYWRpb19mb3BzID0KK3sKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSAgPSB2aWRlb19vcGVuLAorCS5yZWxlYXNlICA9IHZpZGVvX3JlbGVhc2UsCisJLmlvY3RsCSAgPSByYWRpb19pb2N0bCwKKwkubGxzZWVrICAgPSBub19sbHNlZWssCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZXhwb3J0ZWQgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RydWN0IHZpZGVvX2RldmljZSBzYWE3MTM0X3ZpZGVvX3RlbXBsYXRlID0KK3sKKwkubmFtZSAgICAgICAgICA9ICJzYWE3MTM0LXZpZGVvIiwKKwkudHlwZSAgICAgICAgICA9IFZJRF9UWVBFX0NBUFRVUkV8VklEX1RZUEVfVFVORVJ8VklEX1RZUEVfT1ZFUkxBWXwKKwkgICAgICAgICAgICAgICAgIFZJRF9UWVBFX0NMSVBQSU5HfFZJRF9UWVBFX1NDQUxFUywKKwkuaGFyZHdhcmUgICAgICA9IDAsCisJLmZvcHMgICAgICAgICAgPSAmdmlkZW9fZm9wcywKKwkubWlub3IgICAgICAgICA9IC0xLAorfTsKKworc3RydWN0IHZpZGVvX2RldmljZSBzYWE3MTM0X3ZiaV90ZW1wbGF0ZSA9Cit7CisJLm5hbWUgICAgICAgICAgPSAic2FhNzEzNC12YmkiLAorCS50eXBlICAgICAgICAgID0gVklEX1RZUEVfVFVORVJ8VklEX1RZUEVfVEVMRVRFWFQsCisJLmhhcmR3YXJlICAgICAgPSAwLAorCS5mb3BzICAgICAgICAgID0gJnZpZGVvX2ZvcHMsCisJLm1pbm9yICAgICAgICAgPSAtMSwKK307CisKK3N0cnVjdCB2aWRlb19kZXZpY2Ugc2FhNzEzNF9yYWRpb190ZW1wbGF0ZSA9Cit7CisJLm5hbWUgICAgICAgICAgPSAic2FhNzEzNC1yYWRpbyIsCisJLnR5cGUgICAgICAgICAgPSBWSURfVFlQRV9UVU5FUiwKKwkuaGFyZHdhcmUgICAgICA9IDAsCisJLmZvcHMgICAgICAgICAgPSAmcmFkaW9fZm9wcywKKwkubWlub3IgICAgICAgICA9IC0xLAorfTsKKworaW50IHNhYTcxMzRfdmlkZW9faW5pdDEoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJLyogc2FuaXR5Y2hlY2sgaW5zbW9kIG9wdGlvbnMgKi8KKwlpZiAoZ2J1ZmZlcnMgPCAyIHx8IGdidWZmZXJzID4gVklERU9fTUFYX0ZSQU1FKQorCQlnYnVmZmVycyA9IDI7CisJaWYgKGdidWZzaXplIDwgMCB8fCBnYnVmc2l6ZSA+IGdidWZzaXplX21heCkKKwkJZ2J1ZnNpemUgPSBnYnVmc2l6ZV9tYXg7CisJZ2J1ZnNpemUgPSAoZ2J1ZnNpemUgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKKworCS8qIHB1dCBzb21lIHNlbnNpYmxlIGRlZmF1bHRzIGludG8gdGhlIGRhdGEgc3RydWN0dXJlcyAuLi4gKi8KKwlkZXYtPmN0bF9icmlnaHQgICAgID0gY3RybF9ieV9pZChWNEwyX0NJRF9CUklHSFRORVNTKS0+ZGVmYXVsdF92YWx1ZTsKKwlkZXYtPmN0bF9jb250cmFzdCAgID0gY3RybF9ieV9pZChWNEwyX0NJRF9DT05UUkFTVCktPmRlZmF1bHRfdmFsdWU7CisJZGV2LT5jdGxfaHVlICAgICAgICA9IGN0cmxfYnlfaWQoVjRMMl9DSURfSFVFKS0+ZGVmYXVsdF92YWx1ZTsKKwlkZXYtPmN0bF9zYXR1cmF0aW9uID0gY3RybF9ieV9pZChWNEwyX0NJRF9TQVRVUkFUSU9OKS0+ZGVmYXVsdF92YWx1ZTsKKwlkZXYtPmN0bF92b2x1bWUgICAgID0gY3RybF9ieV9pZChWNEwyX0NJRF9BVURJT19WT0xVTUUpLT5kZWZhdWx0X3ZhbHVlOworCWRldi0+Y3RsX211dGUgICAgICAgPSAxOyAvLyBjdHJsX2J5X2lkKFY0TDJfQ0lEX0FVRElPX01VVEUpLT5kZWZhdWx0X3ZhbHVlOworCWRldi0+Y3RsX2ludmVydCAgICAgPSBjdHJsX2J5X2lkKFY0TDJfQ0lEX1BSSVZBVEVfSU5WRVJUKS0+ZGVmYXVsdF92YWx1ZTsKKwlkZXYtPmN0bF9hdXRvbXV0ZSAgID0gY3RybF9ieV9pZChWNEwyX0NJRF9QUklWQVRFX0FVVE9NVVRFKS0+ZGVmYXVsdF92YWx1ZTsKKworCWlmIChkZXYtPnRkYTk4ODdfY29uZiAmJiBkZXYtPmN0bF9hdXRvbXV0ZSkKKwkJZGV2LT50ZGE5ODg3X2NvbmYgfD0gVERBOTg4N19BVVRPTVVURTsKKwlkZXYtPmF1dG9tdXRlICAgICAgID0gMDsKKworICAgICAgICBJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRlb19xLnF1ZXVlKTsKKwlpbml0X3RpbWVyKCZkZXYtPnZpZGVvX3EudGltZW91dCk7CisJZGV2LT52aWRlb19xLnRpbWVvdXQuZnVuY3Rpb24gPSBzYWE3MTM0X2J1ZmZlcl90aW1lb3V0OworCWRldi0+dmlkZW9fcS50aW1lb3V0LmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpKCZkZXYtPnZpZGVvX3EpOworCWRldi0+dmlkZW9fcS5kZXYgICAgICAgICAgICAgID0gZGV2OworCisJaWYgKHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLnZpZGVvX291dCkgeworCQkvKiBlbmFibGUgdmlkZW8gb3V0cHV0ICovCisJCWludCB2byA9IHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLnZpZGVvX291dDsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X1ZJREVPX1BPUlRfQ1RSTDAsIHZpZGVvX291dFt2b11bMF0pOworCQlzYWFfd3JpdGViKFNBQTcxMzRfVklERU9fUE9SVF9DVFJMMSwgdmlkZW9fb3V0W3ZvXVsxXSk7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9WSURFT19QT1JUX0NUUkwyLCB2aWRlb19vdXRbdm9dWzJdKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X1ZJREVPX1BPUlRfQ1RSTDMsIHZpZGVvX291dFt2b11bM10pOworCQlzYWFfd3JpdGViKFNBQTcxMzRfVklERU9fUE9SVF9DVFJMNCwgdmlkZW9fb3V0W3ZvXVs0XSk7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9WSURFT19QT1JUX0NUUkw1LCB2aWRlb19vdXRbdm9dWzVdKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X1ZJREVPX1BPUlRfQ1RSTDYsIHZpZGVvX291dFt2b11bNl0pOworCQlzYWFfd3JpdGViKFNBQTcxMzRfVklERU9fUE9SVF9DVFJMNywgdmlkZW9fb3V0W3ZvXVs3XSk7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9WSURFT19QT1JUX0NUUkw4LCB2aWRlb19vdXRbdm9dWzhdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNhYTcxMzRfdmlkZW9faW5pdDIoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCit7CisJLyogaW5pdCB2aWRlbyBodyAqLworCXNldF90dm5vcm0oZGV2LCZ0dm5vcm1zWzBdKTsKKwl2aWRlb19tdXgoZGV2LDApOworCXNhYTcxMzRfdHZhdWRpb19zZXRtdXRlKGRldik7CisJc2FhNzEzNF90dmF1ZGlvX3NldHZvbHVtZShkZXYsZGV2LT5jdGxfdm9sdW1lKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNhYTcxMzRfdmlkZW9fZmluaShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwkvKiBub3RoaW5nICovCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2FhNzEzNF9pcnFfdmlkZW9faW50bChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqc3RbXSA9IHsKKwkJIihubyBzaWduYWwpIiwgIk5UU0MiLCAiUEFMIiwgIlNFQ0FNIiB9OworCXUzMiBzdDEsc3QyOworCisJc3QxID0gc2FhX3JlYWRiKFNBQTcxMzRfU1RBVFVTX1ZJREVPMSk7CisJc3QyID0gc2FhX3JlYWRiKFNBQTcxMzRfU1RBVFVTX1ZJREVPMik7CisJZHByaW50aygiRENTRFQ6IHBsbDogJXMsIHN5bmM6ICVzLCBub3JtOiAlc1xuIiwKKwkJKHN0MSAmIDB4NDApID8gIm5vdCBsb2NrZWQiIDogImxvY2tlZCIsCisJCShzdDIgJiAweDQwKSA/ICJubyIgICAgICAgICA6ICJ5ZXMiLAorCQlzdFtzdDEgJiAweDAzXSk7CisJZGV2LT5ub3NpZ25hbCA9IChzdDEgJiAweDQwKSB8fCAoc3QyICYgMHg0MCk7CisKKwlpZiAoZGV2LT5ub3NpZ25hbCkgeworCQkvKiBubyB2aWRlbyBzaWduYWwgLT4gbXV0ZSBhdWRpbyAqLworCQlpZiAoZGV2LT5jdGxfYXV0b211dGUpCisJCQlkZXYtPmF1dG9tdXRlID0gMTsKKwkJc2FhNzEzNF90dmF1ZGlvX3NldG11dGUoZGV2KTsKKwkJc2FhX3NldGIoU0FBNzEzNF9TWU5DX0NUUkwsIDB4MjApOworCX0gZWxzZSB7CisJCS8qIHdha2UgdXAgdHZhdWRpbyBhdWRpbyBjYXJyaWVyIHNjYW4gdGhyZWFkICovCisJCXNhYTcxMzRfdHZhdWRpb19kb19zY2FuKGRldik7CisJCWlmICghbm9uaW50ZXJsYWNlZCkKKwkJCXNhYV9jbGVhcmIoU0FBNzEzNF9TWU5DX0NUUkwsIDB4MjApOworCX0KKwlpZiAoZGV2LT5tb3BzICYmIGRldi0+bW9wcy0+c2lnbmFsX2NoYW5nZSkKKwkJZGV2LT5tb3BzLT5zaWduYWxfY2hhbmdlKGRldik7Cit9CisKK3ZvaWQgc2FhNzEzNF9pcnFfdmlkZW9fZG9uZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBzdGF0dXMpCit7CisJZW51bSB2NGwyX2ZpZWxkIGZpZWxkOworCisJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwlpZiAoZGV2LT52aWRlb19xLmN1cnIpIHsKKwkJZGV2LT52aWRlb19maWVsZGNvdW50Kys7CisJCWZpZWxkID0gZGV2LT52aWRlb19xLmN1cnItPnZiLmZpZWxkOworCQlpZiAoVjRMMl9GSUVMRF9IQVNfQk9USChmaWVsZCkpIHsKKwkJCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIHNlZW4gYm90aCBmaWVsZHMgKi8KKwkJCWlmICgoc3RhdHVzICYgMHgxMCkgPT0gMHgwMCkgeworCQkJCWRldi0+dmlkZW9fcS5jdXJyLT50b3Bfc2VlbiA9IDE7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJaWYgKCFkZXYtPnZpZGVvX3EuY3Vyci0+dG9wX3NlZW4pCisJCQkJZ290byBkb25lOworCQl9IGVsc2UgaWYgKGZpZWxkID09IFY0TDJfRklFTERfVE9QKSB7CisJCQlpZiAoKHN0YXR1cyAmIDB4MTApICE9IDB4MTApCisJCQkJZ290byBkb25lOworCQl9IGVsc2UgaWYgKGZpZWxkID09IFY0TDJfRklFTERfQk9UVE9NKSB7CisJCQlpZiAoKHN0YXR1cyAmIDB4MTApICE9IDB4MDApCisJCQkJZ290byBkb25lOworCQl9CisJCWRldi0+dmlkZW9fcS5jdXJyLT52Yi5maWVsZF9jb3VudCA9IGRldi0+dmlkZW9fZmllbGRjb3VudDsKKwkJc2FhNzEzNF9idWZmZXJfZmluaXNoKGRldiwmZGV2LT52aWRlb19xLFNUQVRFX0RPTkUpOworCX0KKwlzYWE3MTM0X2J1ZmZlcl9uZXh0KGRldiwmZGV2LT52aWRlb19xKTsKKworIGRvbmU6CisJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTBhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCkBAIC0wLDAgKzEsNjE4IEBACisvKgorICogJElkOiBzYWE3MTM0LmgsdiAxLjM4IDIwMDUvMDMvMDcgMTI6MDE6NTEga3JheGVsIEV4cCAkCisgKgorICogdjRsMiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKKyAqCisgKiAoYykgMjAwMSwwMiBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2RlZmluZSBTQUE3MTM0X1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLDIsMTIpCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9jaGlwLmg+CisjaW5jbHVkZSA8bWVkaWEvaWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9pci1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYtZHZiLmg+CisKKyNpZm5kZWYgVFJVRQorIyBkZWZpbmUgVFJVRSAoMT09MSkKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorIyBkZWZpbmUgRkFMU0UgKDE9PTApCisjZW5kaWYKKyNkZWZpbmUgVU5TRVQgKC0xVSkKKworLyogMi40IC8gMi41IGRyaXZlciBjb21wYXRpYmlsaXR5IHN0dWZmICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBlbnVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitlbnVtIHNhYTcxMzRfdHZhdWRpb19tb2RlIHsKKwlUVkFVRElPX0ZNX01PTk8gICAgICAgPSAxLAorCVRWQVVESU9fRk1fQkdfU1RFUkVPICA9IDIsCisJVFZBVURJT19GTV9TQVRfU1RFUkVPID0gMywKKwlUVkFVRElPX0ZNX0tfU1RFUkVPICAgPSA0LAorCVRWQVVESU9fTklDQU1fQU0gICAgICA9IDUsCisJVFZBVURJT19OSUNBTV9GTSAgICAgID0gNiwKK307CisKK2VudW0gc2FhNzEzNF9hdWRpb19pbiB7CisJVFYgICAgPSAxLAorCUxJTkUxID0gMiwKKwlMSU5FMiA9IDMsCisJTElORTJfTEVGVCwKK307CisKK2VudW0gc2FhNzEzNF92aWRlb19vdXQgeworCUNDSVI2NTYgPSAxLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHN0YXRpYyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0cnVjdCBzYWE3MTM0X3R2bm9ybSB7CisJY2hhciAgICAgICAgICAqbmFtZTsKKwl2NGwyX3N0ZF9pZCAgIGlkOworCisJLyogdmlkZW8gZGVjb2RlciAqLworCXVuc2lnbmVkIGludCAgc3luY19jb250cm9sOworCXVuc2lnbmVkIGludCAgbHVtYV9jb250cm9sOworCXVuc2lnbmVkIGludCAgY2hyb21hX2N0cmwxOworCXVuc2lnbmVkIGludCAgY2hyb21hX2dhaW47CisJdW5zaWduZWQgaW50ICBjaHJvbWFfY3RybDI7CisJdW5zaWduZWQgaW50ICB2Z2F0ZV9taXNjOworCisJLyogdmlkZW8gc2NhbGVyICovCisJdW5zaWduZWQgaW50ICBoX3N0YXJ0OworCXVuc2lnbmVkIGludCAgaF9zdG9wOworCXVuc2lnbmVkIGludCAgdmlkZW9fdl9zdGFydDsKKwl1bnNpZ25lZCBpbnQgIHZpZGVvX3Zfc3RvcDsKKwl1bnNpZ25lZCBpbnQgIHZiaV92X3N0YXJ0OworCXVuc2lnbmVkIGludCAgdmJpX3Zfc3RvcDsKKwl1bnNpZ25lZCBpbnQgIHNyY190aW1pbmc7Cit9OworCitzdHJ1Y3Qgc2FhNzEzNF90dmF1ZGlvIHsKKwljaGFyICAgICAgICAgKm5hbWU7CisJdjRsMl9zdGRfaWQgIHN0ZDsKKwllbnVtICAgICAgICAgc2FhNzEzNF90dmF1ZGlvX21vZGUgbW9kZTsKKwlpbnQgICAgICAgICAgY2FycjE7CisJaW50ICAgICAgICAgIGNhcnIyOworfTsKKworc3RydWN0IHNhYTcxMzRfZm9ybWF0IHsKKwljaGFyICAgICAgICAgICAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgICBmb3VyY2M7CisJdW5zaWduZWQgaW50ICAgZGVwdGg7CisJdW5zaWduZWQgaW50ICAgcG07CisJdW5zaWduZWQgaW50ICAgdnNoaWZ0OyAgIC8qIHZlcnRpY2FsIGRvd25zYW1wbGluZyAoZm9yIHBsYW5hciB5dXYpICovCisJdW5zaWduZWQgaW50ICAgaHNoaWZ0OyAgIC8qIGhvcml6b250YWwgZG93bnNhbXBsaW5nIChmb3IgcGxhbmFyIHl1dikgKi8KKwl1bnNpZ25lZCBpbnQgICBic3dhcDoxOworCXVuc2lnbmVkIGludCAgIHdzd2FwOjE7CisJdW5zaWduZWQgaW50ICAgeXV2OjE7CisJdW5zaWduZWQgaW50ICAgcGxhbmFyOjE7CisJdW5zaWduZWQgaW50ICAgdXZzd2FwOjE7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogY2FyZCBjb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBTQUE3MTM0X0JPQVJEX05PQVVUTyAgICAgICAgVU5TRVQKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9VTktOT1dOICAgICAgICAgICAwCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfUFJPVEVVU19QUk8gICAgICAgMQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMCAgICAgIDIKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9GTFlWSURFTzIwMDAgICAgICAzCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRU1QUkVTUyAgICAgICAgICAgNAorI2RlZmluZSBTQUE3MTM0X0JPQVJEX01PTlNURVJUViAgICAgICAgIDUKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9NRDk3MTcgICAgICAgICAgICA2CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfVFZTVEFUSU9OX1JEUyAgICAgNworI2RlZmluZSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDAJOAorI2RlZmluZSBTQUE3MTM0X0JPQVJEX01ENTA0NAkJOQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0tXT1JMRCAgICAgICAgICAgMTAKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwICAgICAgIDExCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfTUQ3MTM0ICAgICAgICAgICAxMgorI2RlZmluZSBTQUE3MTM0X0JPQVJEX1RZUEhPT05fOTAwMzEgICAgMTMKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9FTFNBICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRUxTQV81MDBUViAgICAgICAxNQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzQgMTYKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9WQTEwMDBQT1dFUiAgICAgIDE3CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQk1LX01QRVhfTk9UVU5FUiAxOAorI2RlZmluZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UViAgICAgMTkKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9DUk9OT1NfUExVUyAgICAgIDIwCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfMTBNT09OU1RWTUFTVEVSICAyMQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX01EMjgxOSAgICAgICAgICAgMjIKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9CTUtfTVBFWF9UVU5FUiAgIDIzCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfVFZTVEFUSU9OX0RWUiAgICAyNAorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FTVVNURUtfVFZGTTcxMzMJMjUKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWX1NURVJFTyAyNgorI2RlZmluZSBTQUE3MTM0X0JPQVJEX01BTkxJX01UVjAwMiAgICAgMjcKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDEgICAgIDI4CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfVEczMDAwVFYgICAgICAgICAyOQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFAgICAgICAgMzAKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXzRDQjUgIDMxCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZBQ1NTTUFSVFRWICAgICAzMgorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9EVkRfRVpNQUtFUiAzMworI2RlZmluZSBTQUE3MTM0X0JPQVJEX05PVkFDX1BSSU1FVFY3MTMzIDM0CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDUgMzUKKyNkZWZpbmUgU0FBNzEzM19CT0FSRF9VUE1PU1RfUFVSUExFX1RWIDM2CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfSVRFTVNfTVRWMDA1ICAgICAzNworI2RlZmluZSBTQUE3MTM0X0JPQVJEX0NJTkVSR1kyMDAgICAgICAgMzgKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9GTFlUVlBMQVRJTlVNX01JTkkgMzkKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfUFZSIDQwCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX0dPTERfUExVUyA0MQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTSAgNDIKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9aT0xJRF9YUEVSVF9UVjcxMzQgNDMKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9FTVBJUkVfUENJX1RWX1JBRElPX0xFIDQ0CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNyAgICA0NQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9DQVJEQlVTIDQ2CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTQwMF9DQVJEQlVTIDQ3CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMF9NSzMgICA0OAorI2RlZmluZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9HT0xEX1BMVVMgNDkKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV8zMDBJX0RWQlRfUEFMIDUwCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfUFJPVklERU9fUFY5NTIgICA1MQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDUgICAgNTIKKyNkZWZpbmUgU0FBNzEzNV9CT0FSRF9BU1VTVGVLX1RWRk03MTM1IDUzCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTSA1NAorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU8gNTUKKworI2RlZmluZSBTQUE3MTM0X01BWEJPQVJEUyA4CisjZGVmaW5lIFNBQTcxMzRfSU5QVVRfTUFYIDgKKworc3RydWN0IHNhYTcxMzRfaW5wdXQgeworCWNoYXIgICAgICAgICAgICAgICAgICAgICpuYW1lOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHZtdXg7CisJZW51bSBzYWE3MTM0X2F1ZGlvX2luICAgYW11eDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBncGlvOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHR2OjE7Cit9OworCitlbnVtIHNhYTcxMzRfbXBlZ190eXBlIHsKKwlTQUE3MTM0X01QRUdfVU5VU0VELAorCVNBQTcxMzRfTVBFR19FTVBSRVNTLAorCVNBQTcxMzRfTVBFR19EVkIsCit9OworCitzdHJ1Y3Qgc2FhNzEzNF9ib2FyZCB7CisJY2hhciAgICAgICAgICAgICAgICAgICAgKm5hbWU7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgYXVkaW9fY2xvY2s7CisKKwkvKiBpbnB1dCBzd2l0Y2hpbmcgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBncGlvbWFzazsKKwlzdHJ1Y3Qgc2FhNzEzNF9pbnB1dCAgICBpbnB1dHNbU0FBNzEzNF9JTlBVVF9NQVhdOworCXN0cnVjdCBzYWE3MTM0X2lucHV0ICAgIHJhZGlvOworCXN0cnVjdCBzYWE3MTM0X2lucHV0ICAgIG11dGU7CisKKwkvKiBpMmMgY2hpcCBpbmZvICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgdHVuZXJfdHlwZTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICB0ZGE5ODg3X2NvbmY7CisKKwkvKiBwZXJpcGhlcmFsIEkvTyAqLworCWVudW0gc2FhNzEzNF92aWRlb19vdXQgIHZpZGVvX291dDsKKwllbnVtIHNhYTcxMzRfbXBlZ190eXBlICBtcGVnOworfTsKKworI2RlZmluZSBjYXJkX2hhc19yYWRpbyhkZXYpICAgKE5VTEwgIT0gc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ucmFkaW8ubmFtZSkKKyNkZWZpbmUgY2FyZF9pc19lbXByZXNzKGRldikgIChTQUE3MTM0X01QRUdfRU1QUkVTUyA9PSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5tcGVnKQorI2RlZmluZSBjYXJkX2lzX2R2YihkZXYpICAgICAgKFNBQTcxMzRfTVBFR19EVkIgICAgID09IHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm1wZWcpCisjZGVmaW5lIGNhcmRfaGFzX21wZWcoZGV2KSAgICAoU0FBNzEzNF9NUEVHX1VOVVNFRCAgIT0gc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ubXBlZykKKyNkZWZpbmUgY2FyZChkZXYpICAgICAgICAgICAgIChzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXSkKKyNkZWZpbmUgY2FyZF9pbihkZXYsbikgICAgICAgIChzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5pbnB1dHNbbl0pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBkZXZpY2UgLyBmaWxlIGhhbmRsZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJFU09VUkNFX09WRVJMQVkgICAgICAgMQorI2RlZmluZSBSRVNPVVJDRV9WSURFTyAgICAgICAgIDIKKyNkZWZpbmUgUkVTT1VSQ0VfVkJJICAgICAgICAgICA0CisKKyNkZWZpbmUgSU5URVJMQUNFX0FVVE8gICAgICAgICAwCisjZGVmaW5lIElOVEVSTEFDRV9PTiAgICAgICAgICAgMQorI2RlZmluZSBJTlRFUkxBQ0VfT0ZGICAgICAgICAgIDIKKworI2RlZmluZSBCVUZGRVJfVElNRU9VVCAgICAgKEhaLzIpICAvKiAwLjUgc2Vjb25kcyAqLworCitzdHJ1Y3Qgc2FhNzEzNF9kZXY7CitzdHJ1Y3Qgc2FhNzEzNF9kbWE7CisKKy8qIHNhYTcxMzQgcGFnZSB0YWJsZSAqLworc3RydWN0IHNhYTcxMzRfcGd0YWJsZSB7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgc2l6ZTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAqY3B1OworCWRtYV9hZGRyX3QgICAgICAgICAgICAgICAgIGRtYTsKK307CisKKy8qIHR2YXVkaW8gdGhyZWFkIHN0YXR1cyAqLworc3RydWN0IHNhYTcxMzRfdGhyZWFkIHsKKwlwaWRfdCAgICAgICAgICAgICAgICAgICAgICBwaWQ7CisJc3RydWN0IGNvbXBsZXRpb24gICAgICAgICAgZXhpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICAgICB3cTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBzaHV0ZG93bjsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBzY2FuMTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBzY2FuMjsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBtb2RlOworfTsKKworLyogYnVmZmVyIGZvciBvbmUgdmlkZW8vdmJpL3RzIGZyYW1lICovCitzdHJ1Y3Qgc2FhNzEzNF9idWYgeworCS8qIGNvbW1vbiB2NGwgYnVmZmVyIHN0dWZmIC0tIG11c3QgYmUgZmlyc3QgKi8KKwlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyIHZiOworCisJLyogc2FhNzEzNCBzcGVjaWZpYyAqLworCXN0cnVjdCBzYWE3MTM0X2Zvcm1hdCAgICpmbXQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgdG9wX3NlZW47CisJaW50ICgqYWN0aXZhdGUpKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LAorCQkJc3RydWN0IHNhYTcxMzRfYnVmICpidWYsCisJCQlzdHJ1Y3Qgc2FhNzEzNF9idWYgKm5leHQpOworCisJLyogcGFnZSB0YWJsZXMgKi8KKwlzdHJ1Y3Qgc2FhNzEzNF9wZ3RhYmxlICAqcHQ7Cit9OworCitzdHJ1Y3Qgc2FhNzEzNF9kbWFxdWV1ZSB7CisJc3RydWN0IHNhYTcxMzRfZGV2ICAgICAgICAgKmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9idWYgICAgICAgICAqY3VycjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICBxdWV1ZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICAgICB0aW1lb3V0OworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIG5lZWRfdHdvOworfTsKKworLyogdmlkZW8gZmlsZWhhbmRsZSBzdGF0dXMgKi8KK3N0cnVjdCBzYWE3MTM0X2ZoIHsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgICAgICAgICAqZGV2OworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHJhZGlvOworCWVudW0gdjRsMl9idWZfdHlwZSAgICAgICAgIHR5cGU7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgcmVzb3VyY2VzOworI2lmZGVmIFZJRElPQ19HX1BSSU9SSVRZCisJZW51bSB2NGwyX3ByaW9yaXR5CSAgIHByaW87CisjZW5kaWYKKworCS8qIHZpZGVvIG92ZXJsYXkgKi8KKwlzdHJ1Y3QgdjRsMl93aW5kb3cgICAgICAgICB3aW47CisJc3RydWN0IHY0bDJfY2xpcCAgICAgICAgICAgY2xpcHNbOF07CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgbmNsaXBzOworCisJLyogdmlkZW8gY2FwdHVyZSAqLworCXN0cnVjdCBzYWE3MTM0X2Zvcm1hdCAgICAgICpmbXQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgd2lkdGgsaGVpZ2h0OworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAgICAgIGNhcDsKKwlzdHJ1Y3Qgc2FhNzEzNF9wZ3RhYmxlICAgICBwdF9jYXA7CisKKwkvKiB2YmkgY2FwdHVyZSAqLworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAgICAgIHZiaTsKKwlzdHJ1Y3Qgc2FhNzEzNF9wZ3RhYmxlICAgICBwdF92Ymk7Cit9OworCisvKiBvc3MgZHNwIHN0YXR1cyAqLworc3RydWN0IHNhYTcxMzRfb3NzIHsKKyAgICAgICAgc3RydWN0IHNlbWFwaG9yZSAgICAgICAgICAgbG9jazsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBtaW5vcl9taXhlcjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBtaW5vcl9kc3A7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgdXNlcnNfZHNwOworCisJLyogbWl4ZXIgKi8KKwllbnVtIHNhYTcxMzRfYXVkaW9faW4gICAgICBpbnB1dDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBjb3VudDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBsaW5lMTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBsaW5lMjsKKworCS8qIGRzcCAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGFmbXQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgcmF0ZTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBjaGFubmVsczsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICByZWNvcmRpbmdfb247CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgZG1hX3J1bm5pbmc7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgYmxvY2tzOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGJsa3NpemU7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgYnVmc2l6ZTsKKwlzdHJ1Y3Qgc2FhNzEzNF9wZ3RhYmxlICAgICBwdDsKKwlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICAgICBkbWE7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgICAgd3E7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgZG1hX2JsazsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICByZWFkX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICByZWFkX2NvdW50OworfTsKKworLyogSVIgaW5wdXQgKi8KK3N0cnVjdCBzYWE3MTM0X2lyIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICAgICAgICAgICBkZXY7CisJc3RydWN0IGlyX2lucHV0X3N0YXRlICAgICAgaXI7CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgbmFtZVszMl07CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgcGh5c1szMl07CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgbWFza19rZXljb2RlOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfa2V5ZG93bjsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX2tleXVwOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBwb2xsaW5nOworICAgICAgICB1MzIgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2dwaW87CisgICAgICAgIHN0cnVjdCB0aW1lcl9saXN0ICAgICAgICAgIHRpbWVyOworfTsKKworLyogdHMvbXBlZyBzdGF0dXMgKi8KK3N0cnVjdCBzYWE3MTM0X3RzIHsKKwkvKiBUUyBjYXB0dXJlICovCisJc3RydWN0IHNhYTcxMzRfcGd0YWJsZSAgICAgcHRfdHM7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgbnJfcGFja2V0czsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBucl9idWZzOworfTsKKworLyogdHMvbXBlZyBvcHMgKi8KK3N0cnVjdCBzYWE3MTM0X21wZWdfb3BzIHsKKwllbnVtIHNhYTcxMzRfbXBlZ190eXBlICAgICB0eXBlOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgIG5leHQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgKCppbml0KShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgKCpmaW5pKShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKCpzaWduYWxfY2hhbmdlKShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7Cit9OworCisvKiBnbG9iYWwgZGV2aWNlIHN0YXR1cyAqLworc3RydWN0IHNhYTcxMzRfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICBkZXZsaXN0OworICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICAgICAgICBsb2NrOworICAgICAgIAlzcGlubG9ja190ICAgICAgICAgICAgICAgICBzbG9jazsKKyNpZmRlZiBWSURJT0NfR19QUklPUklUWQorCXN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgICAgIHByaW87CisjZW5kaWYKKworCS8qIHZhcmlvdXMgZGV2aWNlIGluZm8gKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICByZXNvdXJjZXM7CisJc3RydWN0IHZpZGVvX2RldmljZSAgICAgICAgKnZpZGVvX2RldjsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICAgICAgICAqcmFkaW9fZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgICAgICAgICp2YmlfZGV2OworCXN0cnVjdCBzYWE3MTM0X29zcyAgICAgICAgIG9zczsKKworCS8qIGluZnJhcmVkIHJlbW90ZSAqLworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGhhc19yZW1vdGU7CisJc3RydWN0IHNhYTcxMzRfaXIgICAgICAgICAgKnJlbW90ZTsKKworCS8qIHBjaSBpL28gKi8KKwljaGFyICAgICAgICAgICAgICAgICAgICAgICBuYW1lWzMyXTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBucjsKKwlzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAqcGNpOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgIHBjaV9yZXYscGNpX2xhdDsKKwlfX3UzMiAgICAgICAgICAgICAgICAgICAgICBfX2lvbWVtICpsbW1pbzsKKwlfX3U4ICAgICAgICAgICAgICAgICAgICAgICBfX2lvbWVtICpibW1pbzsKKworCS8qIGNvbmZpZyBpbmZvICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgYm9hcmQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgdHVuZXJfdHlwZTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICB0ZGE5ODg3X2NvbmY7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgZ3Bpb192YWx1ZTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBpcnEyX21hc2s7CisKKwkvKiBpMmMgaS9vICovCisJc3RydWN0IGkyY19hZGFwdGVyICAgICAgICAgaTJjX2FkYXA7CisJc3RydWN0IGkyY19jbGllbnQgICAgICAgICAgaTJjX2NsaWVudDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICBlZWRhdGFbNjRdOworCisJLyogdmlkZW8gb3ZlcmxheSAqLworCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICAgIG92YnVmOworCXN0cnVjdCBzYWE3MTM0X2Zvcm1hdCAgICAgICpvdmZtdDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBvdmVuYWJsZTsKKwllbnVtIHY0bDJfZmllbGQgICAgICAgICAgICBvdmZpZWxkOworCisJLyogdmlkZW8rdHMrdmJpIGNhcHR1cmUgKi8KKwlzdHJ1Y3Qgc2FhNzEzNF9kbWFxdWV1ZSAgICB2aWRlb19xOworCXN0cnVjdCBzYWE3MTM0X2RtYXF1ZXVlICAgIHZiaV9xOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHZpZGVvX2ZpZWxkY291bnQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgdmJpX2ZpZWxkY291bnQ7CisKKwkvKiB2YXJpb3VzIHY0bCBjb250cm9scyAqLworCXN0cnVjdCBzYWE3MTM0X3R2bm9ybSAgICAgICp0dm5vcm07ICAgICAgICAgICAgICAvKiB2aWRlbyAqLworCXN0cnVjdCBzYWE3MTM0X3R2YXVkaW8gICAgICp0dmF1ZGlvOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGN0bF9pbnB1dDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBjdGxfYnJpZ2h0OworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGN0bF9jb250cmFzdDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBjdGxfaHVlOworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGN0bF9zYXR1cmF0aW9uOworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGN0bF9mcmVxOworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGN0bF9tdXRlOyAgICAgICAgICAgICAvKiBhdWRpbyAqLworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGN0bF92b2x1bWU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgY3RsX2ludmVydDsgICAgICAgICAgIC8qIHByaXZhdGUgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBjdGxfbWlycm9yOworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGN0bF95X29kZDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBjdGxfeV9ldmVuOworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGN0bF9hdXRvbXV0ZTsKKworCS8qIGNyb3AgKi8KKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICAgICBjcm9wX2JvdW5kczsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICAgICBjcm9wX2RlZnJlY3Q7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgICAgY3JvcF9jdXJyZW50OworCisJLyogb3RoZXIgZ2xvYmFsIHN0YXRlIGluZm8gKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBhdXRvbXV0ZTsKKwlzdHJ1Y3Qgc2FhNzEzNF90aHJlYWQgICAgICB0aHJlYWQ7CisJc3RydWN0IHNhYTcxMzRfaW5wdXQgICAgICAgKmlucHV0OworCXN0cnVjdCBzYWE3MTM0X2lucHV0ICAgICAgICpod19pbnB1dDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBod19tdXRlOworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfY2FycmllcjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBub3NpZ25hbDsKKworCS8qIFNBQTcxMzRfTVBFR18qICovCisJc3RydWN0IHNhYTcxMzRfdHMgICAgICAgICAgdHM7CisJc3RydWN0IHNhYTcxMzRfZG1hcXVldWUgICAgdHNfcTsKKwlzdHJ1Y3Qgc2FhNzEzNF9tcGVnX29wcyAgICAqbW9wczsKKworCS8qIFNBQTcxMzRfTVBFR19FTVBSRVNTIG9ubHkgKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICAgICAgICAqZW1wcmVzc19kZXY7CisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICAgICAgZW1wcmVzc190c3E7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgZW1wcmVzc191c2VyczsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICAgICBlbXByZXNzX3dvcmtxdWV1ZTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNzX3N0YXJ0ZWQ7CisKKwkvKiBTQUE3MTM0X01QRUdfRFZCIG9ubHkgKi8KKwlzdHJ1Y3QgdmlkZW9idWZfZHZiICAgICAgICBkdmI7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIHNhYV9yZWFkbChyZWcpICAgICAgICAgICAgIHJlYWRsKGRldi0+bG1taW8gKyAocmVnKSkKKyNkZWZpbmUgc2FhX3dyaXRlbChyZWcsdmFsdWUpICAgICAgd3JpdGVsKCh2YWx1ZSksIGRldi0+bG1taW8gKyAocmVnKSk7CisjZGVmaW5lIHNhYV9hbmRvcmwocmVnLG1hc2ssdmFsdWUpIFwKKyAgd3JpdGVsKChyZWFkbChkZXYtPmxtbWlvKyhyZWcpKSAmIH4obWFzaykpIHxcCisgICgodmFsdWUpICYgKG1hc2spKSwgZGV2LT5sbW1pbysocmVnKSkKKyNkZWZpbmUgc2FhX3NldGwocmVnLGJpdCkgICAgICAgICAgc2FhX2FuZG9ybCgocmVnKSwoYml0KSwoYml0KSkKKyNkZWZpbmUgc2FhX2NsZWFybChyZWcsYml0KSAgICAgICAgc2FhX2FuZG9ybCgocmVnKSwoYml0KSwwKQorCisjZGVmaW5lIHNhYV9yZWFkYihyZWcpICAgICAgICAgICAgIHJlYWRiKGRldi0+Ym1taW8gKyAocmVnKSkKKyNkZWZpbmUgc2FhX3dyaXRlYihyZWcsdmFsdWUpICAgICAgd3JpdGViKCh2YWx1ZSksIGRldi0+Ym1taW8gKyAocmVnKSk7CisjZGVmaW5lIHNhYV9hbmRvcmIocmVnLG1hc2ssdmFsdWUpIFwKKyAgd3JpdGViKChyZWFkYihkZXYtPmJtbWlvKyhyZWcpKSAmIH4obWFzaykpIHxcCisgICgodmFsdWUpICYgKG1hc2spKSwgZGV2LT5ibW1pbysocmVnKSkKKyNkZWZpbmUgc2FhX3NldGIocmVnLGJpdCkgICAgICAgICAgc2FhX2FuZG9yYigocmVnKSwoYml0KSwoYml0KSkKKyNkZWZpbmUgc2FhX2NsZWFyYihyZWcsYml0KSAgICAgICAgc2FhX2FuZG9yYigocmVnKSwoYml0KSwwKQorCisjZGVmaW5lIHNhYV93YWl0KHVzKSB7IHVkZWxheSh1cyk7IH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHNhYTcxMzQtY29yZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkICBzYWE3MTM0X2Rldmxpc3Q7CisKK3ZvaWQgc2FhNzEzNF9wcmludF9pb2N0bChjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgY21kKTsKK3ZvaWQgc2FhNzEzNF90cmFja19ncGlvKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBjaGFyICptc2cpOworCisjZGVmaW5lIFNBQTcxMzRfUEdUQUJMRV9TSVpFIDQwOTYKKworaW50IHNhYTcxMzRfcGd0YWJsZV9hbGxvYyhzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3Qgc2FhNzEzNF9wZ3RhYmxlICpwdCk7CitpbnQgIHNhYTcxMzRfcGd0YWJsZV9idWlsZChzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3Qgc2FhNzEzNF9wZ3RhYmxlICpwdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqbGlzdCwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCSAgIHVuc2lnbmVkIGludCBzdGFydHBhZ2UpOwordm9pZCBzYWE3MTM0X3BndGFibGVfZnJlZShzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3Qgc2FhNzEzNF9wZ3RhYmxlICpwdCk7CisKK2ludCBzYWE3MTM0X2J1ZmZlcl9jb3VudCh1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IGNvdW50KTsKK2ludCBzYWE3MTM0X2J1ZmZlcl9zdGFydHBhZ2Uoc3RydWN0IHNhYTcxMzRfYnVmICpidWYpOwordW5zaWduZWQgbG9uZyBzYWE3MTM0X2J1ZmZlcl9iYXNlKHN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmKTsKKworaW50IHNhYTcxMzRfYnVmZmVyX3F1ZXVlKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF9kbWFxdWV1ZSAqcSwKKwkJCSBzdHJ1Y3Qgc2FhNzEzNF9idWYgKmJ1Zik7Cit2b2lkIHNhYTcxMzRfYnVmZmVyX2ZpbmlzaChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHNhYTcxMzRfZG1hcXVldWUgKnEsCisJCQkgICB1bnNpZ25lZCBpbnQgc3RhdGUpOwordm9pZCBzYWE3MTM0X2J1ZmZlcl9uZXh0KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF9kbWFxdWV1ZSAqcSk7Cit2b2lkIHNhYTcxMzRfYnVmZmVyX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgc2FhNzEzNF9kbWFfZnJlZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldixzdHJ1Y3Qgc2FhNzEzNF9idWYgKmJ1Zik7CisKK2ludCBzYWE3MTM0X3NldF9kbWFiaXRzKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHNhYTcxMzQtY2FyZHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2V4dGVybiBzdHJ1Y3Qgc2FhNzEzNF9ib2FyZCBzYWE3MTM0X2JvYXJkc1tdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBzYWE3MTM0X2Jjb3VudDsKK2V4dGVybiBzdHJ1Y3QgcGNpX2RldmljZV9pZCBfX2RldmluaXRkYXRhIHNhYTcxMzRfcGNpX3RibFtdOworCitleHRlcm4gaW50IHNhYTcxMzRfYm9hcmRfaW5pdDEoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOworZXh0ZXJuIGludCBzYWE3MTM0X2JvYXJkX2luaXQyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc2FhNzEzNC1pMmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IHNhYTcxMzRfaTJjX3JlZ2lzdGVyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKK2ludCBzYWE3MTM0X2kyY191bnJlZ2lzdGVyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKK3ZvaWQgc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LAorCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc2FhNzEzNC12aWRlby5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworZXh0ZXJuIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2FhNzEzNF92aWRlb190ZW1wbGF0ZTsKK2V4dGVybiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNhYTcxMzRfcmFkaW9fdGVtcGxhdGU7CisKK2ludCBzYWE3MTM0X2NvbW1vbl9pb2N0bChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworCitpbnQgc2FhNzEzNF92aWRlb19pbml0MShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CitpbnQgc2FhNzEzNF92aWRlb19pbml0MihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CitpbnQgc2FhNzEzNF92aWRlb19maW5pKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKK3ZvaWQgc2FhNzEzNF9pcnFfdmlkZW9faW50bChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7Cit2b2lkIHNhYTcxMzRfaXJxX3ZpZGVvX2RvbmUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgc3RhdHVzKTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc2FhNzEzNC10cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBUU19QQUNLRVRfU0laRSAxODggLyogVFMgcGFja2V0cyAxODggYnl0ZXMgKi8KKworZXh0ZXJuIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgc2FhNzEzNF90c19xb3BzOworCitpbnQgc2FhNzEzNF90c19pbml0MShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CitpbnQgc2FhNzEzNF90c19maW5pKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKK3ZvaWQgc2FhNzEzNF9pcnFfdHNfZG9uZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBzdGF0dXMpOworCitpbnQgc2FhNzEzNF90c19yZWdpc3RlcihzdHJ1Y3Qgc2FhNzEzNF9tcGVnX29wcyAqb3BzKTsKK3ZvaWQgc2FhNzEzNF90c191bnJlZ2lzdGVyKHN0cnVjdCBzYWE3MTM0X21wZWdfb3BzICpvcHMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc2FhNzEzNC12YmkuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworZXh0ZXJuIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgc2FhNzEzNF92YmlfcW9wczsKK2V4dGVybiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNhYTcxMzRfdmJpX3RlbXBsYXRlOworCitpbnQgc2FhNzEzNF92YmlfaW5pdDEoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOworaW50IHNhYTcxMzRfdmJpX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOwordm9pZCBzYWE3MTM0X2lycV92YmlfZG9uZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBzdGF0dXMpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBzYWE3MTM0LXR2YXVkaW8uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgc2FhNzEzNF90dmF1ZGlvX3J4Mm1vZGUodTMyIHJ4KTsKKwordm9pZCBzYWE3MTM0X3R2YXVkaW9fc2V0bXV0ZShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7Cit2b2lkIHNhYTcxMzRfdHZhdWRpb19zZXRpbnB1dChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBzYWE3MTM0X2lucHV0ICppbik7Cit2b2lkIHNhYTcxMzRfdHZhdWRpb19zZXR2b2x1bWUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCBsZXZlbCk7CitpbnQgc2FhNzEzNF90dmF1ZGlvX2dldHN0ZXJlbyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CisKK2ludCBzYWE3MTM0X3R2YXVkaW9faW5pdDIoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOworaW50IHNhYTcxMzRfdHZhdWRpb19maW5pKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKK2ludCBzYWE3MTM0X3R2YXVkaW9fZG9fc2NhbihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CisKK2ludCBzYWFfZHNwX3dyaXRlbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IHJlZywgdTMyIHZhbHVlKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHNhYTcxMzQtb3NzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNhYTcxMzRfZHNwX2ZvcHM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzYWE3MTM0X21peGVyX2ZvcHM7CisKK2ludCBzYWE3MTM0X29zc19pbml0MShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CitpbnQgc2FhNzEzNF9vc3NfZmluaShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7Cit2b2lkIHNhYTcxMzRfaXJxX29zc19kb25lKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIHN0YXR1cyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBzYWE3MTM0LWlucHV0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgIHNhYTcxMzRfaW5wdXRfaW5pdDEoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOwordm9pZCBzYWE3MTM0X2lucHV0X2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOwordm9pZCBzYWE3MTM0X2lucHV0X2lycShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNDYuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE0Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDVlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNDYuaApAQCAtMCwwICsxLDExNSBAQAorLyogIAorICAgIHNhYTcxNDYuaCAtIGRlZmluaXRpb25zIHBoaWxpcHMgc2FhNzE0NiBiYXNlZCBjYXJkcworICAgIENvcHlyaWdodCAoQykgMTk5OSBOYXRoYW4gTGFyZWRvIChsYXJlZG9AZ251Lm9yZykKKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpZm5kZWYgX19TQUE3MTQ2X18KKyNkZWZpbmUgX19TQUE3MTQ2X18KKworI2RlZmluZSBTQUE3MTQ2X1ZFUlNJT05fQ09ERSAweDAwMDEwMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorCisjaWZuZGVmIE9fTk9OQ0FQICAKKyNkZWZpbmUgT19OT05DQVAJT19UUlVOQworI2VuZGlmCisKKyNkZWZpbmUgTUFYX0dCVUZGRVJTCTIKKyNkZWZpbmUgRkJVRl9TSVpFCTB4MTkwMDAwCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3N0cnVjdCBzYWE3MTQ2X3dpbmRvdyAKK3sKKwlpbnQgeCwgeTsKKwl1c2hvcnQgd2lkdGgsIGhlaWdodDsKKwl1c2hvcnQgYnBwLCBicGw7CisJdXNob3J0IHN3aWR0aCwgc2hlaWdodDsKKwlzaG9ydCBjcm9weCwgY3JvcHk7CisJdXNob3J0IGNyb3B3aWR0aCwgY3JvcGhlaWdodDsKKwl1bnNpZ25lZCBsb25nIHZpZGFkcjsKKwlpbnQgY29sb3JfZm10OworCXVzaG9ydCBkZXB0aDsKK307CisKKy8qICBQZXItb3BlbiBkYXRhIGZvciBoYW5kbGluZyBtdWx0aXBsZSBvcGVucyBvbiBvbmUgZGV2aWNlICovCitzdHJ1Y3QgZGV2aWNlX29wZW4KK3sKKwlpbnQJICAgICBpc29wZW47CisJaW50CSAgICAgbm9uY2FwdHVyaW5nOworCXN0cnVjdCBzYWE3MTQ2ICAqZGV2OworfTsKKyNkZWZpbmUgTUFYX09QRU5TIDMKKworc3RydWN0IHNhYTcxNDYKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZpZGVvX2RldjsKKwlzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0dXJlOworCXN0cnVjdCB2aWRlb19hdWRpbyBhdWRpb19kZXY7CisJc3RydWN0IHZpZGVvX2luZm8gdmlkaW5mbzsKKwlpbnQgdXNlcjsKKwlpbnQgY2FwOworCWludCBjYXB1c2VyOworCWludCBpcnFzdGF0ZTsJCS8qIGlycSByb3V0aW5lIGlzIHN0YXRlIGRyaXZlbiAqLworCWludCB3cml0ZW1vZGU7CisJaW50IHBsYXltb2RlOworICAgICAgICB1bnNpZ25lZCBpbnQgbnI7CisJdW5zaWduZWQgbG9uZyBpcnE7ICAgICAgICAgIC8qIElSUSB1c2VkIGJ5IFNBQTcxNDYgY2FyZCAqLworCXVuc2lnbmVkIHNob3J0IGlkOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJdW5zaWduZWQgY2hhciByZXZpc2lvbjsKKwl1bnNpZ25lZCBjaGFyIGJvYXJkY2ZnWzY0XTsJLyogNjQgYnl0ZXMgb2YgY29uZmlnIGZyb20gZWVwcm9tICovCisJdW5zaWduZWQgbG9uZyBzYWE3MTQ2X2FkcjsgICAvKiBidXMgYWRkcmVzcyBvZiBJTyBtZW0gZnJvbSBQQ0kgQklPUyAqLworCXN0cnVjdCBzYWE3MTQ2X3dpbmRvdyB3aW47CisJdW5zaWduZWQgY2hhciBfX2lvbWVtICpzYWE3MTQ2X21lbTsgLyogcG9pbnRlciB0byBtYXBwZWQgSU8gbWVtb3J5ICovCisJc3RydWN0IGRldmljZV9vcGVuIG9wZW5fZGF0YVtNQVhfT1BFTlNdOworI2RlZmluZSBNQVhfTUFSS1MgMTYKKwkvKiBmb3IgYS92IHN5bmMgKi8KKwlpbnQgZW5kbWFya1tNQVhfTUFSS1NdLCBlbmRtYXJraGVhZCwgZW5kbWFya3RhaWw7CisJdTMyICpkbWFSUFMxLCAqcGFnZVJQUzEsICpkbWFSUFMyLCAqcGFnZVJQUzIsICpkbWF2aWQxLCAqZG1hdmlkMiwKKwkJKmRtYXZpZDMsICpkbWFhMWluLCAqZG1hYTFvdXQsICpkbWFhMmluLCAqZG1hYTJvdXQsCisJCSpwYWdlZGViaSwgKnBhZ2V2aWQxLCAqcGFnZXZpZDIsICpwYWdldmlkMywgKnBhZ2VhMWluLAorCQkqcGFnZWExb3V0LCAqcGFnZWEyaW4sICpwYWdlYTJvdXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgaTJjcSwgZGViaXEsIGF1ZHEsIHZpZHE7CisJdTggICp2aWRidWYsICphdWRidWYsICpvc2RidWYsICpkbWFkZWJpOworCWludCBhdWRoZWFkLCB2aWRoZWFkLCBvc2RoZWFkLCBhdWR0YWlsLCB2aWR0YWlsLCBvc2R0YWlsOworCXNwaW5sb2NrX3QgbG9jazsJLyogdGhlIGRldmljZSBsb2NrICovCit9OworI2VuZGlmCisKKyNpZmRlZiBfQUxQSEFfU0FBNzE0NgorI2RlZmluZSBzYWF3cml0ZShkYXQsYWRyKSAgICB3cml0ZWwoKGRhdCksIHNhYS0+c2FhNzE0Nl9hZHIrKGFkcikpCisjZGVmaW5lIHNhYXJlYWQoYWRyKSAgICAgICAgIHJlYWRsKHNhYS0+c2FhNzE0Nl9hZHIrKGFkcikpCisjZWxzZQorI2RlZmluZSBzYWF3cml0ZShkYXQsYWRyKSAgICB3cml0ZWwoKGRhdCksIHNhYS0+c2FhNzE0Nl9tZW0rKGFkcikpCisjZGVmaW5lIHNhYXJlYWQoYWRyKSAgICAgICAgIHJlYWRsKHNhYS0+c2FhNzE0Nl9tZW0rKGFkcikpCisjZW5kaWYKKworI2RlZmluZSBzYWFhbmQoZGF0LGFkcikgICAgICBzYWF3cml0ZSgoZGF0KSAmIHNhYXJlYWQoYWRyKSwgYWRyKQorI2RlZmluZSBzYWFvcihkYXQsYWRyKSAgICAgICBzYWF3cml0ZSgoZGF0KSB8IHNhYXJlYWQoYWRyKSwgYWRyKQorI2RlZmluZSBzYWFhb3IoZGF0LG1hc2ssYWRyKSBzYWF3cml0ZSgoZGF0KSB8ICgobWFzaykgJiBzYWFyZWFkKGFkcikpLCBhZHIpCisKKy8qIGJpdG1hc2sgb2YgYXR0YWNoZWQgaGFyZHdhcmUgZm91bmQgKi8KKyNkZWZpbmUgU0FBNzE0Nl9VTktOT1dOCQkweDAwMDAwMDAwCisjZGVmaW5lIFNBQTcxNDZfU0FBNzExMQkJMHgwMDAwMDAwMQorI2RlZmluZSBTQUE3MTQ2X1NBQTcxMjEJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0FBNzE0Nl9JQk1NUEVHCQkweDAwMDAwMDA0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTQ2cmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNDZyZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M5MTBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTQ2cmVnLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qICAKKyAgICBzYWE3MTQ2LmggLSBkZWZpbml0aW9ucyBwaGlsaXBzIHNhYTcxNDYgYmFzZWQgY2FyZHMKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTkgTmF0aGFuIExhcmVkbyAobGFyZWRvQGdudS5vcmcpCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIF9fU0FBNzE0Nl9SRUdfXworI2RlZmluZSBfX1NBQTcxNDZfUkVHX18KKyNkZWZpbmUgU0FBNzE0Nl9CQVNFX09ERDEJMHgwMAorI2RlZmluZSBTQUE3MTQ2X0JBU0VfRVZFTjEJMHgwNAorI2RlZmluZSBTQUE3MTQ2X1BST1RfQUREUjEJMHgwOAorI2RlZmluZSBTQUE3MTQ2X1BJVENIMQkJMHgwYworI2RlZmluZSBTQUE3MTQ2X1BBR0UxCQkweDEwCisjZGVmaW5lIFNBQTcxNDZfTlVNX0xJTkVfQllURTEJMHgxNAorI2RlZmluZSBTQUE3MTQ2X0JBU0VfT0REMgkweDE4CisjZGVmaW5lIFNBQTcxNDZfQkFTRV9FVkVOMgkweDFjCisjZGVmaW5lIFNBQTcxNDZfUFJPVF9BRERSMgkweDIwCisjZGVmaW5lIFNBQTcxNDZfUElUQ0gyCQkweDI0CisjZGVmaW5lIFNBQTcxNDZfUEFHRTIJCTB4MjgKKyNkZWZpbmUgU0FBNzE0Nl9OVU1fTElORV9CWVRFMgkweDJjCisjZGVmaW5lIFNBQTcxNDZfQkFTRV9PREQzCTB4MzAKKyNkZWZpbmUgU0FBNzE0Nl9CQVNFX0VWRU4zCTB4MzQKKyNkZWZpbmUgU0FBNzE0Nl9QUk9UX0FERFIzCTB4MzgKKyNkZWZpbmUgU0FBNzE0Nl9QSVRDSDMJCTB4M2MKKyNkZWZpbmUgU0FBNzE0Nl9QQUdFMwkJMHg0MAorI2RlZmluZSBTQUE3MTQ2X05VTV9MSU5FX0JZVEUzCTB4NDQKKyNkZWZpbmUgU0FBNzE0Nl9QQ0lfQlRfVjEJMHg0OAorI2RlZmluZSBTQUE3MTQ2X1BDSV9CVF9WMgkweDQ5CisjZGVmaW5lIFNBQTcxNDZfUENJX0JUX1YzCTB4NGEKKyNkZWZpbmUgU0FBNzE0Nl9QQ0lfQlRfREVCSQkweDRiCisjZGVmaW5lIFNBQTcxNDZfUENJX0JUX0EJMHg0YworI2RlZmluZSBTQUE3MTQ2X0REMV9JTklUCTB4NTAKKyNkZWZpbmUgU0FBNzE0Nl9ERDFfU1RSRUFNX0IJMHg1NAorI2RlZmluZSBTQUE3MTQ2X0REMV9TVFJFQU1fQQkweDU2CisjZGVmaW5lIFNBQTcxNDZfQlJTX0NUUkwJMHg1OAorI2RlZmluZSBTQUE3MTQ2X0hQU19DVFJMCTB4NWMKKyNkZWZpbmUgU0FBNzE0Nl9IUFNfVl9TQ0FMRQkweDYwCisjZGVmaW5lIFNBQTcxNDZfSFBTX1ZfR0FJTgkweDY0CisjZGVmaW5lIFNBQTcxNDZfSFBTX0hfUFJFU0NBTEUJMHg2OAorI2RlZmluZSBTQUE3MTQ2X0hQU19IX1NDQUxFCTB4NmMKKyNkZWZpbmUgU0FBNzE0Nl9CQ1NfQ1RSTAkweDcwCisjZGVmaW5lIFNBQTcxNDZfQ0hST01BX0tFWV9SQU5HRQkweDc0CisjZGVmaW5lIFNBQTcxNDZfQ0xJUF9GT1JNQVRfQ1RSTAkweDc4CisjZGVmaW5lIFNBQTcxNDZfREVCSV9DT05GSUcJMHg3YworI2RlZmluZSBTQUE3MTQ2X0RFQklfQ09NTUFORAkweDgwCisjZGVmaW5lIFNBQTcxNDZfREVCSV9QQUdFCTB4ODQKKyNkZWZpbmUgU0FBNzE0Nl9ERUJJX0FECQkweDg4CisjZGVmaW5lIFNBQTcxNDZfSTJDX1RSQU5TRkVSCTB4OGMKKyNkZWZpbmUgU0FBNzE0Nl9JMkNfU1RBVFVTCTB4OTAKKyNkZWZpbmUgU0FBNzE0Nl9CQVNFX0ExX0lOCTB4OTQKKyNkZWZpbmUgU0FBNzE0Nl9QUk9UX0ExX0lOCTB4OTgKKyNkZWZpbmUgU0FBNzE0Nl9QQUdFX0ExX0lOCTB4OUMKKyNkZWZpbmUgU0FBNzE0Nl9CQVNFX0ExX09VVAkweGEwCisjZGVmaW5lIFNBQTcxNDZfUFJPVF9BMV9PVVQJMHhhNAorI2RlZmluZSBTQUE3MTQ2X1BBR0VfQTFfT1VUCTB4YTgKKyNkZWZpbmUgU0FBNzE0Nl9CQVNFX0EyX0lOCTB4YWMKKyNkZWZpbmUgU0FBNzE0Nl9QUk9UX0EyX0lOCTB4YjAKKyNkZWZpbmUgU0FBNzE0Nl9QQUdFX0EyX0lOCTB4YjQKKyNkZWZpbmUgU0FBNzE0Nl9CQVNFX0EyX09VVAkweGI4CisjZGVmaW5lIFNBQTcxNDZfUFJPVF9BMl9PVVQJMHhiYworI2RlZmluZSBTQUE3MTQ2X1BBR0VfQTJfT1VUCTB4YzAKKyNkZWZpbmUgU0FBNzE0Nl9SUFNfUEFHRTAJMHhjNAorI2RlZmluZSBTQUE3MTQ2X1JQU19QQUdFMQkweGM4CisjZGVmaW5lIFNBQTcxNDZfUlBTX1RIUkVTSDAJMHhjYworI2RlZmluZSBTQUE3MTQ2X1JQU19USFJFU0gxCTB4ZDAKKyNkZWZpbmUgU0FBNzE0Nl9SUFNfVE9WMAkweGQ0CisjZGVmaW5lIFNBQTcxNDZfUlBTX1RPVjEJMHhkOAorI2RlZmluZSBTQUE3MTQ2X0lFUgkJMHhkYworI2RlZmluZSBTQUE3MTQ2X0dQSU9fQ1RSTAkweGUwCisjZGVmaW5lIFNBQTcxNDZfRUMxU1NSCQkweGU0CisjZGVmaW5lIFNBQTcxNDZfRUMyU1NSCQkweGU4CisjZGVmaW5lIFNBQTcxNDZfRUNUMVIJCTB4ZWMKKyNkZWZpbmUgU0FBNzE0Nl9FQ1QyUgkJMHhmMAorI2RlZmluZSBTQUE3MTQ2X0FDT04xCQkweGY0CisjZGVmaW5lIFNBQTcxNDZfQUNPTjIJCTB4ZjgKKyNkZWZpbmUgU0FBNzE0Nl9NQzEJCTB4ZmMKKyNkZWZpbmUgU0FBNzE0Nl9NQzIJCTB4MTAwCisjZGVmaW5lIFNBQTcxNDZfUlBTX0FERFIwCTB4MTA0CisjZGVmaW5lIFNBQTcxNDZfUlBTX0FERFIxCTB4MTA4CisjZGVmaW5lIFNBQTcxNDZfSVNSCQkweDEwYworI2RlZmluZSBTQUE3MTQ2X1BTUgkJMHgxMTAKKyNkZWZpbmUgU0FBNzE0Nl9TU1IJCTB4MTE0CisjZGVmaW5lIFNBQTcxNDZfRUMxUgkJMHgxMTgKKyNkZWZpbmUgU0FBNzE0Nl9FQzJSCQkweDExYworI2RlZmluZSBTQUE3MTQ2X1ZEUDEJCTB4MTIwCisjZGVmaW5lIFNBQTcxNDZfVkRQMgkJMHgxMjQKKyNkZWZpbmUgU0FBNzE0Nl9WRFAzCQkweDEyOAorI2RlZmluZSBTQUE3MTQ2X0FEUDEJCTB4MTJjCisjZGVmaW5lIFNBQTcxNDZfQURQMgkJMHgxMzAKKyNkZWZpbmUgU0FBNzE0Nl9BRFAzCQkweDEzNAorI2RlZmluZSBTQUE3MTQ2X0FEUDQJCTB4MTM4CisjZGVmaW5lIFNBQTcxNDZfRERQCQkweDEzYworI2RlZmluZSBTQUE3MTQ2X0xFVkVMX1JFUAkweDE0MAorI2RlZmluZSBTQUE3MTQ2X0ZCX0JVRkZFUjEJMHgxNDQKKyNkZWZpbmUgU0FBNzE0Nl9GQl9CVUZGRVIyCTB4MTQ4CisjZGVmaW5lIFNBQTcxNDZfQV9USU1FX1NMT1QxCTB4MTgwCisjZGVmaW5lIFNBQTcxNDZfQV9USU1FX1NMT1QyCTB4MUMwCisKKy8qIGJpdGZpZWxkIGRlZmluZXMgKi8KKyNkZWZpbmUgTUFTS18zMQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgTUFTS18zMAkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgTUFTS18yOQkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgTUFTS18yOAkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgTUFTS18yNwkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgTUFTS18yNgkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgTUFTS18yNQkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgTUFTS18yNAkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgTUFTS18yMwkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUFTS18yMgkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgTUFTS18yMQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgTUFTS18yMAkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTUFTS18xOQkJCTB4MDAwODAwMDAKKyNkZWZpbmUgTUFTS18xOAkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUFTS18xNwkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgTUFTS18xNgkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgTUFTS18xNQkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgTUFTS18xNAkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgTUFTS18xMwkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTUFTS18xMgkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgTUFTS18xMQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTUFTS18xMAkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgTUFTS18wOQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgTUFTS18wOAkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTUFTS18wNwkJCTB4MDAwMDAwODAKKyNkZWZpbmUgTUFTS18wNgkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgTUFTS18wNQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUFTS18wNAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUFTS18wMwkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFTS18wMgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUFTS18wMQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUFTS18wMAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUFTS19CMAkJCTB4MDAwMDAwZmYKKyNkZWZpbmUgTUFTS19CMQkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgTUFTS19CMgkJCTB4MDBmZjAwMDAKKyNkZWZpbmUgTUFTS19CMwkJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgTUFTS19XMAkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgTUFTS19XMQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgTUFTS19QQQkJCTB4ZmZmZmZmZmMKKyNkZWZpbmUgTUFTS19QUgkJCTB4ZmZmZmZmZmUKKyNkZWZpbmUgTUFTS19FUgkJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgTUFTS19OT05FCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgU0FBNzE0Nl9QQUdFX01BUF9FTglNQVNLXzExCisvKiBtYWluIGNvbnRyb2wgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBTQUE3MTQ2X01DMV9NUlNUX04JTUFTS18xNQorI2RlZmluZSBTQUE3MTQ2X01DMV9FUlBTMQlNQVNLXzEzCisjZGVmaW5lIFNBQTcxNDZfTUMxX0VSUFMwCU1BU0tfMTIKKyNkZWZpbmUgU0FBNzE0Nl9NQzFfRURQCQlNQVNLXzExCisjZGVmaW5lIFNBQTcxNDZfTUMxX0VWUAkJTUFTS18xMAorI2RlZmluZSBTQUE3MTQ2X01DMV9FQVAJCU1BU0tfMDkKKyNkZWZpbmUgU0FBNzE0Nl9NQzFfRUkyQwlNQVNLXzA4CisjZGVmaW5lIFNBQTcxNDZfTUMxX1RSX0VfREVCSQlNQVNLXzA3CisjZGVmaW5lIFNBQTcxNDZfTUMxX1RSX0VfMQlNQVNLXzA2CisjZGVmaW5lIFNBQTcxNDZfTUMxX1RSX0VfMglNQVNLXzA1CisjZGVmaW5lIFNBQTcxNDZfTUMxX1RSX0VfMwlNQVNLXzA0CisjZGVmaW5lIFNBQTcxNDZfTUMxX1RSX0VfQTJfT1VUCU1BU0tfMDMKKyNkZWZpbmUgU0FBNzE0Nl9NQzFfVFJfRV9BMl9JTglNQVNLXzAyCisjZGVmaW5lIFNBQTcxNDZfTUMxX1RSX0VfQTFfT1VUCU1BU0tfMDEKKyNkZWZpbmUgU0FBNzE0Nl9NQzFfVFJfRV9BMV9JTglNQVNLXzAwCisvKiBtYWluIGNvbnRyb2wgcmVnaXN0ZXIgMiAqLworI2RlZmluZSBTQUE3MTQ2X01DMl9SUFNfU0lHNAlNQVNLXzE1CisjZGVmaW5lIFNBQTcxNDZfTUMyX1JQU19TSUczCU1BU0tfMTQKKyNkZWZpbmUgU0FBNzE0Nl9NQzJfUlBTX1NJRzIJTUFTS18xMworI2RlZmluZSBTQUE3MTQ2X01DMl9SUFNfU0lHMQlNQVNLXzEyCisjZGVmaW5lIFNBQTcxNDZfTUMyX1JQU19TSUcwCU1BU0tfMTEKKyNkZWZpbmUgU0FBNzE0Nl9NQzJfVVBMRF9EMV9CCU1BU0tfMTAKKyNkZWZpbmUgU0FBNzE0Nl9NQzJfVVBMRF9EMV9BCU1BU0tfMDkKKyNkZWZpbmUgU0FBNzE0Nl9NQzJfVVBMRF9CUlMJTUFTS18wOAorI2RlZmluZSBTQUE3MTQ2X01DMl9VUExEX0hQU19ICU1BU0tfMDYKKyNkZWZpbmUgU0FBNzE0Nl9NQzJfVVBMRF9IUFNfVglNQVNLXzA1CisjZGVmaW5lIFNBQTcxNDZfTUMyX1VQTERfRE1BMwlNQVNLXzA0CisjZGVmaW5lIFNBQTcxNDZfTUMyX1VQTERfRE1BMglNQVNLXzAzCisjZGVmaW5lIFNBQTcxNDZfTUMyX1VQTERfRE1BMQlNQVNLXzAyCisjZGVmaW5lIFNBQTcxNDZfTUMyX1VQTERfREVCSQlNQVNLXzAxCisjZGVmaW5lIFNBQTcxNDZfTUMyX1VQTERfSTJDCU1BU0tfMDAKKy8qIFByaW1hcnkgU3RhdHVzIFJlZ2lzdGVyIGFuZCBJbnRlcnJ1cHQgRW5hYmxlL1N0YXR1cyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0FBNzE0Nl9QU1JfUFBFRglNQVNLXzMxCisjZGVmaW5lIFNBQTcxNDZfUFNSX1BBQk8JTUFTS18zMAorI2RlZmluZSBTQUE3MTQ2X1BTUl9QUEVECU1BU0tfMjkKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfUlBTX0kxCU1BU0tfMjgKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfUlBTX0kwCU1BU0tfMjcKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfUlBTX0xBVEUxCU1BU0tfMjYKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfUlBTX0xBVEUwCU1BU0tfMjUKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfUlBTX0UxCU1BU0tfMjQKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfUlBTX0UwCU1BU0tfMjMKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfUlBTX1RPMQlNQVNLXzIyCisjZGVmaW5lIFNBQTcxNDZfUFNSX1JQU19UTzAJTUFTS18yMQorI2RlZmluZSBTQUE3MTQ2X1BTUl9VUExECU1BU0tfMjAKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfREVCSV9TCU1BU0tfMTkKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfREVCSV9FCU1BU0tfMTgKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfSTJDX1MJTUFTS18xNworI2RlZmluZSBTQUE3MTQ2X1BTUl9JMkNfRQlNQVNLXzE2CisjZGVmaW5lIFNBQTcxNDZfUFNSX0EyX0lOCU1BU0tfMTUKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfQTJfT1VUCU1BU0tfMTQKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfQTFfSU4JTUFTS18xMworI2RlZmluZSBTQUE3MTQ2X1BTUl9BMV9PVVQJTUFTS18xMgorI2RlZmluZSBTQUE3MTQ2X1BTUl9BRk9VCU1BU0tfMTEKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfVl9QRQlNQVNLXzEwCisjZGVmaW5lIFNBQTcxNDZfUFNSX1ZGT1UJTUFTS18wOQorI2RlZmluZSBTQUE3MTQ2X1BTUl9GSURBCU1BU0tfMDgKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfRklEQglNQVNLXzA3CisjZGVmaW5lIFNBQTcxNDZfUFNSX1BJTjMJTUFTS18wNgorI2RlZmluZSBTQUE3MTQ2X1BTUl9QSU4yCU1BU0tfMDUKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfUElOMQlNQVNLXzA0CisjZGVmaW5lIFNBQTcxNDZfUFNSX1BJTjAJTUFTS18wMworI2RlZmluZSBTQUE3MTQ2X1BTUl9FQ1MJCU1BU0tfMDIKKyNkZWZpbmUgU0FBNzE0Nl9QU1JfRUMzUwlNQVNLXzAxCisjZGVmaW5lIFNBQTcxNDZfUFNSX0VDMFMJTUFTS18wMAorLyogU2Vjb25kYXJ5IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTQUE3MTQ2X1NTUl9QUlEJCU1BU0tfMzEKKyNkZWZpbmUgU0FBNzE0Nl9TU1JfUE1BCQlNQVNLXzMwCisjZGVmaW5lIFNBQTcxNDZfU1NSX1JQU19SRTEJTUFTS18yOQorI2RlZmluZSBTQUE3MTQ2X1NTUl9SUFNfUEUxCU1BU0tfMjgKKyNkZWZpbmUgU0FBNzE0Nl9TU1JfUlBTX0ExCU1BU0tfMjcKKyNkZWZpbmUgU0FBNzE0Nl9TU1JfUlBTX1JFMAlNQVNLXzI2CisjZGVmaW5lIFNBQTcxNDZfU1NSX1JQU19QRTAJTUFTS18yNQorI2RlZmluZSBTQUE3MTQ2X1NTUl9SUFNfQTAJTUFTS18yNAorI2RlZmluZSBTQUE3MTQ2X1NTUl9ERUJJX1RPCU1BU0tfMjMKKyNkZWZpbmUgU0FBNzE0Nl9TU1JfREVCSV9FRglNQVNLXzIyCisjZGVmaW5lIFNBQTcxNDZfU1NSX0kyQ19FQQlNQVNLXzIxCisjZGVmaW5lIFNBQTcxNDZfU1NSX0kyQ19FVwlNQVNLXzIwCisjZGVmaW5lIFNBQTcxNDZfU1NSX0kyQ19FUglNQVNLXzE5CisjZGVmaW5lIFNBQTcxNDZfU1NSX0kyQ19FTAlNQVNLXzE4CisjZGVmaW5lIFNBQTcxNDZfU1NSX0kyQ19FRglNQVNLXzE3CisjZGVmaW5lIFNBQTcxNDZfU1NSX1YzUAkJTUFTS18xNgorI2RlZmluZSBTQUE3MTQ2X1NTUl9WMlAJCU1BU0tfMTUKKyNkZWZpbmUgU0FBNzE0Nl9TU1JfVjFQCQlNQVNLXzE0CisjZGVmaW5lIFNBQTcxNDZfU1NSX1ZGMwkJTUFTS18xMworI2RlZmluZSBTQUE3MTQ2X1NTUl9WRjIJCU1BU0tfMTIKKyNkZWZpbmUgU0FBNzE0Nl9TU1JfVkYxCQlNQVNLXzExCisjZGVmaW5lIFNBQTcxNDZfU1NSX0FGMl9JTglNQVNLXzEwCisjZGVmaW5lIFNBQTcxNDZfU1NSX0FGMl9PVVQJTUFTS18wOQorI2RlZmluZSBTQUE3MTQ2X1NTUl9BRjFfSU4JTUFTS18wOAorI2RlZmluZSBTQUE3MTQ2X1NTUl9BRjFfT1VUCU1BU0tfMDcKKyNkZWZpbmUgU0FBNzE0Nl9TU1JfVkdUCQlNQVNLXzA1CisjZGVmaW5lIFNBQTcxNDZfU1NSX0xOUUcJTUFTS18wNAorI2RlZmluZSBTQUE3MTQ2X1NTUl9FQzVTCU1BU0tfMDMKKyNkZWZpbmUgU0FBNzE0Nl9TU1JfRUM0UwlNQVNLXzAyCisjZGVmaW5lIFNBQTcxNDZfU1NSX0VDMlMJTUFTS18wMQorI2RlZmluZSBTQUE3MTQ2X1NTUl9FQzFTCU1BU0tfMDAKKy8qIEkyQyBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0FBNzE0Nl9JMkNfQUJPUlQJTUFTS18wNworI2RlZmluZSBTQUE3MTQ2X0kyQ19TUEVSUglNQVNLXzA2CisjZGVmaW5lIFNBQTcxNDZfSTJDX0FQRVJSCU1BU0tfMDUKKyNkZWZpbmUgU0FBNzE0Nl9JMkNfRFRFUlIJTUFTS18wNAorI2RlZmluZSBTQUE3MTQ2X0kyQ19EUkVSUglNQVNLXzAzCisjZGVmaW5lIFNBQTcxNDZfSTJDX0FMCQlNQVNLXzAyCisjZGVmaW5lIFNBQTcxNDZfSTJDX0VSUgkJTUFTS18wMQorI2RlZmluZSBTQUE3MTQ2X0kyQ19CVVNZCU1BU0tfMDAKKy8qIG91dHB1dCBmb3JtYXRzICovCisjZGVmaW5lIFNBQTcxNDZfWVVWNDIyCTAKKyNkZWZpbmUgU0FBNzE0Nl9SR0IxNgkwCisjZGVmaW5lIFNBQTcxNDZfWVVWNDQ0CTEKKyNkZWZpbmUgU0FBNzE0Nl9SR0IyNAkxCisjZGVmaW5lIFNBQTcxNDZfQVJHQjMyCTIKKyNkZWZpbmUgU0FBNzE0Nl9ZVVY0MTEJMworI2RlZmluZSBTQUE3MTQ2X0FSR0IxNSAgMworI2RlZmluZSBTQUE3MTQ2X1lVVjIJNAorI2RlZmluZSBTQUE3MTQ2X1JHQUIxNQk0CisjZGVmaW5lIFNBQTcxNDZfWTgJNgorI2RlZmluZSBTQUE3MTQ2X1lVVjgJNworI2RlZmluZSBTQUE3MTQ2X1JHQjgJNworI2RlZmluZSBTQUE3MTQ2X1lVVjQ0NHAJOAorI2RlZmluZSBTQUE3MTQ2X1lVVjQyMnAJOQorI2RlZmluZSBTQUE3MTQ2X1lVVjQyMHAJMTAKKyNkZWZpbmUgU0FBNzE0Nl9ZVVYxNjIwCTExCisjZGVmaW5lIFNBQTcxNDZfWTEJMTMKKyNkZWZpbmUgU0FBNzE0Nl9ZMgkxNAorI2RlZmluZSBTQUE3MTQ2X1lVVjEJMTUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTg1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxODUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjBiMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTg1LmMKQEAgLTAsMCArMSw1MjQgQEAKKy8qIAorICogc2FhNzE4NSAtIFBoaWxpcHMgU0FBNzE4NUIgdmlkZW8gZW5jb2RlciBkcml2ZXIgdmVyc2lvbiAwLjAuMworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZlIFBlcmtzIDxkcGVya3NAaWJtLm5ldD4KKyAqCisgKiBTbGlnaHQgY2hhbmdlcyBmb3IgdmlkZW8gdGltaW5nIGFuZCBhdHRhY2htZW50IG91dHB1dCBieQorICogV29sZmdhbmcgU2NoZXJyIDxzY2hlcnJAbmV0NHlvdS5uZXQ+CisgKgorICogQ2hhbmdlcyBieSBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAtIG1vdmVkIG92ZXIgdG8gbGludXg+PTIuNC54IGkyYyBwcm90b2NvbCAoMS8xLzIwMDMpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJQaGlsaXBzIFNBQTcxODUgdmlkZW8gZW5jb2RlciBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkRhdmUgUGVya3MiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4KKworI2RlZmluZSBJMkNfTkFNRShzKSAocyktPm5hbWUKKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2VuY29kZXIuaD4KKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtMSkiKTsKKworI2RlZmluZSBkcHJpbnRrKG51bSwgZm9ybWF0LCBhcmdzLi4uKSBcCisJZG8geyBcCisJCWlmIChkZWJ1ZyA+PSBudW0pIFwKKwkJCXByaW50ayhmb3JtYXQsICMjYXJncyk7IFwKKwl9IHdoaWxlICgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3Qgc2FhNzE4NSB7CisJdW5zaWduZWQgY2hhciByZWdbMTI4XTsKKworCWludCBub3JtOworCWludCBlbmFibGU7CisJaW50IGJyaWdodDsKKwlpbnQgY29udHJhc3Q7CisJaW50IGh1ZTsKKwlpbnQgc2F0OworfTsKKworI2RlZmluZSAgIEkyQ19TQUE3MTg1ICAgICAgICAweDg4CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitzYWE3MTg1X3JlYWQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsKK30KKworc3RhdGljIGludAorc2FhNzE4NV93cml0ZSAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkgICAgICAgdTggICAgICAgICAgICAgICAgIHJlZywKKwkgICAgICAgdTggICAgICAgICAgICAgICAgIHZhbHVlKQoreworCXN0cnVjdCBzYWE3MTg1ICplbmNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkcHJpbnRrKDEsIEtFUk5fREVCVUcgIlNBQTcxODU6ICUwMnggc2V0IHRvICUwMnhcbiIsIHJlZywgdmFsdWUpOworCWVuY29kZXItPnJlZ1tyZWddID0gdmFsdWU7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIGludAorc2FhNzE4NV93cml0ZV9ibG9jayAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICAgICBjb25zdCB1OCAgICAgICAgICAqZGF0YSwKKwkJICAgICB1bnNpZ25lZCBpbnQgICAgICAgbGVuKQoreworCWludCByZXQgPSAtMTsKKwl1OCByZWc7CisKKwkvKiB0aGUgYWR2NzE3NSBoYXMgYW4gYXV0b2luY3JlbWVudCBmdW5jdGlvbiwgdXNlIGl0IGlmCisJICogdGhlIGFkYXB0ZXIgdW5kZXJzdGFuZHMgcmF3IEkyQyAqLworCWlmIChpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKKwkJLyogZG8gcmF3IEkyQywgbm90IHNtYnVzIGNvbXBhdGlibGUgKi8KKwkJc3RydWN0IHNhYTcxODUgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwkJc3RydWN0IGkyY19tc2cgbXNnOworCQl1OCBibG9ja19kYXRhWzMyXTsKKworCQltc2cuYWRkciA9IGNsaWVudC0+YWRkcjsKKwkJbXNnLmZsYWdzID0gMDsKKwkJd2hpbGUgKGxlbiA+PSAyKSB7CisJCQltc2cuYnVmID0gKGNoYXIgKikgYmxvY2tfZGF0YTsKKwkJCW1zZy5sZW4gPSAwOworCQkJYmxvY2tfZGF0YVttc2cubGVuKytdID0gcmVnID0gZGF0YVswXTsKKwkJCWRvIHsKKwkJCQlibG9ja19kYXRhW21zZy5sZW4rK10gPQorCQkJCSAgICBlbmNvZGVyLT5yZWdbcmVnKytdID0gZGF0YVsxXTsKKwkJCQlsZW4gLT0gMjsKKwkJCQlkYXRhICs9IDI7CisJCQl9IHdoaWxlIChsZW4gPj0gMiAmJiBkYXRhWzBdID09IHJlZyAmJgorCQkJCSBtc2cubGVuIDwgMzIpOworCQkJaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLAorCQkJCQkJJm1zZywgMSkpIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGRvIHNvbWUgc2xvdyBJMkMgZW11bGF0aW9uIGtpbmQgb2YgdGhpbmcgKi8KKwkJd2hpbGUgKGxlbiA+PSAyKSB7CisJCQlyZWcgPSAqZGF0YSsrOworCQkJaWYgKChyZXQgPSBzYWE3MTg1X3dyaXRlKGNsaWVudCwgcmVnLAorCQkJCQkJICpkYXRhKyspKSA8IDApCisJCQkJYnJlYWs7CisJCQlsZW4gLT0gMjsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGluaXRfY29tbW9uW10gPSB7CisJMHgzYSwgMHgwZiwJCS8qIENCRU5CPTAsIFY2NTY9MCwgVlkyQz0xLAorCQkJCSAqIFlVVjJDPTEsIE1ZMkM9MSwgTVVWMkM9MSAqLworCisJMHg0MiwgMHg2YiwJCS8qIE9WTFkwPTEwNyAqLworCTB4NDMsIDB4MDAsCQkvKiBPVkxVMD0wICAgICB3aGl0ZSAqLworCTB4NDQsIDB4MDAsCQkvKiBPVkxWMD0wICAgKi8KKwkweDQ1LCAweDIyLAkJLyogT1ZMWTE9MzQgICovCisJMHg0NiwgMHhhYywJCS8qIE9WTFUxPTE3MiAgIHllbGxvdyAqLworCTB4NDcsIDB4MGUsCQkvKiBPVkxWMT0xNCAgKi8KKwkweDQ4LCAweDAzLAkJLyogT1ZMWTI9MyAgICovCisJMHg0OSwgMHgxZCwJCS8qIE9WTFUyPTI5ICAgIGN5YW4gKi8KKwkweDRhLCAweGFjLAkJLyogT1ZMVjI9MTcyICovCisJMHg0YiwgMHhmMCwJCS8qIE9WTFkzPTI0MCAqLworCTB4NGMsIDB4YzgsCQkvKiBPVkxVMz0yMDAgICBncmVlbiAqLworCTB4NGQsIDB4YjksCQkvKiBPVkxWMz0xODUgKi8KKwkweDRlLCAweGQ0LAkJLyogT1ZMWTQ9MjEyICovCisJMHg0ZiwgMHgzOCwJCS8qIE9WTFU0PTU2ICAgIG1hZ2VudGEgKi8KKwkweDUwLCAweDQ3LAkJLyogT1ZMVjQ9NzEgICovCisJMHg1MSwgMHhjMSwJCS8qIE9WTFk1PTE5MyAqLworCTB4NTIsIDB4ZTMsCQkvKiBPVkxVNT0yMjcgICByZWQgKi8KKwkweDUzLCAweDU0LAkJLyogT1ZMVjU9ODQgICovCisJMHg1NCwgMHhhMywJCS8qIE9WTFk2PTE2MyAqLworCTB4NTUsIDB4NTQsCQkvKiBPVkxVNj04NCAgICBibHVlICovCisJMHg1NiwgMHhmMiwJCS8qIE9WTFY2PTI0MiAqLworCTB4NTcsIDB4OTAsCQkvKiBPVkxZNz0xNDQgKi8KKwkweDU4LCAweDAwLAkJLyogT1ZMVTc9MCAgICAgYmxhY2sgKi8KKwkweDU5LCAweDAwLAkJLyogT1ZMVjc9MCAgICovCisKKwkweDVhLCAweDAwLAkJLyogQ0hQUz0wICAgICovCisJMHg1YiwgMHg3NiwJCS8qIEdBSU5VPTExOCAqLworCTB4NWMsIDB4YTUsCQkvKiBHQUlOVj0xNjUgKi8KKwkweDVkLCAweDNjLAkJLyogQkxDS0w9NjAgICovCisJMHg1ZSwgMHgzYSwJCS8qIEJMTk5MPTU4ICAqLworCTB4NWYsIDB4M2EsCQkvKiBDQ1JTPTAsIEJMTlZCPTU4ICovCisJMHg2MCwgMHgwMCwJCS8qIE5VTEwgICAgICAqLworCisJLyogMHg2MSAtIDB4NjYgc2V0IGFjY29yZGluZyB0byBub3JtICovCisKKwkweDY3LCAweDAwLAkJLyogMCA6IGNhcHRpb24gMXN0IGJ5dGUgb2RkICBmaWVsZCAqLworCTB4NjgsIDB4MDAsCQkvKiAwIDogY2FwdGlvbiAybmQgYnl0ZSBvZGQgIGZpZWxkICovCisJMHg2OSwgMHgwMCwJCS8qIDAgOiBjYXB0aW9uIDFzdCBieXRlIGV2ZW4gZmllbGQgKi8KKwkweDZhLCAweDAwLAkJLyogMCA6IGNhcHRpb24gMm5kIGJ5dGUgZXZlbiBmaWVsZCAqLworCisJMHg2YiwgMHg5MSwJCS8qIE1PRElOPTIsIFBDUkVGPTAsIFNDQ0xOPTE3ICovCisJMHg2YywgMHgyMCwJCS8qIFNSQ1YxPTAsIFRSQ1YyPTEsIE9SQ1YxPTAsIFBSQ1YxPTAsCisJCQkJICogQ0JMRj0wLCBPUkNWMj0wLCBQUkNWMj0wICovCisJMHg2ZCwgMHgwMCwJCS8qIFNSQ00xPTAsIENDRU49MCAqLworCisJMHg2ZSwgMHgwZSwJCS8qIEhUUklHPTB4MDA1LCBhcHByb3guIGNlbnRlcmVkLCBhdAorCQkJCSAqIGxlYXN0IGZvciBQQUwgKi8KKwkweDZmLCAweDAwLAkJLyogSFRSSUcgdXBwZXIgYml0cyAqLworCTB4NzAsIDB4MjAsCQkvKiBQSFJFUz0wLCBTQkxOPTEsIFZUUklHPTAgKi8KKworCS8qIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5vdCBiZSBuZWVkZWQgKi8KKworCTB4NzEsIDB4MTUsCQkvKiBCTVJRPTB4MTE1ICovCisJMHg3MiwgMHg5MCwJCS8qIEVNUlE9MHg2OTAgKi8KKwkweDczLCAweDYxLAkJLyogRU1SUT0weDY5MCwgQk1SUT0weDExNSAqLworCTB4NzQsIDB4MDAsCQkvKiBOVUxMICAgICAgICovCisJMHg3NSwgMHgwMCwJCS8qIE5VTEwgICAgICAgKi8KKwkweDc2LCAweDAwLAkJLyogTlVMTCAgICAgICAqLworCTB4NzcsIDB4MTUsCQkvKiBCUkNWPTB4MTE1ICovCisJMHg3OCwgMHg5MCwJCS8qIEVSQ1Y9MHg2OTAgKi8KKwkweDc5LCAweDYxLAkJLyogRVJDVj0weDY5MCwgQlJDVj0weDExNSAqLworCisJLyogRmllbGQgbGVuZ3RoIGNvbnRyb2xzICovCisKKwkweDdhLCAweDcwLAkJLyogRkxDPTAgKi8KKworCS8qIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5vdCBiZSBuZWVkZWQgaWYgU0JMTiA9IDEgKi8KKworCTB4N2IsIDB4MTYsCQkvKiBGQUw9MjIgKi8KKwkweDdjLCAweDM1LAkJLyogTEFMPTI0NCAqLworCTB4N2QsIDB4MjAsCQkvKiBMQUw9MjQ0LCBGQUw9MjIgKi8KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGluaXRfcGFsW10gPSB7CisJMHg2MSwgMHgxZSwJCS8qIEZJU0U9MCwgUEFMPTEsIFNDQlc9MSwgUlRDRT0xLAorCQkJCSAqIFlHUz0xLCBJTlBJPTAsIERPV049MCAqLworCTB4NjIsIDB4YzgsCQkvKiBERUNUWVA9MSwgQlNUQT03MiAqLworCTB4NjMsIDB4Y2IsCQkvKiBGU0MwICovCisJMHg2NCwgMHg4YSwJCS8qIEZTQzEgKi8KKwkweDY1LCAweDA5LAkJLyogRlNDMiAqLworCTB4NjYsIDB4MmEsCQkvKiBGU0MzICovCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0X250c2NbXSA9IHsKKwkweDYxLCAweDFkLAkJLyogRklTRT0xLCBQQUw9MCwgU0NCVz0xLCBSVENFPTEsCisJCQkJICogWUdTPTEsIElOUEk9MCwgRE9XTj0wICovCisJMHg2MiwgMHhlNiwJCS8qIERFQ1RZUD0xLCBCU1RBPTEwMiAqLworCTB4NjMsIDB4MWYsCQkvKiBGU0MwICovCisJMHg2NCwgMHg3YywJCS8qIEZTQzEgKi8KKwkweDY1LCAweGYwLAkJLyogRlNDMiAqLworCTB4NjYsIDB4MjEsCQkvKiBGU0MzICovCit9OworCitzdGF0aWMgaW50CitzYWE3MTg1X2NvbW1hbmQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCSB1bnNpZ25lZCBpbnQgICAgICAgY21kLAorCQkgdm9pZCAgICAgICAgICAgICAgKmFyZykKK3sKKwlzdHJ1Y3Qgc2FhNzE4NSAqZW5jb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgMDoKKwkJc2FhNzE4NV93cml0ZV9ibG9jayhjbGllbnQsIGluaXRfY29tbW9uLAorCQkJCSAgICBzaXplb2YoaW5pdF9jb21tb24pKTsKKwkJc3dpdGNoIChlbmNvZGVyLT5ub3JtKSB7CisKKwkJY2FzZSBWSURFT19NT0RFX05UU0M6CisJCQlzYWE3MTg1X3dyaXRlX2Jsb2NrKGNsaWVudCwgaW5pdF9udHNjLAorCQkJCQkgICAgc2l6ZW9mKGluaXRfbnRzYykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJCXNhYTcxODVfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0X3BhbCwKKwkJCQkJICAgIHNpemVvZihpbml0X3BhbCkpOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgRU5DT0RFUl9HRVRfQ0FQQUJJTElUSUVTOgorCXsKKwkJc3RydWN0IHZpZGVvX2VuY29kZXJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOworCisJCWNhcC0+ZmxhZ3MgPQorCQkgICAgVklERU9fRU5DT0RFUl9QQUwgfCBWSURFT19FTkNPREVSX05UU0MgfAorCQkgICAgVklERU9fRU5DT0RFUl9TRUNBTSB8IFZJREVPX0VOQ09ERVJfQ0NJUjsKKwkJY2FwLT5pbnB1dHMgPSAxOworCQljYXAtPm91dHB1dHMgPSAxOworCX0KKwkJYnJlYWs7CisKKwljYXNlIEVOQ09ERVJfU0VUX05PUk06CisJeworCQlpbnQgKmlhcmcgPSBhcmc7CisKKwkJLy9zYWE3MTg1X3dyaXRlX2Jsb2NrKGNsaWVudCwgaW5pdF9jb21tb24sIHNpemVvZihpbml0X2NvbW1vbikpOworCisJCXN3aXRjaCAoKmlhcmcpIHsKKworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCXNhYTcxODVfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0X250c2MsCisJCQkJCSAgICBzaXplb2YoaW5pdF9udHNjKSk7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfUEFMOgorCQkJc2FhNzE4NV93cml0ZV9ibG9jayhjbGllbnQsIGluaXRfcGFsLAorCQkJCQkgICAgc2l6ZW9mKGluaXRfcGFsKSk7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfU0VDQU06CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9CisJCWVuY29kZXItPm5vcm0gPSAqaWFyZzsKKwl9CisJCWJyZWFrOworCisJY2FzZSBFTkNPREVSX1NFVF9JTlBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQkvKiBSSjogKmlhcmcgPSAwOiBpbnB1dCBpcyBmcm9tIFNBNzExMQorCQkgKmlhcmcgPSAxOiBpbnB1dCBpcyBmcm9tIFpSMzYwNjAgKi8KKworCQlzd2l0Y2ggKCppYXJnKSB7CisKKwkJY2FzZSAwOgorCQkJLyogU3dpdGNoIFJUQ0UgdG8gMSAqLworCQkJc2FhNzE4NV93cml0ZShjbGllbnQsIDB4NjEsCisJCQkJICAgICAgKGVuY29kZXItPnJlZ1sweDYxXSAmIDB4ZjcpIHwgMHgwOCk7CisJCQlzYWE3MTg1X3dyaXRlKGNsaWVudCwgMHg2ZSwgMHgwMSk7CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQkvKiBTd2l0Y2ggUlRDRSB0byAwICovCisJCQlzYWE3MTg1X3dyaXRlKGNsaWVudCwgMHg2MSwKKwkJCQkgICAgICAoZW5jb2Rlci0+cmVnWzB4NjFdICYgMHhmNykgfCAweDAwKTsKKwkJCS8qIFNXOiBhIHNsaWdodCBzeW5jIHByb2JsZW0uLi4gKi8KKwkJCXNhYTcxODVfd3JpdGUoY2xpZW50LCAweDZlLCAweDAwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9CisJfQorCQlicmVhazsKKworCWNhc2UgRU5DT0RFUl9TRVRfT1VUUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCS8qIG5vdCBtdWNoIGNob2ljZSBvZiBvdXRwdXRzICovCisJCWlmICgqaWFyZyAhPSAwKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwkJYnJlYWs7CisKKwljYXNlIEVOQ09ERVJfRU5BQkxFX09VVFBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQllbmNvZGVyLT5lbmFibGUgPSAhISppYXJnOworCQlzYWE3MTg1X3dyaXRlKGNsaWVudCwgMHg2MSwKKwkJCSAgICAgIChlbmNvZGVyLT5yZWdbMHg2MV0gJiAweGJmKSB8CisJCQkgICAgICAoZW5jb2Rlci0+ZW5hYmxlID8gMHgwMCA6IDB4NDApKTsKKwl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBHZW5lcmljIGkyYyBwcm9iZQorICogY29uY2VybmluZyB0aGUgYWRkcmVzc2VzOiBpMmMgd2FudHMgNyBiaXQgKHdpdGhvdXQgdGhlIHIvdyBiaXQpLCBzbyAnPj4xJworICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfU0FBNzE4NSA+PiAxLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb2JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZV9yYW5nZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmVfcmFuZ2VbMl0gPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlWzJdID0geyBJMkNfQ0xJRU5UX0VORCAsIEkyQ19DTElFTlRfRU5EIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKKwkubm9ybWFsX2kyY19yYW5nZQk9IG5vcm1hbF9pMmNfcmFuZ2UsCisJLnByb2JlCQkJPSBwcm9iZSwKKwkucHJvYmVfcmFuZ2UJCT0gcHJvYmVfcmFuZ2UsCisJLmlnbm9yZQkJCT0gaWdub3JlLAorCS5pZ25vcmVfcmFuZ2UJCT0gaWdub3JlX3JhbmdlLAorCS5mb3JjZQkJCT0gZm9yY2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX3NhYTcxODU7CisKK3N0YXRpYyBpbnQKK3NhYTcxODVfZGV0ZWN0X2NsaWVudCAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICBhZGRyZXNzLAorCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICBraW5kKQoreworCWludCBpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IHNhYTcxODUgKmVuY29kZXI7CisKKwlkcHJpbnRrKDEsCisJCUtFUk5fSU5GTworCQkic2FhNzE4NS5jOiBkZXRlY3Rpbmcgc2FhNzE4NSBjbGllbnQgb24gYWRkcmVzcyAweCV4XG4iLAorCQlhZGRyZXNzIDw8IDEpOworCisJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcyAqLworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJcmV0dXJuIDA7CisKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmIChjbGllbnQgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGNsaWVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfc2FhNzE4NTsKKwljbGllbnQtPmZsYWdzID0gSTJDX0NMSUVOVF9BTExPV19VU0U7CisJc3RybGNweShJMkNfTkFNRShjbGllbnQpLCAic2FhNzE4NSIsIHNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CisKKwllbmNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxODUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW5jb2RlciA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZW5jb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCBzYWE3MTg1KSk7CisJZW5jb2Rlci0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKKwllbmNvZGVyLT5lbmFibGUgPSAxOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGVuY29kZXIpOworCisJaSA9IGkyY19hdHRhY2hfY2xpZW50KGNsaWVudCk7CisJaWYgKGkpIHsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZW5jb2Rlcik7CisJCXJldHVybiBpOworCX0KKworCWkgPSBzYWE3MTg1X3dyaXRlX2Jsb2NrKGNsaWVudCwgaW5pdF9jb21tb24sIHNpemVvZihpbml0X2NvbW1vbikpOworCWlmIChpID49IDApIHsKKwkJaSA9IHNhYTcxODVfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0X250c2MsCisJCQkJCXNpemVvZihpbml0X250c2MpKTsKKwl9CisJaWYgKGkgPCAwKSB7CisJCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzX2F0dGFjaDogaW5pdCBlcnJvciAlZFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIGkpOworCX0gZWxzZSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fSU5GTworCQkJIiVzX2F0dGFjaDogY2hpcCB2ZXJzaW9uICVkIGF0IGFkZHJlc3MgMHgleFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksIHNhYTcxODVfcmVhZChjbGllbnQpID4+IDUsCisJCQljbGllbnQtPmFkZHIgPDwgMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NhYTcxODVfYXR0YWNoX2FkYXB0ZXIgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlkcHJpbnRrKDEsCisJCUtFUk5fSU5GTworCQkic2FhNzE4NS5jOiBzdGFydGluZyBwcm9iZSBmb3IgYWRhcHRlciAlcyAoMHgleClcbiIsCisJCUkyQ19OQU1FKGFkYXB0ZXIpLCBhZGFwdGVyLT5pZCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCAmc2FhNzE4NV9kZXRlY3RfY2xpZW50KTsKK30KKworc3RhdGljIGludAorc2FhNzE4NV9kZXRhY2hfY2xpZW50IChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzYWE3MTg1ICplbmNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGVycjsKKworCWVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJaWYgKGVycikgeworCQlyZXR1cm4gZXJyOworCX0KKworCXNhYTcxODVfd3JpdGUoY2xpZW50LCAweDYxLCAoZW5jb2Rlci0+cmVnWzB4NjFdKSB8IDB4NDApOwkvKiBTVzogb3V0cHV0IG9mZiBpcyBhY3RpdmUgKi8KKwkvL3NhYTcxODVfd3JpdGUoY2xpZW50LCAweDNhLCAoZW5jb2Rlci0+cmVnWzB4M2FdKSB8IDB4ODApOyAvKiBTVzogY29sb3IgYmFyICovCisKKwlrZnJlZShlbmNvZGVyKTsKKwlrZnJlZShjbGllbnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX3NhYTcxODUgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAic2FhNzE4NSIsCS8qIG5hbWUgKi8KKworCS5pZCA9IEkyQ19EUklWRVJJRF9TQUE3MTg1QiwKKwkuZmxhZ3MgPSBJMkNfREZfTk9USUZZLAorCisJLmF0dGFjaF9hZGFwdGVyID0gc2FhNzE4NV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCA9IHNhYTcxODVfZGV0YWNoX2NsaWVudCwKKwkuY29tbWFuZCA9IHNhYTcxODVfY29tbWFuZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitzYWE3MTg1X2luaXQgKHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX3NhYTcxODUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3NhYTcxODVfZXhpdCAodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmaTJjX2RyaXZlcl9zYWE3MTg1KTsKK30KKworbW9kdWxlX2luaXQoc2FhNzE4NV9pbml0KTsKK21vZHVsZV9leGl0KHNhYTcxODVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxOTYuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE5Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmYyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxOTYuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAgICBEZWZpbml0aW9ucyBmb3IgdGhlIFBoaWxpcHMgU0FBNzE5NiBkaWdpdGFsIHZpZGVvIGRlY29kZXIsCisgICAgc2NhbGVyLCBhbmQgY2xvY2sgZ2VuZXJhdG9yIGNpcmN1aXQgKERFU0Nwcm8pLCBhcyB1c2VkIGluCisgICAgdGhlIFBsYW5CIHZpZGVvIGlucHV0IG9mIHRoZSBQb3dlcm1hYyA3eDAwLzh4MDAgc2VyaWVzLgorICAKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTggTWljaGVsIExhbm5lcnMgKG1sYW5AY3B1Lmx1KQorCisgICAgVGhlIHJlZ2lzdGVyIGRlZmluZXMgYXJlIHNoYW1lbGVzc2x5IGNvcGllZCBmcm9tIHRoZSBtZXRlb3IKKyAgICBkcml2ZXIgb3V0IG9mIE5ldEJTRCAod2l0aCBwZXJtaXNzaW9uKSwKKyAgICBhbmQgYXJlIGNvcHlyaWdodGVkIChjKSAxOTk1IE1hcmsgVGluZ3VlbHkgYW5kIEppbSBMb3dlCisgICAgKFRoYW5rcyAhKQorICAKKyAgICBBZGRpdGlvbmFsIGRlYnVnZ2luZyBhbmQgY29kaW5nIGJ5IFRha2FzaGkgT2UgKHRvZUB1bmxpbmZvLnVubC5lZHUpCisKKyAgICBUaGUgZGVmYXVsdCB2YWx1ZXMgdXNlZCBmb3IgUGxhbkIgYXJlIG15IG1pc3Rha2VzLgorKi8KKworLyogJElkOiBzYWE3MTk2LmgsdiAxLjUgMTk5OS8wMy8yNiAyMzoyODo0NyBtbGFuIEV4cCAkICovCisKKyNpZm5kZWYgX1NBQTcxOTZfSF8KKyNkZWZpbmUgX1NBQTcxOTZfSF8KKworI2RlZmluZSBTQUE3MTk2X05VTVJFR1MJMHgzMQkvKiBOdW1iZXIgb2YgcmVnaXN0ZXJzICh1c2VkKSovCisjZGVmaW5lIE5VTV9TVVBQT1JURURfTk9STSAzCS8qIE51bWJlciBvZiBzdXBwb3J0ZWQgbm9ybXMgYnkgUGxhbkIgKi8KKworLyogRGVjb2RlciBwYXJ0OiAqLworI2RlZmluZSBTQUE3MTk2X0lERUwgICAgMHgwMCAgICAvKiBJbmNyZW1lbnQgZGVsYXkgKi8KKyNkZWZpbmUgU0FBNzE5Nl9IU0I1ICAgIDB4MDEgICAgLyogSC1zeW5jIGJlZ2luOyA1MCBoeiAqLworI2RlZmluZSBTQUE3MTk2X0hTUzUgICAgMHgwMiAgICAvKiBILXN5bmMgc3RvcDsgNTAgaHogKi8KKyNkZWZpbmUgU0FBNzE5Nl9IQ0I1ICAgIDB4MDMgICAgLyogSC1jbGFtcCBiZWdpbjsgNTAgaHogKi8KKyNkZWZpbmUgU0FBNzE5Nl9IQ1M1ICAgIDB4MDQgICAgLyogSC1jbGFtcCBzdG9wOyA1MCBoeiAqLworI2RlZmluZSBTQUE3MTk2X0hTUDUgICAgMHgwNSAgICAvKiBILXN5bmMgYWZ0ZXIgUEhJMTsgNTAgaHogKi8KKyNkZWZpbmUgU0FBNzE5Nl9MVU1DICAgIDB4MDYgICAgLyogTHVtaW5hbmNlIGNvbnRyb2wgKi8KKyNkZWZpbmUgU0FBNzE5Nl9IVUVDICAgIDB4MDcgICAgLyogSHVlIGNvbnRyb2wgKi8KKyNkZWZpbmUgU0FBNzE5Nl9DS1RRICAgIDB4MDggICAgLyogQ29sb3VyIEtpbGxlciBUaHJlc2hvbGQgUUFNIChQQUwsIE5UU0MpICovCisjZGVmaW5lIFNBQTcxOTZfQ0tUUyAgICAweDA5ICAgIC8qIENvbG91ciBLaWxsZXIgVGhyZXNob2xkIFNFQ0FNICovCisjZGVmaW5lIFNBQTcxOTZfUEFMUyAgICAweDBhICAgIC8qIFBBTCBzd2l0Y2ggc2Vuc2l0aXZpdHkgKi8KKyNkZWZpbmUgU0FBNzE5Nl9TRUNBTVMgIDB4MGIgICAgLyogU0VDQU0gc3dpdGNoIHNlbnNpdGl2aXR5ICovCisjZGVmaW5lIFNBQTcxOTZfQ0dBSU5DICAweDBjICAgIC8qIENocm9tYSBnYWluIGNvbnRyb2wgKi8KKyNkZWZpbmUgU0FBNzE5Nl9TVERDICAgIDB4MGQgICAgLyogU3RhbmRhcmQvTW9kZSBjb250cm9sICovCisjZGVmaW5lIFNBQTcxOTZfSU9DQyAgICAweDBlICAgIC8qIEkvTyBhbmQgQ2xvY2sgQ29udHJvbCAqLworI2RlZmluZSBTQUE3MTk2X0NUUkwxICAgMHgwZiAgICAvKiBDb250cm9sICMxICovCisjZGVmaW5lIFNBQTcxOTZfQ1RSTDIgICAweDEwICAgIC8qIENvbnRyb2wgIzIgKi8KKyNkZWZpbmUgU0FBNzE5Nl9DR0FJTlIgIDB4MTEgICAgLyogQ2hyb21hIEdhaW4gUmVmZXJlbmNlICovCisjZGVmaW5lIFNBQTcxOTZfQ1NBVCAgICAweDEyICAgIC8qIENocm9tYSBTYXR1cmF0aW9uICovCisjZGVmaW5lIFNBQTcxOTZfQ09OVCAgICAweDEzICAgIC8qIEx1bWluYW5jZSBDb250cmFzdCAqLworI2RlZmluZSBTQUE3MTk2X0hTQjYgICAgMHgxNCAgICAvKiBILXN5bmMgYmVnaW47IDYwIGh6ICovCisjZGVmaW5lIFNBQTcxOTZfSFNTNiAgICAweDE1ICAgIC8qIEgtc3luYyBzdG9wOyA2MCBoeiAqLworI2RlZmluZSBTQUE3MTk2X0hDQjYgICAgMHgxNiAgICAvKiBILWNsYW1wIGJlZ2luOyA2MCBoeiAqLworI2RlZmluZSBTQUE3MTk2X0hDUzYgICAgMHgxNyAgICAvKiBILWNsYW1wIHN0b3A7IDYwIGh6ICovCisjZGVmaW5lIFNBQTcxOTZfSFNQNiAgICAweDE4ICAgIC8qIEgtc3luYyBhZnRlciBQSEkxOyA2MCBoeiAqLworI2RlZmluZSBTQUE3MTk2X0JSSUcgICAgMHgxOSAgICAvKiBMdW1pbmFuY2UgQnJpZ2h0bmVzcyAqLworCisvKiBTY2FsZXIgcGFydDogKi8KKyNkZWZpbmUgU0FBNzE5Nl9GTVRTICAgIDB4MjAgICAgLyogRm9ybWF0cyBhbmQgc2VxdWVuY2UgKi8KKyNkZWZpbmUgU0FBNzE5Nl9PVVRQSVggIDB4MjEgICAgLyogT3V0cHV0IGRhdGEgcGl4ZWwvbGluZSAqLworI2RlZmluZSBTQUE3MTk2X0lOUElYICAgMHgyMiAgICAvKiBJbnB1dCBkYXRhIHBpeGVsL2xpbmUgKi8KKyNkZWZpbmUgU0FBNzE5Nl9IV1MgICAgIDB4MjMgICAgLyogSG9yaXouIHdpbmRvdyBzdGFydCAqLworI2RlZmluZSBTQUE3MTk2X0hGSUxUICAgMHgyNCAgICAvKiBIb3Jpei4gZmlsdGVyICovCisjZGVmaW5lIFNBQTcxOTZfT1VUTElORSAweDI1ICAgIC8qIE91dHB1dCBkYXRhIGxpbmVzL2ZpZWxkICovCisjZGVmaW5lIFNBQTcxOTZfSU5MSU5FICAweDI2ICAgIC8qIElucHV0IGRhdGEgbGluZXMvZmllbGQgKi8KKyNkZWZpbmUgU0FBNzE5Nl9WV1MgICAgIDB4MjcgICAgLyogVmVydGljYWwgd2luZG93IHN0YXJ0ICovCisjZGVmaW5lIFNBQTcxOTZfVllQICAgICAweDI4ICAgIC8qIEFGUy92ZXJ0aWNhbCBZIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgU0FBNzE5Nl9WQlMgICAgIDB4MjkgICAgLyogVmVydGljYWwgQnlwYXNzIHN0YXJ0ICovCisjZGVmaW5lIFNBQTcxOTZfVkJDTlQgICAweDJhICAgIC8qIFZlcnRpY2FsIEJ5cGFzcyBjb3VudCAqLworI2RlZmluZSBTQUE3MTk2X1ZCUCAgICAgMHgyYiAgICAvKiB2ZXJpdGNhbCBCeXBhc3MgUG9sYXJpdHkgKi8KKyNkZWZpbmUgU0FBNzE5Nl9WTE9XICAgIDB4MmMgICAgLyogQ29sb3VyLWtleWluZyBsb3dlciBWIGxpbWl0ICovCisjZGVmaW5lIFNBQTcxOTZfVkhJR0ggICAweDJkICAgIC8qIENvbG91ci1rZXlpbmcgdXBwZXIgViBsaW1pdCAqLworI2RlZmluZSBTQUE3MTk2X1VMT1cgICAgMHgyZSAgICAvKiBDb2xvdXIta2V5aW5nIGxvd2VyIFUgbGltaXQgKi8KKyNkZWZpbmUgU0FBNzE5Nl9VSElHSCAgIDB4MmYgICAgLyogQ29sb3VyLWtleWluZyB1cHBlciBVIGxpbWl0ICovCisjZGVmaW5lIFNBQTcxOTZfRFBBVEggICAweDMwICAgIC8qIERhdGEgcGF0aCBzZXR0aW5nICAqLworCisvKiBJbml0aWFsaXphdGlvbiBkZWZhdWx0IHZhbHVlczogKi8KKwordW5zaWduZWQgY2hhciBzYWFfcmVnc1tOVU1fU1VQUE9SVEVEX05PUk1dW1NBQTcxOTZfTlVNUkVHU10gPSB7CisKKy8qIFBBTCwgNzY4eDU3NiAobm8gc2NhbGluZyksIGNvbXBvc2l0ZSB2aWRlby1pbiAqLworLyogRGVjb2RlcjogKi8KKyAgICAgIHsgMHg1MCwgMHgzMCwgMHgwMCwgMHhlOCwgMHhiNiwgMHhlNSwgMHg2MywgMHhmZiwKKwkweGZlLCAweGYwLCAweGZlLCAweGUwLCAweDIwLCAweDA2LCAweDNiLCAweDk4LAorCTB4MDAsIDB4NTksIDB4NDEsIDB4NDUsIDB4MzQsIDB4MGEsIDB4ZjQsIDB4ZDIsCisJMHhlOSwgMHhhMiwKKy8qIFBhZGRpbmcgKi8KKwkJICAgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisvKiBTY2FsZXI6ICovCisJMHg3MiwgMHg4MCwgMHgwMCwgMHgwMywgMHg4ZCwgMHgyMCwgMHgyMCwgMHgxMiwKKwkweGE1LCAweDEyLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLAorCTB4ODcgfSwKKworLyogTlRTQywgNjQweDQ4MD8gKG5vIHNjYWxpbmcpLCBjb21wb3NpdGUgdmlkZW8taW4gKi8KKy8qIERlY29kZXI6ICovCisgICAgICB7IDB4NTAsIDB4MzAsIDB4MDAsIDB4ZTgsIDB4YjYsIDB4ZTUsIDB4NTAsIDB4MDAsCisJMHhmOCwgMHhmMCwgMHhmZSwgMHhlMCwgMHgwMCwgMHgwNiwgMHgzYiwgMHg5OCwKKwkweDAwLCAweDJjLCAweDNkLCAweDQwLCAweDM0LCAweDBhLCAweGY0LCAweGQyLAorCTB4ZTksIDB4OTgsCisvKiBQYWRkaW5nICovCisJCSAgICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorLyogU2NhbGVyOiAqLworCTB4NzIsIDB4ODAsIDB4ODAsIDB4MDMsIDB4ODksIDB4ZjAsIDB4ZjAsIDB4MGQsCisJMHhhMCwgMHgwZCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNCwgMHgwMCwKKwkweDg3IH0sCisKKy8qIFNFQ0FNLCA3Njh4NTc2IChubyBzY2FsaW5nKSwgY29tcG9zaXRlIHZpZGVvLWluICovCisvKiBEZWNvZGVyOiAqLworICAgICAgeyAweDUwLCAweDMwLCAweDAwLCAweGU4LCAweGI2LCAweGU1LCAweDYzLCAweGZmLAorCTB4ZmUsIDB4ZjAsIDB4ZmUsIDB4ZTAsIDB4MjAsIDB4MDcsIDB4M2IsIDB4OTgsCisJMHgwMCwgMHg1OSwgMHg0MSwgMHg0NSwgMHgzNCwgMHgwYSwgMHhmNCwgMHhkMiwKKwkweGU5LCAweGEyLAorLyogUGFkZGluZyAqLworCQkgICAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKy8qIFNjYWxlcjogKi8KKwkweDcyLCAweDgwLCAweDAwLCAweDAzLCAweDhkLCAweDIwLCAweDIwLCAweDEyLAorCTB4YTUsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsCisJMHg4NyB9CisJfTsKKworI2VuZGlmIC8qIF9TQUE3MTk2X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0cmFkaXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RyYWRpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Nzc0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0cmFkaXMuYwpAQCAtMCwwICsxLDIyNTggQEAKKy8qIAorICogc3RyYWRpcy5jIC0gc3RyYWRpcyA0OjI6MiBtcGVnIGRlY29kZXIgZHJpdmVyCisgKgorICogU3RyYWRpcyA0OjI6MiBNUEVHLTIgRGVjb2RlciBEcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSBOYXRoYW4gTGFyZWRvIDxsYXJlZG9AZ251Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKworI2luY2x1ZGUgInNhYTcxNDYuaCIKKyNpbmNsdWRlICJzYWE3MTQ2cmVnLmgiCisjaW5jbHVkZSAiaWJtbXBlZzIuaCIKKyNpbmNsdWRlICJzYWE3MTIxLmgiCisjaW5jbHVkZSAiY3M4NDIwLmgiCisKKyNkZWZpbmUgREVCVUcoeCkgCQkvKiBkZWJ1ZyBkcml2ZXIgKi8KKyN1bmRlZiAgSURFQlVHCSAJCS8qIGRlYnVnIGlycSBoYW5kbGVyICovCisjdW5kZWYgIE1ERUJVRwkgCQkvKiBkZWJ1ZyBtZW1vcnkgbWFuYWdlbWVudCAqLworCisjZGVmaW5lIFNBQTcxNDZfTUFYIDYKKworc3RhdGljIHN0cnVjdCBzYWE3MTQ2IHNhYTcxNDZzW1NBQTcxNDZfTUFYXTsKKworc3RhdGljIGludCBzYWFfbnVtID0gMDsJCS8qIG51bWJlciBvZiBTQUE3MTQ2cyBpbiB1c2UgKi8KKworc3RhdGljIGludCB2aWRlb19uciA9IC0xOworbW9kdWxlX3BhcmFtKHZpZGVvX25yLCBpbnQsIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKyNkZWZpbmUgbkRlYk5vcm1hbAkweDAwNDgwMDAwCisjZGVmaW5lIG5EZWJOb0luYwkweDAwNDgwMDAwCisjZGVmaW5lIG5EZWJWaWRlbwkweGQwNDgwMDAwCisjZGVmaW5lIG5EZWJBdWRpbwkweGQwNDAwMDAwCisjZGVmaW5lIG5EZWJETUEJCTB4MDJjODAwMDAKKworI2RlZmluZSBvRGViTm9ybWFsCTB4MTNjODAwMDAKKyNkZWZpbmUgb0RlYk5vSW5jCTB4MTNjODAwMDAKKyNkZWZpbmUgb0RlYlZpZGVvCTB4ZDEwODAwMDAKKyNkZWZpbmUgb0RlYkF1ZGlvCTB4ZDEwODAwMDAKKyNkZWZpbmUgb0RlYkRNQQkJMHgwMzA4MDAwMAorCisjZGVmaW5lIE5ld0NhcmQJCShzYWEtPmJvYXJkY2ZnWzNdKQorI2RlZmluZSBDaGlwQ29udHJvbAkoc2FhLT5ib2FyZGNmZ1sxXSkKKyNkZWZpbmUgTlRTQ0ZpcnN0QWN0aXZlCShzYWEtPmJvYXJkY2ZnWzRdKQorI2RlZmluZSBQQUxGaXJzdEFjdGl2ZQkoc2FhLT5ib2FyZGNmZ1s1XSkKKyNkZWZpbmUgTlRTQ0xhc3RBY3RpdmUJKHNhYS0+Ym9hcmRjZmdbNTRdKQorI2RlZmluZSBQQUxMYXN0QWN0aXZlCShzYWEtPmJvYXJkY2ZnWzU1XSkKKyNkZWZpbmUgSGF2ZTJNQgkJKHNhYS0+Ym9hcmRjZmdbMThdICYgMHg0MCkKKyNkZWZpbmUgSGF2ZUNTODQyMAkoc2FhLT5ib2FyZGNmZ1sxOF0gJiAweDA0KQorI2RlZmluZSBJQk1NUEVHQ0QyMAkoc2FhLT5ib2FyZGNmZ1sxOF0gJiAweDIwKQorI2RlZmluZSBIYXZlQ1MzMzEwCShzYWEtPmJvYXJkY2ZnWzE4XSAmIDB4MDEpCisjZGVmaW5lIENTMzMxME1heEx2bAkoKHNhYS0+Ym9hcmRjZmdbMzBdIDw8IDgpIHwgc2FhLT5ib2FyZGNmZ1szMV0pCisjZGVmaW5lIEhhdmVDUzQzNDEJKHNhYS0+Ym9hcmRjZmdbNDBdID09IDIpCisjZGVmaW5lIFNESVR5cGUJCShzYWEtPmJvYXJkY2ZnWzI3XSkKKyNkZWZpbmUgQ3VycmVudE1vZGUJKHNhYS0+Ym9hcmRjZmdbMl0pCisKKyNkZWZpbmUgZGViTm9ybWFsCShOZXdDYXJkID8gbkRlYk5vcm1hbCA6IG9EZWJOb3JtYWwpCisjZGVmaW5lIGRlYk5vSW5jCShOZXdDYXJkID8gbkRlYk5vSW5jIDogb0RlYk5vSW5jKQorI2RlZmluZSBkZWJWaWRlbwkoTmV3Q2FyZCA/IG5EZWJWaWRlbyA6IG9EZWJWaWRlbykKKyNkZWZpbmUgZGViQXVkaW8JKE5ld0NhcmQgPyBuRGViQXVkaW8gOiBvRGViQXVkaW8pCisjZGVmaW5lIGRlYkRNQQkJKE5ld0NhcmQgPyBuRGViRE1BIDogb0RlYkRNQSkKKworI2lmZGVmIFVTRV9SRVNDVUVfRUVQUk9NX1NETTI3NQorc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVzY3VlX2VlcHJvbVs2NF0gPSB7CisweDAwLDB4MDEsMHgwNCwweDEzLDB4MjYsMHgwZiwweDEwLDB4MDAsMHgwMCwweDAwLDB4NDMsMHg2MywweDIyLDB4MDEsMHgyOSwweDE1LDB4NzMsMHgwMCwweDFmLCAnZCcsICdlJywgJ2MnLCAneCcsICdsJywgJ2QnLCAndicsICdhJywweDAyLDB4MDAsMHgwMSwweDAwLDB4Y2MsMHhhNCwweDYzLDB4MDksMHhlMiwweDEwLDB4MDAsMHgwYSwweDAwLDB4MDIsMHgwMiwgJ2QnLCAnZScsICdjJywgJ3gnLCAnbCcsICdhJywweDAwLDB4MDAsMHg0MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogSGFyZHdhcmUgSTJDIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgSTJDV2lwZShzdHJ1Y3Qgc2FhNzE0NiAqc2FhKQoreworCWludCBpOworCS8qIHNldCBpMmMgdG8gfj0xMDBrSHosIGFib3J0IHRyYW5zZmVyLCBjbGVhciBidXN5ICovCisJc2Fhd3JpdGUoMHg2MDAgfCBTQUE3MTQ2X0kyQ19BQk9SVCwgU0FBNzE0Nl9JMkNfU1RBVFVTKTsKKwlzYWF3cml0ZSgoU0FBNzE0Nl9NQzJfVVBMRF9JMkMgPDwgMTYpIHwKKwkJIFNBQTcxNDZfTUMyX1VQTERfSTJDLCBTQUE3MTQ2X01DMik7CisJLyogd2FpdCBmb3IgaTJjIHJlZ2lzdGVycyB0byBiZSBwcm9ncmFtbWVkICovCisJZm9yIChpID0gMDsgaSA8IDEwMDAgJiYKKwkgICAgICEoc2FhcmVhZChTQUE3MTQ2X01DMikgJiBTQUE3MTQ2X01DMl9VUExEX0kyQyk7IGkrKykKKwkJc2NoZWR1bGUoKTsKKwlzYWF3cml0ZSgweDYwMCwgU0FBNzE0Nl9JMkNfU1RBVFVTKTsKKwlzYWF3cml0ZSgoU0FBNzE0Nl9NQzJfVVBMRF9JMkMgPDwgMTYpIHwKKwkJIFNBQTcxNDZfTUMyX1VQTERfSTJDLCBTQUE3MTQ2X01DMik7CisJLyogd2FpdCBmb3IgaTJjIHJlZ2lzdGVycyB0byBiZSBwcm9ncmFtbWVkICovCisJZm9yIChpID0gMDsgaSA8IDEwMDAgJiYKKwkgICAgICEoc2FhcmVhZChTQUE3MTQ2X01DMikgJiBTQUE3MTQ2X01DMl9VUExEX0kyQyk7IGkrKykKKwkJc2NoZWR1bGUoKTsKKwlzYWF3cml0ZSgweDYwMCwgU0FBNzE0Nl9JMkNfU1RBVFVTKTsKKwlzYWF3cml0ZSgoU0FBNzE0Nl9NQzJfVVBMRF9JMkMgPDwgMTYpIHwKKwkJIFNBQTcxNDZfTUMyX1VQTERfSTJDLCBTQUE3MTQ2X01DMik7CisJLyogd2FpdCBmb3IgaTJjIHJlZ2lzdGVycyB0byBiZSBwcm9ncmFtbWVkICovCisJZm9yIChpID0gMDsgaSA8IDEwMDAgJiYKKwkgICAgICEoc2FhcmVhZChTQUE3MTQ2X01DMikgJiBTQUE3MTQ2X01DMl9VUExEX0kyQyk7IGkrKykKKwkJc2NoZWR1bGUoKTsKK30KKworLyogcmVhZCBJMkMgKi8KK3N0YXRpYyBpbnQgSTJDUmVhZChzdHJ1Y3Qgc2FhNzE0NiAqc2FhLCB1bnNpZ25lZCBjaGFyIGFkZHIsCisJCSAgIHVuc2lnbmVkIGNoYXIgc3ViYWRkciwgaW50IGRvc3ViKQoreworCWludCBpOworCisJaWYgKHNhYXJlYWQoU0FBNzE0Nl9JMkNfU1RBVFVTKSAmIDB4M2MpCisJCUkyQ1dpcGUoc2FhKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMCAmJgorCSAgICAgKHNhYXJlYWQoU0FBNzE0Nl9JMkNfU1RBVFVTKSAmIFNBQTcxNDZfSTJDX0JVU1kpOyBpKyspCisJCXNjaGVkdWxlKCk7CisJaWYgKGkgPT0gMTAwMCkKKwkJSTJDV2lwZShzYWEpOworCWlmIChkb3N1YikKKwkJc2Fhd3JpdGUoKChhZGRyICYgMHhmZSkgPDwgMjQpIHwgKCgoYWRkciB8IDEpICYgMHhmZikgPDwgOCkgfAorCQkgICgoc3ViYWRkciAmIDB4ZmYpIDw8IDE2KSB8IDB4ZWQsIFNBQTcxNDZfSTJDX1RSQU5TRkVSKTsKKwllbHNlCisJCXNhYXdyaXRlKCgoYWRkciAmIDB4ZmUpIDw8IDI0KSB8ICgoKGFkZHIgfCAxKSAmIDB4ZmYpIDw8IDE2KSB8CisJCQkgMHhmMSwgU0FBNzE0Nl9JMkNfVFJBTlNGRVIpOworCXNhYXdyaXRlKChTQUE3MTQ2X01DMl9VUExEX0kyQyA8PCAxNikgfAorCQkgU0FBNzE0Nl9NQzJfVVBMRF9JMkMsIFNBQTcxNDZfTUMyKTsKKwkvKiB3YWl0IGZvciBpMmMgcmVnaXN0ZXJzIHRvIGJlIHByb2dyYW1tZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMCAmJgorCSAgICAgIShzYWFyZWFkKFNBQTcxNDZfTUMyKSAmIFNBQTcxNDZfTUMyX1VQTERfSTJDKTsgaSsrKQorCQlzY2hlZHVsZSgpOworCS8qIHdhaXQgZm9yIHZhbGlkIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMCAmJgorCSAgICAgKHNhYXJlYWQoU0FBNzE0Nl9JMkNfU1RBVFVTKSAmIFNBQTcxNDZfSTJDX0JVU1kpOyBpKyspCisJCXNjaGVkdWxlKCk7CisJaWYgKHNhYXJlYWQoU0FBNzE0Nl9JMkNfU1RBVFVTKSAmIFNBQTcxNDZfSTJDX0VSUikKKwkJcmV0dXJuIC0xOworCWlmIChpID09IDEwMDApIAorCQlwcmludGsoImkyYyBzZXR1cCByZWFkIHRpbWVvdXRcbiIpOworCXNhYXdyaXRlKDB4NDEsIFNBQTcxNDZfSTJDX1RSQU5TRkVSKTsKKwlzYWF3cml0ZSgoU0FBNzE0Nl9NQzJfVVBMRF9JMkMgPDwgMTYpIHwKKwkJIFNBQTcxNDZfTUMyX1VQTERfSTJDLCBTQUE3MTQ2X01DMik7CisJLyogd2FpdCBmb3IgaTJjIHJlZ2lzdGVycyB0byBiZSBwcm9ncmFtbWVkICovCisJZm9yIChpID0gMDsgaSA8IDEwMDAgJiYKKwkgICAgICEoc2FhcmVhZChTQUE3MTQ2X01DMikgJiBTQUE3MTQ2X01DMl9VUExEX0kyQyk7IGkrKykKKwkJc2NoZWR1bGUoKTsKKwkvKiB3YWl0IGZvciB2YWxpZCBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IDEwMDAgJiYKKwkgICAgIChzYWFyZWFkKFNBQTcxNDZfSTJDX1RSQU5TRkVSKSAmIFNBQTcxNDZfSTJDX0JVU1kpOyBpKyspCisJCXNjaGVkdWxlKCk7CisJaWYgKHNhYXJlYWQoU0FBNzE0Nl9JMkNfVFJBTlNGRVIpICYgU0FBNzE0Nl9JMkNfRVJSKQorCQlyZXR1cm4gLTE7CisJaWYgKGkgPT0gMTAwMCkgCisJCXByaW50aygiaTJjIHJlYWQgdGltZW91dFxuIik7CisJcmV0dXJuICgoc2FhcmVhZChTQUE3MTQ2X0kyQ19UUkFOU0ZFUikgPj4gMjQpICYgMHhmZik7Cit9CisKKy8qIHNldCBib3RoIHRvIHdyaXRlIGJvdGggYnl0ZXMsIHJlc2V0IGl0IHRvIHdyaXRlIG9ubHkgYjEgKi8KKworc3RhdGljIGludCBJMkNXcml0ZShzdHJ1Y3Qgc2FhNzE0NiAqc2FhLCB1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgYjEsCisJCSAgICB1bnNpZ25lZCBjaGFyIGIyLCBpbnQgYm90aCkKK3sKKwlpbnQgaTsKKwl1MzIgZGF0YTsKKworCWlmIChzYWFyZWFkKFNBQTcxNDZfSTJDX1NUQVRVUykgJiAweDNjKQorCQlJMkNXaXBlKHNhYSk7CisJZm9yIChpID0gMDsgaSA8IDEwMDAgJiYKKwkgICAgIChzYWFyZWFkKFNBQTcxNDZfSTJDX1NUQVRVUykgJiBTQUE3MTQ2X0kyQ19CVVNZKTsgaSsrKQorCQlzY2hlZHVsZSgpOworCWlmIChpID09IDEwMDApCisJCUkyQ1dpcGUoc2FhKTsKKwlkYXRhID0gKChhZGRyICYgMHhmZSkgPDwgMjQpIHwgKChiMSAmIDB4ZmYpIDw8IDE2KTsKKwlpZiAoYm90aCkKKwkJZGF0YSB8PSAoKGIyICYgMHhmZikgPDwgOCkgfCAweGU1OworCWVsc2UKKwkJZGF0YSB8PSAweGQxOworCXNhYXdyaXRlKGRhdGEsIFNBQTcxNDZfSTJDX1RSQU5TRkVSKTsKKwlzYWF3cml0ZSgoU0FBNzE0Nl9NQzJfVVBMRF9JMkMgPDwgMTYpIHwgU0FBNzE0Nl9NQzJfVVBMRF9JMkMsCisJCSBTQUE3MTQ2X01DMik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0dGFjaF9pbmZvcm0oc3RydWN0IHNhYTcxNDYgKnNhYSwgaW50IGlkKQoreworCWludCBpOworCisJREVCVUcocHJpbnRrKEtFUk5fREVCVUcgInN0cmFkaXMlZDogaTJjOiBkZXZpY2UgZm91bmQ9JTAyeFxuIiwgc2FhLT5uciwgaWQpKTsKKwlpZiAoaWQgPT0gMHhhMCkJeyAvKiB3ZSBoYXZlIHJldjIgb3IgbGF0ZXIgYm9hcmQsIGZpbGwgaW4gaW5mbyAqLworCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwkJCXNhYS0+Ym9hcmRjZmdbaV0gPSBJMkNSZWFkKHNhYSwgMHhhMCwgaSwgMSk7CisjaWZkZWYgVVNFX1JFU0NVRV9FRVBST01fU0RNMjc1CisJCWlmIChzYWEtPmJvYXJkY2ZnWzBdICE9IDApIHsKKwkJCXByaW50aygic3RyYWRpcyVkOiBXQVJOSU5HOiBFRVBST00gU1RPUkVEIFZBTFVFUyBIQVZFIEJFRU4gSUdOT1JFRFxuIiwgc2FhLT5ucik7CisJCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwkJCQlzYWEtPmJvYXJkY2ZnW2ldID0gcmVzY3VlX2VlcHJvbVtpXTsKKwkJfQorI2VuZGlmCisJCXByaW50aygic3RyYWRpcyVkOiBjb25maWcgPSIsIHNhYS0+bnIpOworCQlmb3IgKGkgPSAwOyBpIDwgNTE7IGkrKykgeworCQkJcHJpbnRrKCIgJTAyeCIsc2FhLT5ib2FyZGNmZ1tpXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgSTJDQnVzU2NhbihzdHJ1Y3Qgc2FhNzE0NiAqc2FhKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAweGZmOyBpICs9IDIpCisJCWlmICgoSTJDUmVhZChzYWEsIGksIDAsIDApKSA+PSAwKQorCQkJYXR0YWNoX2luZm9ybShzYWEsIGkpOworfQorCitzdGF0aWMgaW50IGRlYml3YWl0X21heHdhaXQgPSAwOworCitzdGF0aWMgaW50IHdhaXRfZm9yX2RlYmlfZG9uZShzdHJ1Y3Qgc2FhNzE0NiAqc2FhKQoreworCWludCBpOworCisJLyogd2FpdCBmb3IgcmVnaXN0ZXJzIHRvIGJlIHByb2dyYW1tZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwICYmCisJICAgICAhKHNhYXJlYWQoU0FBNzE0Nl9NQzIpICYgU0FBNzE0Nl9NQzJfVVBMRF9ERUJJKTsgaSsrKQorCQlzYWFyZWFkKFNBQTcxNDZfTUMyKTsKKwkvKiB3YWl0IGZvciB0cmFuc2ZlciB0byBjb21wbGV0ZSAqLworCWZvciAoaSA9IDA7IGkgPCA1MDAwMDAgJiYKKwkgICAgIChzYWFyZWFkKFNBQTcxNDZfUFNSKSAmIFNBQTcxNDZfUFNSX0RFQklfUyk7IGkrKykKKwkJc2FhcmVhZChTQUE3MTQ2X01DMik7CisJaWYgKGkgPiBkZWJpd2FpdF9tYXh3YWl0KQorCQlwcmludGsoIndhaXQtZm9yLWRlYmktZG9uZSBtYXh3YWl0OiAlZFxuIiwKKwkJCWRlYml3YWl0X21heHdhaXQgPSBpKTsKKwkKKwlpZiAoaSA9PSA1MDAwMDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJpd3JpdGUoc3RydWN0IHNhYTcxNDYgKnNhYSwgdTMyIGNvbmZpZywgaW50IGFkZHIsCisJCSAgICAgIHUzMiB2YWwsIGludCBjb3VudCkKK3sKKwl1MzIgY21kOworCWlmIChjb3VudCA8PSAwIHx8IGNvdW50ID4gMzI3NjQpCisJCXJldHVybiAtMTsKKwlpZiAod2FpdF9mb3JfZGViaV9kb25lKHNhYSkgPCAwKQorCQlyZXR1cm4gLTE7CisJc2Fhd3JpdGUoY29uZmlnLCBTQUE3MTQ2X0RFQklfQ09ORklHKTsKKwlpZiAoY291bnQgPD0gNCkJCS8qIGltbWVkaWF0ZSB0cmFuc2ZlciAqLworCQlzYWF3cml0ZSh2YWwsIFNBQTcxNDZfREVCSV9BRCk7CisJZWxzZQkJCS8qIGJsb2NrIHRyYW5zZmVyICovCisJCXNhYXdyaXRlKHZpcnRfdG9fYnVzKHNhYS0+ZG1hZGViaSksIFNBQTcxNDZfREVCSV9BRCk7CisJc2Fhd3JpdGUoKGNtZCA9IChjb3VudCA8PCAxNykgfCAoYWRkciAmIDB4ZmZmZikpLCBTQUE3MTQ2X0RFQklfQ09NTUFORCk7CisJc2Fhd3JpdGUoKFNBQTcxNDZfTUMyX1VQTERfREVCSSA8PCAxNikgfCBTQUE3MTQ2X01DMl9VUExEX0RFQkksCisJCSBTQUE3MTQ2X01DMik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgZGViaXJlYWQoc3RydWN0IHNhYTcxNDYgKnNhYSwgdTMyIGNvbmZpZywgaW50IGFkZHIsIGludCBjb3VudCkKK3sKKwl1MzIgcmVzdWx0ID0gMDsKKworCWlmIChjb3VudCA+IDMyNzY0IHx8IGNvdW50IDw9IDApCisJCXJldHVybiAwOworCWlmICh3YWl0X2Zvcl9kZWJpX2RvbmUoc2FhKSA8IDApCisJCXJldHVybiAwOworCXNhYXdyaXRlKHZpcnRfdG9fYnVzKHNhYS0+ZG1hZGViaSksIFNBQTcxNDZfREVCSV9BRCk7CisJc2Fhd3JpdGUoKGNvdW50IDw8IDE3KSB8IDB4MTAwMDAgfCAoYWRkciAmIDB4ZmZmZiksCisJCSBTQUE3MTQ2X0RFQklfQ09NTUFORCk7CisJc2Fhd3JpdGUoY29uZmlnLCBTQUE3MTQ2X0RFQklfQ09ORklHKTsKKwlzYWF3cml0ZSgoU0FBNzE0Nl9NQzJfVVBMRF9ERUJJIDw8IDE2KSB8IFNBQTcxNDZfTUMyX1VQTERfREVCSSwKKwkJIFNBQTcxNDZfTUMyKTsKKwlpZiAoY291bnQgPiA0KQkJLyogbm90IGFuIGltbWVkaWF0ZSB0cmFuc2ZlciAqLworCQlyZXR1cm4gY291bnQ7CisJd2FpdF9mb3JfZGViaV9kb25lKHNhYSk7CisJcmVzdWx0ID0gc2FhcmVhZChTQUE3MTQ2X0RFQklfQUQpOworCWlmIChjb3VudCA9PSAxKQorCQlyZXN1bHQgJj0gMHhmZjsKKwlpZiAoY291bnQgPT0gMikKKwkJcmVzdWx0ICY9IDB4ZmZmZjsKKwlpZiAoY291bnQgPT0gMykKKwkJcmVzdWx0ICY9IDB4ZmZmZmZmOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNpZiAwIC8qIHVudXNlZCAqLworLyogTVVTVCBiZSBhIG11bHRpcGxlIG9mIDggYnl0ZXMgYW5kIDgtYnl0ZSBhbGlnbmVkIGFuZCA8IDMyNzY4IGJ5dGVzICovCisvKiBkYXRhIGNvcGllZCBpbnRvIHNhYS0+ZG1hZGViaSBidWZmZXIsIGNhbGxlciBtdXN0IHJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCitzdGF0aWMgdm9pZCBpYm1fYmxvY2tfZHJhbV9yZWFkKHN0cnVjdCBzYWE3MTQ2ICpzYWEsIGludCBhZGRyZXNzLCBpbnQgYnl0ZXMpCit7CisJaW50IGksIGo7CisJdTMyICpidWY7CisJYnVmID0gKHUzMiAqKSBzYWEtPmRtYWRlYmk7CisJaWYgKGJ5dGVzID4gMHg3MDAwKQorCQlieXRlcyA9IDB4NzAwMDsKKwlzYWF3cml0ZSgwLCBTQUE3MTQ2X0lFUik7CS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWZvciAoaT0wOyBpIDwgMTAwMDAgJiYKKwkJKGRlYmlyZWFkKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0RSQU1fQ01EX1NUQVQsIDIpCisJCSYgMHg4MDAwKTsgaSsrKQorCQlzYWFyZWFkKFNBQTcxNDZfTUMyKTsKKwlpZiAoaSA9PSAxMDAwMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJzdHJhZGlzJWQ6IGRyYW1fYnVzeSBuZXZlciBjbGVhcmVkXG4iLAorCQkJc2FhLT5ucik7CisJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX1NSQ19BRERSLCAoYWRkcmVzczw8MTYpIHwKKwkJKGFkZHJlc3M+PjE2KSwgNCk7CisJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0JMT0NLX1NJWkUsIGJ5dGVzLCAyKTsKKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ01EX1NUQVQsIDB4OGExMCwgMik7CisJZm9yIChqID0gMDsgaiA8IGJ5dGVzLzQ7IGorKykgeworCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDAgJiYKKwkJCSghKGRlYmlyZWFkKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0RSQU1fQ01EX1NUQVQsIDIpCisJCQkmIDB4NDAwMCkpOyBpKyspCisJCQlzYWFyZWFkKFNBQTcxNDZfTUMyKTsKKwkJaWYgKGkgPT0gMTAwMDApCisJCQlwcmludGsoS0VSTl9FUlIgInN0cmFkaXMlZDogZHJhbV9yZWFkeSBuZXZlciBzZXRcbiIsCisJCQkJc2FhLT5ucik7CisJCWJ1ZltqXSA9IGRlYmlyZWFkKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0RSQU1fREFUQSwgNCk7CisJfQorfQorI2VuZGlmIC8qIHVudXNlZCAqLworCitzdGF0aWMgdm9pZCBkb19pcnFfc2VuZF9kYXRhKHN0cnVjdCBzYWE3MTQ2ICpzYWEpCit7CisJaW50IHNwbGl0LCBhdWRieXRlcywgdmlkYnl0ZXM7CisKKwlzYWF3cml0ZShTQUE3MTQ2X1BTUl9QSU4xLCBTQUE3MTQ2X0lFUik7CisJLyogaWYgc3BlY2lhbCBmZWF0dXJlIG1vZGUgaW4gZWZmZWN0LCBkaXNhYmxlIGF1ZGlvIHNlbmRpbmcgKi8KKwlpZiAoc2FhLT5wbGF5bW9kZSAhPSBWSURfUExBWV9OT1JNQUwpCisJCXNhYS0+YXVkdGFpbCA9IHNhYS0+YXVkaGVhZCA9IDA7CisJaWYgKHNhYS0+YXVkaGVhZCA8PSBzYWEtPmF1ZHRhaWwpCisJCWF1ZGJ5dGVzID0gc2FhLT5hdWR0YWlsIC0gc2FhLT5hdWRoZWFkOworCWVsc2UKKwkJYXVkYnl0ZXMgPSA2NTUzNiAtIChzYWEtPmF1ZGhlYWQgLSBzYWEtPmF1ZHRhaWwpOworCWlmIChzYWEtPnZpZGhlYWQgPD0gc2FhLT52aWR0YWlsKQorCQl2aWRieXRlcyA9IHNhYS0+dmlkdGFpbCAtIHNhYS0+dmlkaGVhZDsKKwllbHNlCisJCXZpZGJ5dGVzID0gNTI0Mjg4IC0gKHNhYS0+dmlkaGVhZCAtIHNhYS0+dmlkdGFpbCk7CisJaWYgKGF1ZGJ5dGVzID09IDAgJiYgdmlkYnl0ZXMgPT0gMCAmJiBzYWEtPm9zZHRhaWwgPT0gc2FhLT5vc2RoZWFkKSB7CisJCXNhYXdyaXRlKDAsIFNBQTcxNDZfSUVSKTsKKwkJcmV0dXJuOworCX0KKwkvKiBpZiBhdCBsZWFzdCAxIGJsb2NrIGF1ZGlvIHdhaXRpbmcgYW5kIGF1ZGlvIGZpZm8gaXNuJ3QgZnVsbCAqLworCWlmIChhdWRieXRlcyA+PSAyMDQ4ICYmIChkZWJpcmVhZChzYWEsIGRlYk5vcm1hbCwKKwkJSUJNX01QMl9BVURfRklGTywgMikgJiAweGZmKSA8IDYwKSB7CisJCWlmIChzYWEtPmF1ZGhlYWQgPiBzYWEtPmF1ZHRhaWwpCisJCQlzcGxpdCA9IDY1NTM2IC0gc2FhLT5hdWRoZWFkOworCQllbHNlCisJCQlzcGxpdCA9IDA7CisJCWF1ZGJ5dGVzID0gMjA0ODsKKwkJaWYgKHNwbGl0ID4gMCAmJiBzcGxpdCA8IDIwNDgpIHsKKwkJCW1lbWNweShzYWEtPmRtYWRlYmksIHNhYS0+YXVkYnVmICsgc2FhLT5hdWRoZWFkLAorCQkJCXNwbGl0KTsKKwkJCXNhYS0+YXVkaGVhZCA9IDA7CisJCQlhdWRieXRlcyAtPSBzcGxpdDsKKwkJfSBlbHNlCisJCQlzcGxpdCA9IDA7CisJCW1lbWNweShzYWEtPmRtYWRlYmkgKyBzcGxpdCwgc2FhLT5hdWRidWYgKyBzYWEtPmF1ZGhlYWQsCisJCQlhdWRieXRlcyk7CisJCXNhYS0+YXVkaGVhZCArPSBhdWRieXRlczsKKwkJc2FhLT5hdWRoZWFkICY9IDB4ZmZmZjsKKwkJZGViaXdyaXRlKHNhYSwgZGViQXVkaW8sIChOZXdDYXJkPyBJQk1fTVAyX0FVRF9GSUZPIDoKKwkJCSAgSUJNX01QMl9BVURfRklGT1cpLCAwLCAyMDQ4KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzYWEtPmF1ZHEpOworCS8qIGlmIGF0IGxlYXN0IDEgYmxvY2sgdmlkZW8gd2FpdGluZyBhbmQgdmlkZW8gZmlmbyBpc24ndCBmdWxsICovCisJfSBlbHNlIGlmICh2aWRieXRlcyA+PSAzMDcyMCAmJiAoZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsCisJCUlCTV9NUDJfRklGTywgMikpIDwgMTYzODQpIHsKKwkJaWYgKHNhYS0+dmlkaGVhZCA+IHNhYS0+dmlkdGFpbCkKKwkJCXNwbGl0ID0gNTI0Mjg4IC0gc2FhLT52aWRoZWFkOworCQllbHNlCisJCQlzcGxpdCA9IDA7CisJCXZpZGJ5dGVzID0gMzA3MjA7CisJCWlmIChzcGxpdCA+IDAgJiYgc3BsaXQgPCAzMDcyMCkgeworCQkJbWVtY3B5KHNhYS0+ZG1hZGViaSwgc2FhLT52aWRidWYgKyBzYWEtPnZpZGhlYWQsCisJCQkJc3BsaXQpOworCQkJc2FhLT52aWRoZWFkID0gMDsKKwkJCXZpZGJ5dGVzIC09IHNwbGl0OworCQl9IGVsc2UKKwkJCXNwbGl0ID0gMDsKKwkJbWVtY3B5KHNhYS0+ZG1hZGViaSArIHNwbGl0LCBzYWEtPnZpZGJ1ZiArIHNhYS0+dmlkaGVhZCwKKwkJCXZpZGJ5dGVzKTsKKwkJc2FhLT52aWRoZWFkICs9IHZpZGJ5dGVzOworCQlzYWEtPnZpZGhlYWQgJj0gMHg3ZmZmZjsKKwkJZGViaXdyaXRlKHNhYSwgZGViVmlkZW8sIChOZXdDYXJkID8gSUJNX01QMl9GSUZPIDoKKwkJCSAgSUJNX01QMl9GSUZPVyksIDAsIDMwNzIwKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzYWEtPnZpZHEpOworCX0KKwlzYWF3cml0ZShTQUE3MTQ2X1BTUl9ERUJJX1MgfCBTQUE3MTQ2X1BTUl9QSU4xLCBTQUE3MTQ2X0lFUik7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfb3NkX2RhdGEoc3RydWN0IHNhYTcxNDYgKnNhYSkKK3sKKwlpbnQgc2l6ZSA9IHNhYS0+b3NkdGFpbCAtIHNhYS0+b3NkaGVhZDsKKwlpZiAoc2l6ZSA+IDMwNzIwKQorCQlzaXplID0gMzA3MjA7CisJLyogZW5zdXJlIHNvbWUgbXVsdGlwbGUgb2YgOCBieXRlcyBpcyB0cmFuc2ZlcnJlZCAqLworCXNpemUgPSA4ICogKChzaXplICsgOCk+PjMpOworCWlmIChzaXplKSB7CisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9PU0RfQUREUiwKKwkJCSAgKHNhYS0+b3NkaGVhZD4+MyksIDIpOworCQltZW1jcHkoc2FhLT5kbWFkZWJpLCAmc2FhLT5vc2RidWZbc2FhLT5vc2RoZWFkXSwgc2l6ZSk7CisJCXNhYS0+b3NkaGVhZCArPSBzaXplOworCQkvKiBibG9jayB0cmFuc2ZlciBvZiBuZXh0IDggYnl0ZXMgdG8gfjMyayBieXRlcyAqLworCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfT1NEX0RBVEEsIDAsIHNpemUpOworCX0KKwlpZiAoc2FhLT5vc2RoZWFkID49IHNhYS0+b3NkdGFpbCkgeworCQlzYWEtPm9zZGhlYWQgPSBzYWEtPm9zZHRhaWwgPSAwOworCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfTUFTSzAsIDB4YzAwYywgMik7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2FhNzE0Nl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc2FhNzE0NiAqc2FhID0gKHN0cnVjdCBzYWE3MTQ2ICopIGRldl9pZDsKKwl1MzIgc3RhdCwgYXN0YXQ7CisJaW50IGNvdW50OworCWludCBoYW5kbGVkID0gMDsKKworCWNvdW50ID0gMDsKKwl3aGlsZSAoMSkgeworCQkvKiBnZXQvY2xlYXIgaW50ZXJydXB0IHN0YXR1cyBiaXRzICovCisJCXN0YXQgPSBzYWFyZWFkKFNBQTcxNDZfSVNSKTsKKwkJYXN0YXQgPSBzdGF0ICYgc2FhcmVhZChTQUE3MTQ2X0lFUik7CisJCWlmICghYXN0YXQpCisJCQlicmVhazsKKwkJaGFuZGxlZCA9IDE7CisJCXNhYXdyaXRlKGFzdGF0LCBTQUE3MTQ2X0lTUik7CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX0RFQklfUykgeworCQkJZG9faXJxX3NlbmRfZGF0YShzYWEpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX1BJTjEpIHsKKwkJCWludCBpc3RhdDsKKwkJCS8qIHRoZSBmb2xsb3dpbmcgcmVhZCB3aWxsIHRyaWdnZXIgREVCSV9TICovCisJCQlpc3RhdCA9IGRlYmlyZWFkKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0hPU1RfSU5ULCAyKTsKKwkJCWlmIChpc3RhdCAmIDEpIHsKKwkJCQlzYWF3cml0ZSgwLCBTQUE3MTQ2X0lFUik7CisJCQkJc2VuZF9vc2RfZGF0YShzYWEpOworCQkJCXNhYXdyaXRlKFNBQTcxNDZfUFNSX0RFQklfUyB8CisJCQkJCSBTQUE3MTQ2X1BTUl9QSU4xLCBTQUE3MTQ2X0lFUik7CisJCQl9CisJCQlpZiAoaXN0YXQgJiAweDIwKSB7CS8qIFZpZGVvIFN0YXJ0ICovCisJCQkJc2FhLT52aWRpbmZvLmZyYW1lX2NvdW50Kys7CisJCQl9CisJCQlpZiAoaXN0YXQgJiAweDQwMCkgewkvKiBQaWN0dXJlIFN0YXJ0ICovCisJCQkJLyogdXBkYXRlIHRlbXBvcmFsIHJlZmVyZW5jZSAqLworCQkJfQorCQkJaWYgKGlzdGF0ICYgMHgyMDApIHsJLyogUGljdHVyZSBSZXNvbHV0aW9uIENoYW5nZSAqLworCQkJCS8qIHJlYWQgbmV3IHJlc29sdXRpb24gKi8KKwkJCX0KKwkJCWlmIChpc3RhdCAmIDB4MTAwKSB7CS8qIE5ldyBVc2VyIERhdGEgZm91bmQgKi8KKwkJCQkvKiByZWFkIG5ldyB1c2VyIGRhdGEgKi8KKwkJCX0KKwkJCWlmIChpc3RhdCAmIDB4MTAwMCkgewkvKiBuZXcgR09QL1NNUFRFICovCisJCQkJLyogcmVhZCBuZXcgU01QVEUgKi8KKwkJCX0KKwkJCWlmIChpc3RhdCAmIDB4ODAwMCkgewkvKiBTZXF1ZW5jZSBTdGFydCBDb2RlICovCisJCQkJLyogcmVzZXQgZnJhbWUgY291bnRlciwgbG9hZCBzaXplcyAqLworCQkJCXNhYS0+dmlkaW5mby5mcmFtZV9jb3VudCA9IDA7CisJCQkJc2FhLT52aWRpbmZvLmhfc2l6ZSA9IDcwNDsKKwkJCQlzYWEtPnZpZGluZm8udl9zaXplID0gNDgwOworI2lmIDAKKwkJCQlpZiAoc2FhLT5lbmRtYXJraGVhZCAhPSBzYWEtPmVuZG1hcmt0YWlsKSB7CisJCQkJCXNhYS0+YXVkaGVhZCA9IAorCQkJCQkJc2FhLT5lbmRtYXJrW3NhYS0+ZW5kbWFya2hlYWRdOworCQkJCQlzYWEtPmVuZG1hcmtoZWFkKys7CisJCQkJCWlmIChzYWEtPmVuZG1hcmtoZWFkID49IE1BWF9NQVJLUykKKwkJCQkJCXNhYS0+ZW5kbWFya2hlYWQgPSAwOworCQkJCX0KKyNlbmRpZgorCQkJfQorCQkJaWYgKGlzdGF0ICYgMHg0MDAwKSB7CS8qIFNlcXVlbmNlIEVycm9yIENvZGUgKi8KKwkJCQlpZiAoc2FhLT5lbmRtYXJraGVhZCAhPSBzYWEtPmVuZG1hcmt0YWlsKSB7CisJCQkJCXNhYS0+YXVkaGVhZCA9IAorCQkJCQkJc2FhLT5lbmRtYXJrW3NhYS0+ZW5kbWFya2hlYWRdOworCQkJCQlzYWEtPmVuZG1hcmtoZWFkKys7CisJCQkJCWlmIChzYWEtPmVuZG1hcmtoZWFkID49IE1BWF9NQVJLUykKKwkJCQkJCXNhYS0+ZW5kbWFya2hlYWQgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorI2lmZGVmIElERUJVRworCQlpZiAoYXN0YXQgJiBTQUE3MTQ2X1BTUl9QUEVGKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBQUEVGXG4iLCBzYWEtPm5yKSk7CisJCX0KKwkJaWYgKGFzdGF0ICYgU0FBNzE0Nl9QU1JfUEFCTykgeworCQkJSURFQlVHKHByaW50aygic3RyYWRpcyVkIGlycTogUEFCT1xuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX1BQRUQpIHsKKwkJCUlERUJVRyhwcmludGsoInN0cmFkaXMlZCBpcnE6IFBQRURcbiIsIHNhYS0+bnIpKTsKKwkJfQorCQlpZiAoYXN0YXQgJiBTQUE3MTQ2X1BTUl9SUFNfSTEpIHsKKwkJCUlERUJVRyhwcmludGsoInN0cmFkaXMlZCBpcnE6IFJQU19JMVxuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX1JQU19JMCkgeworCQkJSURFQlVHKHByaW50aygic3RyYWRpcyVkIGlycTogUlBTX0kwXG4iLCBzYWEtPm5yKSk7CisJCX0KKwkJaWYgKGFzdGF0ICYgU0FBNzE0Nl9QU1JfUlBTX0xBVEUxKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBSUFNfTEFURTFcbiIsIHNhYS0+bnIpKTsKKwkJfQorCQlpZiAoYXN0YXQgJiBTQUE3MTQ2X1BTUl9SUFNfTEFURTApIHsKKwkJCUlERUJVRyhwcmludGsoInN0cmFkaXMlZCBpcnE6IFJQU19MQVRFMFxuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX1JQU19FMSkgeworCQkJSURFQlVHKHByaW50aygic3RyYWRpcyVkIGlycTogUlBTX0UxXG4iLCBzYWEtPm5yKSk7CisJCX0KKwkJaWYgKGFzdGF0ICYgU0FBNzE0Nl9QU1JfUlBTX0UwKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBSUFNfRTBcbiIsIHNhYS0+bnIpKTsKKwkJfQorCQlpZiAoYXN0YXQgJiBTQUE3MTQ2X1BTUl9SUFNfVE8xKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBSUFNfVE8xXG4iLCBzYWEtPm5yKSk7CisJCX0KKwkJaWYgKGFzdGF0ICYgU0FBNzE0Nl9QU1JfUlBTX1RPMCkgeworCQkJSURFQlVHKHByaW50aygic3RyYWRpcyVkIGlycTogUlBTX1RPMFxuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX1VQTEQpIHsKKwkJCUlERUJVRyhwcmludGsoInN0cmFkaXMlZCBpcnE6IFVQTERcbiIsIHNhYS0+bnIpKTsKKwkJfQorCQlpZiAoYXN0YXQgJiBTQUE3MTQ2X1BTUl9ERUJJX0UpIHsKKwkJCUlERUJVRyhwcmludGsoInN0cmFkaXMlZCBpcnE6IERFQklfRVxuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX0kyQ19TKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBJMkNfU1xuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX0kyQ19FKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBJMkNfRVxuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX0EyX0lOKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBBMl9JTlxuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX0EyX09VVCkgeworCQkJSURFQlVHKHByaW50aygic3RyYWRpcyVkIGlycTogQTJfT1VUXG4iLCBzYWEtPm5yKSk7CisJCX0KKwkJaWYgKGFzdGF0ICYgU0FBNzE0Nl9QU1JfQTFfSU4pIHsKKwkJCUlERUJVRyhwcmludGsoInN0cmFkaXMlZCBpcnE6IEExX0lOXG4iLCBzYWEtPm5yKSk7CisJCX0KKwkJaWYgKGFzdGF0ICYgU0FBNzE0Nl9QU1JfQTFfT1VUKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBBMV9PVVRcbiIsIHNhYS0+bnIpKTsKKwkJfQorCQlpZiAoYXN0YXQgJiBTQUE3MTQ2X1BTUl9BRk9VKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBBRk9VXG4iLCBzYWEtPm5yKSk7CisJCX0KKwkJaWYgKGFzdGF0ICYgU0FBNzE0Nl9QU1JfVl9QRSkgeworCQkJSURFQlVHKHByaW50aygic3RyYWRpcyVkIGlycTogVl9QRVxuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX1ZGT1UpIHsKKwkJCUlERUJVRyhwcmludGsoInN0cmFkaXMlZCBpcnE6IFZGT1VcbiIsIHNhYS0+bnIpKTsKKwkJfQorCQlpZiAoYXN0YXQgJiBTQUE3MTQ2X1BTUl9GSURBKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBGSURBXG4iLCBzYWEtPm5yKSk7CisJCX0KKwkJaWYgKGFzdGF0ICYgU0FBNzE0Nl9QU1JfRklEQikgeworCQkJSURFQlVHKHByaW50aygic3RyYWRpcyVkIGlycTogRklEQlxuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX1BJTjMpIHsKKwkJCUlERUJVRyhwcmludGsoInN0cmFkaXMlZCBpcnE6IFBJTjNcbiIsIHNhYS0+bnIpKTsKKwkJfQorCQlpZiAoYXN0YXQgJiBTQUE3MTQ2X1BTUl9QSU4yKSB7CisJCQlJREVCVUcocHJpbnRrKCJzdHJhZGlzJWQgaXJxOiBQSU4yXG4iLCBzYWEtPm5yKSk7CisJCX0KKwkJaWYgKGFzdGF0ICYgU0FBNzE0Nl9QU1JfUElOMCkgeworCQkJSURFQlVHKHByaW50aygic3RyYWRpcyVkIGlycTogUElOMFxuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX0VDUykgeworCQkJSURFQlVHKHByaW50aygic3RyYWRpcyVkIGlycTogRUNTXG4iLCBzYWEtPm5yKSk7CisJCX0KKwkJaWYgKGFzdGF0ICYgU0FBNzE0Nl9QU1JfRUMzUykgeworCQkJSURFQlVHKHByaW50aygic3RyYWRpcyVkIGlycTogRUMzU1xuIiwgc2FhLT5ucikpOworCQl9CisJCWlmIChhc3RhdCAmIFNBQTcxNDZfUFNSX0VDMFMpIHsKKwkJCUlERUJVRyhwcmludGsoInN0cmFkaXMlZCBpcnE6IEVDMFNcbiIsIHNhYS0+bnIpKTsKKwkJfQorI2VuZGlmCisJCWNvdW50Kys7CisJCWlmIChjb3VudCA+IDE1KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3RyYWRpcyVkOiBpcnEgbG9vcCAlZFxuIiwKKwkJCSAgICAgICBzYWEtPm5yLCBjb3VudCk7CisJCWlmIChjb3VudCA+IDIwKSB7CisJCQlzYWF3cml0ZSgwLCBTQUE3MTQ2X0lFUik7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic3RyYWRpcyVkOiBJUlEgbG9vcCBjbGVhcmVkXG4iLCBzYWEtPm5yKTsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGludCBpYm1fc2VuZF9jb21tYW5kKHN0cnVjdCBzYWE3MTQ2ICpzYWEsCisJCQkgICAgaW50IGNvbW1hbmQsIGludCBkYXRhLCBpbnQgY2hhaW4pCit7CisJaW50IGk7CisKKwlpZiAoY2hhaW4pCisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9DT01NQU5ELCAoY29tbWFuZCA8PCAxKSB8IDEsIDIpOworCWVsc2UKKwkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0NPTU1BTkQsIGNvbW1hbmQgPDwgMSwgMik7CisJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0NNRF9EQVRBLCBkYXRhLCAyKTsKKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ01EX1NUQVQsIDEsIDIpOworCWZvciAoaSA9IDA7IGkgPCAxMDAgJiYKKwkgICAgIChkZWJpcmVhZChzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9DTURfU1RBVCwgMikgJiAxKTsgaSsrKQorCQlzY2hlZHVsZSgpOworCWlmIChpID09IDEwMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjczQzNDFfc2V0bGV2ZWwoc3RydWN0IHNhYTcxNDYgKnNhYSwgaW50IGxlZnQsIGludCByaWdodCkKK3sKKwlJMkNXcml0ZShzYWEsIDB4MjIsIDB4MDMsIGxlZnQgPiA5NCA/IDk0IDogbGVmdCwgMik7CisJSTJDV3JpdGUoc2FhLCAweDIyLCAweDA0LCByaWdodCA+IDk0ID8gOTQgOiByaWdodCwgMik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfY3M0MzQxKHN0cnVjdCBzYWE3MTQ2ICpzYWEpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7CisJCS8qIGF1dG8gbXV0ZSBvZmYsIHBvd2VyIG9uLCBubyBkZS1lbXBoYXNpcyAqLworCQkvKiBJMlMgZGF0YSB1cCB0byAyNC1iaXQgNjR4RnMgaW50ZXJuYWwgU0NMSyAqLworCQlJMkNXcml0ZShzYWEsIDB4MjIsIDB4MDEsIDB4MTEsIDIpOworCQkvKiBBVEFQSSBtaXhlciBzZXR0aW5ncyAqLworCQlJMkNXcml0ZShzYWEsIDB4MjIsIDB4MDIsIDB4NDksIDIpOworCQkvKiBhdHRlbnVhdGlvbiBsZWZ0IDNkYiAqLworCQlJMkNXcml0ZShzYWEsIDB4MjIsIDB4MDMsIDB4MDAsIDIpOworCQkvKiBhdHRlbnVhdGlvbiByaWdodCAzZGIgKi8KKwkJSTJDV3JpdGUoc2FhLCAweDIyLCAweDA0LCAweDAwLCAyKTsKKwkJSTJDV3JpdGUoc2FhLCAweDIyLCAweDAxLCAweDEwLCAyKTsKKwkJaWYgKEkyQ1JlYWQoc2FhLCAweDIyLCAweDAyLCAxKSA9PSAweDQ5KQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCXByaW50aygic3RyYWRpcyVkOiBDUzQzNDEgaW5pdGlhbGl6ZWQgKCVkKVxuIiwgc2FhLT5uciwgaSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX2NzODQyMChzdHJ1Y3Qgc2FhNzE0NiAqc2FhLCBpbnQgcHJvKQoreworCWludCBpOworCXU4ICpzZXF1ZW5jZTsKKwlpZiAocHJvKQorCQlzZXF1ZW5jZSA9IG1vZGU4NDIwcHJvOworCWVsc2UKKwkJc2VxdWVuY2UgPSBtb2RlODQyMGNvbjsKKwlmb3IgKGkgPSAwOyBpIDwgSU5JVDg0MjBMRU47IGkrKykKKwkJSTJDV3JpdGUoc2FhLCAweDIwLCBpbml0ODQyMFtpICogMl0sCisJCQkgaW5pdDg0MjBbaSAqIDIgKyAxXSwgMik7CisJZm9yIChpID0gMDsgaSA8IE1PREU4NDIwTEVOOyBpKyspCisJCUkyQ1dyaXRlKHNhYSwgMHgyMCwgc2VxdWVuY2VbaSAqIDJdLAorCQkJIHNlcXVlbmNlW2kgKiAyICsgMV0sIDIpOworCXByaW50aygic3RyYWRpcyVkOiBDUzg0MjAgaW5pdGlhbGl6ZWRcbiIsIHNhYS0+bnIpOworfQorCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX3NhYTcxMjEoc3RydWN0IHNhYTcxNDYgKnNhYSwgaW50IGRvcGFsKQoreworCWludCBpLCBtb2Q7CisJdTggKnNlcXVlbmNlOworCWlmIChkb3BhbCkKKwkJc2VxdWVuY2UgPSBpbml0NzEyMXBhbDsKKwllbHNlCisJCXNlcXVlbmNlID0gaW5pdDcxMjFudHNjOworCW1vZCA9IHNhYXJlYWQoU0FBNzE0Nl9QU1IpICYgMHgwODsKKwkvKiBpbml0aWFsaXplIFBBTC9OVFNDIHZpZGVvIGVuY29kZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSU5JVDcxMjFMRU47IGkrKykgeworCQlpZiAoTmV3Q2FyZCkgewkvKiBoYW5kbGUgbmV3IGNhcmQgZW5jb2RlciBkaWZmZXJlbmNlcyAqLworCQkJaWYgKHNlcXVlbmNlW2kqMl0gPT0gMHgzYSkKKwkJCQlJMkNXcml0ZShzYWEsIDB4ODgsIDB4M2EsIDB4MTMsIDIpOworCQkJZWxzZSBpZiAoc2VxdWVuY2VbaSoyXSA9PSAweDZiKQorCQkJCUkyQ1dyaXRlKHNhYSwgMHg4OCwgMHg2YiwgMHgyMCwgMik7CisJCQllbHNlIGlmIChzZXF1ZW5jZVtpKjJdID09IDB4NmMpCisJCQkJSTJDV3JpdGUoc2FhLCAweDg4LCAweDZjLAorCQkJCQkgZG9wYWwgPyAweDA5IDogMHhmNSwgMik7CisJCQllbHNlIGlmIChzZXF1ZW5jZVtpKjJdID09IDB4NmQpCisJCQkJSTJDV3JpdGUoc2FhLCAweDg4LCAweDZkLAorCQkJCQkgZG9wYWwgPyAweDIwIDogMHgwMCwgMik7CisJCQllbHNlIGlmIChzZXF1ZW5jZVtpKjJdID09IDB4N2EpCisJCQkJSTJDV3JpdGUoc2FhLCAweDg4LCAweDdhLAorCQkJCQkgZG9wYWwgPyAoUEFMRmlyc3RBY3RpdmUgLSAxKSA6CisJCQkJCSAoTlRTQ0ZpcnN0QWN0aXZlIC0gNCksIDIpOworCQkJZWxzZSBpZiAoc2VxdWVuY2VbaSoyXSA9PSAweDdiKQorCQkJCUkyQ1dyaXRlKHNhYSwgMHg4OCwgMHg3YiwKKwkJCQkJIGRvcGFsID8gUEFMTGFzdEFjdGl2ZSA6CisJCQkJCSBOVFNDTGFzdEFjdGl2ZSwgMik7CisJCQllbHNlIEkyQ1dyaXRlKHNhYSwgMHg4OCwgc2VxdWVuY2VbaSAqIDJdLAorCQkJCSBzZXF1ZW5jZVtpICogMiArIDFdLCAyKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzZXF1ZW5jZVtpKjJdID09IDB4NmIgJiYgbW9kKQorCQkJCUkyQ1dyaXRlKHNhYSwgMHg4OCwgMHg2YiwgCisJCQkJCShzZXF1ZW5jZVtpICogMiArIDFdIF4gMHgwOSksIDIpOworCQkJZWxzZSBpZiAoc2VxdWVuY2VbaSoyXSA9PSAweDdhKQorCQkJCUkyQ1dyaXRlKHNhYSwgMHg4OCwgMHg3YSwKKwkJCQkJIGRvcGFsID8gKFBBTEZpcnN0QWN0aXZlIC0gMSkgOgorCQkJCQkgKE5UU0NGaXJzdEFjdGl2ZSAtIDQpLCAyKTsKKwkJCWVsc2UgaWYgKHNlcXVlbmNlW2kqMl0gPT0gMHg3YikKKwkJCQlJMkNXcml0ZShzYWEsIDB4ODgsIDB4N2IsCisJCQkJCSBkb3BhbCA/IFBBTExhc3RBY3RpdmUgOgorCQkJCQkgTlRTQ0xhc3RBY3RpdmUsIDIpOworCQkJZWxzZQorCQkJCUkyQ1dyaXRlKHNhYSwgMHg4OCwgc2VxdWVuY2VbaSAqIDJdLAorCQkJCQkgc2VxdWVuY2VbaSAqIDIgKyAxXSwgMik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9nZW5sb2NrX29mZnNldChzdHJ1Y3Qgc2FhNzE0NiAqc2FhLCBpbnQgbm9mZnNldCkKK3sKKwlpbnQgbkNvZGU7CisJaW50IFBpeGVsc1BlckxpbmUgPSA4NTg7CisJaWYgKEN1cnJlbnRNb2RlID09IFZJREVPX01PREVfUEFMKQorCQlQaXhlbHNQZXJMaW5lID0gODY0OworCWlmIChub2Zmc2V0ID4gNTAwKQorCQlub2Zmc2V0ID0gNTAwOworCWVsc2UgaWYgKG5vZmZzZXQgPCAtNTAwKQorCQlub2Zmc2V0ID0gLTUwMDsKKwluQ29kZSA9IG5vZmZzZXQgKyAweDEwMDsKKwlpZiAobkNvZGUgPT0gMSkKKwkJbkNvZGUgPSAweDQwMTsKKwllbHNlIGlmIChuQ29kZSA8IDEpIG5Db2RlID0gMHg0MDAgKyBQaXhlbHNQZXJMaW5lICsgbkNvZGU7CisJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBYSUxJTlhfR0xERUxBWSwgbkNvZGUsIDIpOworfQorCitzdGF0aWMgdm9pZCBzZXRfb3V0X2Zvcm1hdChzdHJ1Y3Qgc2FhNzE0NiAqc2FhLCBpbnQgbW9kZSkKK3sKKwlpbml0aWFsaXplX3NhYTcxMjEoc2FhLCAobW9kZSA9PSBWSURFT19NT0RFX05UU0MgPyAwIDogMSkpOworCXNhYS0+Ym9hcmRjZmdbMl0gPSBtb2RlOworCS8qIGRvIG5vdCBhZGp1c3QgYW5hbG9nIHZpZGVvIHBhcmFtZXRlcnMgaGVyZSwgdXNlIHNhYTcxMjEgaW5pdCAqLworCS8qIHlvdSB3aWxsIGFmZmVjdCB0aGUgU0RJIG91dHB1dCBvbiB0aGUgbmV3IGNhcmQgKi8KKwlpZiAobW9kZSA9PSBWSURFT19NT0RFX1BBTCkgewkJLyogUEFMICovCisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NUTDAsIDB4MDgwOCwgMik7CisJCW1kZWxheSg1MCk7CisJCXNhYXdyaXRlKDB4MDEyMDAyYzAsIFNBQTcxNDZfTlVNX0xJTkVfQllURTEpOworCQlpZiAoTmV3Q2FyZCkgeworCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0RJU1BfTU9ERSwKKwkJCQkgIDB4ZTEwMCwgMik7CisJCQltZGVsYXkoNTApOworCQl9CisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9ESVNQX01PREUsCisJCQkgIE5ld0NhcmQgPyAweGU1MDA6IDB4NjUwMCwgMik7CisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9ESVNQX0RMWSwKKwkJCSAgKDEgPDwgOCkgfAorCQkJICAoTmV3Q2FyZCA/IFBBTEZpcnN0QWN0aXZlIDogUEFMRmlyc3RBY3RpdmUtNiksIDIpOworCX0gZWxzZSB7CQkvKiBOVFNDICovCisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NUTDAsIDB4MDgwMCwgMik7CisJCW1kZWxheSg1MCk7CisJCXNhYXdyaXRlKDB4MDBmMDAyYzAsIFNBQTcxNDZfTlVNX0xJTkVfQllURTEpOworCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfRElTUF9NT0RFLAorCQkJICBOZXdDYXJkID8gMHhlMTAwOiAweDYxMDAsIDIpOworCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfRElTUF9ETFksCisJCQkgICgxIDw8IDgpIHwKKwkJCSAgKE5ld0NhcmQgPyBOVFNDRmlyc3RBY3RpdmUgOiBOVFNDRmlyc3RBY3RpdmUtNiksIDIpOworCX0KK30KKworCisvKiBJbnRpYWxpemUgYml0bWFuZ2xlciB0byBtYXAgZnJvbSBhIGJ5dGUgdmFsdWUgdG8gdGhlIG1hbmdsZWQgd29yZCB0aGF0CisgKiBtdXN0IGJlIG91dHB1dCB0byBwcm9ncmFtIHRoZSBYaWxpbnggcGFydCB0aHJvdWdoIHRoZSBERUJJIHBvcnQuCisgKiBYaWxpbnggRGF0YSBCaXQtPkRFQkkgQml0OiAwLT4xNSAxLT43IDItPjYgMy0+MTIgNC0+MTEgNS0+MiA2LT4xIDctPjAKKyAqIHRyYW5zZmVyIEZQR0EgY29kZSwgaW5pdCBJQk0gY2hpcCwgdHJhbnNmZXIgSUJNIG1pY3JvY29kZQorICogcmV2MiBjYXJkIG1hbmdsZXM6IDAtPjcgMS0+NiAyLT41IDMtPjQgNC0+MyA1LT4yIDYtPjEgNy0+MAorICovCitzdGF0aWMgdTE2IGJpdG1hbmdsZXJbMjU2XTsKKworc3RhdGljIGludCBpbml0aWFsaXplX2ZwZ2Eoc3RydWN0IHZpZGVvX2NvZGUgKmJpdGRhdGEpCit7CisJaW50IGksIG51bSwgc3RhcnRpbmRleCwgZmFpbHVyZSA9IDAsIGxvYWR0d28sIGxvYWRmaWxlID0gMDsKKwl1MTYgKmRtYWJ1ZjsKKwl1OCAqbmV3ZG1hOworCXN0cnVjdCBzYWE3MTQ2ICpzYWE7CisKKwkvKiB2ZXJpZnkgZnBnYSBjb2RlICovCisJZm9yIChzdGFydGluZGV4ID0gMDsgc3RhcnRpbmRleCA8IGJpdGRhdGEtPmRhdGFzaXplOyBzdGFydGluZGV4KyspCisJCWlmIChiaXRkYXRhLT5kYXRhW3N0YXJ0aW5kZXhdID09IDI1NSkKKwkJCWJyZWFrOworCWlmIChzdGFydGluZGV4ID09IGJpdGRhdGEtPmRhdGFzaXplKSB7CisJCXByaW50ayhLRVJOX0lORk8gInN0cmFkaXM6IGJhZCBmcGdhIGNvZGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIGluaXRpYWxpemUgYWxsIGRldGVjdGVkIGNhcmRzICovCisJZm9yIChudW0gPSAwOyBudW0gPCBzYWFfbnVtOyBudW0rKykgeworCQlzYWEgPSAmc2FhNzE0NnNbbnVtXTsKKwkJaWYgKHNhYS0+Ym9hcmRjZmdbMF0gPiAyMCkKKwkJCQljb250aW51ZTsJLyogY2FyZCB3YXMgcHJvZ3JhbW1lZCAqLworCQlsb2FkdHdvID0gKHNhYS0+Ym9hcmRjZmdbMThdICYgMHgxMCk7CisJCWlmICghTmV3Q2FyZCkJLyogd2UgaGF2ZSBhbiBvbGQgYm9hcmQgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCSAgICBiaXRtYW5nbGVyW2ldID0gKChpICYgMHgwMSkgPDwgMTUpIHwKKwkJCQkoKGkgJiAweDAyKSA8PCA2KSB8ICgoaSAmIDB4MDQpIDw8IDQpIHwKKwkJCQkoKGkgJiAweDA4KSA8PCA5KSB8ICgoaSAmIDB4MTApIDw8IDcpIHwKKwkJCQkoKGkgJiAweDIwKSA+PiAzKSB8ICgoaSAmIDB4NDApID4+IDUpIHwKKwkJCQkoKGkgJiAweDgwKSA+PiA3KTsKKwkJZWxzZQkvKiBlbHNlIHdlIGhhdmUgYSBuZXcgYm9hcmQgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCSAgICBiaXRtYW5nbGVyW2ldID0gKChpICYgMHgwMSkgPDwgNykgfAorCQkJCSgoaSAmIDB4MDIpIDw8IDUpIHwgKChpICYgMHgwNCkgPDwgMykgfAorCQkJCSgoaSAmIDB4MDgpIDw8IDEpIHwgKChpICYgMHgxMCkgPj4gMSkgfAorCQkJCSgoaSAmIDB4MjApID4+IDMpIHwgKChpICYgMHg0MCkgPj4gNSkgfAorCQkJCSgoaSAmIDB4ODApID4+IDcpOworCisJCWRtYWJ1ZiA9ICh1MTYgKikgc2FhLT5kbWFkZWJpOworCQluZXdkbWEgPSAodTggKikgc2FhLT5kbWFkZWJpOworCQlpZiAoTmV3Q2FyZCkgewkvKiBTRE0yeHh4ICovCisJCQlpZiAoIXN0cm5jbXAoYml0ZGF0YS0+bG9hZHdoYXQsICJkZWNvZGVyMiIsIDgpKQorCQkJCWNvbnRpbnVlOwkvKiBmcGdhIG5vdCBmb3IgdGhpcyBjYXJkICovCisJCQlpZiAoIXN0cm5jbXAoJnNhYS0+Ym9hcmRjZmdbNDJdLAorCQkJCSAgICAgYml0ZGF0YS0+bG9hZHdoYXQsIDgpKSB7CisJCQkJbG9hZGZpbGUgPSAxOworCQkJfSBlbHNlIGlmIChsb2FkdHdvICYmICFzdHJuY21wKCZzYWEtPmJvYXJkY2ZnWzE5XSwKKwkJCQkgICBiaXRkYXRhLT5sb2Fkd2hhdCwgOCkpIHsKKwkJCQlsb2FkZmlsZSA9IDI7CisJCQl9IGVsc2UgaWYgKCFzYWEtPmJvYXJkY2ZnWzQyXSAmJgkvKiBzcGVjaWFsICovCisJCQkJICAgIXN0cm5jbXAoImRlY3hsIiwgYml0ZGF0YS0+bG9hZHdoYXQsIDgpKSB7CisJCQkJbG9hZGZpbGUgPSAxOworCQkJfSBlbHNlCisJCQkJY29udGludWU7CS8qIGZwZ2Egbm90IGZvciB0aGlzIGNhcmQgKi8KKwkJCWlmIChsb2FkZmlsZSAhPSAxICYmIGxvYWRmaWxlICE9IDIpIHsKKwkJCQljb250aW51ZTsJLyogc2tpcCB0byBuZXh0IGNhcmQgKi8KKwkJCX0KKwkJCWlmIChzYWEtPmJvYXJkY2ZnWzBdICYmIGxvYWRmaWxlID09IDEgKQorCQkJCWNvbnRpbnVlOwkvKiBza2lwIHRvIG5leHQgY2FyZCAqLworCQkJaWYgKHNhYS0+Ym9hcmRjZmdbMF0gIT0gMSAmJiBsb2FkZmlsZSA9PSAyKQorCQkJCWNvbnRpbnVlOwkvKiBza2lwIHRvIG5leHQgY2FyZCAqLworCQkJc2FhLT5ib2FyZGNmZ1swXSsrOwkvKiBtYXJrIGZwZ2EgaGFuZGxlZCAqLworCQkJcHJpbnRrKCJzdHJhZGlzJWQ6IGxvYWRpbmcgJXNcbiIsIHNhYS0+bnIsCisJCQkJYml0ZGF0YS0+bG9hZHdoYXQpOworCQkJaWYgKGxvYWR0d28gJiYgbG9hZGZpbGUgPT0gMikKKwkJCQlnb3RvIHNlbmRfZnBnYV9zdHVmZjsKKwkJCS8qIHR1cm4gb24gdGhlIEF1ZGlvIGludGVyZmFjZSB0byBzZXQgUFJPRyBsb3cgKi8KKwkJCXNhYXdyaXRlKDB4MDA0MDAwNDAsIFNBQTcxNDZfR1BJT19DVFJMKTsKKwkJCXNhYXJlYWQoU0FBNzE0Nl9QU1IpOwkvKiBlbnN1cmUgcG9zdGVkIHdyaXRlICovCisJCQkvKiB3YWl0IGZvciBldmVyeW9uZSB0byByZXNldCAqLworCQkJbWRlbGF5KDEwKTsKKwkJCXNhYXdyaXRlKDB4MDA0MDAwMDAsIFNBQTcxNDZfR1BJT19DVFJMKTsKKwkJfSBlbHNlIHsJLyogb3JpZ2luYWwgY2FyZCAqLworCQkJaWYgKHN0cm5jbXAoYml0ZGF0YS0+bG9hZHdoYXQsICJkZWNvZGVyMiIsIDgpKQorCQkJCWNvbnRpbnVlOwkvKiBmcGdhIG5vdCBmb3IgdGhpcyBjYXJkICovCisJCQkvKiBQdWxsIHRoZSBYaWxpbnggUFJPRyBzaWduYWwgV1MzIGxvdyAqLworCQkJc2Fhd3JpdGUoMHgwMjAwMDIwMCwgU0FBNzE0Nl9NQzEpOworCQkJLyogVHVybiBvbiB0aGUgQXVkaW8gaW50ZXJmYWNlIHNvIGNhbiBzZXQgUFJPRyBsb3cgKi8KKwkJCXNhYXdyaXRlKDB4MDAwMDAwYzAsIFNBQTcxNDZfQUNPTjEpOworCQkJLyogUHVsbCB0aGUgWGlsaW54IElOSVQgc2lnbmFsIChHUElPMikgbG93ICovCisJCQlzYWF3cml0ZSgweDAwNDAwMDAwLCBTQUE3MTQ2X0dQSU9fQ1RSTCk7CisJCQkvKiBNYWtlIHN1cmUgZXZlcnlib2R5IHJlc2V0cyAqLworCQkJc2FhcmVhZChTQUE3MTQ2X1BTUik7CS8qIGVuc3VyZSBwb3N0ZWQgd3JpdGUgKi8KKwkJCW1kZWxheSgxMCk7CisJCQkvKiBSZWxlYXNlIHRoZSBYaWxpbnggUFJPRyBzaWduYWwgKi8KKwkJCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfQUNPTjEpOworCQkJLyogVHVybiBvZmYgdGhlIEF1ZGlvIGludGVyZmFjZSAqLworCQkJc2Fhd3JpdGUoMHgwMjAwMDAwMCwgU0FBNzE0Nl9NQzEpOworCQl9CisJCS8qIFJlbGVhc2UgWGlsaW54IElOSVQgc2lnbmFsIChXUzIpICovCisJCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfR1BJT19DVFJMKTsKKwkJLyogV2FpdCBmb3IgdGhlIElOSVQgdG8gZ28gSGlnaCAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDAgJiYKKwkJICAgICAhKHNhYXJlYWQoU0FBNzE0Nl9QU1IpICYgU0FBNzE0Nl9QU1JfUElOMik7IGkrKykKKwkJCXNjaGVkdWxlKCk7CisJCWlmIChpID09IDEwMDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInN0cmFkaXMlZDogbm8gZnBnYSBJTklUXG4iLCBzYWEtPm5yKTsKKwkJCXJldHVybiAtMTsKKwkJfQorc2VuZF9mcGdhX3N0dWZmOgorCQlpZiAoTmV3Q2FyZCkgeworCQkJZm9yIChpID0gc3RhcnRpbmRleDsgaSA8IGJpdGRhdGEtPmRhdGFzaXplOyBpKyspCisJCQkJbmV3ZG1hW2kgLSBzdGFydGluZGV4XSA9CisJCQkJCWJpdG1hbmdsZXJbYml0ZGF0YS0+ZGF0YVtpXV07CisJCQlkZWJpd3JpdGUoc2FhLCAweDAxNDIwMDAwLCAwLCAwLAorCQkJCSgoYml0ZGF0YS0+ZGF0YXNpemUgLSBzdGFydGluZGV4KSArIDUpKTsKKwkJCWlmIChsb2FkdHdvKSB7CisJCQkJaWYgKGxvYWRmaWxlID09IDEpIHsKKwkJCQkJcHJpbnRrKCJzdHJhZGlzJWQ6ICIKKwkJCQkJCSJhd2FpdGluZyAybmQgRlBHQSBiaXRmaWxlXG4iLAorCQkJCQkJc2FhLT5ucik7CisJCQkJCWNvbnRpbnVlOwkvKiBza2lwIHRvIG5leHQgY2FyZCAqLworCQkJCX0KKworCQkJfQorCQl9IGVsc2UgeworCQkJZm9yIChpID0gc3RhcnRpbmRleDsgaSA8IGJpdGRhdGEtPmRhdGFzaXplOyBpKyspCisJCQkJZG1hYnVmW2kgLSBzdGFydGluZGV4XSA9CisJCQkJCWJpdG1hbmdsZXJbYml0ZGF0YS0+ZGF0YVtpXV07CisJCQlkZWJpd3JpdGUoc2FhLCAweDAxNGEwMDAwLCAwLCAwLAorCQkJCSgoYml0ZGF0YS0+ZGF0YXNpemUgLSBzdGFydGluZGV4KSArIDUpICogMik7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IDEwMDAgJiYKKwkJICAgICAhKHNhYXJlYWQoU0FBNzE0Nl9QU1IpICYgU0FBNzE0Nl9QU1JfUElOMik7IGkrKykKKwkJCXNjaGVkdWxlKCk7CisJCWlmIChpID09IDEwMDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInN0cmFkaXMlZDogRlBHQSBsb2FkIGZhaWxlZFxuIiwKKwkJCSAgICAgICBzYWEtPm5yKTsKKwkJCWZhaWx1cmUrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghTmV3Q2FyZCkgeworCQkJLyogUHVsbCB0aGUgWGlsaW54IElOSVQgc2lnbmFsIChHUElPMikgbG93ICovCisJCQlzYWF3cml0ZSgweDAwNDAwMDAwLCBTQUE3MTQ2X0dQSU9fQ1RSTCk7CisJCQlzYWFyZWFkKFNBQTcxNDZfUFNSKTsJLyogZW5zdXJlIHBvc3RlZCB3cml0ZSAqLworCQkJbWRlbGF5KDIpOworCQkJc2Fhd3JpdGUoMHgwMDAwMDAwMCwgU0FBNzE0Nl9HUElPX0NUUkwpOworCQkJbWRlbGF5KDIpOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gInN0cmFkaXMlZDogRlBHQSBMb2FkZWRcbiIsIHNhYS0+bnIpOworCQlzYWEtPmJvYXJkY2ZnWzBdID0gMjY7CS8qIG1hcmsgZnBnYSBwcm9ncmFtbWVkICovCisJCS8qIHNldCBWWENPIHRvIGl0cyBsb3dlc3QgZnJlcXVlbmN5ICovCisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX1BXTSwgMCwgMik7CisJCWlmIChOZXdDYXJkKSB7CisJCQkvKiBtdXRlIENTMzMxMCAqLworCQkJaWYgKEhhdmVDUzMzMTApCisJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBYSUxJTlhfQ1MzMzEwX0NNUExULAorCQkJCQkgIDAsIDIpOworCQkJLyogc2V0IFZYQ08gdG8gUFdNIG1vZGUsIHJlbGVhc2UgcmVzZXQsIGJsYW5rIG9uICovCisJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIFhJTElOWF9DVEwwLCAweGZmYzQsIDIpOworCQkJbWRlbGF5KDEwKTsKKwkJCS8qIHVubXV0ZSBDUzMzMTAgKi8KKwkJCWlmIChIYXZlQ1MzMzEwKQorCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NUTDAsCisJCQkJCSAgMHgyMDIwLCAyKTsKKwkJfQorCQkvKiBzZXQgc291cmNlIEJsYWNrICovCisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NUTDAsIDB4MTcwNywgMik7CisJCXNhYS0+Ym9hcmRjZmdbNF0gPSAyMjsJLyogc2V0IE5UU0MgRmlyc3QgQWN0aXZlIExpbmUgKi8KKwkJc2FhLT5ib2FyZGNmZ1s1XSA9IDIzOwkvKiBzZXQgUEFMIEZpcnN0IEFjdGl2ZSBMaW5lICovCisJCXNhYS0+Ym9hcmRjZmdbNTRdID0gMjsJLyogc2V0IE5UU0MgTGFzdCBBY3RpdmUgTGluZSAtIDI1NiAqLworCQlzYWEtPmJvYXJkY2ZnWzU1XSA9IDU0OwkvKiBzZXQgUEFMIExhc3QgQWN0aXZlIExpbmUgLSAyNTYgKi8KKwkJc2V0X291dF9mb3JtYXQoc2FhLCBWSURFT19NT0RFX05UU0MpOworCQltZGVsYXkoNTApOworCQkvKiBiZWdpbiBJQk0gY2hpcCBpbml0ICovCisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9DSElQX0NPTlRST0wsIDQsIDIpOworCQlzYWFyZWFkKFNBQTcxNDZfUFNSKTsJLyogd2FpdCBmb3IgcmVzZXQgKi8KKwkJbWRlbGF5KDUpOworCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ0hJUF9DT05UUk9MLCAwLCAyKTsKKwkJZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ0hJUF9DT05UUk9MLCAyKTsKKwkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0NISVBfQ09OVFJPTCwgMHgxMCwgMik7CisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9DTURfQUREUiwgMCwgMik7CisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9DSElQX01PREUsIDB4MmUsIDIpOworCQlpZiAoTmV3Q2FyZCkgeworCQkJbWRlbGF5KDUpOworCQkJLyogc2V0IGkycyByYXRlIGNvbnZlcnRlciB0byA0OEtIeiAqLworCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCAweDgwYzAsIDYsIDIpOworCQkJLyogd2UgbXVzdCBpbml0IENTODQyMCBmaXJzdCBzaW5jZSByZXYgYiBwdWxscyBpMnMgKi8KKwkJCS8qIG1hc3RlciBjbG9jayBsb3cgYW5kIENTNDM0MSBuZWVkcyBpMnMgbWFzdGVyIHRvICovCisJCQkvKiBydW4gdGhlIGkyYyBwb3J0LiAqLworCQkJaWYgKEhhdmVDUzg0MjApIHsKKwkJCQkvKiAwPWNvbnN1bWVyLCAxPXBybyAqLworCQkJCWluaXRpYWxpemVfY3M4NDIwKHNhYSwgMCk7CisJCQl9CisJCQltZGVsYXkoNSk7CisJCQlpZiAoSGF2ZUNTNDM0MSkKKwkJCQlpbml0aWFsaXplX2NzNDM0MShzYWEpOworCQl9CisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9JTkZDX0NUTCwgMHg0OCwgMik7CisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9CRUVQX0NUTCwgMHhhMDAwLCAyKTsKKwkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0RJU1BfTEJPUiwgMCwgMik7CisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9ESVNQX1RCT1IsIDAsIDIpOworCQlpZiAoTmV3Q2FyZCkKKwkJCXNldF9nZW5sb2NrX29mZnNldChzYWEsIDApOworCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfRlJOVF9BVFRFTiwgMCwgMik7CisjaWYgMAorCQkvKiBlbmFibGUgZ2VubG9jayAqLworCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIFhJTElOWF9DVEwwLCAweDgwMDAsIDIpOworI2Vsc2UKKwkJLyogZGlzYWJsZSBnZW5sb2NrICovCisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NUTDAsIDB4ODA4MCwgMik7CisjZW5kaWYKKwl9CisJcmV0dXJuIGZhaWx1cmU7Cit9CisKK3N0YXRpYyBpbnQgZG9faWJtX3Jlc2V0KHN0cnVjdCBzYWE3MTQ2ICpzYWEpCit7CisJLyogZmFpbHVyZSBpZiBkZWNvZGVyIG5vdCBwcmV2aW91c2x5IHByb2dyYW1tZWQgKi8KKwlpZiAoc2FhLT5ib2FyZGNmZ1swXSA8IDM3KQorCQlyZXR1cm4gLUVJTzsKKwkvKiBtdXRlIENTMzMxMCAqLworCWlmIChIYXZlQ1MzMzEwKQorCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIFhJTElOWF9DUzMzMTBfQ01QTFQsIDAsIDIpOworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXNhYXdyaXRlKDAsIFNBQTcxNDZfSUVSKTsKKwlzYWEtPmF1ZGhlYWQgPSBzYWEtPmF1ZHRhaWwgPSAwOworCXNhYS0+dmlkaGVhZCA9IHNhYS0+dmlkdGFpbCA9IDA7CisJLyogdHJpc3RhdGUgZGViaSBidXMsIGRpc2FibGUgZGViaSB0cmFuc2ZlcnMgKi8KKwlzYWF3cml0ZSgweDAwODgwMDAwLCBTQUE3MTQ2X01DMSk7CisJLyogZW5zdXJlIHBvc3RlZCB3cml0ZSAqLworCXNhYXJlYWQoU0FBNzE0Nl9NQzEpOworCW1kZWxheSg1MCk7CisJLyogcmUtZW5hYmxlIGRlYmkgdHJhbnNmZXJzICovCisJc2Fhd3JpdGUoMHgwMDg4MDA4OCwgU0FBNzE0Nl9NQzEpOworCS8qIHNldCBzb3VyY2UgQmxhY2sgKi8KKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIFhJTElOWF9DVEwwLCAweDE3MDcsIDIpOworCS8qIGJlZ2luIElCTSBjaGlwIGluaXQgKi8KKwlzZXRfb3V0X2Zvcm1hdChzYWEsIEN1cnJlbnRNb2RlKTsKKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ0hJUF9DT05UUk9MLCA0LCAyKTsKKwlzYWFyZWFkKFNBQTcxNDZfUFNSKTsJLyogd2FpdCBmb3IgcmVzZXQgKi8KKwltZGVsYXkoNSk7CisJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0NISVBfQ09OVFJPTCwgMCwgMik7CisJZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ0hJUF9DT05UUk9MLCAyKTsKKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ0hJUF9DT05UUk9MLCBDaGlwQ29udHJvbCwgMik7CisJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0NISVBfTU9ERSwgMHgyZSwgMik7CisJaWYgKE5ld0NhcmQpIHsKKwkJbWRlbGF5KDUpOworCQkvKiBzZXQgaTJzIHJhdGUgY29udmVydGVyIHRvIDQ4S0h6ICovCisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgMHg4MGMwLCA2LCAyKTsKKwkJLyogd2UgbXVzdCBpbml0IENTODQyMCBmaXJzdCBzaW5jZSByZXYgYiBwdWxscyBpMnMgKi8KKwkJLyogbWFzdGVyIGNsb2NrIGxvdyBhbmQgQ1M0MzQxIG5lZWRzIGkycyBtYXN0ZXIgdG8gKi8KKwkJLyogcnVuIHRoZSBpMmMgcG9ydC4gKi8KKwkJaWYgKEhhdmVDUzg0MjApIHsKKwkJCS8qIDA9Y29uc3VtZXIsIDE9cHJvICovCisJCQlpbml0aWFsaXplX2NzODQyMChzYWEsIDEpOworCQl9CisJCW1kZWxheSg1KTsKKwkJaWYgKEhhdmVDUzQzNDEpCisJCQlpbml0aWFsaXplX2NzNDM0MShzYWEpOworCX0KKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfSU5GQ19DVEwsIDB4NDgsIDIpOworCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9CRUVQX0NUTCwgMHhhMDAwLCAyKTsKKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfRElTUF9MQk9SLCAwLCAyKTsKKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfRElTUF9UQk9SLCAwLCAyKTsKKwlpZiAoTmV3Q2FyZCkKKwkJc2V0X2dlbmxvY2tfb2Zmc2V0KHNhYSwgMCk7CisJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0ZSTlRfQVRURU4sIDAsIDIpOworCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9PU0RfU0laRSwgMHgyMDAwLCAyKTsKKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQVVEX0NUTCwgMHg0NTUyLCAyKTsKKwlpZiAoaWJtX3NlbmRfY29tbWFuZChzYWEsIElCTV9NUDJfQ09ORklHX0RFQ09ERVIsCisJCShDaGlwQ29udHJvbCA9PSAweDQzID8gMHhlODAwIDogMHhlMDAwKSwgMSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdHJhZGlzJWQ6IElCTSBjb25maWcgZmFpbGVkXG4iLCBzYWEtPm5yKTsKKwl9CisJaWYgKEhhdmVDUzMzMTApIHsKKwkJaW50IGkgPSBDUzMzMTBNYXhMdmw7CisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NTMzMxMF9DTVBMVCwgKChpPDw4KXxpKSwgMik7CisJfQorCS8qIHN0YXJ0IHZpZGVvIGRlY29kZXIgKi8KKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ0hJUF9DT05UUk9MLCBDaGlwQ29udHJvbCwgMik7CisJLyogMjU2ayB2aWQsIDM1MjAgYnl0ZXMgYXVkICovCisJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX1JCX1RIUkVTSE9MRCwgMHg0MDM3LCAyKTsKKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQVVEX0NUTCwgMHg0NTczLCAyKTsKKwlpYm1fc2VuZF9jb21tYW5kKHNhYSwgSUJNX01QMl9QTEFZLCAwLCAwKTsKKwkvKiBlbmFibGUgYnVmZmVyIHRocmVzaG9sZCBpcnEgKi8KKwlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfTUFTSzAsIDB4YzAwYywgMik7CisJLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfSE9TVF9JTlQsIDIpOworCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NUTDAsIDB4MTcxMSwgMik7CisJcmV0dXJuIDA7Cit9CisKKy8qIGxvYWQgdGhlIGRlY29kZXIgbWljcm9jb2RlICovCitzdGF0aWMgaW50IGluaXRpYWxpemVfaWJtbXBlZzIoc3RydWN0IHZpZGVvX2NvZGUgKm1pY3JvY29kZSkKK3sKKwlpbnQgaSwgbnVtOworCXN0cnVjdCBzYWE3MTQ2ICpzYWE7CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IHNhYV9udW07IG51bSsrKSB7CisJCXNhYSA9ICZzYWE3MTQ2c1tudW1dOworCQkvKiBjaGVjayB0aGF0IEZQR0EgaXMgbG9hZGVkICovCisJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9PU0RfU0laRSwgMHhhNTVhLCAyKTsKKwkJaWYgKChpID0gZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfT1NEX1NJWkUsIDIpKSAhPQorCQkgICAgIDB4YTU1YSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic3RyYWRpcyVkOiAlMDR4ICE9IDB4YTU1YVxuIiwKKwkJCQlzYWEtPm5yLCBpKTsKKyNpZiAwCisJCQlyZXR1cm4gLTE7CisjZW5kaWYKKwkJfQorCQlpZiAoIXN0cm5jbXAobWljcm9jb2RlLT5sb2Fkd2hhdCwgImRlY29kZXIudmlkIiwgMTEpKSB7CisJCQlpZiAoc2FhLT5ib2FyZGNmZ1swXSA+IDI3KQorCQkJCWNvbnRpbnVlOwkvKiBza2lwIHRvIG5leHQgY2FyZCAqLworCQkJLyogbG9hZCB2aWRlbyBjb250cm9sIHN0b3JlICovCisJCQlzYWEtPmJvYXJkY2ZnWzFdID0gMHgxMzsgIC8qIG5vLXN5bmMgZGVmYXVsdCAqLworCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX1dSX1BST1QsIDEsIDIpOworCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX1BST0NfSUFERFIsIDAsIDIpOworCQkJZm9yIChpID0gMDsgaSA8IG1pY3JvY29kZS0+ZGF0YXNpemUgLyAyOyBpKyspCisJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX1BST0NfSURBVEEsCisJCQkJCShtaWNyb2NvZGUtPmRhdGFbaSAqIDJdIDw8IDgpIHwKKwkJCQkJIG1pY3JvY29kZS0+ZGF0YVtpICogMiArIDFdLCAyKTsKKwkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9QUk9DX0lBRERSLCAwLCAyKTsKKwkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9XUl9QUk9ULCAwLCAyKTsKKwkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9DSElQX0NPTlRST0wsCisJCQkJICBDaGlwQ29udHJvbCwgMik7CisJCQlzYWEtPmJvYXJkY2ZnWzBdID0gMjg7CisJCX0KKwkJaWYgKCFzdHJuY21wKG1pY3JvY29kZS0+bG9hZHdoYXQsICJkZWNvZGVyLmF1ZCIsIDExKSkgeworCQkJaWYgKHNhYS0+Ym9hcmRjZmdbMF0gPiAzNSkKKwkJCQljb250aW51ZTsJLyogc2tpcCB0byBuZXh0IGNhcmQgKi8KKwkJCS8qIGxvYWQgYXVkaW8gY29udHJvbCBzdG9yZSAqLworCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX1dSX1BST1QsIDEsIDIpOworCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0FVRF9JQUREUiwgMCwgMik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbWljcm9jb2RlLT5kYXRhc2l6ZTsgaSsrKQorCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9BVURfSURBVEEsCisJCQkJCW1pY3JvY29kZS0+ZGF0YVtpXSwgMSk7CisJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQVVEX0lBRERSLCAwLCAyKTsKKwkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9XUl9QUk9ULCAwLCAyKTsKKwkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9PU0RfU0laRSwgMHgyMDAwLCAyKTsKKwkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9BVURfQ1RMLCAweDQ1NTIsIDIpOworCQkJaWYgKGlibV9zZW5kX2NvbW1hbmQoc2FhLCBJQk1fTVAyX0NPTkZJR19ERUNPREVSLAorCQkJICAgIDB4ZTAwMCwgMSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgInN0cmFkaXMlZDogSUJNIGNvbmZpZyBmYWlsZWRcbiIsCisJCQkJICAgICAgIHNhYS0+bnIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCS8qIHNldCBQV00gdG8gY2VudGVyIHZhbHVlICovCisJCQlpZiAoTmV3Q2FyZCkgeworCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX1BXTSwKKwkJCQkJICBzYWEtPmJvYXJkY2ZnWzE0XSArCisJCQkJCSAgKHNhYS0+Ym9hcmRjZmdbMTNdPDw4KSwgMik7CisJCQl9IGVsc2UKKwkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIFhJTElOWF9QV00sCisJCQkJCSAgMHg0NiwgMik7CisJCQlpZiAoSGF2ZUNTMzMxMCkgeworCQkJCWkgPSBDUzMzMTBNYXhMdmw7CisJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLAorCQkJCQlYSUxJTlhfQ1MzMzEwX0NNUExULCAoKGk8PDgpfGkpLCAyKTsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAic3RyYWRpcyVkOiBJQk0gTVBFR0NEJWQgSW5pdGlhbGl6ZWRcbiIsCisJCQkgICAgICAgc2FhLT5uciwgMTggKyAoZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsCisJCQkgICAgICAgSUJNX01QMl9DSElQX0NPTlRST0wsIDIpID4+IDEyKSk7CisJCQkvKiBzdGFydCB2aWRlbyBkZWNvZGVyICovCisJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ0hJUF9DT05UUk9MLAorCQkJCUNoaXBDb250cm9sLCAyKTsKKwkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9SQl9USFJFU0hPTEQsCisJCQkJMHg0MDM3LCAyKTsJLyogMjU2ayB2aWQsIDM1MjAgYnl0ZXMgYXVkICovCisJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQVVEX0NUTCwgMHg0NTczLCAyKTsKKwkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLCBJQk1fTVAyX1BMQVksIDAsIDApOworCQkJLyogZW5hYmxlIGJ1ZmZlciB0aHJlc2hvbGQgaXJxICovCisJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfTUFTSzAsIDB4YzAwYywgMik7CisJCQlkZWJpcmVhZChzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9IT1NUX0lOVCwgMik7CisJCQkvKiBlbmFibGUgZ3BpbyBpcnEgKi8KKwkJCXNhYXdyaXRlKDB4MDAwMDIwMDAsIFNBQTcxNDZfR1BJT19DVFJMKTsKKwkJCS8qIGVuYWJsZSBkZWNvZGVyIG91dHB1dCB0byBIUFMgKi8KKwkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NUTDAsIDB4MTcxMSwgMik7CisJCQlzYWEtPmJvYXJkY2ZnWzBdID0gMzc7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgcGFsZXR0ZTJmbXRbXSA9Cit7CQkJCS8qIHNvbWUgb2YgdGhlc2UgWVVWIHRyYW5zbGF0aW9ucyBhcmUgd3JvbmcgKi8KKyAgMHhmZmZmZmZmZiwgMHg4NjAwMDAwMCwgMHg4NzAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MTAwMDAwLCAweDgyMDAwMDAwLAorICAweDgzMDAwMDAwLCAweDAwMDAwMDAwLCAweDAzMDAwMDAwLCAweDAzMDAwMDAwLCAweDBhMDAwMDAsIDB4MDMwMDAwMDAsCisgIDB4MDYwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDMwMDAwMDAsIDB4MGEwMDAwMDAsIDB4MDMwMDAwMAorfTsKK3N0YXRpYyBpbnQgYnBwMmZtdFs0XSA9Cit7CisJVklERU9fUEFMRVRURV9ISTI0MCwgVklERU9fUEFMRVRURV9SR0I1NjUsIFZJREVPX1BBTEVUVEVfUkdCMjQsCisJVklERU9fUEFMRVRURV9SR0IzMgorfTsKKworLyogSSB3aXNoIEkgY291bGQgZmluZCBhIGZvcm11bGEgdG8gY2FsY3VsYXRlIHRoZXNlLi4uICovCitzdGF0aWMgdTMyIGhfcHJlc2NhbGVbNjRdID0KK3sKKyAgMHgxMDAwMDAwMCwgMHgxODA0MDIwMiwgMHgxODA4MDAwMCwgMHgzODBjMDYwNiwgMHgzODEwMDIwNCwgMHgzODE0MDgwOCwKKyAgMHgzODE4MDAwMCwgMHgzODFjMDAwMCwgMHgzODIwMTYxYywgMHgzODI0MmEzYiwgMHgzODI4MTIzMCwgMHgzODJjNDQ2MCwKKyAgMHgzODMwMTA0MCwgMHgzODM0MDA4MCwgMHgzODM4MDAwMCwgMHgzODNjMDAwMCwgMHgzODQwZmVmZSwgMHgzODQ0ZWU5ZiwKKyAgMHgzODQ4ZWU5ZiwgMHgzODRjZWU5ZiwgMHgzODUwZWU5ZiwgMHgzODU0MmEzYiwgMHgzODU4MTIzMCwgMHgzODVjMDAwMCwKKyAgMHgzODYwMDAwMCwgMHgzODY0MDAwMCwgMHgzODY4MDAwMCwgMHgzODZjMDAwMCwgMHgzODcwMDAwMCwgMHgzODc0MDAwMCwKKyAgMHgzODc4MDAwMCwgMHgzODdjMDAwMCwgMHgzMDgwMDAwMCwgMHgzODg0MDAwMCwgMHgzODg4MDAwMCwgMHgzODhjMDAwMCwKKyAgMHgzODkwMDAwMCwgMHgzODk0MDAwMCwgMHgzODk4MDAwMCwgMHgzODljMDAwMCwgMHgzOGEwMDAwMCwgMHgzOGE0MDAwMCwKKyAgMHgzOGE4MDAwMCwgMHgzOGFjMDAwMCwgMHgzOGIwMDAwMCwgMHgzOGI0MDAwMCwgMHgzOGI4MDAwMCwgMHgzOGJjMDAwMCwKKyAgMHgzOGMwMDAwMCwgMHgzOGM0MDAwMCwgMHgzOGM4MDAwMCwgMHgzOGNjMDAwMCwgMHgzOGQwMDAwMCwgMHgzOGQ0MDAwMCwKKyAgMHgzOGQ4MDAwMCwgMHgzOGRjMDAwMCwgMHgzOGUwMDAwMCwgMHgzOGU0MDAwMCwgMHgzOGU4MDAwMCwgMHgzOGVjMDAwMCwKKyAgMHgzOGYwMDAwMCwgMHgzOGY0MDAwMCwgMHgzOGY4MDAwMCwgMHgzOGZjMDAwMCwKK307CitzdGF0aWMgdTMyIHZfZ2Fpbls2NF0gPQoreworICAweDAxNjAwMGZmLCAweDAxNjEwMGZmLCAweDAxNjEwMGZmLCAweDAxNjIwMGZmLCAweDAxNjIwMGZmLCAweDAxNjIwMGZmLAorICAweDAxNjIwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLAorICAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorfTsKKworCitzdGF0aWMgdm9pZCBzYWE3MTQ2X3NldF93aW5zaXplKHN0cnVjdCBzYWE3MTQ2ICpzYWEpCit7CisJdTMyIGZvcm1hdDsKKwlpbnQgb2Zmc2V0LCB5YWNsLCB5c2NpOworCXNhYS0+d2luLmNvbG9yX2ZtdCA9IGZvcm1hdCA9CisJICAgIChzYWEtPndpbi5kZXB0aCA9PSAxNSkgPyBwYWxldHRlMmZtdFtWSURFT19QQUxFVFRFX1JHQjU1NV0gOgorCSAgICBwYWxldHRlMmZtdFticHAyZm10WyhzYWEtPndpbi5icHAgLSAxKSAmIDNdXTsKKwlvZmZzZXQgPSBzYWEtPndpbi54ICogc2FhLT53aW4uYnBwICsgc2FhLT53aW4ueSAqIHNhYS0+d2luLmJwbDsKKwlzYWF3cml0ZShzYWEtPndpbi52aWRhZHIgKyBvZmZzZXQsIFNBQTcxNDZfQkFTRV9FVkVOMSk7CisJc2Fhd3JpdGUoc2FhLT53aW4udmlkYWRyICsgb2Zmc2V0ICsgc2FhLT53aW4uYnBsLCBTQUE3MTQ2X0JBU0VfT0REMSk7CisJc2Fhd3JpdGUoc2FhLT53aW4uYnBsICogMiwgU0FBNzE0Nl9QSVRDSDEpOworCXNhYXdyaXRlKHNhYS0+d2luLnZpZGFkciArIHNhYS0+d2luLmJwbCAqIHNhYS0+d2luLnNoZWlnaHQsCisJCSBTQUE3MTQ2X1BST1RfQUREUjEpOworCXNhYXdyaXRlKDAsIFNBQTcxNDZfUEFHRTEpOworCXNhYXdyaXRlKGZvcm1hdHwweDYwLCBTQUE3MTQ2X0NMSVBfRk9STUFUX0NUUkwpOworCW9mZnNldCA9ICg3MDQgLyAoc2FhLT53aW4ud2lkdGggLSAxKSkgJiAweDNmOworCXNhYXdyaXRlKGhfcHJlc2NhbGVbb2Zmc2V0XSwgU0FBNzE0Nl9IUFNfSF9QUkVTQ0FMRSk7CisJb2Zmc2V0ID0gKDcyMDg5NiAvIHNhYS0+d2luLndpZHRoKSAvIChvZmZzZXQgKyAxKTsKKwlzYWF3cml0ZSgob2Zmc2V0PDwxMil8MHgwYywgU0FBNzE0Nl9IUFNfSF9TQ0FMRSk7CisJaWYgKEN1cnJlbnRNb2RlID09IFZJREVPX01PREVfTlRTQykgeworCQl5YWNsID0gLyooNDgwIC8gc2FhLT53aW4uaGVpZ2h0IC0gMSkgJiAweDNmKi8gMDsKKwkJeXNjaSA9IDEwMjQgLSAoc2FhLT53aW4uaGVpZ2h0ICogMTAyNCAvIDQ4MCk7CisJfSBlbHNlIHsKKwkJeWFjbCA9IC8qKDU3NiAvIHNhYS0+d2luLmhlaWdodCAtIDEpICYgMHgzZiovIDA7CisJCXlzY2kgPSAxMDI0IC0gKHNhYS0+d2luLmhlaWdodCAqIDEwMjQgLyA1NzYpOworCX0KKwlzYWF3cml0ZSgoMTw8MzEpfCh5c2NpPDwyMSl8KHlhY2w8PDE1KSwgU0FBNzE0Nl9IUFNfVl9TQ0FMRSk7CisJc2Fhd3JpdGUodl9nYWluW3lhY2xdLCBTQUE3MTQ2X0hQU19WX0dBSU4pOworCXNhYXdyaXRlKCgoU0FBNzE0Nl9NQzJfVVBMRF9ETUExIHwgU0FBNzE0Nl9NQzJfVVBMRF9IUFNfViB8CisJCSAgIFNBQTcxNDZfTUMyX1VQTERfSFBTX0gpIDw8IDE2KSB8IChTQUE3MTQ2X01DMl9VUExEX0RNQTEgfAorCQkgICBTQUE3MTQ2X01DMl9VUExEX0hQU19WIHwgU0FBNzE0Nl9NQzJfVVBMRF9IUFNfSCksCisJCSAgIFNBQTcxNDZfTUMyKTsKK30KKworLyogY2xpcF9kcmF3X3JlY3RhbmdsZShjbSx4LHksdyxoKSAtLSBoYW5kbGUgY2xpcHBpbmcgYW4gYXJlYQorICogYml0bWFwIGlzIGZpeGVkIHdpZHRoLCAxMjggYnl0ZXMgKDEwMjQgcGl4ZWxzIHJlcHJlc2VudGVkKSAKKyAqIGFycmFuZ2VkIG1vc3Qtc2lnaWZpY2FudC1iaXQtbGVmdCBpbiAzMi1iaXQgd29yZHMgCisgKiBiYXNlZCBvbiBzYWE3MTQ2IGNsaXBwaW5nIGhhcmR3YXJlLCBpdCBzd2FwcyBieXRlcyBpZiBMRSAKKyAqIG11Y2ggb2YgdGhpcyBtYWtlcyB1cCBmb3IgZWdjcyBicmFpbiBkYW1hZ2UgLS0gc28gaWYgeW91CisgKiBhcmUgd29uZGVyaW5nICJ3aHkgZGlkIGhlIGRvIHRoaXM/IiBpdCBpcyBiZWNhdXNlIHRoZSBDCisgKiB3YXMgYWRqdXN0ZWQgdG8gZ2VuZXJhdGUgdGhlIG9wdGltYWwgYXNtIG91dHB1dCB3aXRob3V0CisgKiB3cml0aW5nIG5vbi1wb3J0YWJsZSBfX2FzbV9fIGRpcmVjdGl2ZXMuCisgKi8KKworc3RhdGljIHZvaWQgY2xpcF9kcmF3X3JlY3RhbmdsZSh1MzIgKmNsaXBtYXAsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworCXJlZ2lzdGVyIGludCBzdGFydHdvcmQsIGVuZHdvcmQ7CisJcmVnaXN0ZXIgdTMyIGJpdHNsZWZ0LCBiaXRzcmlnaHQ7CisJdTMyICp0ZW1wOworCWlmICh4IDwgMCkgeworCQl3ICs9IHg7CisJCXggPSAwOworCX0KKwlpZiAoeSA8IDApIHsKKwkJaCArPSB5OworCQl5ID0gMDsKKwl9CisJaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgeCA+IDEwMjMgfHwgeSA+IDYzOSkKKwkJcmV0dXJuOwkJLyogdGhyb3cgYXdheSBiYWQgY2xpcHMgKi8KKwlpZiAoeCArIHcgPiAxMDI0KQorCQl3ID0gMTAyNCAtIHg7CisJaWYgKHkgKyBoID4gNjQwKQorCQloID0gNjQwIC0geTsKKwlzdGFydHdvcmQgPSAoeCA+PiA1KTsKKwllbmR3b3JkID0gKCh4ICsgdykgPj4gNSk7CisJYml0c2xlZnQgPSAoMHhmZmZmZmZmZiA+PiAoeCAmIDMxKSk7CisJYml0c3JpZ2h0ID0gKDB4ZmZmZmZmZmYgPDwgKH4oKHggKyB3KSAtIChlbmR3b3JkPDw1KSkpKTsKKwl0ZW1wID0gJmNsaXBtYXBbKHk8PDUpICsgc3RhcnR3b3JkXTsKKwl3ID0gZW5kd29yZCAtIHN0YXJ0d29yZDsKKwlpZiAoIXcpIHsKKwkJYml0c2xlZnQgfD0gYml0c3JpZ2h0OworCQlmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisJCQkqdGVtcCB8PSBiaXRzbGVmdDsKKwkJCXRlbXAgKz0gMzI7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisJCQkqdGVtcCsrIHw9IGJpdHNsZWZ0OworCQkJZm9yICh4ID0gMTsgeCA8IHc7IHgrKykKKwkJCQkqdGVtcCsrID0gMHhmZmZmZmZmZjsKKwkJCSp0ZW1wIHw9IGJpdHNyaWdodDsKKwkJCXRlbXAgKz0gKDMyIC0gdyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1ha2VfY2xpcF90YWIoc3RydWN0IHNhYTcxNDYgKnNhYSwgc3RydWN0IHZpZGVvX2NsaXAgKmNyLCBpbnQgbmNyKQoreworCWludCBpLCB3aWR0aCwgaGVpZ2h0OworCXUzMiAqY2xpcG1hcDsKKworCWNsaXBtYXAgPSBzYWEtPmRtYXZpZDI7CisJaWYoKHdpZHRoPXNhYS0+d2luLndpZHRoKT4xMDIzKQorCQl3aWR0aCA9IDEwMjM7CQkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZigoaGVpZ2h0PXNhYS0+d2luLmhlaWdodCk+NjQwKQorCQloZWlnaHQgPSA2Mzk7CQkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAobmNyID4gMCkgewkvKiByZWN0YW5nbGVzIHBhc2VkICovCisJCS8qIGNvbnZlcnQgcmVjdGFuZ3VsYXIgY2xpcHMgdG8gYSBiaXRtYXAgKi8KKwkJbWVtc2V0KGNsaXBtYXAsIDAsIFZJREVPX0NMSVBNQVBfU0laRSk7IC8qIGNsZWFyIG1hcCAqLworCQlmb3IgKGkgPSAwOyBpIDwgbmNyOyBpKyspCisJCQljbGlwX2RyYXdfcmVjdGFuZ2xlKGNsaXBtYXAsIGNyW2ldLngsIGNyW2ldLnksCisJCQkJY3JbaV0ud2lkdGgsIGNyW2ldLmhlaWdodCk7CisJfQorCS8qIGNsaXAgYWdhaW5zdCB2aWV3aW5nIHdpbmRvdyBBTkQgc2NyZWVuIAorCSAgIHNvIHdlIGRvIG5vdCBoYXZlIHRvIHJlbHkgb24gdGhlIHVzZXIgcHJvZ3JhbQorCSAqLworCWNsaXBfZHJhd19yZWN0YW5nbGUoY2xpcG1hcCwoc2FhLT53aW4ueCt3aWR0aD5zYWEtPndpbi5zd2lkdGgpID8KKwkJKHNhYS0+d2luLnN3aWR0aC1zYWEtPndpbi54KSA6IHdpZHRoLCAwLCAxMDI0LCA3NjgpOworCWNsaXBfZHJhd19yZWN0YW5nbGUoY2xpcG1hcCwwLChzYWEtPndpbi55K2hlaWdodD5zYWEtPndpbi5zaGVpZ2h0KSA/CisJCShzYWEtPndpbi5zaGVpZ2h0LXNhYS0+d2luLnkpIDogaGVpZ2h0LDEwMjQsNzY4KTsKKwlpZiAoc2FhLT53aW4ueDwwKQorCQljbGlwX2RyYXdfcmVjdGFuZ2xlKGNsaXBtYXAsIDAsIDAsIC0oc2FhLT53aW4ueCksIDc2OCk7CisJaWYgKHNhYS0+d2luLnk8MCkKKwkJY2xpcF9kcmF3X3JlY3RhbmdsZShjbGlwbWFwLCAwLCAwLCAxMDI0LCAtKHNhYS0+d2luLnkpKTsKK30KKworc3RhdGljIGludCBzYWFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmdsKQoreworCXN0cnVjdCBzYWE3MTQ2ICpzYWEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX3VzZXIgKmFyZyA9ICh2b2lkIF9fdXNlciAqKWFyZ2w7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DR0NBUDoKKwkJeworCQkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgYjsKKwkJCXN0cmNweShiLm5hbWUsIHNhYS0+dmlkZW9fZGV2Lm5hbWUpOworCQkJYi50eXBlID0gVklEX1RZUEVfQ0FQVFVSRSB8CisJCQkgICAgVklEX1RZUEVfT1ZFUkxBWSB8CisJCQkgICAgVklEX1RZUEVfQ0xJUFBJTkcgfAorCQkJICAgIFZJRF9UWVBFX0ZSQU1FUkFNIHwKKwkJCSAgICBWSURfVFlQRV9TQ0FMRVM7CisJCQliLmNoYW5uZWxzID0gMTsKKwkJCWIuYXVkaW9zID0gMTsKKwkJCWIubWF4d2lkdGggPSA3Njg7CisJCQliLm1heGhlaWdodCA9IDU3NjsKKwkJCWIubWlud2lkdGggPSAzMjsKKwkJCWIubWluaGVpZ2h0ID0gMzI7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJmIsIHNpemVvZihiKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DR1BJQ1Q6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlIHAgPSBzYWEtPnBpY3R1cmU7CisJCQlpZiAoc2FhLT53aW4uZGVwdGggPT0gOCkKKwkJCQlwLnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX0hJMjQwOworCQkJaWYgKHNhYS0+d2luLmRlcHRoID09IDE1KQorCQkJCXAucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCNTU1OworCQkJaWYgKHNhYS0+d2luLmRlcHRoID09IDE2KQorCQkJCXAucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCNTY1OworCQkJaWYgKHNhYS0+d2luLmRlcHRoID09IDI0KQorCQkJCXAucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7CisJCQlpZiAoc2FhLT53aW4uZGVwdGggPT0gMzIpCisJCQkJcC5wYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IzMjsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcCwgc2l6ZW9mKHApKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBWSURJT0NTUElDVDoKKwkJeworCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgcDsKKwkJCXUzMiBmb3JtYXQ7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGFyZywgc2l6ZW9mKHApKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChwLnBhbGV0dGUgPCBzaXplb2YocGFsZXR0ZTJmbXQpIC8gc2l6ZW9mKHUzMikpIHsKKwkJCQlmb3JtYXQgPSBwYWxldHRlMmZtdFtwLnBhbGV0dGVdOworCQkJCXNhYS0+d2luLmNvbG9yX2ZtdCA9IGZvcm1hdDsKKwkJCQlzYWF3cml0ZShmb3JtYXR8MHg2MCwgU0FBNzE0Nl9DTElQX0ZPUk1BVF9DVFJMKTsKKwkJCX0KKwkJCXNhYXdyaXRlKCgocC5icmlnaHRuZXNzICYgMHhmZjAwKSA8PCAxNikgfAorCQkJCSAoKHAuY29udHJhc3QgJiAweGZlMDApIDw8IDcpIHwKKwkJCSAgICAgKChwLmNvbG91ciAmIDB4ZmUwMCkgPj4gOSksIFNBQTcxNDZfQkNTX0NUUkwpOworCQkJc2FhLT5waWN0dXJlID0gcDsKKwkJCS8qIHVwbG9hZCBjaGFuZ2VkIHJlZ2lzdGVycyAqLworCQkJc2Fhd3JpdGUoKChTQUE3MTQ2X01DMl9VUExEX0hQU19IIHwKKwkJCQkgU0FBNzE0Nl9NQzJfVVBMRF9IUFNfVikgPDwgMTYpIHwKKwkJCQlTQUE3MTQ2X01DMl9VUExEX0hQU19IIHwgU0FBNzE0Nl9NQzJfVVBMRF9IUFNfViwKKwkJCQkgU0FBNzE0Nl9NQzIpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ1NXSU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgdnc7CisJCQlzdHJ1Y3QgdmlkZW9fY2xpcCAqdmNwID0gTlVMTDsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2dywgYXJnLCBzaXplb2YodncpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHZ3LmZsYWdzIHx8IHZ3LndpZHRoIDwgMTYgfHwgdncuaGVpZ2h0IDwgMTYpIHsJLyogc3RvcCBjYXB0dXJlICovCisJCQkJc2Fhd3JpdGUoKFNBQTcxNDZfTUMxX1RSX0VfMSA8PCAxNiksIFNBQTcxNDZfTUMxKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChzYWEtPndpbi5icHAgPCA0KSB7CQkvKiAzMi1iaXQgYWxpZ24gc3RhcnQgYW5kIGFkanVzdCB3aWR0aCAqLworCQkJCWludCBpID0gdncueDsKKwkJCQl2dy54ID0gKHZ3LnggKyAzKSAmIH4zOworCQkJCWkgPSB2dy54IC0gaTsKKwkJCQl2dy53aWR0aCAtPSBpOworCQkJfQorCQkJc2FhLT53aW4ueCA9IHZ3Lng7CisJCQlzYWEtPndpbi55ID0gdncueTsKKwkJCXNhYS0+d2luLndpZHRoID0gdncud2lkdGg7CisJCQlpZiAoc2FhLT53aW4ud2lkdGggPiA3NjgpCisJCQkJc2FhLT53aW4ud2lkdGggPSA3Njg7CisJCQlzYWEtPndpbi5oZWlnaHQgPSB2dy5oZWlnaHQ7CisJCQlpZiAoQ3VycmVudE1vZGUgPT0gVklERU9fTU9ERV9OVFNDKSB7CisJCQkJaWYgKHNhYS0+d2luLmhlaWdodCA+IDQ4MCkKKwkJCQkJc2FhLT53aW4uaGVpZ2h0ID0gNDgwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2FhLT53aW4uaGVpZ2h0ID4gNTc2KQorCQkJCQlzYWEtPndpbi5oZWlnaHQgPSA1NzY7CisJCQl9CisKKwkJCS8qIHN0b3AgY2FwdHVyZSAqLworCQkJc2Fhd3JpdGUoKFNBQTcxNDZfTUMxX1RSX0VfMSA8PCAxNiksIFNBQTcxNDZfTUMxKTsKKwkJCXNhYTcxNDZfc2V0X3dpbnNpemUoc2FhKTsKKworCQkJLyoKKwkJCSAqICAgIERvIGFueSBjbGlwcy4KKwkJCSAqLworCQkJaWYgKHZ3LmNsaXBjb3VudCA8IDApIHsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoc2FhLT5kbWF2aWQyLCB2dy5jbGlwcywKKwkJCQkJCSAgIFZJREVPX0NMSVBNQVBfU0laRSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJZWxzZSBpZiAodncuY2xpcGNvdW50ID4gMTYzODQpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZSBpZiAodncuY2xpcGNvdW50ID4gMCkgeworCQkJCWlmICgodmNwID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvX2NsaXApICoKKwkJCQkJICAgICAgICAodncuY2xpcGNvdW50KSkpID09IE5VTEwpCisJCQkJCSByZXR1cm4gLUVOT01FTTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIodmNwLCB2dy5jbGlwcywKKwkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwKSAqCisJCQkJCQkgICB2dy5jbGlwY291bnQpKSB7CisJCQkJCXZmcmVlKHZjcCk7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCX0gZWxzZQkvKiBub3RoaW5nIGNsaXBwZWQgKi8KKwkJCQltZW1zZXQoc2FhLT5kbWF2aWQyLCAwLCBWSURFT19DTElQTUFQX1NJWkUpOworCQkJbWFrZV9jbGlwX3RhYihzYWEsIHZjcCwgdncuY2xpcGNvdW50KTsKKwkJCWlmICh2dy5jbGlwY291bnQgPiAwKQorCQkJCXZmcmVlKHZjcCk7CisKKwkJCS8qIHN0YXJ0IGNhcHR1cmUgJiBjbGlwIGRtYSBpZiB3ZSBoYXZlIGFuIGFkZHJlc3MgKi8KKwkJCWlmICgoc2FhLT5jYXAgJiAzKSAmJiBzYWEtPndpbi52aWRhZHIgIT0gMCkKKwkJCQlzYWF3cml0ZSgoKFNBQTcxNDZfTUMxX1RSX0VfMSB8CisJCQkJCVNBQTcxNDZfTUMxX1RSX0VfMikgPDwgMTYpIHwgMHhmZmZmLAorCQkJCQlTQUE3MTQ2X01DMSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DR1dJTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX3dpbmRvdyB2dzsKKwkJCXZ3LnggPSBzYWEtPndpbi54OworCQkJdncueSA9IHNhYS0+d2luLnk7CisJCQl2dy53aWR0aCA9IHNhYS0+d2luLndpZHRoOworCQkJdncuaGVpZ2h0ID0gc2FhLT53aW4uaGVpZ2h0OworCQkJdncuY2hyb21ha2V5ID0gMDsKKwkJCXZ3LmZsYWdzID0gMDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdncsIHNpemVvZih2dykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ0NBUFRVUkU6CisJCXsKKwkJCWludCB2OworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2LCBhcmcsIHNpemVvZih2KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAodiA9PSAwKSB7CisJCQkJc2FhLT5jYXAgJj0gfjE7CisJCQkJc2Fhd3JpdGUoKFNBQTcxNDZfTUMxX1RSX0VfMSA8PCAxNiksCisJCQkJCSBTQUE3MTQ2X01DMSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChzYWEtPndpbi52aWRhZHIgPT0gMCB8fCBzYWEtPndpbi53aWR0aCA9PSAwCisJCQkJICAgIHx8IHNhYS0+d2luLmhlaWdodCA9PSAwKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlzYWEtPmNhcCB8PSAxOworCQkJCXNhYXdyaXRlKChTQUE3MTQ2X01DMV9UUl9FXzEgPDwgMTYpIHwgMHhmZmZmLAorCQkJCQkgU0FBNzE0Nl9NQzEpOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ0dGQlVGOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyIHY7CisJCQl2LmJhc2UgPSAodm9pZCAqKSBzYWEtPndpbi52aWRhZHI7CisJCQl2LmhlaWdodCA9IHNhYS0+d2luLnNoZWlnaHQ7CisJCQl2LndpZHRoID0gc2FhLT53aW4uc3dpZHRoOworCQkJdi5kZXB0aCA9IHNhYS0+d2luLmRlcHRoOworCQkJdi5ieXRlc3BlcmxpbmUgPSBzYWEtPndpbi5icGw7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJnYsIHNpemVvZih2KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKworCQl9CisJY2FzZSBWSURJT0NTRkJVRjoKKwkJeworCQkJc3RydWN0IHZpZGVvX2J1ZmZlciB2OworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZywgc2l6ZW9mKHYpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh2LmRlcHRoICE9IDggJiYgdi5kZXB0aCAhPSAxNSAmJiB2LmRlcHRoICE9IDE2ICYmCisJCQl2LmRlcHRoICE9IDI0ICYmIHYuZGVwdGggIT0gMzIgJiYgdi53aWR0aCA+IDE2ICYmCisJCQkgICAgdi5oZWlnaHQgPiAxNiAmJiB2LmJ5dGVzcGVybGluZSA+IDE2KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHYuYmFzZSkKKwkJCQlzYWEtPndpbi52aWRhZHIgPSAodW5zaWduZWQgbG9uZykgdi5iYXNlOworCQkJc2FhLT53aW4uc2hlaWdodCA9IHYuaGVpZ2h0OworCQkJc2FhLT53aW4uc3dpZHRoID0gdi53aWR0aDsKKwkJCXNhYS0+d2luLmJwcCA9ICgodi5kZXB0aCArIDcpICYgMHgzOCkgLyA4OworCQkJc2FhLT53aW4uZGVwdGggPSB2LmRlcHRoOworCQkJc2FhLT53aW4uYnBsID0gdi5ieXRlc3BlcmxpbmU7CisKKwkJCURFQlVHKHByaW50aygiRGlzcGxheSBhdCAlcCBpcyAlZCBieSAlZCwgYnl0ZWRlcHRoICVkLCBicGwgJWRcbiIsCisJCQkJICAgICB2LmJhc2UsIHYud2lkdGgsIHYuaGVpZ2h0LCBzYWEtPndpbi5icHAsIHNhYS0+d2luLmJwbCkpOworCQkJc2FhNzE0Nl9zZXRfd2luc2l6ZShzYWEpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ0tFWToKKwkJeworCQkJLyogV2lsbCBiZSBoYW5kbGVkIGhpZ2hlciB1cCAuLiAqLworCQkJcmV0dXJuIDA7CisJCX0KKworCWNhc2UgVklESU9DR0FVRElPOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gdjsKKwkJCXYgPSBzYWEtPmF1ZGlvX2RldjsKKwkJCXYuZmxhZ3MgJj0gfihWSURFT19BVURJT19NVVRFIHwgVklERU9fQVVESU9fTVVUQUJMRSk7CisJCQl2LmZsYWdzIHw9IFZJREVPX0FVRElPX01VVEFCTEUgfCBWSURFT19BVURJT19WT0xVTUU7CisJCQlzdHJjcHkodi5uYW1lLCAiTVBFRyIpOworCQkJdi5tb2RlID0gVklERU9fU09VTkRfU1RFUkVPOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ2LCBzaXplb2YodikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ1NBVURJTzoKKwkJeworCQkJc3RydWN0IHZpZGVvX2F1ZGlvIHY7CisJCQlpbnQgaTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJnLCBzaXplb2YodikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaSA9ICh+KHYudm9sdW1lPj44KSkmMHhmZjsKKwkJCWlmICghSGF2ZUNTNDM0MSkgeworCQkJCWlmICh2LmZsYWdzICYgVklERU9fQVVESU9fTVVURSkgeworCQkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsCisJCQkJCQlJQk1fTVAyX0ZSTlRfQVRURU4sCisJCQkJCQkweGZmZmYsIDIpOworCQkJCX0KKwkJCQlpZiAoISh2LmZsYWdzICYgVklERU9fQVVESU9fTVVURSkpCisJCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwKKwkJCQkJCUlCTV9NUDJfRlJOVF9BVFRFTiwKKwkJCQkJCSAgMHgwMDAwLCAyKTsKKwkJCQlpZiAodi5mbGFncyAmIFZJREVPX0FVRElPX1ZPTFVNRSkKKwkJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLAorCQkJCQkJSUJNX01QMl9GUk5UX0FUVEVOLAorCQkJCQkJKGk8PDgpfGksIDIpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodi5mbGFncyAmIFZJREVPX0FVRElPX01VVEUpCisJCQkJCWNzNDM0MV9zZXRsZXZlbChzYWEsIDB4ZmYsIDB4ZmYpOworCQkJCWlmICghKHYuZmxhZ3MgJiBWSURFT19BVURJT19NVVRFKSkKKwkJCQkJY3M0MzQxX3NldGxldmVsKHNhYSwgMCwgMCk7CisJCQkJaWYgKHYuZmxhZ3MgJiBWSURFT19BVURJT19WT0xVTUUpCisJCQkJCWNzNDM0MV9zZXRsZXZlbChzYWEsIGksIGkpOworCQkJfQorCQkJc2FhLT5hdWRpb19kZXYgPSB2OworCQkJcmV0dXJuIDA7CisJCX0KKworCWNhc2UgVklESU9DR1VOSVQ6CisJCXsKKwkJCXN0cnVjdCB2aWRlb191bml0IHZ1OworCQkJdnUudmlkZW8gPSBzYWEtPnZpZGVvX2Rldi5taW5vcjsKKwkJCXZ1LnZiaSA9IFZJREVPX05PX1VOSVQ7CisJCQl2dS5yYWRpbyA9IFZJREVPX05PX1VOSVQ7CisJCQl2dS5hdWRpbyA9IFZJREVPX05PX1VOSVQ7CisJCQl2dS50ZWxldGV4dCA9IFZJREVPX05PX1VOSVQ7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJnZ1LCBzaXplb2YodnUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBWSURJT0NTUExBWU1PREU6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19wbGF5X21vZGUgcG1vZGU7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikgJnBtb2RlLCBhcmcsCisJCQkJc2l6ZW9mKHN0cnVjdCB2aWRlb19wbGF5X21vZGUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXN3aXRjaCAocG1vZGUubW9kZSkgeworCQkJCWNhc2UgVklEX1BMQVlfVklEX09VVF9NT0RFOgorCQkJCQlpZiAocG1vZGUucDEgIT0gVklERU9fTU9ERV9OVFNDICYmCisJCQkJCQlwbW9kZS5wMSAhPSBWSURFT19NT0RFX1BBTCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlzZXRfb3V0X2Zvcm1hdChzYWEsIHBtb2RlLnAxKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWSURfUExBWV9HRU5MT0NLOgorCQkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsCisJCQkJCQkgIFhJTElOWF9DVEwwLAorCQkJCQkJICAocG1vZGUucDEgPyAweDgwMDAgOiAweDgwODApLAorCQkJCQkJICAyKTsKKwkJCQkJaWYgKE5ld0NhcmQpCisJCQkJCQlzZXRfZ2VubG9ja19vZmZzZXQoc2FhLAorCQkJCQkJCXBtb2RlLnAyKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWSURfUExBWV9OT1JNQUw6CisJCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwKKwkJCQkJCUlCTV9NUDJfQ0hJUF9DT05UUk9MLAorCQkJCQkJQ2hpcENvbnRyb2wsIDIpOworCQkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwKKwkJCQkJCUlCTV9NUDJfUExBWSwgMCwgMCk7CisJCQkJCXNhYS0+cGxheW1vZGUgPSBwbW9kZS5tb2RlOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFZJRF9QTEFZX1BBVVNFOgorCQkJCQkvKiBJQk0gcmVtb3ZlZCB0aGUgUEFVU0UgY29tbWFuZCAqLworCQkJCQkvKiB0aGV5IHNheSB1c2UgU0lOR0xFX0ZSQU1FIG5vdyAqLworCQkJCWNhc2UgVklEX1BMQVlfU0lOR0xFX0ZSQU1FOgorCQkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwKKwkJCQkJCQlJQk1fTVAyX1NJTkdMRV9GUkFNRSwKKwkJCQkJCQkwLCAwKTsKKwkJCQkJaWYgKHNhYS0+cGxheW1vZGUgPT0gcG1vZGUubW9kZSkgeworCQkJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLAorCQkJCQkJCUlCTV9NUDJfQ0hJUF9DT05UUk9MLAorCQkJCQkJCUNoaXBDb250cm9sLCAyKTsKKwkJCQkJfQorCQkJCQlzYWEtPnBsYXltb2RlID0gcG1vZGUubW9kZTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWSURfUExBWV9GQVNUX0ZPUldBUkQ6CisJCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLAorCQkJCQkJSUJNX01QMl9GQVNUX0ZPUldBUkQsIDAsIDApOworCQkJCQlzYWEtPnBsYXltb2RlID0gcG1vZGUubW9kZTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWSURfUExBWV9TTE9XX01PVElPTjoKKwkJCQkJaWJtX3NlbmRfY29tbWFuZChzYWEsCisJCQkJCQlJQk1fTVAyX1NMT1dfTU9USU9OLAorCQkJCQkJcG1vZGUucDEsIDApOworCQkJCQlzYWEtPnBsYXltb2RlID0gcG1vZGUubW9kZTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWSURfUExBWV9JTU1FRElBVEVfTk9STUFMOgorCQkJCQkvKiBlbnN1cmUgdHJhbnNmZXJzIHJlc3VtZSAqLworCQkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsCisJCQkJCQlJQk1fTVAyX0NISVBfQ09OVFJPTCwKKwkJCQkJCUNoaXBDb250cm9sLCAyKTsKKwkJCQkJaWJtX3NlbmRfY29tbWFuZChzYWEsCisJCQkJCQlJQk1fTVAyX0lNRURfTk9STV9QTEFZLCAwLCAwKTsKKwkJCQkJc2FhLT5wbGF5bW9kZSA9IFZJRF9QTEFZX05PUk1BTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWSURfUExBWV9TV0lUQ0hfQ0hBTk5FTFM6CisJCQkJCXNhYS0+YXVkaGVhZCA9IHNhYS0+YXVkdGFpbCA9IDA7CisJCQkJCXNhYS0+dmlkaGVhZCA9IHNhYS0+dmlkdGFpbCA9IDA7CisJCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLAorCQkJCQkJSUJNX01QMl9GUkVFWkVfRlJBTUUsIDAsIDEpOworCQkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwKKwkJCQkJCUlCTV9NUDJfUkVTRVRfQVVEX1JBVEUsIDAsIDEpOworCQkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsCisJCQkJCQlJQk1fTVAyX0NISVBfQ09OVFJPTCwgMCwgMik7CisJCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLAorCQkJCQkJSUJNX01QMl9DSEFOTkVMX1NXSVRDSCwgMCwgMSk7CisJCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwKKwkJCQkJCUlCTV9NUDJfQ0hJUF9DT05UUk9MLAorCQkJCQkJQ2hpcENvbnRyb2wsIDIpOworCQkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwKKwkJCQkJCUlCTV9NUDJfUExBWSwgMCwgMCk7CisJCQkJCXNhYS0+cGxheW1vZGUgPSBWSURfUExBWV9OT1JNQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVklEX1BMQVlfRlJFRVpFX0ZSQU1FOgorCQkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwKKwkJCQkJCUlCTV9NUDJfRlJFRVpFX0ZSQU1FLCAwLCAwKTsKKwkJCQkJc2FhLT5wbGF5bW9kZSA9IHBtb2RlLm1vZGU7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVklEX1BMQVlfU1RJTExfTU9ERToKKwkJCQkJaWJtX3NlbmRfY29tbWFuZChzYWEsCisJCQkJCQlJQk1fTVAyX1NFVF9TVElMTF9NT0RFLCAwLCAwKTsKKwkJCQkJc2FhLT5wbGF5bW9kZSA9IHBtb2RlLm1vZGU7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVklEX1BMQVlfTUFTVEVSX01PREU6CisJCQkJCWlmIChwbW9kZS5wMSA9PSBWSURfUExBWV9NQVNURVJfTk9ORSkKKwkJCQkJCXNhYS0+Ym9hcmRjZmdbMV0gPSAweDEzOworCQkJCQllbHNlIGlmIChwbW9kZS5wMSA9PQorCQkJCQkJVklEX1BMQVlfTUFTVEVSX1ZJREVPKQorCQkJCQkJc2FhLT5ib2FyZGNmZ1sxXSA9IDB4MjM7CisJCQkJCWVsc2UgaWYgKHBtb2RlLnAxID09CisJCQkJCQlWSURfUExBWV9NQVNURVJfQVVESU8pCisJCQkJCQlzYWEtPmJvYXJkY2ZnWzFdID0gMHg0MzsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwKKwkJCQkJCUlCTV9NUDJfQ0hJUF9DT05UUk9MLAorCQkJCQkJQ2hpcENvbnRyb2wsIDIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFZJRF9QTEFZX0FDVElWRV9TQ0FOTElORVM6CisJCQkJCWlmIChDdXJyZW50TW9kZSA9PSBWSURFT19NT0RFX1BBTCkgeworCQkJCQkJaWYgKHBtb2RlLnAxIDwgMSB8fAorCQkJCQkJCXBtb2RlLnAyID4gNjI1KQorCQkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQkJc2FhLT5ib2FyZGNmZ1s1XSA9IHBtb2RlLnAxOworCQkJCQkJc2FhLT5ib2FyZGNmZ1s1NV0gPSAocG1vZGUucDEgKworCQkJCQkJCShwbW9kZS5wMi8yKSAtIDEpICYJCisJCQkJCQkJMHhmZjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChwbW9kZS5wMSA8IDQgfHwKKwkJCQkJCQlwbW9kZS5wMiA+IDUyNSkKKwkJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJCXNhYS0+Ym9hcmRjZmdbNF0gPSBwbW9kZS5wMTsKKwkJCQkJCXNhYS0+Ym9hcmRjZmdbNTRdID0gKHBtb2RlLnAxICsKKwkJCQkJCQkocG1vZGUucDIvMikgLSA0KSAmCisJCQkJCQkJMHhmZjsKKwkJCQkJfQorCQkJCQlzZXRfb3V0X2Zvcm1hdChzYWEsIEN1cnJlbnRNb2RlKTsKKwkJCQljYXNlIFZJRF9QTEFZX1JFU0VUOgorCQkJCQlyZXR1cm4gZG9faWJtX3Jlc2V0KHNhYSk7CisJCQkJY2FzZSBWSURfUExBWV9FTkRfTUFSSzoKKwkJCQkJaWYgKHNhYS0+ZW5kbWFya3RhaWwgPCAgCisJCQkJCQlzYWEtPmVuZG1hcmtoZWFkKSB7CisJCQkJCQlpZiAoc2FhLT5lbmRtYXJraGVhZCAtCisJCQkJCQkJc2FhLT5lbmRtYXJrdGFpbCA8IDIpCisJCQkJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQkJCX0gZWxzZSBpZiAoc2FhLT5lbmRtYXJraGVhZCA8PQorCQkJCQkJc2FhLT5lbmRtYXJrdGFpbCkgeworCQkJCQkJaWYgKHNhYS0+ZW5kbWFya3RhaWwgLQorCQkJCQkJCXNhYS0+ZW5kbWFya2hlYWQgPgorCQkJCQkJCShNQVhfTUFSS1MgLSAyKSkKKwkJCQkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCQkJfSBlbHNlCisJCQkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCQkJc2FhLT5lbmRtYXJrW3NhYS0+ZW5kbWFya3RhaWxdID0KKwkJCQkJCXNhYS0+YXVkdGFpbDsKKwkJCQkJc2FhLT5lbmRtYXJrdGFpbCsrOworCQkJCQlpZiAoc2FhLT5lbmRtYXJrdGFpbCA+PSBNQVhfTUFSS1MpCisJCQkJCQlzYWEtPmVuZG1hcmt0YWlsID0gMDsKKwkJCX0KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJY2FzZSBWSURJT0NTV1JJVEVNT0RFOgorCQl7CisJCQlpbnQgbW9kZTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSAmbW9kZSwgYXJnLCBzaXplb2YoaW50KSkpCisJCQkJIHJldHVybiAtRUZBVUxUOworCQkJaWYgKG1vZGUgPT0gVklEX1dSSVRFX01QRUdfQVVEIHx8CisJCQkgICAgbW9kZSA9PSBWSURfV1JJVEVfTVBFR19WSUQgfHwKKwkJCSAgICBtb2RlID09IFZJRF9XUklURV9DQyB8fAorCQkJICAgIG1vZGUgPT0gVklEX1dSSVRFX1RUWCB8fAorCQkJICAgIG1vZGUgPT0gVklEX1dSSVRFX09TRCkgeworCQkJCXNhYS0+d3JpdGVtb2RlID0gbW9kZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJY2FzZSBWSURJT0NTTUlDUk9DT0RFOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fY29kZSB1Y29kZTsKKwkJCV9fdTggKnVkYXRhOworCQkJaW50IGk7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnVjb2RlLCBhcmcsIHNpemVvZih1Y29kZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHVjb2RlLmRhdGFzaXplID4gNjU1MzYgfHwgdWNvZGUuZGF0YXNpemUgPCAxMDI0IHx8CisJCQkgICAgc3RybmNtcCh1Y29kZS5sb2Fkd2hhdCwgImRlYyIsIDMpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCh1ZGF0YSA9IHZtYWxsb2ModWNvZGUuZGF0YXNpemUpKSA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKHVkYXRhLCB1Y29kZS5kYXRhLCB1Y29kZS5kYXRhc2l6ZSkpIHsKKwkJCQl2ZnJlZSh1ZGF0YSk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQl1Y29kZS5kYXRhID0gdWRhdGE7CisJCQlpZiAoIXN0cm5jbXAodWNvZGUubG9hZHdoYXQsICJkZWNvZGVyLmF1ZCIsIDExKQorCQkJCXx8ICFzdHJuY21wKHVjb2RlLmxvYWR3aGF0LCAiZGVjb2Rlci52aWQiLCAxMSkpCisJCQkJaSA9IGluaXRpYWxpemVfaWJtbXBlZzIoJnVjb2RlKTsKKwkJCWVsc2UKKwkJCQlpID0gaW5pdGlhbGl6ZV9mcGdhKCZ1Y29kZSk7CisJCQl2ZnJlZSh1ZGF0YSk7CisJCQlpZiAoaSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCisJCX0KKwljYXNlIFZJRElPQ0dDSEFOOgkvKiB0aGlzIG1ha2VzIHhhd3R2IGhhcHB5ICovCisJCXsKKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsIHY7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZywgc2l6ZW9mKHYpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXYuZmxhZ3MgPSBWSURFT19WQ19BVURJTzsKKwkJCXYudHVuZXJzID0gMDsKKwkJCXYudHlwZSA9IFZJRF9UWVBFX01QRUdfREVDT0RFUjsKKwkJCXYubm9ybSA9IEN1cnJlbnRNb2RlOworCQkJc3RyY3B5KHYubmFtZSwgIk1QRUcyIik7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJnYsIHNpemVvZih2KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DU0NIQU46CS8qIHRoaXMgbWFrZXMgeGF3dHYgaGFwcHkgKi8KKwkJeworCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgdjsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJnLCBzaXplb2YodikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJLyogZG8gbm90aGluZyAqLworCQkJcmV0dXJuIDA7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWFfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNhYTcxNDYgKnNhYSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlwcmludGsoS0VSTl9ERUJVRyAic3RyYWRpcyVkOiBzYWFfbW1hcCBjYWxsZWRcbiIsIHNhYS0+bnIpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3NpemVfdCBzYWFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3NpemVfdCBzYWFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNhYTcxNDYgKnNhYSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHRvZG8gPSBjb3VudDsKKwlpbnQgYmxvY2tzaXplLCBzcGxpdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd2hpbGUgKHRvZG8gPiAwKSB7CisJCWlmIChzYWEtPndyaXRlbW9kZSA9PSBWSURfV1JJVEVfTVBFR19BVUQpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzYWEtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChzYWEtPmF1ZGhlYWQgPD0gc2FhLT5hdWR0YWlsKQorCQkJCWJsb2Nrc2l6ZSA9IDY1NTM2LShzYWEtPmF1ZHRhaWwgLSBzYWEtPmF1ZGhlYWQpOworCQkJZWxzZQorCQkJCWJsb2Nrc2l6ZSA9IHNhYS0+YXVkaGVhZCAtIHNhYS0+YXVkdGFpbDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhYS0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGJsb2Nrc2l6ZSA8IDE2Mzg0KSB7CisJCQkJc2Fhd3JpdGUoU0FBNzE0Nl9QU1JfREVCSV9TIHwKKwkJCQkJIFNBQTcxNDZfUFNSX1BJTjEsIFNBQTcxNDZfSUVSKTsKKwkJCQlzYWF3cml0ZShTQUE3MTQ2X1BTUl9QSU4xLCBTQUE3MTQ2X1BTUik7CisJCQkJLyogd2FpdCBmb3IgYnVmZmVyIHNwYWNlIHRvIG9wZW4gKi8KKwkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzYWEtPmF1ZHEpOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNhYS0+bG9jaywgZmxhZ3MpOworCQkJaWYgKHNhYS0+YXVkaGVhZCA8PSBzYWEtPmF1ZHRhaWwpIHsKKwkJCQlibG9ja3NpemUgPSA2NTUzNi0oc2FhLT5hdWR0YWlsIC0gc2FhLT5hdWRoZWFkKTsKKwkJCQlzcGxpdCA9IDY1NTM2IC0gc2FhLT5hdWR0YWlsOworCQkJfSBlbHNlIHsKKwkJCQlibG9ja3NpemUgPSBzYWEtPmF1ZGhlYWQgLSBzYWEtPmF1ZHRhaWw7CisJCQkJc3BsaXQgPSA2NTUzNjsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhYS0+bG9jaywgZmxhZ3MpOworCQkJYmxvY2tzaXplLS07CisJCQlpZiAoYmxvY2tzaXplID4gdG9kbykKKwkJCQlibG9ja3NpemUgPSB0b2RvOworCQkJLyogZG91YmxlIGNoZWNrIHRoYXQgd2UgcmVhbGx5IGhhdmUgc3BhY2UgKi8KKwkJCWlmICghYmxvY2tzaXplKQorCQkJCXJldHVybiAtRU5PU1BDOworCQkJaWYgKHNwbGl0IDwgYmxvY2tzaXplKSB7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHNhYS0+YXVkYnVmICsKKwkJCQkJc2FhLT5hdWR0YWlsLCBidWYsIHNwbGl0KSkgCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWJ1ZiArPSBzcGxpdDsKKwkJCQl0b2RvIC09IHNwbGl0OworCQkJCWJsb2Nrc2l6ZSAtPSBzcGxpdDsKKwkJCQlzYWEtPmF1ZHRhaWwgPSAwOworCQkJfQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKHNhYS0+YXVkYnVmICsgc2FhLT5hdWR0YWlsLCBidWYsCisJCQkJYmxvY2tzaXplKSkgCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzYWEtPmF1ZHRhaWwgKz0gYmxvY2tzaXplOworCQkJdG9kbyAtPSBibG9ja3NpemU7CisJCQlidWYgKz0gYmxvY2tzaXplOworCQkJc2FhLT5hdWR0YWlsICY9IDB4ZmZmZjsKKwkJfSBlbHNlIGlmIChzYWEtPndyaXRlbW9kZSA9PSBWSURfV1JJVEVfTVBFR19WSUQpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzYWEtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChzYWEtPnZpZGhlYWQgPD0gc2FhLT52aWR0YWlsKQorCQkJCWJsb2Nrc2l6ZT01MjQyODgtKHNhYS0+dmlkdGFpbCAtIHNhYS0+dmlkaGVhZCk7CisJCQllbHNlCisJCQkJYmxvY2tzaXplID0gc2FhLT52aWRoZWFkIC0gc2FhLT52aWR0YWlsOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2FhLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoYmxvY2tzaXplIDwgNjU1MzYpIHsKKwkJCQlzYWF3cml0ZShTQUE3MTQ2X1BTUl9ERUJJX1MgfAorCQkJCQkgU0FBNzE0Nl9QU1JfUElOMSwgU0FBNzE0Nl9JRVIpOworCQkJCXNhYXdyaXRlKFNBQTcxNDZfUFNSX1BJTjEsIFNBQTcxNDZfUFNSKTsKKwkJCQkvKiB3YWl0IGZvciBidWZmZXIgc3BhY2UgdG8gb3BlbiAqLworCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnNhYS0+dmlkcSk7CisJCQl9CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2FhLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoc2FhLT52aWRoZWFkIDw9IHNhYS0+dmlkdGFpbCkgeworCQkJCWJsb2Nrc2l6ZT01MjQyODgtKHNhYS0+dmlkdGFpbCAtIHNhYS0+dmlkaGVhZCk7CisJCQkJc3BsaXQgPSA1MjQyODggLSBzYWEtPnZpZHRhaWw7CisJCQl9IGVsc2UgeworCQkJCWJsb2Nrc2l6ZSA9IHNhYS0+dmlkaGVhZCAtIHNhYS0+dmlkdGFpbDsKKwkJCQlzcGxpdCA9IDUyNDI4ODsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhYS0+bG9jaywgZmxhZ3MpOworCQkJYmxvY2tzaXplLS07CisJCQlpZiAoYmxvY2tzaXplID4gdG9kbykKKwkJCQlibG9ja3NpemUgPSB0b2RvOworCQkJLyogZG91YmxlIGNoZWNrIHRoYXQgd2UgcmVhbGx5IGhhdmUgc3BhY2UgKi8KKwkJCWlmICghYmxvY2tzaXplKQorCQkJCXJldHVybiAtRU5PU1BDOworCQkJaWYgKHNwbGl0IDwgYmxvY2tzaXplKSB7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHNhYS0+dmlkYnVmICsKKwkJCQkJc2FhLT52aWR0YWlsLCBidWYsIHNwbGl0KSkgCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWJ1ZiArPSBzcGxpdDsKKwkJCQl0b2RvIC09IHNwbGl0OworCQkJCWJsb2Nrc2l6ZSAtPSBzcGxpdDsKKwkJCQlzYWEtPnZpZHRhaWwgPSAwOworCQkJfQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKHNhYS0+dmlkYnVmICsgc2FhLT52aWR0YWlsLCBidWYsCisJCQkJYmxvY2tzaXplKSkgCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzYWEtPnZpZHRhaWwgKz0gYmxvY2tzaXplOworCQkJdG9kbyAtPSBibG9ja3NpemU7CisJCQlidWYgKz0gYmxvY2tzaXplOworCQkJc2FhLT52aWR0YWlsICY9IDB4N2ZmZmY7CisJCX0gZWxzZSBpZiAoc2FhLT53cml0ZW1vZGUgPT0gVklEX1dSSVRFX09TRCkgeworCQkJaWYgKGNvdW50ID4gMTMxMDcyKQorCQkJCXJldHVybiAtRU5PU1BDOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKHNhYS0+b3NkYnVmLCBidWYsIGNvdW50KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJ1ZiArPSBjb3VudDsKKwkJCXNhYS0+b3NkaGVhZCA9IDA7CisJCQlzYWEtPm9zZHRhaWwgPSBjb3VudDsKKwkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9PU0RfQUREUiwgMCwgMik7CisJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfT1NEX0xJTktfQUREUiwgMCwgMik7CisJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfTUFTSzAsIDB4YzAwZCwgMik7CisJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfRElTUF9NT0RFLAorCQkJCSAgZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsCisJCQkJICBJQk1fTVAyX0RJU1BfTU9ERSwgMikgfCAxLCAyKTsKKwkJCS8qIHRyaWdnZXIgb3NkIGRhdGEgdHJhbnNmZXIgKi8KKwkJCXNhYXdyaXRlKFNBQTcxNDZfUFNSX0RFQklfUyB8CisJCQkJIFNBQTcxNDZfUFNSX1BJTjEsIFNBQTcxNDZfSUVSKTsKKwkJCXNhYXdyaXRlKFNBQTcxNDZfUFNSX1BJTjEsIFNBQTcxNDZfUFNSKTsKKwkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc2FhX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNhYTcxNDYgKnNhYSA9IE5VTEw7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQUE3MTQ2X01BWDsgaSsrKSB7CisJCWlmIChzYWE3MTQ2c1tpXS52aWRlb19kZXYubWlub3IgPT0gbWlub3IpIHsKKwkJCXNhYSA9ICZzYWE3MTQ2c1tpXTsKKwkJfQorCX0KKwlpZiAoc2FhID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHNhYTsKKworCS8vc2FhLT52aWRlb19kZXYuYnVzeSA9IDA7IC8qIG9sZCBoYWNrIHRvIHN1cHBvcnQgbXVsdGlwbGUgb3BlbiAqLworCXNhYS0+dXNlcisrOworCWlmIChzYWEtPnVzZXIgPiAxKQorCQlyZXR1cm4gMDsJLyogZGV2aWNlIG9wZW4gYWxyZWFkeSwgZG9uJ3QgcmVzZXQgKi8KKwlzYWEtPndyaXRlbW9kZSA9IFZJRF9XUklURV9NUEVHX1ZJRDsJLyogZGVmYXVsdCB0byB2aWRlbyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzYWE3MTQ2ICpzYWEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2FhLT51c2VyLS07CisJLy9zYWEtPnZpZGVvX2Rldi5idXN5ID0gMDsgLyogb2xkIGhhY2sgdG8gc3VwcG9ydCBtdWx0aXBsZSBvcGVuICovCisJaWYgKHNhYS0+dXNlciA+IDApCS8qIHN0aWxsIHNvbWVvbmUgdXNpbmcgZGV2aWNlICovCisJCXJldHVybiAwOworCXNhYXdyaXRlKDB4MDA3ZjAwMDAsIFNBQTcxNDZfTUMxKTsJLyogc3RvcCBhbGwgb3ZlcmxheSBkbWEgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2FhX2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBzYWFfb3BlbiwKKwkucmVsZWFzZQk9IHNhYV9yZWxlYXNlLAorCS5pb2N0bAkJPSBzYWFfaW9jdGwsCisJLnJlYWQJCT0gc2FhX3JlYWQsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IHNhYV93cml0ZSwKKwkubW1hcAkJPSBzYWFfbW1hcCwKK307CisKKy8qIHRlbXBsYXRlIGZvciB2aWRlb19kZXZpY2Utc3RydWN0dXJlICovCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzYWFfdGVtcGxhdGUgPQoreworCS5uYW1lCQk9ICJTQUE3MTQ2QSIsCisJLnR5cGUJCT0gVklEX1RZUEVfQ0FQVFVSRSB8IFZJRF9UWVBFX09WRVJMQVksCisJLmhhcmR3YXJlCT0gVklEX0hBUkRXQVJFX1NBQTcxNDYsCisJLmZvcHMJCT0gJnNhYV9mb3BzLAorCS5taW5vcgkJPSAtMSwKK307CisKK3N0YXRpYyBpbnQgY29uZmlndXJlX3NhYTcxNDYoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG51bSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzYWE3MTQ2ICpzYWE7CisKKwlzYWEgPSAmc2FhNzE0NnNbbnVtXTsKKwkKKwlzYWEtPmVuZG1hcmtoZWFkID0gc2FhLT5lbmRtYXJrdGFpbCA9IDA7CisJc2FhLT53aW4ueCA9IHNhYS0+d2luLnkgPSAwOworCXNhYS0+d2luLndpZHRoID0gc2FhLT53aW4uY3JvcHdpZHRoID0gNzIwOworCXNhYS0+d2luLmhlaWdodCA9IHNhYS0+d2luLmNyb3BoZWlnaHQgPSA0ODA7CisJc2FhLT53aW4uY3JvcHggPSBzYWEtPndpbi5jcm9weSA9IDA7CisJc2FhLT53aW4uYnBwID0gMjsKKwlzYWEtPndpbi5kZXB0aCA9IDE2OworCXNhYS0+d2luLmNvbG9yX2ZtdCA9IHBhbGV0dGUyZm10W1ZJREVPX1BBTEVUVEVfUkdCNTY1XTsKKwlzYWEtPndpbi5icGwgPSAxMDI0ICogc2FhLT53aW4uYnBwOworCXNhYS0+d2luLnN3aWR0aCA9IDEwMjQ7CisJc2FhLT53aW4uc2hlaWdodCA9IDc2ODsKKwlzYWEtPnBpY3R1cmUuYnJpZ2h0bmVzcyA9IDMyNzY4OworCXNhYS0+cGljdHVyZS5jb250cmFzdCA9IDM4NzY4OworCXNhYS0+cGljdHVyZS5jb2xvdXIgPSAzMjc2ODsKKwlzYWEtPmNhcCA9IDA7CisJc2FhLT5kZXYgPSBkZXY7CisJc2FhLT5uciA9IG51bTsKKwlzYWEtPnBsYXltb2RlID0gVklEX1BMQVlfTk9STUFMOworCW1lbXNldChzYWEtPmJvYXJkY2ZnLCAwLCA2NCk7CS8qIGNsZWFyIGJvYXJkIGNvbmZpZyBhcmVhICovCisJc2FhLT5zYWE3MTQ2X21lbSA9IE5VTEw7CisJc2FhLT5kbWF2aWQxID0gc2FhLT5kbWF2aWQyID0gc2FhLT5kbWF2aWQzID0gc2FhLT5kbWFhMWluID0KKwkgICAgc2FhLT5kbWFhMW91dCA9IHNhYS0+ZG1hYTJpbiA9IHNhYS0+ZG1hYTJvdXQgPQorCSAgICBzYWEtPnBhZ2V2aWQxID0gc2FhLT5wYWdldmlkMiA9IHNhYS0+cGFnZXZpZDMgPSBzYWEtPnBhZ2VhMWluID0KKwkgICAgc2FhLT5wYWdlYTFvdXQgPSBzYWEtPnBhZ2VhMmluID0gc2FhLT5wYWdlYTJvdXQgPQorCSAgICBzYWEtPnBhZ2VkZWJpID0gc2FhLT5kbWFSUFMxID0gc2FhLT5kbWFSUFMyID0gc2FhLT5wYWdlUlBTMSA9CisJICAgIHNhYS0+cGFnZVJQUzIgPSBOVUxMOworCXNhYS0+YXVkYnVmID0gc2FhLT52aWRidWYgPSBzYWEtPm9zZGJ1ZiA9IHNhYS0+ZG1hZGViaSA9IE5VTEw7CisJc2FhLT5hdWRoZWFkID0gc2FhLT52aWR0YWlsID0gMDsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNhYS0+aTJjcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2FhLT5hdWRxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzYWEtPmRlYmlxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzYWEtPnZpZHEpOworCXNwaW5fbG9ja19pbml0KCZzYWEtPmxvY2spOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCisJCXJldHVybiAtRUlPOworCQorCXNhYS0+aWQgPSBkZXYtPmRldmljZTsKKwlzYWEtPmlycSA9IGRldi0+aXJxOworCXNhYS0+dmlkZW9fZGV2Lm1pbm9yID0gLTE7CisJc2FhLT5zYWE3MTQ2X2FkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmc2FhLT5yZXZpc2lvbik7CisKKwlzYWEtPnNhYTcxNDZfbWVtID0gaW9yZW1hcChzYWEtPnNhYTcxNDZfYWRyLCAweDIwMCk7CisJaWYgKCFzYWEtPnNhYTcxNDZfbWVtKQorCQlyZXR1cm4gLUVJTzsKKworCW1lbWNweSgmc2FhLT52aWRlb19kZXYsICZzYWFfdGVtcGxhdGUsIHNpemVvZihzYWFfdGVtcGxhdGUpKTsKKwlzYWF3cml0ZSgwLCBTQUE3MTQ2X0lFUik7CS8qIHR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzICovCisJcmVzdWx0ID0gcmVxdWVzdF9pcnEoc2FhLT5pcnEsIHNhYTcxNDZfaXJxLAorCQkgICAgICAgU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQsICJzdHJhZGlzIiwgKHZvaWQgKikgc2FhKTsKKwlpZiAocmVzdWx0ID09IC1FSU5WQUwpCisJCXByaW50ayhLRVJOX0VSUiAic3RyYWRpcyVkOiBCYWQgaXJxIG51bWJlciBvciBoYW5kbGVyXG4iLAorCQkgICAgICAgbnVtKTsKKwlpZiAocmVzdWx0ID09IC1FQlVTWSkKKwkJcHJpbnRrKEtFUk5fRVJSICJzdHJhZGlzJWQ6IElSUSAlbGQgYnVzeSwgY2hhbmdlIHlvdXIgUG5QIgorCQkgICAgICAgIiBjb25maWcgaW4gQklPU1xuIiwgbnVtLCBzYWEtPmlycSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJaW91bm1hcChzYWEtPnNhYTcxNDZfbWVtKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZzYWEtPnZpZGVvX2RldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpIDwgMCkgeworCQlpb3VubWFwKHNhYS0+c2FhNzE0Nl9tZW0pOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfc2FhNzE0NihpbnQgaSkKK3sKKwlzdHJ1Y3Qgc2FhNzE0NiAqc2FhID0gJnNhYTcxNDZzW2ldOworCisJc2FhLT51c2VyID0gMDsKKwkvKiByZXNldCB0aGUgc2FhNzE0NiAqLworCXNhYXdyaXRlKDB4ZmZmZjAwMDAsIFNBQTcxNDZfTUMxKTsKKwltZGVsYXkoNSk7CisJLyogZW5hYmxlIGRlYmkgYW5kIGkyYyB0cmFuc2ZlcnMgYW5kIHBpbnMgKi8KKwlzYWF3cml0ZSgoKFNBQTcxNDZfTUMxX0VEUCB8IFNBQTcxNDZfTUMxX0VJMkMgfAorCQkgICBTQUE3MTQ2X01DMV9UUl9FX0RFQkkpIDw8IDE2KSB8IDB4ZmZmZiwgU0FBNzE0Nl9NQzEpOworCS8qIGVuc3VyZSBwcm9wZXIgc3RhdGUgb2YgY2hpcCAqLworCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfUEFHRTEpOworCXNhYXdyaXRlKDB4MDBmMzAyYzAsIFNBQTcxNDZfTlVNX0xJTkVfQllURTEpOworCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfUEFHRTIpOworCXNhYXdyaXRlKDB4MDE0MDAwODAsIFNBQTcxNDZfTlVNX0xJTkVfQllURTIpOworCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfREQxX0lOSVQpOworCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfREQxX1NUUkVBTV9CKTsKKwlzYWF3cml0ZSgweDAwMDAwMDAwLCBTQUE3MTQ2X0REMV9TVFJFQU1fQSk7CisJc2Fhd3JpdGUoMHgwMDAwMDAwMCwgU0FBNzE0Nl9CUlNfQ1RSTCk7CisJc2Fhd3JpdGUoMHg4MDQwMDA0MCwgU0FBNzE0Nl9CQ1NfQ1RSTCk7CisJc2Fhd3JpdGUoMHgwMDAwZTAwMCAvKnwgKDE8PDI5KSovLCBTQUE3MTQ2X0hQU19DVFJMKTsKKwlzYWF3cml0ZSgweDAwMDAwMDYwLCBTQUE3MTQ2X0NMSVBfRk9STUFUX0NUUkwpOworCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfQUNPTjEpOworCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfQUNPTjIpOworCXNhYXdyaXRlKDB4MDAwMDA2MDAsIFNBQTcxNDZfSTJDX1NUQVRVUyk7CisJc2Fhd3JpdGUoKChTQUE3MTQ2X01DMl9VUExEX0QxX0IgfCBTQUE3MTQ2X01DMl9VUExEX0QxX0EgfAorCQkgICBTQUE3MTQ2X01DMl9VUExEX0JSUyB8IFNBQTcxNDZfTUMyX1VQTERfSFBTX0ggfAorCQkgICBTQUE3MTQ2X01DMl9VUExEX0hQU19WIHwgU0FBNzE0Nl9NQzJfVVBMRF9ETUEyIHwKKwkgICBTQUE3MTQ2X01DMl9VUExEX0RNQTEgfCBTQUE3MTQ2X01DMl9VUExEX0kyQykgPDwgMTYpIHwgMHhmZmZmLAorCQkgU0FBNzE0Nl9NQzIpOworCS8qIHNldHVwIGFyYml0cmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJc2Fhd3JpdGUoMHgxNDEyMTIxYSwgU0FBNzE0Nl9QQ0lfQlRfVjEpOworCisJLyogYWxsb2NhdGUgMzJrIGRtYSBidWZmZXIgKyA0ayBmb3IgcGFnZSB0YWJsZSAqLworCWlmICgoc2FhLT5kbWFkZWJpID0ga21hbGxvYygzMjc2OCArIDQwOTYsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3RyYWRpcyVkOiBkZWJpIGttYWxsb2MgZmFpbGVkXG4iLCBpKTsKKwkJcmV0dXJuIC0xOworCX0KKyNpZiAwCisJc2FhLT5wYWdlZGViaSA9IHNhYS0+ZG1hZGViaSArIDMyNzY4OwkvKiB0b3AgNGsgaXMgZm9yIG1tdSAqLworCXNhYXdyaXRlKHZpcnRfdG9fYnVzKHNhYS0+cGFnZWRlYmkpIC8qfDB4ODAwICovICwgU0FBNzE0Nl9ERUJJX1BBR0UpOworCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQkvKiBzZXR1cCBtbXUgcGFnZSB0YWJsZSAqLworCQlzYWEtPnBhZ2VkZWJpW2ldID0gdmlydF90b19idXMoKHNhYS0+ZG1hZGViaSArIGkgKiA0MDk2KSk7CisjZW5kaWYKKwlzYWEtPmF1ZGhlYWQgPSBzYWEtPnZpZGhlYWQgPSBzYWEtPm9zZGhlYWQgPSAwOworCXNhYS0+YXVkdGFpbCA9IHNhYS0+dmlkdGFpbCA9IHNhYS0+b3NkdGFpbCA9IDA7CisJaWYgKHNhYS0+dmlkYnVmID09IE5VTEwpCisJCWlmICgoc2FhLT52aWRidWYgPSB2bWFsbG9jKDUyNDI4OCkpID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic3RyYWRpcyVkOiBtYWxsb2MgZmFpbGVkXG4iLCBzYWEtPm5yKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJaWYgKHNhYS0+YXVkYnVmID09IE5VTEwpCisJCWlmICgoc2FhLT5hdWRidWYgPSB2bWFsbG9jKDY1NTM2KSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzdHJhZGlzJWQ6IG1hbGxvYyBmYWlsZWRcbiIsIHNhYS0+bnIpOworCQkJdmZyZWUoc2FhLT52aWRidWYpOworCQkJc2FhLT52aWRidWYgPSBOVUxMOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwlpZiAoc2FhLT5vc2RidWYgPT0gTlVMTCkKKwkJaWYgKChzYWEtPm9zZGJ1ZiA9IHZtYWxsb2MoMTMxMDcyKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzdHJhZGlzJWQ6IG1hbGxvYyBmYWlsZWRcbiIsIHNhYS0+bnIpOworCQkJdmZyZWUoc2FhLT52aWRidWYpOworCQkJdmZyZWUoc2FhLT5hdWRidWYpOworCQkJc2FhLT52aWRidWYgPSBzYWEtPmF1ZGJ1ZiA9IE5VTEw7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCS8qIGFsbG9jYXRlIDgxOTIwIGJ5dGUgYnVmZmVyIGZvciBjbGlwcGluZyAqLworCWlmICgoc2FhLT5kbWF2aWQyID0ga21hbGxvYyhWSURFT19DTElQTUFQX1NJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3RyYWRpcyVkOiBjbGlwIGttYWxsb2MgZmFpbGVkXG4iLCBzYWEtPm5yKTsKKwkJdmZyZWUoc2FhLT52aWRidWYpOworCQl2ZnJlZShzYWEtPmF1ZGJ1Zik7CisJCXZmcmVlKHNhYS0+b3NkYnVmKTsKKwkJc2FhLT52aWRidWYgPSBzYWEtPmF1ZGJ1ZiA9IHNhYS0+b3NkYnVmID0gTlVMTDsKKwkJc2FhLT5kbWF2aWQyID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoc2FhLT5kbWF2aWQyLCAweDAwLCBWSURFT19DTElQTUFQX1NJWkUpOwkvKiBjbGlwIGV2ZXJ5dGhpbmcgKi8KKwkvKiBzZXR1cCBjbGlwcGluZyByZWdpc3RlcnMgKi8KKwlzYWF3cml0ZSh2aXJ0X3RvX2J1cyhzYWEtPmRtYXZpZDIpLCBTQUE3MTQ2X0JBU0VfRVZFTjIpOworCXNhYXdyaXRlKHZpcnRfdG9fYnVzKHNhYS0+ZG1hdmlkMikgKyAxMjgsIFNBQTcxNDZfQkFTRV9PREQyKTsKKwlzYWF3cml0ZSh2aXJ0X3RvX2J1cyhzYWEtPmRtYXZpZDIpICsgVklERU9fQ0xJUE1BUF9TSVpFLAorCQlTQUE3MTQ2X1BST1RfQUREUjIpOworCXNhYXdyaXRlKDI1NiwgU0FBNzE0Nl9QSVRDSDIpOworCXNhYXdyaXRlKDQsIFNBQTcxNDZfUEFHRTIpOyAvKiBkbWEgZGlyZWN0aW9uOiByZWFkLCBubyBieXRlc3dhcCAqLworCXNhYXdyaXRlKCgoU0FBNzE0Nl9NQzJfVVBMRF9ETUEyKSA8PCAxNikgfCBTQUE3MTQ2X01DMl9VUExEX0RNQTIsCisJCSBTQUE3MTQ2X01DMik7CisJSTJDQnVzU2NhbihzYWEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3NhYSh2b2lkKQoreworCXU4IGNvbW1hbmQ7CisJaW50IGk7CisJc3RydWN0IHNhYTcxNDYgKnNhYTsKKworCWZvciAoaSA9IDA7IGkgPCBzYWFfbnVtOyBpKyspIHsKKwkJc2FhID0gJnNhYTcxNDZzW2ldOworCisJCS8qIHR1cm4gb2ZmIGFsbCBjYXB0dXJpbmcsIERNQSBhbmQgSVJRcyAqLworCQlzYWF3cml0ZSgweGZmZmYwMDAwLCBTQUE3MTQ2X01DMSk7CS8qIHJlc2V0IGNoaXAgKi8KKwkJc2Fhd3JpdGUoMCwgU0FBNzE0Nl9NQzIpOworCQlzYWF3cml0ZSgwLCBTQUE3MTQ2X0lFUik7CisJCXNhYXdyaXRlKDB4ZmZmZmZmZmZVTCwgU0FBNzE0Nl9JU1IpOworCisJCS8qIGRpc2FibGUgUENJIGJ1cy1tYXN0ZXJpbmcgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoc2FhLT5kZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisJCWNvbW1hbmQgJj0gflBDSV9DT01NQU5EX01BU1RFUjsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHNhYS0+ZGV2LCBQQ0lfQ09NTUFORCwgY29tbWFuZCk7CisKKwkJLyogdW5tYXAgYW5kIGZyZWUgbWVtb3J5ICovCisJCXNhYS0+YXVkaGVhZCA9IHNhYS0+YXVkdGFpbCA9IHNhYS0+b3NkaGVhZCA9IDA7CisJCXNhYS0+dmlkaGVhZCA9IHNhYS0+dmlkdGFpbCA9IHNhYS0+b3NkdGFpbCA9IDA7CisJCXZmcmVlKHNhYS0+dmlkYnVmKTsKKwkJdmZyZWUoc2FhLT5hdWRidWYpOworCQl2ZnJlZShzYWEtPm9zZGJ1Zik7CisJCWlmIChzYWEtPmRtYXZpZDIpCisJCQlrZnJlZSgodm9pZCAqKSBzYWEtPmRtYXZpZDIpOworCQlzYWEtPmF1ZGJ1ZiA9IHNhYS0+dmlkYnVmID0gc2FhLT5vc2RidWYgPSBOVUxMOworCQlzYWEtPmRtYXZpZDIgPSBOVUxMOworCQlpZiAoc2FhLT5kbWFkZWJpKQorCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWFkZWJpKTsKKwkJaWYgKHNhYS0+ZG1hdmlkMSkKKwkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hdmlkMSk7CisJCWlmIChzYWEtPmRtYXZpZDIpCisJCQlrZnJlZSgodm9pZCAqKSBzYWEtPmRtYXZpZDIpOworCQlpZiAoc2FhLT5kbWF2aWQzKQorCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWF2aWQzKTsKKwkJaWYgKHNhYS0+ZG1hYTFpbikKKwkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hYTFpbik7CisJCWlmIChzYWEtPmRtYWExb3V0KQorCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWFhMW91dCk7CisJCWlmIChzYWEtPmRtYWEyaW4pCisJCQlrZnJlZSgodm9pZCAqKSBzYWEtPmRtYWEyaW4pOworCQlpZiAoc2FhLT5kbWFhMm91dCkKKwkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hYTJvdXQpOworCQlpZiAoc2FhLT5kbWFSUFMxKQorCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWFSUFMxKTsKKwkJaWYgKHNhYS0+ZG1hUlBTMikKKwkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hUlBTMik7CisJCWZyZWVfaXJxKHNhYS0+aXJxLCBzYWEpOworCQlpZiAoc2FhLT5zYWE3MTQ2X21lbSkKKwkJCWlvdW5tYXAoc2FhLT5zYWE3MTQ2X21lbSk7CisJCWlmIChzYWEtPnZpZGVvX2Rldi5taW5vciAhPSAtMSkKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZzYWEtPnZpZGVvX2Rldik7CisJfQorfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHN0cmFkaXNfaW5pdCAodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMCwgaTsKKworCXNhYV9udW0gPSAwOworCisJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9QSElMSVBTLCBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzE0NiwgZGV2KSkpIHsKKwkJaWYgKCFkZXYtPnN1YnN5c3RlbV92ZW5kb3IpCisJCQlwcmludGsoS0VSTl9JTkZPICJzdHJhZGlzJWQ6IHJldjEgZGVjb2RlclxuIiwgc2FhX251bSk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gInN0cmFkaXMlZDogU0RNMnh4IGZvdW5kXG4iLCBzYWFfbnVtKTsgCisJCXJlc3VsdCA9IGNvbmZpZ3VyZV9zYWE3MTQ2KGRldiwgc2FhX251bSsrKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCWlmIChzYWFfbnVtKQorCQlwcmludGsoS0VSTl9JTkZPICJzdHJhZGlzOiAlZCBjYXJkKHMpIGZvdW5kLlxuIiwgc2FhX251bSk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgc2FhX251bTsgaSsrKQorCQlpZiAoaW5pdF9zYWE3MTQ2KGkpIDwgMCkgeworCQkJcmVsZWFzZV9zYWEoKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHN0cmFkaXNfZXhpdCAodm9pZCkKK3sKKwlyZWxlYXNlX3NhYSgpOworCXByaW50ayhLRVJOX0lORk8gInN0cmFkaXM6IG1vZHVsZSBjbGVhbnVwIGNvbXBsZXRlXG4iKTsKK30KKworCittb2R1bGVfaW5pdChzdHJhZGlzX2luaXQpOworbW9kdWxlX2V4aXQoc3RyYWRpc19leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzZhNGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKQEAgLTAsMCArMSw1NTYgQEAKKy8qCisgKiBGb3IgdGhlIFNUUy1UaG9tcHNvbiBUREE3NDMyIGF1ZGlvIHByb2Nlc3NvciBjaGlwCisgKgorICogSGFuZGxlcyBhdWRpbyBmdW5jdGlvbnM6IHZvbHVtZSwgYmFsYW5jZSwgdG9uZSwgbG91ZG5lc3MKKyAqIFRoaXMgZHJpdmVyIHdpbGwgbm90IGNvbXBsYWluIGlmIHVzZWQgd2l0aCBhbnkKKyAqIG90aGVyIGkyYyBkZXZpY2Ugd2l0aCB0aGUgc2FtZSBhZGRyZXNzLgorICoKKyAqIE11dGluZyBhbmQgdG9uZSBjb250cm9sIGJ5IEpvbmF0aGFuIElzb20gPGppc29tQGVtYXRpYy5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwIEVyaWMgU2FuZGVlbiA8ZXJpY19zYW5kZWVuQGJpZ2Zvb3QuY29tPgorICogVGhpcyBjb2RlIGlzIHBsYWNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBCYXNlZCBvbiB0ZGE5ODU1LmMgYnkgU3RldmUgVmFuRGVCb2dhcnQgKHZhbmRlYm9AdWNsaW5rLmJlcmtlbGV5LmVkdSkKKyAqIFdoaWNoIHdhcyBiYXNlZCBvbiB0ZGE4NDI1LmMgYnkgR3JlZyBBbGV4YW5kZXIgKGMpIDE5OTgKKyAqCisgKiBPUFRJT05TOgorICogZGVidWcgICAgLSBzZXQgdG8gMSBpZiB5b3UnZCBsaWtlIHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcworICogICAgICAgICAgICBzZXQgdG8gMiBpZiB5b3UnZCBsaWtlIHRvIGJlIGludW5kYXRlZCB3aXRoIGRlYnVnIG1lc3NhZ2VzCisgKgorICogbG91ZG5lc3MgLSBzZXQgYmV0d2VlbiAwIGFuZCAxNSBmb3IgdmFyeWluZyBkZWdyZWVzIG9mIGxvdWRuZXNzIGVmZmVjdAorICoKKyAqIG1heHZvbCAgIC0gc2V0IG1heGltaXVtIHZvbHVtZSB0byArMjBkYiAoMSksIGRlZmF1bHQgaXMgMGRiKDApCisgKgorICoKKyAqICBSZXZpc2lvbjogMC43IC0gbWF4dm9sIG1vZHVsZSBwYXJtIHRvIHNldCBtYXhpbWl1bSB2b2x1bWUgMGRiIG9yICsyMGRiCisgKiAgCQkJCXN0b3JlIGlmIG11dGVkIHNvIHdlIGNhbiByZXR1cm4gaXQKKyAqICAJCQkJY2hhbmdlIGJhbGFuY2Ugb25seSBpZiBmbGFnZWQgdG8KKyAqICBSZXZpc2lvbjogMC42IC0gYWRkZWQgdG9uZSBjb250cm9scworICogIFJldmlzaW9uOiAwLjUgLSBGaXhlZCBvZGQgYmFsYW5jZSBwcm9ibGVtCisgKiAgUmV2aXNpb246IDAuNCAtIGFkZGVkIG11dGluZworICogIFJldmlzaW9uOiAwLjMgLSBGaXhlZCBzaWxseSByZXZlcnNlZCB2b2x1bWUgY29udHJvbHMuICA6KQorICogIFJldmlzaW9uOiAwLjIgLSBDbGVhbmVkIHVwICNkZWZpbmVzCisgKgkJCWZpeGVkIHZvbHVtZSBjb250cm9sCisgKiAgICAgICAgICBBZGRlZCBJMkNfRFJJVkVSSURfVERBNzQzMgorICoJCQlhZGRlZCBsb3VkbmVzcyBpbnNtb2QgY29udHJvbAorICogIFJldmlzaW9uOiAwLjEgLSBpbml0aWFsIHZlcnNpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisKKyNpbmNsdWRlICJidHR2LmgiCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9jaGlwLmg+CisjaW5jbHVkZSA8bWVkaWEvaWQuaD4KKworI2lmbmRlZiBWSURFT19BVURJT19CQUxBTkNFCisjIGRlZmluZSBWSURFT19BVURJT19CQUxBTkNFIDMyCisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiRXJpYyBTYW5kZWVuIDxlcmljX3NhbmRlZW5AYmlnZm9vdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImJ0dHYgZHJpdmVyIGZvciB0aGUgdGRhNzQzMiBhdWRpbyBwcm9jZXNzb3IgY2hpcCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IG1heHZvbDsKK3N0YXRpYyBpbnQgbG91ZG5lc3M7IC8qIGRpc2FibGUgbG91ZG5lc3MgYnkgZGVmYXVsdCAqLworc3RhdGljIGludCBkZWJ1ZzsJIC8qIGluc21vZCBwYXJhbWV0ZXIgKi8KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0obG91ZG5lc3MsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKG1heHZvbCwiU2V0IG1heGltaXVtIHZvbHVtZSB0byArMjBkYiAoMCksIGRlZmF1bHQgaXMgMGRiKDEpIik7Cittb2R1bGVfcGFyYW0obWF4dm9sLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworCisvKiBBZGRyZXNzIHRvIHNjYW4gKEkyQyBhZGRyZXNzIG9mIHRoaXMgY2hpcCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7CisJSTJDX1REQTc0MzIgPj4gMSwKKwlJMkNfQ0xJRU5UX0VORCwKK307CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY19yYW5nZVtdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK0kyQ19DTElFTlRfSU5TTU9EOworCisvKiBTdHJ1Y3R1cmUgb2YgYWRkcmVzcyBhbmQgc3ViYWRkcmVzc2VzIGZvciB0aGUgdGRhNzQzMiAqLworCitzdHJ1Y3QgdGRhNzQzMiB7CisJaW50IGFkZHI7CisJaW50IGlucHV0OworCWludCB2b2x1bWU7CisJaW50IG11dGVkOworCWludCBiYXNzLCB0cmVibGU7CisJaW50IGxmLCBsciwgcmYsIHJyOworCWludCBsb3VkOworCXN0cnVjdCBpMmNfY2xpZW50IGM7Cit9Oworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CisKKyNkZWZpbmUgZHByaW50ayAgaWYgKGRlYnVnKSBwcmludGsKKyNkZWZpbmUgZDJwcmludGsgaWYgKGRlYnVnID4gMSkgcHJpbnRrCisKKy8qIFRoZSBUREE3NDMyIGlzIG1hZGUgYnkgU1RTLVRob21wc29uCisgKiBodHRwOi8vd3d3LnN0LmNvbQorICogaHR0cDovL3VzLnN0LmNvbS9zdG9ubGluZS9ib29rcy9wZGYvZG9jcy80MDU2LnBkZgorICoKKyAqIFREQTc0MzI6IEkyQy1idXMgY29udHJvbGxlZCBiYXNpYyBhdWRpbyBwcm9jZXNzb3IKKyAqCisgKiBUaGUgVERBNzQzMiBjb250cm9scyBiYXNpYyBhdWRpbyBmdW5jdGlvbnMgbGlrZSB2b2x1bWUsIGJhbGFuY2UsCisgKiBhbmQgdG9uZSBjb250cm9sIChpbmNsdWRpbmcgbG91ZG5lc3MpLiAgSXQgYWxzbyBoYXMgZm91ciBjaGFubmVsCisgKiBvdXRwdXQgKGZvciBmcm9udCBhbmQgcmVhcikuICBTaW5jZSBtb3N0IHZpZGNhcCBjYXJkcyBwcm9iYWJseQorICogZG9uJ3QgaGF2ZSA0IGNoYW5uZWwgb3V0cHV0LCB0aGlzIGRyaXZlciB3aWxsIHNldCBmcm9udCAmIHJlYXIKKyAqIHRvZ2V0aGVyIChubyBpbmRlcGVuZGVudCBjb250cm9sKS4KKyAqLworCisJCS8qIFN1YmFkZHJlc3NlcyBmb3IgVERBNzQzMiAqLworCisjZGVmaW5lIFREQTc0MzJfSU4JMHgwMCAvKiBJbnB1dCBzZWxlY3QgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFREQTc0MzJfVkwJMHgwMSAvKiBWb2x1bWUgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFREQTc0MzJfVE4JMHgwMiAvKiBCYXNzLCBUcmVibGUgKFRvbmUpICAgICAgICAgICovCisjZGVmaW5lIFREQTc0MzJfTEYJMHgwMyAvKiBBdHRlbnVhdGlvbiBMRiAoTGVmdCBGcm9udCkgICovCisjZGVmaW5lIFREQTc0MzJfTFIJMHgwNCAvKiBBdHRlbnVhdGlvbiBMUiAoTGVmdCBSZWFyKSAgICovCisjZGVmaW5lIFREQTc0MzJfUkYJMHgwNSAvKiBBdHRlbnVhdGlvbiBSRiAoUmlnaHQgRnJvbnQpICovCisjZGVmaW5lIFREQTc0MzJfUlIJMHgwNiAvKiBBdHRlbnVhdGlvbiBSUiAoUmlnaHQgUmVhcikgICovCisjZGVmaW5lIFREQTc0MzJfTEQJMHgwNyAvKiBMb3VkbmVzcyAgICAgICAgICAgICAgICAgICAgICovCisKKworCQkvKiBNYXNrcyBmb3IgYml0cyBpbiBUREE3NDMyIHN1YmFkZHJlc3NlcyAqLworCisvKiBNYW55IG9mIHRoZXNlIG5vdCB1c2VkIC0ganVzdCBmb3IgZG9jdW1lbnRhdGlvbiAqLworCisvKiBTdWJhZGRyZXNzIDB4MDAgLSBJbnB1dCBzZWxlY3Rpb24gYW5kIGJhc3MgY29udHJvbCAqLworCisvKiBCaXRzIDAsMSwyIGNvbnRyb2wgaW5wdXQ6CisgKiAweDAwIC0gU3RlcmVvIGlucHV0CisgKiAweDAyIC0gTW9ubyBpbnB1dAorICogMHgwMyAtIE11dGUgIChVc2luZyBBdHRlbnVhdG9ycyBQbGF5cyBiZXR0ZXIgd2l0aCBtb2R1bGVzKQorICogTW9ubyBwcm9iYWJseSBpc24ndCB1c2VkIC0gSSdtIGd1ZXNzaW5nIG9ubHkgdGhlIHN0ZXJlbworICogaW5wdXQgaXMgY29ubmVjdGVkIG9uIG1vc3QgY2FyZHMsIHNvIHdlJ2xsIHNldCBpdCB0byBzdGVyZW8uCisgKgorICogQml0IDMgY29udHJvbHMgYmFzcyBjdXQ6IDAvMSBpcyBub24tc3ltbWV0cmljL3N5bW1ldHJpYyBiYXNzIGN1dAorICogQml0IDQgY29udHJvbHMgYmFzcyByYW5nZTogMC8xIGlzIGV4dGVuZGVkL3N0YW5kYXJkIGJhc3MgcmFuZ2UKKyAqCisgKiBIaWdoZXN0IDMgYml0cyBub3QgdXNlZAorICovCisKKyNkZWZpbmUgVERBNzQzMl9TVEVSRU9fSU4JMAorI2RlZmluZSBUREE3NDMyX01PTk9fSU4JCTIJLyogUHJvYmFibHkgd29uJ3QgYmUgdXNlZCAqLworI2RlZmluZSBUREE3NDMyX0JBU1NfU1lNCTEgPDwgMworI2RlZmluZSBUREE3NDMyX0JBU1NfTk9STQkxIDw8IDQKKworLyogU3ViYWRkcmVzcyAweDAxIC0gVm9sdW1lICovCisKKy8qIExvd2VyIDcgYml0cyBjb250cm9sIHZvbHVtZSBmcm9tIC03OWRCIHRvICszMmRCIGluIDFkQiBzdGVwcworICogUmVjb21tZW5kZWQgbWF4aW11bSBpcyArMjAgZEIKKyAqCisgKiArMzJkQjogMHgwMAorICogKzIwZEI6IDB4MGMKKyAqICAgMGRCOiAweDIwCisgKiAtNzlkQjogMHg2ZgorICoKKyAqIE1TQiAoYml0IDcpIGNvbnRyb2xzIGxvdWRuZXNzOiAxLzAgaXMgbG91ZG5lc3Mgb24vb2ZmCisgKi8KKworI2RlZmluZQlUREE3NDMyX1ZPTF8wREIJCTB4MjAKKyNkZWZpbmUgVERBNzQzMl9MRF9PTgkJMSA8PCA3CisKKworLyogU3ViYWRkcmVzcyAweDAyIC0gVG9uZSBjb250cm9sICovCisKKy8qIEJpdHMgMCwxLDIgY29udHJvbCBhYnNvbHV0ZSB0cmVibGUgZ2FpbiBmcm9tIDBkQiB0byAxNGRCCisgKiAweDAgaXMgMTRkQiwgMHg3IGlzIDBkQgorICoKKyAqIEJpdCAzIGNvbnRyb2xzIHRyZWJsZSBhdHRlbnVhdGlvbi9nYWluIChzaWduKQorICogMSA9IGdhaW4gKCspCisgKiAwID0gYXR0ZW51YXRpb24gKC0pCisgKgorICogQml0cyA0LDUsNiBjb250cm9sIGFic29sdXRlIGJhc3MgZ2FpbiBmcm9tIDBkQiB0byAxNGRCCisgKiAoVGhpcyBpcyBvbmx5IHRydWUgZm9yIG5vcm1hbCBiYXNlIHJhbmdlLCBzZXQgaW4gMHgwMCkKKyAqIDB4MCA8PCA0IGlzIDE0ZEIsIDB4NyBpcyAwZEIKKyAqCisgKiBCaXQgNyBjb250cm9scyBiYXNzIGF0dGVudWF0aW9uL2dhaW4gKHNpZ24pCisgKiAxIDw8IDcgPSBnYWluICgrKQorICogMCA8PCA3ID0gYXR0ZW51YXRpb24gKC0pCisgKgorICogRXhhbXBsZToKKyAqIDEgMSAwIDEgMCAxIDAgMSBpcyArNGRCIGJhc3MsIC00ZEIgdHJlYmxlCisgKi8KKworI2RlZmluZSBUREE3NDMyX1RSRUJMRV8wREIJCTB4ZgorI2RlZmluZSBUREE3NDMyX1RSRUJMRQkJCTcKKyNkZWZpbmUgVERBNzQzMl9UUkVCTEVfR0FJTgkJMSA8PCAzCisjZGVmaW5lIFREQTc0MzJfQkFTU18wREIJCTB4ZgorI2RlZmluZSBUREE3NDMyX0JBU1MJCQk3IDw8IDQKKyNkZWZpbmUgVERBNzQzMl9CQVNTX0dBSU4JCTEgPDwgNworCisKKy8qIFN1YmFkZHJlc3MgMHgwMyAtIExlZnQgIEZyb250IGF0dGVudWF0aW9uICovCisvKiBTdWJhZGRyZXNzIDB4MDQgLSBMZWZ0ICBSZWFyICBhdHRlbnVhdGlvbiAqLworLyogU3ViYWRkcmVzcyAweDA1IC0gUmlnaHQgRnJvbnQgYXR0ZW51YXRpb24gKi8KKy8qIFN1YmFkZHJlc3MgMHgwNiAtIFJpZ2h0IFJlYXIgIGF0dGVudWF0aW9uICovCisKKy8qIEJpdHMgMCwxLDIsMyw0IGNvbnRyb2wgYXR0ZW51YXRpb24gZnJvbSAwZEIgdG8gLTM3LjVkQgorICogaW4gMS41ZEIgc3RlcHMuCisgKgorICogMHgwMCBpcyAgICAgMGRCCisgKiAweDFmIGlzIC0zNy41ZEIKKyAqCisgKiBCaXQgNSBtdXRlcyB0aGF0IGNoYW5uZWwgd2hlbiBzZXQgKDEgPSBtdXRlLCAwID0gdW5tdXRlKQorICogV2UnbGwgdXNlIHRoZSBtdXRlIG9uIHRoZSBpbnB1dCwgdGhvdWdoIChhYm92ZSkKKyAqIEJpdHMgNiw3IHVudXNlZAorICovCisKKyNkZWZpbmUgVERBNzQzMl9BVFRFTl8wREIJMHgwMAorI2RlZmluZSBUREE3NDMyX01VVEUgICAgICAgIDB4MSA8PCA1CisKKworLyogU3ViYWRkcmVzcyAweDA3IC0gTG91ZG5lc3MgQ29udHJvbCAqLworCisvKiBCaXRzIDAsMSwyLDMgY29udHJvbCBsb3VkbmVzcyBmcm9tIDBkQiB0byAtMTVkQiBpbiAxZEIgc3RlcHMKKyAqIHdoZW4gYml0IDQgaXMgTk9UIHNldAorICoKKyAqIDB4MCBpcyAgIDBkQgorICogMHhmIGlzIC0xNWRCCisgKgorICogSWYgYml0IDQgaXMgc2V0LCB0aGVuIHRoZXJlIGlzIGEgZmxhdCBhdHRlbnVhdGlvbiBhY2NvcmRpbmcgdG8KKyAqIHRoZSBsb3dlciA0IGJpdHMsIGFzIGFib3ZlLgorICoKKyAqIEJpdHMgNSw2LDcgdW51c2VkCisgKi8KKworCisKKy8qIEJlZ2luIGNvZGUgKi8KKworc3RhdGljIGludCB0ZGE3NDMyX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBzdWJhZGRyLCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzJdOworCWQycHJpbnRrKCJ0ZGE3NDMyOiBJbiB0ZGE3NDMyX3dyaXRlXG4iKTsKKwlkcHJpbnRrKCJ0ZGE3NDMyOiBXcml0aW5nICVkIDB4JXhcbiIsIHN1YmFkZHIsIHZhbCk7CisJYnVmZmVyWzBdID0gc3ViYWRkcjsKKwlidWZmZXJbMV0gPSB2YWw7CisJaWYgKDIgIT0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWZmZXIsMikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidGRhNzQzMjogSS9PIGVycm9yLCB0cnlpbmcgKHdyaXRlICVkIDB4JXgpXG4iLAorCQkgICAgICAgc3ViYWRkciwgdmFsKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogSSBkb24ndCB0aGluayB3ZSBldmVyIGFjdHVhbGx5IF9yZWFkXyB0aGUgY2hpcC4uLiAqLworI2lmIDAKK3N0YXRpYyBpbnQgdGRhNzQzMl9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdW5zaWduZWQgY2hhciBidWZmZXI7CisJZDJwcmludGsoInRkYTc0MzI6IEluIHRkYTc0MzJfcmVhZFxuIik7CisJaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwmYnVmZmVyLDEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInRkYTc0MzI6IEkvTyBlcnJvciwgdHJ5aW5nIChyZWFkKVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJZHByaW50aygidGRhNzQzMjogUmVhZCAweCUwMnhcbiIsIGJ1ZmZlcik7CisJcmV0dXJuIGJ1ZmZlcjsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHRkYTc0MzJfc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHRkYTc0MzIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07CisJZDJwcmludGsoInRkYTc0MzI6IEluIHRkYTc0MzJfc2V0XG4iKTsKKworCWRwcmludGsoS0VSTl9JTkZPCisJCSJ0ZGE3NDMyOiA3NDMyX3NldCgweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeClcbiIsCisJCXQtPmlucHV0LHQtPnZvbHVtZSx0LT5iYXNzLHQtPnRyZWJsZSx0LT5sZix0LT5scix0LT5yZix0LT5ycix0LT5sb3VkKTsKKwlidWZbMF0gID0gVERBNzQzMl9JTjsKKwlidWZbMV0gID0gdC0+aW5wdXQ7CisJYnVmWzJdICA9IHQtPnZvbHVtZTsKKwlidWZbM10gID0gdC0+YmFzczsKKwlidWZbNF0JPSB0LT50cmVibGU7CisJYnVmWzVdICA9IHQtPmxmOworCWJ1Zls2XSAgPSB0LT5scjsKKwlidWZbN10gID0gdC0+cmY7CisJYnVmWzhdICA9IHQtPnJyOworCWJ1Zls5XSAgPSB0LT5sb3VkOworCWlmICgxMCAhPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LGJ1ZiwxMCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidGRhNzQzMjogSS9PIGVycm9yLCB0cnlpbmcgdGRhNzQzMl9zZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3RkYTc0MzJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB0ZGE3NDMyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJZDJwcmludGsoInRkYTc0MzI6IEluIHRkYTc0MzJfaW5pdFxuIik7CisKKwl0LT5pbnB1dCAgPSBUREE3NDMyX1NURVJFT19JTiB8ICAvKiBNYWluIChzdGVyZW8pIGlucHV0ICAgKi8KKwkJICAgIFREQTc0MzJfQkFTU19TWU0gIHwgIC8qIFN5bW1ldHJpYyBiYXNzIGN1dCAgICAqLworCQkgICAgVERBNzQzMl9CQVNTX05PUk07ICAgLyogTm9ybWFsIGJhc3MgcmFuZ2UgICAgICovCisJdC0+dm9sdW1lID0gIDB4M2IgOwkJCQkgLyogLTI3ZEIgVm9sdW1lICAgICAgICAgICAgKi8KKwlpZiAobG91ZG5lc3MpCQkJIC8qIFR1cm4gbG91ZG5lc3Mgb24/ICAgICAqLworCQl0LT52b2x1bWUgfD0gVERBNzQzMl9MRF9PTjsKKwl0LT5tdXRlZCAgICA9IFZJREVPX0FVRElPX01VVEU7CisJdC0+dHJlYmxlICAgPSBUREE3NDMyX1RSRUJMRV8wREI7IC8qIDBkQiBUcmVibGUgICAgICAgICAgICAqLworCXQtPmJhc3MJCT0gVERBNzQzMl9CQVNTXzBEQjsgCSAvKiAwZEIgQmFzcyAgICAgICAgICAgICAgKi8KKwl0LT5sZiAgICAgPSBUREE3NDMyX0FUVEVOXzBEQjsJIC8qIDBkQiBhdHRlbnVhdGlvbiAgICAgICAqLworCXQtPmxyICAgICA9IFREQTc0MzJfQVRURU5fMERCOwkgLyogMGRCIGF0dGVudWF0aW9uICAgICAgICovCisJdC0+cmYgICAgID0gVERBNzQzMl9BVFRFTl8wREI7CSAvKiAwZEIgYXR0ZW51YXRpb24gICAgICAgKi8KKwl0LT5yciAgICAgPSBUREE3NDMyX0FUVEVOXzBEQjsJIC8qIDBkQiBhdHRlbnVhdGlvbiAgICAgICAqLworCXQtPmxvdWQgICA9IGxvdWRuZXNzOwkJIC8qIGluc21vZCBwYXJhbWV0ZXIgICAgICAqLworCisJdGRhNzQzMl9zZXQoY2xpZW50KTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKiogKgorICogaTJjIGludGVyZmFjZSBmdW5jdGlvbnMgKgorICogKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIGludCB0ZGE3NDMyX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgdGRhNzQzMiAqdDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWQycHJpbnRrKCJ0ZGE3NDMyOiBJbiB0ZGE3NDMyX2F0dGFjaFxuIik7CisKKwl0ID0ga21hbGxvYyhzaXplb2YgKnQsR0ZQX0tFUk5FTCk7CisJaWYgKCF0KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQodCwwLHNpemVvZiAqdCk7CisKKwljbGllbnQgPSAmdC0+YzsKKyAgICAgICAgbWVtY3B5KGNsaWVudCwmY2xpZW50X3RlbXBsYXRlLHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworICAgICAgICBjbGllbnQtPmFkYXB0ZXIgPSBhZGFwOworICAgICAgICBjbGllbnQtPmFkZHIgPSBhZGRyOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHQpOworCisJZG9fdGRhNzQzMl9pbml0KGNsaWVudCk7CisJcHJpbnRrKEtFUk5fSU5GTyAidGRhNzQzMjogaW5pdFxuIik7CisKKwlpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTc0MzJfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKKwlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQorCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHRkYTc0MzJfYXR0YWNoKTsKKyNlbHNlCisJaWYgKGFkYXAtPmlkID09IChJMkNfQUxHT19CSVQgfCBJMkNfSFdfQl9CVDg0OCkpCisJCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgdGRhNzQzMl9hdHRhY2gpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhNzQzMl9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdGRhNzQzMiAqdCAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvX3RkYTc0MzJfaW5pdChjbGllbnQpOworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisKKwlrZnJlZSh0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZGE3NDMyX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdGRhNzQzMiAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWQycHJpbnRrKCJ0ZGE3NDMyOiBJbiB0ZGE3NDMyX2NvbW1hbmRcbiIpOworCisJc3dpdGNoIChjbWQpIHsKKwkvKiAtLS0gdjRsIGlvY3RscyAtLS0gKi8KKwkvKiB0YWtlIGNhcmU6IGJ0dHYgZG9lcyB1c2Vyc3BhY2UgY29weWluZywgd2UnbGwgZ2V0IGEKKwkgICBrZXJuZWwgcG9pbnRlciBoZXJlLi4uICovCisKKwkvKiBRdWVyeSBjYXJkIC0gc2NhbGUgZnJvbSBUREE3NDMyIHNldHRpbmdzIHRvIFY0TCBzZXR0aW5ncyAqLworCWNhc2UgVklESU9DR0FVRElPOgorCXsKKwkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKKwkJZHByaW50aygidGRhNzQzMjogVklESU9DR0FVRElPXG4iKTsKKworCQl2YS0+ZmxhZ3MgfD0gVklERU9fQVVESU9fVk9MVU1FIHwKKwkJCVZJREVPX0FVRElPX0JBU1MgfAorCQkJVklERU9fQVVESU9fVFJFQkxFIHwKKwkJCVZJREVPX0FVRElPX01VVEFCTEU7CisJCWlmICh0LT5tdXRlZCkKKwkJCXZhLT5mbGFncyB8PSBWSURFT19BVURJT19NVVRFOworCQl2YS0+bW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87CisJCS8qIE1hc3RlciB2b2x1bWUgY29udHJvbAorCQkgKiBWNEwgdm9sdW1lIGlzIG1pbiAwLCBtYXggNjU1MzUKKwkJICogVERBNzQzMiBWb2x1bWU6CisJCSAqIE1pbiAoLTc5ZEIpIGlzIDB4NmYKKwkJICogTWF4ICgrMjBkQikgaXMgMHgwNyAoNjMwKQorCQkgKiBNYXggKDBkQikgaXMgMHgyMCAoODI5KQorCQkgKiAoTWFzayBvdXQgYml0IDcgb2Ygdm9sIC0gaXQncyBmb3IgdGhlIGxvdWRuZXNzIHNldHRpbmcpCisJCSAqLworCQlpZiAoIW1heHZvbCl7ICAvKiBtYXggKzIwZGIgKi8KKwkJCXZhLT52b2x1bWUgPSAoIDB4NmYgLSAodC0+dm9sdW1lICYgMHg3RikgKSAqIDYzMDsKKwkJfSBlbHNlIHsgICAgICAgLyogbWF4IDBkYiAgICovCisJCQl2YS0+dm9sdW1lID0gKCAweDZmIC0gKHQtPnZvbHVtZSAmIDB4N0YpICkgKiA4Mjk7CisJCX0KKworCQkvKiBCYWxhbmNlIGRlcGVuZHMgb24gTCxSIGF0dGVudWF0aW9uCisJCSAqIFY0TCBiYWxhbmNlIGlzIDAgdG8gNjU1MzUsIG1pZGRsZSBpcyAzMjc2OAorCQkgKiBUREE3NDMyIGF0dGVudWF0aW9uOiBtaW4gKDBkQikgaXMgMCwgbWF4ICgtMzcuNWRCKSBpcyAweDFmCisJCSAqIHRvIHNjYWxlIHVwIHRvIFY0TCBudW1iZXJzLCBtdWx0IGJ5IDEwNTcKKwkJICogYXR0ZW51YXRpb24gZXhpc3RzIGZvciBsZiwgbHIsIHJmLCBycgorCQkgKiB3ZSB1c2Ugb25seSBsZiBhbmQgcmYgKGZyb250IGNoYW5uZWxzKQorCQkgKi8KKworCQlpZiAoICh0LT5sZikgPCAodC0+cmYpICkKKwkJCS8qIHJpZ2h0IGlzIGF0dGVudWF0ZWQsIGJhbGFuY2Ugc2hpZnRlZCBsZWZ0ICovCisJCQl2YS0+YmFsYW5jZSA9ICgzMjc2OCAtIDEwNTcqKHQtPnJmKSk7CisJCWVsc2UKKwkJCS8qIGxlZnQgaXMgYXR0ZW51YXRlZCwgYmFsYW5jZSBzaGlmdGVkIHJpZ2h0ICovCisJCQl2YS0+YmFsYW5jZSA9ICgzMjc2OCArIDEwNTcqKHQtPmxmKSk7CisKKwkJLyogQmFzcy90cmVibGUgNCBiaXRzIGVhY2ggKi8KKwkJdmEtPmJhc3M9dC0+YmFzczsKKwkJaWYodmEtPmJhc3MgPj0gMHg4KQorCQkJdmEtPmJhc3MgPSB+KHZhLT5iYXNzIC0gMHg4KSAmIDB4ZjsKKwkJdmEtPmJhc3MgPSAodmEtPmJhc3MgPDwgMTIpKyh2YS0+YmFzcyA8PCA4KSsodmEtPmJhc3MgPDwgNCkrKHZhLT5iYXNzKTsKKwkJdmEtPnRyZWJsZT10LT50cmVibGU7CisJCWlmKHZhLT50cmVibGUgPj0gMHg4KQorCQkJdmEtPnRyZWJsZSA9IH4odmEtPnRyZWJsZSAtIDB4OCkgJiAweGY7CisJCXZhLT50cmVibGUgPSAodmEtPnRyZWJsZSA8PCAxMikrKHZhLT50cmVibGUgPDwgOCkrKHZhLT50cmVibGUgPDwgNCkrKHZhLT50cmVibGUpOworCisJCWJyZWFrOyAvKiBWSURJT0NHQVVESU8gY2FzZSAqLworCX0KKworCS8qIFNldCBjYXJkIC0gc2NhbGUgZnJvbSBWNEwgc2V0dGluZ3MgdG8gVERBNzQzMiBzZXR0aW5ncyAqLworCWNhc2UgVklESU9DU0FVRElPOgorCXsKKwkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKKwkJZHByaW50aygidGRhNzQzMjogVklERU9DU0FVRElPXG4iKTsKKworCQlpZih2YS0+ZmxhZ3MgJiBWSURFT19BVURJT19WT0xVTUUpeworCQkJaWYoIW1heHZvbCl7IC8qIG1heCArMjBkYiAqLworCQkJCXQtPnZvbHVtZSA9IDB4NmYgLSAoKHZhLT52b2x1bWUpLzYzMCk7CisJCQl9IGVsc2UgeyAgICAvKiBtYXggMGRiICAgKi8KKwkJCQl0LT52b2x1bWUgPSAweDZmIC0gKCh2YS0+dm9sdW1lKS84MjkpOworCQkJfQorCisJCWlmIChsb3VkbmVzcykJCS8qIFR1cm4gb24gdGhlIGxvdWRuZXNzIGJpdCAqLworCQkJdC0+dm9sdW1lIHw9IFREQTc0MzJfTERfT047CisKKwkJCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfVkwsIHQtPnZvbHVtZSk7CisJCX0KKworCQlpZih2YS0+ZmxhZ3MgJiBWSURFT19BVURJT19CQVNTKQorCQl7CisJCQl0LT5iYXNzID0gdmEtPmJhc3MgPj4gMTI7CisJCQlpZih0LT5iYXNzPj0gMHg4KQorCQkJCQl0LT5iYXNzID0gKH50LT5iYXNzICYgMHhmKSArIDB4OCA7CisJCX0KKwkJaWYodmEtPmZsYWdzICYgVklERU9fQVVESU9fVFJFQkxFKQorCQl7CisJCQl0LT50cmVibGU9IHZhLT50cmVibGUgPj4gMTI7CisJCQlpZih0LT50cmVibGU+PSAweDgpCisJCQkJCXQtPnRyZWJsZSA9ICh+dC0+dHJlYmxlICYgMHhmKSArIDB4OCA7CisJCX0KKwkJaWYodmEtPmZsYWdzICYgKFZJREVPX0FVRElPX1RSRUJMRXwgVklERU9fQVVESU9fQkFTUykpCisJCQl0ZGE3NDMyX3dyaXRlKGNsaWVudCxUREE3NDMyX1ROLCAweDEwIHwgKHQtPmJhc3MgPDwgNCkgfCB0LT50cmVibGUgKTsKKworCQlpZih2YS0+ZmxhZ3MgJiBWSURFT19BVURJT19CQUxBTkNFKQl7CisJCWlmICh2YS0+YmFsYW5jZSA8IDMyNzY4KQorCQl7CisJCQkvKiBzaGlmdGVkIHRvIGxlZnQsIGF0dGVudWF0ZSByaWdodCAqLworCQkJdC0+cnIgPSAoMzI3NjggLSB2YS0+YmFsYW5jZSkvMTA1NzsKKwkJCXQtPnJmID0gdC0+cnI7CisJCQl0LT5sciA9IFREQTc0MzJfQVRURU5fMERCOworCQkJdC0+bGYgPSBUREE3NDMyX0FUVEVOXzBEQjsKKwkJfQorCQllbHNlIGlmKHZhLT5iYWxhbmNlID4gMzI3NjkpCisJCXsKKwkJCS8qIHNoaWZ0ZWQgdG8gcmlnaHQsIGF0dGVudWF0ZSBsZWZ0ICovCisJCQl0LT5sZiA9ICh2YS0+YmFsYW5jZSAtIDMyNzY4KS8xMDU3OworCQkJdC0+bHIgPSB0LT5sZjsKKwkJCXQtPnJyID0gVERBNzQzMl9BVFRFTl8wREI7CisJCQl0LT5yZiA9IFREQTc0MzJfQVRURU5fMERCOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogY2VudGVyZWQgKi8KKwkJCXQtPnJyID0gVERBNzQzMl9BVFRFTl8wREI7CisJCQl0LT5yZiA9IFREQTc0MzJfQVRURU5fMERCOworCQkJdC0+bGYgPSBUREE3NDMyX0FUVEVOXzBEQjsKKwkJCXQtPmxyID0gVERBNzQzMl9BVFRFTl8wREI7CisJCX0KKwkJfQorCisJIAl0LT5tdXRlZD0odmEtPmZsYWdzICYgVklERU9fQVVESU9fTVVURSk7CisJCWlmICh0LT5tdXRlZCkKKwkJeworCQkJLyogTXV0ZSAmIHVwZGF0ZSBiYWxhbmNlKi8KKwkJCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfTEYsIHQtPmxmIHwgVERBNzQzMl9NVVRFKTsKKwkJCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfTFIsIHQtPmxyIHwgVERBNzQzMl9NVVRFKTsKKwkJCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfUkYsIHQtPnJmIHwgVERBNzQzMl9NVVRFKTsKKwkJCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfUlIsIHQtPnJyIHwgVERBNzQzMl9NVVRFKTsKKwkJfSBlbHNlIHsKKwkJCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfTEYsIHQtPmxmKTsKKwkJCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfTFIsIHQtPmxyKTsKKwkJCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfUkYsIHQtPnJmKTsKKwkJCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfUlIsIHQtPnJyKTsKKwkJfQorCisJCWJyZWFrOworCisJfSAvKiBlbmQgb2YgVklERU9DU0FVRElPIGNhc2UgKi8KKworCWRlZmF1bHQ6IC8qIE5vdCBWSURFT0NHQVVESU8gb3IgVklERU9DU0FVRElPICovCisKKwkJLyogbm90aGluZyAqLworCQlkMnByaW50aygidGRhNzQzMjogRGVmYXVsdFxuIik7CisKKwl9IC8qIGVuZCBvZiAoY21kKSBzd2l0Y2ggKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0geworCS5vd25lciAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKyAgICAgICAgLm5hbWUgICAgICAgICAgICA9ICJpMmMgdGRhNzQzMiBkcml2ZXIiLAorCS5pZCAgICAgICAgICAgICAgPSBJMkNfRFJJVkVSSURfVERBNzQzMiwKKyAgICAgICAgLmZsYWdzICAgICAgICAgICA9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyICA9IHRkYTc0MzJfcHJvYmUsCisgICAgICAgIC5kZXRhY2hfY2xpZW50ICAgPSB0ZGE3NDMyX2RldGFjaCwKKyAgICAgICAgLmNvbW1hbmQgICAgICAgICA9IHRkYTc0MzJfY29tbWFuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQoreworCUkyQ19ERVZOQU1FKCJ0ZGE3NDMyIiksCisJLmRyaXZlciAgICAgPSAmZHJpdmVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGRhNzQzMl9pbml0KHZvaWQpCit7CisJaWYgKCAobG91ZG5lc3MgPCAwKSB8fCAobG91ZG5lc3MgPiAxNSkgKSB7CisJCXByaW50ayhLRVJOX0VSUiAidGRhNzQzMjogbG91ZG5lc3MgcGFyYW1ldGVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxNVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRkYTc0MzJfZmluaSh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0ZGE3NDMyX2luaXQpOworbW9kdWxlX2V4aXQodGRhNzQzMl9maW5pKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3Y2MzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogJElkOiB0ZGE4MjkwLmMsdiAxLjcgMjAwNS8wMy8wNyAxMjowMTo1MSBrcmF4ZWwgRXhwICQKKyAqCisgKiBpMmMgdHYgdHVuZXIgY2hpcCBkZXZpY2UgZHJpdmVyCisgKiBjb250cm9scyB0aGUgcGhpbGlwcyB0ZGE4MjkwKzc1IHR1bmVyIGNoaXAgY29tYm8uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgZnJlcV9lbnRyeSB7CisJdTE2CWZyZXE7CisJdTgJdmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IGZyZXFfZW50cnkgYmFuZF90YWJsZVtdID0geworCXsgMHgyREY0LCAweDFDIH0sCisJeyAweDI1NzQsIDB4MTQgfSwKKwl7IDB4MjJCNCwgMHgwQyB9LAorCXsgMHgyMEQ0LCAweDBCIH0sCisJeyAweDFFNzQsIDB4M0IgfSwKKwl7IDB4MUMzNCwgMHgzMyB9LAorCXsgMHgxNkY0LCAweDVCIH0sCisJeyAweDE0NTQsIDB4NTMgfSwKKwl7IDB4MTJENCwgMHg1MiB9LAorCXsgMHgxMDM0LCAweDRBIH0sCisJeyAweDBFRTQsIDB4N0EgfSwKKwl7IDB4MEQzNCwgMHg3MiB9LAorCXsgMHgwQjU0LCAweDlBIH0sCisJeyAweDA5MTQsIDB4OTEgfSwKKwl7IDB4MDdGNCwgMHg4OSB9LAorCXsgMHgwNzc0LCAweEI5IH0sCisJeyAweDA2N0IsIDB4QjEgfSwKKwl7IDB4MDYzNCwgMHhEOSB9LAorCXsgMHgwNUE0LCAweEQ4IH0sCS8vIEZNIHJhZGlvCisJeyAweDA0OTQsIDB4RDAgfSwKKwl7IDB4MDNCQywgMHhDOCB9LAorCXsgMHgwMzk0LCAweEY4IH0sCS8vIDU3MjUwMDAwIEh6CisJeyAweDAwMDAsIDB4RjAgfSwJLy8gMAorfTsKKworc3RhdGljIHN0cnVjdCBmcmVxX2VudHJ5IGRpdl90YWJsZVtdID0geworCXsgMHgxQzM0LCAzIH0sCisJeyAweDBEMzQsIDIgfSwKKwl7IDB4MDY3QiwgMSB9LAorICAgICAgICB7IDB4MDAwMCwgMCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBmcmVxX2VudHJ5IGFnY190YWJsZVtdID0geworCXsgMHgyMkI0LCAweDhGIH0sCisJeyAweDBCNTQsIDB4OUYgfSwKKwl7IDB4MDlBNCwgMHg4RiB9LAorCXsgMHgwNTU0LCAweDlGIH0sCisJeyAweDAwMDAsIDB4QkYgfSwKK307CisKK3N0YXRpYyBfX3U4IGdldF9mcmVxX2VudHJ5KCBzdHJ1Y3QgZnJlcV9lbnRyeSogdGFibGUsIF9fdTE2IGZyZXEpCit7CisJd2hpbGUodGFibGUtPmZyZXEgJiYgdGFibGUtPmZyZXEgPiBmcmVxKQorCQl0YWJsZSsrOworCXJldHVybiB0YWJsZS0+dmFsdWU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2VuYWJsZV9icmlkZ2VbMl0gPSAJeyAweDIxLCAweEMwIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfZGlzYWJsZV9icmlkZ2VbMl0gPSAJeyAweDIxLCAweDgwIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfaW5pdF90ZGE4Mjc1WzE0XSA9IAl7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkJCQkgIDB4N0MsIDB4MDQsIDB4QTMsIDB4M0YsCisJCQkJCQkgIDB4MkEsIDB4MDQsIDB4RkYsIDB4MDAsCisJCQkJCQkgIDB4MDAsIDB4NDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19zZXRfVlNbMl0gPSAJCXsgMHgzMCwgMHg2RiB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX3NldF9HUDAxX0NGWzJdID0gCXsgMHgyMCwgMHgwQiB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX3RkYTgyOTBfcmVzZXRbMl0gPQl7IDB4MDAsIDB4MDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19nYWluc2V0X29mZlsyXSA9CXsgMHgyOCwgMHgxNCB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2dhaW5zZXRfb25bMl0gPQl7IDB4MjgsIDB4NTQgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19hZ2MzXzAwWzJdID0JCXsgMHg4MCwgMHgwMCB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2FnYzJfQkZbMl0gPQkJeyAweDYwLCAweEJGIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfY2IxX0QyWzJdID0JCXsgMHgzMCwgMHhEMiB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2NiMV81NlsyXSA9CQl7IDB4MzAsIDB4NTYgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19jYjFfNTJbMl0gPQkJeyAweDMwLCAweDUyIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfY2IxXzUwWzJdID0JCXsgMHgzMCwgMHg1MCB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2FnYzJfN0ZbMl0gPQkJeyAweDYwLCAweDdGIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfYWdjM18wOFsyXSA9CQl7IDB4ODAsIDB4MDggfTsKKworc3RhdGljIHN0cnVjdCBpMmNfbXNnIGkyY19tc2dfaW5pdFtdID0geworCXsgSTJDX0FERFJfVERBODI3NSwgMCwgQVJSQVlfU0laRShpMmNfaW5pdF90ZGE4Mjc1KSwgaTJjX2luaXRfdGRhODI3NSB9LAorCXsgSTJDX0FERFJfVERBODI5MCwgMCwgQVJSQVlfU0laRShpMmNfZGlzYWJsZV9icmlkZ2UpLCBpMmNfZGlzYWJsZV9icmlkZ2UgfSwKKwl7IEkyQ19BRERSX1REQTgyOTAsIDAsIEFSUkFZX1NJWkUoaTJjX3NldF9WUyksIGkyY19zZXRfVlMgfSwKKwl7IEkyQ19BRERSX1REQTgyOTAsIDAsIEFSUkFZX1NJWkUoaTJjX3NldF9HUDAxX0NGKSwgaTJjX3NldF9HUDAxX0NGIH0sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19tc2cgaTJjX21zZ19wcm9sb2dbXSA9IHsKKy8vCXsgSTJDX0FERFJfVERBODI5MCwgMCwgQVJSQVlfU0laRShpMmNfZWFzeV9tb2RlKSwgaTJjX2Vhc3lfbW9kZSB9LAorCXsgSTJDX0FERFJfVERBODI5MCwgMCwgQVJSQVlfU0laRShpMmNfZ2FpbnNldF9vZmYpLCBpMmNfZ2FpbnNldF9vZmYgfSwKKwl7IEkyQ19BRERSX1REQTgyOTAsIDAsIEFSUkFZX1NJWkUoaTJjX3RkYTgyOTBfcmVzZXQpLCBpMmNfdGRhODI5MF9yZXNldCB9LAorCXsgSTJDX0FERFJfVERBODI5MCwgMCwgQVJSQVlfU0laRShpMmNfZW5hYmxlX2JyaWRnZSksIGkyY19lbmFibGVfYnJpZGdlIH0sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19tc2cgaTJjX21zZ19jb25maWdbXSA9IHsKKy8vCXsgSTJDX0FERFJfVERBODI3NSwgMCwgQVJSQVlfU0laRShpMmNfc2V0X2ZyZXEpLCBpMmNfc2V0X2ZyZXEgfSwKKwl7IEkyQ19BRERSX1REQTgyNzUsIDAsIEFSUkFZX1NJWkUoaTJjX2FnYzNfMDApLCBpMmNfYWdjM18wMCB9LAorCXsgSTJDX0FERFJfVERBODI3NSwgMCwgQVJSQVlfU0laRShpMmNfYWdjMl9CRiksIGkyY19hZ2MyX0JGIH0sCisJeyBJMkNfQUREUl9UREE4Mjc1LCAwLCBBUlJBWV9TSVpFKGkyY19jYjFfRDIpLCBpMmNfY2IxX0QyIH0sCisJeyBJMkNfQUREUl9UREE4Mjc1LCAwLCBBUlJBWV9TSVpFKGkyY19jYjFfNTYpLCBpMmNfY2IxXzU2IH0sCisJeyBJMkNfQUREUl9UREE4Mjc1LCAwLCBBUlJBWV9TSVpFKGkyY19jYjFfNTIpLCBpMmNfY2IxXzUyIH0sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19tc2cgaTJjX21zZ19lcGlsb2dbXSA9IHsKKwl7IEkyQ19BRERSX1REQTgyNzUsIDAsIEFSUkFZX1NJWkUoaTJjX2NiMV81MCksIGkyY19jYjFfNTAgfSwKKwl7IEkyQ19BRERSX1REQTgyNzUsIDAsIEFSUkFZX1NJWkUoaTJjX2FnYzJfN0YpLCBpMmNfYWdjMl83RiB9LAorCXsgSTJDX0FERFJfVERBODI3NSwgMCwgQVJSQVlfU0laRShpMmNfYWdjM18wOCksIGkyY19hZ2MzXzA4IH0sCisJeyBJMkNfQUREUl9UREE4MjkwLCAwLCBBUlJBWV9TSVpFKGkyY19kaXNhYmxlX2JyaWRnZSksIGkyY19kaXNhYmxlX2JyaWRnZSB9LAorCXsgSTJDX0FERFJfVERBODI5MCwgMCwgQVJSQVlfU0laRShpMmNfZ2FpbnNldF9vbiksIGkyY19nYWluc2V0X29uIH0sCit9OworCitzdGF0aWMgaW50IHRkYTgyOTBfdHVuZShzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IGkyY19tc2cgZWFzeV9tb2RlID0KKwkJeyBJMkNfQUREUl9UREE4MjkwLCAwLCAyLCB0LT5pMmNfZWFzeV9tb2RlIH07CisJc3RydWN0IGkyY19tc2cgc2V0X2ZyZXEgPQorCQl7IEkyQ19BRERSX1REQTgyNzUsIDAsIDgsIHQtPmkyY19zZXRfZnJlcSAgfTsKKworCWkyY190cmFuc2ZlcihjLT5hZGFwdGVyLCAmZWFzeV9tb2RlLCAgICAgIDEpOworCWkyY190cmFuc2ZlcihjLT5hZGFwdGVyLCBpMmNfbXNnX3Byb2xvZywgQVJSQVlfU0laRShpMmNfbXNnX3Byb2xvZykpOworCisJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsICZzZXRfZnJlcSwgICAgICAgMSk7CisJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsIGkyY19tc2dfY29uZmlnLCBBUlJBWV9TSVpFKGkyY19tc2dfY29uZmlnKSk7CisKKwltc2xlZXAoNTUwKTsKKwlpMmNfdHJhbnNmZXIoYy0+YWRhcHRlciwgaTJjX21zZ19lcGlsb2csIEFSUkFZX1NJWkUoaTJjX21zZ19lcGlsb2cpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgdHVuZXIgKnQsIHUxNiBpZmMpCit7CisJdTMyIE4gPSAoKCh0LT5mcmVxPDwzKStpZmMpJjB4M2ZmZmMpOworCisJTiA9IE4gPj4gZ2V0X2ZyZXFfZW50cnkoZGl2X3RhYmxlLCB0LT5mcmVxKTsKKwl0LT5pMmNfc2V0X2ZyZXFbMF0gPSAwOworCXQtPmkyY19zZXRfZnJlcVsxXSA9ICh1bnNpZ25lZCBjaGFyKShOPj44KTsKKwl0LT5pMmNfc2V0X2ZyZXFbMl0gPSAodW5zaWduZWQgY2hhcikgTjsKKwl0LT5pMmNfc2V0X2ZyZXFbM10gPSAweDQwOworCXQtPmkyY19zZXRfZnJlcVs0XSA9IDB4NTI7CisJdC0+aTJjX3NldF9mcmVxWzVdID0gZ2V0X2ZyZXFfZW50cnkoYmFuZF90YWJsZSwgdC0+ZnJlcSk7CisJdC0+aTJjX3NldF9mcmVxWzZdID0gZ2V0X2ZyZXFfZW50cnkoYWdjX3RhYmxlLCAgdC0+ZnJlcSk7CisJdC0+aTJjX3NldF9mcmVxWzddID0gMHg4ZjsKK30KKworI2RlZmluZSBWNEwyX1NURF9NTgkoVjRMMl9TVERfUEFMX018VjRMMl9TVERfUEFMX058VjRMMl9TVERfUEFMX05jfFY0TDJfU1REX05UU0MpCisjZGVmaW5lIFY0TDJfU1REX0IJKFY0TDJfU1REX1BBTF9CfFY0TDJfU1REX1BBTF9CMXxWNEwyX1NURF9TRUNBTV9CKQorI2RlZmluZSBWNEwyX1NURF9HSAkoVjRMMl9TVERfUEFMX0d8VjRMMl9TVERfUEFMX0h8VjRMMl9TVERfU0VDQU1fR3xWNEwyX1NURF9TRUNBTV9IKQorI2RlZmluZSBWNEwyX1NURF9ESwkoVjRMMl9TVERfUEFMX0RLfFY0TDJfU1REX1NFQ0FNX0RLKQorCitzdGF0aWMgdm9pZCBzZXRfYXVkaW8oc3RydWN0IHR1bmVyICp0KQoreworCXQtPmkyY19lYXN5X21vZGVbMF0gPSAweDAxOworCisJaWYgKHQtPnN0ZCAmIFY0TDJfU1REX01OKQorCQl0LT5pMmNfZWFzeV9tb2RlWzFdID0gMHgwMTsKKwllbHNlIGlmICh0LT5zdGQgJiBWNEwyX1NURF9CKQorCQl0LT5pMmNfZWFzeV9tb2RlWzFdID0gMHgwMjsKKwllbHNlIGlmICh0LT5zdGQgJiBWNEwyX1NURF9HSCkKKwkJdC0+aTJjX2Vhc3lfbW9kZVsxXSA9IDB4MDQ7CisJZWxzZSBpZiAodC0+c3RkICYgVjRMMl9TVERfUEFMX0kpCisJCXQtPmkyY19lYXN5X21vZGVbMV0gPSAweDA4OworCWVsc2UgaWYgKHQtPnN0ZCAmIFY0TDJfU1REX0RLKQorCQl0LT5pMmNfZWFzeV9tb2RlWzFdID0gMHgxMDsKKwllbHNlIGlmICh0LT5zdGQgJiBWNEwyX1NURF9TRUNBTV9MKQorCQl0LT5pMmNfZWFzeV9tb2RlWzFdID0gMHgyMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3R2X2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKworCXNldF9hdWRpbyh0KTsKKwlzZXRfZnJlcXVlbmN5KHQsIDg2NCk7CisJdGRhODI5MF90dW5lKGMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfcmFkaW9fZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpCit7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXNldF9mcmVxdWVuY3kodCwgNzA0KTsKKwl0ZGE4MjkwX3R1bmUoYyk7Cit9CisKK3N0YXRpYyBpbnQgaGFzX3NpZ25hbChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwl1bnNpZ25lZCBjaGFyIGkyY19nZXRfYWZjWzFdID0geyAweDFCIH07CisJdW5zaWduZWQgY2hhciBhZmMgPSAwOworCisJaTJjX21hc3Rlcl9zZW5kKGMsIGkyY19nZXRfYWZjLCBBUlJBWV9TSVpFKGkyY19nZXRfYWZjKSk7CisJaTJjX21hc3Rlcl9yZWN2KGMsICZhZmMsIDEpOworCXJldHVybiAoYWZjICYgMHg4MCk/IDY1NTM1OjA7Cit9CisKK2ludCB0ZGE4MjkwX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJc3RybGNweShjLT5uYW1lLCAidGRhODI5MCs3NSIsIHNpemVvZihjLT5uYW1lKSk7CisJdHVuZXJfaW5mbygidHVuZXI6IHR5cGUgc2V0IHRvICVzXG4iLCBjLT5uYW1lKTsKKwl0LT50dl9mcmVxICAgID0gc2V0X3R2X2ZyZXE7CisJdC0+cmFkaW9fZnJlcSA9IHNldF9yYWRpb19mcmVxOworCXQtPmhhc19zaWduYWwgPSBoYXNfc2lnbmFsOworCisJaTJjX21hc3Rlcl9zZW5kKGMsIGkyY19lbmFibGVfYnJpZGdlLCBBUlJBWV9TSVpFKGkyY19lbmFibGVfYnJpZGdlKSk7CisJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsIGkyY19tc2dfaW5pdCwgQVJSQVlfU0laRShpMmNfbXNnX2luaXQpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTc3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuYwpAQCAtMCwwICsxLDI1NCBAQAorIC8qCisgICAgdGRhOTg0MCAtIGkyYy1kcml2ZXIgZm9yIHRoZSB0ZGE5ODQwIGJ5IFNHUyBUaG9tc29uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBNaWNoYWVsIEh1bm9sZCA8bWljaGFlbEBtaWh1LmRlPgorCisgICAgVGhlIHRkYTk4NDAgaXMgYSBzdGVyZW8vZHVhbCBzb3VuZCBwcm9jZXNzb3Igd2l0aCBkaWdpdGFsCisgICAgaWRlbnRpZmljYXRpb24uIEl0IGNhbiBiZSBmb3VuZCBhdCBhZGRyZXNzIDB4ODQgb24gdGhlIGkyYy1idXMuCisKKyAgICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb25zIGRvd25sb2FkIHRoZSBzcGVjaWZpY2F0aW9ucyBkaXJlY3RseQorICAgIGZyb20gU0dTIFRob21zb24gYXQgaHR0cDovL3d3dy5zdC5jb20KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgInRkYTk4NDAuaCIKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7CQkvKiBpbnNtb2QgcGFyYW1ldGVyICovCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGV2aWNlIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOworI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pIFwKKyAgICAgICAgICAgIGRvIHsgaWYgKGRlYnVnKSB7IHByaW50aygiJXM6ICVzKClbJWRdOiAiLF9fc3RyaW5naWZ5KEtCVUlMRF9NT0ROQU1FKSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IHByaW50ayhhcmdzKTsgfSB9IHdoaWxlICgwKQorCisjZGVmaW5lCVNXSVRDSAkJMHgwMAorI2RlZmluZQlMRVZFTF9BREpVU1QJMHgwMgorI2RlZmluZQlTVEVSRU9fQURKVVNUCTB4MDMKKyNkZWZpbmUJVEVTVAkJMHgwNAorCisvKiBhZGRyZXNzZXMgdG8gc2NhbiwgZm91bmQgb25seSBhdCAweDQyICg3LUJpdCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19UREE5ODQwLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogbWFnaWMgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgdmFyaWFibGVzIGFuZCB0aGluZ3MgKi8KK0kyQ19DTElFTlRfSU5TTU9EOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyOworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKKworc3RhdGljIGludCBjb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlpbnQgcmVzdWx0OworCWludCBieXRlID0gKihpbnQgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVERBOTg0MF9TV0lUQ0g6CisKKwkJZHByaW50aygiVERBOTg0MF9TV0lUQ0g6IDB4JTAyeFxuIiwgYnl0ZSk7CisKKwkJaWYgKGJ5dGUgIT0gVERBOTg0MF9TRVRfTU9OTworCQkgICAgJiYgYnl0ZSAhPSBUREE5ODQwX1NFVF9NVVRFCisJCSAgICAmJiBieXRlICE9IFREQTk4NDBfU0VUX1NURVJFTworCQkgICAgJiYgYnl0ZSAhPSBUREE5ODQwX1NFVF9MQU5HMQorCQkgICAgJiYgYnl0ZSAhPSBUREE5ODQwX1NFVF9MQU5HMgorCQkgICAgJiYgYnl0ZSAhPSBUREE5ODQwX1NFVF9CT1RICisJCSAgICAmJiBieXRlICE9IFREQTk4NDBfU0VUX0JPVEhfUgorCQkgICAgJiYgYnl0ZSAhPSBUREE5ODQwX1NFVF9FWFRFUk5BTCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXN1bHQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgU1dJVENILCBieXRlKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWRwcmludGsoImkyY19zbWJ1c193cml0ZV9ieXRlKCkgZmFpbGVkLCByZXQ6JWRcbiIsIHJlc3VsdCk7CisJCWJyZWFrOworCisJY2FzZSBUREE5ODQwX0xFVkVMX0FESlVTVDoKKworCQlkcHJpbnRrKCJUREE5ODQwX0xFVkVMX0FESlVTVDogJWRcbiIsIGJ5dGUpOworCisJCS8qIGNoZWNrIGZvciBjb3JyZWN0IHJhbmdlICovCisJCWlmIChieXRlID4gMjUgfHwgYnl0ZSA8IC0yMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIGNhbGN1bGF0ZSBhY3R1YWwgdmFsdWUgdG8gc2V0LCBzZWUgc3BlY3MsIHBhZ2UgMTggKi8KKwkJYnl0ZSAvPSA1OworCQlpZiAoMCA8IGJ5dGUpCisJCQlieXRlICs9IDB4ODsKKwkJZWxzZQorCQkJYnl0ZSA9IC1ieXRlOworCisJCXJlc3VsdCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMRVZFTF9BREpVU1QsIGJ5dGUpOworCQlpZiAocmVzdWx0KQorCQkJZHByaW50aygiaTJjX3NtYnVzX3dyaXRlX2J5dGUoKSBmYWlsZWQsIHJldDolZFxuIiwgcmVzdWx0KTsKKwkJYnJlYWs7CisKKwljYXNlIFREQTk4NDBfU1RFUkVPX0FESlVTVDoKKworCQlkcHJpbnRrKCJUREE5ODQwX1NURVJFT19BREpVU1Q6ICVkXG4iLCBieXRlKTsKKworCQkvKiBjaGVjayBmb3IgY29ycmVjdCByYW5nZSAqLworCQlpZiAoYnl0ZSA+IDI1IHx8IGJ5dGUgPCAtMjQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBjYWxjdWxhdGUgYWN0dWFsIHZhbHVlIHRvIHNldCAqLworCQlieXRlIC89IDU7CisJCWlmICgwIDwgYnl0ZSkKKwkJCWJ5dGUgKz0gMHgyMDsKKwkJZWxzZQorCQkJYnl0ZSA9IC1ieXRlOworCisJCXJlc3VsdCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBTVEVSRU9fQURKVVNULCBieXRlKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWRwcmludGsoImkyY19zbWJ1c193cml0ZV9ieXRlKCkgZmFpbGVkLCByZXQ6JWRcbiIsIHJlc3VsdCk7CisJCWJyZWFrOworCisJY2FzZSBUREE5ODQwX0RFVEVDVDogeworCQlpbnQgKnJldCA9IChpbnQgKilhcmc7CisKKwkJYnl0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFNURVJFT19BREpVU1QpOworCQlpZiAoYnl0ZSA9PSAtMSkgeworCQkJZHByaW50aygiaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaWYgKDAgIT0gKGJ5dGUgJiAweDgwKSkgeworCQkJZHByaW50aygiVERBOTg0MF9ERVRFQ1Q6IHJlZ2lzdGVyIGNvbnRlbnRzIGludmFsaWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlkcHJpbnRrKCJUREE5ODQwX0RFVEVDVDogYnl0ZTogMHglMDJ4XG4iLCBieXRlKTsKKwkJKnJldCA9ICgoYnl0ZSAmIDB4NjApID4+IDUpOworCQlyZXN1bHQgPSAwOworCQlicmVhazsKKwl9CisJY2FzZSBUREE5ODQwX1RFU1Q6CisJCWRwcmludGsoIlREQTk4NDBfVEVTVDogMHglMDJ4XG4iLCBieXRlKTsKKworCQkvKiBtYXNrIG91dCBpcnJlbGV2YW50IGJpdHMgKi8KKwkJYnl0ZSAmPSAweDM7CisKKwkJcmVzdWx0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFRFU1QsIGJ5dGUpOworCQlpZiAocmVzdWx0KQorCQkJZHByaW50aygiaTJjX3NtYnVzX3dyaXRlX2J5dGUoKSBmYWlsZWQsIHJldDolZFxuIiwgcmVzdWx0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWludCByZXN1bHQgPSAwOworCisJaW50IGJ5dGUgPSAweDA7CisKKwkvKiBsZXQncyBzZWUgd2hldGhlciB0aGlzIGFkYXB0ZXIgY2FuIHN1cHBvcnQgd2hhdCB3ZSBuZWVkICovCisJaWYgKDAgPT0gaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwKKwkJCQkgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEEgfAorCQkJCSAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2xpZW50IHN0cnVjdHVyZSAqLworCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKDAgPT0gY2xpZW50KSB7CisJCXByaW50aygibm90IGVub3VnaCBrZXJuZWwgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogZmlsbCBjbGllbnQgc3RydWN0dXJlICovCisJbWVtY3B5KGNsaWVudCwgJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCisJLyogdGVsbCB0aGUgaTJjIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgwICE9IChyZXN1bHQgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIHNldCBpbml0aWFsIHZhbHVlcyBmb3IgbGV2ZWwgJiBzdGVyZW8gLSBhZGp1c3RtZW50LCBtb2RlICovCisJYnl0ZSA9IDA7CisJcmVzdWx0ICA9IGNvbW1hbmQoY2xpZW50LCBUREE5ODQwX0xFVkVMX0FESlVTVCwgJmJ5dGUpOworCXJlc3VsdCArPSBjb21tYW5kKGNsaWVudCwgVERBOTg0MF9TVEVSRU9fQURKVVNULCAmYnl0ZSk7CisJYnl0ZSA9IFREQTk4NDBfU0VUX01PTk87CisJcmVzdWx0ID0gY29tbWFuZChjbGllbnQsIFREQTk4NDBfU1dJVENILCAmYnl0ZSk7CisJaWYgKHJlc3VsdCkgeworCQlkcHJpbnRrKCJjb3VsZCBub3QgaW5pdGlhbGl6ZSB0ZGE5ODQwXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKCJ0ZGE5ODQwOiBkZXRlY3RlZCBAIDB4JTAyeCBvbiBhZGFwdGVyICVzXG4iLCBhZGRyZXNzLCAmY2xpZW50LT5hZGFwdGVyLT5uYW1lWzBdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCS8qIGxldCdzIHNlZSB3aGV0aGVyIHRoaXMgaXMgYSBrbm93IGFkYXB0ZXIgd2UgY2FuIGF0dGFjaCB0byAqLworCWlmIChhZGFwdGVyLT5pZCAhPSBJMkNfQUxHT19TQUE3MTQ2KSB7CisJCWRwcmludGsoInJlZnVzaW5nIHRvIHByb2JlIG9uIHVua25vd24gYWRhcHRlciBbbmFtZT0nJXMnLGlkPTB4JXhdXG4iLCBhZGFwdGVyLT5uYW1lLCBhZGFwdGVyLT5pZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgJmRldGVjdCk7Cit9CisKK3N0YXRpYyBpbnQgZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJldCA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5uYW1lCT0gInRkYTk4NDAiLAorCS5pZAk9IEkyQ19EUklWRVJJRF9UREE5ODQwLAorCS5mbGFncwk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gYXR0YWNoLAorCS5kZXRhY2hfY2xpZW50CT0gZGV0YWNoLAorCS5jb21tYW5kCT0gY29tbWFuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7CisJSTJDX0RFVk5BTUUoInRkYTk4NDAiKSwKKwkuZHJpdmVyID0gJmRyaXZlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRoaXNfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0aGlzX21vZHVsZV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRoaXNfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQodGhpc19tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInRkYTk4NDAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg0MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDIxMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIF9fSU5DTFVERURfVERBOTg0MF9fCisjZGVmaW5lIF9fSU5DTFVERURfVERBOTg0MF9fCisKKyNkZWZpbmUJSTJDX1REQTk4NDAJCTB4NDIKKworI2RlZmluZSBUREE5ODQwX0RFVEVDVAkJX0lPUigndicsMSxpbnQpCisvKiByZXR1cm4gdmFsdWVzIGZvciBUREE5ODQwX0RFVENUICovCisjZGVmaW5lIFREQTk4NDBfTU9OT19ERVRFQ1QJCTB4MAorI2RlZmluZQlUREE5ODQwX0RVQUxfREVURUNUCQkweDEKKyNkZWZpbmUJVERBOTg0MF9TVEVSRU9fREVURUNUCQkweDIKKyNkZWZpbmUJVERBOTg0MF9JTkNPUlJFQ1RfREVURUNUCTB4MworCisjZGVmaW5lIFREQTk4NDBfU1dJVENICQlfSU9XKCd2JywyLGludCkKKy8qIG1vZGVzIHRoYW4gY2FuIGJlIHNldCB3aXRoIFREQTk4NDBfU1dJVENIICovCisjZGVmaW5lCVREQTk4NDBfU0VUX01VVEUJCTB4MDAKKyNkZWZpbmUJVERBOTg0MF9TRVRfTU9OTwkJMHgxMAorI2RlZmluZQlUREE5ODQwX1NFVF9TVEVSRU8JCTB4MmEKKyNkZWZpbmUJVERBOTg0MF9TRVRfTEFORzEJCTB4MTIKKyNkZWZpbmUJVERBOTg0MF9TRVRfTEFORzIJCTB4MWUKKyNkZWZpbmUJVERBOTg0MF9TRVRfQk9USAkJMHgxYQorI2RlZmluZQlUREE5ODQwX1NFVF9CT1RIX1IJCTB4MTYKKyNkZWZpbmUJVERBOTg0MF9TRVRfRVhURVJOQUwJCTB4N2EKKworLyogdmFsdWVzIG1heSByYW5nZSBiZXR3ZWVuICsyLjUgYW5kIC0yLjA7CisgICB0aGUgdmFsdWUgaGFzIHRvIGJlIG11bHRpcGxpZWQgd2l0aCAxMCAqLworI2RlZmluZSBUREE5ODQwX0xFVkVMX0FESlVTVAlfSU9XKCd2JywzLGludCkKKworLyogdmFsdWVzIG1heSByYW5nZSBiZXR3ZWVuICsyLjUgYW5kIC0yLjQ7CisgICB0aGUgdmFsdWUgaGFzIHRvIGJlIG11bHRpcGxpZWQgd2l0aCAxMCAqLworI2RlZmluZSBUREE5ODQwX1NURVJFT19BREpVU1QJX0lPVygndicsNCxpbnQpCisKKy8qIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgVERBOTg0MF9URVNUCQlfSU9XKCd2Jyw1LGludCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NzUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTExNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NzUuYwpAQCAtMCwwICsxLDQyMyBAQAorLyoKKyAqIEZvciB0aGUgVERBOTg3NSBjaGlwCisgKiAoVGhlIFREQTk4NzUgaXMgdXNlZCBvbiB0aGUgRGlhbW9uZCBEVFYyMDAwIGZyZW5jaCB2ZXJzaW9uCisgKiBPdGhlciBjYXJkcyBwcm9iYWJseSB1c2UgdGhlc2UgY2hpcHMgYXMgd2VsbC4pCisgKiBUaGlzIGRyaXZlciB3aWxsIG5vdCBjb21wbGFpbiBpZiB1c2VkIHdpdGggYW55CisgKiBvdGhlciBpMmMgZGV2aWNlIHdpdGggdGhlIHNhbWUgYWRkcmVzcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgR3VpbGxhdW1lIERlbHZpdCBiYXNlZCBvbiBHZXJkIEtub3JyIHNvdXJjZSBhbmQKKyAqIEVyaWMgU2FuZGVlbgorICogVGhpcyBjb2RlIGlzIHBsYWNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBCYXNlZCBvbiB0ZGE5ODU1LmMgYnkgU3RldmUgVmFuRGVCb2dhcnQgKHZhbmRlYm9AdWNsaW5rLmJlcmtlbGV5LmVkdSkKKyAqIFdoaWNoIHdhcyBiYXNlZCBvbiB0ZGE4NDI1LmMgYnkgR3JlZyBBbGV4YW5kZXIgKGMpIDE5OTgKKyAqCisgKiBPUFRJT05TOgorICogZGVidWcgICAtIHNldCB0byAxIGlmIHlvdSdkIGxpa2UgdG8gc2VlIGRlYnVnIG1lc3NhZ2VzCisgKgorICogIFJldmlzaW9uOiAwLjEgLSBvcmlnaW5hbCB2ZXJzaW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAiYnR0di5oIgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPG1lZGlhL2lkLmg+CisKK3N0YXRpYyBpbnQgZGVidWc7IC8qIGluc21vZCBwYXJhbWV0ZXIgKi8KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSAgeworICAgIEkyQ19UREE5ODc1ID4+IDEsCisgICAgSTJDX0NMSUVOVF9FTkQKK307CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY19yYW5nZVtdID0ge0kyQ19DTElFTlRfRU5EfTsKK0kyQ19DTElFTlRfSU5TTU9EOworCisvKiBUaGlzIGlzIGEgc3VwZXJzZXQgb2YgdGhlIFREQTk4NzUgKi8KK3N0cnVjdCB0ZGE5ODc1IHsKKwlpbnQgbW9kZTsKKwlpbnQgcnZvbCwgbHZvbDsKKwlpbnQgYmFzcywgdHJlYmxlOworCXN0cnVjdCBpMmNfY2xpZW50IGM7Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyOworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKKworI2RlZmluZSBkcHJpbnRrICBpZiAoZGVidWcpIHByaW50aworCisvKiBUaGUgVERBOTg3NSBpcyBtYWRlIGJ5IFBoaWxpcHMgU2VtaWNvbmR1Y3RvcgorICogaHR0cDovL3d3dy5zZW1pY29uZHVjdG9ycy5waGlsaXBzLmNvbQorICogVERBOTg3NTogSTJDLWJ1cyBjb250cm9sbGVkIERTUCBhdWRpbyBwcm9jZXNzb3IsIEZNIGRlbW9kdWxhdG9yCisgKgorICovCisKKwkJLyogc3ViYWRkcmVzc2VzIGZvciBUREE5ODc1ICovCisjZGVmaW5lIFREQTk4NzVfTVVUICAgICAgICAgMHgxMiAgLypHZW5lcmFsIG11dGUgICh2YWx1ZSAtLT4gMGIxMTAwMTEwMCovCisjZGVmaW5lIFREQTk4NzVfQ0ZHICAgICAgICAgMHgwMSAgLyogQ29uZmlnIHJlZ2lzdGVyICh2YWx1ZSAtLT4gMGIwMDAwMDAwMCAqLworI2RlZmluZSBUREE5ODc1X0RBQ09TICAgICAgIDB4MTMgIC8qREFDIGkvbyBzZWxlY3QgKEFEQykgMGIwMDAwMTAwKi8KKyNkZWZpbmUgVERBOTg3NV9MT1NSICAgICAgICAweDE2ICAvKkxpbmUgb3V0cHV0IHNlbGVjdCByZWdpcnRlciAwYjAxMDAgMDAwMSovCisKKyNkZWZpbmUgVERBOTg3NV9DSDFWICAgICAgICAweDBjICAvKkNoYW5uZWwgMSB2b2x1bWUgKG11dGUpKi8KKyNkZWZpbmUgVERBOTg3NV9DSDJWICAgICAgICAweDBkICAvKkNoYW5uZWwgMiB2b2x1bWUgKG11dGUpKi8KKyNkZWZpbmUgVERBOTg3NV9TQzEgICAgICAgICAweDE0ICAvKlNDQVJUIDEgaW4gKG1vbm8pKi8KKyNkZWZpbmUgVERBOTg3NV9TQzIgICAgICAgICAweDE1ICAvKlNDQVJUIDIgaW4gKG1vbm8pKi8KKworI2RlZmluZSBUREE5ODc1X0FEQ0lTICAgICAgIDB4MTcgIC8qQURDIGlucHV0IHNlbGVjdCAobW9ubykgMGIwMTEwIDAwMCovCisjZGVmaW5lIFREQTk4NzVfQUVSICAgICAgICAgMHgxOSAgLypBdWRpbyBlZmZlY3QgKEFWTCtQc2V1ZG8pIDBiMDAwMCAwMTEwKi8KKyNkZWZpbmUgVERBOTg3NV9NQ1MgICAgICAgICAweDE4ICAvKk1haW4gY2hhbm5lbCBzZWxlY3QgKERBQykgMGIwMDAwMTAwKi8KKyNkZWZpbmUgVERBOTg3NV9NVkwgICAgICAgICAweDFhICAvKiBNYWluIHZvbHVtZSBnYXVjaGUgKi8KKyNkZWZpbmUgVERBOTg3NV9NVlIgICAgICAgICAweDFiICAvKiBNYWluIHZvbHVtZSBkcm9pdGUgKi8KKyNkZWZpbmUgVERBOTg3NV9NQkEgICAgICAgICAweDFkICAvKiBNYWluIEJhc3NlICovCisjZGVmaW5lIFREQTk4NzVfTVRSICAgICAgICAgMHgxZSAgLyogTWFpbiB0cmVibGUgKi8KKyNkZWZpbmUgVERBOTg3NV9BQ1MgICAgICAgICAweDFmICAvKiBBdXhpbGFyeSBjaGFubmVsIHNlbGVjdCAoRk0pIDBiMDAwMDAwMCovCisjZGVmaW5lIFREQTk4NzVfQVZMICAgICAgICAgMHgyMCAgLyogQXV4aWxhcnkgdm9sdW1lIGdhdWNoZSAqLworI2RlZmluZSBUREE5ODc1X0FWUiAgICAgICAgIDB4MjEgIC8qIEF1eGlsYXJ5IHZvbHVtZSBkcm9pdGUgKi8KKyNkZWZpbmUgVERBOTg3NV9BQkEgICAgICAgICAweDIyICAvKiBBdXhpbGFyeSBCYXNzZSAqLworI2RlZmluZSBUREE5ODc1X0FUUiAgICAgICAgIDB4MjMgIC8qIEF1eGlsYXJ5IHRyZWJsZSAqLworCisjZGVmaW5lIFREQTk4NzVfTVNSICAgICAgICAgMHgwMiAgLyogTW9uaXRvciBzZWxlY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVERBOTg3NV9DMU1TQiAgICAgICAweDAzICAvKiBDYXJyaWVyIDEgKEZNKSBmcmVxdWVuY3kgcmVnaXN0ZXIgTVNCICovCisjZGVmaW5lIFREQTk4NzVfQzFNSUIgICAgICAgMHgwNCAgLyogQ2FycmllciAxIChGTSkgZnJlcXVlbmN5IHJlZ2lzdGVyICgxNi04XWIgKi8KKyNkZWZpbmUgVERBOTg3NV9DMUxTQiAgICAgICAweDA1ICAvKiBDYXJyaWVyIDEgKEZNKSBmcmVxdWVuY3kgcmVnaXN0ZXIgTFNCICovCisjZGVmaW5lIFREQTk4NzVfQzJNU0IgICAgICAgMHgwNiAgLyogQ2FycmllciAyIChuaWNhbSkgZnJlcXVlbmN5IHJlZ2lzdGVyIE1TQiAqLworI2RlZmluZSBUREE5ODc1X0MyTUlCICAgICAgIDB4MDcgIC8qIENhcnJpZXIgMiAobmljYW0pIGZyZXF1ZW5jeSByZWdpc3RlciAoMTYtOF1iICovCisjZGVmaW5lIFREQTk4NzVfQzJMU0IgICAgICAgMHgwOCAgLyogQ2FycmllciAyIChuaWNhbSkgZnJlcXVlbmN5IHJlZ2lzdGVyIExTQiAqLworI2RlZmluZSBUREE5ODc1X0RDUiAgICAgICAgIDB4MDkgIC8qIERlbW9kdWxhdGV1ciBjb25maWd1cmF0aW9uIHJlZ2lydGVyKi8KKyNkZWZpbmUgVERBOTg3NV9ERUVNICAgICAgICAweDBhICAvKiBGTSBkZS1lbXBoYXNpcyByZWdpcnRlciovCisjZGVmaW5lIFREQTk4NzVfRk1BVCAgICAgICAgMHgwYiAgLyogRk0gTWF0cml4IHJlZ2lydGVyKi8KKworLyogdmFsdWVzICovCisjZGVmaW5lIFREQTk4NzVfTVVURV9PTgkgICAgMHhmZiAvKiBnZW5lcmFsIG11dGUgKi8KKyNkZWZpbmUgVERBOTg3NV9NVVRFX09GRiAgICAweGNjIC8qIGdlbmVyYWwgbm8gbXV0ZSAqLworCisKKworLyogQmVnaW4gY29kZSAqLworCitzdGF0aWMgaW50IHRkYTk4NzVfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHN1YmFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzJdOworCWRwcmludGsoIkluIHRkYTk4NzVfd3JpdGVcbiIpOworCWRwcmludGsoIldyaXRpbmcgJWQgMHgleFxuIiwgc3ViYWRkciwgdmFsKTsKKwlidWZmZXJbMF0gPSBzdWJhZGRyOworCWJ1ZmZlclsxXSA9IHZhbDsKKwlpZiAoMiAhPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LGJ1ZmZlciwyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0ZGE5ODc1OiBJL08gZXJyb3IsIHRyeWluZyAod3JpdGUgJWQgMHgleClcbiIsCisJCSAgICAgICBzdWJhZGRyLCB2YWwpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisjaWYgMAorc3RhdGljIGludCB0ZGE5ODc1X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcjsKKwlkcHJpbnRrKCJJbiB0ZGE5ODc1X3JlYWRcbiIpOworCWlmICgxICE9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsJmJ1ZmZlciwxKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0ZGE5ODc1OiBJL08gZXJyb3IsIHRyeWluZyAocmVhZClcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWRwcmludGsoIlJlYWQgMHglMDJ4XG4iLCBidWZmZXIpOworCXJldHVybiBidWZmZXI7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpMmNfcmVhZF9yZWdpc3RlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQgcmVnKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIHdyaXRlWzFdOworICAgICAgICB1bnNpZ25lZCBjaGFyIHJlYWRbMV07CisgICAgICAgIHN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7CisgICAgICAgICAgICAgICAgeyBhZGRyLCAwLCAgICAgICAgMSwgd3JpdGUgfSwKKyAgICAgICAgICAgICAgICB7IGFkZHIsIEkyQ19NX1JELCAxLCByZWFkICB9CisgICAgICAgIH07CisgICAgICAgIHdyaXRlWzBdID0gcmVnOworCisgICAgICAgIGlmICgyICE9IGkyY190cmFuc2ZlcihhZGFwLG1zZ3MsMikpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJ0ZGE5ODc1OiBJL08gZXJyb3IgKHJlYWQyKVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGRwcmludGsoInRkYTk4NzU6IGNoaXBfcmVhZDI6IHJlZyVkPTB4JXhcbiIscmVnLHJlYWRbMF0pOworICAgICAgICByZXR1cm4gcmVhZFswXTsKK30KKworc3RhdGljIHZvaWQgdGRhOTg3NV9zZXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdGRhOTg3NSAqdGRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgY2hhciBhOworCisJZHByaW50ayhLRVJOX0RFQlVHICJ0ZGE5ODc1X3NldCglMDR4LCUwNHgsJTA0eCwlMDR4KVxuIiwKKwkJdGRhLT5sdm9sLHRkYS0+cnZvbCx0ZGEtPmJhc3MsdGRhLT50cmVibGUpOworCisKKwlhID0gdGRhLT5sdm9sICYgMHhmZjsKKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9NVkwsIGEpOworCWEgPXRkYS0+cnZvbCAmIDB4ZmY7CisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTVZSLCBhKTsKKwlhID10ZGEtPmJhc3MgJiAweGZmOworCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X01CQSwgYSk7CisJYSA9dGRhLT50cmVibGUgICYgMHhmZjsKKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9NVFIsIGEpOworfQorCitzdGF0aWMgdm9pZCBkb190ZGE5ODc1X2luaXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdGRhOTg3NSAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWRwcmludGsoIkluIHRkYTk4NzVfaW5pdFxuIik7CisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQ0ZHLCAweGQwICk7IC8qcmVnIGRlIGNvbmZpZyAwIChyZXNldCkqLworICAgIAl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9NU1IsIDB4MDMgKTsgICAgLyogTW9uaXRvciAwYjAwMDAwWFhYKi8KKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9DMU1TQiwgMHgwMCApOyAgLypDYXIxKEZNKSBNU0IgWE1IeiovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQzFNSUIsIDB4MDAgKTsgIC8qQ2FyMShGTSkgTUlCIFhNSHoqLworCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0MxTFNCLCAweDAwICk7ICAvKkNhcjEoRk0pIExTQiBYTUh6Ki8KKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9DMk1TQiwgMHgwMCApOyAgLypDYXIyKE5JQ0FNKSBNU0IgWE1IeiovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQzJNSUIsIDB4MDAgKTsgIC8qQ2FyMihOSUNBTSkgTUlCIFhNSHoqLworCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0MyTFNCLCAweDAwICk7ICAvKkNhcjIoTklDQU0pIExTQiBYTUh6Ki8KKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9EQ1IsIDB4MDAgKTsgICAgLypEZW1vZCBjb25maWcgMHgwMCovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfREVFTSwgMHg0NCApOyAgIC8qREUtRW1waCAwYjAxMDAgMDEwMCovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfRk1BVCwgMHgwMCApOyAgIC8qRk0gTWF0cml4IHJlZyAweDAwKi8KKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9TQzEsIDB4MDAgKTsgICAgLyogU0NBUlQgMSAoU0MxKSovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfU0MyLCAweDAxICk7ICAgIC8qIFNDQVJUIDIgKHNjMikqLworCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQ0gxViwgMHgxMCApOyAgLyogQ2hhbm5lbCB2b2x1bWUgMSBtdXRlKi8KKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9DSDJWLCAweDEwICk7ICAvKiBDaGFubmVsIHZvbHVtZSAyIG11dGUgKi8KKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9EQUNPUywgMHgwMiApOyAvKiBzaWcgREFDIGkvbyhpbjpuaWNhbSkqLworCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0FEQ0lTLCAweDZmICk7IC8qIHNpZyBBREMgaW5wdXQoaW46bW9ubykqLworCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0xPU1IsIDB4MDAgKTsgIC8qIGxpbmUgb3V0IChpbjptb25vKSovCisgCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0FFUiwgMHgwMCApOyAgIC8qMDYgRWZmZWN0IChBVkwrUFNFVURPKSAqLworCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X01DUywgMHg0NCApOyAgIC8qIE1haW4gY2ggc2VsZWN0IChEQUMpICovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTVZMLCAweDAzICk7ICAgLyogVm9sIE1haW4gbGVmdCAxMGRCICovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTVZSLCAweDAzICk7ICAgLyogVm9sIE1haW4gcmlnaHQgMTBkQiovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTUJBLCAweDAwICk7ICAgLyogTWFpbiBCYXNzIE1haW4gMGRCKi8KKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9NVFIsIDB4MDAgKTsgICAvKiBNYWluIFRyZWJsZSBNYWluIDBkQiovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQUNTLCAweDQ0ICk7ICAgLyogQXV4IGNoYW4gc2VsZWN0IChkYWMpKi8KKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9BVkwsIDB4MDAgKTsgICAvKiBWb2wgQXV4IGxlZnQgMGRCKi8KKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9BVlIsIDB4MDAgKTsgICAvKiBWb2wgQXV4IHJpZ2h0IDBkQiovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQUJBLCAweDAwICk7ICAgLyogQXV4IEJhc3MgTWFpbiAwZEIqLworCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0FUUiwgMHgwMCApOyAgIC8qIEF1eCBBaWd1cyBNYWluIDBkQiovCisKKwl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9NVVQsIDB4Y2MgKTsgICAvKiBHZW5lcmFsIG11dGUgICovCisKKwl0LT5tb2RlPUFVRElPX1VOTVVURTsKKwl0LT5sdm9sPXQtPnJ2b2wgPTA7ICAJLyogMGRCICovCisJdC0+YmFzcz0wOyAJCSAgICAgICAgLyogMGRCICovCisJdC0+dHJlYmxlPTA7ICAJCS8qIDBkQiAqLworCXRkYTk4NzVfc2V0KGNsaWVudCk7CisKK30KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKiAqCisgKiBpMmMgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IHRkYTk4NzVfY2hlY2tpdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyKQoreworCWludCBkaWMscmV2OworCisJZGljPWkyY19yZWFkX3JlZ2lzdGVyKGFkYXAsYWRkciwyNTQpOworCXJldj1pMmNfcmVhZF9yZWdpc3RlcihhZGFwLGFkZHIsMjU1KTsKKworCWlmKGRpYz09MCB8fCBkaWM9PTIpIHsgLy8gdGRhOTg3NSBhbmQgdGRhOTg3NUEKKwkJcHJpbnRrKCJ0ZGE5ODc1OiBUREE5ODc1JXMgUmV2LiVkIGRldGVjdGVkIGF0IDB4JXhcbiIsCisJCWRpYz09MD8iIjoiQSIsIHJldixhZGRyPDwxKTsKKwkJcmV0dXJuIDE7CisJfQorCXByaW50aygidGRhOTg3NTogbm8gc3VjaCBjaGlwIGF0IDB4JXggKGRpYz0weCV4IHJldj0weCV4KVxuIixhZGRyPDwxLGRpYyxyZXYpOworCXJldHVybigwKTsKK30KKworc3RhdGljIGludCB0ZGE5ODc1X2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgdGRhOTg3NSAqdDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWRwcmludGsoIkluIHRkYTk4NzVfYXR0YWNoXG4iKTsKKworCXQgPSBrbWFsbG9jKHNpemVvZiAqdCxHRlBfS0VSTkVMKTsKKwlpZiAoIXQpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldCh0LDAsc2l6ZW9mICp0KTsKKworCWNsaWVudCA9ICZ0LT5jOworICAgICAgICBtZW1jcHkoY2xpZW50LCZjbGllbnRfdGVtcGxhdGUsc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisgICAgICAgIGNsaWVudC0+YWRhcHRlciA9IGFkYXA7CisgICAgICAgIGNsaWVudC0+YWRkciA9IGFkZHI7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdCk7CisKKwlpZighdGRhOTg3NV9jaGVja2l0KGFkYXAsYWRkcikpIHsKKwkJa2ZyZWUodCk7CisJCXJldHVybiAxOworCX0KKworCWRvX3RkYTk4NzVfaW5pdChjbGllbnQpOworCXByaW50ayhLRVJOX0lORk8gInRkYTk4NzU6IGluaXRcbiIpOworCisJaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZGE5ODc1X3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKyNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCisJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB0ZGE5ODc1X2F0dGFjaCk7CisjZWxzZQorCWlmIChhZGFwLT5pZCA9PSAoSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfQlQ4NDgpKQorCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHRkYTk4NzVfYXR0YWNoKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTk4NzVfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHRkYTk4NzUgKnQgID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb190ZGE5ODc1X2luaXQoY2xpZW50KTsKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCisJa2ZyZWUodCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhOTg3NV9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB0ZGE5ODc1ICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkcHJpbnRrKCJJbiB0ZGE5ODc1X2NvbW1hbmQuLi5cbiIpOworCisJc3dpdGNoIChjbWQpIHsKKyAgICAgICAgLyogLS0tIHY0bCBpb2N0bHMgLS0tICovCisJLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCisJICAga2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLworCWNhc2UgVklESU9DR0FVRElPOgorCXsKKwkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKKwkJaW50IGxlZnQscmlnaHQ7CisKKwkJZHByaW50aygiVklESU9DR0FVRElPXG4iKTsKKworCQl2YS0+ZmxhZ3MgfD0gVklERU9fQVVESU9fVk9MVU1FIHwKKwkJCVZJREVPX0FVRElPX0JBU1MgfAorCQkJVklERU9fQVVESU9fVFJFQkxFOworCisJCS8qIG1pbiBpcyAtODQgbWF4IGlzIDI0ICovCisJCWxlZnQgPSAodC0+bHZvbCs4NCkqNjA2OworCQlyaWdodCA9ICh0LT5ydm9sKzg0KSo2MDY7CisJCXZhLT52b2x1bWU9bWF4KGxlZnQscmlnaHQpOworCQl2YS0+YmFsYW5jZT0oMzI3NjgqbWluKGxlZnQscmlnaHQpKS8KKwkJCSh2YS0+dm9sdW1lID8gdmEtPnZvbHVtZSA6IDEpOworCQl2YS0+YmFsYW5jZT0obGVmdDxyaWdodCk/CisJCQkoNjU1MzUtdmEtPmJhbGFuY2UpIDogdmEtPmJhbGFuY2U7CisJCXZhLT5iYXNzID0gKHQtPmJhc3MrMTIpKjI0Mjc7ICAgIC8qIG1pbiAtMTIgbWF4ICsxNSAqLworCQl2YS0+dHJlYmxlID0gKHQtPnRyZWJsZSsxMikqMjczMDsvKiBtaW4gLTEyIG1heCArMTIgKi8KKwkJdmEtPm1vZGUgfD0gVklERU9fU09VTkRfTU9OTzsKKworCQlicmVhazsgLyogVklESU9DR0FVRElPIGNhc2UgKi8KKwl9CisKKwljYXNlIFZJRElPQ1NBVURJTzoKKwl7CisJCXN0cnVjdCB2aWRlb19hdWRpbyAqdmEgPSBhcmc7CisJCWludCBsZWZ0LHJpZ2h0OworCisJCWRwcmludGsoIlZJREVPQ1NBVURJTy4uLlxuIik7CisJCWxlZnQgPSAobWluKDY1NTM2IC0gdmEtPmJhbGFuY2UsMzI3NjgpICoKKwkJCXZhLT52b2x1bWUpIC8gMzI3Njg7CisJCXJpZ2h0ID0gKG1pbih2YS0+YmFsYW5jZSwoX191MTYpMzI3NjgpICoKKwkJCSB2YS0+dm9sdW1lKSAvIDMyNzY4OworCQl0LT5sdm9sID0gKChsZWZ0LzYwNiktODQpICYgMHhmZjsKKwkJaWYgKHQtPmx2b2wgPiAyNCkKKwkJIHQtPmx2b2wgPSAyNDsKKwkJaWYgKHQtPmx2b2wgPCAtODQpCisJCSB0LT5sdm9sID0gLTg0ICYgMHhmZjsKKworCQl0LT5ydm9sID0gKChyaWdodC82MDYpLTg0KSAmIDB4ZmY7CisJCWlmICh0LT5ydm9sID4gMjQpCisJCSB0LT5ydm9sID0gMjQ7CisJCWlmICh0LT5ydm9sIDwgLTg0KQorCQkgdC0+cnZvbCA9IC04NCAmIDB4ZmY7CisKKwkJdC0+YmFzcyA9ICgodmEtPmJhc3MvMjQwMCktMTIpICYgMHhmZjsKKwkJaWYgKHQtPmJhc3MgPiAxNSkKKwkJIHQtPmJhc3MgPSAxNTsKKwkJaWYgKHQtPmJhc3MgPCAtMTIpCisJCSB0LT5iYXNzID0gLTEyICYgMHhmZjsKKworCQl0LT50cmVibGUgPSAoKHZhLT50cmVibGUvMjcwMCktMTIpICYgMHhmZjsKKwkJaWYgKHQtPnRyZWJsZSA+IDEyKQorCQkgdC0+dHJlYmxlID0gMTI7CisJCWlmICh0LT50cmVibGUgPCAtMTIpCisJCSB0LT50cmVibGUgPSAtMTIgJiAweGZmOworCisKKworLy9wcmludGsoInRkYTk4NzUgYmFsOiUwNHggdm9sOiUwNHggYmFzczolMDR4IHRyZWJsZTolMDR4XG4iLHZhLT5iYWxhbmNlLHZhLT52b2x1bWUsdmEtPmJhc3MsdmEtPnRyZWJsZSk7CisKKworICAgICAgICAgICAgICAgIHRkYTk4NzVfc2V0KGNsaWVudCk7CisKKwkJYnJlYWs7CisKKwl9IC8qIGVuZCBvZiBWSURFT0NTQVVESU8gY2FzZSAqLworCisJZGVmYXVsdDogLyogTm90IFZJREVPQ0dBVURJTyBvciBWSURFT0NTQVVESU8gKi8KKworCQkvKiBub3RoaW5nICovCisJCWRwcmludGsoIkRlZmF1bHRcbiIpOworCisJfSAvKiBlbmQgb2YgKGNtZCkgc3dpdGNoICovCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorICAgICAgICAubmFtZSAgICAgICAgICAgPSAiaTJjIHRkYTk4NzUgZHJpdmVyIiwKKyAgICAgICAgLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1REQTk4NzUsCisgICAgICAgIC5mbGFncyAgICAgICAgICA9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyID0gdGRhOTg3NV9wcm9iZSwKKyAgICAgICAgLmRldGFjaF9jbGllbnQgID0gdGRhOTg3NV9kZXRhY2gsCisgICAgICAgIC5jb21tYW5kICAgICAgICA9IHRkYTk4NzVfY29tbWFuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQoreworICAgICAgICBJMkNfREVWTkFNRSgidGRhOTg3NSIpLAorICAgICAgICAuZHJpdmVyICAgID0gJmRyaXZlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRkYTk4NzVfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRkYTk4NzVfZmluaSh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0ZGE5ODc1X2luaXQpOworbW9kdWxlX2V4aXQodGRhOTg3NV9maW5pKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmIwNjNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMKQEAgLTAsMCArMSw4MDEgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvaWQuaD4KKworLyogQ2hpcHM6CisgICBUREE5ODg1IChQQUwsIE5UU0MpCisgICBUREE5ODg2IChQQUwsIFNFQ0FNLCBOVFNDKQorICAgVERBOTg4NyAoUEFMLCBTRUNBTSwgTlRTQywgRk0gUmFkaW8pCisKKyAgIGZvdW5kIG9uOgorICAgLSBQaW5uYWNsZSBQQ1RWIChKdWwuMjAwMiBWZXJzaW9uIHdpdGggTVQyMDMyLCBidHR2KQorICAgICAgVERBOTg4NyAod29ybGQpLCBUREE5ODg1IChVU0EpCisgICAgICBOb3RlOiBPUDIgb2YgdGRhOTg4eCBtdXN0IGJlIHNldCB0byAxLCBlbHNlIE1UMjAzMiBpcyBkaXNhYmxlZCEKKyAgIC0gS05DIE9uZSBUVi1TdGF0aW9uIFJEUyAoc2FhNzEzNCkKKyovCisKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7CisJMHg4NCA+PjEsCisJMHg4NiA+PjEsCisJMHg5NiA+PjEsCisJSTJDX0NMSUVOVF9FTkQsCit9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHtJMkNfQ0xJRU5UX0VORCxJMkNfQ0xJRU5UX0VORH07CitJMkNfQ0xJRU5UX0lOU01PRDsKKworLyogaW5zbW9kIG9wdGlvbnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVU5TRVQgICAgICAgKC0xVSkKKyNkZWZpbmUgUFJFRklYICAgICAgInRkYTk4ODUvNi83OiAiCisjZGVmaW5lIGRwcmludGsgICAgIGlmIChkZWJ1ZykgcHJpbnRrCisKK3N0cnVjdCB0ZGE5ODg3IHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAgY2xpZW50OworCXY0bDJfc3RkX2lkICAgICAgICBzdGQ7CisJdW5zaWduZWQgaW50ICAgICAgIHJhZGlvOworCXVuc2lnbmVkIGludCAgICAgICBjb25maWc7CisJdW5zaWduZWQgaW50ICAgICAgIHBpbm5hY2xlX2lkOworCXVuc2lnbmVkIGludCAgICAgICB1c2luZ192NGwyOworfTsKKworc3RydWN0IHR2bm9ybSB7CisJdjRsMl9zdGRfaWQgICAgICAgc3RkOworCWNoYXIgICAgICAgICAgICAgICpuYW1lOworCXVuc2lnbmVkIGNoYXIgICAgIGI7CisJdW5zaWduZWQgY2hhciAgICAgYzsKKwl1bnNpZ25lZCBjaGFyICAgICBlOworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8KKy8vIFREQSBkZWZpbmVzCisvLworCisvLy8vIGZpcnN0IHJlZyAoYikKKyNkZWZpbmUgY1ZpZGVvVHJhcEJ5cGFzc09GRiAgICAgMHgwMCAgICAvLyBiaXQgYjAKKyNkZWZpbmUgY1ZpZGVvVHJhcEJ5cGFzc09OICAgICAgMHgwMSAgICAvLyBiaXQgYjAKKworI2RlZmluZSBjQXV0b011dGVGbUluYWN0aXZlICAgICAweDAwICAgIC8vIGJpdCBiMQorI2RlZmluZSBjQXV0b011dGVGbUFjdGl2ZSAgICAgICAweDAyICAgIC8vIGJpdCBiMQorCisjZGVmaW5lIGNJbnRlcmNhcnJpZXIgICAgICAgICAgIDB4MDAgICAgLy8gYml0IGIyCisjZGVmaW5lIGNRU1MgICAgICAgICAgICAgICAgICAgIDB4MDQgICAgLy8gYml0IGIyCisKKyNkZWZpbmUgY1Bvc2l0aXZlQW1UViAgICAgICAgICAgMHgwMCAgICAvLyBiaXQgYjM6NAorI2RlZmluZSBjRm1SYWRpbyAgICAgICAgICAgICAgICAweDA4ICAgIC8vIGJpdCBiMzo0CisjZGVmaW5lIGNOZWdhdGl2ZUZtVFYgICAgICAgICAgIDB4MTAgICAgLy8gYml0IGIzOjQKKworCisjZGVmaW5lIGNGb3JjZWRNdXRlQXVkaW9PTiAgICAgIDB4MjAgICAgLy8gYml0IGI1CisjZGVmaW5lIGNGb3JjZWRNdXRlQXVkaW9PRkYgICAgIDB4MDAgICAgLy8gYml0IGI1CisKKyNkZWZpbmUgY091dHB1dFBvcnQxQWN0aXZlICAgICAgMHgwMCAgICAvLyBiaXQgYjYKKyNkZWZpbmUgY091dHB1dFBvcnQxSW5hY3RpdmUgICAgMHg0MCAgICAvLyBiaXQgYjYKKworI2RlZmluZSBjT3V0cHV0UG9ydDJBY3RpdmUgICAgICAweDAwICAgIC8vIGJpdCBiNworI2RlZmluZSBjT3V0cHV0UG9ydDJJbmFjdGl2ZSAgICAweDgwICAgIC8vIGJpdCBiNworCisKKy8vLy8gc2Vjb25kIHJlZyAoYykKKyNkZWZpbmUgY0RlZW1waGFzaXNPRkYgICAgICAgICAgMHgwMCAgICAvLyBiaXQgYzUKKyNkZWZpbmUgY0RlZW1waGFzaXNPTiAgICAgICAgICAgMHgyMCAgICAvLyBiaXQgYzUKKworI2RlZmluZSBjRGVlbXBoYXNpczc1ICAgICAgICAgICAweDAwICAgIC8vIGJpdCBjNgorI2RlZmluZSBjRGVlbXBoYXNpczUwICAgICAgICAgICAweDQwICAgIC8vIGJpdCBjNgorCisjZGVmaW5lIGNBdWRpb0dhaW4wICAgICAgICAgICAgIDB4MDAgICAgLy8gYml0IGM3CisjZGVmaW5lIGNBdWRpb0dhaW42ICAgICAgICAgICAgIDB4ODAgICAgLy8gYml0IGM3CisKKworLy8vLyB0aGlyZCByZWcgKGUpCisjZGVmaW5lIGNBdWRpb0lGXzRfNSAgICAgICAgICAgICAweDAwICAgIC8vIGJpdCBlMDoxCisjZGVmaW5lIGNBdWRpb0lGXzVfNSAgICAgICAgICAgICAweDAxICAgIC8vIGJpdCBlMDoxCisjZGVmaW5lIGNBdWRpb0lGXzZfMCAgICAgICAgICAgICAweDAyICAgIC8vIGJpdCBlMDoxCisjZGVmaW5lIGNBdWRpb0lGXzZfNSAgICAgICAgICAgICAweDAzICAgIC8vIGJpdCBlMDoxCisKKworI2RlZmluZSBjVmlkZW9JRl81OF83NSAgICAgICAgICAgMHgwMCAgICAvLyBiaXQgZTI6NAorI2RlZmluZSBjVmlkZW9JRl80NV83NSAgICAgICAgICAgMHgwNCAgICAvLyBiaXQgZTI6NAorI2RlZmluZSBjVmlkZW9JRl8zOF85MCAgICAgICAgICAgMHgwOCAgICAvLyBiaXQgZTI6NAorI2RlZmluZSBjVmlkZW9JRl8zOF8wMCAgICAgICAgICAgMHgwQyAgICAvLyBiaXQgZTI6NAorI2RlZmluZSBjVmlkZW9JRl8zM185MCAgICAgICAgICAgMHgxMCAgICAvLyBiaXQgZTI6NAorI2RlZmluZSBjVmlkZW9JRl8zM180MCAgICAgICAgICAgMHgxNCAgICAvLyBiaXQgZTI6NAorI2RlZmluZSBjUmFkaW9JRl80NV83NSAgICAgICAgICAgMHgxOCAgICAvLyBiaXQgZTI6NAorI2RlZmluZSBjUmFkaW9JRl8zOF85MCAgICAgICAgICAgMHgxQyAgICAvLyBiaXQgZTI6NAorCisKKyNkZWZpbmUgY1R1bmVyR2Fpbk5vcm1hbCAgICAgICAgIDB4MDAgICAgLy8gYml0IGU1CisjZGVmaW5lIGNUdW5lckdhaW5Mb3cgICAgICAgICAgICAweDIwICAgIC8vIGJpdCBlNQorCisjZGVmaW5lIGNHYXRpbmdfMTggICAgICAgICAgICAgICAweDAwICAgIC8vIGJpdCBlNgorI2RlZmluZSBjR2F0aW5nXzM2ICAgICAgICAgICAgICAgMHg0MCAgICAvLyBiaXQgZTYKKworI2RlZmluZSBjQWdjT3V0T04gICAgICAgICAgICAgICAgMHg4MCAgICAvLyBiaXQgZTcKKyNkZWZpbmUgY0FnY091dE9GRiAgICAgICAgICAgICAgIDB4MDAgICAgLy8gYml0IGU3CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dm5vcm0gdHZub3Jtc1tdID0geworCXsKKwkJLnN0ZCAgID0gVjRMMl9TVERfUEFMX0JHLAorCQkubmFtZSAgPSAiUEFMLUJHIiwKKwkJLmIgICAgID0gKCBjTmVnYXRpdmVGbVRWICB8CisJCQkgICBjUVNTICAgICAgICAgICApLAorCQkuYyAgICAgPSAoIGNEZWVtcGhhc2lzT04gIHwKKwkJCSAgIGNEZWVtcGhhc2lzNTAgICksCisJCS5lICAgICA9ICggY0F1ZGlvSUZfNV81ICAgfAorCQkJICAgY1ZpZGVvSUZfMzhfOTAgKSwKKwl9LHsKKwkJLnN0ZCAgID0gVjRMMl9TVERfUEFMX0ksCisJCS5uYW1lICA9ICJQQUwtSSIsCisJCS5iICAgICA9ICggY05lZ2F0aXZlRm1UViAgfAorCQkJICAgY1FTUyAgICAgICAgICAgKSwKKwkJLmMgICAgID0gKCBjRGVlbXBoYXNpc09OICB8CisJCQkgICBjRGVlbXBoYXNpczUwICApLAorCQkuZSAgICAgPSAoIGNBdWRpb0lGXzZfMCAgIHwKKwkJCSAgIGNWaWRlb0lGXzM4XzkwICksCisJfSx7CisJCS5zdGQgICA9IFY0TDJfU1REX1BBTF9ESywKKwkJLm5hbWUgID0gIlBBTC1ESyIsCisJCS5iICAgICA9ICggY05lZ2F0aXZlRm1UViAgfAorCQkJICAgY1FTUyAgICAgICAgICAgKSwKKwkJLmMgICAgID0gKCBjRGVlbXBoYXNpc09OICB8CisJCQkgICBjRGVlbXBoYXNpczUwICApLAorCQkuZSAgICAgPSAoIGNBdWRpb0lGXzZfNSAgIHwKKwkJCSAgIGNWaWRlb0lGXzM4XzAwICksCisJfSx7CisJCS5zdGQgICA9IFY0TDJfU1REX1BBTF9NIHwgVjRMMl9TVERfUEFMX04sCisJCS5uYW1lICA9ICJQQUwtTS9OIiwKKwkJLmIgICAgID0gKCBjTmVnYXRpdmVGbVRWICB8CisJCQkgICBjUVNTICAgICAgICAgICApLAorCQkuYyAgICAgPSAoIGNEZWVtcGhhc2lzT04gIHwKKwkJCSAgIGNEZWVtcGhhc2lzNzUgICksCisJCS5lICAgICA9ICggY0F1ZGlvSUZfNF81ICAgfAorCQkJICAgY1ZpZGVvSUZfNDVfNzUgKSwKKwl9LHsKKwkJLnN0ZCAgID0gVjRMMl9TVERfU0VDQU1fTCwKKwkJLm5hbWUgID0gIlNFQ0FNLUwiLAorCQkuYiAgICAgPSAoIGNQb3NpdGl2ZUFtVFYgIHwKKwkJCSAgIGNRU1MgICAgICAgICAgICksCisJCS5lICAgICA9ICggY0F1ZGlvSUZfNl81ICAgfAorCQkJICAgY1ZpZGVvSUZfMzhfOTAgKSwKKwl9LHsKKwkJLnN0ZCAgID0gVjRMMl9TVERfU0VDQU1fREssCisJCS5uYW1lICA9ICJTRUNBTS1ESyIsCisJCS5iICAgICA9ICggY05lZ2F0aXZlRm1UViAgfAorCQkJICAgY1FTUyAgICAgICAgICAgKSwKKwkJLmMgICAgID0gKCBjRGVlbXBoYXNpc09OICB8CisJCQkgICBjRGVlbXBoYXNpczUwICApLAorCQkuZSAgICAgPSAoIGNBdWRpb0lGXzZfNSAgIHwKKwkJCSAgIGNWaWRlb0lGXzM4XzAwICksCisJfSx7CisJCS5zdGQgICA9IFY0TDJfU1REX05UU0NfTSwKKwkJLm5hbWUgID0gIk5UU0MtTSIsCisJCS5iICAgICA9ICggY05lZ2F0aXZlRm1UViAgfAorCQkJICAgY1FTUyAgICAgICAgICAgKSwKKwkJLmMgICAgID0gKCBjRGVlbXBoYXNpc09OICB8CisJCQkgICBjRGVlbXBoYXNpczUwICApLAorCQkuZSAgICAgPSAoIGNHYXRpbmdfMzYgICAgIHwKKwkJCSAgIGNBdWRpb0lGXzRfNSAgIHwKKwkJCSAgIGNWaWRlb0lGXzQ1Xzc1ICksCisJfSx7CisJCS5zdGQgICA9IFY0TDJfU1REX05UU0NfTV9KUCwKKwkJLm5hbWUgID0gIk5UU0MtSlAiLAorCQkuYiAgICAgPSAoIGNOZWdhdGl2ZUZtVFYgIHwKKwkJCSAgIGNRU1MgICAgICAgICAgICksCisJCS5jICAgICA9ICggY0RlZW1waGFzaXNPTiAgfAorCQkJICAgY0RlZW1waGFzaXM1MCAgKSwKKwkJLmUgICAgID0gKCBjR2F0aW5nXzM2ICAgICB8CisJCQkgICBjQXVkaW9JRl80XzUgICB8CisJCQkgICBjVmlkZW9JRl81OF83NSApLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdHZub3JtIHJhZGlvID0geworCS5uYW1lID0gInJhZGlvIiwKKwkuYiAgICA9ICggY0ZtUmFkaW8gICAgICAgfAorCQkgIGNRU1MgICAgICAgICAgICksCisJLmMgICAgPSAoIGNEZWVtcGhhc2lzT04gIHwKKwkJICBjRGVlbXBoYXNpczUwICApLAorCS5lICAgID0gKCBjQXVkaW9JRl81XzUgICB8CisJCSAgY1JhZGlvSUZfMzhfOTAgKSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgZHVtcF9yZWFkX21lc3NhZ2UodW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0YXRpYyBjaGFyICphZmNbMTZdID0geworCQkiLSAxMi41IGtIeiIsCisJCSItIDM3LjUga0h6IiwKKwkJIi0gNjIuNSBrSHoiLAorCQkiLSA4Ny41IGtIeiIsCisJCSItMTEyLjUga0h6IiwKKwkJIi0xMzcuNSBrSHoiLAorCQkiLTE2Mi41IGtIeiIsCisJCSItMTg3LjUga0h6IFttaW5dIiwKKwkJIisxODcuNSBrSHogW21heF0iLAorCQkiKzE2Mi41IGtIeiIsCisJCSIrMTM3LjUga0h6IiwKKwkJIisxMTIuNSBrSHoiLAorCQkiKyA4Ny41IGtIeiIsCisJCSIrIDYyLjUga0h6IiwKKwkJIisgMzcuNSBrSHoiLAorCQkiKyAxMi41IGtIeiIsCisJfTsKKwlwcmludGsoUFJFRklYICJyZWFkOiAweCUyeFxuIiwgYnVmWzBdKTsKKwlwcmludGsoIiAgYWZ0ZXIgcG93ZXIgb24gOiAlc1xuIiwgKGJ1ZlswXSAmIDB4MDEpID8gInllcyIgOiAibm8iKTsKKwlwcmludGsoIiAgYWZjICAgICAgICAgICAgOiAlc1xuIiwgYWZjWyhidWZbMF0gPj4gMSkgJiAweDBmXSk7CisJcHJpbnRrKCIgIGZtaWYgbGV2ZWwgICAgIDogJXNcbiIsIChidWZbMF0gJiAweDIwKSA/ICJoaWdoIiA6ICJsb3ciKTsKKwlwcmludGsoIiAgYWZjIHdpbmRvdyAgICAgOiAlc1xuIiwgKGJ1ZlswXSAmIDB4NDApID8gImluIiA6ICJvdXQiKTsKKwlwcmludGsoIiAgdmZpIGxldmVsICAgICAgOiAlc1xuIiwgKGJ1ZlswXSAmIDB4ODApID8gImhpZ2giIDogImxvdyIpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3dyaXRlX21lc3NhZ2UodW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0YXRpYyBjaGFyICpzb3VuZFs0XSA9IHsKKwkJIkFNL1RWIiwKKwkJIkZNL3JhZGlvIiwKKwkJIkZNL1RWIiwKKwkJIkZNL3JhZGlvIgorCX07CisJc3RhdGljIGNoYXIgKmFkanVzdFszMl0gPSB7CisJCSItMTYiLCAiLTE1IiwgIi0xNCIsICItMTMiLCAiLTEyIiwgIi0xMSIsICItMTAiLCAiLTkiLAorCQkiLTgiLCAgIi03IiwgICItNiIsICAiLTUiLCAgIi00IiwgICItMyIsICAiLTIiLCAgIi0xIiwKKwkJIjAiLCAgICIrMSIsICAiKzIiLCAgIiszIiwgICIrNCIsICAiKzUiLCAgIis2IiwgICIrNyIsCisJCSIrOCIsICAiKzkiLCAgIisxMCIsICIrMTEiLCAiKzEyIiwgIisxMyIsICIrMTQiLCAiKzE1IgorCX07CisJc3RhdGljIGNoYXIgKmRlZW1waFs0XSA9IHsKKwkJIm5vIiwgIm5vIiwgIjc1IiwgIjUwIgorCX07CisJc3RhdGljIGNoYXIgKmNhcnJpZXJbNF0gPSB7CisJCSI0LjUgTUh6IiwKKwkJIjUuNSBNSHoiLAorCQkiNi4wIE1IeiIsCisJCSI2LjUgTUh6IC8gQU0iCisJfTsKKwlzdGF0aWMgY2hhciAqdmlmWzhdID0geworCQkiNTguNzUgTUh6IiwKKwkJIjQ1Ljc1IE1IeiIsCisJCSIzOC45IE1IeiIsCisJCSIzOC4wIE1IeiIsCisJCSIzMy45IE1IeiIsCisJCSIzMy40IE1IeiIsCisJCSI0NS43NSBNSHogKyBwaW4xMyIsCisJCSIzOC45IE1IeiArIHBpbjEzIiwKKwl9OworCXN0YXRpYyBjaGFyICpyaWZbNF0gPSB7CisJCSI0NCBNSHoiLAorCQkiNTIgTUh6IiwKKwkJIjUyIE1IeiIsCisJCSI0NCBNSHoiLAorCX07CisKKwlwcmludGsoUFJFRklYICJ3cml0ZTogYnl0ZSBCIDB4JTAyeFxuIixidWZbMV0pOworCXByaW50aygiICBCMCAgIHZpZGVvIG1vZGUgICAgICA6ICVzXG4iLAorCSAgICAgICAoYnVmWzFdICYgMHgwMSkgPyAidmlkZW8gdHJhcCIgOiAic291bmQgdHJhcCIpOworCXByaW50aygiICBCMSAgIGF1dG8gbXV0ZSBmbSAgICA6ICVzXG4iLAorCSAgICAgICAoYnVmWzFdICYgMHgwMikgPyAieWVzIiA6ICJubyIpOworCXByaW50aygiICBCMiAgIGNhcnJpZXIgbW9kZSAgICA6ICVzXG4iLAorCSAgICAgICAoYnVmWzFdICYgMHgwNCkgPyAiUVNTIiA6ICJJbnRlcmNhcnJpZXIiKTsKKwlwcmludGsoIiAgQjMtNCB0diBzb3VuZC9yYWRpbyAgOiAlc1xuIiwKKwkgICAgICAgc291bmRbKGJ1ZlsxXSAmIDB4MTgpID4+IDNdKTsKKwlwcmludGsoIiAgQjUgICBmb3JjZSBtdXRlIGF1ZGlvOiAlc1xuIiwKKwkgICAgICAgKGJ1ZlsxXSAmIDB4MjApID8gInllcyIgOiAibm8iKTsKKwlwcmludGsoIiAgQjYgICBvdXRwdXQgcG9ydCAxICAgOiAlc1xuIiwKKwkgICAgICAgKGJ1ZlsxXSAmIDB4NDApID8gImhpZ2ggKGluYWN0aXZlKSIgOiAibG93IChhY3RpdmUpIik7CisJcHJpbnRrKCIgIEI3ICAgb3V0cHV0IHBvcnQgMiAgIDogJXNcbiIsCisJICAgICAgIChidWZbMV0gJiAweDgwKSA/ICJoaWdoIChpbmFjdGl2ZSkiIDogImxvdyAoYWN0aXZlKSIpOworCisJcHJpbnRrKFBSRUZJWCAid3JpdGU6IGJ5dGUgQyAweCUwMnhcbiIsYnVmWzJdKTsKKwlwcmludGsoIiAgQzAtNCB0b3AgYWRqdXN0bWVudCAgOiAlcyBkQlxuIiwgYWRqdXN0W2J1ZlsyXSAmIDB4MWZdKTsKKwlwcmludGsoIiAgQzUtNiBkZS1lbXBoYXNpcyAgICAgOiAlc1xuIiwgZGVlbXBoWyhidWZbMl0gJiAweDYwKSA+PiA1XSk7CisJcHJpbnRrKCIgIEM3ICAgYXVkaW8gZ2FpbiAgICAgIDogJXNcbiIsCisJICAgICAgIChidWZbMl0gJiAweDgwKSA/ICItNiIgOiAiMCIpOworCisJcHJpbnRrKFBSRUZJWCAid3JpdGU6IGJ5dGUgRSAweCUwMnhcbiIsYnVmWzNdKTsKKwlwcmludGsoIiAgRTAtMSBzb3VuZCBjYXJyaWVyICAgOiAlc1xuIiwKKwkgICAgICAgY2FycmllclsoYnVmWzNdICYgMHgwMyldKTsKKwlwcmludGsoIiAgRTYgICBsIHBsbCBnYW50aW5nICAgOiAlc1xuIiwKKwkgICAgICAgKGJ1ZlszXSAmIDB4NDApID8gIjM2IiA6ICIxMyIpOworCisJaWYgKGJ1ZlsxXSAmIDB4MDgpIHsKKwkJLyogcmFkaW8gKi8KKwkJcHJpbnRrKCIgIEUyLTQgdmlkZW8gaWYgICAgICAgIDogJXNcbiIsCisJCSAgICAgICByaWZbKGJ1ZlszXSAmIDB4MGMpID4+IDJdKTsKKwkJcHJpbnRrKCIgIEU3ICAgdmlmIGFnYyBvdXRwdXQgIDogJXNcbiIsCisJCSAgICAgICAoYnVmWzNdICYgMHg4MCkKKwkJICAgICAgID8gKChidWZbM10gJiAweDEwKSA/ICJmbS1hZ2MgcmFkaW8iIDogInNpZi1hZ2MgcmFkaW8iKQorCQkgICAgICAgOiAiZm0gcmFkaW8gY2FycmllciBhZmMiKTsKKwl9IGVsc2UgeworCQkvKiB2aWRlbyAqLworCQlwcmludGsoIiAgRTItNCB2aWRlbyBpZiAgICAgICAgOiAlc1xuIiwKKwkJICAgICAgIHZpZlsoYnVmWzNdICYgMHgxYykgPj4gMl0pOworCQlwcmludGsoIiAgRTUgICB0dW5lciBnYWluICAgICAgOiAlc1xuIiwKKwkJICAgICAgIChidWZbM10gJiAweDgwKQorCQkgICAgICAgPyAoKGJ1ZlszXSAmIDB4MjApID8gImV4dGVybmFsIiA6ICJub3JtYWwiKQorCQkgICAgICAgOiAoKGJ1ZlszXSAmIDB4MjApID8gIm1pbmltdW0iICA6ICJub3JtYWwiKSk7CisJCXByaW50aygiICBFNyAgIHZpZiBhZ2Mgb3V0cHV0ICA6ICVzXG4iLAorCQkgICAgICAgKGJ1ZlszXSAmIDB4ODApCisJCSAgICAgICA/ICgoYnVmWzNdICYgMHgyMCkKKwkJCSAgPyAicGluMyBwb3J0LCBwaW4yMiB2aWYgYWdjIG91dCIKKwkJCSAgOiAicGluMjIgcG9ydCwgcGluMyB2aWYgYWNnIGV4dCBpbiIpCisJCSAgICAgICA6ICJwaW4zK3BpbjIyIHBvcnQiKTsKKwl9CisJcHJpbnRrKCItLVxuIik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB0ZGE5ODg3X3NldF90dm5vcm0oc3RydWN0IHRkYTk4ODcgKnQsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdHZub3JtICpub3JtID0gTlVMTDsKKwlpbnQgaTsKKworCWlmICh0LT5yYWRpbykgeworCQlub3JtID0gJnJhZGlvOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR2bm9ybXMpOyBpKyspIHsKKwkJCWlmICh0dm5vcm1zW2ldLnN0ZCAmIHQtPnN0ZCkgeworCQkJCW5vcm0gPSB0dm5vcm1zK2k7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKE5VTEwgPT0gbm9ybSkgeworCQlkcHJpbnRrKFBSRUZJWCAiT29wczogbm8gdHZub3JtIGVudHJ5IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRwcmludGsoUFJFRklYICJjb25maWd1cmUgZm9yOiAlc1xuIixub3JtLT5uYW1lKTsKKwlidWZbMV0gPSBub3JtLT5iOworCWJ1ZlsyXSA9IG5vcm0tPmM7CisJYnVmWzNdID0gbm9ybS0+ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwb3J0MSAgPSBVTlNFVDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG9ydDIgID0gVU5TRVQ7CitzdGF0aWMgdW5zaWduZWQgaW50IHFzcyAgICA9IFVOU0VUOworc3RhdGljIHVuc2lnbmVkIGludCBhZGp1c3QgPSAweDEwOworbW9kdWxlX3BhcmFtKHBvcnQxLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKHBvcnQyLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKHFzcywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShhZGp1c3QsIGludCwgMDY0NCk7CisKK3N0YXRpYyBpbnQgdGRhOTg4N19zZXRfaW5zbW9kKHN0cnVjdCB0ZGE5ODg3ICp0LCBjaGFyICpidWYpCit7CisJaWYgKFVOU0VUICE9IHBvcnQxKSB7CisJCWlmIChwb3J0MSkKKwkJCWJ1ZlsxXSB8PSBjT3V0cHV0UG9ydDFJbmFjdGl2ZTsKKwkJZWxzZQorCQkJYnVmWzFdICY9IH5jT3V0cHV0UG9ydDFJbmFjdGl2ZTsKKwl9CisJaWYgKFVOU0VUICE9IHBvcnQyKSB7CisJCWlmIChwb3J0MikKKwkJCWJ1ZlsxXSB8PSBjT3V0cHV0UG9ydDJJbmFjdGl2ZTsKKwkJZWxzZQorCQkJYnVmWzFdICY9IH5jT3V0cHV0UG9ydDJJbmFjdGl2ZTsKKwl9CisKKwlpZiAoVU5TRVQgIT0gcXNzKSB7CisJCWlmIChxc3MpCisJCQlidWZbMV0gfD0gY1FTUzsKKwkJZWxzZQorCQkJYnVmWzFdICY9IH5jUVNTOworCX0KKworCWlmIChhZGp1c3QgPj0gMHgwMCAmJiBhZGp1c3QgPCAweDIwKQorCQlidWZbMl0gfD0gYWRqdXN0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTk4ODdfc2V0X2NvbmZpZyhzdHJ1Y3QgdGRhOTg4NyAqdCwgY2hhciAqYnVmKQoreworCWlmICh0LT5jb25maWcgJiBUREE5ODg3X1BPUlQxX0FDVElWRSkKKwkJYnVmWzFdICY9IH5jT3V0cHV0UG9ydDFJbmFjdGl2ZTsKKwlpZiAodC0+Y29uZmlnICYgVERBOTg4N19QT1JUMV9JTkFDVElWRSkKKwkJYnVmWzFdIHw9IGNPdXRwdXRQb3J0MUluYWN0aXZlOworCWlmICh0LT5jb25maWcgJiBUREE5ODg3X1BPUlQyX0FDVElWRSkKKwkJYnVmWzFdICY9IH5jT3V0cHV0UG9ydDJJbmFjdGl2ZTsKKwlpZiAodC0+Y29uZmlnICYgVERBOTg4N19QT1JUMl9JTkFDVElWRSkKKwkJYnVmWzFdIHw9IGNPdXRwdXRQb3J0MkluYWN0aXZlOworCisJaWYgKHQtPmNvbmZpZyAmIFREQTk4ODdfUVNTKQorCQlidWZbMV0gfD0gY1FTUzsKKwlpZiAodC0+Y29uZmlnICYgVERBOTg4N19JTlRFUkNBUlJJRVIpCisJCWJ1ZlsxXSAmPSB+Y1FTUzsKKworCWlmICh0LT5jb25maWcgJiBUREE5ODg3X0FVVE9NVVRFKQorCQlidWZbMV0gfD0gY0F1dG9NdXRlRm1BY3RpdmU7CisJaWYgKHQtPmNvbmZpZyAmIFREQTk4ODdfREVFTVBIQVNJU19NQVNLKSB7CisJCWJ1ZlsyXSAmPSB+MHg2MDsKKwkJc3dpdGNoICh0LT5jb25maWcgJiBUREE5ODg3X0RFRU1QSEFTSVNfTUFTSykgeworCQljYXNlIFREQTk4ODdfREVFTVBIQVNJU19OT05FOgorCQkJYnVmWzJdIHw9IGNEZWVtcGhhc2lzT0ZGOworCQkJYnJlYWs7CisJCWNhc2UgVERBOTg4N19ERUVNUEhBU0lTXzUwOgorCQkJYnVmWzJdIHw9IGNEZWVtcGhhc2lzT04gfCBjRGVlbXBoYXNpczUwOworCQkJYnJlYWs7CisJCWNhc2UgVERBOTg4N19ERUVNUEhBU0lTXzc1OgorCQkJYnVmWzJdIHw9IGNEZWVtcGhhc2lzT04gfCBjRGVlbXBoYXNpczc1OworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB0ZGE5ODg3X3NldF9waW5uYWNsZShzdHJ1Y3QgdGRhOTg4NyAqdCwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCBiQ2Fycmllck1vZGUgPSBVTlNFVDsKKworCWlmICh0LT5zdGQgJiBWNEwyX1NURF82MjVfNTApIHsKKwkJaWYgKCgxID09IHQtPnBpbm5hY2xlX2lkKSB8fCAoNyA9PSB0LT5waW5uYWNsZV9pZCkpIHsKKwkJCWJDYXJyaWVyTW9kZSA9IGNJbnRlcmNhcnJpZXI7CisJCX0gZWxzZSB7CisJCQliQ2Fycmllck1vZGUgPSBjUVNTOworCQl9CisJfQorCWlmICh0LT5zdGQgJiBWNEwyX1NURF81MjVfNjApIHsKKyAgICAgICAgICAgICAgICBpZiAoKDUgPT0gdC0+cGlubmFjbGVfaWQpIHx8ICg2ID09IHQtPnBpbm5hY2xlX2lkKSkgeworCQkJYkNhcnJpZXJNb2RlID0gY0ludGVyY2FycmllcjsKKwkJfSBlbHNlIHsKKwkJCWJDYXJyaWVyTW9kZSA9IGNRU1M7CisgICAgICAgICAgICAgICAgfQorCX0KKworCWlmIChiQ2Fycmllck1vZGUgIT0gVU5TRVQpIHsKKwkJYnVmWzFdICY9IH4weDA0OworCQlidWZbMV0gfD0gYkNhcnJpZXJNb2RlOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY2hhciBwYWxbXSA9ICItIjsKK21vZHVsZV9wYXJhbV9zdHJpbmcocGFsLCBwYWwsIDA2NDQsIHNpemVvZihwYWwpKTsKK3N0YXRpYyBjaGFyIHNlY2FtW10gPSAiLSI7Cittb2R1bGVfcGFyYW1fc3RyaW5nKHNlY2FtLCBzZWNhbSwgMDY0NCwgc2l6ZW9mKHNlY2FtKSk7CisKK3N0YXRpYyBpbnQgdGRhOTg4N19maXh1cF9zdGQoc3RydWN0IHRkYTk4ODcgKnQpCit7CisJLyogZ2V0IG1vcmUgcHJlY2lzZSBub3JtIGluZm8gZnJvbSBpbnNtb2Qgb3B0aW9uICovCisJaWYgKCh0LT5zdGQgJiBWNEwyX1NURF9QQUwpID09IFY0TDJfU1REX1BBTCkgeworCQlzd2l0Y2ggKHBhbFswXSkgeworCQljYXNlICdiJzoKKwkJY2FzZSAnQic6CisJCWNhc2UgJ2cnOgorCQljYXNlICdHJzoKKwkJCWRwcmludGsoUFJFRklYICJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtQkdcbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX0JHOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQljYXNlICdJJzoKKwkJCWRwcmludGsoUFJFRklYICJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtSVxuIik7CisJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfSTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJY2FzZSAnRCc6CisJCWNhc2UgJ2snOgorCQljYXNlICdLJzoKKwkJCWRwcmludGsoUFJFRklYICJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtREtcbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX0RLOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCh0LT5zdGQgJiBWNEwyX1NURF9TRUNBTSkgPT0gVjRMMl9TVERfU0VDQU0pIHsKKwkJc3dpdGNoIChzZWNhbVswXSkgeworCQljYXNlICdkJzoKKwkJY2FzZSAnRCc6CisJCWNhc2UgJ2snOgorCQljYXNlICdLJzoKKwkJCWRwcmludGsoUFJFRklYICJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLURLXG4iKTsKKwkJCXQtPnN0ZCA9IFY0TDJfU1REX1NFQ0FNX0RLOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQljYXNlICdMJzoKKwkJCWRwcmludGsoUFJFRklYICJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUxcbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfU0VDQU1fTDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTk4ODdfc3RhdHVzKHN0cnVjdCB0ZGE5ODg3ICp0KQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzFdOworCWludCByYzsKKworCW1lbXNldChidWYsMCxzaXplb2YoYnVmKSk7CisgICAgICAgIGlmICgxICE9IChyYyA9IGkyY19tYXN0ZXJfcmVjdigmdC0+Y2xpZW50LGJ1ZiwxKSkpCisgICAgICAgICAgICAgICAgcHJpbnRrKFBSRUZJWCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIixyYyk7CisJZHVtcF9yZWFkX21lc3NhZ2UoYnVmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZGE5ODg3X2NvbmZpZ3VyZShzdHJ1Y3QgdGRhOTg4NyAqdCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKwlpbnQgcmM7CisKKwltZW1zZXQoYnVmLDAsc2l6ZW9mKGJ1ZikpOworCXRkYTk4ODdfc2V0X3R2bm9ybSh0LGJ1Zik7CisJYnVmWzFdIHw9IGNPdXRwdXRQb3J0MUluYWN0aXZlOworCWJ1ZlsxXSB8PSBjT3V0cHV0UG9ydDJJbmFjdGl2ZTsKKwlpZiAoVU5TRVQgIT0gdC0+cGlubmFjbGVfaWQpIHsKKwkJdGRhOTg4N19zZXRfcGlubmFjbGUodCxidWYpOworCX0KKwl0ZGE5ODg3X3NldF9jb25maWcodCxidWYpOworCXRkYTk4ODdfc2V0X2luc21vZCh0LGJ1Zik7CisKKyNpZiAwCisJLyogVGhpcyBhcy1pcyBicmVha3Mgc29tZSBjYXJkcywgbXVzdCBiZSBmaXhlZCBpbiBhCisJICogY2FyZC1zcGVjaWZpYyB3YXksIHByb2JhYmx5IHVzaW5nIFREQTk4ODdfU0VUX0NPTkZJRyB0bworCSAqIHR1cm4gb24vb2ZmIHBvcnQyICovCisJaWYgKHQtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNX0wpIHsKKwkJLyogc2VjYW0gZml4dXAgKEZJWE1FOiBtb3ZlIHRoaXMgdG8gdHZub3JtcyBhcnJheT8pICovCisJCWJ1ZlsxXSAmPSB+Y091dHB1dFBvcnQySW5hY3RpdmU7CisJfQorI2VuZGlmCisKKwlkcHJpbnRrKFBSRUZJWCAid3JpdGluZzogYj0weCUwMnggYz0weCUwMnggZT0weCUwMnhcbiIsCisJCWJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKKwlpZiAoZGVidWcgPiAxKQorCQlkdW1wX3dyaXRlX21lc3NhZ2UoYnVmKTsKKworICAgICAgICBpZiAoNCAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoJnQtPmNsaWVudCxidWYsNCkpKQorICAgICAgICAgICAgICAgIHByaW50ayhQUkVGSVggImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgNClcbiIscmMpOworCisJaWYgKGRlYnVnID4gMikgeworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKTsKKwkJdGRhOTg4N19zdGF0dXModCk7CisJfQorCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgdGRhOTg4N19hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IHRkYTk4ODcgKnQ7CisKKyAgICAgICAgY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOworICAgICAgICBjbGllbnRfdGVtcGxhdGUuYWRkciAgICA9IGFkZHI7CisKKyAgICAgICAgcHJpbnRrKFBSRUZJWCAiY2hpcCBmb3VuZCBAIDB4JXhcbiIsIGFkZHI8PDEpOworCisgICAgICAgIGlmIChOVUxMID09ICh0ID0ga21hbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHQsMCxzaXplb2YoKnQpKTsKKwl0LT5jbGllbnQgICAgICA9IGNsaWVudF90ZW1wbGF0ZTsKKwl0LT5zdGQgICAgICAgICA9IDA7CisJdC0+cGlubmFjbGVfaWQgPSBVTlNFVDsKKyAgICAgICAgaTJjX3NldF9jbGllbnRkYXRhKCZ0LT5jbGllbnQsIHQpOworICAgICAgICBpMmNfYXR0YWNoX2NsaWVudCgmdC0+Y2xpZW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTk4ODdfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKKwlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQorCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHRkYTk4ODdfYXR0YWNoKTsKKyNlbHNlCisJc3dpdGNoIChhZGFwLT5pZCkgeworCWNhc2UgSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfQlQ4NDg6CisJY2FzZSBJMkNfQUxHT19CSVQgfCBJMkNfSFdfQl9SSVZBOgorCWNhc2UgSTJDX0FMR09fU0FBNzEzNDoKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB0ZGE5ODg3X2F0dGFjaCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTk4ODdfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHRkYTk4ODcgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUodCk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU1dJVENIX1Y0TDIJaWYgKCF0LT51c2luZ192NGwyICYmIGRlYnVnKSBcCisJCSAgICAgICAgICBwcmludGsoUFJFRklYICJzd2l0Y2hpbmcgdG8gdjRsMlxuIik7IFwKKwkgICAgICAgICAgICAgICAgICB0LT51c2luZ192NGwyID0gMTsKKyNkZWZpbmUgQ0hFQ0tfVjRMMglpZiAodC0+dXNpbmdfdjRsMikgeyBpZiAoZGVidWcpIFwKKwkJCSAgcHJpbnRrKFBSRUZJWCAiaWdub3JlIHY0bDEgY2FsbFxuIik7IFwKKwkJICAgICAgICAgIHJldHVybiAwOyB9CisKK3N0YXRpYyBpbnQKK3RkYTk4ODdfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHRkYTk4ODcgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworICAgICAgICBzd2l0Y2ggKGNtZCkgeworCisJLyogLS0tIGNvbmZpZ3VyYXRpb24gLS0tICovCisJY2FzZSBBVURDX1NFVF9SQURJTzoKKwkJdC0+cmFkaW8gPSAxOworCQl0ZGE5ODg3X2NvbmZpZ3VyZSh0KTsKKwkJYnJlYWs7CisKKwljYXNlIEFVRENfQ09ORklHX1BJTk5BQ0xFOgorCXsKKwkJaW50ICppID0gYXJnOworCisJCXQtPnBpbm5hY2xlX2lkID0gKmk7CisJCXRkYTk4ODdfY29uZmlndXJlKHQpOworCQlicmVhazsKKwl9CisJY2FzZSBUREE5ODg3X1NFVF9DT05GSUc6CisJeworCQlpbnQgKmkgPSBhcmc7CisKKwkJdC0+Y29uZmlnID0gKmk7CisJCXRkYTk4ODdfY29uZmlndXJlKHQpOworCQlicmVhazsKKwl9CisJLyogLS0tIHY0bCBpb2N0bHMgLS0tICovCisJLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCisJICAga2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLworCWNhc2UgVklESU9DU0NIQU46CisJeworCQlzdGF0aWMgY29uc3QgdjRsMl9zdGRfaWQgbWFwW10gPSB7CisJCQlbIFZJREVPX01PREVfUEFMICAgXSA9IFY0TDJfU1REX1BBTCwKKwkJCVsgVklERU9fTU9ERV9OVFNDICBdID0gVjRMMl9TVERfTlRTQ19NLAorCQkJWyBWSURFT19NT0RFX1NFQ0FNIF0gPSBWNEwyX1NURF9TRUNBTSwKKwkJCVsgNCAvKiBidHR2ICovICAgICBdID0gVjRMMl9TVERfUEFMX00sCisJCQlbIDUgLyogYnR0diAqLyAgICAgXSA9IFY0TDJfU1REX1BBTF9OLAorCQkJWyA2IC8qIGJ0dHYgKi8gICAgIF0gPSBWNEwyX1NURF9OVFNDX01fSlAsCisJCX07CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2YyA9IGFyZzsKKworCQlDSEVDS19WNEwyOworCQl0LT5yYWRpbyA9IDA7CisJCWlmICh2Yy0+bm9ybSA8IEFSUkFZX1NJWkUobWFwKSkKKwkJCXQtPnN0ZCA9IG1hcFt2Yy0+bm9ybV07CisJCXRkYTk4ODdfZml4dXBfc3RkKHQpOworCQl0ZGE5ODg3X2NvbmZpZ3VyZSh0KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOworCisJCVNXSVRDSF9WNEwyOworCQl0LT5yYWRpbyA9IDA7CisJCXQtPnN0ZCAgID0gKmlkOworCQl0ZGE5ODg3X2ZpeHVwX3N0ZCh0KTsKKwkJdGRhOTg4N19jb25maWd1cmUodCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwl7CisJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKKworCQlTV0lUQ0hfVjRMMjsKKwkJaWYgKFY0TDJfVFVORVJfQU5BTE9HX1RWID09IGYtPnR5cGUpIHsKKwkJCWlmICh0LT5yYWRpbyA9PSAwKQorCQkJCXJldHVybiAwOworCQkJdC0+cmFkaW8gPSAwOworCQl9CisJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IGYtPnR5cGUpIHsKKwkJCWlmICh0LT5yYWRpbyA9PSAxKQorCQkJCXJldHVybiAwOworCQkJdC0+cmFkaW8gPSAxOworCQl9CisJCXRkYTk4ODdfY29uZmlndXJlKHQpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfR19UVU5FUjoKKwl7CisJCXN0YXRpYyBpbnQgQUZDX0JJVFNfMl9rSHpbXSA9IHsKKwkJCS0xMjUwMCwgIC0zNzUwMCwgIC02MjUwMCwgIC05NzUwMCwKKwkJCS0xMTI1MDAsIC0xMzc1MDAsIC0xNjI1MDAsIC0xODc1MDAsCisJCQkxODc1MDAsICAxNjI1MDAsICAxMzc1MDAsICAxMTI1MDAsCisJCQk5NzUwMCAsICA2MjUwMCwgICAzNzUwMCAsICAxMjUwMAorCQl9OworCQlzdHJ1Y3QgdjRsMl90dW5lciogdHVuZXIgPSBhcmc7CisKKwkJaWYgKHQtPnJhZGlvKSB7CisJCQlfX3U4IHJlZyA9IDA7CisJCQl0dW5lci0+YWZjPTA7CisJCQlpZiAoMSA9PSBpMmNfbWFzdGVyX3JlY3YoJnQtPmNsaWVudCwmcmVnLDEpKQorCQkJCXR1bmVyLT5hZmMgPSBBRkNfQklUU18yX2tIelsocmVnPj4xKSYweDBmXTsKKwkJfQorCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJLyogbm90aGluZyAqLworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhOTg4N19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHUzMiBzdGF0ZSwgdTMyIGxldmVsKQoreworCWRwcmludGsoInRkYTk4ODc6IHN1c3BlbmRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTk4ODdfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOworCXN0cnVjdCB0ZGE5ODg3ICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJZHByaW50aygidGRhOTg4NzogcmVzdW1lXG4iKTsKKwl0ZGE5ODg3X2NvbmZpZ3VyZSh0KTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImkyYyB0ZGE5ODg3IGRyaXZlciIsCisgICAgICAgIC5pZCAgICAgICAgICAgICA9IC0xLCAvKiBGSVhNRSAqLworICAgICAgICAuZmxhZ3MgICAgICAgICAgPSBJMkNfREZfTk9USUZZLAorICAgICAgICAuYXR0YWNoX2FkYXB0ZXIgPSB0ZGE5ODg3X3Byb2JlLAorICAgICAgICAuZGV0YWNoX2NsaWVudCAgPSB0ZGE5ODg3X2RldGFjaCwKKyAgICAgICAgLmNvbW1hbmQgICAgICAgID0gdGRhOTg4N19jb21tYW5kLAorCS5kcml2ZXIgPSB7CisJCS5zdXNwZW5kID0gdGRhOTg4N19zdXNwZW5kLAorCQkucmVzdW1lICA9IHRkYTk4ODdfcmVzdW1lLAorCX0sCit9Oworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9Cit7CisJSTJDX0RFVk5BTUUoInRkYTk4ODciKSwKKwkuZmxhZ3MgICAgID0gSTJDX0NMSUVOVF9BTExPV19VU0UsCisgICAgICAgIC5kcml2ZXIgICAgPSAmZHJpdmVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGRhOTg4N19pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRkYTk4ODdfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGRhOTg4N19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh0ZGE5ODg3X2NsZWFudXBfbW9kdWxlKTsKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MTVjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MTVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjMzk1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNjQxNWMuYwpAQCAtMCwwICsxLDIyMyBAQAorIC8qCisgICAgdGVhNjQxNWMgLSBpMmMtZHJpdmVyIGZvciB0aGUgdGVhNjQxNWMgYnkgU0dTIFRob21zb24KKworICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIE1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+CisKKyAgICBUaGUgdGVhNjQxNWMgaXMgYSBidXMgY29udHJvbGxlZCB2aWRlby1tYXRyaXgtc3dpdGNoCisgICAgd2l0aCA4IGlucHV0cyBhbmQgNiBvdXRwdXRzLgorICAgIEl0IGlzIGNhc2NhZGFibGUsIGkuZS4gaXQgY2FuIGJlIGZvdW5kIGF0IHRoZSBhZGRyZXNzZXMKKyAgICAweDg2IGFuZCAweDA2IG9uIHRoZSBpMmMtYnVzLgorCisgICAgRm9yIGRldGFpbGVkIGluZm9ybWF0aW9ucyBkb3dubG9hZCB0aGUgc3BlY2lmaWNhdGlvbnMgZGlyZWN0bHkKKyAgICBmcm9tIFNHUyBUaG9tc29uIGF0IGh0dHA6Ly93d3cuc3QuY29tCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdnMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTXZzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlICJ0ZWE2NDE1Yy5oIgorCitzdGF0aWMgaW50IGRlYnVnID0gMDsJCS8qIGluc21vZCBwYXJhbWV0ZXIgKi8KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZXZpY2UgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CisjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAorICAgICAgICAgICAgZG8geyBpZiAoZGVidWcpIHsgcHJpbnRrKCIlczogJXMoKVslZF06ICIsX19zdHJpbmdpZnkoS0JVSUxEX01PRE5BTUUpLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgcHJpbnRrKGFyZ3MpOyB9IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEVBNjQxNUNfTlVNX0lOUFVUUwk4CisjZGVmaW5lIFRFQTY0MTVDX05VTV9PVVRQVVRTCTYKKworLyogYWRkcmVzc2VzIHRvIHNjYW4sIGZvdW5kIG9ubHkgYXQgMHgwMyBhbmQvb3IgMHg0MyAoNy1iaXQpICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfVEVBNjQxNUNfMSwgSTJDX1RFQTY0MTVDXzIsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY19yYW5nZVtdID0geyBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBtYWdpYyBkZWZpbml0aW9uIG9mIGFsbCBvdGhlciB2YXJpYWJsZXMgYW5kIHRoaW5ncyAqLworSTJDX0NMSUVOVF9JTlNNT0Q7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXI7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOworCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfcHJvYmUgKi8KK3N0YXRpYyBpbnQgZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBOVUxMOworCWludCBlcnIgPSAwOworCisJLyogbGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBhZGFwdGVyIGNhbiBzdXBwb3J0IHdoYXQgd2UgbmVlZCAqLworCWlmICgwID09IGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUpKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2xpZW50IHN0cnVjdHVyZSAqLworCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKDAgPT0gY2xpZW50KSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGZpbGwgY2xpZW50IHN0cnVjdHVyZSAqLworCW1lbWNweShjbGllbnQsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKworCS8qIHRlbGwgdGhlIGkyYyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoMCAhPSAoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwcmludGsoInRlYTY0MTVjOiBkZXRlY3RlZCBAIDB4JTAyeCBvbiBhZGFwdGVyICVzXG4iLCBhZGRyZXNzLCAmY2xpZW50LT5hZGFwdGVyLT5uYW1lWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyogbGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBpcyBhIGtub3cgYWRhcHRlciB3ZSBjYW4gYXR0YWNoIHRvICovCisJaWYgKGFkYXB0ZXItPmlkICE9IEkyQ19BTEdPX1NBQTcxNDYpIHsKKwkJZHByaW50aygicmVmdXNpbmcgdG8gcHJvYmUgb24gdW5rbm93biBhZGFwdGVyIFtuYW1lPSclcycsaWQ9MHgleF1cbiIsIGFkYXB0ZXItPm5hbWUsIGFkYXB0ZXItPmlkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCAmZGV0ZWN0KTsKK30KKworc3RhdGljIGludCBkZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmV0ID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIG1ha2VzIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBpbnB1dC1waW4gJ2knIGFuZCB0aGUgb3V0cHV0LXBpbiAnbycKKyAgIGZvciB0aGUgdGVhNjQxNWMtY2xpZW50ICdjbGllbnQnICovCitzdGF0aWMgaW50IHN3aXRjaF9tYXRyaXgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGksIGludCBvKQoreworCXU4IGJ5dGUgPSAwOworCWludCByZXQ7CisJCisJZHByaW50aygiYWRyOjB4JTAyeCwgaTolZCwgbzolZFxuIiwgY2xpZW50LT5hZGRyLCBpLCBvKTsKKworCS8qIGNoZWNrIGlmIHRoZSBwaW5zIGFyZSB2YWxpZCAqLworCWlmICgwID09ICgoMSA9PSBpIHx8ICAzID09IGkgfHwgIDUgPT0gaSB8fCAgNiA9PSBpIHx8ICA4ID09IGkgfHwgMTAgPT0gaSB8fCAyMCA9PSBpIHx8IDExID09IGkpCisJICAgICAgJiYgKDE4ID09IG8gfHwgMTcgPT0gbyB8fCAxNiA9PSBvIHx8IDE1ID09IG8gfHwgMTQgPT0gbyB8fCAxMyA9PSBvKSkpCisJCXJldHVybiAtMTsKKworCS8qIHRvIHVuZGVyc3RhbmQgdGhpcywgaGF2ZSBhIGxvb2sgYXQgdGhlIHRlYTY0MTVjLXNwZWNzIChwLjUpICovCisJc3dpdGNoIChvKSB7CisJY2FzZSAxODoKKwkJYnl0ZSA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgMTQ6CisJCWJ5dGUgPSAweDIwOworCQlicmVhazsKKwljYXNlIDE2OgorCQlieXRlID0gMHgxMDsKKwkJYnJlYWs7CisJY2FzZSAxNzoKKwkJYnl0ZSA9IDB4MDg7CisJCWJyZWFrOworCWNhc2UgMTU6CisJCWJ5dGUgPSAweDE4OworCQlicmVhazsKKwljYXNlIDEzOgorCQlieXRlID0gMHgyODsKKwkJYnJlYWs7CisJfTsKKworCXN3aXRjaCAoaSkgeworCWNhc2UgNToKKwkJYnl0ZSB8PSAweDAwOworCQlicmVhazsKKwljYXNlIDg6CisJCWJ5dGUgfD0gMHgwNDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlieXRlIHw9IDB4MDI7CisJCWJyZWFrOworCWNhc2UgMjA6CisJCWJ5dGUgfD0gMHgwNjsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlieXRlIHw9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCWJ5dGUgfD0gMHgwNTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlieXRlIHw9IDB4MDM7CisJCWJyZWFrOworCWNhc2UgMTE6CisJCWJ5dGUgfD0gMHgwNzsKKwkJYnJlYWs7CisJfTsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgYnl0ZSk7CisJaWYgKHJldCkgeworCQlkcHJpbnRrKCJpMmNfc21idXNfd3JpdGVfYnl0ZSgpIGZhaWxlZCwgcmV0OiVkXG4iLCByZXQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB0ZWE2NDE1Y19tdWx0aXBsZXggKnYgPSAoc3RydWN0IHRlYTY0MTVjX211bHRpcGxleCAqKWFyZzsKKwlpbnQgcmVzdWx0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBURUE2NDE1Q19TV0lUQ0g6CisJCXJlc3VsdCA9IHN3aXRjaF9tYXRyaXgoY2xpZW50LCB2LT5pbiwgdi0+b3V0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5uYW1lIAk9ICJ0ZWE2NDE1YyIsCisJLmlkIAk9IEkyQ19EUklWRVJJRF9URUE2NDE1QywKKwkuZmxhZ3MgCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBhdHRhY2gsCisJLmRldGFjaF9jbGllbnQJPSBkZXRhY2gsCisJLmNvbW1hbmQJPSBjb21tYW5kLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKKwlJMkNfREVWTkFNRSgidGVhNjQxNWMiKSwKKwkuZHJpdmVyID0gJmRyaXZlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRoaXNfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0aGlzX21vZHVsZV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRoaXNfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQodGhpc19tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInRlYTY0MTVjIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDE1Yy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDE1Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGVkODAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MTVjLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfX0lOQ0xVREVEX1RFQTY0MTVDX18KKyNkZWZpbmUgX19JTkNMVURFRF9URUE2NDE1Q19fCisKKy8qIHBvc3NpYmxlIGkyYy1hZGRyZXNzZXMgKi8KKyNkZWZpbmUJSTJDX1RFQTY0MTVDXzEJCTB4MDMKKyNkZWZpbmUJSTJDX1RFQTY0MTVDXzIJCTB4NDMKKworLyogdGhlIHRlYTY0MTVjJ3MgZGVzaWduIGlzIHF1aXRlIGJyYWluLWRlYWQuIGFsdGhvdWdoIHRoZXJlIGFyZQorICAgOCBpbnB1dHMgYW5kIDYgb3V0cHV0cywgdGhlc2UgYXJlbid0IGVudW1lcmF0ZWQgaW4gYW55IHdheS4gYmVjYXVzZQorICAgSSBkb24ndCB3YW50IHRvIHNheSAiY29ubmVjdCBpbnB1dCBwaW4gMjAgdG8gb3V0cHV0IHBpbiAxNyIsIEkgZGVmaW5lCisgICBhICJ2aXJ0dWFsIiBwaW4tb3JkZXIuICovCisKKy8qIGlucHV0IHBpbnMgKi8KKyNkZWZpbmUgVEVBNjQxNUNfT1VUUFVUMSAxOAorI2RlZmluZSBURUE2NDE1Q19PVVRQVVQyIDE0CisjZGVmaW5lIFRFQTY0MTVDX09VVFBVVDMgMTYKKyNkZWZpbmUgVEVBNjQxNUNfT1VUUFVUNCAxNworI2RlZmluZSBURUE2NDE1Q19PVVRQVVQ1IDEzCisjZGVmaW5lIFRFQTY0MTVDX09VVFBVVDYgMTUKKworLyogb3V0cHV0IHBpbnMgKi8KKyNkZWZpbmUgVEVBNjQxNUNfSU5QVVQxIDUKKyNkZWZpbmUgVEVBNjQxNUNfSU5QVVQyIDgKKyNkZWZpbmUgVEVBNjQxNUNfSU5QVVQzIDMKKyNkZWZpbmUgVEVBNjQxNUNfSU5QVVQ0IDIwCisjZGVmaW5lIFRFQTY0MTVDX0lOUFVUNSA2CisjZGVmaW5lIFRFQTY0MTVDX0lOUFVUNiAxMAorI2RlZmluZSBURUE2NDE1Q19JTlBVVDcgMQorI2RlZmluZSBURUE2NDE1Q19JTlBVVDggMTEKKworc3RydWN0IHRlYTY0MTVjX211bHRpcGxleAoreworCWludAlpbjsJLyogaW5wdXQtcGluICovCisJaW50CW91dDsJLyogb3V0cHV0LXBpbiAqLworfTsKKworI2RlZmluZSBURUE2NDE1Q19TV0lUQ0gJCV9JT1coJ3YnLDEsc3RydWN0IHRlYTY0MTVjX211bHRpcGxleCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNjQyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTA3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYwpAQCAtMCwwICsxLDIwMCBAQAorIC8qCisgICAgdGVhNjQyMCAtIGkyYy1kcml2ZXIgZm9yIHRoZSB0ZWE2NDIwIGJ5IFNHUyBUaG9tc29uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBNaWNoYWVsIEh1bm9sZCA8bWljaGFlbEBtaWh1LmRlPgorCisgICAgVGhlIHRlYTY0MjAgaXMgYSBidXMgY29udHJvbGxlZCBhdWRpby1tYXRyaXggd2l0aCA1IHN0ZXJlbyBpbnB1dHMsCisgICAgNCBzdGVyZW8gb3V0cHV0cyBhbmQgZ2FpbiBjb250cm9sIGZvciBlYWNoIG91dHB1dC4KKyAgICBJdCBpcyBjYXNjYWRhYmxlLCBpLmUuIGl0IGNhbiBiZSBmb3VuZCBhdCB0aGUgYWRyZXNzZXMgMHg5OAorICAgIGFuZCAweDlhIG9uIHRoZSBpMmMtYnVzLgorCisgICAgRm9yIGRldGFpbGVkIGluZm9ybWF0aW9ucyBkb3dubG9hZCB0aGUgc3BlY2lmaWNhdGlvbnMgZGlyZWN0bHkKKyAgICBmcm9tIFNHUyBUaG9tc29uIGF0IGh0dHA6Ly93d3cuc3QuY29tCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlICJ0ZWE2NDIwLmgiCisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOwkJLyogaW5zbW9kIHBhcmFtZXRlciAqLworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGRldmljZSBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKyNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCisgICAgICAgICAgICBkbyB7IGlmIChkZWJ1ZykgeyBwcmludGsoIiVzOiAlcygpWyVkXTogIixfX3N0cmluZ2lmeShLQlVJTERfTU9ETkFNRSksIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBwcmludGsoYXJncyk7IH0gfSB3aGlsZSAoMCkKKworLyogYWRkcmVzc2VzIHRvIHNjYW4sIGZvdW5kIG9ubHkgYXQgMHg0YyBhbmQvb3IgMHg0ZCAoNy1CaXQpICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfVEVBNjQyMF8xLCBJMkNfVEVBNjQyMF8yLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogbWFnaWMgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgdmFyaWFibGVzIGFuZCB0aGluZ3MgKi8KK0kyQ19DTElFTlRfSU5TTU9EOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyOworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKKworLyogbWFrZSBhIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgaW5wdXQgJ2knIGFuZCB0aGUgb3V0cHV0ICdvJworICAgd2l0aCBnYWluICdnJyBmb3IgdGhlIHRlYTY0MjAtY2xpZW50ICdjbGllbnQnIChub3RlOiBpID0gNiBtZWFucyAnbXV0ZScpICovCitzdGF0aWMgaW50IHRlYTY0MjBfc3dpdGNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBpLCBpbnQgbywgaW50IGcpCit7CisJdTggYnl0ZSA9IDA7CisJaW50IHJldDsKKworCWRwcmludGsoImFkcjoweCUwMngsIGk6JWQsIG86JWQsIGc6JWRcbiIsIGNsaWVudC0+YWRkciwgaSwgbywgZyk7CisKKwkvKiBjaGVjayBpZiB0aGUgcGFyYW10ZXJzIGFyZSB2YWxpZCAqLworCWlmIChpIDwgMSB8fCBpID4gNiB8fCBvIDwgMSB8fCBvID4gNCB8fCBnIDwgMCB8fCBnID4gNiB8fCBnICUgMiAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlieXRlICA9ICgobyAtIDEpIDw8IDUpOworCWJ5dGUgfD0gKGkgLSAxKTsKKworCS8qIHRvIHVuZGVyc3RhbmQgdGhpcywgaGF2ZSBhIGxvb2sgYXQgdGhlIHRlYTY0MjAtc3BlY3MgKHAuNSkgKi8KKwlzd2l0Y2ggKGcpIHsKKwljYXNlIDA6CisJCWJ5dGUgfD0gKDMgPDwgMyk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYnl0ZSB8PSAoMiA8PCAzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlieXRlIHw9ICgxIDw8IDMpOworCQlicmVhazsKKwljYXNlIDY6CisJCWJyZWFrOworCX0KKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgYnl0ZSk7CisJaWYgKHJldCkgeworCQlkcHJpbnRrKCJpMmNfc21idXNfd3JpdGVfYnl0ZSgpIGZhaWxlZCwgcmV0OiVkXG4iLCByZXQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19wcm9iZSAqLworc3RhdGljIGludCB0ZWE2NDIwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWludCBlcnIgPSAwLCBpID0gMDsKKworCS8qIGxldCdzIHNlZSB3aGV0aGVyIHRoaXMgYWRhcHRlciBjYW4gc3VwcG9ydCB3aGF0IHdlIG5lZWQgKi8KKwlpZiAoMCA9PSBpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNsaWVudCBzdHJ1Y3R1cmUgKi8KKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmICgwID09IGNsaWVudCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGNsaWVudCwgMHgwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKKworCS8qIGZpbGwgY2xpZW50IHN0cnVjdHVyZSAqLworCW1lbWNweShjbGllbnQsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKworCS8qIHRlbGwgdGhlIGkyYyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoMCAhPSAoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBzZXQgaW5pdGlhbCB2YWx1ZXM6IHNldCAibXV0ZSItaW5wdXQgdG8gYWxsIG91dHB1dHMgYXQgZ2FpbiAwICovCisJZXJyID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKSB7CisJCWVyciArPSB0ZWE2NDIwX3N3aXRjaChjbGllbnQsIDYsIGksIDApOworCX0KKwlpZiAoZXJyKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBpbml0aWFsaXplIHRlYTY0MjBcbiIpOworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwcmludGsoInRlYTY0MjA6IGRldGVjdGVkIEAgMHglMDJ4IG9uIGFkYXB0ZXIgJXNcbiIsIGFkZHJlc3MsICZjbGllbnQtPmFkYXB0ZXItPm5hbWVbMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKiBsZXQncyBzZWUgd2hldGhlciB0aGlzIGlzIGEga25vdyBhZGFwdGVyIHdlIGNhbiBhdHRhY2ggdG8gKi8KKwlpZiAoYWRhcHRlci0+aWQgIT0gSTJDX0FMR09fU0FBNzE0NikgeworCQlkcHJpbnRrKCJyZWZ1c2luZyB0byBwcm9iZSBvbiB1bmtub3duIGFkYXB0ZXIgW25hbWU9JyVzJyxpZD0weCV4XVxuIiwgYWRhcHRlci0+bmFtZSwgYWRhcHRlci0+aWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsICZ0ZWE2NDIwX2RldGVjdCk7Cit9CisKK3N0YXRpYyBpbnQgZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJldCA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB0ZWE2NDIwX211bHRpcGxleCAqYSA9IChzdHJ1Y3QgdGVhNjQyMF9tdWx0aXBsZXggKilhcmc7CisJaW50IHJlc3VsdCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVEVBNjQyMF9TV0lUQ0g6CisJCXJlc3VsdCA9IHRlYTY0MjBfc3dpdGNoKGNsaWVudCwgYS0+aW4sIGEtPm91dCwgYS0+Z2Fpbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkubmFtZQk9ICJ0ZWE2NDIwIiwKKwkuaWQJPSBJMkNfRFJJVkVSSURfVEVBNjQyMCwKKwkuZmxhZ3MJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGF0dGFjaCwKKwkuZGV0YWNoX2NsaWVudAk9IGRldGFjaCwKKwkuY29tbWFuZAk9IGNvbW1hbmQsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0geworCUkyQ19ERVZOQU1FKCJ0ZWE2NDIwIiksCisJLmRyaXZlciA9ICZkcml2ZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0aGlzX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGhpc19tb2R1bGVfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0aGlzX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHRoaXNfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEh1bm9sZCA8bWljaGFlbEBtaWh1LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0ZWE2NDIwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDIwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTY2NGRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDIwLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfX0lOQ0xVREVEX1RFQTY0MjBfXworI2RlZmluZSBfX0lOQ0xVREVEX1RFQTY0MjBfXworCisvKiBwb3NzaWJsZSBhZGRyZXNzZXMgKi8KKyNkZWZpbmUJSTJDX1RFQTY0MjBfMQkJMHg0YworI2RlZmluZQlJMkNfVEVBNjQyMF8yCQkweDRkCisKK3N0cnVjdCB0ZWE2NDIwX211bHRpcGxleAoreworCWludAlpbjsJLyogaW5wdXQgb2YgYXVkaW8gc3dpdGNoICovCisJaW50CW91dDsJLyogb3V0cHV0IG9mIGF1ZGlvIHN3aXRjaCAgKi8KKwlpbnQJZ2FpbjsJLyogZ2FpbiBvZiBjb25uZWN0aW9uICovCit9OworCisjZGVmaW5lIFRFQTY0MjBfU1dJVENICQlfSU9XKCd2JywxLHN0cnVjdCB0ZWE2NDIwX211bHRpcGxleCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjBhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIERyaXZlciBmb3IgUGhpbGlwcyBTQUIzMDM2ICJDSVRBQyIgdHVuZXIgY29udHJvbCBjaGlwLgorICoKKyAqIEF1dGhvcjogUGhpbCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqCisgKiBUaGUgU0FCMzAzNiBpcyBqdXN0IGFib3V0IGRpZmZlcmVudCBlbm91Z2ggZnJvbSB0aGUgY2hpcHMgdGhhdAorICogdHVuZXIuYyBjb3BlcyB3aXRoIHRvIG1ha2UgaXQgbm90IHdvcnRoIHRoZSBlZmZvcnQgdG8gY3Jvd2JhcgorICogdGhlIHN1cHBvcnQgaW50byB0aGF0IGZpbGUuICBTbyBpbnN0ZWFkIHdlIGhhdmUgYSBzZXBhcmF0ZSBkcml2ZXIuIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgorCitzdGF0aWMgaW50IGRlYnVnOwkvKiBpbnNtb2QgcGFyYW1ldGVyICovCitzdGF0aWMgaW50IHRoaXNfYWRhcDsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7STJDX0NMSUVOVF9FTkR9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsweDYwLCAweDYxLCBJMkNfQ0xJRU5UX0VORH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHJvYmVbMl0gICAgICAgID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZV9yYW5nZVsyXSAgPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGlnbm9yZVsyXSAgICAgICA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlX3JhbmdlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZVsyXSAgICAgICAgPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9OworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKKwlub3JtYWxfaTJjLCBub3JtYWxfaTJjX3JhbmdlLCAKKwlwcm9iZSwgcHJvYmVfcmFuZ2UsIAorCWlnbm9yZSwgaWdub3JlX3JhbmdlLCAKKwlmb3JjZQorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhcgordHVuZXJfZ2V0c3RhdHVzIChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ5dGU7CisJaWYgKGkyY19tYXN0ZXJfcmVjdihjLCAmYnl0ZSwgMSkgIT0gMSkKKwkJcHJpbnRrKEtFUk5fRVJSICJ0dW5lci0zMDM2OiBJL08gZXJyb3IuXG4iKTsKKwlyZXR1cm4gYnl0ZTsKK30KKworI2RlZmluZSBUVU5FUl9GTCAgICAgICAgMHg4MAorCitzdGF0aWMgaW50IAordHVuZXJfaXNsb2NrZWQgKHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworICAgICAgICByZXR1cm4gKHR1bmVyX2dldHN0YXR1cyhjKSAmIFRVTkVSX0ZMKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCAKK3NldF90dl9mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBpbnQgZnJlcSkKK3sKKwl1MTYgZGl2ID0gKChmcmVxICogMjApIC8gMTYpOworCXVuc2lnbmVkIGxvbmcgZ2l2ZV91cCA9IGppZmZpZXMgKyBIWjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyXTsKKworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgInR1bmVyOiBzZXR0aW5nIGZyZXF1ZW5jeSAlZE1IeiwgZGl2aXNvciAleFxuIiwgZnJlcSAvIDE2LCBkaXYpOworCQorCS8qIFNlbGVjdCBoaWdoIHR1bmluZyBjdXJyZW50ICovCisJYnVmZmVyWzBdID0gMHgyOTsKKwlidWZmZXJbMV0gPSAweDNlOworCisJaWYgKGkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDIpICE9IDIpCisJCXByaW50aygidHVuZXI6IGkyYyBpL28gZXJyb3IgMVxuIik7CisJCisJYnVmZmVyWzBdID0gMHg4MCB8ICgoZGl2Pj44KSAmIDB4N2YpOworCWJ1ZmZlclsxXSA9IGRpdiAmIDB4ZmY7CisKKwlpZiAoaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgMikgIT0gMikKKwkJcHJpbnRrKCJ0dW5lcjogaTJjIGkvbyBlcnJvciAyXG4iKTsKKwkKKwl3aGlsZSAoIXR1bmVyX2lzbG9ja2VkKGMpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIGdpdmVfdXApKQorCQlzY2hlZHVsZSgpOworCSAgICAgICAKKwlpZiAoIXR1bmVyX2lzbG9ja2VkKGMpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0dW5lcjogZmFpbGVkIHRvIGFjaGlldmUgUExMIGxvY2tcbiIpOworCQorCS8qIFNlbGVjdCBsb3cgdHVuaW5nIGN1cnJlbnQgYW5kIGVuZ2FnZSBBRkMgKi8KKwlidWZmZXJbMF0gPSAweDI5OworCWJ1ZmZlclsxXSA9IDB4YjI7CisKKwlpZiAoaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgMikgIT0gMikKKwkJcHJpbnRrKCJ0dW5lcjogaTJjIGkvbyBlcnJvciAzXG4iKTsKKworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgInR1bmVyOiBzdGF0dXMgJTAyeFxuIiwgdHVuZXJfZ2V0c3RhdHVzKGMpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IAordHVuZXJfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltdID0geyAweDI5LCAweDMyLCAweDJhLCAwLCAweDJiLCAwIH07CisKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCisJaWYgKHRoaXNfYWRhcCA+IDApCisJCXJldHVybiAtMTsKKwl0aGlzX2FkYXArKzsKKwkKKyAgICAgICAgY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOworICAgICAgICBjbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7CisKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoY2xpZW50ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIG1lbWNweShjbGllbnQsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCisJcHJpbnRrKCJ0dW5lcjogU0FCMzAzNiBmb3VuZCwgc3RhdHVzICUwMnhcbiIsIHR1bmVyX2dldHN0YXR1cyhjbGllbnQpKTsKKworICAgICAgICBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCisJaWYgKGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZmZlciwgMikgIT0gMikKKwkJcHJpbnRrKCJ0dW5lcjogaTJjIGkvbyBlcnJvciAxXG4iKTsKKwlpZiAoaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmZmVyKzIsIDIpICE9IDIpCisJCXByaW50aygidHVuZXI6IGkyYyBpL28gZXJyb3IgMlxuIik7CisJaWYgKGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZmZlcis0LCAyKSAhPSAyKQorCQlwcmludGsoInR1bmVyOiBpMmMgaS9vIGVycm9yIDNcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IAordHVuZXJfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IAordHVuZXJfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJaW50ICppYXJnID0gKGludCopYXJnOworCisJc3dpdGNoIChjbWQpIAorCXsKKwkJY2FzZSBUVU5FUl9TRVRfVFZGUkVROgorCQkJc2V0X3R2X2ZyZXEoY2xpZW50LCAqaWFyZyk7CisJCQlicmVhazsKKwkgICAgCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCit0dW5lcl9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJdGhpc19hZGFwID0gMDsKKwlpZiAoYWRhcC0+aWQgPT0gKEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0xQKSkKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB0dW5lcl9hdHRhY2gpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgCitpMmNfZHJpdmVyX3R1bmVyID0gCit7CisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5uYW1lCQk9CSJzYWIzMDM2IiwKKwkuaWQJCT0JSTJDX0RSSVZFUklEX1NBQjMwMzYsCisgICAgICAgIC5mbGFncwkJPQlJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9CXR1bmVyX3Byb2JlLAorCS5kZXRhY2hfY2xpZW50ICA9CXR1bmVyX2RldGFjaCwKKwkuY29tbWFuZAk9CXR1bmVyX2NvbW1hbmQKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQoreworICAgICAgICAuZHJpdmVyCQk9ICZpMmNfZHJpdmVyX3R1bmVyLAorCS5uYW1lCQk9ICJTQUIzMDM2IiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Cit0dW5lcjMwMzZfaW5pdCh2b2lkKQoreworCWkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX3R1bmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0Cit0dW5lcjMwMzZfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZpMmNfZHJpdmVyX3R1bmVyKTsKK30KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQUIzMDM2IHR1bmVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCJFbmFibGUgZGVidWdnaW5nIG91dHB1dCIpOworCittb2R1bGVfaW5pdCh0dW5lcjMwMzZfaW5pdCk7Cittb2R1bGVfZXhpdCh0dW5lcjMwMzZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNGUxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYwpAQCAtMCwwICsxLDQ0MyBAQAorLyoKKyAqICRJZDogdHVuZXItY29yZS5jLHYgMS41IDIwMDUvMDIvMTUgMTU6NTk6MzUga3JheGVsIEV4cCAkCisgKgorICogaTJjIHR2IHR1bmVyIGNoaXAgZGV2aWNlIGRyaXZlcgorICogY29yZSBjb3JlLCBpLmUuIGtlcm5lbCBpbnRlcmZhY2VzLCByZWdpc3RlcmluZyBhbmQgc28gb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9jaGlwLmg+CisKKyNkZWZpbmUgVU5TRVQgKC0xVSkKKworLyogc3RhbmRhcmQgaTJjIGluc21vZCBvcHRpb25zICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geworCTB4NGIsIC8qIHRkYTgyOTAgKi8KKwlJMkNfQ0xJRU5UX0VORAorfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjX3JhbmdlW10gPSB7CisJMHg2MCwgMHg2ZiwKKwlJMkNfQ0xJRU5UX0VORAorfTsKK0kyQ19DTElFTlRfSU5TTU9EOworCisvKiBpbnNtb2Qgb3B0aW9ucyB1c2VkIGF0IGluaXQgdGltZSA9PiByZWFkL29ubHkgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWRkciAgPSAgMDsKK21vZHVsZV9wYXJhbShhZGRyLCBpbnQsIDA0NDQpOworCisvKiBpbnNtb2Qgb3B0aW9ucyB1c2VkIGF0IHJ1bnRpbWUgPT4gcmVhZC93cml0ZSAqLwordW5zaWduZWQgaW50IHR1bmVyX2RlYnVnICAgPSAwOworbW9kdWxlX3BhcmFtKHR1bmVyX2RlYnVnLCAgICAgICBpbnQsIDA2NDQpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHR2X3JhbmdlWzJdICAgID0geyA0NCwgOTU4IH07CitzdGF0aWMgdW5zaWduZWQgaW50IHJhZGlvX3JhbmdlWzJdID0geyA2NSwgMTA4IH07CisKK21vZHVsZV9wYXJhbV9hcnJheSh0dl9yYW5nZSwgICAgaW50LCBOVUxMLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShyYWRpb19yYW5nZSwgaW50LCBOVUxMLCAwNjQ0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJkZXZpY2UgZHJpdmVyIGZvciB2YXJpb3VzIFRWIGFuZCBUVitGTSByYWRpbyB0dW5lcnMiKTsKK01PRFVMRV9BVVRIT1IoIlJhbHBoIE1ldHpsZXIsIEdlcmQgS25vcnIsIEd1bnRoZXIgTWF5ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCB0aGlzX2FkYXA7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXI7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIFNldCB0dW5lciBmcmVxdWVuY3ksICBmcmVxIGluIFVuaXRzIG9mIDYyLjVrSHogPSAxLzE2TUh6CitzdGF0aWMgdm9pZCBzZXRfdHZfZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpCit7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJaWYgKHQtPnR5cGUgPT0gVU5TRVQpIHsKKwkJdHVuZXJfaW5mbygidHVuZXIgdHlwZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoTlVMTCA9PSB0LT50dl9mcmVxKSB7CisJCXR1bmVyX2luZm8oIkh1aD8gdHZfc2V0IGlzIE5VTEw/XG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZnJlcSA8IHR2X3JhbmdlWzBdKjE2IHx8IGZyZXEgPiB0dl9yYW5nZVsxXSoxNikgeworCQkvKiBGSVhNRTogYmV0dGVyIGRvIHRoYXQgY2hpcC1zcGVjaWZpYywgYnV0CisJCSAgIHJpZ2h0IG5vdyB3ZSBkb24ndCBoYXZlIHRoYXQgaW4gdGhlIGNvbmZpZworCQkgICBzdHJ1Y3QgYW5kIHRoaXMgd2F5IGlzIHN0aWxsIGJldHRlciB0aGFuIG5vCisJCSAgIGNoZWNrIGF0IGFsbCAqLworCQl0dW5lcl9pbmZvKCJUViBmcmVxICglZC4lMDJkKSBvdXQgb2YgcmFuZ2UgKCVkLSVkKVxuIiwKKwkJCSAgIGZyZXEvMTYsZnJlcSUxNioxMDAvMTYsdHZfcmFuZ2VbMF0sdHZfcmFuZ2VbMV0pOworCQlyZXR1cm47CisJfQorCXQtPnR2X2ZyZXEoYyxmcmVxKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3JhZGlvX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKworCWlmICh0LT50eXBlID09IFVOU0VUKSB7CisJCXR1bmVyX2luZm8oInR1bmVyIHR5cGUgbm90IHNldFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKE5VTEwgPT0gdC0+cmFkaW9fZnJlcSkgeworCQl0dW5lcl9pbmZvKCJubyByYWRpbyB0dW5pbmcgZm9yIHRoaXMgb25lLCBzb3JyeS5cbiIpOworCQlyZXR1cm47CisJfQorCWlmIChmcmVxIDwgcmFkaW9fcmFuZ2VbMF0qMTYgfHwgZnJlcSA+IHJhZGlvX3JhbmdlWzFdKjE2KSB7CisJCXR1bmVyX2luZm8oInJhZGlvIGZyZXEgKCVkLiUwMmQpIG91dCBvZiByYW5nZSAoJWQtJWQpXG4iLAorCQkJICAgZnJlcS8xNixmcmVxJTE2KjEwMC8xNiwKKwkJCSAgIHJhZGlvX3JhbmdlWzBdLHJhZGlvX3JhbmdlWzFdKTsKKwkJcmV0dXJuOworCX0KKwl0LT5yYWRpb19mcmVxKGMsZnJlcSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBsb25nIGZyZXEpCit7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJc3dpdGNoICh0LT5tb2RlKSB7CisJY2FzZSBWNEwyX1RVTkVSX1JBRElPOgorCQl0dW5lcl9kYmcoInJhZGlvIGZyZXEgc2V0IHRvICVsdS4lMDJsdVxuIiwKKwkJCSAgZnJlcS8xNixmcmVxJTE2KjEwMC8xNik7CisJCXNldF9yYWRpb19mcmVxKGMsZnJlcSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9BTkFMT0dfVFY6CisJY2FzZSBWNEwyX1RVTkVSX0RJR0lUQUxfVFY6CisJCXR1bmVyX2RiZygidHYgZnJlcSBzZXQgdG8gJWx1LiUwMmx1XG4iLAorCQkJICBmcmVxLzE2LGZyZXElMTYqMTAwLzE2KTsKKwkJc2V0X3R2X2ZyZXEoYywgZnJlcSk7CisJCWJyZWFrOworCX0KKwl0LT5mcmVxID0gZnJlcTsKK30KKworc3RhdGljIHZvaWQgc2V0X3R5cGUoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKworCS8qIHNhbml0eSBjaGVjayAqLworCWlmICh0eXBlID09IFVOU0VUICB8fCAgdHlwZSA9PSBUVU5FUl9BQlNFTlQpCisJCXJldHVybjsKKwlpZiAodHlwZSA+PSB0dW5lcl9jb3VudCkKKwkJcmV0dXJuOworCisJaWYgKE5VTEwgPT0gdC0+aTJjLmRldi5kcml2ZXIpIHsKKwkJLyogbm90IHJlZ2lzdGVyZWQgeWV0ICovCisJCXQtPnR5cGUgPSB0eXBlOworCQlyZXR1cm47CisJfQorCWlmICh0LT5pbml0aWFsaXplZCkKKwkJLyogcnVuIG9ubHkgb25jZSAqLworCQlyZXR1cm47CisKKwl0LT5pbml0aWFsaXplZCA9IDE7CisJdC0+dHlwZSA9IHR5cGU7CisJc3dpdGNoICh0LT50eXBlKSB7CisJY2FzZSBUVU5FUl9NVDIwMzI6CisJCW1pY3JvdHVuZV9pbml0KGMpOworCQlicmVhazsKKwljYXNlIFRVTkVSX1BISUxJUFNfVERBODI5MDoKKwkJdGRhODI5MF9pbml0KGMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZWZhdWx0X3R1bmVyX2luaXQoYyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGNoYXIgcGFsW10gPSAiLSI7Cittb2R1bGVfcGFyYW1fc3RyaW5nKHBhbCwgcGFsLCAwNjQ0LCBzaXplb2YocGFsKSk7CisKK3N0YXRpYyBpbnQgdHVuZXJfZml4dXBfc3RkKHN0cnVjdCB0dW5lciAqdCkKK3sKKwlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX1BBTCkgPT0gVjRMMl9TVERfUEFMKSB7CisJCS8qIGdldCBtb3JlIHByZWNpc2Ugbm9ybSBpbmZvIGZyb20gaW5zbW9kIG9wdGlvbiAqLworCQlzd2l0Y2ggKHBhbFswXSkgeworCQljYXNlICdiJzoKKwkJY2FzZSAnQic6CisJCWNhc2UgJ2cnOgorCQljYXNlICdHJzoKKwkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLUJHXG4iKTsKKwkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9CRzsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJY2FzZSAnSSc6CisJCQl0dW5lcl9kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1JXG4iKTsKKwkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9JOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQljYXNlICdEJzoKKwkJY2FzZSAnayc6CisJCWNhc2UgJ0snOgorCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtREtcbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX0RLOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB0dW5lcl9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IHR1bmVyICp0OworCisJaWYgKHRoaXNfYWRhcCA+IDApCisJCXJldHVybiAtMTsKKwl0aGlzX2FkYXArKzsKKworICAgICAgICBjbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7CisgICAgICAgIGNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKKworICAgICAgICB0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHR1bmVyKSxHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgbWVtc2V0KHQsMCxzaXplb2Yoc3RydWN0IHR1bmVyKSk7CisgICAgICAgIG1lbWNweSgmdC0+aTJjLCZjbGllbnRfdGVtcGxhdGUsc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJaTJjX3NldF9jbGllbnRkYXRhKCZ0LT5pMmMsIHQpOworCXQtPnR5cGUgICAgICAgPSBVTlNFVDsKKwl0LT5yYWRpb19pZjIgID0gMTA3MDAqMTAwMDsgLy8gMTAuN01IeiAtIEZNIHJhZGlvCisKKyAgICAgICAgaTJjX2F0dGFjaF9jbGllbnQoJnQtPmkyYyk7CisJdHVuZXJfaW5mbygiY2hpcCBmb3VuZCBAIDB4JXggKCVzKVxuIiwKKwkJICAgYWRkciA8PCAxLCBhZGFwLT5uYW1lKTsKKwlzZXRfdHlwZSgmdC0+aTJjLCB0LT50eXBlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5lcl9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJaWYgKDAgIT0gYWRkcikgeworCQlub3JtYWxfaTJjWzBdICAgICAgID0gYWRkcjsKKwkJbm9ybWFsX2kyY19yYW5nZVswXSA9IGFkZHI7CisJCW5vcm1hbF9pMmNfcmFuZ2VbMV0gPSBhZGRyOworCX0KKwl0aGlzX2FkYXAgPSAwOworCisJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB0dW5lcl9hdHRhY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bmVyX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaTJjX2RldGFjaF9jbGllbnQoJnQtPmkyYyk7CisJa2ZyZWUodCk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU1dJVENIX1Y0TDIJaWYgKCF0LT51c2luZ192NGwyICYmIHR1bmVyX2RlYnVnKSBcCisJCSAgICAgICAgICB0dW5lcl9pbmZvKCJzd2l0Y2hpbmcgdG8gdjRsMlxuIik7IFwKKwkgICAgICAgICAgICAgICAgICB0LT51c2luZ192NGwyID0gMTsKKyNkZWZpbmUgQ0hFQ0tfVjRMMglpZiAodC0+dXNpbmdfdjRsMikgeyBpZiAodHVuZXJfZGVidWcpIFwKKwkJCSAgdHVuZXJfaW5mbygiaWdub3JlIHY0bDEgY2FsbFxuIik7IFwKKwkJICAgICAgICAgIHJldHVybiAwOyB9CisKK3N0YXRpYyBpbnQKK3R1bmVyX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworICAgICAgICB1bnNpZ25lZCBpbnQgKmlhcmcgPSAoaW50Kilhcmc7CisKKyAgICAgICAgc3dpdGNoIChjbWQpIHsKKworCS8qIC0tLSBjb25maWd1cmF0aW9uIC0tLSAqLworCWNhc2UgVFVORVJfU0VUX1RZUEU6CisJCXNldF90eXBlKGNsaWVudCwqaWFyZyk7CisJCWJyZWFrOworCWNhc2UgQVVEQ19TRVRfUkFESU86CisJCWlmIChWNEwyX1RVTkVSX1JBRElPICE9IHQtPm1vZGUpIHsKKwkJCXNldF90dl9mcmVxKGNsaWVudCw0MDAgKiAxNik7CisJCQl0LT5tb2RlID0gVjRMMl9UVU5FUl9SQURJTzsKKwkJfQorCQlicmVhazsKKwljYXNlIEFVRENfQ09ORklHX1BJTk5BQ0xFOgorCQlzd2l0Y2ggKCppYXJnKSB7CisJCWNhc2UgMjoKKwkJCXR1bmVyX2RiZygicGlubmFjbGUgcGFsXG4iKTsKKwkJCXQtPnJhZGlvX2lmMiA9IDMzMzAwICogMTAwMDsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQl0dW5lcl9kYmcoInBpbm5hY2xlIG50c2NcbiIpOworCQkJdC0+cmFkaW9faWYyID0gNDEzMDAgKiAxMDAwOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworCS8qIC0tLSB2NGwgaW9jdGxzIC0tLSAqLworCS8qIHRha2UgY2FyZTogYnR0diBkb2VzIHVzZXJzcGFjZSBjb3B5aW5nLCB3ZSdsbCBnZXQgYQorCSAgIGtlcm5lbCBwb2ludGVyIGhlcmUuLi4gKi8KKwljYXNlIFZJRElPQ1NDSEFOOgorCXsKKwkJc3RhdGljIGNvbnN0IHY0bDJfc3RkX2lkIG1hcFtdID0geworCQkJWyBWSURFT19NT0RFX1BBTCAgIF0gPSBWNEwyX1NURF9QQUwsCisJCQlbIFZJREVPX01PREVfTlRTQyAgXSA9IFY0TDJfU1REX05UU0NfTSwKKwkJCVsgVklERU9fTU9ERV9TRUNBTSBdID0gVjRMMl9TVERfU0VDQU0sCisJCQlbIDQgLyogYnR0diAqLyAgICAgXSA9IFY0TDJfU1REX1BBTF9NLAorCQkJWyA1IC8qIGJ0dHYgKi8gICAgIF0gPSBWNEwyX1NURF9QQUxfTiwKKwkJCVsgNiAvKiBidHR2ICovICAgICBdID0gVjRMMl9TVERfTlRTQ19NX0pQLAorCQl9OworCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdmMgPSBhcmc7CisKKwkJQ0hFQ0tfVjRMMjsKKwkJdC0+bW9kZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCQlpZiAodmMtPm5vcm0gPCBBUlJBWV9TSVpFKG1hcCkpCisJCQl0LT5zdGQgPSBtYXBbdmMtPm5vcm1dOworCQl0dW5lcl9maXh1cF9zdGQodCk7CisJCWlmICh0LT5mcmVxKQorCQkJc2V0X3R2X2ZyZXEoY2xpZW50LHQtPmZyZXEpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTRlJFUToKKwl7CisJCXVuc2lnbmVkIGxvbmcgKnYgPSBhcmc7CisKKwkJQ0hFQ0tfVjRMMjsKKwkJc2V0X2ZyZXEoY2xpZW50LCp2KTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DR1RVTkVSOgorCXsKKwkJc3RydWN0IHZpZGVvX3R1bmVyICp2dCA9IGFyZzsKKworCQlDSEVDS19WNEwyOworCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlICAmJiAgdC0+aGFzX3NpZ25hbCkKKwkJCXZ0LT5zaWduYWwgPSB0LT5oYXNfc2lnbmFsKGNsaWVudCk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ0dBVURJTzoKKwl7CisJCXN0cnVjdCB2aWRlb19hdWRpbyAqdmEgPSBhcmc7CisKKwkJQ0hFQ0tfVjRMMjsKKwkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gdC0+bW9kZSAgJiYgIHQtPmlzX3N0ZXJlbykKKwkJCXZhLT5tb2RlID0gdC0+aXNfc3RlcmVvKGNsaWVudCkKKwkJCQk/IFZJREVPX1NPVU5EX1NURVJFTworCQkJCTogVklERU9fU09VTkRfTU9OTzsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfU19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisKKwkJU1dJVENIX1Y0TDI7CisJCXQtPm1vZGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKKwkJdC0+c3RkID0gKmlkOworCQl0dW5lcl9maXh1cF9zdGQodCk7CisJCWlmICh0LT5mcmVxKQorCQkJc2V0X2ZyZXEoY2xpZW50LHQtPmZyZXEpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CisJeworCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CisKKwkJU1dJVENIX1Y0TDI7CisJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IGYtPnR5cGUgJiYKKwkJICAgIFY0TDJfVFVORVJfUkFESU8gIT0gdC0+bW9kZSkKKwkJCXNldF90dl9mcmVxKGNsaWVudCw0MDAqMTYpOworCQl0LT5tb2RlICA9IGYtPnR5cGU7CisJCXQtPmZyZXEgID0gZi0+ZnJlcXVlbmN5OworCQlzZXRfZnJlcShjbGllbnQsdC0+ZnJlcSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX1RVTkVSOgorCXsKKwkJc3RydWN0IHY0bDJfdHVuZXIgKnR1bmVyID0gYXJnOworCisJCVNXSVRDSF9WNEwyOworCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlICAmJiAgdC0+aGFzX3NpZ25hbCkKKwkJCXR1bmVyLT5zaWduYWwgPSB0LT5oYXNfc2lnbmFsKGNsaWVudCk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQkvKiBub3RoaW5nICovCisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bmVyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisKKwl0dW5lcl9kYmcoInN1c3BlbmRcbiIpOworCS8qIEZJWE1FOiBwb3dlciBkb3duID8/PyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bmVyX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisKKwl0dW5lcl9kYmcoInJlc3VtZVxuIik7CisJaWYgKHQtPmZyZXEpCisJCXNldF9mcmVxKGMsdC0+ZnJlcSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7CisJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJ0dW5lciIsCisgICAgICAgIC5pZCAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9UVU5FUiwKKyAgICAgICAgLmZsYWdzICAgICAgICAgID0gSTJDX0RGX05PVElGWSwKKyAgICAgICAgLmF0dGFjaF9hZGFwdGVyID0gdHVuZXJfcHJvYmUsCisgICAgICAgIC5kZXRhY2hfY2xpZW50ICA9IHR1bmVyX2RldGFjaCwKKyAgICAgICAgLmNvbW1hbmQgICAgICAgID0gdHVuZXJfY29tbWFuZCwKKwkuZHJpdmVyID0geworCQkuc3VzcGVuZCA9IHR1bmVyX3N1c3BlbmQsCisJCS5yZXN1bWUgID0gdHVuZXJfcmVzdW1lLAorCX0sCit9Oworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9Cit7CisJSTJDX0RFVk5BTUUoIih0dW5lciB1bnNldCkiKSwKKwkuZmxhZ3MgICAgICA9IEkyQ19DTElFTlRfQUxMT1dfVVNFLAorICAgICAgICAuZHJpdmVyICAgICA9ICZkcml2ZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0dW5lcl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHR1bmVyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHR1bmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHR1bmVyX2NsZWFudXBfbW9kdWxlKTsKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGM2Y2VmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYwpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqICRJZDogdHVuZXItc2ltcGxlLmMsdiAxLjEwIDIwMDUvMDMvMDggMDg6Mzg6MDAga3JheGVsIEV4cCAkCisgKgorICogaTJjIHR2IHR1bmVyIGNoaXAgZGV2aWNlIGRyaXZlcgorICogY29udHJvbHMgYWxsIHRob3NlIHNpbXBsZSA0LWNvbnRyb2wtYnl0ZXMgc3R5bGUgdHVuZXJzLgorICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogdHYgc3RhbmRhcmQgc2VsZWN0aW9uIGZvciBUZW1pYyA0MDQ2IEZNNQorICAgdGhpcyB2YWx1ZSB0YWtlcyB0aGUgbG93IGJpdHMgb2YgY29udHJvbCBieXRlIDIKKyAgIGZyb20gZGF0YXNoZWV0IFJldi4wMSwgRmViLjAwCisgICAgIHN0YW5kYXJkICAgICBCRyAgICAgIEkgICAgICAgTCAgICAgICBMMiAgICAgIEQKKyAgICAgcGljdHVyZSBJRiAgIDM4LjkgICAgMzguOSAgICAzOC45ICAgIDMzLjk1ICAgMzguOQorICAgICBzb3VuZCAxICAgICAgMzMuNCAgICAzMi45ICAgIDMyLjQgICAgNDAuNDUgICAzMi40CisgICAgIHNvdW5kIDIgICAgICAzMy4xNgorICAgICBOSUNBTSAgICAgICAgMzMuMDUgICAzMi4zNDggIDMzLjA1ICAgICAgICAgICAzMy4wNQorICovCisjZGVmaW5lIFRFTUlDX1NFVF9QQUxfSSAgICAgICAgIDB4MDUKKyNkZWZpbmUgVEVNSUNfU0VUX1BBTF9ESyAgICAgICAgMHgwOQorI2RlZmluZSBURU1JQ19TRVRfUEFMX0wgICAgICAgICAweDBhIC8vIFNFQ0FNID8KKyNkZWZpbmUgVEVNSUNfU0VUX1BBTF9MMiAgICAgICAgMHgwYiAvLyBjaGFuZ2UgSUYgIQorI2RlZmluZSBURU1JQ19TRVRfUEFMX0JHICAgICAgICAweDBjCisKKy8qIHR2IHR1bmVyIHN5c3RlbSBzdGFuZGFyZCBzZWxlY3Rpb24gZm9yIFBoaWxpcHMgRlExMjE2TUUKKyAgIHRoaXMgdmFsdWUgdGFrZXMgdGhlIGxvdyBiaXRzIG9mIGNvbnRyb2wgYnl0ZSAyCisgICBmcm9tIGRhdGFzaGVldCAiMTk5OSBOb3YgMTYiIChzdXBlcnNlZGVzICIxOTk5IE1hciAyMyIpCisgICAgIHN0YW5kYXJkIAkJQkcJREsJSQlMCUxgCisgICAgIHBpY3R1cmUgY2FycmllcgkzOC45MAkzOC45MAkzOC45MAkzOC45MAkzMy45NQorICAgICBjb2xvdXIJCTM0LjQ3CTM0LjQ3CTM0LjQ3CTM0LjQ3CTM4LjM4CisgICAgIHNvdW5kIDEJCTMzLjQwCTMyLjQwCTMyLjkwCTMyLjQwCTQwLjQ1CisgICAgIHNvdW5kIDIJCTMzLjE2CS0JLQktCS0KKyAgICAgTklDQU0JCTMzLjA1CTMzLjA1CTMyLjM1CTMzLjA1CTM5LjgwCisgKi8KKyNkZWZpbmUgUEhJTElQU19TRVRfUEFMX0kJMHgwMSAvKiBCaXQgMiBhbHdheXMgemVybyAhKi8KKyNkZWZpbmUgUEhJTElQU19TRVRfUEFMX0JHREsJMHgwOQorI2RlZmluZSBQSElMSVBTX1NFVF9QQUxfTDIJMHgwYQorI2RlZmluZSBQSElMSVBTX1NFVF9QQUxfTAkweDBiCisKKy8qIHN5c3RlbSBzd2l0Y2hpbmcgZm9yIFBoaWxpcHMgRkkxMjE2TUYgTUsyCisgICBmcm9tIGRhdGFzaGVldCAiMTk5NiBKdWwgMDkiLAorICAgIHN0YW5kYXJkICAgICAgICAgQkcgICAgIEwgICAgICBMJworICAgIHBpY3R1cmUgY2FycmllciAgMzguOTAgIDM4LjkwICAzMy45NQorICAgIGNvbG91cgkgICAgIDM0LjQ3ICAzNC4zNyAgMzguMzgKKyAgICBzb3VuZCAxICAgICAgICAgIDMzLjQwICAzMi40MCAgNDAuNDUKKyAgICBzb3VuZCAyICAgICAgICAgIDMzLjE2ICAtICAgICAgLQorICAgIE5JQ0FNICAgICAgICAgICAgMzMuMDUgIDMzLjA1ICAzOS44MAorICovCisjZGVmaW5lIFBISUxJUFNfTUZfU0VUX0JHCTB4MDEgLyogQml0IDIgbXVzdCBiZSB6ZXJvLCBCaXQgMyBpcyBzeXN0ZW0gb3V0cHV0ICovCisjZGVmaW5lIFBISUxJUFNfTUZfU0VUX1BBTF9MCTB4MDMgLy8gRnJhbmNlCisjZGVmaW5lIFBISUxJUFNfTUZfU0VUX1BBTF9MMgkweDAyIC8vIEwnCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgdHVuZXJ0eXBlCit7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBjaGFyIFZlbmRvcjsKKwl1bnNpZ25lZCBjaGFyIFR5cGU7CisKKwl1bnNpZ25lZCBzaG9ydCB0aHJlc2gxOyAgLyogIGJhbmQgc3dpdGNoIFZIRl9MTyA8PT4gVkhGX0hJICAqLworCXVuc2lnbmVkIHNob3J0IHRocmVzaDI7ICAvKiAgYmFuZCBzd2l0Y2ggVkhGX0hJIDw9PiBVSEYgICAgICovCisJdW5zaWduZWQgY2hhciBWSEZfTDsKKwl1bnNpZ25lZCBjaGFyIFZIRl9IOworCXVuc2lnbmVkIGNoYXIgVUhGOworCXVuc2lnbmVkIGNoYXIgY29uZmlnOworCXVuc2lnbmVkIHNob3J0IElGUENvZmY7IC8qIDYyMi40PTE2KjM4LjkwIE1IeiBQQUwsCisJCQkJICAgNzMyICA9MTYqNDUuNzUgTlRTQ2ksCisJCQkJICAgOTQwICA9MTYqNTguNzUgTlRTQy1KYXBhbgorCQkJCSAgIDcwNCAgPTE2KjQ0ICAgIEFUU0MgKi8KK307CisKKy8qCisgKglUaGUgZmxvYXRzIGluIHRoZSB0dW5lciBzdHJ1Y3QgYXJlIGNvbXB1dGVkIGF0IGNvbXBpbGUgdGltZQorICoJYnkgZ2NjIGFuZCBjYXN0IGJhY2sgdG8gaW50ZWdlcnMuIFRodXMgd2UgZG9uJ3QgdmlvbGF0ZSB0aGUKKyAqCSJubyBmbG9hdCBpbiBrZXJuZWwiIHJ1bGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdHVuZXJ0eXBlIHR1bmVyc1tdID0geworICAgICAgICB7ICJUZW1pYyBQQUwgKDQwMDIgRkg1KSIsIFRFTUlDLCBQQUwsCisJICAxNioxNDAuMjUsMTYqNDYzLjI1LDB4MDIsMHgwNCwweDAxLDB4OGUsNjIzfSwKKwl7ICJQaGlsaXBzIFBBTF9JIChGSTEyNDYgYW5kIGNvbXBhdGlibGVzKSIsIFBoaWxpcHMsIFBBTF9JLAorCSAgMTYqMTQwLjI1LDE2KjQ2My4yNSwweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCisJeyAiUGhpbGlwcyBOVFNDIChGSTEyMzYsRk0xMjM2IGFuZCBjb21wYXRpYmxlcykiLCBQaGlsaXBzLCBOVFNDLAorCSAgMTYqMTU3LjI1LDE2KjQ1MS4yNSwweEEwLDB4OTAsMHgzMCwweDhlLDczMn0sCisJeyAiUGhpbGlwcyAoU0VDQU0rUEFMX0JHKSAoRkkxMjE2TUYsIEZNMTIxNk1GLCBGUjEyMTZNRikiLCBQaGlsaXBzLCBTRUNBTSwKKwkgIDE2KjE2OC4yNSwxNio0NDcuMjUsMHhBNywweDk3LDB4MzcsMHg4ZSw2MjN9LAorCisJeyAiTm9UdW5lciIsIE5vVHVuZXIsIE5PVFVORVIsCisJICAwLDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwKKwl7ICJQaGlsaXBzIFBBTF9CRyAoRkkxMjE2IGFuZCBjb21wYXRpYmxlcykiLCBQaGlsaXBzLCBQQUwsCisJICAxNioxNjguMjUsMTYqNDQ3LjI1LDB4QTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKKwl7ICJUZW1pYyBOVFNDICg0MDMyIEZZNSkiLCBURU1JQywgTlRTQywKKwkgIDE2KjE1Ny4yNSwxNio0NjMuMjUsMHgwMiwweDA0LDB4MDEsMHg4ZSw3MzJ9LAorCXsgIlRlbWljIFBBTF9JICg0MDYyIEZZNSkiLCBURU1JQywgUEFMX0ksCisJICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4MDIsMHgwNCwweDAxLDB4OGUsNjIzfSwKKworIAl7ICJUZW1pYyBOVFNDICg0MDM2IEZZNSkiLCBURU1JQywgTlRTQywKKwkgIDE2KjE1Ny4yNSwxNio0NjMuMjUsMHhhMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAorICAgICAgICB7ICJBbHBzIEhTQkgxIiwgVEVNSUMsIE5UU0MsCisJICAxNioxMzcuMjUsMTYqMzg1LjI1LDB4MDEsMHgwMiwweDA4LDB4OGUsNzMyfSwKKyAgICAgICAgeyAiQWxwcyBUU0JFMSIsVEVNSUMsUEFMLAorCSAgMTYqMTM3LjI1LDE2KjM4NS4yNSwweDAxLDB4MDIsMHgwOCwweDhlLDczMn0sCisgICAgICAgIHsgIkFscHMgVFNCQjUiLCBBbHBzLCBQQUxfSSwgLyogdGVzdGVkIChVSyBVSEYpIHdpdGggTW9kdWxhcnRlY2ggTU0yMDUgKi8KKwkgIDE2KjEzMy4yNSwxNiozNTEuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw2MzJ9LAorCisgICAgICAgIHsgIkFscHMgVFNCRTUiLCBBbHBzLCBQQUwsIC8qIHVudGVzdGVkIC0gZGF0YSBzaGVldCBndWVzcy4gT25seSBJRiBkaWZmZXJzLiAqLworCSAgMTYqMTMzLjI1LDE2KjM1MS4yNSwweDAxLDB4MDIsMHgwOCwweDhlLDYyMn0sCisgICAgICAgIHsgIkFscHMgVFNCQzUiLCBBbHBzLCBQQUwsIC8qIHVudGVzdGVkIC0gZGF0YSBzaGVldCBndWVzcy4gT25seSBJRiBkaWZmZXJzLiAqLworCSAgMTYqMTMzLjI1LDE2KjM1MS4yNSwweDAxLDB4MDIsMHgwOCwweDhlLDYwOH0sCisJeyAiVGVtaWMgUEFMX0JHICg0MDA2Rkg1KSIsIFRFTUlDLCBQQUwsCisJICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKKyAgCXsgIkFscHMgVFNDSDYiLEFscHMsTlRTQywKKyAgCSAgMTYqMTM3LjI1LDE2KjM4NS4yNSwweDE0LDB4MTIsMHgxMSwweDhlLDczMn0sCisKKyAgCXsgIlRlbWljIFBBTF9ESyAoNDAxNiBGWTUpIixURU1JQyxQQUwsCisgIAkgIDE2KjE2OC4yNSwxNio0NTYuMjUsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAorICAJeyAiUGhpbGlwcyBOVFNDX00gKE1LMikiLFBoaWxpcHMsTlRTQywKKyAgCSAgMTYqMTYwLjAwLDE2KjQ1NC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDczMn0sCisgICAgICAgIHsgIlRlbWljIFBBTF9JICg0MDY2IEZZNSkiLCBURU1JQywgUEFMX0ksCisgICAgICAgICAgMTYqMTY5LjAwLCAxNio0NTQuMDAsIDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKKyAgICAgICAgeyAiVGVtaWMgUEFMKiBhdXRvICg0MDA2IEZONSkiLCBURU1JQywgUEFMLAorICAgICAgICAgIDE2KjE2OS4wMCwgMTYqNDU0LjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCisKKyAgICAgICAgeyAiVGVtaWMgUEFMX0JHICg0MDA5IEZSNSkgb3IgUEFMX0kgKDQwNjkgRlI1KSIsIFRFTUlDLCBQQUwsCisgICAgICAgICAgMTYqMTQxLjAwLCAxNio0NjQuMDAsIDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKKyAgICAgICAgeyAiVGVtaWMgTlRTQyAoNDAzOSBGUjUpIiwgVEVNSUMsIE5UU0MsCisgICAgICAgICAgMTYqMTU4LjAwLCAxNio0NTMuMDAsIDB4YTAsMHg5MCwweDMwLDB4OGUsNzMyfSwKKyAgICAgICAgeyAiVGVtaWMgUEFML1NFQ0FNIG11bHRpICg0MDQ2IEZNNSkiLCBURU1JQywgUEFMLAorICAgICAgICAgIDE2KjE2OS4wMCwgMTYqNDU0LjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCisgICAgICAgIHsgIlBoaWxpcHMgUEFMX0RLIChGSTEyNTYgYW5kIGNvbXBhdGlibGVzKSIsIFBoaWxpcHMsIFBBTCwKKwkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAorCisJeyAiUGhpbGlwcyBQQUwvU0VDQU0gbXVsdGkgKEZRMTIxNk1FKSIsIFBoaWxpcHMsIFBBTCwKKwkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAorCXsgIkxHIFBBTF9JK0ZNIChUQVBDLUkwMDFEKSIsIExHSU5OT1RFSywgUEFMX0ksCisJICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKKwl7ICJMRyBQQUxfSSAoVEFQQy1JNzAxRCkiLCBMR0lOTk9URUssIFBBTF9JLAorCSAgMTYqMTcwLjAwLDE2KjQ1MC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCisJeyAiTEcgTlRTQytGTSAoVFBJOE5TUjAxRikiLCBMR0lOTk9URUssIE5UU0MsCisJICAxNioyMTAuMDAsMTYqNDk3LjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNzMyfSwKKworCXsgIkxHIFBBTF9CRytGTSAoVFBJOFBTQjAxRCkiLCBMR0lOTk9URUssIFBBTCwKKwkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAorCXsgIkxHIFBBTF9CRyAoVFBJOFBTQjExRCkiLCBMR0lOTk9URUssIFBBTCwKKwkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAorCXsgIlRlbWljIFBBTCogYXV0byArIEZNICg0MDA5IEZONSkiLCBURU1JQywgUEFMLAorCSAgMTYqMTQxLjAwLCAxNio0NjQuMDAsIDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKKwl7ICJTSEFSUCBOVFNDX0pQICgyVTVKRjU1NDApIiwgU0hBUlAsIE5UU0MsIC8qIDk0MD0xNio1OC43NSBOVFNDQEphcGFuICovCisJICAxNioxMzcuMjUsMTYqMzE3LjI1LDB4MDEsMHgwMiwweDA4LDB4OGUsOTQwIH0sCisKKwl7ICJTYW1zdW5nIFBBTCBUQ1BNOTA5MVBEMjciLCBTYW1zdW5nLCBQQUwsICAvKiBmcm9tIHNvdXJjZWZvcmdlIHYzdHYgKi8KKyAgICAgICAgICAxNioxNjksMTYqNDY0LDB4QTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKKwl7ICJNVDIweHggdW5pdmVyc2FsIiwgTWljcm90dW5lLFBBTHxOVFNDLAorCSAgLyogc2VlIG10MjB4eC5jIGZvciBkZXRhaWxzICovIH0sCisJeyAiVGVtaWMgUEFMX0JHICg0MTA2IEZINSkiLCBURU1JQywgUEFMLAorICAgICAgICAgIDE2KjE0MS4wMCwgMTYqNDY0LjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCisJeyAiVGVtaWMgUEFMX0RLL1NFQ0FNX0wgKDQwMTIgRlk1KSIsIFRFTUlDLCBQQUwsCisgICAgICAgICAgMTYqMTQwLjI1LCAxNio0NjMuMjUsIDB4MDIsMHgwNCwweDAxLDB4OGUsNjIzfSwKKworCXsgIlRlbWljIE5UU0MgKDQxMzYgRlk1KSIsIFRFTUlDLCBOVFNDLAorICAgICAgICAgIDE2KjE1OC4wMCwgMTYqNDUzLjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDczMn0sCisgICAgICAgIHsgIkxHIFBBTCAobmV3ZXIgVEFQQyBzZXJpZXMpIiwgTEdJTk5PVEVLLCBQQUwsCisgICAgICAgICAgMTYqMTcwLjAwLCAxNio0NTAuMDAsIDB4MDEsMHgwMiwweDA4LDB4OGUsNjIzfSwKKwl7ICJQaGlsaXBzIFBBTC9TRUNBTSBtdWx0aSAoRk0xMjE2TUUgTUszKSIsIFBoaWxpcHMsIFBBTCwKKwkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw2MjMgfSwKKwl7ICJMRyBOVFNDIChuZXdlciBUQVBDIHNlcmllcykiLCBMR0lOTk9URUssIE5UU0MsCisgICAgICAgICAgMTYqMTcwLjAwLCAxNio0NTAuMDAsIDB4MDEsMHgwMiwweDA4LDB4OGUsNzMyfSwKKworCXsgIkhJVEFDSEkgVjctSjE4MEFUIiwgSElUQUNISSwgTlRTQywKKwkgIDE2KjE3MC4wMCwgMTYqNDUwLjAwLCAweDAxLDB4MDIsMHgwOCwweDhlLDk0MCB9LAorCXsgIlBoaWxpcHMgUEFMX01LIChGSTEyMTYgTUspIiwgUGhpbGlwcywgUEFMLAorCSAgMTYqMTQwLjI1LDE2KjQ2My4yNSwweDAxLDB4YzIsMHhjZiwweDhlLDYyM30sCisJeyAiUGhpbGlwcyAxMjM2RCBBVFNDL05UU0MgZGF1bCBpbiIsUGhpbGlwcyxBVFNDLAorCSAgMTYqMTU3LjI1LDE2KjQ1NC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDczMn0sCisgICAgICAgIHsgIlBoaWxpcHMgTlRTQyBNSzMgKEZNMTIzNk1LMyBvciBGTTEyMzYvRikiLCBQaGlsaXBzLCBOVFNDLAorICAgICAgICAgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzJ9LAorCisgICAgICAgIHsgIlBoaWxpcHMgNCBpbiAxIChBVEkgVFYgV29uZGVyIFByby9Db25leGFudCkiLCBQaGlsaXBzLCBOVFNDLAorICAgICAgICAgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzJ9LAorCXsgIk1pY3JvdHVuZSA0MDQ5IEZNNSIsTWljcm90dW5lLFBBTCwKKwkgIDE2KjE0MS4wMCwxNio0NjQuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAorCXsgIlBhbmFzb25pYyBWUDI3cy9FTkdFNDMyNEQiLCBQYW5hc29uaWMsIE5UU0MsCisJICAxNioxNjAuMDAsMTYqNDU0LjAwLDB4MDEsMHgwMiwweDA4LDB4Y2UsOTQwfSwKKyAgICAgICAgeyAiTEcgTlRTQyAoVEFQRSBzZXJpZXMpIiwgTEdJTk5PVEVLLCBOVFNDLAorICAgICAgICAgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzIgfSwKKworICAgICAgICB7ICJUZW5uYSBUTkYgODgzMSBCR0ZGKSIsIFBoaWxpcHMsIFBBTCwKKyAgICAgICAgICAxNioxNjEuMjUsMTYqNDYzLjI1LDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKKwl7ICJNaWNyb3R1bmUgNDA0MiBGSTUgQVRTQy9OVFNDIGR1YWwgaW4iLCBNaWNyb3R1bmUsIE5UU0MsCisJICAxNioxNjIuMDAsMTYqNDU3LjAwLDB4YTIsMHg5NCwweDMxLDB4OGUsNzMyfSwKKyAgICAgICAgeyAiVENMIDIwMDJOIiwgVENMLCBOVFNDLAorICAgICAgICAgIDE2KjE3Mi4wMCwxNio0NDguMDAsMHgwMSwweDAyLDB4MDgsMHg4ZSw3MzJ9LAorCXsgIlBoaWxpcHMgUEFML1NFQ0FNX0QgKEZNIDEyNTYgSS1IMykiLCBQaGlsaXBzLCBQQUwsCisJICAxNioxNjAuMDAsMTYqNDQyLjAwLDB4MDEsMHgwMiwweDA0LDB4OGUsNjIzIH0sCisKKwl7ICJUaG9tc29uIEREVCA3NjEwIChBVFNDL05UU0MpIiwgVEhPTVNPTiwgQVRTQywKKwkgIDE2KjE1Ny4yNSwxNio0NTQuMDAsMHgzOSwweDNhLDB4M2MsMHg4ZSw3MzJ9LAorCXsgIlBoaWxpcHMgRlExMjg2IiwgUGhpbGlwcywgTlRTQywKKwkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHg0MSwweDQyLDB4MDQsMHg4ZSw5NDB9LCAvLyBVSEYgYmFuZCB1bnRlc3RlZAorCXsgInRkYTgyOTArNzUiLCBQaGlsaXBzLFBBTHxOVFNDLAorCSAgLyogc2VlIHRkYTgyOTAuYyBmb3IgZGV0YWlscyAqLyB9LAorCXsgIkxHIFBBTCAoVEFQRSBzZXJpZXMpIiwgTEdJTk5PVEVLLCBQQUwsCisgICAgICAgICAgMTYqMTcwLjAwLCAxNio0NTAuMDAsIDB4MDEsMHgwMiwweDA4LDB4Y2UsNjIzfSwKKworICAgICAgICB7ICJQaGlsaXBzIFBBTC9TRUNBTSBtdWx0aSAoRlExMjE2QU1FIE1LNCkiLCBQaGlsaXBzLCBQQUwsCisgICAgICAgICAgMTYqMTYwLjAwLDE2KjQ0Mi4wMCwweDAxLDB4MDIsMHgwNCwweGNlLDYyMyB9LAorICAgICAgICB7ICJQaGlsaXBzIEZRMTIzNkEgTUs0IiwgUGhpbGlwcywgTlRTQywKKyAgICAgICAgICAxNioxNjAuMDAsMTYqNDQyLjAwLDB4MDEsMHgwMiwweDA0LDB4OGUsNzMyIH0sCisKK307Cit1bnNpZ25lZCBjb25zdCBpbnQgdHVuZXJfY291bnQgPSBBUlJBWV9TSVpFKHR1bmVycyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB0dW5lcl9nZXRzdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJdW5zaWduZWQgY2hhciBieXRlOworCisJaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KGMsJmJ5dGUsMSkpCisJCXJldHVybiAwOworCXJldHVybiBieXRlOworfQorCisjZGVmaW5lIFRVTkVSX1BPUiAgICAgICAweDgwCisjZGVmaW5lIFRVTkVSX0ZMICAgICAgICAweDQwCisjZGVmaW5lIFRVTkVSX01PREUgICAgICAweDM4CisjZGVmaW5lIFRVTkVSX0FGQyAgICAgICAweDA3CisKKyNkZWZpbmUgVFVORVJfU1RFUkVPICAgIDB4MTAgLyogcmFkaW8gbW9kZSAqLworI2RlZmluZSBUVU5FUl9TSUdOQUwgICAgMHgwNyAvKiByYWRpbyBtb2RlICovCisKK3N0YXRpYyBpbnQgdHVuZXJfc2lnbmFsKHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworCXJldHVybiAodHVuZXJfZ2V0c3RhdHVzKGMpICYgVFVORVJfU0lHTkFMKTw8MTM7Cit9CisKK3N0YXRpYyBpbnQgdHVuZXJfc3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworCXJldHVybiAodHVuZXJfZ2V0c3RhdHVzIChjKSAmIFRVTkVSX1NURVJFTyk7Cit9CisKKyNpZiAwIC8qIHVudXNlZCAqLworc3RhdGljIGludCB0dW5lcl9pc2xvY2tlZCAoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisgICAgICAgIHJldHVybiAodHVuZXJfZ2V0c3RhdHVzIChjKSAmIFRVTkVSX0ZMKTsKK30KKworc3RhdGljIGludCB0dW5lcl9hZmNzdGF0dXMgKHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworICAgICAgICByZXR1cm4gKHR1bmVyX2dldHN0YXR1cyAoYykgJiBUVU5FUl9BRkMpIC0gMjsKK30KKworc3RhdGljIGludCB0dW5lcl9tb2RlIChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKyAgICAgICAgcmV0dXJuICh0dW5lcl9nZXRzdGF0dXMgKGMpICYgVFVORVJfTU9ERSkgPj4gMzsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfc2V0X3R2X2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKQoreworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwl1OCBjb25maWc7CisJdTE2IGRpdjsKKwlzdHJ1Y3QgdHVuZXJ0eXBlICp0dW47CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzRdOworCWludCByYzsKKworCXR1biA9ICZ0dW5lcnNbdC0+dHlwZV07CisJaWYgKGZyZXEgPCB0dW4tPnRocmVzaDEpIHsKKwkJY29uZmlnID0gdHVuLT5WSEZfTDsKKwkJdHVuZXJfZGJnKCJ0djogVkhGIGxvd3JhbmdlXG4iKTsKKwl9IGVsc2UgaWYgKGZyZXEgPCB0dW4tPnRocmVzaDIpIHsKKwkJY29uZmlnID0gdHVuLT5WSEZfSDsKKwkJdHVuZXJfZGJnKCJ0djogVkhGIGhpZ2ggcmFuZ2VcbiIpOworCX0gZWxzZSB7CisJCWNvbmZpZyA9IHR1bi0+VUhGOworCQl0dW5lcl9kYmcoInR2OiBVSEYgcmFuZ2VcbiIpOworCX0KKworCisJLyogdHYgbm9ybSBzcGVjaWZpYyBzdHVmZiBmb3IgbXVsdGktbm9ybSB0dW5lcnMgKi8KKwlzd2l0Y2ggKHQtPnR5cGUpIHsKKwljYXNlIFRVTkVSX1BISUxJUFNfU0VDQU06IC8vIEZJMTIxNk1GCisJCS8qIDB4MDEgLT4gPz8/IG5vIGNoYW5nZSA/Pz8gKi8KKwkJLyogMHgwMiAtPiBQQUwgQkRHSEkgLyBTRUNBTSBMICovCisJCS8qIDB4MDQgLT4gPz8/IFBBTCBvdGhlcnMgLyBTRUNBTSBvdGhlcnMgPz8/ICovCisJCWNvbmZpZyAmPSB+MHgwMjsKKwkJaWYgKHQtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNKQorCQkJY29uZmlnIHw9IDB4MDI7CisJCWJyZWFrOworCisJY2FzZSBUVU5FUl9URU1JQ180MDQ2Rk01OgorCQljb25maWcgJj0gfjB4MGY7CisKKwkJaWYgKHQtPnN0ZCAmIFY0TDJfU1REX1BBTF9CRykgeworCQkJY29uZmlnIHw9IFRFTUlDX1NFVF9QQUxfQkc7CisKKwkJfSBlbHNlIGlmICh0LT5zdGQgJiBWNEwyX1NURF9QQUxfSSkgeworCQkJY29uZmlnIHw9IFRFTUlDX1NFVF9QQUxfSTsKKworCQl9IGVsc2UgaWYgKHQtPnN0ZCAmIFY0TDJfU1REX1BBTF9ESykgeworCQkJY29uZmlnIHw9IFRFTUlDX1NFVF9QQUxfREs7CisKKwkJfSBlbHNlIGlmICh0LT5zdGQgJiBWNEwyX1NURF9TRUNBTV9MKSB7CisJCQljb25maWcgfD0gVEVNSUNfU0VUX1BBTF9MOworCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRVTkVSX1BISUxJUFNfRlExMjE2TUU6CisJCWNvbmZpZyAmPSB+MHgwZjsKKworCQlpZiAodC0+c3RkICYgKFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9QQUxfREspKSB7CisJCQljb25maWcgfD0gUEhJTElQU19TRVRfUEFMX0JHREs7CisKKwkJfSBlbHNlIGlmICh0LT5zdGQgJiBWNEwyX1NURF9QQUxfSSkgeworCQkJY29uZmlnIHw9IFBISUxJUFNfU0VUX1BBTF9JOworCisJCX0gZWxzZSBpZiAodC0+c3RkICYgVjRMMl9TVERfU0VDQU1fTCkgeworCQkJY29uZmlnIHw9IFBISUxJUFNfU0VUX1BBTF9MOworCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRVTkVSX1BISUxJUFNfQVRTQzoKKwkJLyogMHgwMCAtPiBBVFNDIGFudGVubmEgaW5wdXQgMSAqLworCQkvKiAweDAxIC0+IEFUU0MgYW50ZW5uYSBpbnB1dCAyICovCisJCS8qIDB4MDIgLT4gTlRTQyBhbnRlbm5hIGlucHV0IDEgKi8KKwkJLyogMHgwMyAtPiBOVFNDIGFudGVubmEgaW5wdXQgMiAqLworCQljb25maWcgJj0gfjB4MDM7CisJCWlmICghKHQtPnN0ZCAmIFY0TDJfU1REX0FUU0MpKQorCQkJY29uZmlnIHw9IDI7CisJCS8qIEZJWE1FOiBpbnB1dCAqLworCQlicmVhazsKKworCWNhc2UgVFVORVJfTUlDUk9UVU5FXzQwNDJGSTU6CisJCS8qIFNldCB0aGUgY2hhcmdlIHB1bXAgZm9yIGZhc3QgdHVuaW5nICovCisJCXR1bi0+Y29uZmlnIHw9IDB4NDA7CisJCWJyZWFrOworCX0KKworCS8qCisJICogUGhpbGlwcyBGSTEyMTZNSzIgcmVtYXJrIGZyb20gc3BlY2lmaWNhdGlvbiA6CisJICogZm9yIGNoYW5uZWwgc2VsZWN0aW9uIGludm9sdmluZyBiYW5kIHN3aXRjaGluZywgYW5kIHRvIGVuc3VyZQorCSAqIHNtb290aCB0dW5pbmcgdG8gdGhlIGRlc2lyZWQgY2hhbm5lbCB3aXRob3V0IGNhdXNpbmcKKwkgKiB1bm5lY2Vzc2FyeSBjaGFyZ2UgcHVtcCBhY3Rpb24sIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNvbnNpZGVyCisJICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3YW50ZWQgY2hhbm5lbCBmcmVxdWVuY3kgYW5kIHRoZQorCSAqIGN1cnJlbnQgY2hhbm5lbCBmcmVxdWVuY3kuICBVbm5lY2Vzc2FyeSBjaGFyZ2UgcHVtcCBhY3Rpb24KKwkgKiB3aWxsIHJlc3VsdCBpbiB2ZXJ5IGxvdyB0dW5pbmcgdm9sdGFnZSB3aGljaCBtYXkgZHJpdmUgdGhlCisJICogb3NjaWxsYXRvciB0byBleHRyZW1lIGNvbmRpdGlvbnMuCisJICoKKwkgKiBQcm9nZm91OiBzcGVjaWZpY2F0aW9uIHNheXMgdG8gc2VuZCBjb25maWcgZGF0YSBiZWZvcmUKKwkgKiBmcmVxdWVuY3kgaW4gY2FzZSAod2FudGVkIGZyZXF1ZW5jeSA8IGN1cnJlbnQgZnJlcXVlbmN5KS4KKwkgKi8KKworCWRpdj1mcmVxICsgdHVuLT5JRlBDb2ZmOworCWlmICh0LT50eXBlID09IFRVTkVSX1BISUxJUFNfU0VDQU0gJiYgZnJlcSA8IHQtPmZyZXEpIHsKKwkJYnVmZmVyWzBdID0gdHVuLT5jb25maWc7CisJCWJ1ZmZlclsxXSA9IGNvbmZpZzsKKwkJYnVmZmVyWzJdID0gKGRpdj4+OCkgJiAweDdmOworCQlidWZmZXJbM10gPSBkaXYgICAgICAmIDB4ZmY7CisJfSBlbHNlIHsKKwkJYnVmZmVyWzBdID0gKGRpdj4+OCkgJiAweDdmOworCQlidWZmZXJbMV0gPSBkaXYgICAgICAmIDB4ZmY7CisJCWJ1ZmZlclsyXSA9IHR1bi0+Y29uZmlnOworCQlidWZmZXJbM10gPSBjb25maWc7CisJfQorCXR1bmVyX2RiZygidHYgMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAorCQkgIGJ1ZmZlclswXSxidWZmZXJbMV0sYnVmZmVyWzJdLGJ1ZmZlclszXSk7CisKKyAgICAgICAgaWYgKDQgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGMsYnVmZmVyLDQpKSkKKwkJdHVuZXJfd2FybigiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSA0KVxuIixyYyk7CisKKwlpZiAodC0+dHlwZSA9PSBUVU5FUl9NSUNST1RVTkVfNDA0MkZJNSkgeworCQkvLyBGSVhNRSAtIHRoaXMgbWF5IGFsc28gd29yayBmb3Igb3RoZXIgdHVuZXJzCisJCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpOworCQl1OCBzdGF0dXNfYnl0ZSA9IDA7CisKKwkJLyogV2FpdCB1bnRpbCB0aGUgUExMIGxvY2tzICovCisJCWZvciAoOzspIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsdGltZW91dCkpCisJCQkJcmV0dXJuOworCQkJaWYgKDEgIT0gKHJjID0gaTJjX21hc3Rlcl9yZWN2KGMsJnN0YXR1c19ieXRlLDEpKSkgeworCQkJCXR1bmVyX3dhcm4oImkyYyBpL28gcmVhZCBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIixyYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBiaXQgNiBpcyBQTEwgbG9ja2VkIGluZGljYXRvciAqLworCQkJaWYgKHN0YXR1c19ieXRlICYgMHg0MCkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxMCk7CisJCX0KKworCQkvKiBTZXQgdGhlIGNoYXJnZSBwdW1wIGZvciBvcHRpbWl6ZWQgcGhhc2Ugbm9pc2UgZmlndXJlICovCisJCXR1bi0+Y29uZmlnICY9IH4weDQwOworCQlidWZmZXJbMF0gPSAoZGl2Pj44KSAmIDB4N2Y7CisJCWJ1ZmZlclsxXSA9IGRpdiAgICAgICYgMHhmZjsKKwkJYnVmZmVyWzJdID0gdHVuLT5jb25maWc7CisJCWJ1ZmZlclszXSA9IGNvbmZpZzsKKwkJdHVuZXJfZGJnKCJ0diAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnhcbiIsCisJCSAgICAgICBidWZmZXJbMF0sYnVmZmVyWzFdLGJ1ZmZlclsyXSxidWZmZXJbM10pOworCisJCWlmICg0ICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChjLGJ1ZmZlciw0KSkpCisJCQl0dW5lcl93YXJuKCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDQpXG4iLHJjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfc2V0X3JhZGlvX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKQoreworCXN0cnVjdCB0dW5lcnR5cGUgKnR1bjsKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzRdOworCXVuc2lnbmVkIGRpdjsKKwlpbnQgcmM7CisKKwl0dW49JnR1bmVyc1t0LT50eXBlXTsKKwlkaXYgPSBmcmVxICsgKGludCkoMTYqMTAuNyk7CisJYnVmZmVyWzJdID0gdHVuLT5jb25maWc7CisKKwlzd2l0Y2ggKHQtPnR5cGUpIHsKKwljYXNlIFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszOgorCWNhc2UgVFVORVJfUEhJTElQU19GTTEyMzZfTUszOgorCQlidWZmZXJbM10gPSAweDE5OworCQlicmVhazsKKwljYXNlIFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMzoKKwkJZGl2ID0gKDIwICogZnJlcSkvMTYgKyAzMzMgKiAyOworCSAgICAgICAgYnVmZmVyWzJdID0gMHg4MDsKKwkJYnVmZmVyWzNdID0gMHgxOTsKKwkJYnJlYWs7CisJY2FzZSBUVU5FUl9MR19QQUxfRk06CisJCWJ1ZmZlclszXSA9IDB4YTU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJ1ZmZlclszXSA9IDB4YTQ7CisJCWJyZWFrOworCX0KKyAgICAgICAgYnVmZmVyWzBdID0gKGRpdj4+OCkgJiAweDdmOworICAgICAgICBidWZmZXJbMV0gPSBkaXYgICAgICAmIDB4ZmY7CisKKwl0dW5lcl9kYmcoInJhZGlvIDB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeFxuIiwKKwkgICAgICAgYnVmZmVyWzBdLGJ1ZmZlclsxXSxidWZmZXJbMl0sYnVmZmVyWzNdKTsKKworICAgICAgICBpZiAoNCAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoYyxidWZmZXIsNCkpKQorCQl0dW5lcl93YXJuKCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDQpXG4iLHJjKTsKK30KKworaW50IGRlZmF1bHRfdHVuZXJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisKKwl0dW5lcl9pbmZvKCJ0eXBlIHNldCB0byAlZCAoJXMpXG4iLAorCQkgICB0LT50eXBlLCB0dW5lcnNbdC0+dHlwZV0ubmFtZSk7CisJc3RybGNweShjLT5uYW1lLCB0dW5lcnNbdC0+dHlwZV0ubmFtZSwgc2l6ZW9mKGMtPm5hbWUpKTsKKworCXQtPnR2X2ZyZXEgICAgPSBkZWZhdWx0X3NldF90dl9mcmVxOworCXQtPnJhZGlvX2ZyZXEgPSBkZWZhdWx0X3NldF9yYWRpb19mcmVxOworCXQtPmhhc19zaWduYWwgPSB0dW5lcl9zaWduYWw7CisJdC0+aXNfc3RlcmVvICA9IHR1bmVyX3N0ZXJlbzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWViNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYwpAQCAtMCwwICsxLDE3NDAgQEAKKy8qCisgKiBleHBlcmltZW50YWwgZHJpdmVyIGZvciBzaW1wbGUgaTJjIGF1ZGlvIGNoaXBzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBHZXJkIEtub3JyCisgKiBiYXNlZCBvbiBjb2RlIGJ5OgorICogICBFcmljIFNhbmRlZW4gKGVyaWNfc2FuZGVlbkBiaWdmb290LmNvbSkKKyAqICAgU3RldmUgVmFuRGVCb2dhcnQgKHZhbmRlYm9AdWNsaW5rLmJlcmtlbGV5LmVkdSkKKyAqICAgR3JlZyBBbGV4YW5kZXIgKGdhbGV4YW5kQGFjbS5vcmcpCisgKgorICogVGhpcyBjb2RlIGlzIHBsYWNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgorICogT1BUSU9OUzoKKyAqICAgZGVidWcgLSBzZXQgdG8gMSBpZiB5b3UnZCBsaWtlIHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9jaGlwLmg+CisjaW5jbHVkZSA8bWVkaWEvaWQuaD4KKworI2luY2x1ZGUgInR2YXVkaW8uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogaW5zbW9kIGFyZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgaW50IGRlYnVnID0gMDsJLyogaW5zbW9kIHBhcmFtZXRlciAqLworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oImRldmljZSBkcml2ZXIgZm9yIHZhcmlvdXMgaTJjIFRWIHNvdW5kIGRlY29kZXIgLyBhdWRpb211eCBjaGlwcyIpOworTU9EVUxFX0FVVEhPUigiRXJpYyBTYW5kZWVuLCBTdGV2ZSBWYW5EZUJvZ2FydCwgR3JlZyBBbGV4YW5kZXIsIEdlcmQgS25vcnIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBVTlNFVCAgICAoLTFVKQorI2RlZmluZSBkcHJpbnRrICBpZiAoZGVidWcpIHByaW50aworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBvdXIgc3RydWN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTUFYUkVHUyA2NAorCitzdHJ1Y3QgQ0hJUFNUQVRFOwordHlwZWRlZiBpbnQgICgqZ2V0dmFsdWUpKGludCk7Cit0eXBlZGVmIGludCAgKCpjaGVja2l0KShzdHJ1Y3QgQ0hJUFNUQVRFKik7Cit0eXBlZGVmIGludCAgKCppbml0aWFsaXplKShzdHJ1Y3QgQ0hJUFNUQVRFKik7Cit0eXBlZGVmIGludCAgKCpnZXRtb2RlKShzdHJ1Y3QgQ0hJUFNUQVRFKik7Cit0eXBlZGVmIHZvaWQgKCpzZXRtb2RlKShzdHJ1Y3QgQ0hJUFNUQVRFKiwgaW50IG1vZGUpOwordHlwZWRlZiB2b2lkICgqY2hlY2ttb2RlKShzdHJ1Y3QgQ0hJUFNUQVRFKik7CisKKy8qIGkyYyBjb21tYW5kICovCit0eXBlZGVmIHN0cnVjdCBBVURJT0NNRCB7CisJaW50ICAgICAgICAgICAgIGNvdW50OyAgICAgICAgICAgICAvKiAjIG9mIGJ5dGVzIHRvIHNlbmQgKi8KKwl1bnNpZ25lZCBjaGFyICAgYnl0ZXNbTUFYUkVHUysxXTsgIC8qIGFkZHIsIGRhdGEsIGRhdGEsIC4uLiAqLworfSBhdWRpb2NtZDsKKworLyogY2hpcCBkZXNjcmlwdGlvbiAqLworc3RydWN0IENISVBERVNDIHsKKwljaGFyICAgICAgICpuYW1lOyAgICAgICAgICAgICAvKiBjaGlwIG5hbWUgICAgICAgICAqLworCWludCAgICAgICAgaWQ7ICAgICAgICAgICAgICAgIC8qIElEICovCisJaW50ICAgICAgICBhZGRyX2xvLCBhZGRyX2hpOyAgLyogaTJjIGFkZHJlc3MgcmFuZ2UgKi8KKwlpbnQgICAgICAgIHJlZ2lzdGVyczsgICAgICAgICAvKiAjIG9mIHJlZ2lzdGVycyAgICAqLworCisJaW50ICAgICAgICAqaW5zbW9kb3B0OworCWNoZWNraXQgICAgY2hlY2tpdDsKKwlpbml0aWFsaXplIGluaXRpYWxpemU7CisJaW50ICAgICAgICBmbGFnczsKKyNkZWZpbmUgQ0hJUF9IQVNfVk9MVU1FICAgICAgMQorI2RlZmluZSBDSElQX0hBU19CQVNTVFJFQkxFICAyCisjZGVmaW5lIENISVBfSEFTX0lOUFVUU0VMICAgIDQKKworCS8qIHZhcmlvdXMgaTJjIGNvbW1hbmQgc2VxdWVuY2VzICovCisJYXVkaW9jbWQgICBpbml0OworCisJLyogd2hpY2ggcmVnaXN0ZXIgaGFzIHdoaWNoIHZhbHVlICovCisJaW50ICAgIGxlZnRyZWcscmlnaHRyZWcsdHJlYmxlcmVnLGJhc3NyZWc7CisKKwkvKiBpbml0aWFsaXplIHdpdGggKGRlZmF1bHRzIHRvIDY1NTM1LzY1NTM1LzMyNzY4LzMyNzY4ICovCisJaW50ICAgIGxlZnRpbml0LHJpZ2h0aW5pdCx0cmVibGVpbml0LGJhc3Npbml0OworCisJLyogZnVuY3Rpb25zIHRvIGNvbnZlcnQgdGhlIHZhbHVlcyAodjRsIC0+IGNoaXApICovCisJZ2V0dmFsdWUgdm9sZnVuYyx0cmVibGVmdW5jLGJhc3NmdW5jOworCisJLyogZ2V0L3NldCBtb2RlICovCisJZ2V0bW9kZSAgZ2V0bW9kZTsKKwlzZXRtb2RlICBzZXRtb2RlOworCisJLyogY2hlY2sgLyBhdXRvc3dpdGNoIGF1ZGlvIGFmdGVyIGNoYW5uZWwgc3dpdGNoZXMgKi8KKwljaGVja21vZGUgIGNoZWNrbW9kZTsKKworCS8qIGlucHV0IHN3aXRjaCByZWdpc3RlciArIHZhbHVlcyBmb3IgdjRsIGlucHV0cyAqLworCWludCAgaW5wdXRyZWc7CisJaW50ICBpbnB1dG1hcFs4XTsKKwlpbnQgIGlucHV0bXV0ZTsKKwlpbnQgIGlucHV0bWFzazsKK307CitzdGF0aWMgc3RydWN0IENISVBERVNDIGNoaXBsaXN0W107CisKKy8qIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNoaXAgKi8KK3N0cnVjdCBDSElQU1RBVEUgeworCXN0cnVjdCBpMmNfY2xpZW50IGM7CisKKwkvKiBpbmRleCBpbnRvIENISVBERVNDIGFycmF5ICovCisJaW50IHR5cGU7CisKKwkvKiBzaGFkb3cgcmVnaXN0ZXIgc2V0ICovCisJYXVkaW9jbWQgICBzaGFkb3c7CisKKwkvKiBjdXJyZW50IHNldHRpbmdzICovCisJX191MTYgbGVmdCxyaWdodCx0cmVibGUsYmFzcyxtb2RlOworCWludCBwcmV2bW9kZTsKKwlpbnQgbm9ybTsKKworCS8qIHRocmVhZCAqLworCXBpZF90ICAgICAgICAgICAgICAgIHRwaWQ7CisJc3RydWN0IGNvbXBsZXRpb24gICAgdGV4aXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgd3E7CisJc3RydWN0IHRpbWVyX2xpc3QgICAgd3Q7CisJaW50ICAgICAgICAgICAgICAgICAgZG9uZTsKKwlpbnQgICAgICAgICAgICAgICAgICB3YXRjaF9zdGVyZW87Cit9OworCisjZGVmaW5lIFZJREVPX01PREVfUkFESU8gMTYgICAgICAvKiBub3JtIG1hZ2ljIGZvciByYWRpbyBtb2RlICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGkyYyBhZGRyZXNzZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKKwlJMkNfVERBODQyNSAgID4+IDEsCisJSTJDX1RFQTYzMDAgICA+PiAxLAorCUkyQ19URUE2NDIwICAgPj4gMSwKKwlJMkNfVERBOTg0MCAgID4+IDEsCisJSTJDX1REQTk4NXhfTCA+PiAxLAorCUkyQ19UREE5ODV4X0ggPj4gMSwKKwlJMkNfVERBOTg3NCAgID4+IDEsCisJSTJDX1BJQzE2QzU0ICA+PiAxLAorCUkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY19yYW5nZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitJMkNfQ0xJRU5UX0lOU01PRDsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogaTJjIEkvTyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgaW50IGNoaXBfd3JpdGUoc3RydWN0IENISVBTVEFURSAqY2hpcCwgaW50IHN1YmFkZHIsIGludCB2YWwpCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbMl07CisKKwlpZiAoLTEgPT0gc3ViYWRkcikgeworCQlkcHJpbnRrKCIlczogY2hpcF93cml0ZTogMHgleFxuIiwKKwkJCWkyY19jbGllbnRuYW1lKCZjaGlwLT5jKSwgdmFsKTsKKwkJY2hpcC0+c2hhZG93LmJ5dGVzWzFdID0gdmFsOworCQlidWZmZXJbMF0gPSB2YWw7CisJCWlmICgxICE9IGkyY19tYXN0ZXJfc2VuZCgmY2hpcC0+YyxidWZmZXIsMSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJL08gZXJyb3IgKHdyaXRlIDB4JXgpXG4iLAorCQkJICAgICAgIGkyY19jbGllbnRuYW1lKCZjaGlwLT5jKSwgdmFsKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZSB7CisJCWRwcmludGsoIiVzOiBjaGlwX3dyaXRlOiByZWclZD0weCV4XG4iLAorCQkJaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpLCBzdWJhZGRyLCB2YWwpOworCQljaGlwLT5zaGFkb3cuYnl0ZXNbc3ViYWRkcisxXSA9IHZhbDsKKwkJYnVmZmVyWzBdID0gc3ViYWRkcjsKKwkJYnVmZmVyWzFdID0gdmFsOworCQlpZiAoMiAhPSBpMmNfbWFzdGVyX3NlbmQoJmNoaXAtPmMsYnVmZmVyLDIpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSS9PIGVycm9yICh3cml0ZSByZWclZD0weCV4KVxuIiwKKwkJCSAgICAgICBpMmNfY2xpZW50bmFtZSgmY2hpcC0+YyksIHN1YmFkZHIsIHZhbCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hpcF93cml0ZV9tYXNrZWQoc3RydWN0IENISVBTVEFURSAqY2hpcCwgaW50IHN1YmFkZHIsIGludCB2YWwsIGludCBtYXNrKQoreworCWlmIChtYXNrICE9IDApIHsKKwkJaWYgKC0xID09IHN1YmFkZHIpIHsKKwkJCXZhbCA9IChjaGlwLT5zaGFkb3cuYnl0ZXNbMV0gJiB+bWFzaykgfCAodmFsICYgbWFzayk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSAoY2hpcC0+c2hhZG93LmJ5dGVzW3N1YmFkZHIrMV0gJiB+bWFzaykgfCAodmFsICYgbWFzayk7CisJCX0KKwl9CisJcmV0dXJuIGNoaXBfd3JpdGUoY2hpcCwgc3ViYWRkciwgdmFsKTsKK30KKworc3RhdGljIGludCBjaGlwX3JlYWQoc3RydWN0IENISVBTVEFURSAqY2hpcCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcjsKKworCWlmICgxICE9IGkyY19tYXN0ZXJfcmVjdigmY2hpcC0+YywmYnVmZmVyLDEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJL08gZXJyb3IgKHJlYWQpXG4iLAorCQkgICAgICAgaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkcHJpbnRrKCIlczogY2hpcF9yZWFkOiAweCV4XG4iLGkyY19jbGllbnRuYW1lKCZjaGlwLT5jKSxidWZmZXIpOworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBpbnQgY2hpcF9yZWFkMihzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLCBpbnQgc3ViYWRkcikKK3sKKyAgICAgICAgdW5zaWduZWQgY2hhciB3cml0ZVsxXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciByZWFkWzFdOworICAgICAgICBzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0geworICAgICAgICAgICAgICAgIHsgY2hpcC0+Yy5hZGRyLCAwLCAgICAgICAgMSwgd3JpdGUgfSwKKyAgICAgICAgICAgICAgICB7IGNoaXAtPmMuYWRkciwgSTJDX01fUkQsIDEsIHJlYWQgIH0KKyAgICAgICAgfTsKKyAgICAgICAgd3JpdGVbMF0gPSBzdWJhZGRyOworCisJaWYgKDIgIT0gaTJjX3RyYW5zZmVyKGNoaXAtPmMuYWRhcHRlcixtc2dzLDIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJL08gZXJyb3IgKHJlYWQyKVxuIiwKKwkJICAgICAgIGkyY19jbGllbnRuYW1lKCZjaGlwLT5jKSk7CisJCXJldHVybiAtMTsKKwl9CisJZHByaW50aygiJXM6IGNoaXBfcmVhZDI6IHJlZyVkPTB4JXhcbiIsCisJCWkyY19jbGllbnRuYW1lKCZjaGlwLT5jKSxzdWJhZGRyLHJlYWRbMF0pOworCXJldHVybiByZWFkWzBdOworfQorCitzdGF0aWMgaW50IGNoaXBfY21kKHN0cnVjdCBDSElQU1RBVEUgKmNoaXAsIGNoYXIgKm5hbWUsIGF1ZGlvY21kICpjbWQpCit7CisJaW50IGk7CisKKwlpZiAoMCA9PSBjbWQtPmNvdW50KQorCQlyZXR1cm4gMDsKKworCS8qIHVwZGF0ZSBvdXIgc2hhZG93IHJlZ2lzdGVyIHNldDsgcHJpbnQgYnl0ZXMgaWYgKGRlYnVnID4gMCkgKi8KKwlkcHJpbnRrKCIlczogY2hpcF9jbWQoJXMpOiByZWc9JWQsIGRhdGE6IiwKKwkJaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpLG5hbWUsY21kLT5ieXRlc1swXSk7CisJZm9yIChpID0gMTsgaSA8IGNtZC0+Y291bnQ7IGkrKykgeworCQlkcHJpbnRrKCIgMHgleCIsY21kLT5ieXRlc1tpXSk7CisJCWNoaXAtPnNoYWRvdy5ieXRlc1tpK2NtZC0+Ynl0ZXNbMF1dID0gY21kLT5ieXRlc1tpXTsKKwl9CisJZHByaW50aygiXG4iKTsKKworCS8qIHNlbmQgZGF0YSB0byB0aGUgY2hpcCAqLworCWlmIChjbWQtPmNvdW50ICE9IGkyY19tYXN0ZXJfc2VuZCgmY2hpcC0+YyxjbWQtPmJ5dGVzLGNtZC0+Y291bnQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJL08gZXJyb3IgKCVzKVxuIiwgaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpLCBuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoga2VybmVsIHRocmVhZCBmb3IgZG9pbmcgaTJjIHN0dWZmIGFzeW5jcm9ubHkKKyAqICAgcmlnaHQgbm93IGl0IGlzIHVzZWQgb25seSB0byBjaGVjayB0aGUgYXVkaW8gbW9kZSAobW9uby9zdGVyZW8vd2hhdGV2ZXIpCisgKiAgIHNvbWUgdGltZSBhZnRlciBzd2l0Y2hpbmcgdG8gYW5vdGhlciBUViBjaGFubmVsLCB0aGVuIHR1cm4gb24gc3RlcmVvCisgKiAgIGlmIGF2YWlsYWJsZSwgLi4uCisgKi8KKworc3RhdGljIHZvaWQgY2hpcF90aHJlYWRfd2FrZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisgICAgICAgIHN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSAoc3RydWN0IENISVBTVEFURSopZGF0YTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoaXAtPndxKTsKK30KKworc3RhdGljIGludCBjaGlwX3RocmVhZCh2b2lkICpkYXRhKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworICAgICAgICBzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwID0gZGF0YTsKKwlzdHJ1Y3QgQ0hJUERFU0MgICpkZXNjID0gY2hpcGxpc3QgKyBjaGlwLT50eXBlOworCisJZGFlbW9uaXplKCIlcyIsaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpKTsKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisJZHByaW50aygiJXM6IHRocmVhZCBzdGFydGVkXG4iLCBpMmNfY2xpZW50bmFtZSgmY2hpcC0+YykpOworCisJZm9yICg7OykgeworCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKKwkJaWYgKCFjaGlwLT5kb25lKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGUoKTsKKwkJfQorCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKKwkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCQlpZiAoY2hpcC0+ZG9uZSB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlkcHJpbnRrKCIlczogdGhyZWFkIHdha2V1cFxuIiwgaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpKTsKKworCQkvKiBkb24ndCBkbyBhbnl0aGluZyBmb3IgcmFkaW8gb3IgaWYgbW9kZSAhPSBhdXRvICovCisJCWlmIChjaGlwLT5ub3JtID09IFZJREVPX01PREVfUkFESU8gfHwgY2hpcC0+bW9kZSAhPSAwKQorCQkJY29udGludWU7CisKKwkJLyogaGF2ZSBhIGxvb2sgd2hhdCdzIGdvaW5nIG9uICovCisJCWRlc2MtPmNoZWNrbW9kZShjaGlwKTsKKworCQkvKiBzY2hlZHVsZSBuZXh0IGNoZWNrICovCisJCW1vZF90aW1lcigmY2hpcC0+d3QsIGppZmZpZXMrMipIWik7CisJfQorCisJZHByaW50aygiJXM6IHRocmVhZCBleGl0aW5nXG4iLCBpMmNfY2xpZW50bmFtZSgmY2hpcC0+YykpOworICAgICAgICBjb21wbGV0ZV9hbmRfZXhpdCgmY2hpcC0+dGV4aXQsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX2NoZWNrbW9kZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwKQoreworCXN0cnVjdCBDSElQREVTQyAgKmRlc2MgPSBjaGlwbGlzdCArIGNoaXAtPnR5cGU7CisJaW50IG1vZGUgPSBkZXNjLT5nZXRtb2RlKGNoaXApOworCisJaWYgKG1vZGUgPT0gY2hpcC0+cHJldm1vZGUpCisJICAgIHJldHVybjsKKworCWRwcmludGsoIiVzOiB0aHJlYWQgY2hlY2ttb2RlXG4iLCBpMmNfY2xpZW50bmFtZSgmY2hpcC0+YykpOworCWNoaXAtPnByZXZtb2RlID0gbW9kZTsKKworCWlmIChtb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQorCQlkZXNjLT5zZXRtb2RlKGNoaXAsVklERU9fU09VTkRfU1RFUkVPKTsKKwllbHNlIGlmIChtb2RlICYgVklERU9fU09VTkRfTEFORzEpCisJCWRlc2MtPnNldG1vZGUoY2hpcCxWSURFT19TT1VORF9MQU5HMSk7CisJZWxzZSBpZiAobW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQorCQlkZXNjLT5zZXRtb2RlKGNoaXAsVklERU9fU09VTkRfTEFORzIpOworCWVsc2UKKwkJZGVzYy0+c2V0bW9kZShjaGlwLFZJREVPX1NPVU5EX01PTk8pOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBhdWRpbyBjaGlwIGRlc2NyaXB0aW9ucyAtIGRlZmluZXMrZnVuY3Rpb25zIGZvciB0ZGE5ODQwICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVERBOTg0MF9TVyAgICAgICAgIDB4MDAKKyNkZWZpbmUgVERBOTg0MF9MVkFESiAgICAgIDB4MDIKKyNkZWZpbmUgVERBOTg0MF9TVEFESiAgICAgIDB4MDMKKyNkZWZpbmUgVERBOTg0MF9URVNUICAgICAgIDB4MDQKKworI2RlZmluZSBUREE5ODQwX01PTk8gICAgICAgMHgxMAorI2RlZmluZSBUREE5ODQwX1NURVJFTyAgICAgMHgyYQorI2RlZmluZSBUREE5ODQwX0RVQUxBICAgICAgMHgxMgorI2RlZmluZSBUREE5ODQwX0RVQUxCICAgICAgMHgxZQorI2RlZmluZSBUREE5ODQwX0RVQUxBQiAgICAgMHgxYQorI2RlZmluZSBUREE5ODQwX0RVQUxCQSAgICAgMHgxNgorI2RlZmluZSBUREE5ODQwX0VYVEVSTkFMICAgMHg3YQorCisjZGVmaW5lIFREQTk4NDBfRFNfRFVBTCAgICAweDIwIC8qIER1YWwgc291bmQgaWRlbnRpZmllZCAgICAgICAgICAqLworI2RlZmluZSBUREE5ODQwX1NUX1NURVJFTyAgMHg0MCAvKiBTdGVyZW8gc291bmQgaWRlbnRpZmllZCAgICAgICAgKi8KKyNkZWZpbmUgVERBOTg0MF9QT05SRVMgICAgIDB4ODAgLyogUG93ZXItb24gcmVzZXQgZGV0ZWN0ZWQgaWYgPSAxICovCisKKyNkZWZpbmUgVERBOTg0MF9URVNUX0lOVDFTTiAweDEgLyogSW50ZWdyYXRpb24gdGltZSAwLjVzIHdoZW4gc2V0ICovCisjZGVmaW5lIFREQTk4NDBfVEVTVF9JTlRGVSAweDAyIC8qIERpc2FibGVzIGludGVncmF0b3IgZnVuY3Rpb24gKi8KKworc3RhdGljIGludCB0ZGE5ODQwX2dldG1vZGUoc3RydWN0IENISVBTVEFURSAqY2hpcCkKK3sKKwlpbnQgdmFsLCBtb2RlOworCisJdmFsID0gY2hpcF9yZWFkKGNoaXApOworCW1vZGUgPSBWSURFT19TT1VORF9NT05POworCWlmICh2YWwgJiBUREE5ODQwX0RTX0RVQUwpCisJCW1vZGUgfD0gVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKKwlpZiAodmFsICYgVERBOTg0MF9TVF9TVEVSRU8pCisJCW1vZGUgfD0gVklERU9fU09VTkRfU1RFUkVPOworCisJZHByaW50ayAoInRkYTk4NDBfZ2V0bW9kZSgpOiByYXcgY2hpcCByZWFkOiAlZCwgcmV0dXJuOiAlZFxuIiwKKwkJIHZhbCwgbW9kZSk7CisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHRkYTk4NDBfc2V0bW9kZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLCBpbnQgbW9kZSkKK3sKKwlpbnQgdXBkYXRlID0gMTsKKwlpbnQgdCA9IGNoaXAtPnNoYWRvdy5ieXRlc1tUREE5ODQwX1NXICsgMV0gJiB+MHg3ZTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgVklERU9fU09VTkRfTU9OTzoKKwkJdCB8PSBUREE5ODQwX01PTk87CisJCWJyZWFrOworCWNhc2UgVklERU9fU09VTkRfU1RFUkVPOgorCQl0IHw9IFREQTk4NDBfU1RFUkVPOworCQlicmVhazsKKwljYXNlIFZJREVPX1NPVU5EX0xBTkcxOgorCQl0IHw9IFREQTk4NDBfRFVBTEE7CisJCWJyZWFrOworCWNhc2UgVklERU9fU09VTkRfTEFORzI6CisJCXQgfD0gVERBOTg0MF9EVUFMQjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdXBkYXRlID0gMDsKKwl9CisKKwlpZiAodXBkYXRlKQorCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NDBfU1csIHQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBhdWRpbyBjaGlwIGRlc2NyaXB0aW9ucyAtIGRlZmluZXMrZnVuY3Rpb25zIGZvciB0ZGE5ODV4ICAgICAgICAgICAgICAgICovCisKKy8qIHN1YmFkZHJlc3NlcyBmb3IgVERBOTg1NSAqLworI2RlZmluZSBUREE5ODU1X1ZSCTB4MDAgLyogVm9sdW1lLCByaWdodCAqLworI2RlZmluZSBUREE5ODU1X1ZMCTB4MDEgLyogVm9sdW1lLCBsZWZ0ICovCisjZGVmaW5lIFREQTk4NTVfQkEJMHgwMiAvKiBCYXNzICovCisjZGVmaW5lIFREQTk4NTVfVFIJMHgwMyAvKiBUcmVibGUgKi8KKyNkZWZpbmUgVERBOTg1NV9TVwkweDA0IC8qIFN1Yndvb2ZlciAtIG5vdCBjb25uZWN0ZWQgb24gRFRWMjAwMCAqLworCisvKiBzdWJhZGRyZXNzZXMgZm9yIFREQTk4NTAgKi8KKyNkZWZpbmUgVERBOTg1MF9DNAkweDA0IC8qIENvbnRyb2wgMSBmb3IgVERBOTg1MCAqLworCisvKiBzdWJhZGRlc3NlcyBmb3IgYm90aCBjaGlwcyAqLworI2RlZmluZSBUREE5ODV4X0M1CTB4MDUgLyogQ29udHJvbCAyIGZvciBUREE5ODUwLCBDb250cm9sIDEgZm9yIFREQTk4NTUgKi8KKyNkZWZpbmUgVERBOTg1eF9DNgkweDA2IC8qIENvbnRyb2wgMyBmb3IgVERBOTg1MCwgQ29udHJvbCAyIGZvciBUREE5ODU1ICovCisjZGVmaW5lIFREQTk4NXhfQzcJMHgwNyAvKiBDb250cm9sIDQgZm9yIFREQTk4NTAsIENvbnRyb2wgMyBmb3IgVERBOTg1NSAqLworI2RlZmluZSBUREE5ODV4X0ExCTB4MDggLyogQWxpZ25tZW50IDEgZm9yIGJvdGggY2hpcHMgKi8KKyNkZWZpbmUgVERBOTg1eF9BMgkweDA5IC8qIEFsaWdubWVudCAyIGZvciBib3RoIGNoaXBzICovCisjZGVmaW5lIFREQTk4NXhfQTMJMHgwYSAvKiBBbGlnbm1lbnQgMyBmb3IgYm90aCBjaGlwcyAqLworCisvKiBNYXNrcyBmb3IgYml0cyBpbiBUREE5ODU1IHN1YmFkZHJlc3NlcyAqLworLyogMHgwMCAtIFZSIGluIFREQTk4NTUgKi8KKy8qIDB4MDEgLSBWTCBpbiBUREE5ODU1ICovCisvKiBsb3dlciA3IGJpdHMgY29udHJvbCBnYWluIGZyb20gLTcxZEIgKDB4MjgpIHRvIDE2ZEIgKDB4N2YpCisgKiBpbiAxZEIgc3RlcHMgLSBtdXRlIGlzIDB4MjcgKi8KKworCisvKiAweDAyIC0gQkEgaW4gVERBOTg1NSAqLworLyogbG93ZXIgNSBiaXRzIGNvbnRyb2wgYmFzcyBnYWluIGZyb20gLTEyZEIgKDB4MDYpIHRvIDE2LjVkQiAoMHgxOSkKKyAqIGluIC41ZEIgc3RlcHMgLSAwIGlzIDB4MEUgKi8KKworCisvKiAweDAzIC0gVFIgaW4gVERBOTg1NSAqLworLyogNCBiaXRzIDw8IDEgY29udHJvbCB0cmVibGUgZ2FpbiBmcm9tIC0xMmRCICgweDMpIHRvIDEyZEIgKDB4YikKKyAqIGluIDNkQiBzdGVwcyAtIDAgaXMgMHg3ICovCisKKy8qIE1hc2tzIGZvciBiaXRzIGluIGJvdGggY2hpcHMnIHN1YmFkZHJlc3NlcyAqLworLyogMHgwNCAtIFNXIGluIFREQTk4NTUsIEM0L0NvbnRyb2wgMSBpbiBUREE5ODUwICovCisvKiBVbmlxdWUgdG8gVERBOTg1NTogKi8KKy8qIDQgYml0cyA8PCAyIGNvbnRyb2wgc3Vid29vZmVyL3N1cnJvdW5kIGdhaW4gZnJvbSAtMTRkYiAoMHgxKSB0byAxNGRiICgweGYpCisgKiBpbiAzZEIgc3RlcHMgLSBtdXRlIGlzIDB4MCAqLworCisvKiBVbmlxdWUgdG8gVERBOTg1MDogKi8KKy8qIGxvd2VyIDQgYml0cyBjb250cm9sIHN0ZXJlbyBub2lzZSB0aHJlc2hvbGQsIG92ZXIgd2hpY2ggc3RlcmVvIHR1cm5zIG9mZgorICogc2V0IHRvIHZhbHVlcyBvZiAweDAwIHRocm91Z2ggMHgwZiBmb3IgU3RlcjEgdGhyb3VnaCBTdGVyMTYgKi8KKworCisvKiAweDA1IC0gQzUgLSBDb250cm9sIDEgaW4gVERBOTg1NSAsIENvbnRyb2wgMiBpbiBUREE5ODUwKi8KKy8qIFVuaXF1ZSB0byBUREE5ODU1OiAqLworI2RlZmluZSBUREE5ODU1X01VVEUJMTw8NyAvKiBHTVUsIE11dGUgYXQgb3V0cHV0cyAqLworI2RlZmluZSBUREE5ODU1X0FWTAkxPDw2IC8qIEFWTCwgQXV0b21hdGljIFZvbHVtZSBMZXZlbCAqLworI2RlZmluZSBUREE5ODU1X0xPVUQJMTw8NSAvKiBMb3VkbmVzcywgMT09b2ZmICovCisjZGVmaW5lIFREQTk4NTVfU1VSCTE8PDMgLyogU3Vycm91bmQgLyBTdWJ3b29mZXIgMT09LjUoTC1SKSAwPT0uNShMK1IpICovCisJCQkgICAgIC8qIEJpdHMgMCB0byAzIHNlbGVjdCB2YXJpb3VzIGNvbWJpbmF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBsaW5lIGluIGFuZCBsaW5lIG91dCwgb25seSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW50ZXJlc3Rpbmcgb25lcyBhcmUgZGVmaW5lZCAqLworI2RlZmluZSBUREE5ODU1X0VYVAkxPDwyIC8qIFNlbGVjdHMgaW5wdXRzIExJUiBhbmQgTElMLiAgUGlucyA0MSAmIDEyICovCisjZGVmaW5lIFREQTk4NTVfSU5UCTAgICAgLyogU2VsZWN0cyBpbnB1dHMgTE9SIGFuZCBMT0wuICAoaW50ZXJuYWwpICovCisKKy8qIFVuaXF1ZSB0byBUREE5ODUwOiAgKi8KKy8qIGxvd2VyIDQgYml0cyBjb250b2wgU0FQIG5vaXNlIHRocmVzaG9sZCwgb3ZlciB3aGljaCBTQVAgdHVybnMgb2ZmCisgKiBzZXQgdG8gdmFsdWVzIG9mIDB4MDAgdGhyb3VnaCAweDBmIGZvciBTQVAxIHRocm91Z2ggU0FQMTYgKi8KKworCisvKiAweDA2IC0gQzYgLSBDb250cm9sIDIgaW4gVERBOTg1NSwgQ29udHJvbCAzIGluIFREQTk4NTAgKi8KKy8qIENvbW1vbiB0byBUREE5ODU1IGFuZCBUREE5ODUwOiAqLworI2RlZmluZSBUREE5ODV4X1NBUAkzPDw2IC8qIFNlbGVjdHMgU0FQIG91dHB1dCwgbXV0ZSBpZiBub3QgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgVERBOTg1eF9TVEVSRU8JMTw8NiAvKiBTZWxlY3RzIFN0ZXJlbyBvdXB1dCwgbW9ubyBpZiBub3QgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgVERBOTg1eF9NT05PCTAgICAgLyogRm9yY2VzIE1vbm8gb3V0cHV0ICovCisjZGVmaW5lIFREQTk4NXhfTE1VCTE8PDMgLyogTXV0ZSAoTE9SL0xPTCBmb3IgOTg1NSwgT1VUTC9PVVRSIGZvciA5ODUwKSAqLworCisvKiBVbmlxdWUgdG8gVERBOTg1NTogKi8KKyNkZWZpbmUgVERBOTg1NV9UWkNNCTE8PDUgLyogSWYgc2V0LCBkb24ndCBtdXRlIHRpbGwgemVybyBjcm9zc2luZyAqLworI2RlZmluZSBUREE5ODU1X1ZaQ00JMTw8NCAvKiBJZiBzZXQsIGRvbid0IGNoYW5nZSB2b2x1bWUgdGlsbCB6ZXJvIGNyb3NzaW5nKi8KKyNkZWZpbmUgVERBOTg1NV9MSU5FQVIJMCAgICAvKiBMaW5lYXIgU3RlcmVvICovCisjZGVmaW5lIFREQTk4NTVfUFNFVURPCTEgICAgLyogUHNldWRvIFN0ZXJlbyAqLworI2RlZmluZSBUREE5ODU1X1NQQVRfMzAJMiAgICAvKiBTcGF0aWFsIFN0ZXJlbywgMzAlIGFudGktcGhhc2UgY3Jvc3N0YWxrICovCisjZGVmaW5lIFREQTk4NTVfU1BBVF81MAkzICAgIC8qIFNwYXRpYWwgU3RlcmVvLCA1MiUgYW50aS1waGFzZSBjcm9zc3RhbGsgKi8KKyNkZWZpbmUgVERBOTg1NV9FX01PTk8JNyAgICAvKiBGb3JjZWQgbW9ubyAtIG1vbm8gc2VsZWN0IGVsc2V3YXJlLCBzbyB1c2VsZXNzKi8KKworLyogMHgwNyAtIEM3IC0gQ29udHJvbCAzIGluIFREQTk4NTUsIENvbnRyb2wgNCBpbiBUREE5ODUwICovCisvKiBDb21tb24gdG8gYm90aCBUREE5ODU1IGFuZCBUREE5ODUwOiAqLworLyogbG93ZXIgNCBiaXRzIGNvbnRyb2wgaW5wdXQgZ2FpbiBmcm9tIC0zLjVkQiAoMHgwKSB0byA0ZEIgKDB4RikKKyAqIGluIC41ZEIgc3RlcHMgLSAgMGRCIGlzIDB4NyAqLworCisvKiAweDA4LCAweDA5IC0gQTEgYW5kIEEyIChyZWFkL3dyaXRlKSAqLworLyogQ29tbW9uIHRvIGJvdGggVERBOTg1NSBhbmQgVERBOTg1MDogKi8KKy8qIGxvd2VyIDUgYml0ZXMgYXJlIHdpZGViYW5kIGFuZCBzcGVjdHJhbCBleHBhbmRlciBhbGlnbm1lbnQKKyAqIGZyb20gMHgwMCB0byAweDFmIC0gbm9taW5hbCBhdCAweDBmIGFuZCAweDEwIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBUREE5ODV4X1NUUAkxPDw1IC8qIFN0ZXJlbyBQaWxvdC9kZXRlY3QgKHJlYWQtb25seSkgKi8KKyNkZWZpbmUgVERBOTg1eF9TQVBQCTE8PDYgLyogU0FQIFBpbG90L2RldGVjdCAocmVhZC1vbmx5KSAqLworI2RlZmluZSBUREE5ODV4X1NUUwkxPDw3IC8qIFN0ZXJlbyB0cmlnZ2VyIDE9IDwzNW1WIDA9IDwzMG1WICh3cml0ZS1vbmx5KSovCisKKy8qIDB4MGEgLSBBMyAqLworLyogQ29tbW9uIHRvIGJvdGggVERBOTg1NSBhbmQgVERBOTg1MDogKi8KKy8qIGxvd2VyIDMgYml0cyBjb250cm9sIHRpbWluZyBjdXJyZW50IGZvciBhbGlnbm1lbnQ6IC0zMCUgKDB4MCksIC0yMCUgKDB4MSksCisgKiAtMTAlICgweDIpLCBub21pbmFsICgweDMpLCArMTAlICgweDYpLCArMjAlICgweDUpLCArMzAlICgweDQpICovCisjZGVmaW5lIFREQTk4NXhfQURKCTE8PDcgLyogU3RlcmVvIGFkanVzdCBvbi9vZmYgKHdpZGViYW5kIGFuZCBzcGVjdHJhbCAqLworCitzdGF0aWMgaW50IHRkYTk4NTVfdm9sdW1lKGludCB2YWwpIHsgcmV0dXJuIHZhbC8weDJlOCsweDI3OyB9CitzdGF0aWMgaW50IHRkYTk4NTVfYmFzcyhpbnQgdmFsKSAgIHsgcmV0dXJuIHZhbC8weGNjYysweDA2OyB9CitzdGF0aWMgaW50IHRkYTk4NTVfdHJlYmxlKGludCB2YWwpIHsgcmV0dXJuICh2YWwvMHgxYzcxKzB4Myk8PDE7IH0KKworc3RhdGljIGludCAgdGRhOTg1eF9nZXRtb2RlKHN0cnVjdCBDSElQU1RBVEUgKmNoaXApCit7CisJaW50IG1vZGU7CisKKwltb2RlID0gKChUREE5ODV4X1NUUCB8IFREQTk4NXhfU0FQUCkgJgorCQljaGlwX3JlYWQoY2hpcCkpID4+IDQ7CisJLyogQWRkIG1vbm8gbW9kZSByZWdhcmRsZXNzIG9mIFNBUCBhbmQgc3RlcmVvICovCisJLyogQWxsb3dzIGZvcmNlZCBtb25vICovCisJcmV0dXJuIG1vZGUgfCBWSURFT19TT1VORF9NT05POworfQorCitzdGF0aWMgdm9pZCB0ZGE5ODV4X3NldG1vZGUoc3RydWN0IENISVBTVEFURSAqY2hpcCwgaW50IG1vZGUpCit7CisJaW50IHVwZGF0ZSA9IDE7CisJaW50IGM2ID0gY2hpcC0+c2hhZG93LmJ5dGVzW1REQTk4NXhfQzYrMV0gJiAweDNmOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBWSURFT19TT1VORF9NT05POgorCQljNiB8PSBUREE5ODV4X01PTk87CisJCWJyZWFrOworCWNhc2UgVklERU9fU09VTkRfU1RFUkVPOgorCQljNiB8PSBUREE5ODV4X1NURVJFTzsKKwkJYnJlYWs7CisJY2FzZSBWSURFT19TT1VORF9MQU5HMToKKwkJYzYgfD0gVERBOTg1eF9TQVA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVwZGF0ZSA9IDA7CisJfQorCWlmICh1cGRhdGUpCisJCWNoaXBfd3JpdGUoY2hpcCxUREE5ODV4X0M2LGM2KTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBhdWRpbyBjaGlwIGRlc2NyaXB0aW9ucyAtIGRlZmluZXMrZnVuY3Rpb25zIGZvciB0ZGE5ODczaCAgICAgICAgICAgICAgICovCisKKy8qIFN1YmFkZHJlc3NlcyBmb3IgVERBOTg3M0ggKi8KKworI2RlZmluZSBUREE5ODczX1NXCTB4MDAgLyogU3dpdGNoaW5nICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUREE5ODczX0FECTB4MDEgLyogQWRqdXN0ICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUREE5ODczX1BUCTB4MDIgLyogUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBTdWJhZGRyZXNzIDB4MDA6IFN3aXRjaGluZyBEYXRhCisgKiBCNy4uQjA6CisgKgorICogQjEsIEIwOiBJbnB1dCBzb3VyY2Ugc2VsZWN0aW9uCisgKiAgMCwgIDAgIGludGVybmFsCisgKiAgMSwgIDAgIGV4dGVybmFsIHN0ZXJlbworICogIDAsICAxICBleHRlcm5hbCBtb25vCisgKi8KKyNkZWZpbmUgVERBOTg3M19JTlBfTUFTSyAgICAzCisjZGVmaW5lIFREQTk4NzNfSU5URVJOQUwgICAgMAorI2RlZmluZSBUREE5ODczX0VYVF9TVEVSRU8gIDIKKyNkZWZpbmUgVERBOTg3M19FWFRfTU9OTyAgICAxCisKKy8qICAgIEIzLCBCMjogb3V0cHV0IHNpZ25hbCBzZWxlY3QKKyAqIEI0ICAgIDogdHJhbnNtaXNzaW9uIG1vZGUKKyAqICAwLCAwLCAxICAgTW9ubworICogIDEsIDAsIDAgICBTdGVyZW8KKyAqICAxLCAxLCAxICAgU3RlcmVvIChyZXZlcnNlZCBjaGFubmVsKQorICogIDAsIDAsIDAgICBEdWFsIEFCCisgKiAgMCwgMCwgMSAgIER1YWwgQUEKKyAqICAwLCAxLCAwICAgRHVhbCBCQgorICogIDAsIDEsIDEgICBEdWFsIEJBCisgKi8KKworI2RlZmluZSBUREE5ODczX1RSX01BU0sgICAgICg3IDw8IDIpCisjZGVmaW5lIFREQTk4NzNfVFJfTU9OTyAgICAgNAorI2RlZmluZSBUREE5ODczX1RSX1NURVJFTyAgIDEgPDwgNAorI2RlZmluZSBUREE5ODczX1RSX1JFVkVSU0UgICgxIDw8IDMpICYgKDEgPDwgMikKKyNkZWZpbmUgVERBOTg3M19UUl9EVUFMQSAgICAxIDw8IDIKKyNkZWZpbmUgVERBOTg3M19UUl9EVUFMQiAgICAxIDw8IDMKKworLyogb3V0cHV0IGxldmVsIGNvbnRyb2xzCisgKiBCNTogIG91dHB1dCBsZXZlbCBzd2l0Y2ggKDAgPSByZWR1Y2VkIGdhaW4sIDEgPSBub3JtYWwgZ2FpbikKKyAqIEI2OiAgbXV0ZSAgICAgICAgICAgICAgICAoMSA9IG11dGVkKQorICogQjc6ICBhdXRvLW11dGUgICAgICAgICAgICgxID0gYXV0by1tdXRlIGVuYWJsZWQpCisgKi8KKworI2RlZmluZSBUREE5ODczX0dBSU5fTk9STUFMIDEgPDwgNQorI2RlZmluZSBUREE5ODczX01VVEUgICAgICAgIDEgPDwgNgorI2RlZmluZSBUREE5ODczX0FVVE9NVVRFICAgIDEgPDwgNworCisvKiBTdWJhZGRyZXNzIDB4MDE6ICBBZGp1c3Qvc3RhbmRhcmQgKi8KKworLyogTG93ZXIgNCBiaXRzIChDMy4uQzApIGNvbnRyb2wgc3RlcmVvIGFkanVzdG1lbnQgb24gUiBjaGFubmVsICgtMC42IC0gKzAuNyBkQikKKyAqIFJlY29tbWVuZGVkIHZhbHVlIGlzICswIGRCCisgKi8KKworI2RlZmluZQlUREE5ODczX1NURVJFT19BREoJMHgwNiAvKiAwZEIgZ2FpbiAqLworCisvKiBCaXRzIEM2Li5DNCBjb250cm9sIEZNIHN0YW50YXJkCisgKiBDNiwgQzUsIEM0CisgKiAgMCwgIDAsICAwICAgQi9HIChQQUwgRk0pCisgKiAgMCwgIDAsICAxICAgTQorICogIDAsICAxLCAgMCAgIEQvSygxKQorICogIDAsICAxLCAgMSAgIEQvSygyKQorICogIDEsICAwLCAgMCAgIEQvSygzKQorICogIDEsICAwLCAgMSAgIEkKKyAqLworI2RlZmluZSBUREE5ODczX0JHCQkwCisjZGVmaW5lIFREQTk4NzNfTSAgICAgICAxCisjZGVmaW5lIFREQTk4NzNfREsxICAgICAyCisjZGVmaW5lIFREQTk4NzNfREsyICAgICAzCisjZGVmaW5lIFREQTk4NzNfREszICAgICA0CisjZGVmaW5lIFREQTk4NzNfSSAgICAgICA1CisKKy8qIEM3IGNvbnRyb2xzIGlkZW50aWZpY2F0aW9uIHJlc3BvbnNlIHRpbWUgKDE9ZmFzdC8wPW5vcm1hbCkKKyAqLworI2RlZmluZSBUREE5ODczX0lEUl9OT1JNIDAKKyNkZWZpbmUgVERBOTg3M19JRFJfRkFTVCAxIDw8IDcKKworCisvKiBTdWJhZGRyZXNzIDB4MDI6IFBvcnQgZGF0YSAqLworCisvKiBFMSwgRTAgICBmcmVlIHByb2dyYW1tYWJsZSBwb3J0cyBQMS9QMgorICAgIDAsICAwICAgYm90aCBwb3J0cyBsb3cKKyAgICAwLCAgMSAgIFAxIGhpZ2gKKyAgICAxLCAgMCAgIFAyIGhpZ2gKKyAgICAxLCAgMSAgIGJvdGggcG9ydHMgaGlnaAorKi8KKworI2RlZmluZSBUREE5ODczX1BPUlRTICAgIDMKKworLyogRTI6IHRlc3QgcG9ydCAqLworI2RlZmluZSBUREE5ODczX1RTVF9QT1JUIDEgPDwgMgorCisvKiBFNS4uRTMgY29udHJvbCBtb25vIG91dHB1dCBjaGFubmVsICh0b2dldGhlciB3aXRoIHRyYW5zbWlzc2lvbiBtb2RlIGJpdCBCNCkKKyAqCisgKiBFNSBFNCBFMyBCNCAgICAgT1VUTQorICogIDAgIDAgIDAgIDAgICAgIG1vbm8KKyAqICAwICAwICAxICAwICAgICBEVUFMIEIKKyAqICAwICAxICAwICAxICAgICBtb25vIChmcm9tIHN0ZXJlbyBkZWNvZGVyKQorICovCisjZGVmaW5lIFREQTk4NzNfTU9VVF9NT05PICAgMAorI2RlZmluZSBUREE5ODczX01PVVRfRk1PTk8gIDAKKyNkZWZpbmUgVERBOTg3M19NT1VUX0RVQUxBICAwCisjZGVmaW5lIFREQTk4NzNfTU9VVF9EVUFMQiAgMSA8PCAzCisjZGVmaW5lIFREQTk4NzNfTU9VVF9TVCAgICAgMSA8PCA0CisjZGVmaW5lIFREQTk4NzNfTU9VVF9FWFRNICAgKDEgPDwgNCApICYgKDEgPDwgMykKKyNkZWZpbmUgVERBOTg3M19NT1VUX0VYVEwgICAxIDw8IDUKKyNkZWZpbmUgVERBOTg3M19NT1VUX0VYVFIgICAoMSA8PCA1ICkgJiAoMSA8PCAzKQorI2RlZmluZSBUREE5ODczX01PVVRfRVhUTFIgICgxIDw8IDUgKSAmICgxIDw8IDQpCisjZGVmaW5lIFREQTk4NzNfTU9VVF9NVVRFICAgKDEgPDwgNSApICYgKDEgPDwgNCkgJiAoMSA8PCAzKQorCisvKiBTdGF0dXMgYml0czogKGNoaXAgcmVhZCkgKi8KKyNkZWZpbmUgVERBOTg3M19QT05SICAgICAgICAwIC8qIFBvd2VyLW9uIHJlc2V0IGRldGVjdGVkIGlmID0gMSAqLworI2RlZmluZSBUREE5ODczX1NURVJFTyAgICAgIDIgLyogU3RlcmVvIHNvdW5kIGlzIGlkZW50aWZpZWQgICAgICovCisjZGVmaW5lIFREQTk4NzNfRFVBTCAgICAgICAgNCAvKiBEdWFsIHNvdW5kIGlzIGlkZW50aWZpZWQgICAgICAgKi8KKworc3RhdGljIGludCB0ZGE5ODczX2dldG1vZGUoc3RydWN0IENISVBTVEFURSAqY2hpcCkKK3sKKwlpbnQgdmFsLG1vZGU7CisKKwl2YWwgPSBjaGlwX3JlYWQoY2hpcCk7CisJbW9kZSA9IFZJREVPX1NPVU5EX01PTk87CisJaWYgKHZhbCAmIFREQTk4NzNfU1RFUkVPKQorCQltb2RlIHw9IFZJREVPX1NPVU5EX1NURVJFTzsKKwlpZiAodmFsICYgVERBOTg3M19EVUFMKQorCQltb2RlIHw9IFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CisJZHByaW50ayAoInRkYTk4NzNfZ2V0bW9kZSgpOiByYXcgY2hpcCByZWFkOiAlZCwgcmV0dXJuOiAlZFxuIiwKKwkJIHZhbCwgbW9kZSk7CisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHRkYTk4NzNfc2V0bW9kZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLCBpbnQgbW9kZSkKK3sKKwlpbnQgc3dfZGF0YSAgPSBjaGlwLT5zaGFkb3cuYnl0ZXNbVERBOTg3M19TVysxXSAmIH4gVERBOTg3M19UUl9NQVNLOworCS8qCWludCBhZGpfZGF0YSA9IGNoaXAtPnNoYWRvdy5ieXRlc1tUREE5ODczX0FEKzFdIDsgKi8KKworCWlmICgoc3dfZGF0YSAmIFREQTk4NzNfSU5QX01BU0spICE9IFREQTk4NzNfSU5URVJOQUwpIHsKKwkJZHByaW50aygidGRhOTg3M19zZXRtb2RlKCk6IGV4dGVybmFsIGlucHV0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRwcmludGsoInRkYTk4NzNfc2V0bW9kZSgpOiBjaGlwLT5zaGFkb3cuYnl0ZXNbJWRdID0gJWRcbiIsIFREQTk4NzNfU1crMSwgY2hpcC0+c2hhZG93LmJ5dGVzW1REQTk4NzNfU1crMV0pOworCWRwcmludGsoInRkYTk4NzNfc2V0bW9kZSgpOiBzd19kYXRhICA9ICVkXG4iLCBzd19kYXRhKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgVklERU9fU09VTkRfTU9OTzoKKwkJc3dfZGF0YSB8PSBUREE5ODczX1RSX01PTk87CisJCWJyZWFrOworCWNhc2UgVklERU9fU09VTkRfU1RFUkVPOgorCQlzd19kYXRhIHw9IFREQTk4NzNfVFJfU1RFUkVPOworCQlicmVhazsKKwljYXNlIFZJREVPX1NPVU5EX0xBTkcxOgorCQlzd19kYXRhIHw9IFREQTk4NzNfVFJfRFVBTEE7CisJCWJyZWFrOworCWNhc2UgVklERU9fU09VTkRfTEFORzI6CisJCXN3X2RhdGEgfD0gVERBOTg3M19UUl9EVUFMQjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2hpcC0+bW9kZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzNfU1csIHN3X2RhdGEpOworCWRwcmludGsoInRkYTk4NzNfc2V0bW9kZSgpOiByZXEuIG1vZGUgJWQ7IGNoaXBfd3JpdGU6ICVkXG4iLAorCQltb2RlLCBzd19kYXRhKTsKK30KKworc3RhdGljIGludCB0ZGE5ODczX2NoZWNraXQoc3RydWN0IENISVBTVEFURSAqY2hpcCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoLTEgPT0gKHJjID0gY2hpcF9yZWFkMihjaGlwLDI1NCkpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHJjICYgfjB4MWYpID09IDB4ODA7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogYXVkaW8gY2hpcCBkZXNjcmlwdGlvbiAtIGRlZmluZXMrZnVuY3Rpb25zIGZvciB0ZGE5ODc0aCBhbmQgdGRhOTg3NGEgICAqLworLyogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBTdWJhZGRyZXNzZXMgZm9yIFREQTk4NzRIIGFuZCBUREE5ODc0QSAoc2xhdmUgcngpICovCisjZGVmaW5lIFREQTk4NzRBX0FHQ0dSCQkweDAwCS8qIEFHQyBnYWluICovCisjZGVmaW5lIFREQTk4NzRBX0dDT05SCQkweDAxCS8qIGdlbmVyYWwgY29uZmlnICovCisjZGVmaW5lIFREQTk4NzRBX01TUgkJMHgwMgkvKiBtb25pdG9yIHNlbGVjdCAqLworI2RlZmluZSBUREE5ODc0QV9DMUZSQQkJMHgwMwkvKiBjYXJyaWVyIDEgZnJlcS4gKi8KKyNkZWZpbmUgVERBOTg3NEFfQzFGUkIJCTB4MDQJLyogY2FycmllciAxIGZyZXEuICovCisjZGVmaW5lIFREQTk4NzRBX0MxRlJDCQkweDA1CS8qIGNhcnJpZXIgMSBmcmVxLiAqLworI2RlZmluZSBUREE5ODc0QV9DMkZSQQkJMHgwNgkvKiBjYXJyaWVyIDIgZnJlcS4gKi8KKyNkZWZpbmUgVERBOTg3NEFfQzJGUkIJCTB4MDcJLyogY2FycmllciAyIGZyZXEuICovCisjZGVmaW5lIFREQTk4NzRBX0MyRlJDCQkweDA4CS8qIGNhcnJpZXIgMiBmcmVxLiAqLworI2RlZmluZSBUREE5ODc0QV9EQ1IJCTB4MDkJLyogZGVtb2R1bGF0b3IgY29uZmlnICovCisjZGVmaW5lIFREQTk4NzRBX0ZNRVIJCTB4MGEJLyogRk0gZGUtZW1waGFzaXMgKi8KKyNkZWZpbmUgVERBOTg3NEFfRk1NUgkJMHgwYgkvKiBGTSBkZW1hdHJpeCAqLworI2RlZmluZSBUREE5ODc0QV9DMU9MQVIJCTB4MGMJLyogY2guMSBvdXRwdXQgbGV2ZWwgYWRqLiAqLworI2RlZmluZSBUREE5ODc0QV9DMk9MQVIJCTB4MGQJLyogY2guMiBvdXRwdXQgbGV2ZWwgYWRqLiAqLworI2RlZmluZSBUREE5ODc0QV9OQ09OUgkJMHgwZQkvKiBOSUNBTSBjb25maWcgKi8KKyNkZWZpbmUgVERBOTg3NEFfTk9MQVIJCTB4MGYJLyogTklDQU0gb3V0cHV0IGxldmVsIGFkai4gKi8KKyNkZWZpbmUgVERBOTg3NEFfTkxFTFIJCTB4MTAJLyogTklDQU0gbG93ZXIgZXJyb3IgbGltaXQgKi8KKyNkZWZpbmUgVERBOTg3NEFfTlVFTFIJCTB4MTEJLyogTklDQU0gdXBwZXIgZXJyb3IgbGltaXQgKi8KKyNkZWZpbmUgVERBOTg3NEFfQU1DT05SCQkweDEyCS8qIGF1ZGlvIG11dGUgY29udHJvbCAqLworI2RlZmluZSBUREE5ODc0QV9TREFDT1NSCTB4MTMJLyogc3RlcmVvIERBQyBvdXRwdXQgc2VsZWN0ICovCisjZGVmaW5lIFREQTk4NzRBX0FPU1IJCTB4MTQJLyogYW5hbG9nIG91dHB1dCBzZWxlY3QgKi8KKyNkZWZpbmUgVERBOTg3NEFfREFJQ09OUgkweDE1CS8qIGRpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGNvbmZpZyAqLworI2RlZmluZSBUREE5ODc0QV9JMlNPU1IJCTB4MTYJLyogSTJTLWJ1cyBvdXRwdXQgc2VsZWN0ICovCisjZGVmaW5lIFREQTk4NzRBX0kyU09MQVIJMHgxNwkvKiBJMlMtYnVzIG91dHB1dCBsZXZlbCBhZGouICovCisjZGVmaW5lIFREQTk4NzRBX01EQUNPU1IJMHgxOAkvKiBtb25vIERBQyBvdXRwdXQgc2VsZWN0ICh0ZGE5ODc0YSkgKi8KKyNkZWZpbmUgVERBOTg3NEFfRVNQCQkweEZGCS8qIGVhc3kgc3RhbmRhcmQgcHJvZ3IuICh0ZGE5ODc0YSkgKi8KKworLyogU3ViYWRkcmVzc2VzIGZvciBUREE5ODc0SCBhbmQgVERBOTg3NEEgKHNsYXZlIHR4KSAqLworI2RlZmluZSBUREE5ODc0QV9EU1IJCTB4MDAJLyogZGV2aWNlIHN0YXR1cyAqLworI2RlZmluZSBUREE5ODc0QV9OU1IJCTB4MDEJLyogTklDQU0gc3RhdHVzICovCisjZGVmaW5lIFREQTk4NzRBX05FQ1IJCTB4MDIJLyogTklDQU0gZXJyb3IgY291bnQgKi8KKyNkZWZpbmUgVERBOTg3NEFfRFIxCQkweDAzCS8qIGFkZC4gZGF0YSBMU0IgKi8KKyNkZWZpbmUgVERBOTg3NEFfRFIyCQkweDA0CS8qIGFkZC4gZGF0YSBNU0IgKi8KKyNkZWZpbmUgVERBOTg3NEFfTExSQQkJMHgwNQkvKiBtb25pdG9yIGxldmVsIHJlYWQtb3V0IExTQiAqLworI2RlZmluZSBUREE5ODc0QV9MTFJCCQkweDA2CS8qIG1vbml0b3IgbGV2ZWwgcmVhZC1vdXQgTVNCICovCisjZGVmaW5lIFREQTk4NzRBX1NJRkxSCQkweDA3CS8qIFNJRiBsZXZlbCAqLworI2RlZmluZSBUREE5ODc0QV9UUjIJCTI1MgkvKiB0ZXN0IHJlZy4gMiAqLworI2RlZmluZSBUREE5ODc0QV9UUjEJCTI1MwkvKiB0ZXN0IHJlZy4gMSAqLworI2RlZmluZSBUREE5ODc0QV9ESUMJCTI1NAkvKiBkZXZpY2UgaWQuIGNvZGUgKi8KKyNkZWZpbmUgVERBOTg3NEFfU0lDCQkyNTUJLyogc29mdHdhcmUgaWQuIGNvZGUgKi8KKworCitzdGF0aWMgaW50IHRkYTk4NzRhX21vZGUgPSAxOwkJLyogMDogQTIsIDE6IE5JQ0FNICovCitzdGF0aWMgaW50IHRkYTk4NzRhX0dDT05SID0gMHhjMDsJLyogZGVmYXVsdCBjb25maWcuIGlucHV0IHBpbjogU0lGU0VMPTAgKi8KK3N0YXRpYyBpbnQgdGRhOTg3NGFfTkNPTlIgPSAweDAxOwkvKiBkZWZhdWx0IE5JQ0FNIGNvbmZpZy46IEFNU0VMPTAsQU1VVEU9MSAqLworc3RhdGljIGludCB0ZGE5ODc0YV9FU1AgPSAweDA3OwkJLyogZGVmYXVsdCBzdGFuZGFyZDogTklDQU0gRC9LICovCitzdGF0aWMgaW50IHRkYTk4NzRhX2RpYyA9IC0xOwkJLyogZGV2aWNlIGlkLiBjb2RlICovCisKKy8qIGluc21vZCBvcHRpb25zIGZvciB0ZGE5ODc0YSAqLworc3RhdGljIHVuc2lnbmVkIGludCB0ZGE5ODc0YV9TSUYgICA9IFVOU0VUOworc3RhdGljIHVuc2lnbmVkIGludCB0ZGE5ODc0YV9BTVNFTCA9IFVOU0VUOworc3RhdGljIHVuc2lnbmVkIGludCB0ZGE5ODc0YV9TVEQgICA9IFVOU0VUOworbW9kdWxlX3BhcmFtKHRkYTk4NzRhX1NJRiwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbSh0ZGE5ODc0YV9BTVNFTCwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbSh0ZGE5ODc0YV9TVEQsIGludCwgMDQ0NCk7CisKKy8qCisgKiBpbml0aWFsaXphdGlvbiB0YWJsZSBmb3IgdGRhOTg3NCBkZWNvZGVyOgorICogIC0gY2FycmllciAxIGZyZXEuIHJlZ2lzdGVycyAoMyBieXRlcykKKyAqICAtIGNhcnJpZXIgMiBmcmVxLiByZWdpc3RlcnMgKDMgYnl0ZXMpCisgKiAgLSBkZW11ZHVsYXRvciBjb25maWcgcmVnaXN0ZXIKKyAqICAtIEZNIGRlLWVtcGhhc2lzIHJlZ2lzdGVyIChzbG93IGlkZW50aWZpY2F0aW9uIG1vZGUpCisgKiBOb3RlOiBmcmVxdWVuY3kgcmVnaXN0ZXJzIG11c3QgYmUgd3JpdHRlbiBpbiBzaW5nbGUgaTJjIHRyYW5zZmVyLgorICovCitzdGF0aWMgc3RydWN0IHRkYTk4NzRhX01PREVTIHsKKwljaGFyICpuYW1lOworCWF1ZGlvY21kIGNtZDsKK30gdGRhOTg3NGFfbW9kZWxpc3RbOV0gPSB7CisgIHsJIkEyLCBCL0ciLAorCXsgOSwgeyBUREE5ODc0QV9DMUZSQSwgMHg3MiwweDk1LDB4NTUsIDB4NzcsMHhBMCwweDAwLCAweDAwLDB4MDAgfX0gfSwKKyAgewkiQTIsIE0gKEtvcmVhKSIsCisJeyA5LCB7IFREQTk4NzRBX0MxRlJBLCAweDVELDB4QzAsMHgwMCwgMHg2MiwweDZBLDB4QUEsIDB4MjAsMHgyMiB9fSB9LAorICB7CSJBMiwgRC9LICgxKSIsCisJeyA5LCB7IFREQTk4NzRBX0MxRlJBLCAweDg3LDB4NkEsMHhBQSwgMHg4MiwweDYwLDB4MDAsIDB4MDAsMHgwMCB9fSB9LAorICB7CSJBMiwgRC9LICgyKSIsCisJeyA5LCB7IFREQTk4NzRBX0MxRlJBLCAweDg3LDB4NkEsMHhBQSwgMHg4QywweDc1LDB4NTUsIDB4MDAsMHgwMCB9fSB9LAorICB7CSJBMiwgRC9LICgzKSIsCisJeyA5LCB7IFREQTk4NzRBX0MxRlJBLCAweDg3LDB4NkEsMHhBQSwgMHg3NywweEEwLDB4MDAsIDB4MDAsMHgwMCB9fSB9LAorICB7CSJOSUNBTSwgSSIsCisJeyA5LCB7IFREQTk4NzRBX0MxRlJBLCAweDdELDB4MDAsMHgwMCwgMHg4OCwweDhBLDB4QUEsIDB4MDgsMHgzMyB9fSB9LAorICB7CSJOSUNBTSwgQi9HIiwKKwl7IDksIHsgVERBOTg3NEFfQzFGUkEsIDB4NzIsMHg5NSwweDU1LCAweDc5LDB4RUEsMHhBQSwgMHgwOCwweDMzIH19IH0sCisgIHsJIk5JQ0FNLCBEL0siLCAvKiBkZWZhdWx0ICovCisJeyA5LCB7IFREQTk4NzRBX0MxRlJBLCAweDg3LDB4NkEsMHhBQSwgMHg3OSwweEVBLDB4QUEsIDB4MDgsMHgzMyB9fSB9LAorICB7CSJOSUNBTSwgTCIsCisJeyA5LCB7IFREQTk4NzRBX0MxRlJBLCAweDg3LDB4NkEsMHhBQSwgMHg3OSwweEVBLDB4QUEsIDB4MDksMHgzMyB9fSB9Cit9OworCitzdGF0aWMgaW50IHRkYTk4NzRhX3NldHVwKHN0cnVjdCBDSElQU1RBVEUgKmNoaXApCit7CisJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9BR0NHUiwgMHgwMCk7IC8qIDAgZEIgKi8KKwljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0dDT05SLCB0ZGE5ODc0YV9HQ09OUik7CisJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9NU1IsICh0ZGE5ODc0YV9tb2RlKSA/IDB4MDM6MHgwMik7CisJaWYodGRhOTg3NGFfZGljID09IDB4MTEpIHsKKwkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9GTU1SLCAweDgwKTsKKwl9IGVsc2UgeyAvKiBkaWMgPT0gMHgwNyAqLworCQljaGlwX2NtZChjaGlwLCJ0ZGE5ODc0X21vZGVsaXN0IiwmdGRhOTg3NGFfbW9kZWxpc3RbdGRhOTg3NGFfU1REXS5jbWQpOworCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0ZNTVIsIDB4MDApOworCX0KKwljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0MxT0xBUiwgMHgwMCk7IC8qIDAgZEIgKi8KKwljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0MyT0xBUiwgMHgwMCk7IC8qIDAgZEIgKi8KKwljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX05DT05SLCB0ZGE5ODc0YV9OQ09OUik7CisJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9OT0xBUiwgMHgwMCk7IC8qIDAgZEIgKi8KKwkvKiBOb3RlOiBJZiBzaWduYWwgcXVhbGl0eSBpcyBwb29yIHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgTklDQU0gKi8KKwkvKiBlcnJvciBsaW1pdCByZWdpc3RlcnMgKE5MRUxSIGFuZCBOVUVMUikgdG8gc29tZSBncmVhdGVyIHZhbHVlcy4gKi8KKwkvKiBUaGVuIHRoZSBzb3VuZCB3b3VsZCByZW1haW4gc3RlcmVvLCBidXQgd29uJ3QgYmUgc28gY2xlYXIuICovCisJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9OTEVMUiwgMHgxNCk7IC8qIGRlZmF1bHQgKi8KKwljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX05VRUxSLCAweDUwKTsgLyogZGVmYXVsdCAqLworCisJaWYodGRhOTg3NGFfZGljID09IDB4MTEpIHsKKwkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9BTUNPTlIsIDB4ZjkpOworCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX1NEQUNPU1IsICh0ZGE5ODc0YV9tb2RlKSA/IDB4ODE6MHg4MCk7CisJCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfQU9TUiwgMHg4MCk7CisJCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfTURBQ09TUiwgKHRkYTk4NzRhX21vZGUpID8gMHg4MjoweDgwKTsKKwkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9FU1AsIHRkYTk4NzRhX0VTUCk7CisJfSBlbHNlIHsgLyogZGljID09IDB4MDcgKi8KKwkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9BTUNPTlIsIDB4ZmIpOworCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX1NEQUNPU1IsICh0ZGE5ODc0YV9tb2RlKSA/IDB4ODE6MHg4MCk7CisJCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfQU9TUiwgMHgwMCk7IC8vIG9yIDB4MTAKKwl9CisJZHByaW50aygidGRhOTg3NGFfc2V0dXAoKTogJXMgWzB4JTAyWF0uXG4iLAorCQl0ZGE5ODc0YV9tb2RlbGlzdFt0ZGE5ODc0YV9TVERdLm5hbWUsdGRhOTg3NGFfU1REKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0ZGE5ODc0YV9nZXRtb2RlKHN0cnVjdCBDSElQU1RBVEUgKmNoaXApCit7CisJaW50IGRzcixuc3IsbW9kZTsKKwlpbnQgbmVjcjsgLyoganVzdCBmb3IgZGVidWdnaW5nICovCisKKwltb2RlID0gVklERU9fU09VTkRfTU9OTzsKKworCWlmKC0xID09IChkc3IgPSBjaGlwX3JlYWQyKGNoaXAsVERBOTg3NEFfRFNSKSkpCisJCXJldHVybiBtb2RlOworCWlmKC0xID09IChuc3IgPSBjaGlwX3JlYWQyKGNoaXAsVERBOTg3NEFfTlNSKSkpCisJCXJldHVybiBtb2RlOworCWlmKC0xID09IChuZWNyID0gY2hpcF9yZWFkMihjaGlwLFREQTk4NzRBX05FQ1IpKSkKKwkJcmV0dXJuIG1vZGU7CisKKwkvKiBuZWVkIHRvIHN0b3JlIGRzci9uc3Igc29tZXdoZXJlICovCisJY2hpcC0+c2hhZG93LmJ5dGVzW01BWFJFR1MtMl0gPSBkc3I7CisJY2hpcC0+c2hhZG93LmJ5dGVzW01BWFJFR1MtMV0gPSBuc3I7CisKKwlpZih0ZGE5ODc0YV9tb2RlKSB7CisJCS8qIE5vdGU6IERTUi5SU1NGIGFuZCBEU1IuQU1TVEFUIGJpdHMgYXJlIGFsc28gY2hlY2tlZC4KKwkJICogSWYgTklDQU0gYXV0by1tdXRpbmcgaXMgZW5hYmxlZCwgRFNSLkFNU1RBVD0xIGluZGljYXRlcworCQkgKiB0aGF0IHNvdW5kIGhhcyAodGVtcG9yYXJpbHkpIHN3aXRjaGVkIGZyb20gTklDQU0gdG8KKwkJICogbW9ubyBGTSAob3IgQU0pIG9uIDFzdCBzb3VuZCBjYXJyaWVyIGR1ZSB0byBoaWdoIE5JQ0FNIGJpdAorCQkgKiBlcnJvciBjb3VudC4gU28gaW4gZmFjdCB0aGVyZSBpcyBubyBzdGVyZW8gaW4gdGhpcyBjYXNlIDotKAorCQkgKiBCdXQgY2hhbmdpbmcgdGhlIG1vZGUgdG8gVklERU9fU09VTkRfTU9OTyB3b3VsZCBzd2l0Y2gKKwkJICogZXh0ZXJuYWwgNDA1MiBtdWx0aXBsZXhlciBpbiBhdWRpb19ob29rKCkuCisJCSAqLworI2lmIDAKKwkJaWYoKG5zciAmIDB4MDIpICYmICEoZHNyICYgMHgxMCkpIC8qIE5TUi5TL01CPTEgYW5kIERTUi5BTVNUQVQ9MCAqLworCQkJbW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87CisjZWxzZQorCQlpZihuc3IgJiAweDAyKSAvKiBOU1IuUy9NQj0xICovCisJCQltb2RlIHw9IFZJREVPX1NPVU5EX1NURVJFTzsKKyNlbmRpZgorCQlpZihuc3IgJiAweDAxKSAvKiBOU1IuRC9TQj0xICovCisJCQltb2RlIHw9IFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CisJfSBlbHNlIHsKKwkJaWYoZHNyICYgMHgwMikgLyogRFNSLklEU1RFPTEgKi8KKwkJCW1vZGUgfD0gVklERU9fU09VTkRfU1RFUkVPOworCQlpZihkc3IgJiAweDA0KSAvKiBEU1IuSUREVUE9MSAqLworCQkJbW9kZSB8PSBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOworCX0KKworCWRwcmludGsoInRkYTk4NzRhX2dldG1vZGUoKTogRFNSPTB4JVgsIE5TUj0weCVYLCBORUNSPTB4JVgsIHJldHVybjogJWQuXG4iLAorCQkgZHNyLCBuc3IsIG5lY3IsIG1vZGUpOworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgdm9pZCB0ZGE5ODc0YV9zZXRtb2RlKHN0cnVjdCBDSElQU1RBVEUgKmNoaXAsIGludCBtb2RlKQoreworCS8qIERpc2FibGUvZW5hYmxlIE5JQ0FNIGF1dG8tbXV0aW5nIChiYXNlZCBvbiBEU1IuUlNTRiBzdGF0dXMgYml0KS4gKi8KKwkvKiBJZiBhdXRvLW11dGluZyBpcyBkaXNhYmxlZCwgd2UgY2FuIGhlYXIgYSBzaWduYWwgb2YgZGVncmFkaW5nIHF1YWxpdHkuICovCisJaWYodGRhOTg3NGFfbW9kZSkgeworCQlpZihjaGlwLT5zaGFkb3cuYnl0ZXNbTUFYUkVHUy0yXSAmIDB4MjApIC8qIERTUi5SU1NGPTEgKi8KKwkJCXRkYTk4NzRhX05DT05SICY9IDB4ZmU7IC8qIGVuYWJsZSAqLworCQllbHNlCisJCQl0ZGE5ODc0YV9OQ09OUiB8PSAweDAxOyAvKiBkaXNhYmxlICovCisJCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfTkNPTlIsIHRkYTk4NzRhX05DT05SKTsKKwl9CisKKwkvKiBOb3RlOiBUREE5ODc0QSBzdXBwb3J0cyBhdXRvbWF0aWMgRk0gZGVtYXRyaXhpbmcgKEZNTVIgcmVnaXN0ZXIpCisJICogYW5kIGhhcyBhdXRvLXNlbGVjdCBmdW5jdGlvbiBmb3IgYXVkaW8gb3V0cHV0IChBT1NSIHJlZ2lzdGVyKS4KKwkgKiBPbGQgVERBOTg3NEggZG9lc24ndCBzdXBwb3J0IHRoZXNlIGZlYXR1cmVzLgorCSAqIFREQTk4NzRBIGFsc28gaGFzIGFkZGl0aW9uYWwgbW9ubyBvdXRwdXQgcGluIChPVVRNKSwgd2hpY2gKKwkgKiBvbiBzYW1lIChhbGw/KSB0di1jYXJkcyBpcyBub3QgdXNlZCwgYW55d2F5IChhcyB3ZWxsIGFzIE1PTk9JTikuCisJICovCisJaWYodGRhOTg3NGFfZGljID09IDB4MTEpIHsKKwkJaW50IGFvc3IgPSAweDgwOworCQlpbnQgbWRhY29zciA9ICh0ZGE5ODc0YV9tb2RlKSA/IDB4ODI6MHg4MDsKKworCQlzd2l0Y2gobW9kZSkgeworCQljYXNlIFZJREVPX1NPVU5EX01PTk86CisJCWNhc2UgVklERU9fU09VTkRfU1RFUkVPOgorCQkJYnJlYWs7CisJCWNhc2UgVklERU9fU09VTkRfTEFORzE6CisJCQlhb3NyID0gMHg4MDsgLyogYXV0by1zZWxlY3QsIGR1YWwgQS9BICovCisJCQltZGFjb3NyID0gKHRkYTk4NzRhX21vZGUpID8gMHg4MjoweDgwOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fU09VTkRfTEFORzI6CisJCQlhb3NyID0gMHhhMDsgLyogYXV0by1zZWxlY3QsIGR1YWwgQi9CICovCisJCQltZGFjb3NyID0gKHRkYTk4NzRhX21vZGUpID8gMHg4MzoweDgxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljaGlwLT5tb2RlID0gMDsKKwkJCXJldHVybjsKKwkJfQorCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0FPU1IsIGFvc3IpOworCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX01EQUNPU1IsIG1kYWNvc3IpOworCisJCWRwcmludGsoInRkYTk4NzRhX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBBT1NSPTB4JVgsIE1EQUNPU1I9MHglWC5cbiIsCisJCQltb2RlLCBhb3NyLCBtZGFjb3NyKTsKKworCX0gZWxzZSB7IC8qIGRpYyA9PSAweDA3ICovCisJCWludCBmbW1yLGFvc3I7CisKKwkJc3dpdGNoKG1vZGUpIHsKKwkJY2FzZSBWSURFT19TT1VORF9NT05POgorCQkJZm1tciA9IDB4MDA7IC8qIG1vbm8gKi8KKwkJCWFvc3IgPSAweDEwOyAvKiBBL0EgKi8KKwkJCWJyZWFrOworCQljYXNlIFZJREVPX1NPVU5EX1NURVJFTzoKKwkJCWlmKHRkYTk4NzRhX21vZGUpIHsKKwkJCQlmbW1yID0gMHgwMDsKKwkJCQlhb3NyID0gMHgwMDsgLyogaGFuZGxlZCBieSBOSUNBTSBhdXRvLW11dGUgKi8KKwkJCX0gZWxzZSB7CisJCQkJZm1tciA9ICh0ZGE5ODc0YV9FU1AgPT0gMSkgPyAweDA1IDogMHgwNDsgLyogc3RlcmVvICovCisJCQkJYW9zciA9IDB4MDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19TT1VORF9MQU5HMToKKwkJCWZtbXIgPSAweDAyOyAvKiBkdWFsICovCisJCQlhb3NyID0gMHgxMDsgLyogZHVhbCBBL0EgKi8KKwkJCWJyZWFrOworCQljYXNlIFZJREVPX1NPVU5EX0xBTkcyOgorCQkJZm1tciA9IDB4MDI7IC8qIGR1YWwgKi8KKwkJCWFvc3IgPSAweDIwOyAvKiBkdWFsIEIvQiAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljaGlwLT5tb2RlID0gMDsKKwkJCXJldHVybjsKKwkJfQorCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0ZNTVIsIGZtbXIpOworCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0FPU1IsIGFvc3IpOworCisJCWRwcmludGsoInRkYTk4NzRhX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBGTU1SPTB4JVgsIEFPU1I9MHglWC5cbiIsCisJCQltb2RlLCBmbW1yLCBhb3NyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGRhOTg3NGFfY2hlY2tpdChzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwKQoreworCWludCBkaWMsc2ljOwkvKiBkZXZpY2UgaWQuIGFuZCBzb2Z0d2FyZSBpZC4gY29kZXMgKi8KKworCWlmKC0xID09IChkaWMgPSBjaGlwX3JlYWQyKGNoaXAsVERBOTg3NEFfRElDKSkpCisJCXJldHVybiAwOworCWlmKC0xID09IChzaWMgPSBjaGlwX3JlYWQyKGNoaXAsVERBOTg3NEFfU0lDKSkpCisJCXJldHVybiAwOworCisJZHByaW50aygidGRhOTg3NGFfY2hlY2tpdCgpOiBESUM9MHglWCwgU0lDPTB4JVguXG4iLCBkaWMsIHNpYyk7CisKKwlpZigoZGljID09IDB4MTEpfHwoZGljID09IDB4MDcpKSB7CisJCXByaW50aygidHZhdWRpbzogZm91bmQgdGRhOTg3NCVzLlxuIiwgKGRpYyA9PSAweDExKSA/ICJhIjoiaCIpOworCQl0ZGE5ODc0YV9kaWMgPSBkaWM7CS8qIHJlbWVtYmVyIGRldmljZSBpZC4gKi8KKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOwkvKiBub3QgZm91bmQgKi8KK30KKworc3RhdGljIGludCB0ZGE5ODc0YV9pbml0aWFsaXplKHN0cnVjdCBDSElQU1RBVEUgKmNoaXApCit7CisJaWYgKHRkYTk4NzRhX1NJRiA+IDIpCisJCXRkYTk4NzRhX1NJRiA9IDE7CisJaWYgKHRkYTk4NzRhX1NURCA+PSA4KQorCQl0ZGE5ODc0YV9TVEQgPSAwOworCWlmKHRkYTk4NzRhX0FNU0VMID4gMSkKKwkJdGRhOTg3NGFfQU1TRUwgPSAwOworCisJaWYodGRhOTg3NGFfU0lGID09IDEpCisJCXRkYTk4NzRhX0dDT05SID0gMHhjMDsJLyogc291bmQgSUYgaW5wdXQgMSAqLworCWVsc2UKKwkJdGRhOTg3NGFfR0NPTlIgPSAweGMxOwkvKiBzb3VuZCBJRiBpbnB1dCAyICovCisKKwl0ZGE5ODc0YV9FU1AgPSB0ZGE5ODc0YV9TVEQ7CisJdGRhOTg3NGFfbW9kZSA9ICh0ZGE5ODc0YV9TVEQgPCA1KSA/IDAgOiAxOworCisJaWYodGRhOTg3NGFfQU1TRUwgPT0gMCkKKwkJdGRhOTg3NGFfTkNPTlIgPSAweDAxOyAvKiBhdXRvLW11dGU6IGFuYWxvZyBtb25vIGlucHV0ICovCisJZWxzZQorCQl0ZGE5ODc0YV9OQ09OUiA9IDB4MDU7IC8qIGF1dG8tbXV0ZTogMXN0IGNhcnJpZXIgRk0gb3IgQU0gKi8KKworCXRkYTk4NzRhX3NldHVwKGNoaXApOworCXJldHVybiAwOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGF1ZGlvIGNoaXAgZGVzY3JpcHRpb25zIC0gZGVmaW5lcytmdW5jdGlvbnMgZm9yIHRlYTY0MjAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBURUE2MzAwX1ZMICAgICAgICAgMHgwMCAgLyogdm9sdW1lIGxlZnQgKi8KKyNkZWZpbmUgVEVBNjMwMF9WUiAgICAgICAgIDB4MDEgIC8qIHZvbHVtZSByaWdodCAqLworI2RlZmluZSBURUE2MzAwX0JBICAgICAgICAgMHgwMiAgLyogYmFzcyAqLworI2RlZmluZSBURUE2MzAwX1RSICAgICAgICAgMHgwMyAgLyogdHJlYmxlICovCisjZGVmaW5lIFRFQTYzMDBfRkEgICAgICAgICAweDA0ICAvKiBmYWRlciBjb250cm9sICovCisjZGVmaW5lIFRFQTYzMDBfUyAgICAgICAgICAweDA1ICAvKiBzd2l0Y2ggcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlcyBmb3IgdGhvc2UgcmVnaXN0ZXJzOiAqLworI2RlZmluZSBURUE2MzAwX1NfU0EgICAgICAgMHgwMSAgLyogc3RlcmVvIEEgaW5wdXQgKi8KKyNkZWZpbmUgVEVBNjMwMF9TX1NCICAgICAgIDB4MDIgIC8qIHN0ZXJlbyBCICovCisjZGVmaW5lIFRFQTYzMDBfU19TQyAgICAgICAweDA0ICAvKiBzdGVyZW8gQyAqLworI2RlZmluZSBURUE2MzAwX1NfR01VICAgICAgMHg4MCAgLyogZ2VuZXJhbCBtdXRlICovCisKKyNkZWZpbmUgVEVBNjMyMF9WICAgICAgICAgIDB4MDAgIC8qIHZvbHVtZSAoMC01KS9sb3VkbmVzcyBvZmYgKDYpL3plcm8gY3Jvc3NpbmcgbXV0ZSg3KSAqLworI2RlZmluZSBURUE2MzIwX0ZGUiAgICAgICAgMHgwMSAgLyogZmFkZXIgZnJvbnQgcmlnaHQgKDAtNSkgKi8KKyNkZWZpbmUgVEVBNjMyMF9GRkwgICAgICAgIDB4MDIgIC8qIGZhZGVyIGZyb250IGxlZnQgKDAtNSkgKi8KKyNkZWZpbmUgVEVBNjMyMF9GUlIgICAgICAgIDB4MDMgIC8qIGZhZGVyIHJlYXIgcmlnaHQgKDAtNSkgKi8KKyNkZWZpbmUgVEVBNjMyMF9GUkwgICAgICAgIDB4MDQgIC8qIGZhZGVyIHJlYXIgbGVmdCAoMC01KSAqLworI2RlZmluZSBURUE2MzIwX0JBICAgICAgICAgMHgwNSAgLyogYmFzcyAoMC00KSAqLworI2RlZmluZSBURUE2MzIwX1RSICAgICAgICAgMHgwNiAgLyogdHJlYmxlICgwLTQpICovCisjZGVmaW5lIFRFQTYzMjBfUyAgICAgICAgICAweDA3ICAvKiBzd2l0Y2ggcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlcyBmb3IgdGhvc2UgcmVnaXN0ZXJzOiAqLworI2RlZmluZSBURUE2MzIwX1NfU0EgICAgICAgMHgwNyAgLyogc3RlcmVvIEEgaW5wdXQgKi8KKyNkZWZpbmUgVEVBNjMyMF9TX1NCICAgICAgIDB4MDYgIC8qIHN0ZXJlbyBCICovCisjZGVmaW5lIFRFQTYzMjBfU19TQyAgICAgICAweDA1ICAvKiBzdGVyZW8gQyAqLworI2RlZmluZSBURUE2MzIwX1NfU0QgICAgICAgMHgwNCAgLyogc3RlcmVvIEQgKi8KKyNkZWZpbmUgVEVBNjMyMF9TX0dNVSAgICAgIDB4ODAgIC8qIGdlbmVyYWwgbXV0ZSAqLworCisjZGVmaW5lIFRFQTY0MjBfU19TQSAgICAgICAweDAwICAvKiBzdGVyZW8gQSBpbnB1dCAqLworI2RlZmluZSBURUE2NDIwX1NfU0IgICAgICAgMHgwMSAgLyogc3RlcmVvIEIgKi8KKyNkZWZpbmUgVEVBNjQyMF9TX1NDICAgICAgIDB4MDIgIC8qIHN0ZXJlbyBDICovCisjZGVmaW5lIFRFQTY0MjBfU19TRCAgICAgICAweDAzICAvKiBzdGVyZW8gRCAqLworI2RlZmluZSBURUE2NDIwX1NfU0UgICAgICAgMHgwNCAgLyogc3RlcmVvIEUgKi8KKyNkZWZpbmUgVEVBNjQyMF9TX0dNVSAgICAgIDB4MDUgIC8qIGdlbmVyYWwgbXV0ZSAqLworCitzdGF0aWMgaW50IHRlYTYzMDBfc2hpZnQxMChpbnQgdmFsKSB7IHJldHVybiB2YWwgPj4gMTA7IH0KK3N0YXRpYyBpbnQgdGVhNjMwMF9zaGlmdDEyKGludCB2YWwpIHsgcmV0dXJuIHZhbCA+PiAxMjsgfQorCisvKiBBc3N1bWVzIDE2Yml0IGlucHV0ICh2YWx1ZXMgMHgzZiB0byAweDBjIGFyZSB1bmlxdWUsIHZhbHVlcyBsZXNzIHRoYW4gKi8KKy8qIDB4MGMgbWlycm9yIHRob3NlIGltbWVkaWF0ZWx5IGhpZ2hlcikgKi8KK3N0YXRpYyBpbnQgdGVhNjMyMF92b2x1bWUoaW50IHZhbCkgeyByZXR1cm4gKHZhbCAvICg2NTUzNS8oNjMtMTIpKSArIDEyKSAmIDB4M2Y7IH0KK3N0YXRpYyBpbnQgdGVhNjMyMF9zaGlmdDExKGludCB2YWwpIHsgcmV0dXJuIHZhbCA+PiAxMTsgfQorc3RhdGljIGludCB0ZWE2MzIwX2luaXRpYWxpemUoc3RydWN0IENISVBTVEFURSAqIGNoaXApCit7CisJY2hpcF93cml0ZShjaGlwLCBURUE2MzIwX0ZGUiwgMHgzZik7CisJY2hpcF93cml0ZShjaGlwLCBURUE2MzIwX0ZGTCwgMHgzZik7CisJY2hpcF93cml0ZShjaGlwLCBURUE2MzIwX0ZSUiwgMHgzZik7CisJY2hpcF93cml0ZShjaGlwLCBURUE2MzIwX0ZSTCwgMHgzZik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBhdWRpbyBjaGlwIGRlc2NyaXB0aW9ucyAtIGRlZmluZXMrZnVuY3Rpb25zIGZvciB0ZGE4NDI1ICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVERBODQyNV9WTCAgICAgICAgIDB4MDAgIC8qIHZvbHVtZSBsZWZ0ICovCisjZGVmaW5lIFREQTg0MjVfVlIgICAgICAgICAweDAxICAvKiB2b2x1bWUgcmlnaHQgKi8KKyNkZWZpbmUgVERBODQyNV9CQSAgICAgICAgIDB4MDIgIC8qIGJhc3MgKi8KKyNkZWZpbmUgVERBODQyNV9UUiAgICAgICAgIDB4MDMgIC8qIHRyZWJsZSAqLworI2RlZmluZSBUREE4NDI1X1MxICAgICAgICAgMHgwOCAgLyogc3dpdGNoIGZ1bmN0aW9ucyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFsdWVzIGZvciB0aG9zZSByZWdpc3RlcnM6ICovCisjZGVmaW5lIFREQTg0MjVfUzFfT0ZGICAgICAweEVFICAvKiBhdWRpbyBvZmYgKG11dGUgb24pICovCisjZGVmaW5lIFREQTg0MjVfUzFfQ0gxICAgICAweENFICAvKiBhdWRpbyBjaGFubmVsIDEgKG11dGUgb2ZmKSAtICJsaW5lYXIgc3RlcmVvIiBtb2RlICovCisjZGVmaW5lIFREQTg0MjVfUzFfQ0gyICAgICAweENGICAvKiBhdWRpbyBjaGFubmVsIDIgKG11dGUgb2ZmKSAtICJsaW5lYXIgc3RlcmVvIiBtb2RlICovCisjZGVmaW5lIFREQTg0MjVfUzFfTVUgICAgICAweDIwICAvKiBtdXRlIGJpdCAqLworI2RlZmluZSBUREE4NDI1X1MxX1NURVJFTyAgMHgxOCAgLyogc3RlcmVvIGJpdHMgKi8KKyNkZWZpbmUgVERBODQyNV9TMV9TVEVSRU9fU1BBVElBTCAweDE4IC8qIHNwYXRpYWwgc3RlcmVvICovCisjZGVmaW5lIFREQTg0MjVfUzFfU1RFUkVPX0xJTkVBUiAgMHgwOCAvKiBsaW5lYXIgc3RlcmVvICovCisjZGVmaW5lIFREQTg0MjVfUzFfU1RFUkVPX1BTRVVETyAgMHgxMCAvKiBwc2V1ZG8gc3RlcmVvICovCisjZGVmaW5lIFREQTg0MjVfUzFfU1RFUkVPX01PTk8gICAgMHgwMCAvKiBmb3JjZWQgbW9ubyAqLworI2RlZmluZSBUREE4NDI1X1MxX01MICAgICAgMHgwNiAgICAgICAgLyogbGFuZ3VhZ2Ugc2VsZWN0b3IgKi8KKyNkZWZpbmUgVERBODQyNV9TMV9NTF9TT1VORF9BIDB4MDIgICAgIC8qIHNvdW5kIGEgKi8KKyNkZWZpbmUgVERBODQyNV9TMV9NTF9TT1VORF9CIDB4MDQgICAgIC8qIHNvdW5kIGIgKi8KKyNkZWZpbmUgVERBODQyNV9TMV9NTF9TVEVSRU8gIDB4MDYgICAgIC8qIHN0ZXJlbyAqLworI2RlZmluZSBUREE4NDI1X1MxX0lTICAgICAgMHgwMSAgICAgICAgLyogY2hhbm5lbCBzZWxlY3RvciAqLworCisKK3N0YXRpYyBpbnQgdGRhODQyNV9zaGlmdDEwKGludCB2YWwpIHsgcmV0dXJuICh2YWwgPj4gMTApIHwgMHhjMDsgfQorc3RhdGljIGludCB0ZGE4NDI1X3NoaWZ0MTIoaW50IHZhbCkgeyByZXR1cm4gKHZhbCA+PiAxMikgfCAweGYwOyB9CisKK3N0YXRpYyBpbnQgdGRhODQyNV9pbml0aWFsaXplKHN0cnVjdCBDSElQU1RBVEUgKmNoaXApCit7CisJc3RydWN0IENISVBERVNDICpkZXNjID0gY2hpcGxpc3QgKyBjaGlwLT50eXBlOworCWludCBpbnB1dG1hcFs4XSA9IHsgLyogdHVuZXIJKi8gVERBODQyNV9TMV9DSDIsIC8qIHJhZGlvICAqLyBUREE4NDI1X1MxX0NIMSwKKwkJCSAgICAvKiBleHRlcm4JKi8gVERBODQyNV9TMV9DSDEsIC8qIGludGVybiAqLyBUREE4NDI1X1MxX09GRiwKKwkJCSAgICAvKiBvZmYJKi8gVERBODQyNV9TMV9PRkYsIC8qIG9uICAgICAqLyBUREE4NDI1X1MxX0NIMn07CisKKwlpZiAoY2hpcC0+Yy5hZGFwdGVyLT5pZCA9PSAoSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfUklWQSkpIHsKKwkJbWVtY3B5IChkZXNjLT5pbnB1dG1hcCwgaW5wdXRtYXAsIHNpemVvZiAoaW5wdXRtYXApKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRkYTg0MjVfc2V0bW9kZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLCBpbnQgbW9kZSkKK3sKKwlpbnQgczEgPSBjaGlwLT5zaGFkb3cuYnl0ZXNbVERBODQyNV9TMSsxXSAmIDB4ZTE7CisKKwlpZiAobW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKSB7CisJCXMxIHw9IFREQTg0MjVfUzFfTUxfU09VTkRfQTsKKwkJczEgfD0gVERBODQyNV9TMV9TVEVSRU9fUFNFVURPOworCisJfSBlbHNlIGlmIChtb2RlICYgVklERU9fU09VTkRfTEFORzIpIHsKKwkJczEgfD0gVERBODQyNV9TMV9NTF9TT1VORF9COworCQlzMSB8PSBUREE4NDI1X1MxX1NURVJFT19QU0VVRE87CisKKwl9IGVsc2UgeworCQlzMSB8PSBUREE4NDI1X1MxX01MX1NURVJFTzsKKworCQlpZiAobW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCisJCQlzMSB8PSBUREE4NDI1X1MxX1NURVJFT19NT05POworCQlpZiAobW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKKwkJCXMxIHw9IFREQTg0MjVfUzFfU1RFUkVPX1NQQVRJQUw7CisJfQorCWNoaXBfd3JpdGUoY2hpcCxUREE4NDI1X1MxLHMxKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBhdWRpbyBjaGlwIGRlc2NyaXB0aW9ucyAtIGRlZmluZXMrZnVuY3Rpb25zIGZvciBwaWMxNmM1NCAoUFY5NTEpICAgICAgICovCisKKy8qIHRoZSByZWdpc3RlcnMgb2YgMTZDNTQsIEkyQyBzdWIgYWRkcmVzcy4gKi8KKyNkZWZpbmUgUElDMTZDNTRfUkVHX0tFWV9DT0RFICAgICAweDAxCSAgICAgICAvKiBOb3QgdXNlLiAqLworI2RlZmluZSBQSUMxNkM1NF9SRUdfTUlTQyAgICAgICAgIDB4MDIKKworLyogYml0IGRlZmluaXRpb24gb2YgdGhlIFJFU0VUIHJlZ2lzdGVyLCBJMkMgZGF0YS4gKi8KKyNkZWZpbmUgUElDMTZDNTRfTUlTQ19SRVNFVF9SRU1PVEVfQ1RMIDB4MDEgLyogYml0IDAsIFJlc2V0IHRvIHJlY2VpdmUgdGhlIGtleSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgY29kZSBvZiByZW1vdGUgY29udHJvbGxlciAqLworI2RlZmluZSBQSUMxNkM1NF9NSVNDX01UU19NQUlOICAgICAgICAgMHgwMiAvKiBiaXQgMSAqLworI2RlZmluZSBQSUMxNkM1NF9NSVNDX01UU19TQVAgICAgICAgICAgMHgwNCAvKiBiaXQgMiAqLworI2RlZmluZSBQSUMxNkM1NF9NSVNDX01UU19CT1RIICAgICAgICAgMHgwOCAvKiBiaXQgMyAqLworI2RlZmluZSBQSUMxNkM1NF9NSVNDX1NORF9NVVRFICAgICAgICAgMHgxMCAvKiBiaXQgNCwgTXV0ZSBBdWRpbyhMaW5lLWluIGFuZCBUdW5lcikgKi8KKyNkZWZpbmUgUElDMTZDNTRfTUlTQ19TTkRfTk9UTVVURSAgICAgIDB4MjAgLyogYml0IDUgKi8KKyNkZWZpbmUgUElDMTZDNTRfTUlTQ19TV0lUQ0hfVFVORVIgICAgIDB4NDAgLyogYml0IDYJLCBTd2l0Y2ggdG8gTGluZS1pbiAqLworI2RlZmluZSBQSUMxNkM1NF9NSVNDX1NXSVRDSF9MSU5FICAgICAgMHg4MCAvKiBiaXQgNwksIFN3aXRjaCB0byBUdW5lciAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBhdWRpbyBjaGlwIGRlc2NyaXB0aW9ucyAtIGRlZmluZXMrZnVuY3Rpb25zIGZvciBUQTg4NzRaICAgICAgICAgICAgICAgICovCisKKy8vIHdyaXRlIDFzdCBieXRlCisjZGVmaW5lIFRBODg3NFpfTEVEX1NURQkweDgwCisjZGVmaW5lIFRBODg3NFpfTEVEX0JJTAkweDQwCisjZGVmaW5lIFRBODg3NFpfTEVEX0VYVAkweDIwCisjZGVmaW5lIFRBODg3NFpfTU9OT19TRVQJMHgxMAorI2RlZmluZSBUQTg4NzRaX01VVEUJMHgwOAorI2RlZmluZSBUQTg4NzRaX0ZfTU9OTwkweDA0CisjZGVmaW5lIFRBODg3NFpfTU9ERV9TVUIJMHgwMgorI2RlZmluZSBUQTg4NzRaX01PREVfTUFJTgkweDAxCisKKy8vIHdyaXRlIDJuZCBieXRlCisvLyNkZWZpbmUgVEE4ODc0Wl9USQkweDgwICAvLyB0ZXN0IG1vZGUKKyNkZWZpbmUgVEE4ODc0Wl9TRVBBUkFUSU9OCTB4M2YKKyNkZWZpbmUgVEE4ODc0Wl9TRVBBUkFUSU9OX0RFRkFVTFQJMHgxMAorCisvLyByZWFkCisjZGVmaW5lIFRBODg3NFpfQjEJMHg4MAorI2RlZmluZSBUQTg4NzRaX0IwCTB4NDAKKyNkZWZpbmUgVEE4ODc0Wl9DSEFHX0ZMQUcJMHgyMAorCisvLyAgICAgICAgQjEgQjAKKy8vIG1vbm8gICAgTCAgSAorLy8gc3RlcmVvICBMICBMCisvLyBCSUwgICAgIEggIEwKKworc3RhdGljIGludCB0YTg4NzR6X2dldG1vZGUoc3RydWN0IENISVBTVEFURSAqY2hpcCkKK3sKKwlpbnQgdmFsLCBtb2RlOworCisJdmFsID0gY2hpcF9yZWFkKGNoaXApOworCW1vZGUgPSBWSURFT19TT1VORF9NT05POworCWlmICh2YWwgJiBUQTg4NzRaX0IxKXsKKwkJbW9kZSB8PSBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOworCX1lbHNlIGlmICghKHZhbCAmIFRBODg3NFpfQjApKXsKKwkJbW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87CisJfQorCS8vZHByaW50ayAoInRhODg3NHpfZ2V0bW9kZSgpOiByYXcgY2hpcCByZWFkOiAweCUwMngsIHJldHVybjogMHglMDJ4XG4iLCB2YWwsIG1vZGUpOworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgYXVkaW9jbWQgdGE4ODc0el9zdGVyZW8gPSB7IDIsIHswLCBUQTg4NzRaX1NFUEFSQVRJT05fREVGQVVMVH19Oworc3RhdGljIGF1ZGlvY21kIHRhODg3NHpfbW9ubyA9IHsyLCB7IFRBODg3NFpfTU9OT19TRVQsIFRBODg3NFpfU0VQQVJBVElPTl9ERUZBVUxUfX07CitzdGF0aWMgYXVkaW9jbWQgdGE4ODc0el9tYWluID0gezIsIHsgMCwgVEE4ODc0Wl9TRVBBUkFUSU9OX0RFRkFVTFR9fTsKK3N0YXRpYyBhdWRpb2NtZCB0YTg4NzR6X3N1YiA9IHsyLCB7IFRBODg3NFpfTU9ERV9TVUIsIFRBODg3NFpfU0VQQVJBVElPTl9ERUZBVUxUfX07CisKK3N0YXRpYyB2b2lkIHRhODg3NHpfc2V0bW9kZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLCBpbnQgbW9kZSkKK3sKKwlpbnQgdXBkYXRlID0gMTsKKwlhdWRpb2NtZCAqdCA9IE5VTEw7CisJZHByaW50aygidGE4ODc0el9zZXRtb2RlKCk6IG1vZGU6IDB4JTAyeFxuIiwgbW9kZSk7CisKKwlzd2l0Y2gobW9kZSl7CisJY2FzZSBWSURFT19TT1VORF9NT05POgorCQl0ID0gJnRhODg3NHpfbW9ubzsKKwkJYnJlYWs7CisJY2FzZSBWSURFT19TT1VORF9TVEVSRU86CisJCXQgPSAmdGE4ODc0el9zdGVyZW87CisJCWJyZWFrOworCWNhc2UgVklERU9fU09VTkRfTEFORzE6CisJCXQgPSAmdGE4ODc0el9tYWluOworCQlicmVhazsKKwljYXNlIFZJREVPX1NPVU5EX0xBTkcyOgorCQl0ID0gJnRhODg3NHpfc3ViOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1cGRhdGUgPSAwOworCX0KKworCWlmKHVwZGF0ZSkKKwkJY2hpcF9jbWQoY2hpcCwgIlRBODg3NFoiLCB0KTsKK30KKworc3RhdGljIGludCB0YTg4NzR6X2NoZWNraXQoc3RydWN0IENISVBTVEFURSAqY2hpcCkKK3sKKwlpbnQgcmM7CisJcmMgPSBjaGlwX3JlYWQoY2hpcCk7CisJcmV0dXJuICgocmMgJiAweDFmKSA9PSAweDFmKSA/IDEgOiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBhdWRpbyBjaGlwIGRlc2NyaXB0aW9ucyAtIHN0cnVjdCBDSElQREVTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIGluc21vZCBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlIGluZGl2aWR1YWwgYXVkaW8gY2hpcHMgKi8KK2ludCB0ZGE4NDI1ICA9IDE7CitpbnQgdGRhOTg0MCAgPSAxOworaW50IHRkYTk4NTAgID0gMTsKK2ludCB0ZGE5ODU1ICA9IDE7CitpbnQgdGRhOTg3MyAgPSAxOworaW50IHRkYTk4NzRhID0gMTsKK2ludCB0ZWE2MzAwICA9IDA7ICAvLyBhZGRyZXNzIGNsYXNoIHdpdGggbXNwMzR4eAoraW50IHRlYTYzMjAgID0gMDsgIC8vIGFkZHJlc3MgY2xhc2ggd2l0aCBtc3AzNHh4CitpbnQgdGVhNjQyMCAgPSAxOworaW50IHBpYzE2YzU0ID0gMTsKK2ludCB0YTg4NzR6ICA9IDA7ICAvLyBhZGRyZXNzIGNsYXNoIHdpdGggdGRhOTg0MAorCittb2R1bGVfcGFyYW0odGRhODQyNSwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbSh0ZGE5ODQwLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHRkYTk4NTAsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0odGRhOTg1NSwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbSh0ZGE5ODczLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHRkYTk4NzRhLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHRlYTYzMDAsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0odGVhNjMyMCwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbSh0ZWE2NDIwLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHBpYzE2YzU0LCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHRhODg3NHosIGludCwgMDQ0NCk7CisKK3N0YXRpYyBzdHJ1Y3QgQ0hJUERFU0MgY2hpcGxpc3RbXSA9IHsKKwl7CisJCS5uYW1lICAgICAgID0gInRkYTk4NDAiLAorCQkuaWQgICAgICAgICA9IEkyQ19EUklWRVJJRF9UREE5ODQwLAorCQkuaW5zbW9kb3B0ICA9ICZ0ZGE5ODQwLAorCQkuYWRkcl9sbyAgICA9IEkyQ19UREE5ODQwID4+IDEsCisJCS5hZGRyX2hpICAgID0gSTJDX1REQTk4NDAgPj4gMSwKKwkJLnJlZ2lzdGVycyAgPSA1LAorCisJCS5nZXRtb2RlICAgID0gdGRhOTg0MF9nZXRtb2RlLAorCQkuc2V0bW9kZSAgICA9IHRkYTk4NDBfc2V0bW9kZSwKKwkJLmNoZWNrbW9kZSAgPSBnZW5lcmljX2NoZWNrbW9kZSwKKworCSAgICAgICAgLmluaXQgICAgICAgPSB7IDIsIHsgVERBOTg0MF9URVNULCBUREE5ODQwX1RFU1RfSU5UMVNOCisJCQkJLyogLFREQTk4NDBfU1csIFREQTk4NDBfTU9OTyAqL30gfQorCX0sCisJeworCQkubmFtZSAgICAgICA9ICJ0ZGE5ODczaCIsCisJCS5pZCAgICAgICAgID0gSTJDX0RSSVZFUklEX1REQTk4NzMsCisJCS5jaGVja2l0ICAgID0gdGRhOTg3M19jaGVja2l0LAorCQkuaW5zbW9kb3B0ICA9ICZ0ZGE5ODczLAorCQkuYWRkcl9sbyAgICA9IEkyQ19UREE5ODV4X0wgPj4gMSwKKwkJLmFkZHJfaGkgICAgPSBJMkNfVERBOTg1eF9IID4+IDEsCisJCS5yZWdpc3RlcnMgID0gMywKKwkJLmZsYWdzICAgICAgPSBDSElQX0hBU19JTlBVVFNFTCwKKworCQkuZ2V0bW9kZSAgICA9IHRkYTk4NzNfZ2V0bW9kZSwKKwkJLnNldG1vZGUgICAgPSB0ZGE5ODczX3NldG1vZGUsCisJCS5jaGVja21vZGUgID0gZ2VuZXJpY19jaGVja21vZGUsCisKKwkJLmluaXQgICAgICAgPSB7IDQsIHsgVERBOTg3M19TVywgMHhhNCwgMHgwNiwgMHgwMyB9IH0sCisJCS5pbnB1dHJlZyAgID0gVERBOTg3M19TVywKKwkJLmlucHV0bXV0ZSAgPSBUREE5ODczX01VVEUgfCBUREE5ODczX0FVVE9NVVRFLAorCQkuaW5wdXRtYXAgICA9IHsweGEwLCAweGEyLCAweGEwLCAweGEwLCAweGMwfSwKKwkJLmlucHV0bWFzayAgPSBUREE5ODczX0lOUF9NQVNLfFREQTk4NzNfTVVURXxUREE5ODczX0FVVE9NVVRFLAorCisJfSwKKwl7CisJCS5uYW1lICAgICAgID0gInRkYTk4NzRoL2EiLAorCQkuaWQgICAgICAgICA9IEkyQ19EUklWRVJJRF9UREE5ODc0LAorCQkuY2hlY2tpdCAgICA9IHRkYTk4NzRhX2NoZWNraXQsCisJCS5pbml0aWFsaXplID0gdGRhOTg3NGFfaW5pdGlhbGl6ZSwKKwkJLmluc21vZG9wdCAgPSAmdGRhOTg3NGEsCisJCS5hZGRyX2xvICAgID0gSTJDX1REQTk4NzQgPj4gMSwKKwkJLmFkZHJfaGkgICAgPSBJMkNfVERBOTg3NCA+PiAxLAorCisJCS5nZXRtb2RlICAgID0gdGRhOTg3NGFfZ2V0bW9kZSwKKwkJLnNldG1vZGUgICAgPSB0ZGE5ODc0YV9zZXRtb2RlLAorCQkuY2hlY2ttb2RlICA9IGdlbmVyaWNfY2hlY2ttb2RlLAorCX0sCisJeworCQkubmFtZSAgICAgICA9ICJ0ZGE5ODUwIiwKKwkJLmlkICAgICAgICAgPSBJMkNfRFJJVkVSSURfVERBOTg1MCwKKwkJLmluc21vZG9wdCAgPSAmdGRhOTg1MCwKKwkJLmFkZHJfbG8gICAgPSBJMkNfVERBOTg1eF9MID4+IDEsCisJCS5hZGRyX2hpICAgID0gSTJDX1REQTk4NXhfSCA+PiAxLAorCQkucmVnaXN0ZXJzICA9IDExLAorCisJCS5nZXRtb2RlICAgID0gdGRhOTg1eF9nZXRtb2RlLAorCQkuc2V0bW9kZSAgICA9IHRkYTk4NXhfc2V0bW9kZSwKKworCQkuaW5pdCAgICAgICA9IHsgOCwgeyBUREE5ODUwX0M0LCAweDA4LCAweDA4LCBUREE5ODV4X1NURVJFTywgMHgwNywgMHgxMCwgMHgxMCwgMHgwMyB9IH0KKwl9LAorCXsKKwkJLm5hbWUgICAgICAgPSAidGRhOTg1NSIsCisJCS5pZCAgICAgICAgID0gSTJDX0RSSVZFUklEX1REQTk4NTUsCisJCS5pbnNtb2RvcHQgID0gJnRkYTk4NTUsCisJCS5hZGRyX2xvICAgID0gSTJDX1REQTk4NXhfTCA+PiAxLAorCQkuYWRkcl9oaSAgICA9IEkyQ19UREE5ODV4X0ggPj4gMSwKKwkJLnJlZ2lzdGVycyAgPSAxMSwKKwkJLmZsYWdzICAgICAgPSBDSElQX0hBU19WT0xVTUUgfCBDSElQX0hBU19CQVNTVFJFQkxFLAorCisJCS5sZWZ0cmVnICAgID0gVERBOTg1NV9WTCwKKwkJLnJpZ2h0cmVnICAgPSBUREE5ODU1X1ZSLAorCQkuYmFzc3JlZyAgICA9IFREQTk4NTVfQkEsCisJCS50cmVibGVyZWcgID0gVERBOTg1NV9UUiwKKwkJLnZvbGZ1bmMgICAgPSB0ZGE5ODU1X3ZvbHVtZSwKKwkJLmJhc3NmdW5jICAgPSB0ZGE5ODU1X2Jhc3MsCisJCS50cmVibGVmdW5jID0gdGRhOTg1NV90cmVibGUsCisKKwkJLmdldG1vZGUgICAgPSB0ZGE5ODV4X2dldG1vZGUsCisJCS5zZXRtb2RlICAgID0gdGRhOTg1eF9zZXRtb2RlLAorCisJCS5pbml0ICAgICAgID0geyAxMiwgeyAwLCAweDZmLCAweDZmLCAweDBlLCAweDA3PDwxLCAweDg8PDIsCisJCQkJICAgIFREQTk4NTVfTVVURSB8IFREQTk4NTVfQVZMIHwgVERBOTg1NV9MT1VEIHwgVERBOTg1NV9JTlQsCisJCQkJICAgIFREQTk4NXhfU1RFUkVPIHwgVERBOTg1NV9MSU5FQVIgfCBUREE5ODU1X1RaQ00gfCBUREE5ODU1X1ZaQ00sCisJCQkJICAgIDB4MDcsIDB4MTAsIDB4MTAsIDB4MDMgfX0KKwl9LAorCXsKKwkJLm5hbWUgICAgICAgPSAidGVhNjMwMCIsCisJCS5pZCAgICAgICAgID0gSTJDX0RSSVZFUklEX1RFQTYzMDAsCisJCS5pbnNtb2RvcHQgID0gJnRlYTYzMDAsCisJCS5hZGRyX2xvICAgID0gSTJDX1RFQTYzMDAgPj4gMSwKKwkJLmFkZHJfaGkgICAgPSBJMkNfVEVBNjMwMCA+PiAxLAorCQkucmVnaXN0ZXJzICA9IDYsCisJCS5mbGFncyAgICAgID0gQ0hJUF9IQVNfVk9MVU1FIHwgQ0hJUF9IQVNfQkFTU1RSRUJMRSB8IENISVBfSEFTX0lOUFVUU0VMLAorCisJCS5sZWZ0cmVnICAgID0gVEVBNjMwMF9WUiwKKwkJLnJpZ2h0cmVnICAgPSBURUE2MzAwX1ZMLAorCQkuYmFzc3JlZyAgICA9IFRFQTYzMDBfQkEsCisJCS50cmVibGVyZWcgID0gVEVBNjMwMF9UUiwKKwkJLnZvbGZ1bmMgICAgPSB0ZWE2MzAwX3NoaWZ0MTAsCisJCS5iYXNzZnVuYyAgID0gdGVhNjMwMF9zaGlmdDEyLAorCQkudHJlYmxlZnVuYyA9IHRlYTYzMDBfc2hpZnQxMiwKKworCQkuaW5wdXRyZWcgICA9IFRFQTYzMDBfUywKKwkJLmlucHV0bWFwICAgPSB7IFRFQTYzMDBfU19TQSwgVEVBNjMwMF9TX1NCLCBURUE2MzAwX1NfU0MgfSwKKwkJLmlucHV0bXV0ZSAgPSBURUE2MzAwX1NfR01VLAorCX0sCisJeworCQkubmFtZSAgICAgICA9ICJ0ZWE2MzIwIiwKKwkJLmlkICAgICAgICAgPSBJMkNfRFJJVkVSSURfVEVBNjMwMCwKKwkJLmluaXRpYWxpemUgPSB0ZWE2MzIwX2luaXRpYWxpemUsCisJCS5pbnNtb2RvcHQgID0gJnRlYTYzMjAsCisJCS5hZGRyX2xvICAgID0gSTJDX1RFQTYzMDAgPj4gMSwKKwkJLmFkZHJfaGkgICAgPSBJMkNfVEVBNjMwMCA+PiAxLAorCQkucmVnaXN0ZXJzICA9IDgsCisJCS5mbGFncyAgICAgID0gQ0hJUF9IQVNfVk9MVU1FIHwgQ0hJUF9IQVNfQkFTU1RSRUJMRSB8IENISVBfSEFTX0lOUFVUU0VMLAorCisJCS5sZWZ0cmVnICAgID0gVEVBNjMyMF9WLAorCQkucmlnaHRyZWcgICA9IFRFQTYzMjBfViwKKwkJLmJhc3NyZWcgICAgPSBURUE2MzIwX0JBLAorCQkudHJlYmxlcmVnICA9IFRFQTYzMjBfVFIsCisJCS52b2xmdW5jICAgID0gdGVhNjMyMF92b2x1bWUsCisJCS5iYXNzZnVuYyAgID0gdGVhNjMyMF9zaGlmdDExLAorCQkudHJlYmxlZnVuYyA9IHRlYTYzMjBfc2hpZnQxMSwKKworCQkuaW5wdXRyZWcgICA9IFRFQTYzMjBfUywKKwkJLmlucHV0bWFwICAgPSB7IFRFQTYzMjBfU19TQSwgVEVBNjQyMF9TX1NCLCBURUE2MzAwX1NfU0MsIFRFQTYzMjBfU19TRCB9LAorCQkuaW5wdXRtdXRlICA9IFRFQTYzMDBfU19HTVUsCisJfSwKKwl7CisJCS5uYW1lICAgICAgID0gInRlYTY0MjAiLAorCQkuaWQgICAgICAgICA9IEkyQ19EUklWRVJJRF9URUE2NDIwLAorCQkuaW5zbW9kb3B0ICA9ICZ0ZWE2NDIwLAorCQkuYWRkcl9sbyAgICA9IEkyQ19URUE2NDIwID4+IDEsCisJCS5hZGRyX2hpICAgID0gSTJDX1RFQTY0MjAgPj4gMSwKKwkJLnJlZ2lzdGVycyAgPSAxLAorCQkuZmxhZ3MgICAgICA9IENISVBfSEFTX0lOUFVUU0VMLAorCisJCS5pbnB1dHJlZyAgID0gLTEsCisJCS5pbnB1dG1hcCAgID0geyBURUE2NDIwX1NfU0EsIFRFQTY0MjBfU19TQiwgVEVBNjQyMF9TX1NDIH0sCisJCS5pbnB1dG11dGUgID0gVEVBNjMwMF9TX0dNVSwKKwl9LAorCXsKKwkJLm5hbWUgICAgICAgPSAidGRhODQyNSIsCisJCS5pZCAgICAgICAgID0gSTJDX0RSSVZFUklEX1REQTg0MjUsCisJCS5pbnNtb2RvcHQgID0gJnRkYTg0MjUsCisJCS5hZGRyX2xvICAgID0gSTJDX1REQTg0MjUgPj4gMSwKKwkJLmFkZHJfaGkgICAgPSBJMkNfVERBODQyNSA+PiAxLAorCQkucmVnaXN0ZXJzICA9IDksCisJCS5mbGFncyAgICAgID0gQ0hJUF9IQVNfVk9MVU1FIHwgQ0hJUF9IQVNfQkFTU1RSRUJMRSB8IENISVBfSEFTX0lOUFVUU0VMLAorCisJCS5sZWZ0cmVnICAgID0gVERBODQyNV9WTCwKKwkJLnJpZ2h0cmVnICAgPSBUREE4NDI1X1ZSLAorCQkuYmFzc3JlZyAgICA9IFREQTg0MjVfQkEsCisJCS50cmVibGVyZWcgID0gVERBODQyNV9UUiwKKwkJLnZvbGZ1bmMgICAgPSB0ZGE4NDI1X3NoaWZ0MTAsCisJCS5iYXNzZnVuYyAgID0gdGRhODQyNV9zaGlmdDEyLAorCQkudHJlYmxlZnVuYyA9IHRkYTg0MjVfc2hpZnQxMiwKKworCQkuaW5wdXRyZWcgICA9IFREQTg0MjVfUzEsCisJCS5pbnB1dG1hcCAgID0geyBUREE4NDI1X1MxX0NIMSwgVERBODQyNV9TMV9DSDEsIFREQTg0MjVfUzFfQ0gxIH0sCisJCS5pbnB1dG11dGUgID0gVERBODQyNV9TMV9PRkYsCisKKwkJLnNldG1vZGUgICAgPSB0ZGE4NDI1X3NldG1vZGUsCisJCS5pbml0aWFsaXplID0gdGRhODQyNV9pbml0aWFsaXplLAorCX0sCisJeworCQkubmFtZSAgICAgICA9ICJwaWMxNmM1NCAoUFY5NTEpIiwKKwkJLmlkICAgICAgICAgPSBJMkNfRFJJVkVSSURfUElDMTZDNTRfUFY5NTEsCisJCS5pbnNtb2RvcHQgID0gJnBpYzE2YzU0LAorCQkuYWRkcl9sbyAgICA9IEkyQ19QSUMxNkM1NCA+PiAxLAorCQkuYWRkcl9oaSAgICA9IEkyQ19QSUMxNkM1ND4+IDEsCisJCS5yZWdpc3RlcnMgID0gMiwKKwkJLmZsYWdzICAgICAgPSBDSElQX0hBU19JTlBVVFNFTCwKKworCQkuaW5wdXRyZWcgICA9IFBJQzE2QzU0X1JFR19NSVNDLAorCQkuaW5wdXRtYXAgICA9IHtQSUMxNkM1NF9NSVNDX1NORF9OT1RNVVRFfFBJQzE2QzU0X01JU0NfU1dJVENIX1RVTkVSLAorCQkJICAgICBQSUMxNkM1NF9NSVNDX1NORF9OT1RNVVRFfFBJQzE2QzU0X01JU0NfU1dJVENIX0xJTkUsCisJCQkgICAgIFBJQzE2QzU0X01JU0NfU05EX05PVE1VVEV8UElDMTZDNTRfTUlTQ19TV0lUQ0hfTElORSwKKwkJCSAgICAgUElDMTZDNTRfTUlTQ19TTkRfTVVURSxQSUMxNkM1NF9NSVNDX1NORF9NVVRFLAorCQkJICAgICBQSUMxNkM1NF9NSVNDX1NORF9OT1RNVVRFfSwKKwkJLmlucHV0bXV0ZSAgPSBQSUMxNkM1NF9NSVNDX1NORF9NVVRFLAorCX0sCisJeworCQkubmFtZSAgICAgICA9ICJ0YTg4NzR6IiwKKwkJLmlkICAgICAgICAgPSAtMSwKKwkJLy8uaWQgICAgICAgICA9IEkyQ19EUklWRVJJRF9UQTg4NzRaLAorCQkuY2hlY2tpdCAgICA9IHRhODg3NHpfY2hlY2tpdCwKKwkJLmluc21vZG9wdCAgPSAmdGE4ODc0eiwKKwkJLmFkZHJfbG8gICAgPSBJMkNfVERBOTg0MCA+PiAxLAorCQkuYWRkcl9oaSAgICA9IEkyQ19UREE5ODQwID4+IDEsCisJCS5yZWdpc3RlcnMgID0gMiwKKworCQkuZ2V0bW9kZSAgICA9IHRhODg3NHpfZ2V0bW9kZSwKKwkJLnNldG1vZGUgICAgPSB0YTg4NzR6X3NldG1vZGUsCisJCS5jaGVja21vZGUgID0gZ2VuZXJpY19jaGVja21vZGUsCisKKwkgICAgICAgIC5pbml0ICAgICAgID0gezIsIHsgVEE4ODc0Wl9NT05PX1NFVCwgVEE4ODc0Wl9TRVBBUkFUSU9OX0RFRkFVTFR9fSwKKwl9LAorCXsgLm5hbWUgPSBOVUxMIH0gLyogRU9GICovCit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGkyYyByZWdpc3RyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGludCBjaGlwX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwOworCXN0cnVjdCBDSElQREVTQyAgKmRlc2M7CisKKwljaGlwID0ga21hbGxvYyhzaXplb2YoKmNoaXApLEdGUF9LRVJORUwpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGNoaXAsMCxzaXplb2YoKmNoaXApKTsKKwltZW1jcHkoJmNoaXAtPmMsJmNsaWVudF90ZW1wbGF0ZSxzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKKyAgICAgICAgY2hpcC0+Yy5hZGFwdGVyID0gYWRhcDsKKyAgICAgICAgY2hpcC0+Yy5hZGRyID0gYWRkcjsKKwlpMmNfc2V0X2NsaWVudGRhdGEoJmNoaXAtPmMsIGNoaXApOworCisJLyogZmluZCBkZXNjcmlwdGlvbiBmb3IgdGhlIGNoaXAgKi8KKwlkcHJpbnRrKCJ0dmF1ZGlvOiBjaGlwIGZvdW5kIEAgaTJjLWFkZHI9MHgleFxuIiwgYWRkcjw8MSk7CisJZm9yIChkZXNjID0gY2hpcGxpc3Q7IGRlc2MtPm5hbWUgIT0gTlVMTDsgZGVzYysrKSB7CisJCWlmICgwID09ICooZGVzYy0+aW5zbW9kb3B0KSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYWRkciA8IGRlc2MtPmFkZHJfbG8gfHwKKwkJICAgIGFkZHIgPiBkZXNjLT5hZGRyX2hpKQorCQkJY29udGludWU7CisJCWlmIChkZXNjLT5jaGVja2l0ICYmICFkZXNjLT5jaGVja2l0KGNoaXApKQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKwlpZiAoZGVzYy0+bmFtZSA9PSBOVUxMKSB7CisJCWRwcmludGsoInR2YXVkaW86IG5vIG1hdGNoaW5nIGNoaXAgZGVzY3JpcHRpb24gZm91bmRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHJpbnRrKCJ0dmF1ZGlvOiBmb3VuZCAlcyBAIDB4JXhcbiIsIGRlc2MtPm5hbWUsIGFkZHI8PDEpOworCWRwcmludGsoInR2YXVkaW86IG1hdGNoZXM6JXMlcyVzLlxuIiwKKwkJKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfVk9MVU1FKSAgICAgPyAiIHZvbHVtZSIgICAgICA6ICIiLAorCQkoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19CQVNTVFJFQkxFKSA/ICIgYmFzcy90cmVibGUiIDogIiIsCisJCShkZXNjLT5mbGFncyAmIENISVBfSEFTX0lOUFVUU0VMKSAgID8gIiBhdWRpb211eCIgICAgOiAiIik7CisKKwkvKiBmaWxsIHJlcXVpcmVkIGRhdGEgc3RydWN0dXJlcyAqLworCXN0cmNweShpMmNfY2xpZW50bmFtZSgmY2hpcC0+YyksZGVzYy0+bmFtZSk7CisJY2hpcC0+dHlwZSA9IGRlc2MtY2hpcGxpc3Q7CisJY2hpcC0+c2hhZG93LmNvdW50ID0gZGVzYy0+cmVnaXN0ZXJzKzE7CisgICAgICAgIGNoaXAtPnByZXZtb2RlID0gLTE7CisJLyogcmVnaXN0ZXIgKi8KKwlpMmNfYXR0YWNoX2NsaWVudCgmY2hpcC0+Yyk7CisKKwkvKiBpbml0aWFsaXphdGlvbiAgKi8KKwlpZiAoZGVzYy0+aW5pdGlhbGl6ZSAhPSBOVUxMKQorCQlkZXNjLT5pbml0aWFsaXplKGNoaXApOworCWVsc2UKKwkJY2hpcF9jbWQoY2hpcCwiaW5pdCIsJmRlc2MtPmluaXQpOworCisJaWYgKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfVk9MVU1FKSB7CisJCWNoaXAtPmxlZnQgICA9IGRlc2MtPmxlZnRpbml0ICAgPyBkZXNjLT5sZWZ0aW5pdCAgIDogNjU1MzU7CisJCWNoaXAtPnJpZ2h0ICA9IGRlc2MtPnJpZ2h0aW5pdCAgPyBkZXNjLT5yaWdodGluaXQgIDogNjU1MzU7CisJCWNoaXBfd3JpdGUoY2hpcCxkZXNjLT5sZWZ0cmVnLGRlc2MtPnZvbGZ1bmMoY2hpcC0+bGVmdCkpOworCQljaGlwX3dyaXRlKGNoaXAsZGVzYy0+cmlnaHRyZWcsZGVzYy0+dm9sZnVuYyhjaGlwLT5yaWdodCkpOworCX0KKwlpZiAoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19CQVNTVFJFQkxFKSB7CisJCWNoaXAtPnRyZWJsZSA9IGRlc2MtPnRyZWJsZWluaXQgPyBkZXNjLT50cmVibGVpbml0IDogMzI3Njg7CisJCWNoaXAtPmJhc3MgICA9IGRlc2MtPmJhc3Npbml0ICAgPyBkZXNjLT5iYXNzaW5pdCAgIDogMzI3Njg7CisJCWNoaXBfd3JpdGUoY2hpcCxkZXNjLT5iYXNzcmVnLGRlc2MtPmJhc3NmdW5jKGNoaXAtPmJhc3MpKTsKKwkJY2hpcF93cml0ZShjaGlwLGRlc2MtPnRyZWJsZXJlZyxkZXNjLT50cmVibGVmdW5jKGNoaXAtPnRyZWJsZSkpOworCX0KKworCWNoaXAtPnRwaWQgPSAtMTsKKwlpZiAoZGVzYy0+Y2hlY2ttb2RlKSB7CisJCS8qIHN0YXJ0IGFzeW5jIHRocmVhZCAqLworCQlpbml0X3RpbWVyKCZjaGlwLT53dCk7CisJCWNoaXAtPnd0LmZ1bmN0aW9uID0gY2hpcF90aHJlYWRfd2FrZTsKKwkJY2hpcC0+d3QuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZyljaGlwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaGlwLT53cSk7CisJCWluaXRfY29tcGxldGlvbigmY2hpcC0+dGV4aXQpOworCQljaGlwLT50cGlkID0ga2VybmVsX3RocmVhZChjaGlwX3RocmVhZCwodm9pZCAqKWNoaXAsMCk7CisJCWlmIChjaGlwLT50cGlkIDwgMCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBrZXJuZWxfdGhyZWFkKCkgZmFpbGVkXG4iLAorCQkJICAgICAgIGkyY19jbGllbnRuYW1lKCZjaGlwLT5jKSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2hpcC0+d3EpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGlwX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwkvKiBkb24ndCBhdHRhY2ggb24gc2FhNzE0NiBiYXNlZCBjYXJkcywKKwkgICBiZWNhdXNlIGRlZGljYXRlZCBkcml2ZXJzIGFyZSB1c2VkICovCisJaWYgKChhZGFwLT5pZCAmIEkyQ19BTEdPX1NBQTcxNDYpKQorCQlyZXR1cm4gMDsKKyNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCisJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBjaGlwX2F0dGFjaCk7CisjZWxzZQorCXN3aXRjaCAoYWRhcC0+aWQpIHsKKwljYXNlIEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4OgorCWNhc2UgSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfUklWQToKKwljYXNlIEkyQ19BTEdPX1NBQTcxMzQ6CisJCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgY2hpcF9hdHRhY2gpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoaXBfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IENISVBTVEFURSAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZGVsX3RpbWVyX3N5bmMoJmNoaXAtPnd0KTsKKwlpZiAoY2hpcC0+dHBpZCA+PSAwKSB7CisJCS8qIHNodXRkb3duIGFzeW5jIHRocmVhZCAqLworCQljaGlwLT5kb25lID0gMTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaGlwLT53cSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNoaXAtPnRleGl0KTsKKwl9CisKKwlpMmNfZGV0YWNoX2NsaWVudCgmY2hpcC0+Yyk7CisJa2ZyZWUoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHZpZGVvNGxpbnV4IGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGludCBjaGlwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKyAgICAgICAgX191MTYgKnNhcmcgPSBhcmc7CisJc3RydWN0IENISVBTVEFURSAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBDSElQREVTQyAgKmRlc2MgPSBjaGlwbGlzdCArIGNoaXAtPnR5cGU7CisKKwlkcHJpbnRrKCIlczogY2hpcF9jb21tYW5kIDB4JXhcbiIsaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpLGNtZCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVEQ19TRVRfSU5QVVQ6CisJCWlmIChkZXNjLT5mbGFncyAmIENISVBfSEFTX0lOUFVUU0VMKSB7CisJCQlpZiAoKnNhcmcgJiAweDgwKQorCQkJCWNoaXBfd3JpdGVfbWFza2VkKGNoaXAsZGVzYy0+aW5wdXRyZWcsZGVzYy0+aW5wdXRtdXRlLGRlc2MtPmlucHV0bWFzayk7CisJCQllbHNlCisJCQkJY2hpcF93cml0ZV9tYXNrZWQoY2hpcCxkZXNjLT5pbnB1dHJlZyxkZXNjLT5pbnB1dG1hcFsqc2FyZ10sZGVzYy0+aW5wdXRtYXNrKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQVVEQ19TRVRfUkFESU86CisJCWRwcmludGsoS0VSTl9ERUJVRyAidHZhdWRpbzogQVVEQ19TRVRfUkFESU9cbiIpOworCQljaGlwLT5ub3JtID0gVklERU9fTU9ERV9SQURJTzsKKwkJY2hpcC0+d2F0Y2hfc3RlcmVvID0gMDsKKwkJLyogZGVsX3RpbWVyKCZjaGlwLT53dCk7ICovCisJCWJyZWFrOworCisJLyogLS0tIHY0bCBpb2N0bHMgLS0tICovCisJLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCisJICAga2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLworCWNhc2UgVklESU9DR0FVRElPOgorCXsKKwkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKKworCQlpZiAoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19WT0xVTUUpIHsKKwkJCXZhLT5mbGFncyAgfD0gVklERU9fQVVESU9fVk9MVU1FOworCQkJdmEtPnZvbHVtZSAgPSBtYXgoY2hpcC0+bGVmdCxjaGlwLT5yaWdodCk7CisJCQlpZiAodmEtPnZvbHVtZSkKKwkJCQl2YS0+YmFsYW5jZSA9ICgzMjc2OCptaW4oY2hpcC0+bGVmdCxjaGlwLT5yaWdodCkpLworCQkJCQl2YS0+dm9sdW1lOworCQkJZWxzZQorCQkJCXZhLT5iYWxhbmNlID0gMzI3Njg7CisJCX0KKwkJaWYgKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfQkFTU1RSRUJMRSkgeworCQkJdmEtPmZsYWdzIHw9IFZJREVPX0FVRElPX0JBU1MgfCBWSURFT19BVURJT19UUkVCTEU7CisJCQl2YS0+YmFzcyAgID0gY2hpcC0+YmFzczsKKwkJCXZhLT50cmVibGUgPSBjaGlwLT50cmVibGU7CisJCX0KKwkJaWYgKGNoaXAtPm5vcm0gIT0gVklERU9fTU9ERV9SQURJTykgeworCQkJaWYgKGRlc2MtPmdldG1vZGUpCisJCQkJdmEtPm1vZGUgPSBkZXNjLT5nZXRtb2RlKGNoaXApOworCQkJZWxzZQorCQkJCXZhLT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1NBVURJTzoKKwl7CisJCXN0cnVjdCB2aWRlb19hdWRpbyAqdmEgPSBhcmc7CisKKwkJaWYgKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfVk9MVU1FKSB7CisJCQljaGlwLT5sZWZ0ID0gKG1pbig2NTUzNiAtIHZhLT5iYWxhbmNlLDMyNzY4KSAqCisJCQkJICAgICAgdmEtPnZvbHVtZSkgLyAzMjc2ODsKKwkJCWNoaXAtPnJpZ2h0ID0gKG1pbih2YS0+YmFsYW5jZSwoX191MTYpMzI3NjgpICoKKwkJCQkgICAgICAgdmEtPnZvbHVtZSkgLyAzMjc2ODsKKwkJCWNoaXBfd3JpdGUoY2hpcCxkZXNjLT5sZWZ0cmVnLGRlc2MtPnZvbGZ1bmMoY2hpcC0+bGVmdCkpOworCQkJY2hpcF93cml0ZShjaGlwLGRlc2MtPnJpZ2h0cmVnLGRlc2MtPnZvbGZ1bmMoY2hpcC0+cmlnaHQpKTsKKwkJfQorCQlpZiAoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19CQVNTVFJFQkxFKSB7CisJCQljaGlwLT5iYXNzID0gdmEtPmJhc3M7CisJCQljaGlwLT50cmVibGUgPSB2YS0+dHJlYmxlOworCQkJY2hpcF93cml0ZShjaGlwLGRlc2MtPmJhc3NyZWcsZGVzYy0+YmFzc2Z1bmMoY2hpcC0+YmFzcykpOworCQkJY2hpcF93cml0ZShjaGlwLGRlc2MtPnRyZWJsZXJlZyxkZXNjLT50cmVibGVmdW5jKGNoaXAtPnRyZWJsZSkpOworCQl9CisJCWlmIChkZXNjLT5zZXRtb2RlICYmIHZhLT5tb2RlKSB7CisJCQljaGlwLT53YXRjaF9zdGVyZW8gPSAwOworCQkJLyogZGVsX3RpbWVyKCZjaGlwLT53dCk7ICovCisJCQljaGlwLT5tb2RlID0gdmEtPm1vZGU7CisJCQlkZXNjLT5zZXRtb2RlKGNoaXAsdmEtPm1vZGUpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ1NDSEFOOgorCXsKKwkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnZjID0gYXJnOworCisJCWRwcmludGsoS0VSTl9ERUJVRyAidHZhdWRpbzogVklESU9DU0NIQU5cbiIpOworCQljaGlwLT5ub3JtID0gdmMtPm5vcm07CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ1NGUkVROgorCXsKKwkgICAgCWNoaXAtPm1vZGUgPSAwOyAvKiBhdXRvbWF0aWMgKi8KKwkJaWYgKGRlc2MtPmNoZWNrbW9kZSkgeworCQkJZGVzYy0+c2V0bW9kZShjaGlwLFZJREVPX1NPVU5EX01PTk8pOworCQkgICAgCWlmIChjaGlwLT5wcmV2bW9kZSAhPSBWSURFT19TT1VORF9NT05PKQorCQkgICAgCQljaGlwLT5wcmV2bW9kZSA9IC0xOyAvKiByZXNldCBwcmV2aW91cyBtb2RlICovCisJCQltb2RfdGltZXIoJmNoaXAtPnd0LCBqaWZmaWVzKzIqSFopOworCQkJLyogdGhlIHRocmVhZCB3aWxsIGNhbGwgY2hlY2ttb2RlKCkgbGF0ZXIgKi8KKwkJfQorCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKKwkub3duZXIgICAgICAgICAgID0gVEhJU19NT0RVTEUsCisgICAgICAgIC5uYW1lICAgICAgICAgICAgPSAiZ2VuZXJpYyBpMmMgYXVkaW8gZHJpdmVyIiwKKyAgICAgICAgLmlkICAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9UVkFVRElPLAorICAgICAgICAuZmxhZ3MgICAgICAgICAgID0gSTJDX0RGX05PVElGWSwKKyAgICAgICAgLmF0dGFjaF9hZGFwdGVyICA9IGNoaXBfcHJvYmUsCisgICAgICAgIC5kZXRhY2hfY2xpZW50ICAgPSBjaGlwX2RldGFjaCwKKyAgICAgICAgLmNvbW1hbmQgICAgICAgICA9IGNoaXBfY29tbWFuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQoreworCUkyQ19ERVZOQU1FKCIodW5zZXQpIiksCisJLmZsYWdzICAgICAgPSBJMkNfQ0xJRU5UX0FMTE9XX1VTRSwKKyAgICAgICAgLmRyaXZlciAgICAgPSAmZHJpdmVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXVkaW9jaGlwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IENISVBERVNDICAqZGVzYzsKKwlwcmludGsoS0VSTl9JTkZPICJ0dmF1ZGlvOiBUViBhdWRpbyBkZWNvZGVyICsgYXVkaW8vdmlkZW8gbXV4IGRyaXZlclxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAidHZhdWRpbzoga25vd24gY2hpcHM6ICIpOworCWZvciAoZGVzYyA9IGNoaXBsaXN0OyBkZXNjLT5uYW1lICE9IE5VTEw7IGRlc2MrKykKKwkJcHJpbnRrKCIlcyVzIiwgKGRlc2MgPT0gY2hpcGxpc3QpID8gIiIgOiAiLCIsZGVzYy0+bmFtZSk7CisJcHJpbnRrKCJcbiIpOworCisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXVkaW9jaGlwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF1ZGlvY2hpcF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhdWRpb2NoaXBfY2xlYW51cF9tb2R1bGUpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjdlMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGkyYyBidXMgYWRkcmVzc2VzIGZvciB0aGUgY2hpcHMgc3VwcG9ydGVkIGJ5IHR2YXVkaW8uYworICovCisKKyNkZWZpbmUgSTJDX1REQTg0MjUgICAgICAgIDB4ODIKKyNkZWZpbmUgSTJDX1REQTk4NDAgICAgICAgIDB4ODQgLyogYWxzbyB1c2VkIGJ5IFRBODg3NFogKi8KKyNkZWZpbmUgSTJDX1REQTk4NXhfTCAgICAgIDB4YjQgLyogYWxzbyB1c2VkIGJ5IDk4NzMgKi8KKyNkZWZpbmUgSTJDX1REQTk4NXhfSCAgICAgIDB4YjYKKyNkZWZpbmUgSTJDX1REQTk4NzQgICAgICAgIDB4YjAgLyogYWxzbyB1c2VkIGJ5IDk4NzUgKi8KKworI2RlZmluZSBJMkNfVEVBNjMwMCAgICAgICAgMHg4MCAvKiBhbHNvIHVzZWQgYnkgNjMyMCAqLworI2RlZmluZSBJMkNfVEVBNjQyMAkgICAweDk4CisKKyNkZWZpbmUgSTJDX1BJQzE2QzU0ICAgICAgIDB4OTYgLyogUFY5NTEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTQ0M2EwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCkBAIC0wLDAgKzEsNTg3IEBACisvKgorICogdHZlZXByb20gLSBlZXByb20gZGVjb2RlciBmb3IgdHZjYXJkIGNvbmZpZ3VyYXRpb24gZWVwcm9tcworICoKKyAqIERhdGEgYW5kIGRlY29kaW5nIHJvdXRpbmVzIHNoYW1lbGVzc2x5IGJvcnJvd2VkIGZyb20gYnR0di1jYXJkcy5jCisgKiBlZXByb20gYWNjZXNzIHJvdXRpbmUgc2hhbWVsZXNzbHkgYm9ycm93ZWQgZnJvbSBidHR2LWlmLmMKKyAqIHdoaWNoIGFyZToKKworICAgIENvcHlyaWdodCAoQykgMTk5Niw5Nyw5OCBSYWxwaCAgTWV0emxlciAocmprbUB0aHAudW5pLWtvZWxuLmRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBNYXJjdXMgTWV0emxlciAobW9jbUB0aHAudW5pLWtvZWxuLmRlKQorICAgIChjKSAxOTk5LTIwMDEgR2VyZCBLbm9yciA8a3JheGVsQGdvbGRiYWNoLmluLWJlcmxpbi5kZT4KKworICogQWRqdXN0bWVudHMgdG8gZml0IGEgbW9yZSBnZW5lcmFsIG1vZGVsIGFuZCBhbGwgYnVnczoKKworIAlDb3B5cmlnaHQgKEMpIDIwMDMgSm9obiBLbGFyIDxsaW5wdnIgYXQgcHJvamVjdHBsYXNtYS5jb20+CisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS90dmVlcHJvbS5oPgorCitNT0RVTEVfREVTQ1JJUFRJT04oImkyYyBIYXVwcGF1Z2UgZWVwcm9tIGRlY29kZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKb2huIEtsYXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtMikiKTsKKworI2RlZmluZSBTVFJNKGFycmF5LGkpIChpIDwgc2l6ZW9mKGFycmF5KS9zaXplb2YoY2hhciopID8gYXJyYXlbaV0gOiAidW5rbm93biIpCisKKyNkZWZpbmUgZHByaW50ayhudW0sIGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGRlYnVnID49IG51bSkgXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAidHZlZXByb206ICIgYXJncyk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFRWRUVQUk9NX0tFUk5fRVJSKGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAidHZlZXByb206ICIgYXJncyk7CisjZGVmaW5lIFRWRUVQUk9NX0tFUk5fSU5GTyhhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPICJ0dmVlcHJvbTogIiBhcmdzKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHNvbWUgaGF1cHBhdWdlIHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBzdHJ1Y3QgSEFVUFBBVUdFX1RVTkVSX0ZNVAoreworCWludAlpZDsKKwljaGFyICpuYW1lOworfQoraGF1cHBhdWdlX3R1bmVyX2ZtdFtdID0KK3sKKwl7IDB4MDAwMDAwMDAsICJ1bmtub3duMSIgfSwKKwl7IDB4MDAwMDAwMDAsICJ1bmtub3duMiIgfSwKKwl7IDB4MDAwMDAwMDcsICJQQUwoQi9HKSIgfSwKKwl7IDB4MDAwMDEwMDAsICJOVFNDKE0pIiB9LAorCXsgMHgwMDAwMDAxMCwgIlBBTChJKSIgfSwKKwl7IDB4MDA0MDAwMDAsICJTRUNBTShML0zvv70pIiB9LAorCXsgMHgwMDAwMGUwMCwgIlBBTChEL0spIiB9LAorCXsgMHgwMzAwMDAwMCwgIkFUU0MgRGlnaXRhbCIgfSwKK307CisKKy8qIFRoaXMgaXMgdGhlIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB0dW5lcnMuIE1hbnkgdGhhbmtzIHRvIEhhdXBwYXVnZSBmb3IKKyAgIHN1cHBseWluZyB0aGlzIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgbWFueSB0dW5lcnMgd2hlcmUgb25seSB1c2VkIGZvcgorICAgdGVzdGluZyBhbmQgbmV2ZXIgbWFkZSBpdCB0byB0aGUgb3V0c2lkZSB3b3JsZC4gU28geW91IHdpbGwgb25seSBzZWUKKyAgIGEgc3Vic2V0IGluIGFjdHVhbCBwcm9kdWNlZCBjYXJkcy4gKi8KK3N0YXRpYyBzdHJ1Y3QgSEFVUFBBVUdFX1RVTkVSCit7CisJaW50ICBpZDsKKwljaGFyICpuYW1lOworfQoraGF1cHBhdWdlX3R1bmVyW10gPQoreworCS8qIDAtOSAqLworCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIk5vbmUiIH0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiRXh0ZXJuYWwiIH0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVW5zcGVjaWZpZWQiIH0sCisJeyBUVU5FUl9QSElMSVBTX1BBTCwgICAiUGhpbGlwcyBGSTEyMTYiIH0sCisJeyBUVU5FUl9QSElMSVBTX1NFQ0FNLCAiUGhpbGlwcyBGSTEyMTZNRiIgfSwKKwl7IFRVTkVSX1BISUxJUFNfTlRTQywgICJQaGlsaXBzIEZJMTIzNiIgfSwKKwl7IFRVTkVSX1BISUxJUFNfUEFMX0ksICJQaGlsaXBzIEZJMTI0NiIgfSwKKwl7IFRVTkVSX1BISUxJUFNfUEFMX0RLLCJQaGlsaXBzIEZJMTI1NiIgfSwKKwl7IFRVTkVSX1BISUxJUFNfUEFMLCAgICJQaGlsaXBzIEZJMTIxNiBNSzIiIH0sCisJeyBUVU5FUl9QSElMSVBTX1NFQ0FNLCAiUGhpbGlwcyBGSTEyMTZNRiBNSzIiIH0sCisJLyogMTAtMTkgKi8KKwl7IFRVTkVSX1BISUxJUFNfTlRTQywgICJQaGlsaXBzIEZJMTIzNiBNSzIiIH0sCisJeyBUVU5FUl9QSElMSVBTX1BBTF9JLCAiUGhpbGlwcyBGSTEyNDYgTUsyIiB9LAorCXsgVFVORVJfUEhJTElQU19QQUxfREssIlBoaWxpcHMgRkkxMjU2IE1LMiIgfSwKKwl7IFRVTkVSX1RFTUlDX05UU0MsICAgICJUZW1pYyA0MDMyRlk1IiB9LAorCXsgVFVORVJfVEVNSUNfUEFMLCAgICAgIlRlbWljIDQwMDJGSDUiIH0sCisJeyBUVU5FUl9URU1JQ19QQUxfSSwgICAiVGVtaWMgNDA2MkZZNSIgfSwKKwl7IFRVTkVSX1BISUxJUFNfUEFMLCAgICJQaGlsaXBzIEZSMTIxNiBNSzIiIH0sCisJeyBUVU5FUl9QSElMSVBTX1NFQ0FNLCAiUGhpbGlwcyBGUjEyMTZNRiBNSzIiIH0sCisJeyBUVU5FUl9QSElMSVBTX05UU0MsICAiUGhpbGlwcyBGUjEyMzYgTUsyIiB9LAorCXsgVFVORVJfUEhJTElQU19QQUxfSSwgIlBoaWxpcHMgRlIxMjQ2IE1LMiIgfSwKKwkvKiAyMC0yOSAqLworCXsgVFVORVJfUEhJTElQU19QQUxfREssIlBoaWxpcHMgRlIxMjU2IE1LMiIgfSwKKwl7IFRVTkVSX1BISUxJUFNfUEFMLCAgICJQaGlsaXBzIEZNMTIxNiIgfSwKKwl7IFRVTkVSX1BISUxJUFNfU0VDQU0sICJQaGlsaXBzIEZNMTIxNk1GIiB9LAorCXsgVFVORVJfUEhJTElQU19OVFNDLCAgIlBoaWxpcHMgRk0xMjM2IiB9LAorCXsgVFVORVJfUEhJTElQU19QQUxfSSwgIlBoaWxpcHMgRk0xMjQ2IiB9LAorCXsgVFVORVJfUEhJTElQU19QQUxfREssIlBoaWxpcHMgRk0xMjU2IiB9LAorCXsgVFVORVJfVEVNSUNfNDAzNkZZNV9OVFNDLCAiVGVtaWMgNDAzNkZZNSIgfSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJTYW1zdW5nIFRDUE45MDgyRCIgfSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJTYW1zdW5nIFRDUE05MDkyUCIgfSwKKwl7IFRVTkVSX1RFTUlDXzQwMDZGSDVfUEFMLCAiVGVtaWMgNDAwNkZINSIgfSwKKwkvKiAzMC0zOSAqLworCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNhbXN1bmcgVENQTjkwODVEIiB9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNhbXN1bmcgVENQQjkwODVQIiB9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNhbXN1bmcgVENQTDkwOTFQIiB9LAorCXsgVFVORVJfVEVNSUNfNDAzOUZSNV9OVFNDLCAiVGVtaWMgNDAzOUZSNSIgfSwKKwl7IFRVTkVSX1BISUxJUFNfRlExMjE2TUUsICAgIlBoaWxpcHMgRlExMjE2IE1FIiB9LAorCXsgVFVORVJfVEVNSUNfNDA2NkZZNV9QQUxfSSwgIlRlbWljIDQwNjZGWTUiIH0sCisgICAgICAgIHsgVFVORVJfUEhJTElQU19OVFNDLCAgICAgICAgIlBoaWxpcHMgVEQxNTM2IiB9LAorICAgICAgICB7IFRVTkVSX1BISUxJUFNfTlRTQywgICAgICAgICJQaGlsaXBzIFREMTUzNkQiIH0sCisJeyBUVU5FUl9QSElMSVBTX05UU0MsICAiUGhpbGlwcyBGTVIxMjM2IiB9LCAvKiBtb25vIHJhZGlvICovCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGSTEyNTZNUCIgfSwKKwkvKiA0MC00OSAqLworCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNhbXN1bmcgVENQUTkwOTFQIiB9LAorCXsgVFVORVJfVEVNSUNfNDAwNkZONV9NVUxUSV9QQUwsICJUZW1pYyA0MDA2Rk41IiB9LAorCXsgVFVORVJfVEVNSUNfNDAwOUZSNV9QQUwsICJUZW1pYyA0MDA5RlI1IiB9LAorCXsgVFVORVJfVEVNSUNfNDA0NkZNNSwgICAgICJUZW1pYyA0MDQ2Rk01IiB9LAorCXsgVFVORVJfVEVNSUNfNDAwOUZONV9NVUxUSV9QQUxfRk0sICJUZW1pYyA0MDA5Rk41IiB9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgVEQxNTM2RCBGSCA0NCJ9LAorCXsgVFVORVJfTEdfTlRTQ19GTSwgICAgIkxHIFRQMThOU1IwMUYifSwKKwl7IFRVTkVSX0xHX1BBTF9GTSwgICAgICJMRyBUUDE4UFNCMDFEIn0sCisJeyBUVU5FUl9MR19QQUwsICAgICAgICAiTEcgVFAxOFBTQjExRCJ9LAorCXsgVFVORVJfTEdfUEFMX0lfRk0sICAgIkxHIFRBUEMtSTAwMUQifSwKKwkvKiA1MC01OSAqLworCXsgVFVORVJfTEdfUEFMX0ksICAgICAgIkxHIFRBUEMtSTcwMUQifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUZW1pYyA0MDQyRkk1In0sCisJeyBUVU5FUl9NSUNST1RVTkVfNDA0OUZNNSwgIk1pY3JvdHVuZSA0MDQ5IEZNNSJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRQSThOU1IxMUYifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJNaWNyb3R1bmUgNDA0OSBGTTUgQWx0IEkyQyJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlExMjE2TUUgTUszIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGSTEyMzYgTUszIn0sCisJeyBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywgIlBoaWxpcHMgRk0xMjE2IE1FIE1LMyJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRk0xMjM2IE1LMyJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRk0xMjE2TVAgTUszIn0sCisJLyogNjAtNjkgKi8KKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBTMDAxRCBNSzMifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBNMDAxRCBNSzMifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBTNzAxRCBNSzMifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBNNzAxRCBNSzMifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUZW1pYyA0MTQ2Rk01In0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVGVtaWMgNDEzNkZZNSJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRlbWljIDQxMDZGSDUifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZRMTIxNkxNUCBNSzMifSwKKwl7IFRVTkVSX0xHX05UU0NfVEFQRSwgICJMRyBUQVBFIEgwMDFGIE1LMyJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBUEUgSDcwMUYgTUszIn0sCisJLyogNzAtNzkgKi8KKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBUQUxOIEgyMDBUIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgVEFMTiBIMjUwVCJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBTE4gTTIwMFQifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBUQUxOIFoyMDBUIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgVEFMTiBTMjAwVCJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRob21wc29uIERUVDc1OTUifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUaG9tcHNvbiBEVFQ3NTkyIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiU2lsaWNvbiBUREE4Mjc1QzEgODI5MCJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNpbGljb24gVERBODI3NUMxIDgyOTAgRk0ifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUaG9tcHNvbiBEVFQ3NTcifSwKKwkvKiA4MC04OSAqLworCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlExMjE2TE1FIE1LMyJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBUEMgRzcwMUQifSwKKwl7IFRVTkVSX0xHX05UU0NfTkVXX1RBUEMsICJMRyBUQVBDIEg3OTFGIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIDIwMDJNQiAzIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIDIwMDJNSSAzIn0sCisJeyBUVU5FUl9UQ0xfMjAwMk4sICAgICAiVENMIDIwMDJOIDZBIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyMzYgTUszIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiU2Ftc3VuZyBUQ1BOIDIxMjFQMzBBIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiU2Ftc3VuZyBUQ1BFIDQxMjFQMzBBIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIE1GUEUwNSAyIn0sCisJLyogOTAtOTkgKi8KKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBUQUxOIEgyMDJUIn0sCisJeyBUVU5FUl9QSElMSVBTX0ZRMTIxNkFNRV9NSzQsICJQaGlsaXBzIEZRMTIxNkFNRSBNSzQifSwKKwl7IFRVTkVSX1BISUxJUFNfRlExMjM2QV9NSzQsICJQaGlsaXBzIEZRMTIzNkEgTUs0In0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyODZBIE1LNCJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlExMjE2TUUgTUs1In0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyMzYgTUs1In0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVW5zcGVjaWZpZWQifSwKKwl7IFRVTkVSX0xHX1BBTF9UQVBFLCAgICJMRyBQQUwgKFRBUEUgU2VyaWVzKSJ9LAorfTsKKworc3RhdGljIGNoYXIgKnNuZHR5cGVbXSA9IHsKKwkiTm9uZSIsICJURUE2MzAwIiwgIlRFQTYzMjAiLCAiVERBOTg1MCIsICJNU1AzNDAwQyIsICJNU1AzNDEwRCIsCisJIk1TUDM0MTUiLCAiTVNQMzQzMCIsICJNU1AzNDM4IiwgIkNTNTMzMSIsICJNU1AzNDM1IiwgIk1TUDM0NDAiLAorCSJNU1AzNDQ1IiwgIk1TUDM0MTEiLCAiTVNQMzQxNiIsICJNU1AzNDI1IiwKKworCSJUeXBlIDB4MTAiLCJUeXBlIDB4MTEiLCJUeXBlIDB4MTIiLCJUeXBlIDB4MTMiLAorCSJUeXBlIDB4MTQiLCJUeXBlIDB4MTUiLCJUeXBlIDB4MTYiLCJUeXBlIDB4MTciLAorCSJUeXBlIDB4MTgiLCJNU1A0NDE4IiwiVHlwZSAweDFhIiwiTVNQNDQ0OCIsCisJIlR5cGUgMHgxYyIsIlR5cGUgMHgxZCIsIlR5cGUgMHgxZSIsIlR5cGUgMHgxZiIsCit9OworCitzdGF0aWMgaW50IGhhc1JhZGlvVHVuZXIoaW50IHR1bmVyVHlwZSkKK3sKKyAgICAgICAgc3dpdGNoICh0dW5lclR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE4OiAvL1BOUEVudl9UVU5FUl9GUjEyMzZfTUsyOgorICAgICAgICAgICAgICAgIGNhc2UgMjM6IC8vUE5QRW52X1RVTkVSX0ZNMTIzNjoKKyAgICAgICAgICAgICAgICBjYXNlIDM4OiAvL1BOUEVudl9UVU5FUl9GTVIxMjM2OgorICAgICAgICAgICAgICAgIGNhc2UgMTY6IC8vUE5QRW52X1RVTkVSX0ZSMTIxNl9NSzI6CisgICAgICAgICAgICAgICAgY2FzZSAxOTogLy9QTlBFbnZfVFVORVJfRlIxMjQ2X01LMjoKKyAgICAgICAgICAgICAgICBjYXNlIDIxOiAvL1BOUEVudl9UVU5FUl9GTTEyMTY6CisgICAgICAgICAgICAgICAgY2FzZSAyNDogLy9QTlBFbnZfVFVORVJfRk0xMjQ2OgorICAgICAgICAgICAgICAgIGNhc2UgMTc6IC8vUE5QRW52X1RVTkVSX0ZSMTIxNk1GX01LMjoKKyAgICAgICAgICAgICAgICBjYXNlIDIyOiAvL1BOUEVudl9UVU5FUl9GTTEyMTZNRjoKKyAgICAgICAgICAgICAgICBjYXNlIDIwOiAvL1BOUEVudl9UVU5FUl9GUjEyNTZfTUsyOgorICAgICAgICAgICAgICAgIGNhc2UgMjU6IC8vUE5QRW52X1RVTkVSX0ZNMTI1NjoKKyAgICAgICAgICAgICAgICBjYXNlIDMzOiAvL1BOUEVudl9UVU5FUl80MDM5RlI1OgorICAgICAgICAgICAgICAgIGNhc2UgNDI6IC8vUE5QRW52X1RVTkVSXzQwMDlGUjU6CisgICAgICAgICAgICAgICAgY2FzZSA1MjogLy9QTlBFbnZfVFVORVJfNDA0OUZNNToKKyAgICAgICAgICAgICAgICBjYXNlIDU0OiAvL1BOUEVudl9UVU5FUl80MDQ5Rk01X0FsdEkyQzoKKyAgICAgICAgICAgICAgICBjYXNlIDQ0OiAvL1BOUEVudl9UVU5FUl80MDA5Rk41OgorICAgICAgICAgICAgICAgIGNhc2UgMzE6IC8vUE5QRW52X1RVTkVSX1RDUEI5MDg1UDoKKyAgICAgICAgICAgICAgICBjYXNlIDMwOiAvL1BOUEVudl9UVU5FUl9UQ1BOOTA4NUQ6CisgICAgICAgICAgICAgICAgY2FzZSA0NjogLy9QTlBFbnZfVFVORVJfVFAxOE5TUjAxRjoKKyAgICAgICAgICAgICAgICBjYXNlIDQ3OiAvL1BOUEVudl9UVU5FUl9UUDE4UFNCMDFEOgorICAgICAgICAgICAgICAgIGNhc2UgNDk6IC8vUE5QRW52X1RVTkVSX1RBUENfSTAwMUQ6CisgICAgICAgICAgICAgICAgY2FzZSA2MDogLy9QTlBFbnZfVFVORVJfVEFQRV9TMDAxRF9NSzM6CisgICAgICAgICAgICAgICAgY2FzZSA1NzogLy9QTlBFbnZfVFVORVJfRk0xMjE2TUVfTUszOgorICAgICAgICAgICAgICAgIGNhc2UgNTk6IC8vUE5QRW52X1RVTkVSX0ZNMTIxNk1QX01LMzoKKyAgICAgICAgICAgICAgICBjYXNlIDU4OiAvL1BOUEVudl9UVU5FUl9GTTEyMzZfTUszOgorICAgICAgICAgICAgICAgIGNhc2UgNjg6IC8vUE5QRW52X1RVTkVSX1RBUEVfSDAwMUZfTUszOgorICAgICAgICAgICAgICAgIGNhc2UgNjE6IC8vUE5QRW52X1RVTkVSX1RBUEVfTTAwMURfTUszOgorICAgICAgICAgICAgICAgIGNhc2UgNzg6IC8vUE5QRW52X1RVTkVSX1REQTgyNzVDMV84MjkwX0ZNOgorICAgICAgICAgICAgICAgIGNhc2UgODk6IC8vUE5QRW52X1RVTkVSX1RDTF9NRlBFMDVfMjoKKyAgICAgICAgICAgICAgICBjYXNlIDkyOiAvL1BOUEVudl9UVU5FUl9QSElMSVBTX0ZRMTIzNkFfTUs0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKK30KKwordm9pZCB0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKHN0cnVjdCB0dmVlcHJvbSAqdHZlZSwgdW5zaWduZWQgY2hhciAqZWVwcm9tX2RhdGEpCit7CisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqIFRoZSBoYXVwcGF1Z2UgZWVwcm9tIGZvcm1hdCBpcyB0YWdnZWQKKwkqKgorCSoqIGlmIHBhY2tldFswXSA9PSAweDg0LCB0aGVuIHBhY2tldFswLi4xXSA9PSBsZW5ndGgKKwkqKiBlbHNlIGxlbmd0aCA9IHBhY2tldFswXSAmIDNmOworCSoqIGlmIHBhY2tldFswXSAmIGY4ID09IGY4LCB0aGVuIEVPRCBhbmQgcGFja2V0WzFdID09IGNoZWNrc3VtCisJKioKKwkqKiBJbiBvdXIgKGl2dHYpIGNhc2Ugd2UncmUgaW50ZXJlc3RlZCBpbiB0aGUgZm9sbG93aW5nOgorCSoqIHR1bmVyIHR5cGU6IHRhZyBbMDBdLjA1IG9yIFswYV0uMDEgKGluZGV4IGludG8gaGF1cHBhdWdlX3R1bmVyKQorCSoqIHR1bmVyIGZtdHM6IHRhZyBbMDBdLjA0IG9yIFswYV0uMDAgKGJpdG1hc2sgaW5kZXggaW50byBoYXVwcGF1Z2VfdHVuZXJfZm10KQorCSoqIHJhZGlvOiAgICAgIHRhZyBbMDBdLntsYXN0fSBvciBbMGVdLjAwICAoYml0bWFzay4gIGJpdDI9Rk0pCisJKiogYXVkaW8gcHJvYzogdGFnIFswMl0uMDEgb3IgWzA1XS4wMCAobG93ZXIgbmliYmxlIGluZGV4ZXMgbHV0PykKKworCSoqIEZ1biBpbmZvOgorCSoqIG1vZGVsOiAgICAgIHRhZyBbMDBdLjA3LTA4IG9yIFswNl0uMDAtMDEKKwkqKiByZXZpc2lvbjogICB0YWcgWzAwXS4wOS0wYiBvciBbMDZdLjA0LTA2CisJKiogc2VyaWFsIzogICAgdGFnIFswMV0uMDUtMDcgb3IgWzA0XS4wNC0wNgorCisJKiogIyBvZiBpbnB1dHMvb3V0cHV0cyA/Pz8KKwkqLworCisJaW50IGksIGosIGxlbiwgZG9uZSwgYmVlbmhlcmUsIHRhZywgdHVuZXIgPSAwLCB0X2Zvcm1hdCA9IDA7CisJY2hhciAqdF9uYW1lID0gTlVMTCwgKnRfZm10X25hbWUgPSBOVUxMOworCisJZHByaW50aygxLCAiJXNcbiIsX19GVU5DVElPTl9fKTsKKwl0dmVlLT5yZXZpc2lvbiA9IGRvbmUgPSBsZW4gPSBiZWVuaGVyZSA9IDA7CisJZm9yIChpID0gMDsgIWRvbmUgJiYgaSA8IDI1NjsgaSArPSBsZW4pIHsKKwkJZHByaW50aygyLCAicHJvY2Vzc2luZyBwb3MgPSAlMDJ4ICglMDJ4LCAlMDJ4KVxuIiwKKwkJCWksIGVlcHJvbV9kYXRhW2ldLCBlZXByb21fZGF0YVtpICsgMV0pOworCisJCWlmIChlZXByb21fZGF0YVtpXSA9PSAweDg0KSB7CisJCQlsZW4gPSBlZXByb21fZGF0YVtpICsgMV0gKyAoZWVwcm9tX2RhdGFbaSArIDJdIDw8IDgpOworCQkJaSs9MzsKKwkJfSBlbHNlIGlmICgoZWVwcm9tX2RhdGFbaV0gJiAweGYwKSA9PSAweDcwKSB7CisJCQlpZiAoKGVlcHJvbV9kYXRhW2ldICYgMHgwOCkpIHsKKwkJCQkvKiB2ZXJpZnkgY2hlY2tzdW0hICovCisJCQkJZG9uZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlsZW4gPSBlZXByb21fZGF0YVtpXSAmIDB4MDc7CisJCQkrK2k7CisJCX0gZWxzZSB7CisJCQlUVkVFUFJPTV9LRVJOX0VSUigiRW5jb3VudGVyZWQgYmFkIHBhY2tldCBoZWFkZXIgWyUwMnhdLiAiCisJCQkJICAgIkNvcnJ1cHQgb3Igbm90IGEgSGF1cHBhdWdlIGVlcHJvbS5cbiIsIGVlcHJvbV9kYXRhW2ldKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWRwcmludGsoMSwgIiUzZCBbJTAyeF0gIiwgbGVuLCBlZXByb21fZGF0YVtpXSk7CisJCWZvcihqID0gMTsgaiA8IGxlbjsgaisrKSB7CisJCQlkcHJpbnRrKDEsICIlMDJ4ICIsIGVlcHJvbV9kYXRhW2kgKyBqXSk7CisJCX0KKwkJZHByaW50aygxLCAiXG4iKTsKKworCQkvKiBwcm9jZXNzIGJ5IHRhZyAqLworCQl0YWcgPSBlZXByb21fZGF0YVtpXTsKKwkJc3dpdGNoICh0YWcpIHsKKwkJY2FzZSAweDAwOgorCQkJdHVuZXIgPSBlZXByb21fZGF0YVtpKzZdOworCQkJdF9mb3JtYXQgPSBlZXByb21fZGF0YVtpKzVdOworCQkJdHZlZS0+aGFzX3JhZGlvID0gZWVwcm9tX2RhdGFbaStsZW4tMV07CisJCQl0dmVlLT5tb2RlbCA9CisJCQkJZWVwcm9tX2RhdGFbaSs4XSArCisJCQkJKGVlcHJvbV9kYXRhW2krOV0gPDwgOCk7CisJCQl0dmVlLT5yZXZpc2lvbiA9IGVlcHJvbV9kYXRhW2krMTBdICsKKwkJCQkoZWVwcm9tX2RhdGFbaSsxMV0gPDwgOCkgKworCQkJCShlZXByb21fZGF0YVtpKzEyXSA8PCAxNik7CisJCQlicmVhazsKKwkJY2FzZSAweDAxOgorCQkJdHZlZS0+c2VyaWFsX251bWJlciA9CisJCQkJZWVwcm9tX2RhdGFbaSs2XSArCisJCQkJKGVlcHJvbV9kYXRhW2krN10gPDwgOCkgKworCQkJCShlZXByb21fZGF0YVtpKzhdIDw8IDE2KTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDI6CisJCQl0dmVlLT5hdWRpb19wcm9jZXNzb3IgPSBlZXByb21fZGF0YVtpKzJdICYgMHgwZjsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCQl0dmVlLT5zZXJpYWxfbnVtYmVyID0KKwkJCQllZXByb21fZGF0YVtpKzVdICsKKwkJCQkoZWVwcm9tX2RhdGFbaSs2XSA8PCA4KSArCisJCQkJKGVlcHJvbV9kYXRhW2krN10gPDwgMTYpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNToKKwkJCXR2ZWUtPmF1ZGlvX3Byb2Nlc3NvciA9IGVlcHJvbV9kYXRhW2krMV0gJiAweDBmOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNjoKKwkJCXR2ZWUtPm1vZGVsID0KKwkJCQllZXByb21fZGF0YVtpKzFdICsKKwkJCQkoZWVwcm9tX2RhdGFbaSsyXSA8PCA4KTsKKwkJCXR2ZWUtPnJldmlzaW9uID0gZWVwcm9tX2RhdGFbaSs1XSArCisJCQkJKGVlcHJvbV9kYXRhW2krNl0gPDwgOCkgKworCQkJCShlZXByb21fZGF0YVtpKzddIDw8IDE2KTsKKwkJCWJyZWFrOworCQljYXNlIDB4MGE6CisJCQlpZihiZWVuaGVyZSA9PSAwKSB7CisJCQkJdHVuZXIgPSBlZXByb21fZGF0YVtpKzJdOworCQkJCXRfZm9ybWF0ID0gZWVwcm9tX2RhdGFbaSsxXTsKKwkJCQliZWVuaGVyZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIDB4MGU6CisJCQl0dmVlLT5oYXNfcmFkaW8gPSBlZXByb21fZGF0YVtpKzFdOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKDEsICJOb3Qgc3VyZSB3aGF0IHRvIGRvIHdpdGggdGFnIFslMDJ4XVxuIiwgdGFnKTsKKwkJCS8qIGR1bXAgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldD8gKi8KKwkJfQorCisJfQorCisJaWYgKCFkb25lKSB7CisJCVRWRUVQUk9NX0tFUk5fRVJSKCJSYW4gb3V0IG9mIGRhdGEhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0dmVlLT5yZXZpc2lvbiAhPSAwKSB7CisJCXR2ZWUtPnJldl9zdHJbMF0gPSAzMiArICgodHZlZS0+cmV2aXNpb24gPj4gMTgpICYgMHgzZik7CisJCXR2ZWUtPnJldl9zdHJbMV0gPSAzMiArICgodHZlZS0+cmV2aXNpb24gPj4gMTIpICYgMHgzZik7CisJCXR2ZWUtPnJldl9zdHJbMl0gPSAzMiArICgodHZlZS0+cmV2aXNpb24gPj4gIDYpICYgMHgzZik7CisJCXR2ZWUtPnJldl9zdHJbM10gPSAzMiArICggdHZlZS0+cmV2aXNpb24gICAgICAgICYgMHgzZik7CisJCXR2ZWUtPnJldl9zdHJbNF0gPSAwOworCX0KKworICAgICAgICBpZiAoaGFzUmFkaW9UdW5lcih0dW5lcikgJiYgIXR2ZWUtPmhhc19yYWRpbykgeworCSAgICBUVkVFUFJPTV9LRVJOX0lORk8oIlRoZSBlZXByb20gc2F5cyBubyByYWRpbyBpcyBwcmVzZW50LCBidXQgdGhlIHR1bmVyIHR5cGVcbiIpOworCSAgICBUVkVFUFJPTV9LRVJOX0lORk8oImluZGljYXRlcyBvdGhlcndpc2UuIEkgd2lsbCBhc3N1bWUgdGhhdCByYWRpbyBpcyBwcmVzZW50LlxuIik7CisgICAgICAgICAgICB0dmVlLT5oYXNfcmFkaW8gPSAxOworICAgICAgICB9CisKKwlpZiAodHVuZXIgPCBzaXplb2YoaGF1cHBhdWdlX3R1bmVyKS9zaXplb2Yoc3RydWN0IEhBVVBQQVVHRV9UVU5FUikpIHsKKwkJdHZlZS0+dHVuZXJfdHlwZSA9IGhhdXBwYXVnZV90dW5lclt0dW5lcl0uaWQ7CisJCXRfbmFtZSA9IGhhdXBwYXVnZV90dW5lclt0dW5lcl0ubmFtZTsKKwl9IGVsc2UgeworCQl0X25hbWUgPSAiPHVua25vd24+IjsKKwl9CisKKwl0dmVlLT50dW5lcl9mb3JtYXRzID0gMDsKKwl0X2ZtdF9uYW1lID0gIjxub25lPiI7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAodF9mb3JtYXQgJiAoMTw8aSkpIHsKKwkJCXR2ZWUtPnR1bmVyX2Zvcm1hdHMgfD0gaGF1cHBhdWdlX3R1bmVyX2ZtdFtpXS5pZDsKKwkJCS8qIHl1Y2sgKi8KKwkJCXRfZm10X25hbWUgPSBoYXVwcGF1Z2VfdHVuZXJfZm10W2ldLm5hbWU7CisJCX0KKwl9CisKKyNpZiAwCisJaWYgKHRfZm9ybWF0IDwgc2l6ZW9mKGhhdXBwYXVnZV90dW5lcl9mbXQpL3NpemVvZihzdHJ1Y3QgSEFVUFBBVUdFX1RVTkVSX0ZNVCkpIHsKKwkJdHZlZS0+dHVuZXJfZm9ybWF0cyA9IGhhdXBwYXVnZV90dW5lcl9mbXRbdF9mb3JtYXRdLmlkOworCQl0X2ZtdF9uYW1lID0gaGF1cHBhdWdlX3R1bmVyX2ZtdFt0X2Zvcm1hdF0ubmFtZTsKKwl9IGVsc2UgeworCQl0X2ZtdF9uYW1lID0gIjx1bmtub3duPiI7CisJfQorI2VuZGlmCisKKwlUVkVFUFJPTV9LRVJOX0lORk8oIkhhdXBwYXVnZTogbW9kZWwgPSAlZCwgcmV2ID0gJXMsIHNlcmlhbCMgPSAlZFxuIiwKKwkJICAgdHZlZS0+bW9kZWwsCisJCSAgIHR2ZWUtPnJldl9zdHIsCisJCSAgIHR2ZWUtPnNlcmlhbF9udW1iZXIpOworCVRWRUVQUk9NX0tFUk5fSU5GTygidHVuZXIgPSAlcyAoaWR4ID0gJWQsIHR5cGUgPSAlZClcbiIsCisJCSAgIHRfbmFtZSwKKwkJICAgdHVuZXIsCisJCSAgIHR2ZWUtPnR1bmVyX3R5cGUpOworCVRWRUVQUk9NX0tFUk5fSU5GTygidHVuZXIgZm10ID0gJXMgKGVlcHJvbSA9IDB4JTAyeCwgdjRsMiA9IDB4JTA4eClcbiIsCisJCSAgIHRfZm10X25hbWUsCisJCSAgIHRfZm9ybWF0LAorCQkgICB0dmVlLT50dW5lcl9mb3JtYXRzKTsKKworCVRWRUVQUk9NX0tFUk5fSU5GTygiYXVkaW9fcHJvY2Vzc29yID0gJXMgKHR5cGUgPSAlZClcbiIsCisJCSAgIFNUUk0oc25kdHlwZSx0dmVlLT5hdWRpb19wcm9jZXNzb3IpLAorCQkgICB0dmVlLT5hdWRpb19wcm9jZXNzb3IpOworCit9CitFWFBPUlRfU1lNQk9MKHR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2cpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IHR2ZWVwcm9tX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGNoYXIgKmVlZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgZXJyOworCisJZHByaW50aygxLCAiJXNcbiIsX19GVU5DVElPTl9fKTsKKwlidWYgPSAwOworCWlmICgxICE9IChlcnIgPSBpMmNfbWFzdGVyX3NlbmQoYywmYnVmLDEpKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJ0dmVlcHJvbSglcyk6IEh1aCwgbm8gZWVwcm9tIHByZXNlbnQgKGVycj0lZCk/XG4iLAorCQkgICAgICAgYy0+bmFtZSxlcnIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChsZW4gIT0gKGVyciA9IGkyY19tYXN0ZXJfcmVjdihjLGVlZGF0YSxsZW4pKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0dmVlcHJvbSglcyk6IGkyYyBlZXByb20gcmVhZCBlcnJvciAoZXJyPSVkKVxuIiwKKwkJICAgICAgIGMtPm5hbWUsZXJyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodHZlZXByb21fcmVhZCk7CisKK2ludCB0dmVlcHJvbV9kdW1wKHVuc2lnbmVkIGNoYXIgKmVlZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWRwcmludGsoMSwgIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICgwID09IChpICUgMTYpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAidHZlZXByb206ICUwMng6IixpKTsKKwkJcHJpbnRrKCIgJTAyeCIsZWVkYXRhW2ldKTsKKwkJaWYgKDE1ID09IChpICUgMTYpKQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodHZlZXByb21fZHVtcCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBuZWVkZWQgZm9yIGl2dHYuc2YubmV0IGF0IHRoZSBtb21lbnQuICBTaG91bGQgZ28gYXdheSBpbiB0aGUgbG9uZyAgICAgICAqLworLyogcnVuLCBqdXN0IGNhbGwgdGhlIGV4cG9ydGVkIHR2ZWVwcm9tXyogZGlyZWN0bHksIHRoZXJlIGlzIG5vIHBvaW50IGluICAgKi8KKy8qIHVzaW5nIHRoZSBpbmRpcmVjdCB3YXkgdmlhIGkyY19kcml2ZXItPmNvbW1hbmQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZm5kZWYgSTJDX0RSSVZFUklEX1RWRUVQUk9NCisjIGRlZmluZSBJMkNfRFJJVkVSSURfVFZFRVBST00gSTJDX0RSSVZFUklEX0VYUDIKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geworCTB4YTAgPj4gMSwKKwlJMkNfQ0xJRU5UX0VORCwKK307CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY19yYW5nZVtdID0geyBJMkNfQ0xJRU5UX0VORCB9OworSTJDX0NMSUVOVF9JTlNNT0Q7CisKK3N0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXJfdHZlZXByb207CisKK3N0YXRpYyBpbnQKK3R2ZWVwcm9tX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJIHVuc2lnbmVkIGludCAgICAgICBjbWQsCisJCSB2b2lkICAgICAgICAgICAgICAqYXJnKQoreworCXN0cnVjdCB0dmVlcHJvbSBlZXByb207CisJdTMyICplZXByb21fcHJvcHMgPSBhcmc7CisJdTggKmJ1ZjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSAwOgorCQlidWYgPSBrbWFsbG9jKDI1NixHRlBfS0VSTkVMKTsKKwkJbWVtc2V0KGJ1ZiwwLDI1Nik7CisJCXR2ZWVwcm9tX3JlYWQoY2xpZW50LGJ1ZiwyNTYpOworCQl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZlZXByb20sYnVmKTsKKwkJa2ZyZWUoYnVmKTsKKwkJZWVwcm9tX3Byb3BzWzBdID0gZWVwcm9tLnR1bmVyX3R5cGU7CisJCWVlcHJvbV9wcm9wc1sxXSA9IGVlcHJvbS50dW5lcl9mb3JtYXRzOworCQllZXByb21fcHJvcHNbMl0gPSBlZXByb20ubW9kZWw7CisJCWVlcHJvbV9wcm9wc1szXSA9IGVlcHJvbS5yZXZpc2lvbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0dmVlcHJvbV9kZXRlY3RfY2xpZW50KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJICAgICAgIGludCAgICAgICAgICAgICAgICAgYWRkcmVzcywKKwkJICAgICAgIGludCAgICAgICAgICAgICAgICAga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCisJZHByaW50aygxLCIlczogaWQgMHgleCBAIDB4JXhcbiIsX19GVU5DVElPTl9fLAorCSAgICAgICBhZGFwdGVyLT5pZCwgYWRkcmVzcyA8PCAxKTsKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGNsaWVudCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGNsaWVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfdHZlZXByb207CisJY2xpZW50LT5mbGFncyA9IEkyQ19DTElFTlRfQUxMT1dfVVNFOworCXNucHJpbnRmKGNsaWVudC0+bmFtZSwgc2l6ZW9mKGNsaWVudC0+bmFtZSksICJ0dmVlcHJvbSIpOworICAgICAgICBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0dmVlcHJvbV9hdHRhY2hfYWRhcHRlciAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWRwcmludGsoMSwiJXM6IGlkIDB4JXhcbiIsX19GVU5DVElPTl9fLGFkYXB0ZXItPmlkKTsKKwlpZiAoYWRhcHRlci0+aWQgIT0gKEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCB0dmVlcHJvbV9kZXRlY3RfY2xpZW50KTsKK30KKworc3RhdGljIGludAordHZlZXByb21fZGV0YWNoX2NsaWVudCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX3R2ZWVwcm9tID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5uYW1lICAgICAgICAgICA9ICJ0dmVlcHJvbSIsCisJLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1RWRUVQUk9NLAorCS5mbGFncyAgICAgICAgICA9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyID0gdHZlZXByb21fYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQgID0gdHZlZXByb21fZGV0YWNoX2NsaWVudCwKKwkuY29tbWFuZCAgICAgICAgPSB0dmVlcHJvbV9jb21tYW5kLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHZlZXByb21faW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl90dmVlcHJvbSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0dmVlcHJvbV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfdHZlZXByb20pOworfQorCittb2R1bGVfaW5pdCh0dmVlcHJvbV9pbml0KTsKK21vZHVsZV9leGl0KHR2ZWVwcm9tX2V4aXQpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dm1peGVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWZkNzA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dm1peGVyLmMKQEAgLTAsMCArMSwzNjcgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCisjZGVmaW5lIERFVl9NQVggIDQKKworc3RhdGljIGludCBkZXZuciA9IC0xOworbW9kdWxlX3BhcmFtKGRldm5yLCBpbnQsIDA2NDQpOworCitNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBUVk1JWEVSIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqZGV2OworCWludCBtaW5vcjsKKwlpbnQgY291bnQ7Cit9OworCitzdGF0aWMgc3RydWN0IFRWTUlYRVIgZGV2aWNlc1tERVZfTUFYXTsKKworc3RhdGljIGludCB0dm1peGVyX2FkYXB0ZXJzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCk7CitzdGF0aWMgaW50IHR2bWl4ZXJfY2xpZW50cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBtaXhfdG9fdjRsKGludCBpKQoreworCWludCByOworCisJciA9ICgoaSAmIDB4ZmYpICogNjU1MzYgKyA1MCkgLyAxMDA7CisJaWYgKHIgPiA2NTUzNSkgciA9IDY1NTM1OworCWlmIChyIDwgICAgIDApIHIgPSAgICAgMDsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCB2NGxfdG9fbWl4KGludCBpKQoreworCWludCByOworCisJciA9IChpICogMTAwICsgMzI3NjgpIC8gNjU1MzY7CisJaWYgKHIgPiAxMDApIHIgPSAxMDA7CisJaWYgKHIgPCAgIDApIHIgPSAgIDA7CisJcmV0dXJuIHIgfCAociA8PCA4KTsKK30KKworc3RhdGljIGludCB2NGxfdG9fbWl4MihpbnQgbCwgaW50IHIpCit7CisJciA9IChyICogMTAwICsgMzI3NjgpIC8gNjU1MzY7CisJaWYgKHIgPiAxMDApIHIgPSAxMDA7CisJaWYgKHIgPCAgIDApIHIgPSAgIDA7CisJbCA9IChsICogMTAwICsgMzI3NjgpIC8gNjU1MzY7CisJaWYgKGwgPiAxMDApIGwgPSAxMDA7CisJaWYgKGwgPCAgIDApIGwgPSAgIDA7CisJcmV0dXJuIChyIDw8IDgpIHwgbDsKK30KKworc3RhdGljIGludCB0dm1peGVyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fYXVkaW8gdmE7CisJaW50IGxlZnQscmlnaHQscmV0LHZhbCA9IDA7CisgICAgICAgIHN0cnVjdCBUVk1JWEVSICptaXggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IG1peC0+ZGV2OworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisJaWYgKE5VTEwgPT0gY2xpZW50KQorCQlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgICBpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKKyAgICAgICAgICAgICAgICBtaXhlcl9pbmZvIGluZm87CisgICAgICAgICAgICAgICAgc3RybGNweShpbmZvLmlkLCAidHYgY2FyZCIsIHNpemVvZihpbmZvLmlkKSk7CisgICAgICAgICAgICAgICAgc3RybGNweShpbmZvLm5hbWUsIGkyY19jbGllbnRuYW1lKGNsaWVudCksIHNpemVvZihpbmZvLm5hbWUpKTsKKyAgICAgICAgICAgICAgICBpbmZvLm1vZGlmeV9jb3VudGVyID0gNDIgLyogRklYTUUgKi87CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChjbWQgPT0gU09VTkRfT0xEX01JWEVSX0lORk8pIHsKKyAgICAgICAgICAgICAgICBfb2xkX21peGVyX2luZm8gaW5mbzsKKyAgICAgICAgICAgICAgICBzdHJsY3B5KGluZm8uaWQsICJ0diBjYXJkIiwgc2l6ZW9mKGluZm8uaWQpKTsKKyAgICAgICAgICAgICAgICBzdHJsY3B5KGluZm8ubmFtZSwgaTJjX2NsaWVudG5hbWUoY2xpZW50KSwgc2l6ZW9mKGluZm8ubmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihpbmZvKSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY21kID09IE9TU19HRVRWRVJTSU9OKQorICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWlmIChfU0lPQ19ESVIoY21kKSAmIF9TSU9DX1dSSVRFKQorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJLyogcmVhZCBzdGF0ZSAqLworCW1lbXNldCgmdmEsMCxzaXplb2YodmEpKTsKKwljbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsVklESU9DR0FVRElPLCZ2YSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9SRUNNQVNLKToKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfQ0FQUyk6CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JFQ1NSQyk6CisJY2FzZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl9SRUNTUkMpOgorCQlyZXQgPSAwOworCQlicmVhazsKKworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9TVEVSRU9ERVZTKToKKwkJcmV0ID0gU09VTkRfTUFTS19WT0xVTUU7CisJCWJyZWFrOworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9ERVZNQVNLKToKKwkJcmV0ID0gU09VTkRfTUFTS19WT0xVTUU7CisJCWlmICh2YS5mbGFncyAmIFZJREVPX0FVRElPX0JBU1MpCisJCQlyZXQgfD0gU09VTkRfTUFTS19CQVNTOworCQlpZiAodmEuZmxhZ3MgJiBWSURFT19BVURJT19UUkVCTEUpCisJCQlyZXQgfD0gU09VTkRfTUFTS19UUkVCTEU7CisJCWJyZWFrOworCisJY2FzZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl9WT0xVTUUpOgorCQlsZWZ0ICA9IG1peF90b192NGwodmFsKTsKKwkJcmlnaHQgPSBtaXhfdG9fdjRsKHZhbCA+PiA4KTsKKwkJdmEudm9sdW1lICA9IG1heChsZWZ0LHJpZ2h0KTsKKwkJdmEuYmFsYW5jZSA9ICgzMjc2OCptaW4obGVmdCxyaWdodCkpIC8gKHZhLnZvbHVtZSA/IHZhLnZvbHVtZSA6IDEpOworCQl2YS5iYWxhbmNlID0gKGxlZnQ8cmlnaHQpID8gKDY1NTM1LXZhLmJhbGFuY2UpIDogdmEuYmFsYW5jZTsKKwkJaWYgKHZhLnZvbHVtZSkKKwkJCXZhLmZsYWdzICY9IH5WSURFT19BVURJT19NVVRFOworCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsVklESU9DU0FVRElPLCZ2YSk7CisJCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCxWSURJT0NHQVVESU8sJnZhKTsKKwkJLyogZmFsbCB0aHJvdXRoICovCisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1ZPTFVNRSk6CisJCWxlZnQgID0gKG1pbig2NTUzNiAtIHZhLmJhbGFuY2UsMzI3NjgpICoKKwkJCSB2YS52b2x1bWUpIC8gMzI3Njg7CisJCXJpZ2h0ID0gKG1pbih2YS5iYWxhbmNlLCh1MTYpMzI3NjgpICoKKwkJCSB2YS52b2x1bWUpIC8gMzI3Njg7CisJCXJldCA9IHY0bF90b19taXgyKGxlZnQscmlnaHQpOworCQlicmVhazsKKworCWNhc2UgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfQkFTUyk6CisJCXZhLmJhc3MgPSBtaXhfdG9fdjRsKHZhbCk7CisJCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCxWSURJT0NTQVVESU8sJnZhKTsKKwkJY2xpZW50LT5kcml2ZXItPmNvbW1hbmQoY2xpZW50LFZJRElPQ0dBVURJTywmdmEpOworCQkvKiBmYWxsIHRocm91dGggICovCisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0JBU1MpOgorCQlyZXQgPSB2NGxfdG9fbWl4KHZhLmJhc3MpOworCQlicmVhazsKKworCWNhc2UgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfVFJFQkxFKToKKwkJdmEudHJlYmxlID0gbWl4X3RvX3Y0bCh2YWwpOworCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsVklESU9DU0FVRElPLCZ2YSk7CisJCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCxWSURJT0NHQVVESU8sJnZhKTsKKwkJLyogZmFsbCB0aHJvdXRoICovCisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1RSRUJMRSk6CisJCXJldCA9IHY0bF90b19taXgodmEudHJlYmxlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHB1dF91c2VyKHJldCwgcCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR2bWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICAgICAgaW50IGksIG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKyAgICAgICAgc3RydWN0IFRWTUlYRVIgKm1peCA9IE5VTEw7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgREVWX01BWDsgaSsrKSB7CisJCWlmIChkZXZpY2VzW2ldLm1pbm9yID09IG1pbm9yKSB7CisJCQltaXggPSBkZXZpY2VzK2k7CisJCQljbGllbnQgPSBtaXgtPmRldjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKE5VTEwgPT0gY2xpZW50KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGxvY2sgYnR0diBpbiBtZW1vcnkgd2hpbGUgdGhlIG1peGVyIGlzIGluIHVzZSAgKi8KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBtaXg7CisjaWZuZGVmIEkyQ19QRUMKKwlpZiAoY2xpZW50LT5hZGFwdGVyLT5pbmNfdXNlKQorCQljbGllbnQtPmFkYXB0ZXItPmluY191c2UoY2xpZW50LT5hZGFwdGVyKTsKKyNlbmRpZgorCWlmIChjbGllbnQtPmFkYXB0ZXItPm93bmVyKQorCQl0cnlfbW9kdWxlX2dldChjbGllbnQtPmFkYXB0ZXItPm93bmVyKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHZtaXhlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBUVk1JWEVSICptaXggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKworCWNsaWVudCA9IG1peC0+ZGV2OworCWlmIChOVUxMID09IGNsaWVudCkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKyNpZm5kZWYgSTJDX1BFQworCWlmIChjbGllbnQtPmFkYXB0ZXItPmRlY191c2UpCisJCWNsaWVudC0+YWRhcHRlci0+ZGVjX3VzZShjbGllbnQtPmFkYXB0ZXIpOworI2VuZGlmCisJaWYgKGNsaWVudC0+YWRhcHRlci0+b3duZXIpCisJCW1vZHVsZV9wdXQoY2xpZW50LT5hZGFwdGVyLT5vd25lcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7CisjaWZkZWYgSTJDX1BFQworCS5vd25lciAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKyNlbmRpZgorCS5uYW1lICAgICAgICAgICAgPSAidHYgY2FyZCBtaXhlciBkcml2ZXIiLAorICAgICAgICAuaWQgICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1RWTUlYRVIsCisjaWZkZWYgSTJDX0RGX0RVTU1ZCisJLmZsYWdzICAgICAgICAgICA9IEkyQ19ERl9EVU1NWSwKKyNlbHNlCisJLmZsYWdzICAgICAgICAgICA9IEkyQ19ERl9OT1RJRlksCisgICAgICAgIC5kZXRhY2hfYWRhcHRlciAgPSB0dm1peGVyX2FkYXB0ZXJzLAorI2VuZGlmCisgICAgICAgIC5hdHRhY2hfYWRhcHRlciAgPSB0dm1peGVyX2FkYXB0ZXJzLAorICAgICAgICAuZGV0YWNoX2NsaWVudCAgID0gdHZtaXhlcl9jbGllbnRzLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHZtaXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCisJLmlvY3RsICAgICAgICAgID0gdHZtaXhlcl9pb2N0bCwKKwkub3BlbiAgICAgICAgICAgPSB0dm1peGVyX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gdHZtaXhlcl9yZWxlYXNlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB0dm1peGVyX2FkYXB0ZXJzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICAqaXRlbTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCisJbGlzdF9mb3JfZWFjaChpdGVtLCZhZGFwLT5jbGllbnRzKSB7CisJCWNsaWVudCA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGkyY19jbGllbnQsIGxpc3QpOworCQl0dm1peGVyX2NsaWVudHMoY2xpZW50KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHZtaXhlcl9jbGllbnRzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHZpZGVvX2F1ZGlvIHZhOworCWludCBpLG1pbm9yOworCisjaWZkZWYgSTJDX0NMQVNTX1RWX0FOQUxPRworCWlmICghKGNsaWVudC0+YWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKSkKKwkJcmV0dXJuIC0xOworI2Vsc2UKKwkvKiBUViBjYXJkID8/PyAqLworCXN3aXRjaCAoY2xpZW50LT5hZGFwdGVyLT5pZCkgeworCWNhc2UgSTJDX0FMR09fQklUIHwgSTJDX0hXX1NNQlVTX1ZPT0RPTzM6CisJY2FzZSBJMkNfQUxHT19CSVQgfCBJMkNfSFdfQl9CVDg0ODoKKwljYXNlIEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX1JJVkE6CisJCS8qIG9rLCBoYXZlIGEgbG9vayAuLi4gKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogaWdub3JlIHRoYXQgb25lICovCisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworCS8qIHVucmVnaXN0ZXIgPz8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgREVWX01BWDsgaSsrKSB7CisJCWlmIChkZXZpY2VzW2ldLmRldiA9PSBjbGllbnQpIHsKKwkJCS8qIHVucmVnaXN0ZXIgKi8KKwkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoZGV2aWNlc1tpXS5taW5vcik7CisJCQlkZXZpY2VzW2ldLmRldiA9IE5VTEw7CisJCQlkZXZpY2VzW2ldLm1pbm9yID0gLTE7CisJCQlwcmludGsoInR2bWl4ZXI6ICVzIHVucmVnaXN0ZXJlZCAoIzEpXG4iLAorCQkJICAgICAgIGkyY19jbGllbnRuYW1lKGNsaWVudCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBsb29rIGZvciBhIGZyZWUgc2xvdCAqLworCWZvciAoaSA9IDA7IGkgPCBERVZfTUFYOyBpKyspCisJCWlmIChOVUxMID09IGRldmljZXNbaV0uZGV2KQorCQkJYnJlYWs7CisJaWYgKGkgPT0gREVWX01BWCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0dm1peGVyOiBERVZfTUFYIHRvbyBzbWFsbFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhdWRpbyBjaGlwIHdpdGggbWl4ZXIgPz8/ICovCisJaWYgKE5VTEwgPT0gY2xpZW50LT5kcml2ZXItPmNvbW1hbmQpCisJCXJldHVybiAtMTsKKwltZW1zZXQoJnZhLDAsc2l6ZW9mKHZhKSk7CisJaWYgKDAgIT0gY2xpZW50LT5kcml2ZXItPmNvbW1hbmQoY2xpZW50LFZJRElPQ0dBVURJTywmdmEpKQorCQlyZXR1cm4gLTE7CisJaWYgKDAgPT0gKHZhLmZsYWdzICYgVklERU9fQVVESU9fVk9MVU1FKSkKKwkJcmV0dXJuIC0xOworCisJLyogZXZlcnl0aGluZyBpcyBmaW5lLCByZWdpc3RlciAqLworCWlmICgobWlub3IgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmdHZtaXhlcl9mb3BzLGRldm5yKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidHZtaXhlcjogY2Fubm90IGFsbG9jYXRlIG1peGVyIGRldmljZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkZXZpY2VzW2ldLm1pbm9yID0gbWlub3I7CisJZGV2aWNlc1tpXS5jb3VudCA9IDA7CisJZGV2aWNlc1tpXS5kZXYgICA9IGNsaWVudDsKKwlwcmludGsoInR2bWl4ZXI6ICVzICglcykgcmVnaXN0ZXJlZCB3aXRoIG1pbm9yICVkXG4iLAorCSAgICAgICBjbGllbnQtPm5hbWUsY2xpZW50LT5hZGFwdGVyLT5uYW1lLG1pbm9yKTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCB0dm1peGVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgREVWX01BWDsgaSsrKQorCQlkZXZpY2VzW2ldLm1pbm9yID0gLTE7CisKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0dm1peGVyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlpMmNfZGVsX2RyaXZlcigmZHJpdmVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgREVWX01BWDsgaSsrKSB7CisJCWlmIChkZXZpY2VzW2ldLm1pbm9yICE9IC0xKSB7CisJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGRldmljZXNbaV0ubWlub3IpOworCQkJcHJpbnRrKCJ0dm1peGVyOiAlcyB1bnJlZ2lzdGVyZWQgKCMyKVxuIiwKKwkJCSAgICAgICBpMmNfY2xpZW50bmFtZShkZXZpY2VzW2ldLmRldikpOworCQl9CisJfQorfQorCittb2R1bGVfaW5pdCh0dm1peGVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHR2bWl4ZXJfY2xlYW51cF9tb2R1bGUpOworCisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQ0YmNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCkBAIC0wLDAgKzEsMTAzNiBAQAorLyoKKyAqCVZpZGVvIGZvciBMaW51eCBUd28KKyAqCUJhY2t3YXJkIENvbXBhdGliaWxpdHkgTGF5ZXIKKyAqCisgKglTdXBwb3J0IHN1YnJvdXRpbmVzIGZvciBwcm92aWRpbmcgVjRMMiBkcml2ZXJzIHdpdGggYmFja3dhcmQKKyAqCWNvbXBhdGliaWxpdHkgd2l0aCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIG9sZCBBUEkuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3I6CUJpbGwgRGlya3MgPGJkaXJrc0BwYWNiZWxsLm5ldD4KKyAqCQlldCBhbC4KKyAqCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2lmZGVmIENPTkZJR19LTU9ECisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyIpOworTU9EVUxFX0FVVEhPUigiQmlsbCBEaXJrcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ2NGwoMSkgY29tcGF0aWJpbGl0eSBsYXllciBmb3IgdjRsMiBkcml2ZXJzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pCWlmIChkZWJ1ZykgXAorCXByaW50ayhLRVJOX0RFQlVHICJ2NGwxLWNvbXBhdDogIiBmbXQgLCAjIyBhcmcpCisKKy8qCisgKglJIE8gQyBUIEwgICBUIFIgQSBOIFMgTCBBIFQgSSBPIE4KKyAqCisgKglGcm9tIGhlcmUgb24gZG93biBpcyB0aGUgY29kZSBmb3IgdHJhbnNsYXRpbmcgdGhlIG51bWVyb3VzCisgKglpb2N0bCBjb21tYW5kcyBmcm9tIHRoZSBvbGQgQVBJIHRvIHRoZSBuZXcgQVBJLgorICovCisKK3N0YXRpYyBpbnQKK2dldF92NGxfY29udHJvbChzdHJ1Y3QgaW5vZGUgICAgICAgICAgICAqaW5vZGUsCisJCXN0cnVjdCBmaWxlICAgICAgICAgICAgICpmaWxlLAorCQlpbnQJCQljaWQsCisJCXY0bDJfa2lvY3RsICAgICAgICAgICAgIGRydikKK3sKKwlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwJcWN0cmwyOworCXN0cnVjdCB2NGwyX2NvbnRyb2wJY3RybDI7CisJaW50CQkJZXJyOworCisJcWN0cmwyLmlkID0gY2lkOworCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1FVRVJZQ1RSTCwgJnFjdHJsMik7CisJaWYgKGVyciA8IDApCisJCWRwcmludGsoIlZJRElPQ19RVUVSWUNUUkw6ICVkXG4iLGVycik7CisJaWYgKGVyciA9PSAwICYmCisJICAgICEocWN0cmwyLmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQpKQorCXsKKwkJY3RybDIuaWQgPSBxY3RybDIuaWQ7CisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfQ1RSTCwgJmN0cmwyKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRwcmludGsoIlZJRElPQ19HX0NUUkw6ICVkXG4iLGVycik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gKChjdHJsMi52YWx1ZSAtIHFjdHJsMi5taW5pbXVtKSAqIDY1NTM1CisJCQkgKyAocWN0cmwyLm1heGltdW0gLSBxY3RybDIubWluaW11bSkgLyAyKQorCQkJLyAocWN0cmwyLm1heGltdW0gLSBxY3RybDIubWluaW11bSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZXRfdjRsX2NvbnRyb2woc3RydWN0IGlub2RlICAgICAgICAgICAgKmlub2RlLAorCQlzdHJ1Y3QgZmlsZSAgICAgICAgICAgICAqZmlsZSwKKwkJaW50CQkJY2lkLAorCQlpbnQJCQl2YWx1ZSwKKwkJdjRsMl9raW9jdGwgICAgICAgICAgICAgZHJ2KQoreworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybAlxY3RybDI7CisJc3RydWN0IHY0bDJfY29udHJvbAljdHJsMjsKKwlpbnQJCQllcnI7CisKKwlxY3RybDIuaWQgPSBjaWQ7CisJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfUVVFUllDVFJMLCAmcWN0cmwyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZHByaW50aygiVklESU9DX1FVRVJZQ1RSTDogJWRcbiIsZXJyKTsKKwlpZiAoZXJyID09IDAgJiYKKwkgICAgIShxY3RybDIuZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCkgJiYKKwkgICAgIShxY3RybDIuZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19HUkFCQkVEKSkKKwl7CisJCWlmICh2YWx1ZSA8IDApCisJCQl2YWx1ZSA9IDA7CisJCWlmICh2YWx1ZSA+IDY1NTM1KQorCQkJdmFsdWUgPSA2NTUzNTsKKwkJaWYgKHZhbHVlICYmIHFjdHJsMi50eXBlID09IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4pCisJCQl2YWx1ZSA9IDY1NTM1OworCQljdHJsMi5pZCA9IHFjdHJsMi5pZDsKKwkJY3RybDIudmFsdWUgPQorCQkJKHZhbHVlICogKHFjdHJsMi5tYXhpbXVtIC0gcWN0cmwyLm1pbmltdW0pCisJCQkgKyAzMjc2NykKKwkJCS8gNjU1MzU7CisJCWN0cmwyLnZhbHVlICs9IHFjdHJsMi5taW5pbXVtOworCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0NUUkwsICZjdHJsMik7CisJCWlmIChlcnIgPCAwKQorCQkJZHByaW50aygiVklESU9DX1NfQ1RSTDogJWRcbiIsZXJyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcGFsZXR0ZTJwaXhlbGZvcm1hdFtdID0geworCVtWSURFT19QQUxFVFRFX0dSRVldICAgID0gVjRMMl9QSVhfRk1UX0dSRVksCisJW1ZJREVPX1BBTEVUVEVfUkdCNTU1XSAgPSBWNEwyX1BJWF9GTVRfUkdCNTU1LAorCVtWSURFT19QQUxFVFRFX1JHQjU2NV0gID0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKKwlbVklERU9fUEFMRVRURV9SR0IyNF0gICA9IFY0TDJfUElYX0ZNVF9CR1IyNCwKKwlbVklERU9fUEFMRVRURV9SR0IzMl0gICA9IFY0TDJfUElYX0ZNVF9CR1IzMiwKKwkvKiB5dXYgcGFja2VkIHBpeGVsICovCisJW1ZJREVPX1BBTEVUVEVfWVVZVl0gICAgPSBWNEwyX1BJWF9GTVRfWVVZViwKKwlbVklERU9fUEFMRVRURV9ZVVY0MjJdICA9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCVtWSURFT19QQUxFVFRFX1VZVlldICAgID0gVjRMMl9QSVhfRk1UX1VZVlksCisJLyogeXV2IHBsYW5hciAqLworCVtWSURFT19QQUxFVFRFX1lVVjQxMFBdID0gVjRMMl9QSVhfRk1UX1lVVjQxMCwKKwlbVklERU9fUEFMRVRURV9ZVVY0MjBdICA9IFY0TDJfUElYX0ZNVF9ZVVY0MjAsCisJW1ZJREVPX1BBTEVUVEVfWVVWNDIwUF0gPSBWNEwyX1BJWF9GTVRfWVVWNDIwLAorCVtWSURFT19QQUxFVFRFX1lVVjQxMVBdID0gVjRMMl9QSVhfRk1UX1lVVjQxMVAsCisJW1ZJREVPX1BBTEVUVEVfWVVWNDIyUF0gPSBWNEwyX1BJWF9GTVRfWVVWNDIyUCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3BhbGV0dGVfdG9fcGl4ZWxmb3JtYXQodW5zaWduZWQgaW50IHBhbGV0dGUpCit7CisJaWYgKHBhbGV0dGUgPCBBUlJBWV9TSVpFKHBhbGV0dGUycGl4ZWxmb3JtYXQpKQorCQlyZXR1cm4gcGFsZXR0ZTJwaXhlbGZvcm1hdFtwYWxldHRlXTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitwaXhlbGZvcm1hdF90b19wYWxldHRlKGludCBwaXhlbGZvcm1hdCkKK3sKKwlpbnQJcGFsZXR0ZSA9IDA7CisJc3dpdGNoIChwaXhlbGZvcm1hdCkKKwl7CisJY2FzZSBWNEwyX1BJWF9GTVRfR1JFWToKKwkJcGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfR1JFWTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1OgorCQlwYWxldHRlID0gVklERU9fUEFMRVRURV9SR0I1NTU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwkJcGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCNTY1OworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9CR1IyNDoKKwkJcGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX0JHUjMyOgorCQlwYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IzMjsKKwkJYnJlYWs7CisJLyogeXV2IHBhY2tlZCBwaXhlbCAqLworCWNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6CisJCXBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1lVWVY7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6CisJCXBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1VZVlk7CisJCWJyZWFrOworCS8qIHl1diBwbGFuYXIgKi8KKwljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MTA6CisJCXBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1lVVjQyMDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOgorCQlwYWxldHRlID0gVklERU9fUEFMRVRURV9ZVVY0MjA7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQxMVA6CisJCXBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1lVVjQxMVA7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMlA6CisJCXBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1lVVjQyMlA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcGFsZXR0ZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBwb2xsX29uZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0dmFsID0gMTsKKwlwb2xsX3RhYmxlICp0YWJsZTsKKwlzdHJ1Y3QgcG9sbF93cXVldWVzIHB3cTsKKworCXBvbGxfaW5pdHdhaXQoJnB3cSk7CisJdGFibGUgPSAmcHdxLnB0OworCWZvciAoOzspIHsKKwkJaW50IG1hc2s7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCW1hc2sgPSBmaWxlLT5mX29wLT5wb2xsKGZpbGUsIHRhYmxlKTsKKwkJaWYgKG1hc2sgJiBQT0xMSU4pCisJCQlicmVhazsKKwkJdGFibGUgPSBOVUxMOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcG9sbF9mcmVld2FpdCgmcHdxKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGNvdW50X2lucHV0cyhzdHJ1Y3QgaW5vZGUgICAgICAgICAqaW5vZGUsCisJCQlzdHJ1Y3QgZmlsZSAgICAgICAgICAqZmlsZSwKKwkJCXY0bDJfa2lvY3RsICAgICAgICAgIGRydikKK3sKKwlzdHJ1Y3QgdjRsMl9pbnB1dCBpbnB1dDI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOzsgaSsrKSB7CisJCW1lbXNldCgmaW5wdXQyLDAsc2l6ZW9mKGlucHV0MikpOworCQlpbnB1dDIuaW5kZXggPSBpOworCQlpZiAoMCAhPSBkcnYoaW5vZGUsZmlsZSxWSURJT0NfRU5VTUlOUFVULCAmaW5wdXQyKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBjaGVja19zaXplKHN0cnVjdCBpbm9kZSAgICAgICAgICppbm9kZSwKKwkJICAgICAgc3RydWN0IGZpbGUgICAgICAgICAgKmZpbGUsCisJCSAgICAgIHY0bDJfa2lvY3RsICAgICAgICAgIGRydiwKKwkJICAgICAgaW50ICptYXh3LCBpbnQgKm1heGgpCit7CisJc3RydWN0IHY0bDJfZm10ZGVzYyBkZXNjMjsKKwlzdHJ1Y3QgdjRsMl9mb3JtYXQgIGZtdDI7CisKKwltZW1zZXQoJmRlc2MyLDAsc2l6ZW9mKGRlc2MyKSk7CisJbWVtc2V0KCZmbXQyLDAsc2l6ZW9mKGZtdDIpKTsKKworCWRlc2MyLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJaWYgKDAgIT0gZHJ2KGlub2RlLGZpbGUsVklESU9DX0VOVU1fRk1ULCAmZGVzYzIpKQorCQlnb3RvIGRvbmU7CisKKwlmbXQyLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJZm10Mi5mbXQucGl4LndpZHRoICAgICAgID0gMTAwMDA7CisJZm10Mi5mbXQucGl4LmhlaWdodCAgICAgID0gMTAwMDA7CisJZm10Mi5mbXQucGl4LnBpeGVsZm9ybWF0ID0gZGVzYzIucGl4ZWxmb3JtYXQ7CisJaWYgKDAgIT0gZHJ2KGlub2RlLGZpbGUsVklESU9DX1RSWV9GTVQsICZmbXQyKSkKKwkJZ290byBkb25lOworCisJKm1heHcgPSBmbXQyLmZtdC5waXgud2lkdGg7CisJKm1heGggPSBmbXQyLmZtdC5waXguaGVpZ2h0OworCisgZG9uZToKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQuCisgKi8KK2ludAordjRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoc3RydWN0IGlub2RlICAgICAgICAgKmlub2RlLAorCQkJICAgc3RydWN0IGZpbGUJCSpmaWxlLAorCQkJICAgaW50CQkJY21kLAorCQkJICAgdm9pZAkJCSphcmcsCisJCQkgICB2NGwyX2tpb2N0bCAgICAgICAgICBkcnYpCit7CisJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAgKmNhcDIgPSBOVUxMOworCXN0cnVjdCB2NGwyX2Zvcm1hdAkqZm10MiA9IE5VTEw7CisJZW51bSB2NGwyX2J1Zl90eXBlICAgICAgY2FwdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKworCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyIGZidWYyOworCXN0cnVjdCB2NGwyX2lucHV0CWlucHV0MjsKKwlzdHJ1Y3QgdjRsMl90dW5lcgl0dW4yOworCXN0cnVjdCB2NGwyX3N0YW5kYXJkCXN0ZDI7CisJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICAgZnJlcTI7CisJc3RydWN0IHY0bDJfYXVkaW8JYXVkMjsKKwlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwJcWN0cmwyOworCXN0cnVjdCB2NGwyX2J1ZmZlcglidWYyOworCXY0bDJfc3RkX2lkICAgIAkJc2lkOworCWludCBpLCBlcnIgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ0dDQVA6CS8qIGNhcGFiaWxpdHkgKi8KKwl7CisJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJY2FwMiA9IGttYWxsb2Moc2l6ZW9mKCpjYXAyKSxHRlBfS0VSTkVMKTsKKwkJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKCpjYXApKTsKKwkJbWVtc2V0KGNhcDIsIDAsIHNpemVvZigqY2FwMikpOworCQltZW1zZXQoJmZidWYyLCAwLCBzaXplb2YoZmJ1ZjIpKTsKKworCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19RVUVSWUNBUCwgY2FwMik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkcHJpbnRrKCJWSURJT0NHQ0FQIC8gVklESU9DX1FVRVJZQ0FQOiAlZFxuIixlcnIpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNhcDItPmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1ZJREVPX09WRVJMQVkpIHsKKwkJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfRkJVRiwgJmZidWYyKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJZHByaW50aygiVklESU9DR0NBUCAvIFZJRElPQ19HX0ZCVUY6ICVkXG4iLGVycik7CisJCQkJbWVtc2V0KCZmYnVmMiwgMCwgc2l6ZW9mKGZidWYyKSk7CisJCQl9CisJCQllcnIgPSAwOworCQl9CisKKwkJbWVtY3B5KGNhcC0+bmFtZSwgY2FwMi0+Y2FyZCwKKwkJICAgICAgIG1pbihzaXplb2YoY2FwLT5uYW1lKSwgc2l6ZW9mKGNhcDItPmNhcmQpKSk7CisJCWNhcC0+bmFtZVtzaXplb2YoY2FwLT5uYW1lKSAtIDFdID0gMDsKKwkJaWYgKGNhcDItPmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUpCisJCQljYXAtPnR5cGUgfD0gVklEX1RZUEVfQ0FQVFVSRTsKKwkJaWYgKGNhcDItPmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1RVTkVSKQorCQkJY2FwLT50eXBlIHw9IFZJRF9UWVBFX1RVTkVSOworCQlpZiAoY2FwMi0+Y2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVkJJX0NBUFRVUkUpCisJCQljYXAtPnR5cGUgfD0gVklEX1RZUEVfVEVMRVRFWFQ7CisJCWlmIChjYXAyLT5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19PVkVSTEFZKQorCQkJY2FwLT50eXBlIHw9IFZJRF9UWVBFX09WRVJMQVk7CisJCWlmIChmYnVmMi5jYXBhYmlsaXR5ICYgVjRMMl9GQlVGX0NBUF9MSVNUX0NMSVBQSU5HKQorCQkJY2FwLT50eXBlIHw9IFZJRF9UWVBFX0NMSVBQSU5HOworCisJCWNhcC0+Y2hhbm5lbHMgID0gY291bnRfaW5wdXRzKGlub2RlLGZpbGUsZHJ2KTsKKwkJY2hlY2tfc2l6ZShpbm9kZSxmaWxlLGRydiwKKwkJCSAgICZjYXAtPm1heHdpZHRoLCZjYXAtPm1heGhlaWdodCk7CisJCWNhcC0+YXVkaW9zICAgID0gIDA7IC8qIEZJWE1FICovCisJCWNhcC0+bWlud2lkdGggID0gNDg7IC8qIEZJWE1FICovCisJCWNhcC0+bWluaGVpZ2h0ID0gMzI7IC8qIEZJWE1FICovCisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ0dGQlVGOiAvKiAgZ2V0IGZyYW1lIGJ1ZmZlciAgKi8KKwl7CisJCXN0cnVjdCB2aWRlb19idWZmZXIJKmJ1ZmZlciA9IGFyZzsKKworCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19HX0ZCVUYsICZmYnVmMik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkcHJpbnRrKCJWSURJT0NHRkJVRiAvIFZJRElPQ19HX0ZCVUY6ICVkXG4iLGVycik7CisJCQlicmVhazsKKwkJfQorCQlidWZmZXItPmJhc2UgICA9IGZidWYyLmJhc2U7CisJCWJ1ZmZlci0+aGVpZ2h0ID0gZmJ1ZjIuZm10LmhlaWdodDsKKwkJYnVmZmVyLT53aWR0aCAgPSBmYnVmMi5mbXQud2lkdGg7CisKKwkJc3dpdGNoIChmYnVmMi5mbXQucGl4ZWxmb3JtYXQpIHsKKwkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzMyOgorCQkJYnVmZmVyLT5kZXB0aCA9IDg7CisJCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NToKKwkJCWJ1ZmZlci0+ZGVwdGggPSAxNTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisJCQlidWZmZXItPmRlcHRoID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1BJWF9GTVRfQkdSMjQ6CisJCQlidWZmZXItPmRlcHRoID0gMjQ7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1BJWF9GTVRfQkdSMzI6CisJCQlidWZmZXItPmRlcHRoID0gMzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJ1ZmZlci0+ZGVwdGggPSAwOworCQl9CisJCWlmICgwICE9IGZidWYyLmZtdC5ieXRlc3BlcmxpbmUpCisJCQlidWZmZXItPmJ5dGVzcGVybGluZSA9IGZidWYyLmZtdC5ieXRlc3BlcmxpbmU7CisJCWVsc2UgeworCQkJYnVmZmVyLT5ieXRlc3BlcmxpbmUgPQorCQkJCShidWZmZXItPndpZHRoICogYnVmZmVyLT5kZXB0aCArIDcpICYgNzsKKwkJCWJ1ZmZlci0+Ynl0ZXNwZXJsaW5lID4+PSAzOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ1NGQlVGOiAvKiAgc2V0IGZyYW1lIGJ1ZmZlciAgKi8KKwl7CisJCXN0cnVjdCB2aWRlb19idWZmZXIJKmJ1ZmZlciA9IGFyZzsKKworCQltZW1zZXQoJmZidWYyLCAwLCBzaXplb2YoZmJ1ZjIpKTsKKwkJZmJ1ZjIuYmFzZSAgICAgICA9IGJ1ZmZlci0+YmFzZTsKKwkJZmJ1ZjIuZm10LmhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworCQlmYnVmMi5mbXQud2lkdGggID0gYnVmZmVyLT53aWR0aDsKKwkJc3dpdGNoIChidWZmZXItPmRlcHRoKSB7CisJCWNhc2UgODoKKwkJCWZidWYyLmZtdC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0IzMzI7CisJCQlicmVhazsKKwkJY2FzZSAxNToKKwkJCWZidWYyLmZtdC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0I1NTU7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCWZidWYyLmZtdC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0I1NjU7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCWZidWYyLmZtdC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9CR1IyNDsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJZmJ1ZjIuZm10LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0JHUjMyOworCQkJYnJlYWs7CisJCX0KKwkJZmJ1ZjIuZm10LmJ5dGVzcGVybGluZSA9IGJ1ZmZlci0+Ynl0ZXNwZXJsaW5lOworCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0ZCVUYsICZmYnVmMik7CisJCWlmIChlcnIgPCAwKQorCQkJZHByaW50aygiVklESU9DU0ZCVUYgLyBWSURJT0NfU19GQlVGOiAlZFxuIixlcnIpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NHV0lOOiAvKiAgZ2V0IHdpbmRvdyBvciBjYXB0dXJlIGRpbWVuc2lvbnMgICovCisJeworCQlzdHJ1Y3QgdmlkZW9fd2luZG93CSp3aW4gPSBhcmc7CisKKwkJZm10MiA9IGttYWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKKwkJbWVtc2V0KHdpbiwwLHNpemVvZigqd2luKSk7CisJCW1lbXNldChmbXQyLDAsc2l6ZW9mKCpmbXQyKSk7CisKKwkJZm10Mi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWTsKKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19GTVQsIGZtdDIpOworCQlpZiAoZXJyIDwgMCkKKwkJCWRwcmludGsoIlZJRElPQ0dXSU4gLyBWSURJT0NfR19XSU46ICVkXG4iLGVycik7CisJCWlmIChlcnIgPT0gMCkgeworCQkJd2luLT54ICAgICAgICAgPSBmbXQyLT5mbXQud2luLncubGVmdDsKKwkJCXdpbi0+eSAgICAgICAgID0gZm10Mi0+Zm10Lndpbi53LnRvcDsKKwkJCXdpbi0+d2lkdGggICAgID0gZm10Mi0+Zm10Lndpbi53LndpZHRoOworCQkJd2luLT5oZWlnaHQgICAgPSBmbXQyLT5mbXQud2luLncuaGVpZ2h0OworCQkJd2luLT5jaHJvbWFrZXkgPSBmbXQyLT5mbXQud2luLmNocm9tYWtleTsKKwkJCXdpbi0+Y2xpcHMgICAgID0gTlVMTDsKKwkJCXdpbi0+Y2xpcGNvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJZm10Mi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19GTVQsIGZtdDIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZHByaW50aygiVklESU9DR1dJTiAvIFZJRElPQ19HX0ZNVDogJWRcbiIsZXJyKTsKKwkJCWJyZWFrOworCQl9CisJCXdpbi0+eCAgICAgICAgID0gMDsKKwkJd2luLT55ICAgICAgICAgPSAwOworCQl3aW4tPndpZHRoICAgICA9IGZtdDItPmZtdC5waXgud2lkdGg7CisJCXdpbi0+aGVpZ2h0ICAgID0gZm10Mi0+Zm10LnBpeC5oZWlnaHQ7CisJCXdpbi0+Y2hyb21ha2V5ID0gMDsKKwkJd2luLT5jbGlwcyAgICAgPSBOVUxMOworCQl3aW4tPmNsaXBjb3VudCA9IDA7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ1NXSU46IC8qICBzZXQgd2luZG93IGFuZC9vciBjYXB0dXJlIGRpbWVuc2lvbnMgICovCisJeworCQlzdHJ1Y3QgdmlkZW9fd2luZG93CSp3aW4gPSBhcmc7CisJCWludCBlcnIxLGVycjI7CisKKwkJZm10MiA9IGttYWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKKwkJbWVtc2V0KGZtdDIsMCxzaXplb2YoKmZtdDIpKTsKKwkJZm10Mi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfU1RSRUFNT0ZGLCAmZm10Mi0+dHlwZSk7CisJCWVycjEgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19HX0ZNVCwgZm10Mik7CisJCWlmIChlcnIxIDwgMCkKKwkJCWRwcmludGsoIlZJRElPQ1NXSU4gLyBWSURJT0NfR19GTVQ6ICVkXG4iLGVycik7CisJCWlmIChlcnIxID09IDApIHsKKwkJCWZtdDItPmZtdC5waXgud2lkdGggID0gd2luLT53aWR0aDsKKwkJCWZtdDItPmZtdC5waXguaGVpZ2h0ID0gd2luLT5oZWlnaHQ7CisJCQlmbXQyLT5mbXQucGl4LmZpZWxkICA9IFY0TDJfRklFTERfQU5ZOworCQkJZm10Mi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSAwOworCQkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfU19GTVQsIGZtdDIpOworCQkJaWYgKGVyciA8IDApCisJCQkJZHByaW50aygiVklESU9DU1dJTiAvIFZJRElPQ19TX0ZNVCAjMTogJWRcbiIsCisJCQkJCWVycik7CisJCQl3aW4tPndpZHRoICA9IGZtdDItPmZtdC5waXgud2lkdGg7CisJCQl3aW4tPmhlaWdodCA9IGZtdDItPmZtdC5waXguaGVpZ2h0OworCQl9CisKKwkJbWVtc2V0KGZtdDIsMCxzaXplb2YoKmZtdDIpKTsKKwkJZm10Mi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWTsKKwkJZm10Mi0+Zm10Lndpbi53LmxlZnQgICAgPSB3aW4tPng7CisJCWZtdDItPmZtdC53aW4udy50b3AgICAgID0gd2luLT55OworCQlmbXQyLT5mbXQud2luLncud2lkdGggICA9IHdpbi0+d2lkdGg7CisJCWZtdDItPmZtdC53aW4udy5oZWlnaHQgID0gd2luLT5oZWlnaHQ7CisJCWZtdDItPmZtdC53aW4uY2hyb21ha2V5ID0gd2luLT5jaHJvbWFrZXk7CisJCWZtdDItPmZtdC53aW4uY2xpcHMgICAgID0gKHZvaWQgX191c2VyICopd2luLT5jbGlwczsKKwkJZm10Mi0+Zm10Lndpbi5jbGlwY291bnQgPSB3aW4tPmNsaXBjb3VudDsKKwkJZXJyMiA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1NfRk1ULCBmbXQyKTsKKwkJaWYgKGVycjIgPCAwKQorCQkJZHByaW50aygiVklESU9DU1dJTiAvIFZJRElPQ19TX0ZNVCAjMjogJWRcbiIsZXJyKTsKKworCQlpZiAoZXJyMSAhPSAwICYmIGVycjIgIT0gMCkKKwkJCWVyciA9IGVycjE7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ0NBUFRVUkU6IC8qICB0dXJuIG9uL29mZiBwcmV2aWV3ICAqLworCXsKKwkJaW50ICpvbiA9IGFyZzsKKworCQlpZiAoMCA9PSAqb24pIHsKKwkJCS8qIGRpcnR5IGhhY2sgdGltZS4gIEJ1dCB2NGwxIGhhcyBubyBTVFJFQU1PRkYKKwkJCSAqIGVxdWl2YWxlbnQgaW4gdGhlIEFQSSwgYW5kIHRoaXMgb25lIGF0CisJCQkgKiBsZWFzdCBjb21lcyBjbG9zZSAuLi4gKi8KKwkJCWRydihpbm9kZSwgZmlsZSwgVklESU9DX1NUUkVBTU9GRiwgJmNhcHR5cGUpOworCQl9CisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX09WRVJMQVksIGFyZyk7CisJCWlmIChlcnIgPCAwKQorCQkJZHByaW50aygiVklESU9DQ0FQVFVSRSAvIFZJRElPQ19QUkVWSUVXOiAlZFxuIixlcnIpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NHQ0hBTjogLyogIGdldCBpbnB1dCBpbmZvcm1hdGlvbiAgKi8KKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsCSpjaGFuID0gYXJnOworCisJCW1lbXNldCgmaW5wdXQyLDAsc2l6ZW9mKGlucHV0MikpOworCQlpbnB1dDIuaW5kZXggPSBjaGFuLT5jaGFubmVsOworCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19FTlVNSU5QVVQsICZpbnB1dDIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZHByaW50aygiVklESU9DR0NIQU4gLyBWSURJT0NfRU5VTUlOUFVUOiAiCisJCQkJImNoYW5uZWw9JWQgZXJyPSVkXG4iLGNoYW4tPmNoYW5uZWwsZXJyKTsKKwkJCWJyZWFrOworCQl9CisJCWNoYW4tPmNoYW5uZWwgPSBpbnB1dDIuaW5kZXg7CisJCW1lbWNweShjaGFuLT5uYW1lLCBpbnB1dDIubmFtZSwKKwkJICAgICAgIG1pbihzaXplb2YoY2hhbi0+bmFtZSksIHNpemVvZihpbnB1dDIubmFtZSkpKTsKKwkJY2hhbi0+bmFtZVtzaXplb2YoY2hhbi0+bmFtZSkgLSAxXSA9IDA7CisJCWNoYW4tPnR1bmVycyA9IChpbnB1dDIudHlwZSA9PSBWNEwyX0lOUFVUX1RZUEVfVFVORVIpID8gMSA6IDA7CisJCWNoYW4tPmZsYWdzID0gKGNoYW4tPnR1bmVycykgPyBWSURFT19WQ19UVU5FUiA6IDA7CisJCXN3aXRjaCAoaW5wdXQyLnR5cGUpIHsKKwkJY2FzZSBWNEwyX0lOUFVUX1RZUEVfVFVORVI6CisJCQljaGFuLT50eXBlID0gVklERU9fVFlQRV9UVjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE6CisJCQljaGFuLT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCQlicmVhazsKKwkJfQorCQljaGFuLT5ub3JtID0gMDsKKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19TVEQsICZzaWQpOworCQlpZiAoZXJyIDwgMCkKKwkJCWRwcmludGsoIlZJRElPQ0dDSEFOIC8gVklESU9DX0dfU1REOiAlZFxuIixlcnIpOworCQlpZiAoZXJyID09IDApIHsKKwkJCWlmIChzaWQgJiBWNEwyX1NURF9QQUwpCisJCQkJY2hhbi0+bm9ybSA9IFZJREVPX01PREVfUEFMOworCQkJaWYgKHNpZCAmIFY0TDJfU1REX05UU0MpCisJCQkJY2hhbi0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKKwkJCWlmIChzaWQgJiBWNEwyX1NURF9TRUNBTSkKKwkJCQljaGFuLT5ub3JtID0gVklERU9fTU9ERV9TRUNBTTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NTQ0hBTjogLyogIHNldCBpbnB1dCAgKi8KKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICpjaGFuID0gYXJnOworCisJCXNpZCA9IDA7CisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1NfSU5QVVQsICZjaGFuLT5jaGFubmVsKTsKKwkJaWYgKGVyciA8IDApCisJCQlkcHJpbnRrKCJWSURJT0NTQ0hBTiAvIFZJRElPQ19TX0lOUFVUOiAlZFxuIixlcnIpOworCQlzd2l0Y2ggKGNoYW4tPm5vcm0pIHsKKwkJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJCXNpZCA9IFY0TDJfU1REX1BBTDsKKwkJCWJyZWFrOworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCXNpZCA9IFY0TDJfU1REX05UU0M7CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19NT0RFX1NFQ0FNOgorCQkJc2lkID0gVjRMMl9TVERfU0VDQU07CisJCQlicmVhazsKKwkJfQorCQlpZiAoMCAhPSBzaWQpIHsKKwkJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1NfU1RELCAmc2lkKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWRwcmludGsoIlZJRElPQ1NDSEFOIC8gVklESU9DX1NfU1REOiAlZFxuIixlcnIpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ0dQSUNUOiAvKiAgZ2V0IHRvbmUgY29udHJvbHMgJiBwYXJ0aWFsIGNhcHR1cmUgZm9ybWF0ICAqLworCXsKKwkJc3RydWN0IHZpZGVvX3BpY3R1cmUJKnBpY3QgPSBhcmc7CisKKwkJcGljdC0+YnJpZ2h0bmVzcyA9IGdldF92NGxfY29udHJvbChpbm9kZSwgZmlsZSwKKwkJCQkJCSAgIFY0TDJfQ0lEX0JSSUdIVE5FU1MsZHJ2KTsKKwkJcGljdC0+aHVlID0gZ2V0X3Y0bF9jb250cm9sKGlub2RlLCBmaWxlLAorCQkJCQkgICAgVjRMMl9DSURfSFVFLCBkcnYpOworCQlwaWN0LT5jb250cmFzdCA9IGdldF92NGxfY29udHJvbChpbm9kZSwgZmlsZSwKKwkJCQkJCSBWNEwyX0NJRF9DT05UUkFTVCwgZHJ2KTsKKwkJcGljdC0+Y29sb3VyID0gZ2V0X3Y0bF9jb250cm9sKGlub2RlLCBmaWxlLAorCQkJCQkgICAgICAgVjRMMl9DSURfU0FUVVJBVElPTiwgZHJ2KTsKKwkJcGljdC0+d2hpdGVuZXNzID0gZ2V0X3Y0bF9jb250cm9sKGlub2RlLCBmaWxlLAorCQkJCQkJICBWNEwyX0NJRF9XSElURU5FU1MsIGRydik7CisKKwkJZm10MiA9IGttYWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKKwkJbWVtc2V0KGZtdDIsMCxzaXplb2YoKmZtdDIpKTsKKwkJZm10Mi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19GTVQsIGZtdDIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZHByaW50aygiVklESU9DR1BJQ1QgLyBWSURJT0NfR19GTVQ6ICVkXG4iLGVycik7CisJCQlicmVhazsKKwkJfQorI2lmIDAgLyogRklYTUUgKi8KKwkJcGljdC0+ZGVwdGggICA9IGZtdDItPmZtdC5waXguZGVwdGg7CisjZW5kaWYKKwkJcGljdC0+cGFsZXR0ZSA9IHBpeGVsZm9ybWF0X3RvX3BhbGV0dGUoCisJCQlmbXQyLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DU1BJQ1Q6IC8qICBzZXQgdG9uZSBjb250cm9scyAmIHBhcnRpYWwgY2FwdHVyZSBmb3JtYXQgICovCisJeworCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZQkqcGljdCA9IGFyZzsKKworCQlzZXRfdjRsX2NvbnRyb2woaW5vZGUsIGZpbGUsCisJCQkJVjRMMl9DSURfQlJJR0hUTkVTUywgcGljdC0+YnJpZ2h0bmVzcywgZHJ2KTsKKwkJc2V0X3Y0bF9jb250cm9sKGlub2RlLCBmaWxlLAorCQkJCVY0TDJfQ0lEX0hVRSwgcGljdC0+aHVlLCBkcnYpOworCQlzZXRfdjRsX2NvbnRyb2woaW5vZGUsIGZpbGUsCisJCQkJVjRMMl9DSURfQ09OVFJBU1QsIHBpY3QtPmNvbnRyYXN0LCBkcnYpOworCQlzZXRfdjRsX2NvbnRyb2woaW5vZGUsIGZpbGUsCisJCQkJVjRMMl9DSURfU0FUVVJBVElPTiwgcGljdC0+Y29sb3VyLCBkcnYpOworCQlzZXRfdjRsX2NvbnRyb2woaW5vZGUsIGZpbGUsCisJCQkJVjRMMl9DSURfV0hJVEVORVNTLCBwaWN0LT53aGl0ZW5lc3MsIGRydik7CisKKwkJZm10MiA9IGttYWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKKwkJbWVtc2V0KGZtdDIsMCxzaXplb2YoKmZtdDIpKTsKKwkJZm10Mi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19GTVQsIGZtdDIpOworCQlpZiAoZXJyIDwgMCkKKwkJCWRwcmludGsoIlZJRElPQ1NQSUNUIC8gVklESU9DX0dfRk1UOiAlZFxuIixlcnIpOworCQlpZiAoZm10Mi0+Zm10LnBpeC5waXhlbGZvcm1hdCAhPQorCQkgICAgcGFsZXR0ZV90b19waXhlbGZvcm1hdChwaWN0LT5wYWxldHRlKSkgeworCQkJZm10Mi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IHBhbGV0dGVfdG9fcGl4ZWxmb3JtYXQoCisJCQkJcGljdC0+cGFsZXR0ZSk7CisJCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0ZNVCwgZm10Mik7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlkcHJpbnRrKCJWSURJT0NTUElDVCAvIFZJRElPQ19TX0ZNVDogJWRcbiIsZXJyKTsKKwkJfQorCisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfRkJVRiwgJmZidWYyKTsKKwkJaWYgKGVyciA8IDApCisJCQlkcHJpbnRrKCJWSURJT0NTUElDVCAvIFZJRElPQ19HX0ZCVUY6ICVkXG4iLGVycik7CisJCWlmIChmYnVmMi5mbXQucGl4ZWxmb3JtYXQgIT0KKwkJICAgIHBhbGV0dGVfdG9fcGl4ZWxmb3JtYXQocGljdC0+cGFsZXR0ZSkpIHsKKwkJCWZidWYyLmZtdC5waXhlbGZvcm1hdCA9IHBhbGV0dGVfdG9fcGl4ZWxmb3JtYXQoCisJCQkJcGljdC0+cGFsZXR0ZSk7CisJCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0ZCVUYsICZmYnVmMik7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlkcHJpbnRrKCJWSURJT0NTUElDVCAvIFZJRElPQ19TX0ZCVUY6ICVkXG4iLGVycik7CisJCQllcnIgPSAwOyAvKiBsaWtlbHkgZmFpbHMgZm9yIG5vbi1yb290ICovCisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DR1RVTkVSOiAvKiAgZ2V0IHR1bmVyIGluZm9ybWF0aW9uICAqLworCXsKKwkJc3RydWN0IHZpZGVvX3R1bmVyCSp0dW4gPSBhcmc7CisKKwkJbWVtc2V0KCZ0dW4yLDAsc2l6ZW9mKHR1bjIpKTsKKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19UVU5FUiwgJnR1bjIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZHByaW50aygiVklESU9DR1RVTkVSIC8gVklESU9DX0dfVFVORVI6ICVkXG4iLGVycik7CisJCQlicmVhazsKKwkJfQorCQltZW1jcHkodHVuLT5uYW1lLCB0dW4yLm5hbWUsCisJCSAgICAgICBtaW4oc2l6ZW9mKHR1bi0+bmFtZSksIHNpemVvZih0dW4yLm5hbWUpKSk7CisJCXR1bi0+bmFtZVtzaXplb2YodHVuLT5uYW1lKSAtIDFdID0gMDsKKwkJdHVuLT5yYW5nZWxvdyA9IHR1bjIucmFuZ2Vsb3c7CisJCXR1bi0+cmFuZ2VoaWdoID0gdHVuMi5yYW5nZWhpZ2g7CisJCXR1bi0+ZmxhZ3MgPSAwOworCQl0dW4tPm1vZGUgPSBWSURFT19NT0RFX0FVVE87CisKKwkJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJCW1lbXNldCgmc3RkMiwwLHNpemVvZihzdGQyKSk7CisJCQlzdGQyLmluZGV4ID0gaTsKKwkJCWlmICgwICE9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0VOVU1TVEQsICZzdGQyKSkKKwkJCQlicmVhazsKKwkJCWlmIChzdGQyLmlkICYgVjRMMl9TVERfUEFMKQorCQkJCXR1bi0+ZmxhZ3MgfD0gVklERU9fVFVORVJfUEFMOworCQkJaWYgKHN0ZDIuaWQgJiBWNEwyX1NURF9OVFNDKQorCQkJCXR1bi0+ZmxhZ3MgfD0gVklERU9fVFVORVJfTlRTQzsKKwkJCWlmIChzdGQyLmlkICYgVjRMMl9TVERfU0VDQU0pCisJCQkJdHVuLT5mbGFncyB8PSBWSURFT19UVU5FUl9TRUNBTTsKKwkJfQorCisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfU1RELCAmc2lkKTsKKwkJaWYgKGVyciA8IDApCisJCQlkcHJpbnRrKCJWSURJT0NHVFVORVIgLyBWSURJT0NfR19TVEQ6ICVkXG4iLGVycik7CisJCWlmIChlcnIgPT0gMCkgeworCQkJaWYgKHNpZCAmIFY0TDJfU1REX1BBTCkKKwkJCQl0dW4tPm1vZGUgPSBWSURFT19NT0RFX1BBTDsKKwkJCWlmIChzaWQgJiBWNEwyX1NURF9OVFNDKQorCQkJCXR1bi0+bW9kZSA9IFZJREVPX01PREVfTlRTQzsKKwkJCWlmIChzaWQgJiBWNEwyX1NURF9TRUNBTSkKKwkJCQl0dW4tPm1vZGUgPSBWSURFT19NT0RFX1NFQ0FNOworCQl9CisKKwkJaWYgKHR1bjIuY2FwYWJpbGl0eSAmIFY0TDJfVFVORVJfQ0FQX0xPVykKKwkJCXR1bi0+ZmxhZ3MgfD0gVklERU9fVFVORVJfTE9XOworCQlpZiAodHVuMi5yeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfU1RFUkVPKQorCQkJdHVuLT5mbGFncyB8PSBWSURFT19UVU5FUl9TVEVSRU9fT047CisJCXR1bi0+c2lnbmFsID0gdHVuMi5zaWduYWw7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ1NUVU5FUjogLyogIHNlbGVjdCBhIHR1bmVyIGlucHV0ICAqLworCXsKKyNpZiAwIC8qIEZJWE1FICovCisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1NfSU5QVVQsICZpKTsKKwkJaWYgKGVyciA8IDApCisJCQlkcHJpbnRrKCJWSURJT0NTVFVORVIgLyBWSURJT0NfU19JTlBVVDogJWRcbiIsZXJyKTsKKyNlbHNlCisJCWVyciA9IDA7CisjZW5kaWYKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DR0ZSRVE6IC8qICBnZXQgZnJlcXVlbmN5ICAqLworCXsKKwkJaW50ICpmcmVxID0gYXJnOworCisJCWZyZXEyLnR1bmVyID0gMDsKKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19GUkVRVUVOQ1ksICZmcmVxMik7CisJCWlmIChlcnIgPCAwKQorCQkJZHByaW50aygiVklESU9DR0ZSRVEgLyBWSURJT0NfR19GUkVRVUVOQ1k6ICVkXG4iLGVycik7CisJCWlmICgwID09IGVycikKKwkJCSpmcmVxID0gZnJlcTIuZnJlcXVlbmN5OworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NTRlJFUTogLyogIHNldCBmcmVxdWVuY3kgICovCisJeworCQlpbnQgKmZyZXEgPSBhcmc7CisKKwkJZnJlcTIudHVuZXIgPSAwOworCQlkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19HX0ZSRVFVRU5DWSwgJmZyZXEyKTsKKwkJZnJlcTIuZnJlcXVlbmN5ID0gKmZyZXE7CisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1NfRlJFUVVFTkNZLCAmZnJlcTIpOworCQlpZiAoZXJyIDwgMCkKKwkJCWRwcmludGsoIlZJRElPQ1NGUkVRIC8gVklESU9DX1NfRlJFUVVFTkNZOiAlZFxuIixlcnIpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NHQVVESU86IC8qICBnZXQgYXVkaW8gcHJvcGVydGllcy9jb250cm9scyAgKi8KKwl7CisJCXN0cnVjdCB2aWRlb19hdWRpbwkqYXVkID0gYXJnOworCisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfQVVESU8sICZhdWQyKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRwcmludGsoIlZJRElPQ0dBVURJTyAvIFZJRElPQ19HX0FVRElPOiAlZFxuIixlcnIpOworCQkJYnJlYWs7CisJCX0KKwkJbWVtY3B5KGF1ZC0+bmFtZSwgYXVkMi5uYW1lLAorCQkgICAgICAgbWluKHNpemVvZihhdWQtPm5hbWUpLCBzaXplb2YoYXVkMi5uYW1lKSkpOworCQlhdWQtPm5hbWVbc2l6ZW9mKGF1ZC0+bmFtZSkgLSAxXSA9IDA7CisJCWF1ZC0+YXVkaW8gPSBhdWQyLmluZGV4OworCQlhdWQtPmZsYWdzID0gMDsKKwkJaSA9IGdldF92NGxfY29udHJvbChpbm9kZSwgZmlsZSwgVjRMMl9DSURfQVVESU9fVk9MVU1FLCBkcnYpOworCQlpZiAoaSA+PSAwKSB7CisJCQlhdWQtPnZvbHVtZSA9IGk7CisJCQlhdWQtPmZsYWdzIHw9IFZJREVPX0FVRElPX1ZPTFVNRTsKKwkJfQorCQlpID0gZ2V0X3Y0bF9jb250cm9sKGlub2RlLCBmaWxlLCBWNEwyX0NJRF9BVURJT19CQVNTLCBkcnYpOworCQlpZiAoaSA+PSAwKSB7CisJCQlhdWQtPmJhc3MgPSBpOworCQkJYXVkLT5mbGFncyB8PSBWSURFT19BVURJT19CQVNTOworCQl9CisJCWkgPSBnZXRfdjRsX2NvbnRyb2woaW5vZGUsIGZpbGUsIFY0TDJfQ0lEX0FVRElPX1RSRUJMRSwgZHJ2KTsKKwkJaWYgKGkgPj0gMCkgeworCQkJYXVkLT50cmVibGUgPSBpOworCQkJYXVkLT5mbGFncyB8PSBWSURFT19BVURJT19UUkVCTEU7CisJCX0KKwkJaSA9IGdldF92NGxfY29udHJvbChpbm9kZSwgZmlsZSwgVjRMMl9DSURfQVVESU9fQkFMQU5DRSwgZHJ2KTsKKwkJaWYgKGkgPj0gMCkgeworCQkJYXVkLT5iYWxhbmNlID0gaTsKKwkJCWF1ZC0+ZmxhZ3MgfD0gVklERU9fQVVESU9fQkFMQU5DRTsKKwkJfQorCQlpID0gZ2V0X3Y0bF9jb250cm9sKGlub2RlLCBmaWxlLCBWNEwyX0NJRF9BVURJT19NVVRFLCBkcnYpOworCQlpZiAoaSA+PSAwKSB7CisJCQlpZiAoaSkKKwkJCQlhdWQtPmZsYWdzIHw9IFZJREVPX0FVRElPX01VVEU7CisJCQlhdWQtPmZsYWdzIHw9IFZJREVPX0FVRElPX01VVEFCTEU7CisJCX0KKwkJYXVkLT5zdGVwID0gMTsKKwkJcWN0cmwyLmlkID0gVjRMMl9DSURfQVVESU9fVk9MVU1FOworCQlpZiAoZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfUVVFUllDVFJMLCAmcWN0cmwyKSA9PSAwICYmCisJCSAgICAhKHFjdHJsMi5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEKSkKKwkJCWF1ZC0+c3RlcCA9IHFjdHJsMi5zdGVwOworCQlhdWQtPm1vZGUgPSAwOworCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19HX1RVTkVSLCAmdHVuMik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkcHJpbnRrKCJWSURJT0NHQVVESU8gLyBWSURJT0NfR19UVU5FUjogJWRcbiIsZXJyKTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAodHVuMi5yeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfTEFORzIpCisJCQlhdWQtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOworCQllbHNlIGlmICh0dW4yLnJ4c3ViY2hhbnMgJiBWNEwyX1RVTkVSX1NVQl9TVEVSRU8pCisJCQlhdWQtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU87CisJCWVsc2UgaWYgKHR1bjIucnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX01PTk8pCisJCQlhdWQtPm1vZGUgPSBWSURFT19TT1VORF9NT05POworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NTQVVESU86IC8qICBzZXQgYXVkaW8gY29udHJvbHMgICovCisJeworCQlzdHJ1Y3QgdmlkZW9fYXVkaW8JKmF1ZCA9IGFyZzsKKworCQltZW1zZXQoJmF1ZDIsMCxzaXplb2YoYXVkMikpOworCQltZW1zZXQoJnR1bjIsMCxzaXplb2YodHVuMikpOworCisJCWF1ZDIuaW5kZXggPSBhdWQtPmF1ZGlvOworCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0FVRElPLCAmYXVkMik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkcHJpbnRrKCJWSURJT0NTQVVESU8gLyBWSURJT0NfU19BVURJTzogJWRcbiIsZXJyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc2V0X3Y0bF9jb250cm9sKGlub2RlLCBmaWxlLCBWNEwyX0NJRF9BVURJT19WT0xVTUUsCisJCQkJYXVkLT52b2x1bWUsIGRydik7CisJCXNldF92NGxfY29udHJvbChpbm9kZSwgZmlsZSwgVjRMMl9DSURfQVVESU9fQkFTUywKKwkJCQlhdWQtPmJhc3MsIGRydik7CisJCXNldF92NGxfY29udHJvbChpbm9kZSwgZmlsZSwgVjRMMl9DSURfQVVESU9fVFJFQkxFLAorCQkJCWF1ZC0+dHJlYmxlLCBkcnYpOworCQlzZXRfdjRsX2NvbnRyb2woaW5vZGUsIGZpbGUsIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UsCisJCQkJYXVkLT5iYWxhbmNlLCBkcnYpOworCQlzZXRfdjRsX2NvbnRyb2woaW5vZGUsIGZpbGUsIFY0TDJfQ0lEX0FVRElPX01VVEUsCisJCQkJISEoYXVkLT5mbGFncyAmIFZJREVPX0FVRElPX01VVEUpLCBkcnYpOworCisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfVFVORVIsICZ0dW4yKTsKKwkJaWYgKGVyciA8IDApCisJCQlkcHJpbnRrKCJWSURJT0NTQVVESU8gLyBWSURJT0NfR19UVU5FUjogJWRcbiIsZXJyKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQlzd2l0Y2ggKGF1ZC0+bW9kZSkgeworCQkJZGVmYXVsdDoKKwkJCWNhc2UgVklERU9fU09VTkRfTU9OTzoKKwkJCWNhc2UgVklERU9fU09VTkRfTEFORzE6CisJCQkJdHVuMi5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJCQkJYnJlYWs7CisJCQljYXNlIFZJREVPX1NPVU5EX1NURVJFTzoKKwkJCQl0dW4yLmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCQkJCWJyZWFrOworCQkJY2FzZSBWSURFT19TT1VORF9MQU5HMjoKKwkJCQl0dW4yLmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTEFORzI7CisJCQkJYnJlYWs7CisJCQl9CisJCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX1RVTkVSLCAmdHVuMik7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlkcHJpbnRrKCJWSURJT0NTQVVESU8gLyBWSURJT0NfU19UVU5FUjogJWRcbiIsZXJyKTsKKwkJfQorCQllcnIgPSAwOworCQlicmVhazsKKwl9CisjaWYgMAorCWNhc2UgVklESU9DR01CVUY6CisJCS8qIHY0bDIgZHJpdmVycyBtdXN0IGltcGxlbWVudCB0aGF0IHRoZW1zZWxmLiAgVGhlCisJCSAgIG1tYXAoKSBkaWZmZXJlbmNlcyBjYW4ndCBiZSB0cmFuc2xhdGVkIGZ1bGx5CisJCSAgIHRyYW5zcGFyZW50LCB0aHVzIHRoZXJlIGlzIG5vIHBvaW50IHRvIHRyeSB0aGF0ICovCisjZW5kaWYKKwljYXNlIFZJRElPQ01DQVBUVVJFOiAvKiAgY2FwdHVyZSBhIGZyYW1lICAqLworCXsKKwkJc3RydWN0IHZpZGVvX21tYXAJKm1tID0gYXJnOworCisJCWZtdDIgPSBrbWFsbG9jKHNpemVvZigqZm10MiksR0ZQX0tFUk5FTCk7CisJCW1lbXNldCgmYnVmMiwwLHNpemVvZihidWYyKSk7CisJCW1lbXNldChmbXQyLDAsc2l6ZW9mKCpmbXQyKSk7CisKKwkJZm10Mi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19GTVQsIGZtdDIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZHByaW50aygiVklESU9DTUNBUFRVUkUgLyBWSURJT0NfR19GTVQ6ICVkXG4iLGVycik7CisJCQlicmVhazsKKwkJfQorCQlpZiAobW0tPndpZHRoICAgIT0gZm10Mi0+Zm10LnBpeC53aWR0aCAgfHwKKwkJICAgIG1tLT5oZWlnaHQgICE9IGZtdDItPmZtdC5waXguaGVpZ2h0IHx8CisJCSAgICBwYWxldHRlX3RvX3BpeGVsZm9ybWF0KG1tLT5mb3JtYXQpICE9CisJCSAgICBmbXQyLT5mbXQucGl4LnBpeGVsZm9ybWF0KQorCQl7LyogTmV3IGNhcHR1cmUgZm9ybWF0Li4uICAqLworCQkJZm10Mi0+Zm10LnBpeC53aWR0aCA9IG1tLT53aWR0aDsKKwkJCWZtdDItPmZtdC5waXguaGVpZ2h0ID0gbW0tPmhlaWdodDsKKwkJCWZtdDItPmZtdC5waXgucGl4ZWxmb3JtYXQgPQorCQkJCXBhbGV0dGVfdG9fcGl4ZWxmb3JtYXQobW0tPmZvcm1hdCk7CisJCQlmbXQyLT5mbXQucGl4LmZpZWxkID0gVjRMMl9GSUVMRF9BTlk7CisJCQlmbXQyLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IDA7CisJCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0ZNVCwgZm10Mik7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWRwcmludGsoIlZJRElPQ01DQVBUVVJFIC8gVklESU9DX1NfRk1UOiAlZFxuIixlcnIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJ1ZjIuaW5kZXggPSBtbS0+ZnJhbWU7CisJCWJ1ZjIudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfUVVFUllCVUYsICZidWYyKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRwcmludGsoIlZJRElPQ01DQVBUVVJFIC8gVklESU9DX1FVRVJZQlVGOiAlZFxuIixlcnIpOworCQkJYnJlYWs7CisJCX0KKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfUUJVRiwgJmJ1ZjIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZHByaW50aygiVklESU9DTUNBUFRVUkUgLyBWSURJT0NfUUJVRjogJWRcbiIsZXJyKTsKKwkJCWJyZWFrOworCQl9CisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1NUUkVBTU9OLCAmY2FwdHlwZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZHByaW50aygiVklESU9DTUNBUFRVUkUgLyBWSURJT0NfU1RSRUFNT046ICVkXG4iLGVycik7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ1NZTkM6IC8qICB3YWl0IGZvciBhIGZyYW1lICAqLworCXsKKwkJaW50CQkJKmkgPSBhcmc7CisKKwkJYnVmMi5pbmRleCA9ICppOworCQlidWYyLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1FVRVJZQlVGLCAmYnVmMik7CisJCWlmIChlcnIgPCAwKSB7CisJCQkvKiAgTm8gc3VjaCBidWZmZXIgKi8KKwkJCWRwcmludGsoIlZJRElPQ1NZTkMgLyBWSURJT0NfUVVFUllCVUY6ICVkXG4iLGVycik7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShidWYyLmZsYWdzICYgVjRMMl9CVUZfRkxBR19NQVBQRUQpKSB7CisJCQkvKiBCdWZmZXIgaXMgbm90IG1hcHBlZCAgKi8KKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCS8qIG1ha2Ugc3VyZSBjYXB0dXJlIGFjdHVhbGx5IHJ1bnMgc28gd2UgZG9uJ3QgYmxvY2sgZm9yZXZlciAqLworCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TVFJFQU1PTiwgJmNhcHR5cGUpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZHByaW50aygiVklESU9DU1lOQyAvIFZJRElPQ19TVFJFQU1PTjogJWRcbiIsZXJyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogIExvb3AgYXMgbG9uZyBhcyB0aGUgYnVmZmVyIGlzIHF1ZXVlZCwgYnV0IG5vdCBkb25lICAqLworCQl3aGlsZSAoKGJ1ZjIuZmxhZ3MgJgorCQkJKFY0TDJfQlVGX0ZMQUdfUVVFVUVEIHwgVjRMMl9CVUZfRkxBR19ET05FKSkKKwkJICAgICAgID09IFY0TDJfQlVGX0ZMQUdfUVVFVUVEKQorCQl7CisJCQllcnIgPSBwb2xsX29uZShmaWxlKTsKKwkJCWlmIChlcnIgPCAwIHx8CS8qIGVycm9yIG9yIHNsZWVwIHdhcyBpbnRlcnJ1cHRlZCAgKi8KKwkJCSAgICBlcnIgPT0gMCkJLyogdGltZW91dD8gU2hvdWxkbid0IG9jY3VyLiAgKi8KKwkJCQlicmVhazsKKwkJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1FVRVJZQlVGLCAmYnVmMik7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlkcHJpbnRrKCJWSURJT0NTWU5DIC8gVklESU9DX1FVRVJZQlVGOiAlZFxuIixlcnIpOworCQl9CisJCWlmICghKGJ1ZjIuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0RPTkUpKSAvKiBub3QgZG9uZSAqLworCQkJYnJlYWs7CisJCWRvIHsKKwkJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0RRQlVGLCAmYnVmMik7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlkcHJpbnRrKCJWSURJT0NTWU5DIC8gVklESU9DX0RRQlVGOiAlZFxuIixlcnIpOworCQl9IHdoaWxlIChlcnIgPT0gMCAmJiBidWYyLmluZGV4ICE9ICppKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NHVkJJRk1UOiAvKiBxdWVyeSBWQkkgZGF0YSBjYXB0dXJlIGZvcm1hdCAqLworCXsKKwkJc3RydWN0IHZiaV9mb3JtYXQgICAgICAqZm10ID0gYXJnOworCisJCWZtdDIgPSBrbWFsbG9jKHNpemVvZigqZm10MiksR0ZQX0tFUk5FTCk7CisJCW1lbXNldChmbXQyLCAwLCBzaXplb2YoKmZtdDIpKTsKKwkJZm10Mi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU7CisKKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19GTVQsIGZtdDIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZHByaW50aygiVklESU9DR1ZCSUZNVCAvIFZJRElPQ19HX0ZNVDogJWRcbiIsIGVycik7CisJCQlicmVhazsKKwkJfQorCQltZW1zZXQoZm10LCAwLCBzaXplb2YoKmZtdCkpOworCQlmbXQtPnNhbXBsZXNfcGVyX2xpbmUgPSBmbXQyLT5mbXQudmJpLnNhbXBsZXNfcGVyX2xpbmU7CisJCWZtdC0+c2FtcGxpbmdfcmF0ZSAgICA9IGZtdDItPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZTsKKwkJZm10LT5zYW1wbGVfZm9ybWF0ICAgID0gVklERU9fUEFMRVRURV9SQVc7CisJCWZtdC0+c3RhcnRbMF0gICAgICAgICA9IGZtdDItPmZtdC52Ymkuc3RhcnRbMF07CisJCWZtdC0+Y291bnRbMF0gICAgICAgICA9IGZtdDItPmZtdC52YmkuY291bnRbMF07CisJCWZtdC0+c3RhcnRbMV0gICAgICAgICA9IGZtdDItPmZtdC52Ymkuc3RhcnRbMV07CisJCWZtdC0+Y291bnRbMV0gICAgICAgICA9IGZtdDItPmZtdC52YmkuY291bnRbMV07CisJCWZtdC0+ZmxhZ3MgICAgICAgICAgICA9IGZtdDItPmZtdC52YmkuZmxhZ3MgJiAweDAzOworICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKwljYXNlIFZJRElPQ1NWQklGTVQ6CisJeworCQlzdHJ1Y3QgdmJpX2Zvcm1hdCAgICAgICpmbXQgPSBhcmc7CisKKwkJZm10MiA9IGttYWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKKwkJbWVtc2V0KGZtdDIsIDAsIHNpemVvZigqZm10MikpOworCisJCWZtdDItPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOworCQlmbXQyLT5mbXQudmJpLnNhbXBsZXNfcGVyX2xpbmUgPSBmbXQtPnNhbXBsZXNfcGVyX2xpbmU7CisJCWZtdDItPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSAgICA9IGZtdC0+c2FtcGxpbmdfcmF0ZTsKKwkJZm10Mi0+Zm10LnZiaS5zYW1wbGVfZm9ybWF0ICAgID0gVjRMMl9QSVhfRk1UX0dSRVk7CisJCWZtdDItPmZtdC52Ymkuc3RhcnRbMF0gICAgICAgICA9IGZtdC0+c3RhcnRbMF07CisJCWZtdDItPmZtdC52YmkuY291bnRbMF0gICAgICAgICA9IGZtdC0+Y291bnRbMF07CisJCWZtdDItPmZtdC52Ymkuc3RhcnRbMV0gICAgICAgICA9IGZtdC0+c3RhcnRbMV07CisJCWZtdDItPmZtdC52YmkuY291bnRbMV0gICAgICAgICA9IGZtdC0+Y291bnRbMV07CisJCWZtdDItPmZtdC52YmkuZmxhZ3MgICAgICAgICAgICA9IGZtdC0+ZmxhZ3M7CisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1RSWV9GTVQsIGZtdDIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZHByaW50aygiVklESU9DU1ZCSUZNVCAvIFZJRElPQ19UUllfRk1UOiAlZFxuIiwgZXJyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZtdDItPmZtdC52Ymkuc2FtcGxlc19wZXJfbGluZSAhPSBmbXQtPnNhbXBsZXNfcGVyX2xpbmUgfHwKKwkJICAgIGZtdDItPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSAgICAhPSBmbXQtPnNhbXBsaW5nX3JhdGUgICAgfHwKKwkJICAgIFZJREVPX1BBTEVUVEVfUkFXICAgICAgICAgICAgICAhPSBmbXQtPnNhbXBsZV9mb3JtYXQgICAgfHwKKwkJICAgIGZtdDItPmZtdC52Ymkuc3RhcnRbMF0gICAgICAgICAhPSBmbXQtPnN0YXJ0WzBdICAgICAgICAgfHwKKwkJICAgIGZtdDItPmZtdC52YmkuY291bnRbMF0gICAgICAgICAhPSBmbXQtPmNvdW50WzBdICAgICAgICAgfHwKKwkJICAgIGZtdDItPmZtdC52Ymkuc3RhcnRbMV0gICAgICAgICAhPSBmbXQtPnN0YXJ0WzFdICAgICAgICAgfHwKKwkJICAgIGZtdDItPmZtdC52YmkuY291bnRbMV0gICAgICAgICAhPSBmbXQtPmNvdW50WzFdICAgICAgICAgfHwKKwkJICAgIGZtdDItPmZtdC52YmkuZmxhZ3MgICAgICAgICAgICAhPSBmbXQtPmZsYWdzKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfU19GTVQsIGZtdDIpOworCQlpZiAoZXJyIDwgMCkKKwkJCWRwcmludGsoIlZJRElPQ1NWQklGTVQgLyBWSURJT0NfU19GTVQ6ICVkXG4iLCBlcnIpOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCWlmIChjYXAyKQorCQlrZnJlZShjYXAyKTsKKwlpZiAoZm10MikKKwkJa2ZyZWUoZm10Mik7CisJcmV0dXJuIGVycjsKK30KKworRVhQT1JUX1NZTUJPTCh2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bCk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlMGNmMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYwpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqCVZpZGVvIGZvciBMaW51eCBUd28KKyAqCisgKglBIGdlbmVyaWMgdmlkZW8gZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0KKyAqCXVzaW5nIGEgc2V0IG9mIGRldmljZSBzdHJ1Y3R1cmVzL3ZlY3RvcnMgZm9yIGxvdyBsZXZlbCBvcGVyYXRpb25zLgorICoKKyAqCVRoaXMgZmlsZSByZXBsYWNlcyB0aGUgdmlkZW9kZXYuYyBmaWxlIHRoYXQgY29tZXMgd2l0aCB0aGUKKyAqCXJlZ3VsYXIga2VybmVsIGRpc3RyaWJ1dGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcjoJQmlsbCBEaXJrcyA8YmRpcmtzQHBhY2JlbGwubmV0PgorICoJCWJhc2VkIG9uIGNvZGUgYnkgQWxhbiBDb3gsIDxhbGFuQGN5bXJ1Lm5ldD4KKyAqCisgKi8KKworLyoKKyAqIFZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlIGZvciBMaW51eAorICoKKyAqCUEgZ2VuZXJpYyB2aWRlbyBkZXZpY2UgaW50ZXJmYWNlIGZvciB0aGUgTElOVVggb3BlcmF0aW5nIHN5c3RlbQorICoJdXNpbmcgYSBzZXQgb2YgZGV2aWNlIHN0cnVjdHVyZXMvdmVjdG9ycyBmb3IgbG93IGxldmVsIG9wZXJhdGlvbnMuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yOglBbGFuIENveCwgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBGaXhlczoKKyAqLworCisvKgorICogVmlkZW80bGludXggMS8yIGludGVncmF0aW9uIGJ5IEp1c3RpbiBTY2hvZW1hbgorICogPGp1c3RpbkBzdW50aWdlci5lZS51cC5hYy56YT4KKyAqIDIuNCBQUk9DRlMgc3VwcG9ydCBwb3J0ZWQgZnJvbSAyLjQga2VybmVscyBieQorICogIEnxYWtpIEdhcmPtYSBFdHhlYmFycmlhIDxnYXJldHhlQGV1c2thbG5ldC5uZXQ+CisgKiBNYWtlZmlsZSBmaXggYnkgIlcuIE1pY2hhZWwgUGV0dWxsbyIgPG1pa2VAZmx5bi5vcmc+CisgKiAyLjQgZGV2ZnMgc3VwcG9ydCBwb3J0ZWQgZnJvbSAyLjQga2VybmVscyBieQorICogIERhbiBNZXJpbGxhdCA8ZGFuQG1lcmlsbGF0Lm9yZz4KKyAqIEFkZGVkIEdlcmQgS25vcnJzIHY0bDEgZW5oYW5jZW1lbnRzIChKdXN0aW4gU2Nob2VtYW4pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaWZkZWYgQ09ORklHX0tNT0QKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1VTVCkgfHwgZGVmaW5lZChDT05GSUdfVVNUX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC91c3QuaD4KKyNlbmRpZgorCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorCitNT0RVTEVfQVVUSE9SKCJCaWxsIERpcmtzLCBKdXN0aW4gU2Nob2VtYW4sIEdlcmQgS25vcnIiKTsKK01PRFVMRV9ERVNDUklQVElPTigibWlzYyBoZWxwZXIgZnVuY3Rpb25zIGZvciB2NGwyIGRldmljZSBkcml2ZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKgorICoJViA0IEwgMiAgIEQgUiBJIFYgRSBSICAgSCBFIEwgUCBFIFIgICBBIFAgSQorICoKKyAqLworCisvKgorICogIFZpZGVvIFN0YW5kYXJkIE9wZXJhdGlvbnMgKGNvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwgU2NoaW1laykKKyAqLworCisjaWYgMCAvKiBzZWVtcyB0byBoYXZlIG5vIHVzZXJzICovCisvKiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBtZXRob2QgdG8gZGVhbCB3aXRoIHRoZSBmcmFtZXJhdGUgZmllbGRzLiBNb3JlCisgICBzb3BoaXN0aWNhdGVkIGRyaXZlcnMgd2lsbCBhY2Nlc3MgdGhlIGZpZWxkcyBkaXJlY3RseS4gKi8KK3Vuc2lnbmVkIGludAordjRsMl92aWRlb19zdGRfZnBzKHN0cnVjdCB2NGwyX3N0YW5kYXJkICp2cykKK3sKKwlpZiAodnMtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA+IDApCisJCXJldHVybiAoKCh2cy0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPDwgOCkgLworCQkJIHZzLT5mcmFtZXBlcmlvZC5udW1lcmF0b3IpICsKKwkJCSgxIDw8IDcpKSAvICgxIDw8IDgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2NGwyX3ZpZGVvX3N0ZF9mcHMpOworI2VuZGlmCisKKy8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiBhIHY0bDJfc3RhbmRhcmQgc3RydWN0dXJlIGFjY29yZGluZyB0byB0aGUKKyAgICdpZCcgYW5kICd0cmFuc21pc3Npb24nIHBhcmFtZXRlcnMuICBSZXR1cm5zIG5lZ2F0aXZlIG9uIGVycm9yLiAgKi8KK2ludCB2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3Qoc3RydWN0IHY0bDJfc3RhbmRhcmQgKnZzLAorCQkJICAgICBpbnQgaWQsIGNoYXIgKm5hbWUpCit7CisJdTMyIGluZGV4ID0gdnMtPmluZGV4OworCisJbWVtc2V0KHZzLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQpKTsKKwl2cy0+aW5kZXggPSBpbmRleDsKKwl2cy0+aWQgICAgPSBpZDsKKwlpZiAoaWQgJiAoVjRMMl9TVERfTlRTQyB8IFY0TDJfU1REX1BBTF9NKSkgeworCQl2cy0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gMTAwMTsKKwkJdnMtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMzAwMDA7CisJCXZzLT5mcmFtZWxpbmVzID0gNTI1OworCX0gZWxzZSB7CisJCXZzLT5mcmFtZXBlcmlvZC5udW1lcmF0b3IgPSAxOworCQl2cy0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPSAyNTsKKwkJdnMtPmZyYW1lbGluZXMgPSA2MjU7CisJfQorCXN0cmxjcHkodnMtPm5hbWUsbmFtZSxzaXplb2YodnMtPm5hbWUpKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogcHJpb3JpdHkgaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBWNEwyX1BSSU9fVkFMSUQodmFsKSAodmFsID09IFY0TDJfUFJJT1JJVFlfQkFDS0dST1VORCAgIHx8IFwKKwkJCSAgICAgIHZhbCA9PSBWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFICB8fCBcCisJCQkgICAgICB2YWwgPT0gVjRMMl9QUklPUklUWV9SRUNPUkQpCisKK2ludCB2NGwyX3ByaW9faW5pdChzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwpCit7CisJbWVtc2V0KGdsb2JhbCwwLHNpemVvZigqZ2xvYmFsKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB2NGwyX3ByaW9fY2hhbmdlKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCwKKwkJICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgbmV3KQoreworCWlmICghVjRMMl9QUklPX1ZBTElEKG5ldykpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgqbG9jYWwgPT0gbmV3KQorCQlyZXR1cm4gMDsKKworCWF0b21pY19pbmMoJmdsb2JhbC0+cHJpb3NbbmV3XSk7CisJaWYgKFY0TDJfUFJJT19WQUxJRCgqbG9jYWwpKQorCQlhdG9taWNfZGVjKCZnbG9iYWwtPnByaW9zWypsb2NhbF0pOworCSpsb2NhbCA9IG5ldzsKKwlyZXR1cm4gMDsKK30KKworaW50IHY0bDJfcHJpb19vcGVuKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCkKK3sKKwlyZXR1cm4gdjRsMl9wcmlvX2NoYW5nZShnbG9iYWwsbG9jYWwsVjRMMl9QUklPUklUWV9ERUZBVUxUKTsKK30KKworaW50IHY0bDJfcHJpb19jbG9zZShzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwpCit7CisJaWYgKFY0TDJfUFJJT19WQUxJRCgqbG9jYWwpKQorCQlhdG9taWNfZGVjKCZnbG9iYWwtPnByaW9zWypsb2NhbF0pOworCXJldHVybiAwOworfQorCitlbnVtIHY0bDJfcHJpb3JpdHkgdjRsMl9wcmlvX21heChzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwpCit7CisJaWYgKGF0b21pY19yZWFkKCZnbG9iYWwtPnByaW9zW1Y0TDJfUFJJT1JJVFlfUkVDT1JEXSkgPiAwKQorCQlyZXR1cm4gVjRMMl9QUklPUklUWV9SRUNPUkQ7CisJaWYgKGF0b21pY19yZWFkKCZnbG9iYWwtPnByaW9zW1Y0TDJfUFJJT1JJVFlfSU5URVJBQ1RJVkVdKSA+IDApCisJCXJldHVybiBWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFOworCWlmIChhdG9taWNfcmVhZCgmZ2xvYmFsLT5wcmlvc1tWNEwyX1BSSU9SSVRZX0JBQ0tHUk9VTkRdKSA+IDApCisJCXJldHVybiBWNEwyX1BSSU9SSVRZX0JBQ0tHUk9VTkQ7CisJcmV0dXJuIFY0TDJfUFJJT1JJVFlfVU5TRVQ7Cit9CisKK2ludCB2NGwyX3ByaW9fY2hlY2soc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsKQoreworCWlmICgqbG9jYWwgPCB2NGwyX3ByaW9fbWF4KGdsb2JhbCkpCisJCXJldHVybiAtRUJVU1k7CisJcmV0dXJuIDA7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHNvbWUgYXJyYXlzIGZvciBwcmV0dHktcHJpbnRpbmcgZGVidWcgbWVzc2FnZXMgICAgICAgICAgICAgICAgICAgICovCisKK2NoYXIgKnY0bDJfZmllbGRfbmFtZXNbXSA9IHsKKwlbVjRMMl9GSUVMRF9BTlldICAgICAgICA9ICJhbnkiLAorCVtWNEwyX0ZJRUxEX05PTkVdICAgICAgID0gIm5vbmUiLAorCVtWNEwyX0ZJRUxEX1RPUF0gICAgICAgID0gInRvcCIsCisJW1Y0TDJfRklFTERfQk9UVE9NXSAgICAgPSAiYm90dG9tIiwKKwlbVjRMMl9GSUVMRF9JTlRFUkxBQ0VEXSA9ICJpbnRlcmxhY2VkIiwKKwlbVjRMMl9GSUVMRF9TRVFfVEJdICAgICA9ICJzZXEtdGIiLAorCVtWNEwyX0ZJRUxEX1NFUV9CVF0gICAgID0gInNlcS1idCIsCisJW1Y0TDJfRklFTERfQUxURVJOQVRFXSAgPSAiYWx0ZXJuYXRlIiwKK307CisKK2NoYXIgKnY0bDJfdHlwZV9uYW1lc1tdID0geworCVtWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVdID0gInZpZGVvLWNhcCIsCisJW1Y0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWV0gPSAidmlkZW8tb3ZlciIsCisJW1Y0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUXSAgPSAidmlkZW8tb3V0IiwKKwlbVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRV0gICA9ICJ2YmktY2FwIiwKKwlbVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUXSAgICA9ICJ2Ymktb3V0IiwKK307CisKK2NoYXIgKnY0bDJfaW9jdGxfbmFtZXNbMjU2XSA9IHsKKyNpZiBfX0dOVUNfXyA+PSAzCisJWzAgLi4uIDI1NV0gICAgICAgICAgICAgICAgICAgICAgPSAiVU5LTk9XTiIsCisjZW5kaWYKKwlbX0lPQ19OUihWSURJT0NfUVVFUllDQVApXSAgICAgICA9ICJWSURJT0NfUVVFUllDQVAiLAorCVtfSU9DX05SKFZJRElPQ19SRVNFUlZFRCldICAgICAgID0gIlZJRElPQ19SRVNFUlZFRCIsCisJW19JT0NfTlIoVklESU9DX0VOVU1fRk1UKV0gICAgICAgPSAiVklESU9DX0VOVU1fRk1UIiwKKwlbX0lPQ19OUihWSURJT0NfR19GTVQpXSAgICAgICAgICA9ICJWSURJT0NfR19GTVQiLAorCVtfSU9DX05SKFZJRElPQ19TX0ZNVCldICAgICAgICAgID0gIlZJRElPQ19TX0ZNVCIsCisjaWYgMAorCVtfSU9DX05SKFZJRElPQ19HX0NPTVApXSAgICAgICAgID0gIlZJRElPQ19HX0NPTVAiLAorCVtfSU9DX05SKFZJRElPQ19TX0NPTVApXSAgICAgICAgID0gIlZJRElPQ19TX0NPTVAiLAorI2VuZGlmCisJW19JT0NfTlIoVklESU9DX1JFUUJVRlMpXSAgICAgICAgPSAiVklESU9DX1JFUUJVRlMiLAorCVtfSU9DX05SKFZJRElPQ19RVUVSWUJVRildICAgICAgID0gIlZJRElPQ19RVUVSWUJVRiIsCisJW19JT0NfTlIoVklESU9DX0dfRkJVRildICAgICAgICAgPSAiVklESU9DX0dfRkJVRiIsCisJW19JT0NfTlIoVklESU9DX1NfRkJVRildICAgICAgICAgPSAiVklESU9DX1NfRkJVRiIsCisJW19JT0NfTlIoVklESU9DX09WRVJMQVkpXSAgICAgICAgPSAiVklESU9DX09WRVJMQVkiLAorCVtfSU9DX05SKFZJRElPQ19RQlVGKV0gICAgICAgICAgID0gIlZJRElPQ19RQlVGIiwKKwlbX0lPQ19OUihWSURJT0NfRFFCVUYpXSAgICAgICAgICA9ICJWSURJT0NfRFFCVUYiLAorCVtfSU9DX05SKFZJRElPQ19TVFJFQU1PTildICAgICAgID0gIlZJRElPQ19TVFJFQU1PTiIsCisJW19JT0NfTlIoVklESU9DX1NUUkVBTU9GRildICAgICAgPSAiVklESU9DX1NUUkVBTU9GRiIsCisJW19JT0NfTlIoVklESU9DX0dfUEFSTSldICAgICAgICAgPSAiVklESU9DX0dfUEFSTSIsCisJW19JT0NfTlIoVklESU9DX1NfUEFSTSldICAgICAgICAgPSAiVklESU9DX1NfUEFSTSIsCisJW19JT0NfTlIoVklESU9DX0dfU1REKV0gICAgICAgICAgPSAiVklESU9DX0dfU1REIiwKKwlbX0lPQ19OUihWSURJT0NfU19TVEQpXSAgICAgICAgICA9ICJWSURJT0NfU19TVEQiLAorCVtfSU9DX05SKFZJRElPQ19FTlVNU1REKV0gICAgICAgID0gIlZJRElPQ19FTlVNU1REIiwKKwlbX0lPQ19OUihWSURJT0NfRU5VTUlOUFVUKV0gICAgICA9ICJWSURJT0NfRU5VTUlOUFVUIiwKKwlbX0lPQ19OUihWSURJT0NfR19DVFJMKV0gICAgICAgICA9ICJWSURJT0NfR19DVFJMIiwKKwlbX0lPQ19OUihWSURJT0NfU19DVFJMKV0gICAgICAgICA9ICJWSURJT0NfU19DVFJMIiwKKwlbX0lPQ19OUihWSURJT0NfR19UVU5FUildICAgICAgICA9ICJWSURJT0NfR19UVU5FUiIsCisJW19JT0NfTlIoVklESU9DX1NfVFVORVIpXSAgICAgICAgPSAiVklESU9DX1NfVFVORVIiLAorCVtfSU9DX05SKFZJRElPQ19HX0FVRElPKV0gICAgICAgID0gIlZJRElPQ19HX0FVRElPIiwKKwlbX0lPQ19OUihWSURJT0NfU19BVURJTyldICAgICAgICA9ICJWSURJT0NfU19BVURJTyIsCisJW19JT0NfTlIoVklESU9DX1FVRVJZQ1RSTCldICAgICAgPSAiVklESU9DX1FVRVJZQ1RSTCIsCisJW19JT0NfTlIoVklESU9DX1FVRVJZTUVOVSldICAgICAgPSAiVklESU9DX1FVRVJZTUVOVSIsCisJW19JT0NfTlIoVklESU9DX0dfSU5QVVQpXSAgICAgICAgPSAiVklESU9DX0dfSU5QVVQiLAorCVtfSU9DX05SKFZJRElPQ19TX0lOUFVUKV0gICAgICAgID0gIlZJRElPQ19TX0lOUFVUIiwKKwlbX0lPQ19OUihWSURJT0NfR19PVVRQVVQpXSAgICAgICA9ICJWSURJT0NfR19PVVRQVVQiLAorCVtfSU9DX05SKFZJRElPQ19TX09VVFBVVCldICAgICAgID0gIlZJRElPQ19TX09VVFBVVCIsCisJW19JT0NfTlIoVklESU9DX0VOVU1PVVRQVVQpXSAgICAgPSAiVklESU9DX0VOVU1PVVRQVVQiLAorCVtfSU9DX05SKFZJRElPQ19HX0FVRE9VVCldICAgICAgID0gIlZJRElPQ19HX0FVRE9VVCIsCisJW19JT0NfTlIoVklESU9DX1NfQVVET1VUKV0gICAgICAgPSAiVklESU9DX1NfQVVET1VUIiwKKwlbX0lPQ19OUihWSURJT0NfR19NT0RVTEFUT1IpXSAgICA9ICJWSURJT0NfR19NT0RVTEFUT1IiLAorCVtfSU9DX05SKFZJRElPQ19TX01PRFVMQVRPUildICAgID0gIlZJRElPQ19TX01PRFVMQVRPUiIsCisJW19JT0NfTlIoVklESU9DX0dfRlJFUVVFTkNZKV0gICAgPSAiVklESU9DX0dfRlJFUVVFTkNZIiwKKwlbX0lPQ19OUihWSURJT0NfU19GUkVRVUVOQ1kpXSAgICA9ICJWSURJT0NfU19GUkVRVUVOQ1kiLAorCVtfSU9DX05SKFZJRElPQ19DUk9QQ0FQKV0gICAgICAgID0gIlZJRElPQ19DUk9QQ0FQIiwKKwlbX0lPQ19OUihWSURJT0NfR19DUk9QKV0gICAgICAgICA9ICJWSURJT0NfR19DUk9QIiwKKwlbX0lPQ19OUihWSURJT0NfU19DUk9QKV0gICAgICAgICA9ICJWSURJT0NfU19DUk9QIiwKKwlbX0lPQ19OUihWSURJT0NfR19KUEVHQ09NUCldICAgICA9ICJWSURJT0NfR19KUEVHQ09NUCIsCisJW19JT0NfTlIoVklESU9DX1NfSlBFR0NPTVApXSAgICAgPSAiVklESU9DX1NfSlBFR0NPTVAiLAorCVtfSU9DX05SKFZJRElPQ19RVUVSWVNURCldICAgICAgID0gIlZJRElPQ19RVUVSWVNURCIsCisJW19JT0NfTlIoVklESU9DX1RSWV9GTVQpXSAgICAgICAgPSAiVklESU9DX1RSWV9GTVQiLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworRVhQT1JUX1NZTUJPTCh2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3QpOworCitFWFBPUlRfU1lNQk9MKHY0bDJfcHJpb19pbml0KTsKK0VYUE9SVF9TWU1CT0wodjRsMl9wcmlvX2NoYW5nZSk7CitFWFBPUlRfU1lNQk9MKHY0bDJfcHJpb19vcGVuKTsKK0VYUE9SVF9TWU1CT0wodjRsMl9wcmlvX2Nsb3NlKTsKK0VYUE9SVF9TWU1CT0wodjRsMl9wcmlvX21heCk7CitFWFBPUlRfU1lNQk9MKHY0bDJfcHJpb19jaGVjayk7CisKK0VYUE9SVF9TWU1CT0wodjRsMl9maWVsZF9uYW1lcyk7CitFWFBPUlRfU1lNQk9MKHY0bDJfdHlwZV9uYW1lcyk7CitFWFBPUlRfU1lNQk9MKHY0bDJfaW9jdGxfbmFtZXMpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWNjNGVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiAkSWQ6IHZpZGVvLWJ1Zi1kdmIuYyx2IDEuNyAyMDA0LzEyLzA5IDEyOjUxOjM1IGtyYXhlbCBFeHAgJAorICoKKyAqIHNvbWUgaGVscGVyIGZ1bmN0aW9uIGZvciBzaW1wbGUgRFZCIGNhcmRzIHdoaWNoIHNpbXBseSBETUEgdGhlCisgKiBjb21wbGV0ZSB0cmFuc3BvcnQgc3RyZWFtIGFuZCBsZXQgdGhlIGNvbXB1dGVyIHNvcnQgZXZlcnl0aGluZyBlbHNlCisgKiAoaS5lLiB3ZSBhcmUgdXNpbmcgdGhlIHNvZnR3YXJlIGRlbXV4LCAuLi4pLiAgQWxzbyB1c2VzIHRoZQorICogdmlkZW8tYnVmIHRvIG1hbmFnZSBETUEgYnVmZmVycy4KKyAqCisgKiAoYykgMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTVVNFIExhYnNdCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYtZHZiLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CisKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZy4uLikJaWYgKGRlYnVnKQkJCVwKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMvZHZiOiAiIGZtdCwgZHZiLT5uYW1lICwgIyMgYXJnKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB2aWRlb2J1Zl9kdmJfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHZpZGVvYnVmX2R2YiAqZHZiID0gZGF0YTsKKwlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICpidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJZHByaW50aygiZHZiIHRocmVhZCBzdGFydGVkXG4iKTsKKwl2aWRlb2J1Zl9yZWFkX3N0YXJ0KCZkdmItPmR2YnEpOworCisJZm9yICg7OykgeworCQkvKiBmZXRjaCBuZXh0IGJ1ZmZlciAqLworCQlidWYgPSBsaXN0X2VudHJ5KGR2Yi0+ZHZicS5zdHJlYW0ubmV4dCwKKwkJCQkgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciwgc3RyZWFtKTsKKwkJbGlzdF9kZWwoJmJ1Zi0+c3RyZWFtKTsKKwkJZXJyID0gdmlkZW9idWZfd2FpdG9uKGJ1ZiwwLDEpOworCQlCVUdfT04oMCAhPSBlcnIpOworCisJCS8qIG5vIG1vcmUgZmVlZHMgbGVmdCBvciBzdG9wX2ZlZWQoKSBhc2tlZCB1cyB0byBxdWl0ICovCisJCWlmICgwID09IGR2Yi0+bmZlZWRzKQorCQkJYnJlYWs7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKwkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKQorCQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisKKwkJLyogZmVlZCBidWZmZXIgZGF0YSB0byBkZW11eCAqLworCQlpZiAoYnVmLT5zdGF0ZSA9PSBTVEFURV9ET05FKQorCQkJZHZiX2RteF9zd2ZpbHRlcigmZHZiLT5kZW11eCwgYnVmLT5kbWEudm1hbGxvYywKKwkJCQkJIGJ1Zi0+c2l6ZSk7CisKKwkJLyogcmVxdWV1ZSBidWZmZXIgKi8KKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT5zdHJlYW0sJmR2Yi0+ZHZicS5zdHJlYW0pOworCQlzcGluX2xvY2tfaXJxc2F2ZShkdmItPmR2YnEuaXJxbG9jayxmbGFncyk7CisJCWR2Yi0+ZHZicS5vcHMtPmJ1Zl9xdWV1ZSgmZHZiLT5kdmJxLGJ1Zik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZHZiLT5kdmJxLmlycWxvY2ssZmxhZ3MpOworCX0KKworCXZpZGVvYnVmX3JlYWRfc3RvcCgmZHZiLT5kdmJxKTsKKwlkcHJpbnRrKCJkdmIgdGhyZWFkIHN0b3BwZWRcbiIpOworCisJLyogSG1tLCBsaW51eCBiZWNvbWVzICp2ZXJ5KiB1bmhhcHB5IHdpdGhvdXQgdGhpcyAuLi4gKi8KKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRlb2J1Zl9kdmJfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCit7CisJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggID0gZmVlZC0+ZGVtdXg7CisJc3RydWN0IHZpZGVvYnVmX2R2YiAqZHZiID0gZGVtdXgtPnByaXY7CisJaW50IHJjOworCisJaWYgKCFkZW11eC0+ZG14LmZyb250ZW5kKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJmR2Yi0+bG9jayk7CisJZHZiLT5uZmVlZHMrKzsKKwlyYyA9IGR2Yi0+bmZlZWRzOworCisJaWYgKE5VTEwgIT0gZHZiLT50aHJlYWQpCisJCWdvdG8gb3V0OworCWR2Yi0+dGhyZWFkID0ga3RocmVhZF9ydW4odmlkZW9idWZfZHZiX3RocmVhZCwKKwkJCQkgIGR2YiwgIiVzIGR2YiIsIGR2Yi0+bmFtZSk7CisJaWYgKElTX0VSUihkdmItPnRocmVhZCkpIHsKKwkJcmMgPSBQVFJfRVJSKGR2Yi0+dGhyZWFkKTsKKwkJZHZiLT50aHJlYWQgPSBOVUxMOworCX0KKworb3V0OgorCXVwKCZkdmItPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB2aWRlb2J1Zl9kdmJfc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCkKK3sKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCAgPSBmZWVkLT5kZW11eDsKKwlzdHJ1Y3QgdmlkZW9idWZfZHZiICpkdmIgPSBkZW11eC0+cHJpdjsKKwlpbnQgZXJyID0gMDsKKworCWRvd24oJmR2Yi0+bG9jayk7CisJZHZiLT5uZmVlZHMtLTsKKwlpZiAoMCA9PSBkdmItPm5mZWVkcyAgJiYgIE5VTEwgIT0gZHZiLT50aHJlYWQpIHsKKwkJLy8gRklYTUU6IGN4ODgwMl9jYW5jZWxfYnVmZmVycyhkZXYpOworCQllcnIgPSBrdGhyZWFkX3N0b3AoZHZiLT50aHJlYWQpOworCQlkdmItPnRocmVhZCA9IE5VTEw7CisJfQorCXVwKCZkdmItPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgdmlkZW9idWZfZHZiX3JlZ2lzdGVyKHN0cnVjdCB2aWRlb2J1Zl9kdmIgKmR2YiwKKwkJCSAgc3RydWN0IG1vZHVsZSAqbW9kdWxlLAorCQkJICB2b2lkICphZGFwdGVyX3ByaXYpCit7CisJaW50IHJlc3VsdDsKKworCWluaXRfTVVURVgoJmR2Yi0+bG9jayk7CisKKwkvKiByZWdpc3RlciBhZGFwdGVyICovCisJcmVzdWx0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlciwgZHZiLT5uYW1lLCBtb2R1bGUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkdmJfcmVnaXN0ZXJfYWRhcHRlciBmYWlsZWQgKGVycm5vID0gJWQpXG4iLAorCQkgICAgICAgZHZiLT5uYW1lLCByZXN1bHQpOworCQlnb3RvIGZhaWxfYWRhcHRlcjsKKwl9CisJZHZiLT5hZGFwdGVyLT5wcml2ID0gYWRhcHRlcl9wcml2OworCisJLyogcmVnaXN0ZXIgZnJvbnRlbmQgKi8KKwlyZXN1bHQgPSBkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoZHZiLT5hZGFwdGVyLCBkdmItPmZyb250ZW5kKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHZiX3JlZ2lzdGVyX2Zyb250ZW5kIGZhaWxlZCAoZXJybm8gPSAlZClcbiIsCisJCSAgICAgICBkdmItPm5hbWUsIHJlc3VsdCk7CisJCWdvdG8gZmFpbF9mcm9udGVuZDsKKwl9CisKKwkvKiByZWdpc3RlciBkZW11eCBzdHVmZiAqLworCWR2Yi0+ZGVtdXguZG14LmNhcGFiaWxpdGllcyA9CisJCURNWF9UU19GSUxURVJJTkcgfCBETVhfU0VDVElPTl9GSUxURVJJTkcgfAorCQlETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORzsKKwlkdmItPmRlbXV4LnByaXYgICAgICAgPSBkdmI7CisJZHZiLT5kZW11eC5maWx0ZXJudW0gID0gMjU2OworCWR2Yi0+ZGVtdXguZmVlZG51bSAgICA9IDI1NjsKKwlkdmItPmRlbXV4LnN0YXJ0X2ZlZWQgPSB2aWRlb2J1Zl9kdmJfc3RhcnRfZmVlZDsKKwlkdmItPmRlbXV4LnN0b3BfZmVlZCAgPSB2aWRlb2J1Zl9kdmJfc3RvcF9mZWVkOworCXJlc3VsdCA9IGR2Yl9kbXhfaW5pdCgmZHZiLT5kZW11eCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGR2Yl9kbXhfaW5pdCBmYWlsZWQgKGVycm5vID0gJWQpXG4iLAorCQkgICAgICAgZHZiLT5uYW1lLCByZXN1bHQpOworCQlnb3RvIGZhaWxfZG14OworCX0KKworCWR2Yi0+ZG14ZGV2LmZpbHRlcm51bSAgICA9IDI1NjsKKwlkdmItPmRteGRldi5kZW11eCAgICAgICAgPSAmZHZiLT5kZW11eC5kbXg7CisJZHZiLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKKwlyZXN1bHQgPSBkdmJfZG14ZGV2X2luaXQoJmR2Yi0+ZG14ZGV2LCBkdmItPmFkYXB0ZXIpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkdmJfZG14ZGV2X2luaXQgZmFpbGVkIChlcnJubyA9ICVkKVxuIiwKKwkJICAgICAgIGR2Yi0+bmFtZSwgcmVzdWx0KTsKKwkJZ290byBmYWlsX2RteGRldjsKKwl9CisKKwlkdmItPmZlX2h3LnNvdXJjZSA9IERNWF9GUk9OVEVORF8wOworCXJlc3VsdCA9IGR2Yi0+ZGVtdXguZG14LmFkZF9mcm9udGVuZCgmZHZiLT5kZW11eC5kbXgsICZkdmItPmZlX2h3KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYWRkX2Zyb250ZW5kIGZhaWxlZCAoRE1YX0ZST05URU5EXzAsIGVycm5vID0gJWQpXG4iLAorCQkgICAgICAgZHZiLT5uYW1lLCByZXN1bHQpOworCQlnb3RvIGZhaWxfZmVfaHc7CisJfQorCisJZHZiLT5mZV9tZW0uc291cmNlID0gRE1YX01FTU9SWV9GRTsKKwlyZXN1bHQgPSBkdmItPmRlbXV4LmRteC5hZGRfZnJvbnRlbmQoJmR2Yi0+ZGVtdXguZG14LCAmZHZiLT5mZV9tZW0pOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBhZGRfZnJvbnRlbmQgZmFpbGVkIChETVhfTUVNT1JZX0ZFLCBlcnJubyA9ICVkKVxuIiwKKwkJICAgICAgIGR2Yi0+bmFtZSwgcmVzdWx0KTsKKwkJZ290byBmYWlsX2ZlX21lbTsKKwl9CisKKwlyZXN1bHQgPSBkdmItPmRlbXV4LmRteC5jb25uZWN0X2Zyb250ZW5kKCZkdmItPmRlbXV4LmRteCwgJmR2Yi0+ZmVfaHcpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb25uZWN0X2Zyb250ZW5kIGZhaWxlZCAoZXJybm8gPSAlZClcbiIsCisJCSAgICAgICBkdmItPm5hbWUsIHJlc3VsdCk7CisJCWdvdG8gZmFpbF9mZV9jb25uOworCX0KKworCS8qIHJlZ2lzdGVyIG5ldHdvcmsgYWRhcHRlciAqLworCWR2Yl9uZXRfaW5pdChkdmItPmFkYXB0ZXIsICZkdmItPm5ldCwgJmR2Yi0+ZGVtdXguZG14KTsKKwlyZXR1cm4gMDsKKworZmFpbF9mZV9jb25uOgorCWR2Yi0+ZGVtdXguZG14LnJlbW92ZV9mcm9udGVuZCgmZHZiLT5kZW11eC5kbXgsICZkdmItPmZlX21lbSk7CitmYWlsX2ZlX21lbToKKwlkdmItPmRlbXV4LmRteC5yZW1vdmVfZnJvbnRlbmQoJmR2Yi0+ZGVtdXguZG14LCAmZHZiLT5mZV9odyk7CitmYWlsX2ZlX2h3OgorCWR2Yl9kbXhkZXZfcmVsZWFzZSgmZHZiLT5kbXhkZXYpOworZmFpbF9kbXhkZXY6CisJZHZiX2RteF9yZWxlYXNlKCZkdmItPmRlbXV4KTsKK2ZhaWxfZG14OgorCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGR2Yi0+ZnJvbnRlbmQpOworZmFpbF9mcm9udGVuZDoKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGR2Yi0+YWRhcHRlcik7CitmYWlsX2FkYXB0ZXI6CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCB2aWRlb2J1Zl9kdmJfdW5yZWdpc3RlcihzdHJ1Y3QgdmlkZW9idWZfZHZiICpkdmIpCit7CisJZHZiX25ldF9yZWxlYXNlKCZkdmItPm5ldCk7CisJZHZiLT5kZW11eC5kbXgucmVtb3ZlX2Zyb250ZW5kKCZkdmItPmRlbXV4LmRteCwgJmR2Yi0+ZmVfbWVtKTsKKwlkdmItPmRlbXV4LmRteC5yZW1vdmVfZnJvbnRlbmQoJmR2Yi0+ZGVtdXguZG14LCAmZHZiLT5mZV9odyk7CisJZHZiX2RteGRldl9yZWxlYXNlKCZkdmItPmRteGRldik7CisJZHZiX2RteF9yZWxlYXNlKCZkdmItPmRlbXV4KTsKKwlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChkdmItPmZyb250ZW5kKTsKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGR2Yi0+YWRhcHRlcik7Cit9CisKK0VYUE9SVF9TWU1CT0wodmlkZW9idWZfZHZiX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wodmlkZW9idWZfZHZiX3VucmVnaXN0ZXIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogY29tcGlsZS1jb21tYW5kOiAibWFrZSBEVkI9MSIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmZGM3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLmMKQEAgLTAsMCArMSwxMjkwIEBACisvKgorICogJElkOiB2aWRlby1idWYuYyx2IDEuMTggMjAwNS8wMi8yNCAxMzozMjozMCBrcmF4ZWwgRXhwICQKKyAqCisgKiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgZm9yIHZpZGVvNGxpbnV4IGNhcHR1cmUgYnVmZmVycywgdG8gaGFuZGxlCisgKiBtZW1vcnkgbWFuYWdlbWVudCBhbmQgUENJIERNQS4gIFJpZ2h0IG5vdyBidHR2ICsgc2FhNzEzNCB1c2UgaXQuCisgKgorICogVGhlIGZ1bmN0aW9ucyBleHBlY3QgdGhlIGhhcmR3YXJlIGJlaW5nIGFibGUgdG8gc2NhdHRlciBnYXR0ZXIKKyAqIChpLmUuIHRoZSBidWZmZXJzIGFyZSBub3QgbGluZWFyIGluIHBoeXNpY2FsIG1lbW9yeSwgYnV0IGZyYWdtZW50ZWQKKyAqIGludG8gUEFHRV9TSVpFIGNodW5rcykuICBUaGV5IGFsc28gYXNzdW1lIHRoZSBkcml2ZXIgZG9lcyBub3QgbmVlZAorICogdG8gdG91Y2ggdGhlIHZpZGVvIGRhdGEgKHRodXMgaXQgaXMgcHJvYmFibHkgbm90IHVzZWZ1bCBmb3IgVVNCIDEuMQorICogYXMgZGF0YSBvZnRlbiBtdXN0IGJlIHVuY29tcHJlc3NlZCBieSB0aGUgZHJpdmVycykuCisgKgorICogKGMpIDIwMDEtMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTVVNFIExhYnNdCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvdmlkZW8tYnVmLmg+CisKKyNkZWZpbmUgTUFHSUNfRE1BQlVGIDB4MTk3MjExMTIKKyNkZWZpbmUgTUFHSUNfQlVGRkVSIDB4MjAwNDAzMDIKKyNkZWZpbmUgTUFHSUNfQ0hFQ0soaXMsc2hvdWxkKQlpZiAodW5saWtlbHkoKGlzKSAhPSAoc2hvdWxkKSkpIFwKKwl7IHByaW50ayhLRVJOX0VSUiAibWFnaWMgbWlzbWF0Y2g6ICV4IChleHBlY3RlZCAleClcbiIsaXMsc2hvdWxkKTsgQlVHKCk7IH0KKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiaGVscGVyIG1vZHVsZSB0byBtYW5hZ2UgdmlkZW80bGludXggcGNpIGRtYSBidWZmZXJzIik7CitNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pCWlmIChkZWJ1ZyA+PSBsZXZlbCkgXAorCXByaW50ayhLRVJOX0RFQlVHICJ2YnVmOiAiIGZtdCAsICMjIGFyZykKKworc3RydWN0IHNjYXR0ZXJsaXN0KgordmlkZW9idWZfdm1hbGxvY190b19zZyh1bnNpZ25lZCBjaGFyICp2aXJ0LCBpbnQgbnJfcGFnZXMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7CisJc3RydWN0IHBhZ2UgKnBnOworCWludCBpOworCisJc2dsaXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSpucl9wYWdlcywgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gc2dsaXN0KQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoc2dsaXN0LDAsc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkqbnJfcGFnZXMpOworCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrLCB2aXJ0ICs9IFBBR0VfU0laRSkgeworCQlwZyA9IHZtYWxsb2NfdG9fcGFnZSh2aXJ0KTsKKwkJaWYgKE5VTEwgPT0gcGcpCisJCQlnb3RvIGVycjsKKwkJaWYgKFBhZ2VIaWdoTWVtKHBnKSkKKwkJCUJVRygpOworCQlzZ2xpc3RbaV0ucGFnZSAgID0gcGc7CisJCXNnbGlzdFtpXS5sZW5ndGggPSBQQUdFX1NJWkU7CisJfQorCXJldHVybiBzZ2xpc3Q7CisKKyBlcnI6CisJa2ZyZWUoc2dsaXN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHNjYXR0ZXJsaXN0KgordmlkZW9idWZfcGFnZXNfdG9fc2coc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG5yX3BhZ2VzLCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0OworCWludCBpID0gMDsKKworCWlmIChOVUxMID09IHBhZ2VzWzBdKQorCQlyZXR1cm4gTlVMTDsKKwlzZ2xpc3QgPSBrbWFsbG9jKHNpemVvZigqc2dsaXN0KSAqIG5yX3BhZ2VzLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBzZ2xpc3QpCisJCXJldHVybiBOVUxMOworCW1lbXNldChzZ2xpc3QsIDAsIHNpemVvZigqc2dsaXN0KSAqIG5yX3BhZ2VzKTsKKworCWlmIChOVUxMID09IHBhZ2VzWzBdKQorCQlnb3RvIG5vcGFnZTsKKwlpZiAoUGFnZUhpZ2hNZW0ocGFnZXNbMF0pKQorCQkvKiBETUEgdG8gaGlnaG1lbSBwYWdlcyBtaWdodCBub3Qgd29yayAqLworCQlnb3RvIGhpZ2htZW07CisJc2dsaXN0WzBdLnBhZ2UgICA9IHBhZ2VzWzBdOworCXNnbGlzdFswXS5vZmZzZXQgPSBvZmZzZXQ7CisJc2dsaXN0WzBdLmxlbmd0aCA9IFBBR0VfU0laRSAtIG9mZnNldDsKKwlmb3IgKGkgPSAxOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlpZiAoTlVMTCA9PSBwYWdlc1tpXSkKKwkJCWdvdG8gbm9wYWdlOworCQlpZiAoUGFnZUhpZ2hNZW0ocGFnZXNbaV0pKQorCQkJZ290byBoaWdobWVtOworCQlzZ2xpc3RbaV0ucGFnZSAgID0gcGFnZXNbaV07CisJCXNnbGlzdFtpXS5sZW5ndGggPSBQQUdFX1NJWkU7CisJfQorCXJldHVybiBzZ2xpc3Q7CisKKyBub3BhZ2U6CisJZHByaW50aygyLCJzZ2w6IG9vcHMgLSBubyBwYWdlXG4iKTsKKwlrZnJlZShzZ2xpc3QpOworCXJldHVybiBOVUxMOworCisgaGlnaG1lbToKKwlkcHJpbnRrKDIsInNnbDogb29wcyAtIGhpZ2htZW0gcGFnZVxuIik7CisJa2ZyZWUoc2dsaXN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgdmlkZW9idWZfZG1hX2luaXQoc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hKQoreworCW1lbXNldChkbWEsMCxzaXplb2YoKmRtYSkpOworCWRtYS0+bWFnaWMgPSBNQUdJQ19ETUFCVUY7Cit9CisKK2ludCB2aWRlb2J1Zl9kbWFfaW5pdF91c2VyKHN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSwgaW50IGRpcmVjdGlvbiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmlyc3QsbGFzdDsKKwlpbnQgZXJyLCBydyA9IDA7CisKKwlkbWEtPmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKwlzd2l0Y2ggKGRtYS0+ZGlyZWN0aW9uKSB7CisJY2FzZSBQQ0lfRE1BX0ZST01ERVZJQ0U6IHJ3ID0gUkVBRDsgIGJyZWFrOworCWNhc2UgUENJX0RNQV9UT0RFVklDRTogICBydyA9IFdSSVRFOyBicmVhazsKKwlkZWZhdWx0OiAgICAgICAgICAgICAgICAgQlVHKCk7CisJfQorCisJZmlyc3QgPSAoZGF0YSAgICAgICAgICAmIFBBR0VfTUFTSykgPj4gUEFHRV9TSElGVDsKKwlsYXN0ICA9ICgoZGF0YStzaXplLTEpICYgUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOworCWRtYS0+b2Zmc2V0ICAgPSBkYXRhICYgflBBR0VfTUFTSzsKKwlkbWEtPm5yX3BhZ2VzID0gbGFzdC1maXJzdCsxOworCWRtYS0+cGFnZXMgPSBrbWFsbG9jKGRtYS0+bnJfcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UqKSwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gZG1hLT5wYWdlcykKKwkJcmV0dXJuIC1FTk9NRU07CisJZHByaW50aygxLCJpbml0IHVzZXIgWzB4JWx4KzB4JWx4ID0+ICVkIHBhZ2VzXVxuIiwKKwkJZGF0YSxzaXplLGRtYS0+bnJfcGFnZXMpOworCisJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworICAgICAgICBlcnIgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LGN1cnJlbnQtPm1tLAorCQkJICAgICBkYXRhICYgUEFHRV9NQVNLLCBkbWEtPm5yX3BhZ2VzLAorCQkJICAgICBydyA9PSBSRUFELCAxLCAvKiBmb3JjZSAqLworCQkJICAgICBkbWEtPnBhZ2VzLCBOVUxMKTsKKwl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWlmIChlcnIgIT0gZG1hLT5ucl9wYWdlcykgeworCQlkbWEtPm5yX3BhZ2VzID0gKGVyciA+PSAwKSA/IGVyciA6IDA7CisJCWRwcmludGsoMSwiZ2V0X3VzZXJfcGFnZXM6IGVycj0lZCBbJWRdXG4iLGVycixkbWEtPm5yX3BhZ2VzKTsKKwkJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHZpZGVvYnVmX2RtYV9pbml0X2tlcm5lbChzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEsIGludCBkaXJlY3Rpb24sCisJCQkgICAgIGludCBucl9wYWdlcykKK3sKKwlkcHJpbnRrKDEsImluaXQga2VybmVsIFslZCBwYWdlc11cbiIsbnJfcGFnZXMpOworCWRtYS0+ZGlyZWN0aW9uID0gZGlyZWN0aW9uOworCWRtYS0+dm1hbGxvYyA9IHZtYWxsb2NfMzIobnJfcGFnZXMgPDwgUEFHRV9TSElGVCk7CisJaWYgKE5VTEwgPT0gZG1hLT52bWFsbG9jKSB7CisJCWRwcmludGsoMSwidm1hbGxvY18zMiglZCBwYWdlcykgZmFpbGVkXG4iLG5yX3BhZ2VzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChkbWEtPnZtYWxsb2MsMCxucl9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKwlkbWEtPm5yX3BhZ2VzID0gbnJfcGFnZXM7CisJcmV0dXJuIDA7Cit9CisKK2ludCB2aWRlb2J1Zl9kbWFfaW5pdF9vdmVybGF5KHN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSwgaW50IGRpcmVjdGlvbiwKKwkJCSAgICAgIGRtYV9hZGRyX3QgYWRkciwgaW50IG5yX3BhZ2VzKQoreworCWRwcmludGsoMSwiaW5pdCBvdmVybGF5IFslZCBwYWdlcyBAIGJ1cyAweCVseF1cbiIsCisJCW5yX3BhZ2VzLCh1bnNpZ25lZCBsb25nKWFkZHIpOworCWRtYS0+ZGlyZWN0aW9uID0gZGlyZWN0aW9uOworCWlmICgwID09IGFkZHIpCisJCXJldHVybiAtRUlOVkFMOworCisJZG1hLT5idXNfYWRkciA9IGFkZHI7CisJZG1hLT5ucl9wYWdlcyA9IG5yX3BhZ2VzOworCXJldHVybiAwOworfQorCitpbnQgdmlkZW9idWZfZG1hX3BjaV9tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hKQoreworCU1BR0lDX0NIRUNLKGRtYS0+bWFnaWMsTUFHSUNfRE1BQlVGKTsKKwlCVUdfT04oMCA9PSBkbWEtPm5yX3BhZ2VzKTsKKworCWlmIChkbWEtPnBhZ2VzKSB7CisJCWRtYS0+c2dsaXN0ID0gdmlkZW9idWZfcGFnZXNfdG9fc2coZG1hLT5wYWdlcywgZG1hLT5ucl9wYWdlcywKKwkJCQkJCSAgIGRtYS0+b2Zmc2V0KTsKKwl9CisJaWYgKGRtYS0+dm1hbGxvYykgeworCQlkbWEtPnNnbGlzdCA9IHZpZGVvYnVmX3ZtYWxsb2NfdG9fc2cKKwkJCShkbWEtPnZtYWxsb2MsZG1hLT5ucl9wYWdlcyk7CisJfQorCWlmIChkbWEtPmJ1c19hZGRyKSB7CisJCWRtYS0+c2dsaXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSwgR0ZQX0tFUk5FTCk7CisJCWlmIChOVUxMICE9IGRtYS0+c2dsaXN0KSB7CisJCQlkbWEtPnNnbGVuICA9IDE7CisJCQlzZ19kbWFfYWRkcmVzcygmZG1hLT5zZ2xpc3RbMF0pID0gZG1hLT5idXNfYWRkciAmIFBBR0VfTUFTSzsKKwkJCWRtYS0+c2dsaXN0WzBdLm9mZnNldCAgICAgICAgICAgPSBkbWEtPmJ1c19hZGRyICYgflBBR0VfTUFTSzsKKwkJCXNnX2RtYV9sZW4oJmRtYS0+c2dsaXN0WzBdKSAgICAgPSBkbWEtPm5yX3BhZ2VzICogUEFHRV9TSVpFOworCQl9CisJfQorCWlmIChOVUxMID09IGRtYS0+c2dsaXN0KSB7CisJCWRwcmludGsoMSwic2NhdHRlcmxpc3QgaXMgTlVMTFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmICghZG1hLT5idXNfYWRkcikgeworCQlkbWEtPnNnbGVuID0gcGNpX21hcF9zZyhkZXYsZG1hLT5zZ2xpc3QsZG1hLT5ucl9wYWdlcywKKwkJCQkJZG1hLT5kaXJlY3Rpb24pOworCQlpZiAoMCA9PSBkbWEtPnNnbGVuKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBwY2lfbWFwX3NnIGZhaWxlZFxuIixfX0ZVTkNUSU9OX18pOworCQkJa2ZyZWUoZG1hLT5zZ2xpc3QpOworCQkJZG1hLT5zZ2xpc3QgPSBOVUxMOworCQkJZG1hLT5zZ2xlbiA9IDA7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHZpZGVvYnVmX2RtYV9wY2lfc3luYyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEpCit7CisJTUFHSUNfQ0hFQ0soZG1hLT5tYWdpYyxNQUdJQ19ETUFCVUYpOworCUJVR19PTighZG1hLT5zZ2xlbik7CisKKwlpZiAoIWRtYS0+YnVzX2FkZHIpCisJCXBjaV9kbWFfc3luY19zZ19mb3JfY3B1KGRldixkbWEtPnNnbGlzdCxkbWEtPm5yX3BhZ2VzLGRtYS0+ZGlyZWN0aW9uKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHZpZGVvYnVmX2RtYV9wY2lfdW5tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hKQoreworCU1BR0lDX0NIRUNLKGRtYS0+bWFnaWMsTUFHSUNfRE1BQlVGKTsKKwlpZiAoIWRtYS0+c2dsZW4pCisJCXJldHVybiAwOworCisJaWYgKCFkbWEtPmJ1c19hZGRyKQorCQlwY2lfdW5tYXBfc2coZGV2LGRtYS0+c2dsaXN0LGRtYS0+bnJfcGFnZXMsZG1hLT5kaXJlY3Rpb24pOworCWtmcmVlKGRtYS0+c2dsaXN0KTsKKwlkbWEtPnNnbGlzdCA9IE5VTEw7CisJZG1hLT5zZ2xlbiA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCB2aWRlb2J1Zl9kbWFfZnJlZShzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEpCit7CisJTUFHSUNfQ0hFQ0soZG1hLT5tYWdpYyxNQUdJQ19ETUFCVUYpOworCUJVR19PTihkbWEtPnNnbGVuKTsKKworCWlmIChkbWEtPnBhZ2VzKSB7CisJCWludCBpOworCQlmb3IgKGk9MDsgaSA8IGRtYS0+bnJfcGFnZXM7IGkrKykKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShkbWEtPnBhZ2VzW2ldKTsKKwkJa2ZyZWUoZG1hLT5wYWdlcyk7CisJCWRtYS0+cGFnZXMgPSBOVUxMOworCX0KKwlpZiAoZG1hLT52bWFsbG9jKSB7CisJCXZmcmVlKGRtYS0+dm1hbGxvYyk7CisJCWRtYS0+dm1hbGxvYyA9IE5VTEw7CisJfQorCWlmIChkbWEtPmJ1c19hZGRyKSB7CisJCWRtYS0+YnVzX2FkZHIgPSAwOworCX0KKwlkbWEtPmRpcmVjdGlvbiA9IFBDSV9ETUFfTk9ORTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQqIHZpZGVvYnVmX2FsbG9jKHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOworCisJdmIgPSBrbWFsbG9jKHNpemUsR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgIT0gdmIpIHsKKwkJbWVtc2V0KHZiLDAsc2l6ZSk7CisJCXZpZGVvYnVmX2RtYV9pbml0KCZ2Yi0+ZG1hKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmdmItPmRvbmUpOworCQl2Yi0+bWFnaWMgICAgID0gTUFHSUNfQlVGRkVSOworCX0KKwlyZXR1cm4gdmI7Cit9CisKK2ludCB2aWRlb2J1Zl93YWl0b24oc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsIGludCBub25fYmxvY2tpbmcsIGludCBpbnRyKQoreworCWludCByZXR2YWwgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJTUFHSUNfQ0hFQ0sodmItPm1hZ2ljLE1BR0lDX0JVRkZFUik7CisJYWRkX3dhaXRfcXVldWUoJnZiLT5kb25lLCAmd2FpdCk7CisJd2hpbGUgKHZiLT5zdGF0ZSA9PSBTVEFURV9BQ1RJVkUgfHwgdmItPnN0YXRlID09IFNUQVRFX1FVRVVFRCkgeworCQlpZiAobm9uX2Jsb2NraW5nKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoaW50ciAgPyBUQVNLX0lOVEVSUlVQVElCTEUKKwkJCQkJOiBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWlmICh2Yi0+c3RhdGUgPT0gU1RBVEVfQUNUSVZFIHx8IHZiLT5zdGF0ZSA9PSBTVEFURV9RVUVVRUQpCisJCQlzY2hlZHVsZSgpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoaW50ciAmJiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZHByaW50aygxLCJidWZmZXIgd2FpdG9uOiAtRUlOVFJcbiIpOworCQkJcmV0dmFsID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJnZiLT5kb25lLCAmd2FpdCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50Cit2aWRlb2J1Zl9pb2xvY2soc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCisJCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYnVmKQoreworCWludCBlcnIscGFnZXM7CisJZG1hX2FkZHJfdCBidXM7CisKKwlNQUdJQ19DSEVDSyh2Yi0+bWFnaWMsTUFHSUNfQlVGRkVSKTsKKwlzd2l0Y2ggKHZiLT5tZW1vcnkpIHsKKwljYXNlIFY0TDJfTUVNT1JZX01NQVA6CisJY2FzZSBWNEwyX01FTU9SWV9VU0VSUFRSOgorCQlpZiAoMCA9PSB2Yi0+YmFkZHIpIHsKKwkJCS8qIG5vIHVzZXJzcGFjZSBhZGRyIC0tIGtlcm5lbCBib3VuY2UgYnVmZmVyICovCisJCQlwYWdlcyA9IFBBR0VfQUxJR04odmItPnNpemUpID4+IFBBR0VfU0hJRlQ7CisJCQllcnIgPSB2aWRlb2J1Zl9kbWFfaW5pdF9rZXJuZWwoJnZiLT5kbWEsUENJX0RNQV9GUk9NREVWSUNFLAorCQkJCQkJICAgICAgIHBhZ2VzKTsKKwkJCWlmICgwICE9IGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgeworCQkJLyogZG1hIGRpcmVjdGx5IHRvIHVzZXJzcGFjZSAqLworCQkJZXJyID0gdmlkZW9idWZfZG1hX2luaXRfdXNlcigmdmItPmRtYSxQQ0lfRE1BX0ZST01ERVZJQ0UsCisJCQkJCQkgICAgIHZiLT5iYWRkcix2Yi0+YnNpemUpOworCQkJaWYgKDAgIT0gZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWNEwyX01FTU9SWV9PVkVSTEFZOgorCQlpZiAoTlVMTCA9PSBmYnVmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIEZJWE1FOiBuZWVkIHNhbml0eSBjaGVja3MgZm9yIHZiLT5ib2ZmICovCisJCWJ1cyAgID0gKGRtYV9hZGRyX3QpZmJ1Zi0+YmFzZSArIHZiLT5ib2ZmOworCQlwYWdlcyA9IFBBR0VfQUxJR04odmItPnNpemUpID4+IFBBR0VfU0hJRlQ7CisJCWVyciA9IHZpZGVvYnVmX2RtYV9pbml0X292ZXJsYXkoJnZiLT5kbWEsUENJX0RNQV9GUk9NREVWSUNFLAorCQkJCQkJYnVzLCBwYWdlcyk7CisJCWlmICgwICE9IGVycikKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwllcnIgPSB2aWRlb2J1Zl9kbWFfcGNpX21hcChwY2ksJnZiLT5kbWEpOworCWlmICgwICE9IGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCB2aWRlb2J1Zl9xdWV1ZV9pbml0KHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSogcSwKKwkJCSBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzICpvcHMsCisJCQkgc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCSBzcGlubG9ja190ICppcnFsb2NrLAorCQkJIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlLAorCQkJIGVudW0gdjRsMl9maWVsZCBmaWVsZCwKKwkJCSB1bnNpZ25lZCBpbnQgbXNpemUsCisJCQkgdm9pZCAqcHJpdikKK3sKKwltZW1zZXQocSwwLHNpemVvZigqcSkpOworCXEtPmlycWxvY2sgPSBpcnFsb2NrOworCXEtPnBjaSAgICAgPSBwY2k7CisJcS0+dHlwZSAgICA9IHR5cGU7CisJcS0+ZmllbGQgICA9IGZpZWxkOworCXEtPm1zaXplICAgPSBtc2l6ZTsKKwlxLT5vcHMgICAgID0gb3BzOworCXEtPnByaXZfZGF0YSA9IHByaXY7CisKKwlpbml0X01VVEVYKCZxLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcS0+c3RyZWFtKTsKK30KKworaW50Cit2aWRlb2J1Zl9xdWV1ZV9pc19idXN5KHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSkKK3sKKwlpbnQgaTsKKworCWlmIChxLT5zdHJlYW1pbmcpIHsKKwkJZHByaW50aygxLCJidXN5OiBzdHJlYW1pbmcgYWN0aXZlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChxLT5yZWFkaW5nKSB7CisJCWRwcmludGsoMSwiYnVzeTogcGVuZGluZyByZWFkICMxXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChxLT5yZWFkX2J1ZikgeworCQlkcHJpbnRrKDEsImJ1c3k6IHBlbmRpbmcgcmVhZCAjMlxuIik7CisJCXJldHVybiAxOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgVklERU9fTUFYX0ZSQU1FOyBpKyspIHsKKwkJaWYgKE5VTEwgPT0gcS0+YnVmc1tpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAocS0+YnVmc1tpXS0+bWFwKSB7CisJCQlkcHJpbnRrKDEsImJ1c3k6IGJ1ZmZlciAjJWQgbWFwcGVkXG4iLGkpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHEtPmJ1ZnNbaV0tPnN0YXRlID09IFNUQVRFX1FVRVVFRCkgeworCQkJZHByaW50aygxLCJidXN5OiBidWZmZXIgIyVkIHF1ZXVlZFxuIixpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChxLT5idWZzW2ldLT5zdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKKwkJCWRwcmludGsoMSwiYnVzeTogYnVmZmVyICMlZCBhdnRpdmVcbiIsaSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZAordmlkZW9idWZfcXVldWVfY2FuY2VsKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJLyogcmVtb3ZlIHF1ZXVlZCBidWZmZXJzIGZyb20gbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKHEtPmlycWxvY2ssZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBWSURFT19NQVhfRlJBTUU7IGkrKykgeworCQlpZiAoTlVMTCA9PSBxLT5idWZzW2ldKQorCQkJY29udGludWU7CisJCWlmIChxLT5idWZzW2ldLT5zdGF0ZSA9PSBTVEFURV9RVUVVRUQpIHsKKwkJCWxpc3RfZGVsKCZxLT5idWZzW2ldLT5xdWV1ZSk7CisJCQlxLT5idWZzW2ldLT5zdGF0ZSA9IFNUQVRFX0VSUk9SOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+aXJxbG9jayxmbGFncyk7CisKKwkvKiBmcmVlIGFsbCBidWZmZXJzICsgY2xlYXIgcXVldWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVklERU9fTUFYX0ZSQU1FOyBpKyspIHsKKwkJaWYgKE5VTEwgPT0gcS0+YnVmc1tpXSkKKwkJCWNvbnRpbnVlOworCQlxLT5vcHMtPmJ1Zl9yZWxlYXNlKHEscS0+YnVmc1tpXSk7CisJfQorCUlOSVRfTElTVF9IRUFEKCZxLT5zdHJlYW0pOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSB2NGwyX2ZpZWxkCit2aWRlb2J1Zl9uZXh0X2ZpZWxkKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSkKK3sKKwllbnVtIHY0bDJfZmllbGQgZmllbGQgPSBxLT5maWVsZDsKKworCUJVR19PTihWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCk7CisKKwlpZiAoVjRMMl9GSUVMRF9BTFRFUk5BVEUgPT0gZmllbGQpIHsKKwkJaWYgKFY0TDJfRklFTERfVE9QID09IHEtPmxhc3QpIHsKKwkJCWZpZWxkICAgPSBWNEwyX0ZJRUxEX0JPVFRPTTsKKwkJCXEtPmxhc3QgPSBWNEwyX0ZJRUxEX0JPVFRPTTsKKwkJfSBlbHNlIHsKKwkJCWZpZWxkICAgPSBWNEwyX0ZJRUxEX1RPUDsKKwkJCXEtPmxhc3QgPSBWNEwyX0ZJRUxEX1RPUDsKKwkJfQorCX0KKwlyZXR1cm4gZmllbGQ7Cit9CisKK3ZvaWQKK3ZpZGVvYnVmX3N0YXR1cyhzdHJ1Y3QgdjRsMl9idWZmZXIgKmIsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAorCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlNQUdJQ19DSEVDSyh2Yi0+bWFnaWMsTUFHSUNfQlVGRkVSKTsKKworCWItPmluZGV4ICAgID0gdmItPmk7CisJYi0+dHlwZSAgICAgPSB0eXBlOworCisJYi0+bWVtb3J5ICAgPSB2Yi0+bWVtb3J5OworCXN3aXRjaCAoYi0+bWVtb3J5KSB7CisJY2FzZSBWNEwyX01FTU9SWV9NTUFQOgorCQliLT5tLm9mZnNldCAgPSB2Yi0+Ym9mZjsKKwkJYi0+bGVuZ3RoICAgID0gdmItPmJzaXplOworCQlicmVhazsKKwljYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6CisJCWItPm0udXNlcnB0ciA9IHZiLT5iYWRkcjsKKwkJYi0+bGVuZ3RoICAgID0gdmItPmJzaXplOworCQlicmVhazsKKwljYXNlIFY0TDJfTUVNT1JZX09WRVJMQVk6CisJCWItPm0ub2Zmc2V0ICA9IHZiLT5ib2ZmOworCQlicmVhazsKKwl9CisKKwliLT5mbGFncyAgICA9IDA7CisJaWYgKHZiLT5tYXApCisJCWItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOworCisJc3dpdGNoICh2Yi0+c3RhdGUpIHsKKwljYXNlIFNUQVRFX1BSRVBBUkVEOgorCWNhc2UgU1RBVEVfUVVFVUVEOgorCWNhc2UgU1RBVEVfQUNUSVZFOgorCQliLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKKwkJYnJlYWs7CisJY2FzZSBTVEFURV9ET05FOgorCWNhc2UgU1RBVEVfRVJST1I6CisJCWItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKKwkJYnJlYWs7CisJY2FzZSBTVEFURV9ORUVEU19JTklUOgorCWNhc2UgU1RBVEVfSURMRToKKwkJLyogbm90aGluZyAqLworCQlicmVhazsKKwl9CisKKwlpZiAodmItPmlucHV0ICE9IFVOU0VUKSB7CisJCWItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfSU5QVVQ7CisJCWItPmlucHV0ICA9IHZiLT5pbnB1dDsKKwl9CisKKwliLT5maWVsZCAgICAgPSB2Yi0+ZmllbGQ7CisJYi0+dGltZXN0YW1wID0gdmItPnRzOworCWItPmJ5dGVzdXNlZCA9IHZiLT5zaXplOworCWItPnNlcXVlbmNlICA9IHZiLT5maWVsZF9jb3VudCA+PiAxOworfQorCitpbnQKK3ZpZGVvYnVmX3JlcWJ1ZnMoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAorCQkgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSxjb3VudDsKKwlpbnQgcmV0dmFsOworCisJaWYgKHJlcS0+dHlwZSAhPSBxLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmVxLT5jb3VudCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChyZXEtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQICAgICAmJgorCSAgICByZXEtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9VU0VSUFRSICAmJgorCSAgICByZXEtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9PVkVSTEFZKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChxLT5zdHJlYW1pbmcpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKCFsaXN0X2VtcHR5KCZxLT5zdHJlYW0pKQorCQlyZXR1cm4gLUVCVVNZOworCisJZG93bigmcS0+bG9jayk7CisJY291bnQgPSByZXEtPmNvdW50OworCWlmIChjb3VudCA+IFZJREVPX01BWF9GUkFNRSkKKwkJY291bnQgPSBWSURFT19NQVhfRlJBTUU7CisJc2l6ZSA9IDA7CisJcS0+b3BzLT5idWZfc2V0dXAocSwmY291bnQsJnNpemUpOworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCWRwcmludGsoMSwicmVxYnVmczogYnVmcz0lZCwgc2l6ZT0weCV4IFslZCBwYWdlcyB0b3RhbF1cbiIsCisJCWNvdW50LCBzaXplLCAoY291bnQqc2l6ZSk+PlBBR0VfU0hJRlQpOworCisJcmV0dmFsID0gdmlkZW9idWZfbW1hcF9zZXR1cChxLGNvdW50LHNpemUscmVxLT5tZW1vcnkpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGRvbmU7CisKKwlyZXEtPmNvdW50ID0gY291bnQ7CisKKyBkb25lOgorCXVwKCZxLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQKK3ZpZGVvYnVmX3F1ZXJ5YnVmKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQoreworCWlmICh1bmxpa2VseShiLT50eXBlICE9IHEtPnR5cGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkoYi0+aW5kZXggPCAwIHx8IGItPmluZGV4ID49IFZJREVPX01BWF9GUkFNRSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseShOVUxMID09IHEtPmJ1ZnNbYi0+aW5kZXhdKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdmlkZW9idWZfc3RhdHVzKGIscS0+YnVmc1tiLT5pbmRleF0scS0+dHlwZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludAordmlkZW9idWZfcWJ1ZihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJICAgICAgc3RydWN0IHY0bDJfYnVmZmVyICpiKQoreworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKmJ1ZjsKKwllbnVtIHY0bDJfZmllbGQgZmllbGQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJZG93bigmcS0+bG9jayk7CisJcmV0dmFsID0gLUVCVVNZOworCWlmIChxLT5yZWFkaW5nKQorCQlnb3RvIGRvbmU7CisJcmV0dmFsID0gLUVJTlZBTDsKKwlpZiAoYi0+dHlwZSAhPSBxLT50eXBlKQorCQlnb3RvIGRvbmU7CisJaWYgKGItPmluZGV4IDwgMCB8fCBiLT5pbmRleCA+PSBWSURFT19NQVhfRlJBTUUpCisJCWdvdG8gZG9uZTsKKwlidWYgPSBxLT5idWZzW2ItPmluZGV4XTsKKwlpZiAoTlVMTCA9PSBidWYpCisJCWdvdG8gZG9uZTsKKwlNQUdJQ19DSEVDSyhidWYtPm1hZ2ljLE1BR0lDX0JVRkZFUik7CisJaWYgKGJ1Zi0+bWVtb3J5ICE9IGItPm1lbW9yeSkKKwkJZ290byBkb25lOworCWlmIChidWYtPnN0YXRlID09IFNUQVRFX1FVRVVFRCB8fAorCSAgICBidWYtPnN0YXRlID09IFNUQVRFX0FDVElWRSkKKwkJZ290byBkb25lOworCisJaWYgKGItPmZsYWdzICYgVjRMMl9CVUZfRkxBR19JTlBVVCkgeworCQlpZiAoYi0+aW5wdXQgPj0gcS0+aW5wdXRzKQorCQkJZ290byBkb25lOworCQlidWYtPmlucHV0ID0gYi0+aW5wdXQ7CisJfSBlbHNlIHsKKwkJYnVmLT5pbnB1dCA9IFVOU0VUOworCX0KKworCXN3aXRjaCAoYi0+bWVtb3J5KSB7CisJY2FzZSBWNEwyX01FTU9SWV9NTUFQOgorCQlpZiAoMCA9PSBidWYtPmJhZGRyKQorCQkJZ290byBkb25lOworCQlicmVhazsKKwljYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6CisJCWlmIChiLT5sZW5ndGggPCBidWYtPmJzaXplKQorCQkJZ290byBkb25lOworCQlpZiAoU1RBVEVfTkVFRFNfSU5JVCAhPSBidWYtPnN0YXRlICYmIGJ1Zi0+YmFkZHIgIT0gYi0+bS51c2VycHRyKQorCQkJcS0+b3BzLT5idWZfcmVsZWFzZShxLGJ1Zik7CisJCWJ1Zi0+YmFkZHIgPSBiLT5tLnVzZXJwdHI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NRU1PUllfT1ZFUkxBWToKKwkJYnVmLT5ib2ZmID0gYi0+bS5vZmZzZXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZG9uZTsKKwl9CisKKwlmaWVsZCA9IHZpZGVvYnVmX25leHRfZmllbGQocSk7CisJcmV0dmFsID0gcS0+b3BzLT5idWZfcHJlcGFyZShxLGJ1ZixmaWVsZCk7CisJaWYgKDAgIT0gcmV0dmFsKQorCQlnb3RvIGRvbmU7CisKKwlsaXN0X2FkZF90YWlsKCZidWYtPnN0cmVhbSwmcS0+c3RyZWFtKTsKKwlpZiAocS0+c3RyZWFtaW5nKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKHEtPmlycWxvY2ssZmxhZ3MpOworCQlxLT5vcHMtPmJ1Zl9xdWV1ZShxLGJ1Zik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+aXJxbG9jayxmbGFncyk7CisJfQorCXJldHZhbCA9IDA7CisKKyBkb25lOgorCXVwKCZxLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQKK3ZpZGVvYnVmX2RxYnVmKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKKwkgICAgICAgc3RydWN0IHY0bDJfYnVmZmVyICpiLCBpbnQgbm9uYmxvY2tpbmcpCit7CisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqYnVmOworCWludCByZXR2YWw7CisKKwlkb3duKCZxLT5sb2NrKTsKKwlyZXR2YWwgPSAtRUJVU1k7CisJaWYgKHEtPnJlYWRpbmcpCisJCWdvdG8gZG9uZTsKKwlyZXR2YWwgPSAtRUlOVkFMOworCWlmIChiLT50eXBlICE9IHEtPnR5cGUpCisJCWdvdG8gZG9uZTsKKwlpZiAobGlzdF9lbXB0eSgmcS0+c3RyZWFtKSkKKwkJZ290byBkb25lOworCWJ1ZiA9IGxpc3RfZW50cnkocS0+c3RyZWFtLm5leHQsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIsIHN0cmVhbSk7CisJcmV0dmFsID0gdmlkZW9idWZfd2FpdG9uKGJ1Ziwgbm9uYmxvY2tpbmcsIDEpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGRvbmU7CisJc3dpdGNoIChidWYtPnN0YXRlKSB7CisJY2FzZSBTVEFURV9FUlJPUjoKKwkJcmV0dmFsID0gLUVJTzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTVEFURV9ET05FOgorCQl2aWRlb2J1Zl9kbWFfcGNpX3N5bmMocS0+cGNpLCZidWYtPmRtYSk7CisJCWJ1Zi0+c3RhdGUgPSBTVEFURV9JRExFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWxpc3RfZGVsKCZidWYtPnN0cmVhbSk7CisJbWVtc2V0KGIsMCxzaXplb2YoKmIpKTsKKwl2aWRlb2J1Zl9zdGF0dXMoYixidWYscS0+dHlwZSk7CisKKyBkb25lOgorCXVwKCZxLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgdmlkZW9idWZfc3RyZWFtb24oc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxKQoreworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCWRvd24oJnEtPmxvY2spOworCXJldHZhbCA9IC1FQlVTWTsKKwlpZiAocS0+cmVhZGluZykKKwkJZ290byBkb25lOworCXJldHZhbCA9IDA7CisJaWYgKHEtPnN0cmVhbWluZykKKwkJZ290byBkb25lOworCXEtPnN0cmVhbWluZyA9IDE7CisJc3Bpbl9sb2NrX2lycXNhdmUocS0+aXJxbG9jayxmbGFncyk7CisJbGlzdF9mb3JfZWFjaChsaXN0LCZxLT5zdHJlYW0pIHsKKwkJYnVmID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyLCBzdHJlYW0pOworCQlpZiAoYnVmLT5zdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkKKwkJCXEtPm9wcy0+YnVmX3F1ZXVlKHEsYnVmKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5pcnFsb2NrLGZsYWdzKTsKKworIGRvbmU6CisJdXAoJnEtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB2aWRlb2J1Zl9zdHJlYW1vZmYoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxKQoreworCWludCByZXR2YWwgPSAtRUlOVkFMOworCisJZG93bigmcS0+bG9jayk7CisJaWYgKCFxLT5zdHJlYW1pbmcpCisJCWdvdG8gZG9uZTsKKwl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwocSk7CisJcS0+c3RyZWFtaW5nID0gMDsKKwlyZXR2YWwgPSAwOworCisgZG9uZToKKwl1cCgmcS0+bG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHNzaXplX3QKK3ZpZGVvYnVmX3JlYWRfemVyb2NvcHkoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWVudW0gdjRsMl9maWVsZCBmaWVsZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBpbnQgcmV0dmFsOworCisgICAgICAgIC8qIHNldHVwIHN0dWZmICovCisJcmV0dmFsID0gLUVOT01FTTsKKwlxLT5yZWFkX2J1ZiA9IHZpZGVvYnVmX2FsbG9jKHEtPm1zaXplKTsKKwlpZiAoTlVMTCA9PSBxLT5yZWFkX2J1ZikKKwkJZ290byBkb25lOworCisJcS0+cmVhZF9idWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7CisJcS0+cmVhZF9idWYtPmJhZGRyICA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisgICAgICAgIHEtPnJlYWRfYnVmLT5ic2l6ZSAgPSBjb3VudDsKKwlmaWVsZCA9IHZpZGVvYnVmX25leHRfZmllbGQocSk7CisJcmV0dmFsID0gcS0+b3BzLT5idWZfcHJlcGFyZShxLHEtPnJlYWRfYnVmLGZpZWxkKTsKKwlpZiAoMCAhPSByZXR2YWwpCisJCWdvdG8gZG9uZTsKKworICAgICAgICAvKiBzdGFydCBjYXB0dXJlICYgd2FpdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKHEtPmlycWxvY2ssZmxhZ3MpOworCXEtPm9wcy0+YnVmX3F1ZXVlKHEscS0+cmVhZF9idWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+aXJxbG9jayxmbGFncyk7CisgICAgICAgIHJldHZhbCA9IHZpZGVvYnVmX3dhaXRvbihxLT5yZWFkX2J1ZiwwLDApOworICAgICAgICBpZiAoMCA9PSByZXR2YWwpIHsKKwkJdmlkZW9idWZfZG1hX3BjaV9zeW5jKHEtPnBjaSwmcS0+cmVhZF9idWYtPmRtYSk7CisJCWlmIChTVEFURV9FUlJPUiA9PSBxLT5yZWFkX2J1Zi0+c3RhdGUpCisJCQlyZXR2YWwgPSAtRUlPOworCQllbHNlCisJCQlyZXR2YWwgPSBxLT5yZWFkX2J1Zi0+c2l6ZTsKKwl9CisKKyBkb25lOgorCS8qIGNsZWFudXAgKi8KKwlxLT5vcHMtPmJ1Zl9yZWxlYXNlKHEscS0+cmVhZF9idWYpOworCWtmcmVlKHEtPnJlYWRfYnVmKTsKKwlxLT5yZWFkX2J1ZiA9IE5VTEw7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3NpemVfdCB2aWRlb2J1Zl9yZWFkX29uZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkgIGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcywKKwkJCSAgaW50IG5vbmJsb2NraW5nKQoreworCWVudW0gdjRsMl9maWVsZCBmaWVsZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNpemUsIG5idWZzLCBieXRlczsKKwlpbnQgcmV0dmFsOworCisJZG93bigmcS0+bG9jayk7CisKKwluYnVmcyA9IDE7IHNpemUgPSAwOworCXEtPm9wcy0+YnVmX3NldHVwKHEsJm5idWZzLCZzaXplKTsKKwlpZiAoTlVMTCA9PSBxLT5yZWFkX2J1ZiAgJiYKKwkgICAgY291bnQgPj0gc2l6ZSAgICAgICAgJiYKKwkgICAgIW5vbmJsb2NraW5nKSB7CisJCXJldHZhbCA9IHZpZGVvYnVmX3JlYWRfemVyb2NvcHkocSxkYXRhLGNvdW50LHBwb3MpOworCQlpZiAocmV0dmFsID49IDAgIHx8ICByZXR2YWwgPT0gLUVJTykKKwkJCS8qIG9rLCBhbGwgZG9uZSAqLworCQkJZ290byBkb25lOworCQkvKiBmYWxsYmFjayB0byBrZXJuZWwgYm91bmNlIGJ1ZmZlciBvbiBmYWlsdXJlcyAqLworCX0KKworCWlmIChOVUxMID09IHEtPnJlYWRfYnVmKSB7CisJCS8qIG5lZWQgdG8gY2FwdHVyZSBhIG5ldyBmcmFtZSAqLworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlxLT5yZWFkX2J1ZiA9IHZpZGVvYnVmX2FsbG9jKHEtPm1zaXplKTsKKwkJaWYgKE5VTEwgPT0gcS0+cmVhZF9idWYpCisJCQlnb3RvIGRvbmU7CisJCXEtPnJlYWRfYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOworCQlmaWVsZCA9IHZpZGVvYnVmX25leHRfZmllbGQocSk7CisJCXJldHZhbCA9IHEtPm9wcy0+YnVmX3ByZXBhcmUocSxxLT5yZWFkX2J1ZixmaWVsZCk7CisJCWlmICgwICE9IHJldHZhbCkKKwkJCWdvdG8gZG9uZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUocS0+aXJxbG9jayxmbGFncyk7CisJCXEtPm9wcy0+YnVmX3F1ZXVlKHEscS0+cmVhZF9idWYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPmlycWxvY2ssZmxhZ3MpOworCQlxLT5yZWFkX29mZiA9IDA7CisJfQorCisJLyogd2FpdCB1bnRpbCBjYXB0dXJlIGlzIGRvbmUgKi8KKyAgICAgICAgcmV0dmFsID0gdmlkZW9idWZfd2FpdG9uKHEtPnJlYWRfYnVmLCBub25ibG9ja2luZywgMSk7CisJaWYgKDAgIT0gcmV0dmFsKQorCQlnb3RvIGRvbmU7CisJdmlkZW9idWZfZG1hX3BjaV9zeW5jKHEtPnBjaSwmcS0+cmVhZF9idWYtPmRtYSk7CisKKwlpZiAoU1RBVEVfRVJST1IgPT0gcS0+cmVhZF9idWYtPnN0YXRlKSB7CisJCS8qIGNhdGNoIEkvTyBlcnJvcnMgKi8KKwkJcS0+b3BzLT5idWZfcmVsZWFzZShxLHEtPnJlYWRfYnVmKTsKKwkJa2ZyZWUocS0+cmVhZF9idWYpOworCQlxLT5yZWFkX2J1ZiA9IE5VTEw7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBjb3B5IHRvIHVzZXJzcGFjZSAqLworCWJ5dGVzID0gY291bnQ7CisJaWYgKGJ5dGVzID4gcS0+cmVhZF9idWYtPnNpemUgLSBxLT5yZWFkX29mZikKKwkJYnl0ZXMgPSBxLT5yZWFkX2J1Zi0+c2l6ZSAtIHEtPnJlYWRfb2ZmOworCXJldHZhbCA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCBxLT5yZWFkX2J1Zi0+ZG1hLnZtYWxsb2MrcS0+cmVhZF9vZmYsIGJ5dGVzKSkKKwkJZ290byBkb25lOworCisJcmV0dmFsID0gYnl0ZXM7CisJcS0+cmVhZF9vZmYgKz0gYnl0ZXM7CisJaWYgKHEtPnJlYWRfb2ZmID09IHEtPnJlYWRfYnVmLT5zaXplKSB7CisJCS8qIGFsbCBkYXRhIGNvcGllZCwgY2xlYW51cCAqLworCQlxLT5vcHMtPmJ1Zl9yZWxlYXNlKHEscS0+cmVhZF9idWYpOworCQlrZnJlZShxLT5yZWFkX2J1Zik7CisJCXEtPnJlYWRfYnVmID0gTlVMTDsKKwl9CisKKyBkb25lOgorCXVwKCZxLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgdmlkZW9idWZfcmVhZF9zdGFydChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEpCit7CisJZW51bSB2NGwyX2ZpZWxkIGZpZWxkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50ID0gMCwgc2l6ZSA9IDA7CisJaW50IGVyciwgaTsKKworCXEtPm9wcy0+YnVmX3NldHVwKHEsJmNvdW50LCZzaXplKTsKKwlpZiAoY291bnQgPCAyKQorCQljb3VudCA9IDI7CisJaWYgKGNvdW50ID4gVklERU9fTUFYX0ZSQU1FKQorCQljb3VudCA9IFZJREVPX01BWF9GUkFNRTsKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKworCWVyciA9IHZpZGVvYnVmX21tYXBfc2V0dXAocSwgY291bnQsIHNpemUsIFY0TDJfTUVNT1JZX1VTRVJQVFIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZmllbGQgPSB2aWRlb2J1Zl9uZXh0X2ZpZWxkKHEpOworCQllcnIgPSBxLT5vcHMtPmJ1Zl9wcmVwYXJlKHEscS0+YnVmc1tpXSxmaWVsZCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlsaXN0X2FkZF90YWlsKCZxLT5idWZzW2ldLT5zdHJlYW0sICZxLT5zdHJlYW0pOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5pcnFsb2NrLGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJcS0+b3BzLT5idWZfcXVldWUocSxxLT5idWZzW2ldKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPmlycWxvY2ssZmxhZ3MpOworCXEtPnJlYWRpbmcgPSAxOworCXJldHVybiAwOworfQorCit2b2lkIHZpZGVvYnVmX3JlYWRfc3RvcChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEpCit7CisJaW50IGk7CisKKwl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwocSk7CisJdmlkZW9idWZfbW1hcF9mcmVlKHEpOworCUlOSVRfTElTVF9IRUFEKCZxLT5zdHJlYW0pOworCWZvciAoaSA9IDA7IGkgPCBWSURFT19NQVhfRlJBTUU7IGkrKykgeworCQlpZiAoTlVMTCA9PSBxLT5idWZzW2ldKQorCQkJY29udGludWU7CisJCWtmcmVlKHEtPmJ1ZnNbaV0pOworCQlxLT5idWZzW2ldID0gTlVMTDsKKwl9CisJcS0+cmVhZF9idWYgPSBOVUxMOworCXEtPnJlYWRpbmcgID0gMDsKK30KKworc3NpemVfdCB2aWRlb2J1Zl9yZWFkX3N0cmVhbShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkgICAgIGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcywKKwkJCSAgICAgaW50IHZiaWhhY2ssIGludCBub25ibG9ja2luZykKK3sKKwl1bnNpZ25lZCBpbnQgKmZjLCBieXRlczsKKwlpbnQgZXJyLCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRwcmludGsoMiwiJXNcbiIsX19GVU5DVElPTl9fKTsKKwlkb3duKCZxLT5sb2NrKTsKKwlyZXR2YWwgPSAtRUJVU1k7CisJaWYgKHEtPnN0cmVhbWluZykKKwkJZ290byBkb25lOworCWlmICghcS0+cmVhZGluZykgeworCQlyZXR2YWwgPSB2aWRlb2J1Zl9yZWFkX3N0YXJ0KHEpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXR2YWwgPSAwOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLyogZ2V0IC8gd2FpdCBmb3IgZGF0YSAqLworCQlpZiAoTlVMTCA9PSBxLT5yZWFkX2J1ZikgeworCQkJcS0+cmVhZF9idWYgPSBsaXN0X2VudHJ5KHEtPnN0cmVhbS5uZXh0LAorCQkJCQkJIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIsCisJCQkJCQkgc3RyZWFtKTsKKwkJCWxpc3RfZGVsKCZxLT5yZWFkX2J1Zi0+c3RyZWFtKTsKKwkJCXEtPnJlYWRfb2ZmID0gMDsKKwkJfQorCQllcnIgPSB2aWRlb2J1Zl93YWl0b24ocS0+cmVhZF9idWYsIG5vbmJsb2NraW5nLCAxKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWlmICgwID09IHJldHZhbCkKKwkJCQlyZXR2YWwgPSBlcnI7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChxLT5yZWFkX2J1Zi0+c3RhdGUgPT0gU1RBVEVfRE9ORSkgeworCQkJaWYgKHZiaWhhY2spIHsKKwkJCQkvKiBkaXJ0eSwgdW5kb2N1bWVudGVkIGhhY2sgLS0gcGFzcyB0aGUgZnJhbWUgY291bnRlcgorCQkJCSAqIHdpdGhpbiB0aGUgbGFzdCBmb3VyIGJ5dGVzIG9mIGVhY2ggdmJpIGRhdGEgYmxvY2suCisJCQkJICogV2UgbmVlZCB0aGF0IG9uZSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisJCQkJICogdG8gYWxsIHZiaSBkZWNvZGluZyBzb2Z0d2FyZSBvdXQgdGhlcmUgLi4uICovCisJCQkJZmMgID0gKHVuc2lnbmVkIGludCopcS0+cmVhZF9idWYtPmRtYS52bWFsbG9jOworCQkJCWZjICs9IChxLT5yZWFkX2J1Zi0+c2l6ZT4+MikgLTE7CisJCQkJKmZjID0gcS0+cmVhZF9idWYtPmZpZWxkX2NvdW50ID4+IDE7CisJCQkJZHByaW50aygxLCJ2YmloYWNrOiAlZFxuIiwqZmMpOworCQkJfQorCisJCQkvKiBjb3B5IHN0dWZmICovCisJCQlieXRlcyA9IGNvdW50OworCQkJaWYgKGJ5dGVzID4gcS0+cmVhZF9idWYtPnNpemUgLSBxLT5yZWFkX29mZikKKwkJCQlieXRlcyA9IHEtPnJlYWRfYnVmLT5zaXplIC0gcS0+cmVhZF9vZmY7CisJCQlpZiAoY29weV90b191c2VyKGRhdGEgKyByZXR2YWwsCisJCQkJCSBxLT5yZWFkX2J1Zi0+ZG1hLnZtYWxsb2MgKyBxLT5yZWFkX29mZiwKKwkJCQkJIGJ5dGVzKSkgeworCQkJCWlmICgwID09IHJldHZhbCkKKwkJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvdW50ICAgICAgIC09IGJ5dGVzOworCQkJcmV0dmFsICAgICAgKz0gYnl0ZXM7CisJCQlxLT5yZWFkX29mZiArPSBieXRlczsKKwkJfSBlbHNlIHsKKwkJCS8qIHNvbWUgZXJyb3IgKi8KKwkJCXEtPnJlYWRfb2ZmID0gcS0+cmVhZF9idWYtPnNpemU7CisJCQlpZiAoMCA9PSByZXR2YWwpCisJCQkJcmV0dmFsID0gLUVJTzsKKwkJfQorCisJCS8qIHJlcXVldWUgYnVmZmVyIHdoZW4gZG9uZSB3aXRoIGNvcHlpbmcgKi8KKwkJaWYgKHEtPnJlYWRfb2ZmID09IHEtPnJlYWRfYnVmLT5zaXplKSB7CisJCQlsaXN0X2FkZF90YWlsKCZxLT5yZWFkX2J1Zi0+c3RyZWFtLAorCQkJCSAgICAgICZxLT5zdHJlYW0pOworCQkJc3Bpbl9sb2NrX2lycXNhdmUocS0+aXJxbG9jayxmbGFncyk7CisJCQlxLT5vcHMtPmJ1Zl9xdWV1ZShxLHEtPnJlYWRfYnVmKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+aXJxbG9jayxmbGFncyk7CisJCQlxLT5yZWFkX2J1ZiA9IE5VTEw7CisJCX0KKwkJaWYgKHJldHZhbCA8IDApCisJCQlicmVhazsKKwl9CisKKyBkb25lOgorCXVwKCZxLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCit1bnNpZ25lZCBpbnQgdmlkZW9idWZfcG9sbF9zdHJlYW0oc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICBzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkJICBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKmJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgaW50IHJjID0gMDsKKworCWRvd24oJnEtPmxvY2spOworCWlmIChxLT5zdHJlYW1pbmcpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZxLT5zdHJlYW0pKQorCQkJYnVmID0gbGlzdF9lbnRyeShxLT5zdHJlYW0ubmV4dCwKKwkJCQkJIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIsIHN0cmVhbSk7CisJfSBlbHNlIHsKKwkJaWYgKCFxLT5yZWFkaW5nKQorCQkJdmlkZW9idWZfcmVhZF9zdGFydChxKTsKKwkJaWYgKCFxLT5yZWFkaW5nKSB7CisJCQlyYyA9IFBPTExFUlI7CisJCX0gZWxzZSBpZiAoTlVMTCA9PSBxLT5yZWFkX2J1ZikgeworCQkJcS0+cmVhZF9idWYgPSBsaXN0X2VudHJ5KHEtPnN0cmVhbS5uZXh0LAorCQkJCQkJIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIsCisJCQkJCQkgc3RyZWFtKTsKKwkJCWxpc3RfZGVsKCZxLT5yZWFkX2J1Zi0+c3RyZWFtKTsKKwkJCXEtPnJlYWRfb2ZmID0gMDsKKwkJfQorCQlidWYgPSBxLT5yZWFkX2J1ZjsKKwl9CisJaWYgKCFidWYpCisJCXJjID0gUE9MTEVSUjsKKworCWlmICgwID09IHJjKSB7CisJCXBvbGxfd2FpdChmaWxlLCAmYnVmLT5kb25lLCB3YWl0KTsKKwkJaWYgKGJ1Zi0+c3RhdGUgPT0gU1RBVEVfRE9ORSB8fAorCQkgICAgYnVmLT5zdGF0ZSA9PSBTVEFURV9FUlJPUikKKwkJCXJjID0gUE9MTElOfFBPTExSRE5PUk07CisJfQorCXVwKCZxLT5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAordmlkZW9idWZfdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdmlkZW9idWZfbWFwcGluZyAqbWFwID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlkcHJpbnRrKDIsInZtX29wZW4gJXAgW2NvdW50PSVkLHZtYT0lMDhseC0lMDhseF1cbiIsbWFwLAorCQltYXAtPmNvdW50LHZtYS0+dm1fc3RhcnQsdm1hLT52bV9lbmQpOworCW1hcC0+Y291bnQrKzsKK30KKworc3RhdGljIHZvaWQKK3ZpZGVvYnVmX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2aWRlb2J1Zl9tYXBwaW5nICptYXAgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEgPSBtYXAtPnE7CisJaW50IGk7CisKKwlkcHJpbnRrKDIsInZtX2Nsb3NlICVwIFtjb3VudD0lZCx2bWE9JTA4bHgtJTA4bHhdXG4iLG1hcCwKKwkJbWFwLT5jb3VudCx2bWEtPnZtX3N0YXJ0LHZtYS0+dm1fZW5kKTsKKworCW1hcC0+Y291bnQtLTsKKwlpZiAoMCA9PSBtYXAtPmNvdW50KSB7CisJCWRwcmludGsoMSwibXVubWFwICVwIHE9JXBcbiIsbWFwLHEpOworCQlkb3duKCZxLT5sb2NrKTsKKwkJZm9yIChpID0gMDsgaSA8IFZJREVPX01BWF9GUkFNRTsgaSsrKSB7CisJCQlpZiAoTlVMTCA9PSBxLT5idWZzW2ldKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHEtPmJ1ZnNbaV0pCisJCQkJOworCQkJaWYgKHEtPmJ1ZnNbaV0tPm1hcCAhPSBtYXApCisJCQkJY29udGludWU7CisJCQlxLT5idWZzW2ldLT5tYXAgICA9IE5VTEw7CisJCQlxLT5idWZzW2ldLT5iYWRkciA9IDA7CisJCQlxLT5vcHMtPmJ1Zl9yZWxlYXNlKHEscS0+YnVmc1tpXSk7CisJCX0KKwkJdXAoJnEtPmxvY2spOworCQlrZnJlZShtYXApOworCX0KKwlyZXR1cm47Cit9CisKKy8qCisgKiBHZXQgYSBhbm9ueW1vdXMgcGFnZSBmb3IgdGhlIG1hcHBpbmcuICBNYWtlIHN1cmUgd2UgY2FuIERNQSB0byB0aGF0CisgKiBtZW1vcnkgbG9jYXRpb24gd2l0aCAzMmJpdCBQQ0kgZGV2aWNlcyAoaS5lLiBkb24ndCB1c2UgaGlnaG1lbSBmb3IKKyAqIG5vdyAuLi4pLiAgQm91bmNlIGJ1ZmZlcnMgZG9uJ3Qgd29yayB2ZXJ5IHdlbGwgZm9yIHRoZSBkYXRhIHJhdGVzCisgKiB2aWRlbyBjYXB0dXJlIGhhcy4KKyAqLworc3RhdGljIHN0cnVjdCBwYWdlKgordmlkZW9idWZfdm1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHZhZGRyLAorCQkgICBpbnQgKnR5cGUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlkcHJpbnRrKDMsIm5vcGFnZTogZmF1bHQgQCAlMDhseCBbdm1hICUwOGx4LSUwOGx4XVxuIiwKKwkJdmFkZHIsdm1hLT52bV9zdGFydCx2bWEtPnZtX2VuZCk7CisgICAgICAgIGlmICh2YWRkciA+IHZtYS0+dm1fZW5kKQorCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfVVNFUik7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTk9QQUdFX09PTTsKKwljbGVhcl91c2VyX3BhZ2UocGFnZV9hZGRyZXNzKHBhZ2UpLCB2YWRkciwgcGFnZSk7CisJaWYgKHR5cGUpCisJCSp0eXBlID0gVk1fRkFVTFRfTUlOT1I7CisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgdmlkZW9idWZfdm1fb3BzID0KK3sKKwkub3BlbiAgICAgPSB2aWRlb2J1Zl92bV9vcGVuLAorCS5jbG9zZSAgICA9IHZpZGVvYnVmX3ZtX2Nsb3NlLAorCS5ub3BhZ2UgICA9IHZpZGVvYnVmX3ZtX25vcGFnZSwKK307CisKK2ludCB2aWRlb2J1Zl9tbWFwX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKKwkJCXVuc2lnbmVkIGludCBiY291bnQsIHVuc2lnbmVkIGludCBic2l6ZSwKKwkJCWVudW0gdjRsMl9tZW1vcnkgbWVtb3J5KQoreworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwllcnIgPSB2aWRlb2J1Zl9tbWFwX2ZyZWUocSk7CisJaWYgKDAgIT0gZXJyKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IGJjb3VudDsgaSsrKSB7CisJCXEtPmJ1ZnNbaV0gPSB2aWRlb2J1Zl9hbGxvYyhxLT5tc2l6ZSk7CisJCXEtPmJ1ZnNbaV0tPmkgICAgICA9IGk7CisJCXEtPmJ1ZnNbaV0tPmlucHV0ICA9IFVOU0VUOworCQlxLT5idWZzW2ldLT5tZW1vcnkgPSBtZW1vcnk7CisJCXEtPmJ1ZnNbaV0tPmJzaXplICA9IGJzaXplOworCQlzd2l0Y2ggKG1lbW9yeSkgeworCQljYXNlIFY0TDJfTUVNT1JZX01NQVA6CisJCQlxLT5idWZzW2ldLT5ib2ZmICA9IGJzaXplICogaTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6CisJCWNhc2UgVjRMMl9NRU1PUllfT1ZFUkxBWToKKwkJCS8qIG5vdGhpbmcgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCWRwcmludGsoMSwibW1hcCBzZXR1cDogJWQgYnVmZmVycywgJWQgYnl0ZXMgZWFjaFxuIiwKKwkJYmNvdW50LGJzaXplKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHZpZGVvYnVmX21tYXBfZnJlZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVklERU9fTUFYX0ZSQU1FOyBpKyspCisJCWlmIChxLT5idWZzW2ldICYmIHEtPmJ1ZnNbaV0tPm1hcCkKKwkJCXJldHVybiAtRUJVU1k7CisJZm9yIChpID0gMDsgaSA8IFZJREVPX01BWF9GUkFNRTsgaSsrKSB7CisJCWlmIChOVUxMID09IHEtPmJ1ZnNbaV0pCisJCQljb250aW51ZTsKKwkJcS0+b3BzLT5idWZfcmVsZWFzZShxLHEtPmJ1ZnNbaV0pOworCQlrZnJlZShxLT5idWZzW2ldKTsKKwkJcS0+YnVmc1tpXSA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCitpbnQgdmlkZW9idWZfbW1hcF9tYXBwZXIoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAorCQkJIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2aWRlb2J1Zl9tYXBwaW5nICptYXA7CisJdW5zaWduZWQgaW50IGZpcnN0LGxhc3Qsc2l6ZSxpOworCWludCByZXR2YWw7CisKKwlkb3duKCZxLT5sb2NrKTsKKwlyZXR2YWwgPSAtRUlOVkFMOworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpIHsKKwkJZHByaW50aygxLCJtbWFwIGFwcCBidWc6IFBST1RfV1JJVEUgcGxlYXNlXG4iKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkgeworCQlkcHJpbnRrKDEsIm1tYXAgYXBwIGJ1ZzogTUFQX1NIQVJFRCBwbGVhc2VcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogbG9vayBmb3IgZmlyc3QgYnVmZmVyIHRvIG1hcCAqLworCWZvciAoZmlyc3QgPSAwOyBmaXJzdCA8IFZJREVPX01BWF9GUkFNRTsgZmlyc3QrKykgeworCQlpZiAoTlVMTCA9PSBxLT5idWZzW2ZpcnN0XSkKKwkJCWNvbnRpbnVlOworCQlpZiAoVjRMMl9NRU1PUllfTU1BUCAhPSBxLT5idWZzW2ZpcnN0XS0+bWVtb3J5KQorCQkJY29udGludWU7CisJCWlmIChxLT5idWZzW2ZpcnN0XS0+Ym9mZiA9PSAodm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoVklERU9fTUFYX0ZSQU1FID09IGZpcnN0KSB7CisJCWRwcmludGsoMSwibW1hcCBhcHAgYnVnOiBvZmZzZXQgaW52YWxpZCBbb2Zmc2V0PTB4JWx4XVxuIiwKKwkJCSh2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIGxvb2sgZm9yIGxhc3QgYnVmZmVyIHRvIG1hcCAqLworCWZvciAoc2l6ZSA9IDAsIGxhc3QgPSBmaXJzdDsgbGFzdCA8IFZJREVPX01BWF9GUkFNRTsgbGFzdCsrKSB7CisJCWlmIChOVUxMID09IHEtPmJ1ZnNbbGFzdF0pCisJCQljb250aW51ZTsKKwkJaWYgKFY0TDJfTUVNT1JZX01NQVAgIT0gcS0+YnVmc1tsYXN0XS0+bWVtb3J5KQorCQkJY29udGludWU7CisJCWlmIChxLT5idWZzW2xhc3RdLT5tYXApIHsKKwkJCXJldHZhbCA9IC1FQlVTWTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlzaXplICs9IHEtPmJ1ZnNbbGFzdF0tPmJzaXplOworCQlpZiAoc2l6ZSA9PSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSkKKwkJCWJyZWFrOworCX0KKwlpZiAoVklERU9fTUFYX0ZSQU1FID09IGxhc3QpIHsKKwkJZHByaW50aygxLCJtbWFwIGFwcCBidWc6IHNpemUgaW52YWxpZCBbc2l6ZT0weCVseF1cbiIsCisJCQkodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBjcmVhdGUgbWFwcGluZyArIHVwZGF0ZSBidWZmZXIgbGlzdCAqLworCXJldHZhbCA9IC1FTk9NRU07CisJbWFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvYnVmX21hcHBpbmcpLEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IG1hcCkKKwkJZ290byBkb25lOworCWZvciAoc2l6ZSA9IDAsIGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBzaXplICs9IHEtPmJ1ZnNbaSsrXS0+YnNpemUpIHsKKwkJcS0+YnVmc1tpXS0+bWFwICAgPSBtYXA7CisJCXEtPmJ1ZnNbaV0tPmJhZGRyID0gdm1hLT52bV9zdGFydCArIHNpemU7CisJfQorCW1hcC0+Y291bnQgICAgPSAxOworCW1hcC0+c3RhcnQgICAgPSB2bWEtPnZtX3N0YXJ0OworCW1hcC0+ZW5kICAgICAgPSB2bWEtPnZtX2VuZDsKKwltYXAtPnEgICAgICAgID0gcTsKKwl2bWEtPnZtX29wcyAgID0gJnZpZGVvYnVmX3ZtX29wczsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0RPTlRFWFBBTkQgfCBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX2ZsYWdzICY9IH5WTV9JTzsgLyogdXNpbmcgc2hhcmVkIGFub255bW91cyBwYWdlcyAqLworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gbWFwOworCWRwcmludGsoMSwibW1hcCAlcDogcT0lcCAlMDhseC0lMDhseCBwZ29mZiAlMDhseCBidWZzICVkLSVkXG4iLAorCQltYXAscSx2bWEtPnZtX3N0YXJ0LHZtYS0+dm1fZW5kLHZtYS0+dm1fcGdvZmYsZmlyc3QsbGFzdCk7CisJcmV0dmFsID0gMDsKKworIGRvbmU6CisJdXAoJnEtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl92bWFsbG9jX3RvX3NnKTsKKworRVhQT1JUX1NZTUJPTF9HUEwodmlkZW9idWZfZG1hX2luaXQpOworRVhQT1JUX1NZTUJPTF9HUEwodmlkZW9idWZfZG1hX2luaXRfdXNlcik7CitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9kbWFfaW5pdF9rZXJuZWwpOworRVhQT1JUX1NZTUJPTF9HUEwodmlkZW9idWZfZG1hX2luaXRfb3ZlcmxheSk7CitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9kbWFfcGNpX21hcCk7CitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9kbWFfcGNpX3N5bmMpOworRVhQT1JUX1NZTUJPTF9HUEwodmlkZW9idWZfZG1hX3BjaV91bm1hcCk7CitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9kbWFfZnJlZSk7CisKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3dhaXRvbik7CitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9pb2xvY2spOworCitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9xdWV1ZV9pbml0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3F1ZXVlX2NhbmNlbCk7CitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9xdWV1ZV9pc19idXN5KTsKKworRVhQT1JUX1NZTUJPTF9HUEwodmlkZW9idWZfbmV4dF9maWVsZCk7CitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9zdGF0dXMpOworRVhQT1JUX1NZTUJPTF9HUEwodmlkZW9idWZfcmVxYnVmcyk7CitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9xdWVyeWJ1Zik7CitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9xYnVmKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX2RxYnVmKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3N0cmVhbW9uKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3N0cmVhbW9mZik7CisKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3JlYWRfc3RhcnQpOworRVhQT1JUX1NZTUJPTF9HUEwodmlkZW9idWZfcmVhZF9zdG9wKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3JlYWRfc3RyZWFtKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3JlYWRfb25lKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3BvbGxfc3RyZWFtKTsKKworRVhQT1JUX1NZTUJPTF9HUEwodmlkZW9idWZfbW1hcF9zZXR1cCk7CitFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9tbWFwX2ZyZWUpOworRVhQT1JUX1NZTUJPTF9HUEwodmlkZW9idWZfbW1hcF9tYXBwZXIpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2NvZGVjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvY29kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWQ1ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2NvZGVjLmMKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBWSURFTyBNT1RJT04gQ09ERUNzIGludGVybmFsIEFQSSBmb3IgdmlkZW8gZGV2aWNlcworICoKKyAqIEludGVyZmFjZSBmb3IgTUpQRUcgKGFuZCBtYXliZSBsYXRlciBNUEVHL1dBVkVMRVRTKSBjb2RlYydzCisgKiBib3VuZCB0byBhIG1hc3RlciBkZXZpY2UuCisgKgorICogKGMpIDIwMDIgV29sZmdhbmcgU2NoZXJyIDxzY2hlcnJAbmV0NHlvdS5hdD4KKyAqCisgKiAkSWQ6IHZpZGVvY29kZWMuYyx2IDEuMS4yLjggMjAwMy8wMy8yOSAwNzoxNjowNCByYnVsdGplIEV4cCAkCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBWSURFT0NPREVDX1ZFUlNJT04gInYwLjIiCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8vIGtlcm5lbCBjb25maWcgaXMgaGVyZSAocHJvY2ZzIGZsYWcpCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ2aWRlb2NvZGVjLmgiCisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTQpIik7CisKKyNkZWZpbmUgZHByaW50ayhudW0sIGZvcm1hdCwgYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoZGVidWcgPj0gbnVtKSBcCisJCQlwcmludGsoZm9ybWF0LCAjI2FyZ3MpOyBcCisJfSB3aGlsZSAoMCkKKworc3RydWN0IGF0dGFjaGVkX2xpc3QgeworCXN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgYXR0YWNoZWRfbGlzdCAqbmV4dDsKK307CisKK3N0cnVjdCBjb2RlY19saXN0IHsKKwljb25zdCBzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWM7CisJaW50IGF0dGFjaGVkOworCXN0cnVjdCBhdHRhY2hlZF9saXN0ICpsaXN0OworCXN0cnVjdCBjb2RlY19saXN0ICpuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCBjb2RlY19saXN0ICpjb2RlY2xpc3RfdG9wID0gTlVMTDsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogZnVuY3Rpb24gcHJvdG90eXBlcyBvZiB0aGUgbWFzdGVyL3NsYXZlIGludGVyZmFjZSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgdmlkZW9jb2RlYyAqCit2aWRlb2NvZGVjX2F0dGFjaCAoc3RydWN0IHZpZGVvY29kZWNfbWFzdGVyICptYXN0ZXIpCit7CisJc3RydWN0IGNvZGVjX2xpc3QgKmggPSBjb2RlY2xpc3RfdG9wOworCXN0cnVjdCBhdHRhY2hlZF9saXN0ICphLCAqcHRyOworCXN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYzsKKwlpbnQgcmVzOworCisJaWYgKCFtYXN0ZXIpIHsKKwkJZHByaW50aygxLCBLRVJOX0VSUiAidmlkZW9jb2RlY19hdHRhY2g6IG5vIGRhdGFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkcHJpbnRrKDIsCisJCSJ2aWRlb2NvZGVjX2F0dGFjaDogJyVzJywgdHlwZTogJXgsIGZsYWdzICVseCwgbWFnaWMgJWx4XG4iLAorCQltYXN0ZXItPm5hbWUsIG1hc3Rlci0+dHlwZSwgbWFzdGVyLT5mbGFncywgbWFzdGVyLT5tYWdpYyk7CisKKwlpZiAoIWgpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSJ2aWRlb2NvZGVjX2F0dGFjaDogbm8gZGV2aWNlIGF2YWlsYWJsZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXdoaWxlIChoKSB7CisJCS8vIGF0dGFjaCBvbmx5IGlmIHRoZSBzbGF2ZSBoYXMgYXQgbGVhc3QgdGhlIGZsYWdzCisJCS8vIGV4cGVjdGVkIGJ5IHRoZSBtYXN0ZXIKKwkJaWYgKChtYXN0ZXItPmZsYWdzICYgaC0+Y29kZWMtPmZsYWdzKSA9PSBtYXN0ZXItPmZsYWdzKSB7CisJCQlkcHJpbnRrKDQsICJ2aWRlb2NvZGVjX2F0dGFjaDogdHJ5ICclcydcbiIsCisJCQkJaC0+Y29kZWMtPm5hbWUpOworCisJCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGgtPmNvZGVjLT5vd25lcikpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCWNvZGVjID0KKwkJCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9jb2RlYyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFjb2RlYykgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJInZpZGVvY29kZWNfYXR0YWNoOiBubyBtZW1cbiIpOworCQkJCWdvdG8gb3V0X21vZHVsZV9wdXQ7CisJCQl9CisJCQltZW1jcHkoY29kZWMsIGgtPmNvZGVjLCBzaXplb2Yoc3RydWN0IHZpZGVvY29kZWMpKTsKKworCQkJc25wcmludGYoY29kZWMtPm5hbWUsIHNpemVvZihjb2RlYy0+bmFtZSksCisJCQkJICIlc1slZF0iLCBjb2RlYy0+bmFtZSwgaC0+YXR0YWNoZWQpOworCQkJY29kZWMtPm1hc3Rlcl9kYXRhID0gbWFzdGVyOworCQkJcmVzID0gY29kZWMtPnNldHVwKGNvZGVjKTsKKwkJCWlmIChyZXMgPT0gMCkgeworCQkJCWRwcmludGsoMywgInZpZGVvY29kZWNfYXR0YWNoICclcydcbiIsCisJCQkJCWNvZGVjLT5uYW1lKTsKKwkJCQlwdHIgPSAoc3RydWN0IGF0dGFjaGVkX2xpc3QgKikKKwkJCQkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IGF0dGFjaGVkX2xpc3QpLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFwdHIpIHsKKwkJCQkJZHByaW50aygxLAorCQkJCQkJS0VSTl9FUlIKKwkJCQkJCSJ2aWRlb2NvZGVjX2F0dGFjaDogbm8gbWVtb3J5XG4iKTsKKwkJCQkJZ290byBvdXRfa2ZyZWU7CisJCQkJfQorCQkJCW1lbXNldChwdHIsIDAsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYXR0YWNoZWRfbGlzdCkpOworCQkJCXB0ci0+Y29kZWMgPSBjb2RlYzsKKworCQkJCWEgPSBoLT5saXN0OworCQkJCWlmICghYSkgeworCQkJCQloLT5saXN0ID0gcHRyOworCQkJCQlkcHJpbnRrKDQsCisJCQkJCQkidmlkZW9jb2RlYzogZmlyc3QgZWxlbWVudFxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJd2hpbGUgKGEtPm5leHQpCisJCQkJCQlhID0gYS0+bmV4dDsJLy8gZmluZCBlbmQKKwkJCQkJYS0+bmV4dCA9IHB0cjsKKwkJCQkJZHByaW50ayg0LAorCQkJCQkJInZpZGVvY29kZWM6IGluIGFmdGVyICclcydcbiIsCisJCQkJCQloLT5jb2RlYy0+bmFtZSk7CisJCQkJfQorCisJCQkJaC0+YXR0YWNoZWQgKz0gMTsKKwkJCQlyZXR1cm4gY29kZWM7CisJCQl9IGVsc2UgeworCQkJCWtmcmVlKGNvZGVjKTsKKwkJCX0KKwkJfQorCQloID0gaC0+bmV4dDsKKwl9CisKKwlkcHJpbnRrKDEsIEtFUk5fRVJSICJ2aWRlb2NvZGVjX2F0dGFjaDogbm8gY29kZWMgZm91bmQhXG4iKTsKKwlyZXR1cm4gTlVMTDsKKworIG91dF9tb2R1bGVfcHV0OgorCW1vZHVsZV9wdXQoaC0+Y29kZWMtPm93bmVyKTsKKyBvdXRfa2ZyZWU6CisJa2ZyZWUoY29kZWMpOworCXJldHVybiBOVUxMOworfQorCitpbnQKK3ZpZGVvY29kZWNfZGV0YWNoIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNvZGVjX2xpc3QgKmggPSBjb2RlY2xpc3RfdG9wOworCXN0cnVjdCBhdHRhY2hlZF9saXN0ICphLCAqcHJldjsKKwlpbnQgcmVzOworCisJaWYgKCFjb2RlYykgeworCQlkcHJpbnRrKDEsIEtFUk5fRVJSICJ2aWRlb2NvZGVjX2RldGFjaDogbm8gZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRwcmludGsoMiwKKwkJInZpZGVvY29kZWNfZGV0YWNoOiAnJXMnLCB0eXBlOiAleCwgZmxhZ3MgJWx4LCBtYWdpYyAlbHhcbiIsCisJCWNvZGVjLT5uYW1lLCBjb2RlYy0+dHlwZSwgY29kZWMtPmZsYWdzLCBjb2RlYy0+bWFnaWMpOworCisJaWYgKCFoKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSICJ2aWRlb2NvZGVjX2RldGFjaDogbm8gZGV2aWNlIGxlZnQuLi5cbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXdoaWxlIChoKSB7CisJCWEgPSBoLT5saXN0OworCQlwcmV2ID0gTlVMTDsKKwkJd2hpbGUgKGEpIHsKKwkJCWlmIChjb2RlYyA9PSBhLT5jb2RlYykgeworCQkJCXJlcyA9IGEtPmNvZGVjLT51bnNldChhLT5jb2RlYyk7CisJCQkJaWYgKHJlcyA+PSAwKSB7CisJCQkJCWRwcmludGsoMywKKwkJCQkJCSJ2aWRlb2NvZGVjX2RldGFjaDogJyVzJ1xuIiwKKwkJCQkJCWEtPmNvZGVjLT5uYW1lKTsKKwkJCQkJYS0+Y29kZWMtPm1hc3Rlcl9kYXRhID0gTlVMTDsKKwkJCQl9IGVsc2UgeworCQkJCQlkcHJpbnRrKDEsCisJCQkJCQlLRVJOX0VSUgorCQkJCQkJInZpZGVvY29kZWNfZGV0YWNoOiAnJXMnXG4iLAorCQkJCQkJYS0+Y29kZWMtPm5hbWUpOworCQkJCQlhLT5jb2RlYy0+bWFzdGVyX2RhdGEgPSBOVUxMOworCQkJCX0KKwkJCQlpZiAocHJldiA9PSBOVUxMKSB7CisJCQkJCWgtPmxpc3QgPSBhLT5uZXh0OworCQkJCQlkcHJpbnRrKDQsCisJCQkJCQkidmlkZW9jb2RlYzogZGVsZXRlIGZpcnN0XG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmV2LT5uZXh0ID0gYS0+bmV4dDsKKwkJCQkJZHByaW50ayg0LAorCQkJCQkJInZpZGVvY29kZWM6IGRlbGV0ZSBtaWRkbGVcbiIpOworCQkJCX0KKwkJCQltb2R1bGVfcHV0KGEtPmNvZGVjLT5vd25lcik7CisJCQkJa2ZyZWUoYS0+Y29kZWMpOworCQkJCWtmcmVlKGEpOworCQkJCWgtPmF0dGFjaGVkIC09IDE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlwcmV2ID0gYTsKKwkJCWEgPSBhLT5uZXh0OworCQl9CisJCWggPSBoLT5uZXh0OworCX0KKworCWRwcmludGsoMSwgS0VSTl9FUlIgInZpZGVvY29kZWNfZGV0YWNoOiBnaXZlbiBjb2RlYyBub3QgZm91bmQhXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50Cit2aWRlb2NvZGVjX3JlZ2lzdGVyIChjb25zdCBzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNvZGVjX2xpc3QgKnB0ciwgKmggPSBjb2RlY2xpc3RfdG9wOworCisJaWYgKCFjb2RlYykgeworCQlkcHJpbnRrKDEsIEtFUk5fRVJSICJ2aWRlb2NvZGVjX3JlZ2lzdGVyOiBubyBkYXRhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRwcmludGsoMiwKKwkJInZpZGVvY29kZWM6IHJlZ2lzdGVyICclcycsIHR5cGU6ICV4LCBmbGFncyAlbHgsIG1hZ2ljICVseFxuIiwKKwkJY29kZWMtPm5hbWUsIGNvZGVjLT50eXBlLCBjb2RlYy0+ZmxhZ3MsIGNvZGVjLT5tYWdpYyk7CisKKwlwdHIgPQorCSAgICAoc3RydWN0IGNvZGVjX2xpc3QgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGNvZGVjX2xpc3QpLAorCQkJCQkgIEdGUF9LRVJORUwpOworCWlmICghcHRyKSB7CisJCWRwcmludGsoMSwgS0VSTl9FUlIgInZpZGVvY29kZWNfcmVnaXN0ZXI6IG5vIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocHRyLCAwLCBzaXplb2Yoc3RydWN0IGNvZGVjX2xpc3QpKTsKKwlwdHItPmNvZGVjID0gY29kZWM7CisKKwlpZiAoIWgpIHsKKwkJY29kZWNsaXN0X3RvcCA9IHB0cjsKKwkJZHByaW50ayg0LCAidmlkZW9jb2RlYzogaG9va2VkIGluIGFzIGZpcnN0IGVsZW1lbnRcbiIpOworCX0gZWxzZSB7CisJCXdoaWxlIChoLT5uZXh0KQorCQkJaCA9IGgtPm5leHQ7CS8vIGZpbmQgdGhlIGVuZAorCQloLT5uZXh0ID0gcHRyOworCQlkcHJpbnRrKDQsICJ2aWRlb2NvZGVjOiBob29rZWQgaW4gYWZ0ZXIgJyVzJ1xuIiwKKwkJCWgtPmNvZGVjLT5uYW1lKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Cit2aWRlb2NvZGVjX3VucmVnaXN0ZXIgKGNvbnN0IHN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgY29kZWNfbGlzdCAqcHJldiA9IE5VTEwsICpoID0gY29kZWNsaXN0X3RvcDsKKworCWlmICghY29kZWMpIHsKKwkJZHByaW50aygxLCBLRVJOX0VSUiAidmlkZW9jb2RlY191bnJlZ2lzdGVyOiBubyBkYXRhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRwcmludGsoMiwKKwkJInZpZGVvY29kZWM6IHVucmVnaXN0ZXIgJyVzJywgdHlwZTogJXgsIGZsYWdzICVseCwgbWFnaWMgJWx4XG4iLAorCQljb2RlYy0+bmFtZSwgY29kZWMtPnR5cGUsIGNvZGVjLT5mbGFncywgY29kZWMtPm1hZ2ljKTsKKworCWlmICghaCkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJInZpZGVvY29kZWNfdW5yZWdpc3Rlcjogbm8gZGV2aWNlIGxlZnQuLi5cbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXdoaWxlIChoKSB7CisJCWlmIChjb2RlYyA9PSBoLT5jb2RlYykgeworCQkJaWYgKGgtPmF0dGFjaGVkKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkidmlkZW9jb2RlYzogJyVzJyBpcyB1c2VkXG4iLAorCQkJCQloLT5jb2RlYy0+bmFtZSk7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCWRwcmludGsoMywgInZpZGVvY29kZWM6IHVucmVnaXN0ZXIgJyVzJyBpcyBvay5cbiIsCisJCQkJaC0+Y29kZWMtPm5hbWUpOworCQkJaWYgKHByZXYgPT0gTlVMTCkgeworCQkJCWNvZGVjbGlzdF90b3AgPSBoLT5uZXh0OworCQkJCWRwcmludGsoNCwKKwkJCQkJInZpZGVvY29kZWM6IGRlbGV0ZSBmaXJzdCBlbGVtZW50XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJldi0+bmV4dCA9IGgtPm5leHQ7CisJCQkJZHByaW50ayg0LAorCQkJCQkidmlkZW9jb2RlYzogZGVsZXRlIG1pZGRsZSBlbGVtZW50XG4iKTsKKwkJCX0KKwkJCWtmcmVlKGgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJldiA9IGg7CisJCWggPSBoLT5uZXh0OworCX0KKworCWRwcmludGsoMSwKKwkJS0VSTl9FUlIKKwkJInZpZGVvY29kZWNfdW5yZWdpc3RlcjogZ2l2ZW4gY29kZWMgbm90IGZvdW5kIVxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyogPT09PT09PT09PT09ICovCisvKiBwcm9jZnMgc3R1ZmYgKi8KKy8qID09PT09PT09PT09PSAqLworCitzdGF0aWMgY2hhciAqdmlkZW9jb2RlY19idWYgPSBOVUxMOworc3RhdGljIGludCB2aWRlb2NvZGVjX2J1ZnNpemUgPSAwOworCitzdGF0aWMgaW50Cit2aWRlb2NvZGVjX2J1aWxkX3RhYmxlICh2b2lkKQoreworCXN0cnVjdCBjb2RlY19saXN0ICpoID0gY29kZWNsaXN0X3RvcDsKKwlzdHJ1Y3QgYXR0YWNoZWRfbGlzdCAqYTsKKwlpbnQgaSA9IDAsIHNpemU7CisKKwkvLyBzdW0gdXAgYW1vdW50IG9mIHNsYXZlcyBwbHVzIHRoZWlyIGF0dGFjaGVkIG1hc3RlcnMKKwl3aGlsZSAoaCkgeworCQlpICs9IGgtPmF0dGFjaGVkICsgMTsKKwkJaCA9IGgtPm5leHQ7CisJfQorI2RlZmluZSBMSU5FU0laRSAxMDAKKwlzaXplID0gTElORVNJWkUgKiAoaSArIDEpOworCisJZHByaW50aygzLCAidmlkZW9jb2RlY19idWlsZCB0YWJsZTogJWQgZW50cmllcywgJWQgYnl0ZXNcbiIsIGksCisJCXNpemUpOworCisJaWYgKHZpZGVvY29kZWNfYnVmKQorCQlrZnJlZSh2aWRlb2NvZGVjX2J1Zik7CisJdmlkZW9jb2RlY19idWYgPSAoY2hhciAqKSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCisJaSA9IDA7CisJaSArPSBzY25wcmludGYodmlkZW9jb2RlY19idWYgKyBpLCBzaXplIC0gMSwKKwkJICAgICAgIjxTPmxhdmUgb3IgYXR0YWNoZWQgPE0+YXN0ZXIgbmFtZSAgdHlwZSBmbGFncyAgICBtYWdpYyAgICAiKTsKKwlpICs9IHNjbnByaW50Zih2aWRlb2NvZGVjX2J1ZiArIGksIHNpemUgLWkgLSAxLCAiKGNvbm5lY3RlZCBhcylcbiIpOworCisJaCA9IGNvZGVjbGlzdF90b3A7CisJd2hpbGUgKGgpIHsKKwkJaWYgKGkgPiAoc2l6ZSAtIExJTkVTSVpFKSkKKwkJCWJyZWFrOwkvLyBzZWN1cml0eSBjaGVjaworCQlpICs9IHNjbnByaW50Zih2aWRlb2NvZGVjX2J1ZiArIGksIHNpemUgLWkgLTEsCisJCQkgICAgICAiUyAlMzJzICUwNHggJTA4bHggJTA4bHggKFRFTVBMQVRFKVxuIiwKKwkJCSAgICAgIGgtPmNvZGVjLT5uYW1lLCBoLT5jb2RlYy0+dHlwZSwKKwkJCSAgICAgIGgtPmNvZGVjLT5mbGFncywgaC0+Y29kZWMtPm1hZ2ljKTsKKwkJYSA9IGgtPmxpc3Q7CisJCXdoaWxlIChhKSB7CisJCQlpZiAoaSA+IChzaXplIC0gTElORVNJWkUpKQorCQkJCWJyZWFrOwkvLyBzZWN1cml0eSBjaGVjaworCQkJaSArPSBzY25wcmludGYodmlkZW9jb2RlY19idWYgKyBpLCBzaXplIC1pIC0xLAorCQkJCSAgICAgICJNICUzMnMgJTA0eCAlMDhseCAlMDhseCAoJXMpXG4iLAorCQkJCSAgICAgIGEtPmNvZGVjLT5tYXN0ZXJfZGF0YS0+bmFtZSwKKwkJCQkgICAgICBhLT5jb2RlYy0+bWFzdGVyX2RhdGEtPnR5cGUsCisJCQkJICAgICAgYS0+Y29kZWMtPm1hc3Rlcl9kYXRhLT5mbGFncywKKwkJCQkgICAgICBhLT5jb2RlYy0+bWFzdGVyX2RhdGEtPm1hZ2ljLAorCQkJCSAgICAgIGEtPmNvZGVjLT5uYW1lKTsKKwkJCWEgPSBhLT5uZXh0OworCQl9CisJCWggPSBoLT5uZXh0OworCX0KKworCXJldHVybiBpOworfQorCisvL1RoZSBkZWZpbml0aW9uOgorLy90eXBlZGVmIGludCAocmVhZF9wcm9jX3QpKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCitzdGF0aWMgaW50Cit2aWRlb2NvZGVjX2luZm8gKGNoYXIgICpidWZmZXIsCisJCSBjaGFyICoqYnVmZmVyX2xvY2F0aW9uLAorCQkgb2ZmX3QgIG9mZnNldCwKKwkJIGludCAgICBidWZmZXJfbGVuZ3RoLAorCQkgaW50ICAgKmVvZiwKKwkJIHZvaWQgICpkYXRhKQoreworCWludCBzaXplOworCisJZHByaW50aygzLCAidmlkZW9jb2RlY19pbmZvOiBvZmZzZXQ6ICVsZCwgbGVuICVkIC8gc2l6ZSAlZFxuIiwKKwkJb2Zmc2V0LCBidWZmZXJfbGVuZ3RoLCB2aWRlb2NvZGVjX2J1ZnNpemUpOworCisJaWYgKG9mZnNldCA9PSAwKSB7CisJCXZpZGVvY29kZWNfYnVmc2l6ZSA9IHZpZGVvY29kZWNfYnVpbGRfdGFibGUoKTsKKwl9CisJaWYgKChvZmZzZXQgPCAwKSB8fCAob2Zmc2V0ID49IHZpZGVvY29kZWNfYnVmc2l6ZSkpIHsKKwkJZHByaW50ayg0LAorCQkJInZpZGVvY29kZWNfaW5mbzogY2FsbCBkZWxpdmVycyBubyByZXN1bHQsIHJldHVybiAwXG4iKTsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCWlmIChidWZmZXJfbGVuZ3RoIDwgKHZpZGVvY29kZWNfYnVmc2l6ZSAtIG9mZnNldCkpIHsKKwkJZHByaW50ayg0LCAidmlkZW9jb2RlY19pbmZvOiAlbGQgbmVlZGVkLCAlZCBnb3RcbiIsCisJCQl2aWRlb2NvZGVjX2J1ZnNpemUgLSBvZmZzZXQsIGJ1ZmZlcl9sZW5ndGgpOworCQlzaXplID0gYnVmZmVyX2xlbmd0aDsKKwl9IGVsc2UgeworCQlkcHJpbnRrKDQsICJ2aWRlb2NvZGVjX2luZm86IGxhc3QgcmVhZGluZyBvZiAlbGQgYnl0ZXNcbiIsCisJCQl2aWRlb2NvZGVjX2J1ZnNpemUgLSBvZmZzZXQpOworCQlzaXplID0gdmlkZW9jb2RlY19idWZzaXplIC0gb2Zmc2V0OworCQkqZW9mID0gMTsKKwl9CisKKwltZW1jcHkoYnVmZmVyLCB2aWRlb2NvZGVjX2J1ZiArIG9mZnNldCwgc2l6ZSk7CisJLyogZG9lc24ndCB3b3JrLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBjb3B5X3RvX3VzZXIoYnVmZmVyLCB2aWRlb2NvZGVjX2J1ZitvZmZzZXQsIHNpemUpOyAqLworCS8qICpidWZmZXJfbG9jYXRpb24gPSB2aWRlb2NvZGVjX2J1ZitvZmZzZXQ7ICovCisKKwlyZXR1cm4gc2l6ZTsKK30KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIGhvb2sgaW4gZHJpdmVyIG1vZHVsZSAqLworLyogPT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgaW50IF9faW5pdAordmlkZW9jb2RlY19pbml0ICh2b2lkKQoreworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdmlkZW9jb2RlY19wcm9jX2VudHJ5OworI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICJMaW51eCB2aWRlbyBjb2RlYyBpbnRlcm1lZGlhdGUgbGF5ZXI6ICVzXG4iLAorCSAgICAgICBWSURFT0NPREVDX1ZFUlNJT04pOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwl2aWRlb2NvZGVjX2J1ZiA9IE5VTEw7CisJdmlkZW9jb2RlY19idWZzaXplID0gMDsKKworCXZpZGVvY29kZWNfcHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJ2aWRlb2NvZGVjcyIsIDAsIE5VTEwpOworCWlmICh2aWRlb2NvZGVjX3Byb2NfZW50cnkpIHsKKwkJdmlkZW9jb2RlY19wcm9jX2VudHJ5LT5yZWFkX3Byb2MgPSB2aWRlb2NvZGVjX2luZm87CisJCXZpZGVvY29kZWNfcHJvY19lbnRyeS0+d3JpdGVfcHJvYyA9IE5VTEw7CisJCXZpZGVvY29kZWNfcHJvY19lbnRyeS0+ZGF0YSA9IE5VTEw7CisJCXZpZGVvY29kZWNfcHJvY19lbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKDEsIEtFUk5fRVJSICJ2aWRlb2NvZGVjOiBjYW4ndCBpbml0IHByb2Nmcy5cbiIpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3ZpZGVvY29kZWNfZXhpdCAodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJlbW92ZV9wcm9jX2VudHJ5KCJ2aWRlb2NvZGVjcyIsIE5VTEwpOworCWlmICh2aWRlb2NvZGVjX2J1ZikKKwkJa2ZyZWUodmlkZW9jb2RlY19idWYpOworI2VuZGlmCit9CisKK0VYUE9SVF9TWU1CT0wodmlkZW9jb2RlY19hdHRhY2gpOworRVhQT1JUX1NZTUJPTCh2aWRlb2NvZGVjX2RldGFjaCk7CitFWFBPUlRfU1lNQk9MKHZpZGVvY29kZWNfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTCh2aWRlb2NvZGVjX3VucmVnaXN0ZXIpOworCittb2R1bGVfaW5pdCh2aWRlb2NvZGVjX2luaXQpOworbW9kdWxlX2V4aXQodmlkZW9jb2RlY19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiV29sZmdhbmcgU2NoZXJyIDxzY2hlcnJAbmV0NHlvdS5hdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZXJtZWRpYXRlIEFQSSBtb2R1bGUgZm9yIHZpZGVvIGNvZGVjcyAiCisJCSAgIFZJREVPQ09ERUNfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvY29kZWMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9jb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NmFlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvY29kZWMuaApAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIFZJREVPIE1PVElPTiBDT0RFQ3MgaW50ZXJuYWwgQVBJIGZvciB2aWRlbyBkZXZpY2VzCisgKgorICogSW50ZXJmYWNlIGZvciBNSlBFRyAoYW5kIG1heWJlIGxhdGVyIE1QRUcvV0FWRUxFVFMpIGNvZGVjJ3MKKyAqIGJvdW5kIHRvIGEgbWFzdGVyIGRldmljZS4KKyAqCisgKiAoYykgMjAwMiBXb2xmZ2FuZyBTY2hlcnIgPHNjaGVyckBuZXQ0eW91LmF0PgorICoKKyAqICRJZDogdmlkZW9jb2RlYy5oLHYgMS4xLjIuNCAyMDAzLzAxLzE0IDIxOjE1OjAzIHJidWx0amUgRXhwICQKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09ICovCisvKiBnZW5lcmFsIGRlc2NyaXB0aW9uICovCisvKiA9PT09PT09PT09PT09PT09PT09ICovCisKKy8qIFNob3VsZCBlYXNlIHRoZSAocmUtKXVzYWdlIG9mIGRyaXZlcnMgc3VwcG9ydGluZyBjYXJkcyB3aXRoIChkaWZmZXJlbnQpCisgICB2aWRlbyBjb2RlY3MuIFRoZSBjb2RlY3MgcmVnaXN0ZXIgdG8gdGhpcyBtb2R1bGUgdGhlaXIgZnVuY3Rpb25hbGl0eSwKKyAgIGFuZCB0aGUgcHJvY2Vzc29ycyAobWFzdGVycykgY2FuIGF0dGFjaCB0byB0aGVtIGlmIHRoZXkgZml0LgorCisgICBUaGUgY29kZWNzIGFyZSB0eXBpY2FsbHkgaGF2ZSBhICJzdHJvbmciIGJpbmRpbmcgdG8gdGhlaXIgbWFzdGVyIC0gc28gSQorICAgZG9uJ3QgdGhpbmsgaXQgbWFrZXMgc2Vuc2UgdG8gaGF2ZSBhIGZ1bGwgYmxvd24gaW50ZXJmYWNpbmcgYXMgd2l0aCBlLmcuCisgICBpMmMuIElmIHlvdSBoYXZlIGFuIG90aGVyIG9waW5pb24sIGxldCdzIGRpc2N1c3MgJiBpbXBsZW1lbnQgaXQgOi0pKSkKKworICAgVXNhZ2U6CisKKyAgIFRoZSBzbGF2ZSBoYXMganVzdCB0byBzZXR1cCB0aGUgdmlkZW9jb2RlYyBzdHJ1Y3R1cmUgYW5kIHVzZSB0d28gZnVuY3Rpb25zOgorICAgdmlkZW9jb2RlY19yZWdpc3Rlcihjb2RlY2RhdGEpOworICAgdmlkZW9jb2RlY191bnJlZ2lzdGVyKGNvZGVjZGF0YSk7CisgICBUaGUgYmVzdCBpcyBqdXN0IGNhbGxpbmcgdGhlbSBhdCBtb2R1bGUgKGRlLSlpbml0aWFsaXNhdGlvbi4KKworICAgVGhlIG1hc3RlciBzZXRzIHVwIHRoZSBzdHJ1Y3R1cmUgdmlkZW9jb2RlY19tYXN0ZXIgYW5kIGNhbGxzOgorICAgY29kZWNkYXRhPXZpZGVvY29kZWNfYXR0YWNoKG1hc3Rlcl9jb2RlY2RhdGEpOworICAgdmlkZW9jb2RlY19kZXRhY2goY29kZWNkYXRhKTsKKworICAgVGhlIHNsYXZlIGlzIGNhbGxlZCBkdXJpbmcgYXR0YWNoL2RldGFjaCB2aWEgZnVuY3Rpb25zIHNldHVwIHByZXZpb3VzbHkKKyAgIGR1cmluZyByZWdpc3Rlci4gQXQgdGhhdCB0aW1lLCB0aGUgbWFzdGVyX2RhdGEgcG9pbnRlciBpcyBzZXQgdXAKKyAgIGFuZCB0aGUgc2xhdmUgY2FuIGFjY2VzcyBhbnkgaW8gcmVnaXN0ZXJzIG9mIHRoZSBtYXN0ZXIgZGV2aWNlIChpbiB0aGUgY2FzZQorICAgdGhlIHNsYXZlIGlzIGJvdW5kIHRvIGl0KS4gT3RoZXJ3aXNlIGl0IGRvZXNuJ3QgbmVlZCB0aGlzIGZ1bmN0aW9ucyBhbmQKKyAgIHRoZXJmb3IgdGhleSBtYXkgbm90IGJlIGluaXRpYWxpemVkLgorCisgICBUaGUgb3RoZXIgZnVjdGlvbnMgYXJlIGp1c3QgZm9yIGNvbnZlbmllbmNlLCBhcyB0aGV5IGFyZSBmb3Igc2h1cmUgdXNlZCBieQorICAgbW9zdC9hbGwgb2YgdGhlIGNvZGVjcy4gVGhlIGxhc3Qgb25lcyBtYXkgYmUgb21taXRlZCwgdG9vLiAKKworICAgU2VlIHRoZSBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIHdoaWNoIGRhdGEgaGFzCisgICB0byBiZSBzZXQgdXAgZm9yIHRoZSBtYXN0ZXIgYW5kIHRoZSBzbGF2ZS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhlIG1hc3RlciBzaG91bGQgaGF2ZSAia25vd2xlZGdlIiBvZiB0aGUgc2xhdmUgYW5kIHZpY2UgdmVyc2EuICBTbyB0aGUgZGF0YQorICAgc3RydWN0dXJlcyBzZW50IHRvL2Zyb20gc2xhdmUgdmlhIHNldF9kYXRhL2dldF9kYXRhIHNldF9pbWFnZS9nZXRfaW1hZ2UgYXJlCisgICBkZXZpY2UgZGVwZW5kZW50IGFuZCB2YXJ5IGJldHdlZW4gTUpQRUcvTVBFRy9XQVZFTEVULy4uLiBkZXZpY2VzLiAoISEhISkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisMCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogZGVzY3JpcHRpb24gb2YgdGhlIHZpZGVvY29kZWNfaW8gc3RydWN0dXJlICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyAgID09PT0gbWFzdGVyIHNldHVwID09PT0gCisgICBuYW1lIC0+IG5hbWUgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHJlZmVyZW5jZSBhbmQgZGVidWdnaW5nCisgICBtYXN0ZXJfZGF0YSAtPiAgZGF0YSByZWYuIGZvciB0aGUgbWFzdGVyIChlLmcuIHRoZSB6cjM2MDU1LDU3LDY3KQorICAgcmVhZHJlZyAtPiByZWYuIHRvIHJlYWQtZm4gZnJvbSByZWdpc3RlciAoc2V0dXAgYnkgbWFzdGVyLCB1c2VkIGJ5IHNsYXZlKQorICAgd3JpdGVyZWcgLT4gcmVmLiB0byB3cml0ZS1mbiB0byByZWdpc3RlciAoc2V0dXAgYnkgbWFzdGVyLCB1c2VkIGJ5IHNsYXZlKQorICAgICAgICAgICAgICAgdGhpcyB0d28gZnVuY3Rpb25zIGRvIHRoZSBsb3dsZXZlbCBJL08gam9iCisKKyAgID09PT0gc2xhdmUgZnVuY3Rpb25hbGl0eSBzZXR1cCA9PT09IAorICAgc2xhdmVfZGF0YSAtPiBkYXRhIHJlZi4gZm9yIHRoZSBzbGF2ZSAoZS5nLiB0aGUgenIzNjA1MCw2MCkgCisgICBjaGVjayAtPiBmbi1yZWYuIGNoZWNrcyBhdmFpbGFiaWxpdHkgb2YgYW4gZGV2aWNlLCByZXR1cm5zIC1FSU8gb24gZmFpbHVyZSBvcgorICAgICAgICAgICAgdGhlIHR5cGUgb24gc3VjY2VzcworICAgICAgICAgICAgdGhpcyBtYWtlcyBlc3BjZWNpYWxseSBzZW5zZSBpZiBhIGRyaXZlciBtb2R1bGUgc3VwcG9ydHMgbW9yZSB0aGFuCisgICAgICAgICAgICBvbmUgY29kZWMgd2hpY2ggbWF5IGJlIHF1aXRlIHNpbWlsYXIgdG8gYWNjZXNzLCBuZXZlcnRoZWxlc3MgaXQKKyAgICAgICAgICAgIGlzIGdvb2QgZm9yIGEgZmlyc3QgZnVuY3Rpb25hbGl0eSBjaGVjayAKKworICAgLS0gbWFpbiBmdW5jdGlvbnMgeW91IGFsd2F5cyBuZWVkIGZvciBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIC0tIAorCisgICBzZXRfbW9kZSAtPiB0aGlzIGZuLXJlZi4gcmVzZXRzIHRoZSBlbnRpcmUgY29kZWMsIGFuZCBzZXRzIHVwIHRoZSBtb2RlCisgICAgICAgICAgICAgICB3aXRoIHRoZSBsYXN0IGRlZmluZWQgbm9ybS9zaXplIChvciBkZXZpY2UgZGVmYXVsdCBpZiBub3QKKyAgICAgICAgICAgICAgIGF2YWlsYWJsZSkgLSBpdCByZXR1cm5zIDAgaWYgdGhlIG1vZGUgaXMgcG9zc2libGUgCisgICBzZXRfc2l6ZSAtPiB0aGlzIGZuLXJlZi4gc2V0cyB0aGUgbm9ybSBhbmQgaW1hZ2Ugc2l6ZSBmb3IKKyAgICAgICAgICAgICAgIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gKHJldHVybnMgMCBvbiBzdWNjZXNzKSAKKyAgICAgICAgICAgICAgIHRoZSBub3JtIHBhcmFtIGlzIGRlZmluZWQgaW4gdmlkZW9kZXYuaCAoVklERU9fTU9ERV8qKSAKKworICAgYWRkaXRpb25hbCBzZXR1cCBtYXkgYmUgYXZhaWxhYmxlLCB0b28gLSBidXQgdGhlIGNvZGVjIHNob3VsZCB3b3JrIHdpdGgKKyAgIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZXZlbiB3aXRob3V0IHRoaXMgCisKKyAgIHNldF9kYXRhIC0+IHNldHMgZGV2aWNlLXNwZWNpZmljIGRhdGEgKHRhYmxlcywgcXVhbGl0eSBldGMuKSAKKyAgIGdldF9kYXRhIC0+IHF1ZXJ5IGRldmljZS1zcGVjaWZpYyBkYXRhICh0YWJsZXMsIHF1YWxpdHkgZXRjLikgCisKKyAgIGlmIHRoZSBkZXZpY2UgZGVsaXZlcnMgaW50ZXJydXB0cywgdGhleSBtYXkgYmUgc2V0dXAvaGFuZGxlZCBoZXJlIAorICAgc2V0dXBfaW50ZXJydXB0IC0+IGNvZGVjIGlycSBzZXR1cCAobm90IG5lZWRlZCBmb3IgMzYwNTAvNjApIAorICAgaGFuZGxlX2ludGVycnVwdCAtPiBjb2RlYyBpcnEgaGFuZGxpbmcgKG5vdCBuZWVkZWQgZm9yIDM2MDUwLzYwKSAKKworICAgaWYgdGhlIGRldmljZSBkZWxpdmVycyBwaWN0dXJlcywgdGhleSBtYXkgYmUgaGFuZGxlZCBoZXJlIAorICAgcHV0X2ltYWdlIC0+IHB1dHMgaW1hZ2UgZGF0YSB0byB0aGUgY29kZWMgKG5vdCBuZWVkZWQgZm9yIDM2MDUwLzYwKSAKKyAgIGdldF9pbWFnZSAtPiBnZXRzIGltYWdlIGRhdGEgZnJvbSB0aGUgY29kZWMgKG5vdCBuZWVkZWQgZm9yIDM2MDUwLzYwKSAKKyAgICAgICAgICAgICAgICB0aGUgY2FsbHMgaW5jbHVkZSBmcmFtZSBudW1iZXJzIGFuZCBmbGFncyAoZXZlbi9vZGQvLi4uKSAKKyAgICAgICAgICAgICAgICBpZiBuZWVkZWQgYW5kIGEgZmxhZyB3aGljaCBhbGxvd3MgYmxvY2tpbmcgdW50aWwgaXRzIHJlYWR5IAorKi8KKwwKKy8qID09PT09PT09PT09PT09ICovCisvKiB1c2VyIGludGVyZmFjZSAqLworLyogPT09PT09PT09PT09PT0gKi8KKworLyogCisgICBDdXJyZW50bHkgdGhlcmUgaXMgb25seSBhIGluZm9ybWF0aW9uIGRpc3BsYXkgcGxhbm5lZCwgYXMgdGhlIGxheWVyCisgICBpcyBub3QgdmlzaWJsZSBmb3IgdGhlIHVzZXIgc3BhY2UgYXQgYWxsLgorCisgICBJbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdmlhIHByb2Nmcy4gVGhlIGN1cnJlbnQgZW50cnkgaXMgIi9wcm9jL3ZpZGVvY29kZWNzIgorICAgYnV0IGl0IG1ha2VzIHNlbnNlIHRvICJoaWRlIiBpdCBpbiB0aGUgL3Byb2MvdmlkZW8gdHJlZSBvZiB2NGwoMikgLS1UT0RPLS0uCisKK0EgZXhhbXBsZSBmb3Igc3VjaCBhbiBvdXRwdXQgaXM6CisKKzxTPmxhdmUgb3IgYXR0YWNoZWQgPE0+YXN0ZXIgbmFtZSAgdHlwZSBmbGFncyAgICBtYWdpYyAgICAoY29ubmVjdGVkIGFzKQorUyAgICAgICAgICAgICAgICAgICAgICAgICAgenIzNjA1MCAwMDAyIDAwMDBkMDAxIDAwMDAwMDAwIChURU1QTEFURSkKK00gICAgICAgICAgICAgICAgICAgICAgIHpyMzYwNTVbMF0gMDAwMSAwMDAwYzAwMSAwMDAwMDAwMCAoenIzNjA1MFswXSkKK00gICAgICAgICAgICAgICAgICAgICAgIHpyMzYwNTVbMV0gMDAwMSAwMDAwYzAwMSAwMDAwMDAwMCAoenIzNjA1MFsxXSkKKworKi8KKwwKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIHNwZWNpYWwgZGVmaW5lcyBmb3IgdGhlIHZpZGVvY29kZWNfaW8gc3RydWN0dXJlICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZuZGVmIF9fTElOVVhfVklERU9DT0RFQ19ICisjZGVmaW5lIF9fTElOVVhfVklERU9DT0RFQ19ICisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorCisvL3Nob3VsZCBiZSBpbiB2aWRlb2Rldi5oID8/PyAoVklEX0RPXy4uLi4pCisjZGVmaW5lIENPREVDX0RPX0NPTVBSRVNTSU9OIDAKKyNkZWZpbmUgQ09ERUNfRE9fRVhQQU5TSU9OICAgMQorCisvKiB0aGlzIGFyZSB0aGUgY3VycmVudCBjb2RlYyBmbGFncyBJIHRoaW5rIHRoZXkgYXJlIG5lZWRlZCAqLworLyogIC0+IHR5cGUgdmFsdWUgaW4gc3RydWN0dXJlICovCisjZGVmaW5lIENPREVDX0ZMQUdfSlBFRyAgICAgIDB4MDAwMDAwMDFMCS8vIEpQRUcgY29kZWMKKyNkZWZpbmUgQ09ERUNfRkxBR19NUEVHICAgICAgMHgwMDAwMDAwMkwJLy8gTVBFRzEvMi80IGNvZGVjCisjZGVmaW5lIENPREVDX0ZMQUdfRElWWCAgICAgIDB4MDAwMDAwMDRMCS8vIERJVlggY29kZWMKKyNkZWZpbmUgQ09ERUNfRkxBR19XQVZFTEVUICAgMHgwMDAwMDAwOEwJLy8gV0FWRUxFVCBjb2RlYworCQkJCQkgIC8vIHJvb20gZm9yIG90aGVyIHR5cGVzCisKKyNkZWZpbmUgQ09ERUNfRkxBR19NQUdJQyAgICAgMHgwMDAwMDgwMEwJLy8gbWFnaWMga2V5IG11c3QgbWF0Y2gKKyNkZWZpbmUgQ09ERUNfRkxBR19IQVJEV0FSRSAgMHgwMDAwMTAwMEwJLy8gaXMgYSBoYXJkd2FyZSBjb2RlYworI2RlZmluZSBDT0RFQ19GTEFHX1ZGRSAgICAgICAweDAwMDAyMDAwTAkvLyBoYXMgZGlyZWN0IHZpZGVvIGZyb250ZW5kCisjZGVmaW5lIENPREVDX0ZMQUdfRU5DT0RFUiAgIDB4MDAwMDQwMDBMCS8vIGNvbXByZXNzaW9uIGNhcGFiaWxpdHkKKyNkZWZpbmUgQ09ERUNfRkxBR19ERUNPREVSICAgMHgwMDAwODAwMEwJLy8gZGVjb21wcmVzc2lvbiBjYXBhYmlsaXR5CisjZGVmaW5lIENPREVDX0ZMQUdfTkVFRElSUSAgIDB4MDAwMTAwMDBMCS8vIG5lZWRzIGlycSBoYW5kbGluZworI2RlZmluZSBDT0RFQ19GTEFHX1JEV1JQSUMgICAweDAwMDIwMDAwTAkvLyBoYW5kbGVzIHBpY3R1cmUgSS9PCisKKy8qIGEgbGlzdCBvZiBtb2Rlcywgc29tZSBhcmUganVzdCBleGFtcGxlcyAoaXMgdGhlcmUgYW55IEhXPykgKi8KKyNkZWZpbmUgQ09ERUNfTU9ERV9CSlBHICAgICAgMHgwMDAxCS8vIEJhc2VsaW5lIEpQRUcKKyNkZWZpbmUgQ09ERUNfTU9ERV9MSlBHICAgICAgMHgwMDAyCS8vIExvc3NsZXNzIEpQRUcKKyNkZWZpbmUgQ09ERUNfTU9ERV9NUEVHMSAgICAgMHgwMDAzCS8vIE1QRUcgMQorI2RlZmluZSBDT0RFQ19NT0RFX01QRUcyICAgICAweDAwMDQJLy8gTVBFRyAyCisjZGVmaW5lIENPREVDX01PREVfTVBFRzQgICAgIDB4MDAwNQkvLyBNUEVHIDQKKyNkZWZpbmUgQ09ERUNfTU9ERV9NU0RJVlggICAgMHgwMDA2CS8vIE1TIERpdlgKKyNkZWZpbmUgQ09ERUNfTU9ERV9PRElWWCAgICAgMHgwMDA3CS8vIE9wZW4gRGl2WAorI2RlZmluZSBDT0RFQ19NT0RFX1dBVkVMRVQgICAweDAwMDgJLy8gV2F2ZWxldAorCisvKiB0aGlzIGFyZSB0aGUgY3VycmVudCBjb2RlYyB0eXBlcyBJIHdhbnQgdG8gaW1wbGVtZW50ICovCisvKiAgLT4gdHlwZSB2YWx1ZSBpbiBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgQ09ERUNfVFlQRV9OT05FICAgIDAKKyNkZWZpbmUgQ09ERUNfVFlQRV9MNjQ3MDIgIDEKKyNkZWZpbmUgQ09ERUNfVFlQRV9aUjM2MDUwIDIKKyNkZWZpbmUgQ09ERUNfVFlQRV9aUjM2MDE2IDMKKyNkZWZpbmUgQ09ERUNfVFlQRV9aUjM2MDYwIDQKKworLyogdGhlIHR5cGUgb2YgZGF0YSBtYXkgYmUgZW5oYW5jZWQgYnkgZnV0dXJlIGltcGxlbWVudGF0aW9ucyAoZGF0YS1mbi4ncykgKi8KKy8qICAtPiB1c2VkIGluIGNvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPREVDX0dfU1RBVFVTICAgICAgICAgMHgwMDAwCS8qIGNvZGVjIHN0YXR1cyAocXVlcnkgb25seSkgKi8KKyNkZWZpbmUgQ09ERUNfU19DT0RFQ19NT0RFICAgICAweDAwMDEJLyogY29kZWMgbW9kZSAoYmFzZWxpbmUgSlBFRywgTVBFRzEsLi4uICovCisjZGVmaW5lIENPREVDX0dfQ09ERUNfTU9ERSAgICAgMHg4MDAxCisjZGVmaW5lIENPREVDX1NfVkZFICAgICAgICAgICAgMHgwMDAyCS8qIGFkZGl0aW9uYWwgdmlkZW8gZnJvbnRlbmQgc2V0dXAgKi8KKyNkZWZpbmUgQ09ERUNfR19WRkUgICAgICAgICAgICAweDgwMDIKKyNkZWZpbmUgQ09ERUNfU19NTUFQICAgICAgICAgICAweDAwMDMJLyogTU1BUCBzZXR1cCAoaWYgYXZhaWxhYmxlKSAqLworCisjZGVmaW5lIENPREVDX1NfSlBFR19URFNfQllURSAgMHgwMDEwCS8qIHRhcmdldCBkYXRhIHNpemUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgQ09ERUNfR19KUEVHX1REU19CWVRFICAweDgwMTAKKyNkZWZpbmUgQ09ERUNfU19KUEVHX1NDQUxFICAgICAweDAwMTEJLyogc2NhbGluZyBmYWN0b3IgZm9yIHF1YW50LiB0YWJsZXMgKi8KKyNkZWZpbmUgQ09ERUNfR19KUEVHX1NDQUxFICAgICAweDgwMTEKKyNkZWZpbmUgQ09ERUNfU19KUEVHX0hEVF9EQVRBICAweDAwMTgJLyogaHVmZm1hbi10YWJsZXMgKi8KKyNkZWZpbmUgQ09ERUNfR19KUEVHX0hEVF9EQVRBICAweDgwMTgKKyNkZWZpbmUgQ09ERUNfU19KUEVHX1FEVF9EQVRBICAweDAwMTkJLyogcXVhbnRpemluZy10YWJsZXMgKi8KKyNkZWZpbmUgQ09ERUNfR19KUEVHX1FEVF9EQVRBICAweDgwMTkKKyNkZWZpbmUgQ09ERUNfU19KUEVHX0FQUF9EQVRBICAweDAwMUEJLyogQVBQIG1hcmtlciAqLworI2RlZmluZSBDT0RFQ19HX0pQRUdfQVBQX0RBVEEgIDB4ODAxQQorI2RlZmluZSBDT0RFQ19TX0pQRUdfQ09NX0RBVEEgIDB4MDAxQgkvKiBDT00gbWFya2VyICovCisjZGVmaW5lIENPREVDX0dfSlBFR19DT01fREFUQSAgMHg4MDFCCisKKyNkZWZpbmUgQ09ERUNfU19QUklWQVRFICAgICAgICAweDEwMDAJLyogInByaXZhdGUiIGNvbW1hbmRzIHN0YXJ0IGhlcmUgKi8KKyNkZWZpbmUgQ09ERUNfR19QUklWQVRFICAgICAgICAweDkwMDAKKworI2RlZmluZSBDT0RFQ19HX0ZMQUcgICAgICAgICAgIDB4ODAwMAkvKiB0aGlzIGlzIGhvdyAnZ2V0JyBpcyBkZXRlY3RlZCAqLworCisvKiB0eXBlcyBvZiB0cmFuc2ZlciwgZGlyZWN0bHkgdXNlciBzcGFjZSBvciBhIGtlcm5lbCBidWZmZXIgKGltYWdlLWZuLidzKSAqLworLyogIC0+IHVzZWQgaW4gZ2V0X2ltYWdlLCBwdXRfaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09ERUNfVFJBTlNGRVJfS0VSTkVMIDAJLyogdXNlICJtZW1jb3B5IiAqLworI2RlZmluZSBDT0RFQ19UUkFOU0ZFUl9VU0VSICAgMQkvKiB1c2UgInRvL2Zyb21fdXNlciIgKi8KKwwKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogdGhlIHN0cnVjdHVyZXMgaXRzZWxmIC4uLiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgdmZlX3BvbGFyaXR5IHsKKwlpbnQgdnN5bmNfcG9sOjE7CisJaW50IGhzeW5jX3BvbDoxOworCWludCBmaWVsZF9wb2w6MTsKKwlpbnQgYmxhbmtfcG9sOjE7CisJaW50IHN1YmltZ19wb2w6MTsKKwlpbnQgcG9lX3BvbDoxOworCWludCBwdmFsaWRfcG9sOjE7CisJaW50IHZjbGtfcG9sOjE7Cit9OworCitzdHJ1Y3QgdmZlX3NldHRpbmdzIHsKKwlfX3UzMiB4LCB5OwkJLyogT2Zmc2V0cyBpbnRvIGltYWdlICovCisJX191MzIgd2lkdGgsIGhlaWdodDsJLyogQXJlYSB0byBjYXB0dXJlICovCisJX191MTYgZGVjaW1hdGlvbjsJLyogRGVjaW1hdGlvbiBkaXZpZGVyICovCisJX191MTYgZmxhZ3M7CQkvKiBGbGFncyBmb3IgY2FwdHVyZSAqLworLyogZmxhZ3MgYXJlIHRoZSBzYW1lIGFzIGluIHN0cnVjdCB2aWRlb19jYXB0dXJlIC0gc2VlIHZpZGVvZGV2Lmg6CisjZGVmaW5lIFZJREVPX0NBUFRVUkVfT0RECQkwCisjZGVmaW5lIFZJREVPX0NBUFRVUkVfRVZFTgkJMQorKi8KKwlfX3UxNiBxdWFsaXR5OwkJLyogcXVhbGl0eSBvZiB0aGUgdmlkZW8gKi8KK307CisKK3N0cnVjdCB0dm5vcm0geworCXUxNiBXdCwgV2EsIEhTdGFydCwgSFN5bmNTdGFydCwgSHQsIEhhLCBWU3RhcnQ7Cit9OworCitzdHJ1Y3QganBlZ19jb21fbWFya2VyIHsKKwlpbnQgbGVuOyAvKiBudW1iZXIgb2YgdXNhYmxlIGJ5dGVzIGluIGRhdGEgKi8KKwljaGFyIGRhdGFbNjBdOworfTsKKworc3RydWN0IGpwZWdfYXBwX21hcmtlciB7CisJaW50IGFwcG47IC8qIG51bWJlciBhcHAgc2VnbWVudCAqLworCWludCBsZW47IC8qIG51bWJlciBvZiB1c2FibGUgYnl0ZXMgaW4gZGF0YSAqLworCWNoYXIgZGF0YVs2MF07Cit9OworCitzdHJ1Y3QgdmlkZW9jb2RlYyB7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJLyogLS0gZmlsbGVkIGluIGJ5IHNsYXZlIGRldmljZSBkdXJpbmcgcmVnaXN0ZXIgLS0gKi8KKwljaGFyIG5hbWVbMzJdOworCXVuc2lnbmVkIGxvbmcgbWFnaWM7CS8qIG1heSBiZSB1c2VkIGZvciBjbGllbnQ8LT5tYXN0ZXIgYXR0YWNoaW5nICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsJLyogZnVuY3Rpb25hbGl0eSBmbGFncyAqLworCXVuc2lnbmVkIGludCB0eXBlOwkvKiBjb2RlYyB0eXBlICovCisKKwkvKiAtLSB0aGVzZSBpcyBmaWxsZWQgaW4gbGF0ZXIgZHVyaW5nIG1hc3RlciBkZXZpY2UgYXR0YWNoIC0tICovCisKKwlzdHJ1Y3QgdmlkZW9jb2RlY19tYXN0ZXIgKm1hc3Rlcl9kYXRhOworCisJLyogLS0gdGhlc2UgYXJlIGZpbGxlZCBpbiBieSB0aGUgc2xhdmUgZGV2aWNlIGR1cmluZyByZWdpc3RlciAtLSAqLworCisJdm9pZCAqZGF0YTsJCS8qIHByaXZhdGUgc2xhdmUgZGF0YSAqLworCisJLyogYXR0YWNoL2RldGFjaCBjbGllbnQgZnVuY3Rpb25zIChpbmRpcmVjdCBjYWxsKSAqLworCWludCAoKnNldHVwKSAoc3RydWN0IHZpZGVvY29kZWMgKiBjb2RlYyk7CisJaW50ICgqdW5zZXQpIChzdHJ1Y3QgdmlkZW9jb2RlYyAqIGNvZGVjKTsKKworCS8qIG1haW4gZnVuY3Rpb25zLCBldmVyeSBjbGllbnQgbmVlZHMgdGhlbSBmb3Igc3VyZSEgKi8KKwkvLyBzZXQgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiAob3IgZnJlZXplLCBzdG9wLCBzdGFuZGJ5LCBldGMpCisJaW50ICgqc2V0X21vZGUpIChzdHJ1Y3QgdmlkZW9jb2RlYyAqIGNvZGVjLAorCQkJIGludCBtb2RlKTsKKwkvLyBzZXR1cCBwaWN0dXJlIHNpemUgYW5kIG5vcm0gKGZvciB0aGUgY29kZWMncyB2aWRlbyBmcm9udGVuZCkKKwlpbnQgKCpzZXRfdmlkZW8pIChzdHJ1Y3QgdmlkZW9jb2RlYyAqIGNvZGVjLAorCQkJICBzdHJ1Y3QgdHZub3JtICogbm9ybSwKKwkJCSAgc3RydWN0IHZmZV9zZXR0aW5ncyAqIGNhcCwKKwkJCSAgc3RydWN0IHZmZV9wb2xhcml0eSAqIHBvbCk7CisJLy8gb3RoZXIgY29udHJvbCBjb21tYW5kcywgYWxzbyBtbWFwIHNldHVwIGV0Yy4KKwlpbnQgKCpjb250cm9sKSAoc3RydWN0IHZpZGVvY29kZWMgKiBjb2RlYywKKwkJCWludCB0eXBlLAorCQkJaW50IHNpemUsCisJCQl2b2lkICpkYXRhKTsKKworCS8qIGFkZGl0aW9uYWwgc2V0dXAvcXVlcnkvcHJvY2Vzc2luZyAobWF5IGJlIE5VTEwgcG9pbnRlcikgKi8KKwkvLyBpbnRlcnJ1cHQgc2V0dXAgLyBoYW5kbGluZyAoZm9yIGlycSdzIGRlbGl2ZXJlZCBieSBtYXN0ZXIpCisJaW50ICgqc2V0dXBfaW50ZXJydXB0KSAoc3RydWN0IHZpZGVvY29kZWMgKiBjb2RlYywKKwkJCQlsb25nIG1vZGUpOworCWludCAoKmhhbmRsZV9pbnRlcnJ1cHQpIChzdHJ1Y3QgdmlkZW9jb2RlYyAqIGNvZGVjLAorCQkJCSBpbnQgc291cmNlLAorCQkJCSBsb25nIGZsYWcpOworCS8vIHBpY3R1cmUgaW50ZXJmYWNlIChpZiBhbnkpCisJbG9uZyAoKnB1dF9pbWFnZSkgKHN0cnVjdCB2aWRlb2NvZGVjICogY29kZWMsCisJCQkgICBpbnQgdHJfdHlwZSwKKwkJCSAgIGludCBibG9jaywKKwkJCSAgIGxvbmcgKmZyX251bSwKKwkJCSAgIGxvbmcgKmZsYWcsCisJCQkgICBsb25nIHNpemUsCisJCQkgICB2b2lkICpidWYpOworCWxvbmcgKCpnZXRfaW1hZ2UpIChzdHJ1Y3QgdmlkZW9jb2RlYyAqIGNvZGVjLAorCQkJICAgaW50IHRyX3R5cGUsCisJCQkgICBpbnQgYmxvY2ssCisJCQkgICBsb25nICpmcl9udW0sCisJCQkgICBsb25nICpmbGFnLAorCQkJICAgbG9uZyBzaXplLAorCQkJICAgdm9pZCAqYnVmKTsKK307CisKK3N0cnVjdCB2aWRlb2NvZGVjX21hc3RlciB7CisJLyogLS0gZmlsbGVkIGluIGJ5IG1hc3RlciBkZXZpY2UgZm9yIHJlZ2lzdHJhdGlvbiAtLSAqLworCWNoYXIgbmFtZVszMl07CisJdW5zaWduZWQgbG9uZyBtYWdpYzsJLyogbWF5IGJlIHVzZWQgZm9yIGNsaWVudDwtPm1hc3RlciBhdHRhY2hpbmcgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBmdW5jdGlvbmFsaXR5IGZsYWdzICovCisJdW5zaWduZWQgaW50IHR5cGU7CS8qIG1hc3RlciB0eXBlICovCisKKwl2b2lkICpkYXRhOwkJLyogcHJpdmF0ZSBtYXN0ZXIgZGF0YSAqLworCisJIF9fdTMyKCpyZWFkcmVnKSAoc3RydWN0IHZpZGVvY29kZWMgKiBjb2RlYywKKwkJCSAgX191MTYgcmVnKTsKKwl2b2lkICgqd3JpdGVyZWcpIChzdHJ1Y3QgdmlkZW9jb2RlYyAqIGNvZGVjLAorCQkJICBfX3UxNiByZWcsCisJCQkgIF9fdTMyIHZhbHVlKTsKK307CisMCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgb2YgdGhlIG1hc3Rlci9zbGF2ZSBpbnRlcmZhY2UgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogYXR0YWNoIGFuZCBkZXRhY2ggY29tbWFuZHMgZm9yIHRoZSBtYXN0ZXIgKi8KKy8vICogbWFzdGVyIHN0cnVjdHVyZSBuZWVkcyB0byBiZSBrbWFsbG9jJ2VkIGJlZm9yZSBjYWxsaW5nIGF0dGFjaAorLy8gICBhbmQgZnJlZSdkIGFmdGVyIGNhbGxpbmcgZGV0YWNoCisvLyAqIHJldHVybnMgcG9pbnRlciBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKK2V4dGVybiBzdHJ1Y3QgdmlkZW9jb2RlYyAqdmlkZW9jb2RlY19hdHRhY2goc3RydWN0IHZpZGVvY29kZWNfbWFzdGVyICopOworLy8gKiAwIG9uIHN1Y2Nlc3MsIDwwIChlcnJubykgb24gZmFpbHVyZQorZXh0ZXJuIGludCB2aWRlb2NvZGVjX2RldGFjaChzdHJ1Y3QgdmlkZW9jb2RlYyAqKTsKKworLyogcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgY29tbWFuZHMgZm9yIHRoZSBzbGF2ZXMgKi8KKy8vICogMCBvbiBzdWNjZXNzLCA8MCAoZXJybm8pIG9uIGZhaWx1cmUKK2V4dGVybiBpbnQgdmlkZW9jb2RlY19yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgdmlkZW9jb2RlYyAqKTsKKy8vICogMCBvbiBzdWNjZXNzLCA8MCAoZXJybm8pIG9uIGZhaWx1cmUKK2V4dGVybiBpbnQgdmlkZW9jb2RlY191bnJlZ2lzdGVyKGNvbnN0IHN0cnVjdCB2aWRlb2NvZGVjICopOworCisvKiB0aGUgb3RoZXIgY2FsbHMgYXJlIGRpcmVjdGx5IGRvbmUgdmlhIHRoZSB2aWRlb2NvZGVjIHN0cnVjdHVyZSEgKi8KKworI2VuZGlmCQkJCS8qaWZuZGVmIF9fTElOVVhfVklERU9DT0RFQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkZjE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYwpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIFZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlIGZvciBMaW51eAorICoKKyAqCQlBIGdlbmVyaWMgdmlkZW8gZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0KKyAqCQl1c2luZyBhIHNldCBvZiBkZXZpY2Ugc3RydWN0dXJlcy92ZWN0b3JzIGZvciBsb3cgbGV2ZWwgb3BlcmF0aW9ucy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3I6CUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIEZpeGVzOgkyMDAwMDUxNiAgQ2xhdWRpbyBNYXRzdW9rYSA8Y2xhdWRpb0Bjb25lY3RpdmEuY29tPgorICoJCS0gQWRkZWQgcHJvY2ZzIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisKKyNkZWZpbmUgVklERU9fTlVNX0RFVklDRVMJMjU2CisjZGVmaW5lIFZJREVPX05BTUUgICAgICAgICAgICAgICJ2aWRlbzRsaW51eCIKKworLyoKKyAqCXN5c2ZzIHN0dWZmCisgKi8KKworc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkID0gY29udGFpbmVyX29mKGNkLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBjbGFzc19kZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJS4qc1xuIiwoaW50KXNpemVvZih2ZmQtPm5hbWUpLHZmZC0+bmFtZSk7Cit9CisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwpOworCitzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb19kZXZpY2VfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQ7CisKKwl2ZmQgPSBrbWFsbG9jKHNpemVvZigqdmZkKSxHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSB2ZmQpCisJCXJldHVybiBOVUxMOworCW1lbXNldCh2ZmQsMCxzaXplb2YoKnZmZCkpOworCXJldHVybiB2ZmQ7Cit9CisKK3ZvaWQgdmlkZW9fZGV2aWNlX3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKQoreworCWtmcmVlKHZmZCk7Cit9CisKK3N0YXRpYyB2b2lkIHZpZGVvX3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkID0gY29udGFpbmVyX29mKGNkLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBjbGFzc19kZXYpOworCisjaWYgMSAvKiBuZWVkZWQgdW50aWwgYWxsIGRyaXZlcnMgYXJlIGZpeGVkICovCisJaWYgKCF2ZmQtPnJlbGVhc2UpCisJCXJldHVybjsKKyNlbmRpZgorCXZmZC0+cmVsZWFzZSh2ZmQpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzIHZpZGVvX2NsYXNzID0geworICAgICAgICAubmFtZSAgICA9IFZJREVPX05BTUUsCisJLnJlbGVhc2UgPSB2aWRlb19yZWxlYXNlLAorfTsKKworLyoKKyAqCUFjdGl2ZSBkZXZpY2VzIAorICovCisgCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZGV2aWNlW1ZJREVPX05VTV9ERVZJQ0VTXTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHZpZGVvZGV2X2xvY2spOworCitzdHJ1Y3QgdmlkZW9fZGV2aWNlKiB2aWRlb19kZXZkYXRhKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiB2aWRlb19kZXZpY2VbaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKV07Cit9CisKKy8qCisgKglPcGVuIGEgdmlkZW8gZGV2aWNlLgorICovCitzdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2Zmw7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7CisJCisJaWYobWlub3I+PVZJREVPX05VTV9ERVZJQ0VTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkb3duKCZ2aWRlb2Rldl9sb2NrKTsKKwl2Zmw9dmlkZW9fZGV2aWNlW21pbm9yXTsKKwlpZih2Zmw9PU5VTEwpIHsKKwkJdXAoJnZpZGVvZGV2X2xvY2spOworCQlyZXF1ZXN0X21vZHVsZSgiY2hhci1tYWpvci0lZC0lZCIsIFZJREVPX01BSk9SLCBtaW5vcik7CisJCWRvd24oJnZpZGVvZGV2X2xvY2spOworCQl2Zmw9dmlkZW9fZGV2aWNlW21pbm9yXTsKKwkJaWYgKHZmbD09TlVMTCkgeworCQkJdXAoJnZpZGVvZGV2X2xvY2spOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisJb2xkX2ZvcHMgPSBmaWxlLT5mX29wOworCWZpbGUtPmZfb3AgPSBmb3BzX2dldCh2ZmwtPmZvcHMpOworCWlmKGZpbGUtPmZfb3AtPm9wZW4pCisJCWVyciA9IGZpbGUtPmZfb3AtPm9wZW4oaW5vZGUsZmlsZSk7CisJaWYgKGVycikgeworCQlmb3BzX3B1dChmaWxlLT5mX29wKTsKKwkJZmlsZS0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKKwl9CisJZm9wc19wdXQob2xkX2ZvcHMpOworCXVwKCZ2aWRlb2Rldl9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogaGVscGVyIGZ1bmN0aW9uIC0tIGhhbmRsZXMgdXNlcnNwYWNlIGNvcHlpbmcgZm9yIGlvY3RsIGFyZ3VtZW50cworICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3ZpZGVvX2ZpeF9jb21tYW5kKHVuc2lnbmVkIGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ19PVkVSTEFZX09MRDoKKwkJY21kID0gVklESU9DX09WRVJMQVk7CisJCWJyZWFrOworCWNhc2UgVklESU9DX1NfUEFSTV9PTEQ6CisJCWNtZCA9IFZJRElPQ19TX1BBUk07CisJCWJyZWFrOworCWNhc2UgVklESU9DX1NfQ1RSTF9PTEQ6CisJCWNtZCA9IFZJRElPQ19TX0NUUkw7CisJCWJyZWFrOworCWNhc2UgVklESU9DX0dfQVVESU9fT0xEOgorCQljbWQgPSBWSURJT0NfR19BVURJTzsKKwkJYnJlYWs7CisJY2FzZSBWSURJT0NfR19BVURPVVRfT0xEOgorCQljbWQgPSBWSURJT0NfR19BVURPVVQ7CisJCWJyZWFrOworCWNhc2UgVklESU9DX0NST1BDQVBfT0xEOgorCQljbWQgPSBWSURJT0NfQ1JPUENBUDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjbWQ7Cit9CisKK2ludAordmlkZW9fdXNlcmNvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAorCSAgICAgICBpbnQgKCpmdW5jKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykpCit7CisJY2hhcglzYnVmWzEyOF07CisJdm9pZCAgICAqbWJ1ZiA9IE5VTEw7CisJdm9pZAkqcGFyZyA9IE5VTEw7CisJaW50CWVyciAgPSAtRUlOVkFMOworCisJY21kID0gdmlkZW9fZml4X2NvbW1hbmQoY21kKTsKKworCS8qICBDb3B5IGFyZ3VtZW50cyBpbnRvIHRlbXAga2VybmVsIGJ1ZmZlciAgKi8KKwlzd2l0Y2ggKF9JT0NfRElSKGNtZCkpIHsKKwljYXNlIF9JT0NfTk9ORToKKwkJcGFyZyA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgX0lPQ19SRUFEOgorCWNhc2UgX0lPQ19XUklURToKKwljYXNlIChfSU9DX1dSSVRFIHwgX0lPQ19SRUFEKToKKwkJaWYgKF9JT0NfU0laRShjbWQpIDw9IHNpemVvZihzYnVmKSkgeworCQkJcGFyZyA9IHNidWY7CisJCX0gZWxzZSB7CisJCQkvKiB0b28gYmlnIHRvIGFsbG9jYXRlIGZyb20gc3RhY2sgKi8KKwkJCW1idWYgPSBrbWFsbG9jKF9JT0NfU0laRShjbWQpLEdGUF9LRVJORUwpOworCQkJaWYgKE5VTEwgPT0gbWJ1ZikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXBhcmcgPSBtYnVmOworCQl9CisJCQorCQllcnIgPSAtRUZBVUxUOworCQlpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfV1JJVEUpCisJCQlpZiAoY29weV9mcm9tX3VzZXIocGFyZywgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSkpCisJCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKworCS8qIGNhbGwgZHJpdmVyICovCisJZXJyID0gZnVuYyhpbm9kZSwgZmlsZSwgY21kLCBwYXJnKTsKKwlpZiAoZXJyID09IC1FTk9JT0NUTENNRCkKKwkJZXJyID0gLUVJTlZBTDsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiAgQ29weSByZXN1bHRzIGludG8gdXNlciBidWZmZXIgICovCisJc3dpdGNoIChfSU9DX0RJUihjbWQpKQorCXsKKwljYXNlIF9JT0NfUkVBRDoKKwljYXNlIChfSU9DX1dSSVRFIHwgX0lPQ19SRUFEKToKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHBhcmcsIF9JT0NfU0laRShjbWQpKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKworb3V0OgorCWlmIChtYnVmKQorCQlrZnJlZShtYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogb3Blbi9yZWxlYXNlIGhlbHBlciBmdW5jdGlvbnMgLS0gaGFuZGxlIGV4Y2x1c2l2ZSBvcGVucworICovCitpbnQgdmlkZW9fZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0ICB2aWRlb19kZXZpY2UgKnZmbCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJaW50IHJldHZhbCA9IDA7CisKKwlkb3duKCZ2ZmwtPmxvY2spOworCWlmICh2ZmwtPnVzZXJzKSB7CisJCXJldHZhbCA9IC1FQlVTWTsKKwl9IGVsc2UgeworCQl2ZmwtPnVzZXJzKys7CisJfQorCXVwKCZ2ZmwtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB2aWRlb19leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgIHZpZGVvX2RldmljZSAqdmZsID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwkKKwl2ZmwtPnVzZXJzLS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHM7CisKKy8qKgorICoJdmlkZW9fcmVnaXN0ZXJfZGV2aWNlIC0gcmVnaXN0ZXIgdmlkZW80bGludXggZGV2aWNlcworICoJQHZmZDogIHZpZGVvIGRldmljZSBzdHJ1Y3R1cmUgd2Ugd2FudCB0byByZWdpc3RlcgorICoJQHR5cGU6IHR5cGUgb2YgZGV2aWNlIHRvIHJlZ2lzdGVyCisgKglAbnI6ICAgd2hpY2ggZGV2aWNlIG51bWJlciAoMCA9PSAvZGV2L3ZpZGVvMCwgMSA9PSAvZGV2L3ZpZGVvMSwgLi4uCisgKiAgICAgICAgICAgICAtMSA9PSBmaXJzdCBmcmVlKQorICoJCisgKglUaGUgcmVnaXN0cmF0aW9uIGNvZGUgYXNzaWducyBtaW5vciBudW1iZXJzIGJhc2VkIG9uIHRoZSB0eXBlCisgKglyZXF1ZXN0ZWQuIC1FTkZJTEUgaXMgcmV0dXJuZWQgaW4gYWxsIHRoZSBkZXZpY2Ugc2xvdHMgZm9yIHRoaXMKKyAqCWNhdGVnb3J5IGFyZSBmdWxsLiBJZiBub3QgdGhlbiB0aGUgbWlub3IgZmllbGQgaXMgc2V0IGFuZCB0aGUKKyAqCWRyaXZlciBpbml0aWFsaXplIGZ1bmN0aW9uIGlzIGNhbGxlZCAoaWYgbm9uICVOVUxMKS4KKyAqCisgKglaZXJvIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuCisgKgorICoJVmFsaWQgdHlwZXMgYXJlCisgKgorICoJJVZGTF9UWVBFX0dSQUJCRVIgLSBBIGZyYW1lIGdyYWJiZXIKKyAqCisgKgklVkZMX1RZUEVfVlRYIC0gQSB0ZWxldGV4dCBkZXZpY2UKKyAqCisgKgklVkZMX1RZUEVfVkJJIC0gVmVydGljYWwgYmxhbmsgZGF0YSAodW5kZWNvZGVkKQorICoKKyAqCSVWRkxfVFlQRV9SQURJTyAtIEEgcmFkaW8gY2FyZAkKKyAqLworCitpbnQgdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCwgaW50IHR5cGUsIGludCBucikKK3sKKwlpbnQgaT0wOworCWludCBiYXNlOworCWludCBlbmQ7CisJY2hhciAqbmFtZV9iYXNlOworCQorCXN3aXRjaCh0eXBlKQorCXsKKwkJY2FzZSBWRkxfVFlQRV9HUkFCQkVSOgorCQkJYmFzZT0wOworCQkJZW5kPTY0OworCQkJbmFtZV9iYXNlID0gInZpZGVvIjsKKwkJCWJyZWFrOworCQljYXNlIFZGTF9UWVBFX1ZUWDoKKwkJCWJhc2U9MTkyOworCQkJZW5kPTIyNDsKKwkJCW5hbWVfYmFzZSA9ICJ2dHgiOworCQkJYnJlYWs7CisJCWNhc2UgVkZMX1RZUEVfVkJJOgorCQkJYmFzZT0yMjQ7CisJCQllbmQ9MjQwOworCQkJbmFtZV9iYXNlID0gInZiaSI7CisJCQlicmVhazsKKwkJY2FzZSBWRkxfVFlQRV9SQURJTzoKKwkJCWJhc2U9NjQ7CisJCQllbmQ9MTI4OworCQkJbmFtZV9iYXNlID0gInJhZGlvIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIHBpY2sgYSBtaW5vciBudW1iZXIgKi8KKwlkb3duKCZ2aWRlb2Rldl9sb2NrKTsKKwlpZiAobnIgPj0gMCAgJiYgIG5yIDwgZW5kLWJhc2UpIHsKKwkJLyogdXNlIHRoZSBvbmUgdGhlIGRyaXZlciBhc2tlZCBmb3IgKi8KKwkJaSA9IGJhc2UrbnI7CisJCWlmIChOVUxMICE9IHZpZGVvX2RldmljZVtpXSkgeworCQkJdXAoJnZpZGVvZGV2X2xvY2spOworCQkJcmV0dXJuIC1FTkZJTEU7CisJCX0KKwl9IGVsc2UgeworCQkvKiB1c2UgZmlyc3QgZnJlZSAqLworCQlmb3IoaT1iYXNlO2k8ZW5kO2krKykKKwkJCWlmIChOVUxMID09IHZpZGVvX2RldmljZVtpXSkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gZW5kKSB7CisJCQl1cCgmdmlkZW9kZXZfbG9jayk7CisJCQlyZXR1cm4gLUVORklMRTsKKwkJfQorCX0KKwl2aWRlb19kZXZpY2VbaV09dmZkOworCXZmZC0+bWlub3I9aTsKKwl1cCgmdmlkZW9kZXZfbG9jayk7CisKKwlzcHJpbnRmKHZmZC0+ZGV2ZnNfbmFtZSwgInY0bC8lcyVkIiwgbmFtZV9iYXNlLCBpIC0gYmFzZSk7CisJZGV2ZnNfbWtfY2RldihNS0RFVihWSURFT19NQUpPUiwgdmZkLT5taW5vciksCisJCQlTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsIHZmZC0+ZGV2ZnNfbmFtZSk7CisJaW5pdF9NVVRFWCgmdmZkLT5sb2NrKTsKKworCS8qIHN5c2ZzIGNsYXNzICovCisgICAgICAgIG1lbXNldCgmdmZkLT5jbGFzc19kZXYsIDB4MDAsIHNpemVvZih2ZmQtPmNsYXNzX2RldikpOworCWlmICh2ZmQtPmRldikKKwkJdmZkLT5jbGFzc19kZXYuZGV2ID0gdmZkLT5kZXY7CisJdmZkLT5jbGFzc19kZXYuY2xhc3MgICAgICAgPSAmdmlkZW9fY2xhc3M7CisJdmZkLT5jbGFzc19kZXYuZGV2dCAgICAgICA9IE1LREVWKFZJREVPX01BSk9SLCB2ZmQtPm1pbm9yKTsKKwlzdHJsY3B5KHZmZC0+Y2xhc3NfZGV2LmNsYXNzX2lkLCB2ZmQtPmRldmZzX25hbWUgKyA0LCBCVVNfSURfU0laRSk7CisJY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZ2ZmQtPmNsYXNzX2Rldik7CisJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZ2ZmQtPmNsYXNzX2RldiwKKwkJCQkgJmNsYXNzX2RldmljZV9hdHRyX25hbWUpOworCisjaWYgMSAvKiBuZWVkZWQgdW50aWwgYWxsIGRyaXZlcnMgYXJlIGZpeGVkICovCisJaWYgKCF2ZmQtPnJlbGVhc2UpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInZpZGVvZGV2OiBcIiVzXCIgaGFzIG5vIHJlbGVhc2UgY2FsbGJhY2suICIKKwkJICAgICAgICJQbGVhc2UgZml4IHlvdXIgZHJpdmVyIGZvciBwcm9wZXIgc3lzZnMgc3VwcG9ydCwgc2VlICIKKwkJICAgICAgICJodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8zNjg1MC9cbiIsIHZmZC0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2aWRlb191bnJlZ2lzdGVyX2RldmljZSAtIHVucmVnaXN0ZXIgYSB2aWRlbzRsaW51eCBkZXZpY2UKKyAqCUB2ZmQ6IHRoZSBkZXZpY2UgdG8gdW5yZWdpc3RlcgorICoKKyAqCVRoaXMgdW5yZWdpc3RlcnMgdGhlIHBhc3NlZCBkZXZpY2UgYW5kIGRlYXNzaWducyB0aGUgbWlub3IKKyAqCW51bWJlci4gRnV0dXJlIG9wZW4gY2FsbHMgd2lsbCBiZSBtZXQgd2l0aCBlcnJvcnMuCisgKi8KKyAKK3ZvaWQgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKQoreworCWRvd24oJnZpZGVvZGV2X2xvY2spOworCWlmKHZpZGVvX2RldmljZVt2ZmQtPm1pbm9yXSE9dmZkKQorCQlwYW5pYygidmlkZW9kZXY6IGJhZCB1bnJlZ2lzdGVyIik7CisKKwlkZXZmc19yZW1vdmUodmZkLT5kZXZmc19uYW1lKTsKKwl2aWRlb19kZXZpY2VbdmZkLT5taW5vcl09TlVMTDsKKwljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmdmZkLT5jbGFzc19kZXYpOworCXVwKCZ2aWRlb2Rldl9sb2NrKTsKK30KKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aWRlb19mb3BzPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkub3BlbgkJPSB2aWRlb19vcGVuLAorfTsKKworLyoKKyAqCUluaXRpYWxpc2UgdmlkZW8gZm9yIGxpbnV4CisgKi8KKyAKK3N0YXRpYyBpbnQgX19pbml0IHZpZGVvZGV2X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcHJpbnRrKEtFUk5fSU5GTyAiTGludXggdmlkZW8gY2FwdHVyZSBpbnRlcmZhY2U6IHYxLjAwXG4iKTsKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KFZJREVPX01BSk9SLCBWSURFT19OQU1FLCAmdmlkZW9fZm9wcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidmlkZW9fZGV2OiB1bmFibGUgdG8gZ2V0IG1ham9yICVkXG4iLCBWSURFT19NQUpPUik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGNsYXNzX3JlZ2lzdGVyKCZ2aWRlb19jbGFzcyk7CisJaWYgKHJldCA8IDApIHsKKwkJdW5yZWdpc3Rlcl9jaHJkZXYoVklERU9fTUFKT1IsIFZJREVPX05BTUUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2aWRlb19kZXY6IGNsYXNzX3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmlkZW9kZXZfZXhpdCh2b2lkKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJnZpZGVvX2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldihWSURFT19NQUpPUiwgVklERU9fTkFNRSk7Cit9CisKK21vZHVsZV9pbml0KHZpZGVvZGV2X2luaXQpCittb2R1bGVfZXhpdCh2aWRlb2Rldl9leGl0KQorCitFWFBPUlRfU1lNQk9MKHZpZGVvX3JlZ2lzdGVyX2RldmljZSk7CitFWFBPUlRfU1lNQk9MKHZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0wodmlkZW9fZGV2ZGF0YSk7CitFWFBPUlRfU1lNQk9MKHZpZGVvX3VzZXJjb3B5KTsKK0VYUE9SVF9TWU1CT0wodmlkZW9fZXhjbHVzaXZlX29wZW4pOworRVhQT1JUX1NZTUJPTCh2aWRlb19leGNsdXNpdmVfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MKHZpZGVvX2RldmljZV9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKHZpZGVvX2RldmljZV9yZWxlYXNlKTsKKworTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIHJlZ2lzdHJhciBmb3IgVmlkZW80TGludXggZHJpdmVycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTg2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIChpbmNvbXBsZXRlKSBEcml2ZXIgZm9yIHRoZSBWSU5PIChWaWRlbyBJbiBObyBPdXQpIHN5c3RlbSBmb3VuZCBpbiBTR0kgSW5keXMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBMYWRpc2xhdiBNaWNobCA8bGFkaXNAbGludXgtbWlwcy5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1zZ2kuaD4KKworI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvaXAyMi5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvaHBjMy5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvbWMuaD4KKworI2luY2x1ZGUgInZpbm8uaCIKKworLyogZGVidWdnaW5nPyAqLworI2lmIDEKKyNkZWZpbmUgREVCVUcoeC4uLikgICAgIHByaW50ayh4KTsKKyNlbHNlCisjZGVmaW5lIERFQlVHKHguLi4pCisjZW5kaWYKKworCisvKiBWSU5PIEFTSUMgcmVnaXN0ZXJzICovCitzdHJ1Y3Qgc2dpX3Zpbm8gKnZpbm87CisKK3N0YXRpYyBjb25zdCBjaGFyICp2aW5vc3RyID0gIlZJTk8gSW5keUNhbS9UViI7CitzdGF0aWMgaW50IHRocmVzaG9sZF9hID0gNTEyOworc3RhdGljIGludCB0aHJlc2hvbGRfYiA9IDUxMjsKKworc3RydWN0IHZpbm9fZGV2aWNlIHsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CisjZGVmaW5lIFZJTk9fQ0hBTl9BCQkxCisjZGVmaW5lIFZJTk9fQ0hBTl9CCQkyCisJaW50IGNoYW47Cit9OworCitzdHJ1Y3Qgdmlub19jbGllbnQgeworCXN0cnVjdCBpMmNfY2xpZW50ICpkcml2ZXI7CisJaW50IG93bmVyOworfTsKKworc3RydWN0IHZpbm9fdmlkZW8geworCXN0cnVjdCB2aW5vX2RldmljZSBjaEE7CisJc3RydWN0IHZpbm9fZGV2aWNlIGNoQjsKKworCXN0cnVjdCB2aW5vX2NsaWVudCBkZWNvZGVyOworCXN0cnVjdCB2aW5vX2NsaWVudCBjYW1lcmE7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIGlucHV0X2xvY2s7CisKKwkvKiBMb2FkZWQgaW50byBWSU5PIGRlc2NyaXB0b3JzIHRvIGNsZWFyIEVuZCBPZiBEZXNjcmlwdG9ycyB0YWJsZQorCSAqIGludGVydXB0IGNvbmRpdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgZHVtbXlfcGFnZTsKKwl1bnNpZ25lZCBpbnQgZHVtbXlfYnVmWzRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdmlub192aWRlbyAqVmlubzsKKwordW5zaWduZWQgaTJjX3Zpbm9fZ2V0Y3RybCh2b2lkICpkYXRhKQoreworCXJldHVybiB2aW5vLT5pMmNfY29udHJvbDsKK30KKwordm9pZCBpMmNfdmlub19zZXRjdHJsKHZvaWQgKmRhdGEsIHVuc2lnbmVkIHZhbCkKK3sKKwl2aW5vLT5pMmNfY29udHJvbCA9IHZhbDsKK30KKwordW5zaWduZWQgaTJjX3Zpbm9fcmRhdGEodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gdmluby0+aTJjX2RhdGE7Cit9CisKK3ZvaWQgaTJjX3Zpbm9fd2RhdGEodm9pZCAqZGF0YSwgdW5zaWduZWQgdmFsKQoreworCXZpbm8tPmkyY19kYXRhID0gdmFsOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvX3NnaV9kYXRhIGkyY19zZ2lfdmlub19kYXRhID0KK3sKKwkuZ2V0Y3RybCA9ICZpMmNfdmlub19nZXRjdHJsLAorCS5zZXRjdHJsID0gJmkyY192aW5vX3NldGN0cmwsCisJLnJkYXRhICAgPSAmaTJjX3Zpbm9fcmRhdGEsCisJLndkYXRhICAgPSAmaTJjX3Zpbm9fd2RhdGEsCisJLnhmZXJfdGltZW91dCA9IDIwMCwKKwkuYWNrX3RpbWVvdXQgID0gMTAwMCwKK307CisKKy8qCisgKiBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGNsaWVudHMgb24gVklOTyBJMkMgYnVzLCBzbyB3ZSBsaW1pdCB1c2FnZSBvbmx5CisgKiB0byB0aGVtLgorICovCitzdGF0aWMgaW50IGkyY192aW5vX2NsaWVudF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmVzID0gMDsKKworCWRvd24oJlZpbm8tPmlucHV0X2xvY2spOworCXN3aXRjaCAoY2xpZW50LT5kcml2ZXItPmlkKSB7CisJY2FzZSBJMkNfRFJJVkVSSURfU0FBNzE5MToKKwkJaWYgKFZpbm8tPmRlY29kZXIuZHJpdmVyKQorCQkJcmVzID0gLUVCVVNZOworCQllbHNlCisJCQlWaW5vLT5kZWNvZGVyLmRyaXZlciA9IGNsaWVudDsKKwkJYnJlYWs7CisJY2FzZSBJMkNfRFJJVkVSSURfSU5EWUNBTToKKwkJaWYgKFZpbm8tPmNhbWVyYS5kcml2ZXIpCisJCQlyZXMgPSAtRUJVU1k7CisJCWVsc2UKKwkJCVZpbm8tPmNhbWVyYS5kcml2ZXIgPSBjbGllbnQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlcyA9IC1FTk9ERVY7CisJfQorCXVwKCZWaW5vLT5pbnB1dF9sb2NrKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3Zpbm9fY2xpZW50X3VucmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJlcyA9IDA7CisKKwlkb3duKCZWaW5vLT5pbnB1dF9sb2NrKTsKKwlpZiAoY2xpZW50ID09IFZpbm8tPmRlY29kZXIuZHJpdmVyKSB7CisJCWlmIChWaW5vLT5kZWNvZGVyLm93bmVyKQorCQkJcmVzID0gLUVCVVNZOworCQllbHNlCisJCQlWaW5vLT5kZWNvZGVyLmRyaXZlciA9IE5VTEw7CisJfSBlbHNlIGlmIChjbGllbnQgPT0gVmluby0+Y2FtZXJhLmRyaXZlcikgeworCQlpZiAoVmluby0+Y2FtZXJhLm93bmVyKQorCQkJcmVzID0gLUVCVVNZOworCQllbHNlCisJCQlWaW5vLT5jYW1lcmEuZHJpdmVyID0gTlVMTDsKKwl9CisJdXAoJlZpbm8tPmlucHV0X2xvY2spOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciB2aW5vX2kyY19hZGFwdGVyID0KK3sKKwkubmFtZQkJCT0gIlZJTk8gSTJDIGJ1cyIsCisJLmlkCQkJPSBJMkNfSFdfU0dJX1ZJTk8sCisJLmFsZ29fZGF0YQkJPSAmaTJjX3NnaV92aW5vX2RhdGEsCisJLmNsaWVudF9yZWdpc3Rlcgk9ICZpMmNfdmlub19jbGllbnRfcmVnLAorCS5jbGllbnRfdW5yZWdpc3Rlcgk9ICZpMmNfdmlub19jbGllbnRfdW5yZWcsCit9OworCitzdGF0aWMgaW50IHZpbm9faTJjX2FkZF9idXModm9pZCkKK3sKKwlyZXR1cm4gaTJjX3NnaV9hZGRfYnVzKCZ2aW5vX2kyY19hZGFwdGVyKTsKK30KKworc3RhdGljIGludCB2aW5vX2kyY19kZWxfYnVzKHZvaWQpCit7CisJcmV0dXJuIGkyY19zZ2lfZGVsX2J1cygmdmlub19pMmNfYWRhcHRlcik7Cit9CisKKworc3RhdGljIHZvaWQgdmlub19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKK30KKworc3RhdGljIGludCB2aW5vX29wZW4oc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHZpbm9fZGV2aWNlICp2aWRldiA9IChzdHJ1Y3Qgdmlub19kZXZpY2UgKilkZXY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmlub19jbG9zZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZpbm9fZGV2aWNlICp2aWRldiA9IChzdHJ1Y3Qgdmlub19kZXZpY2UgKilkZXY7Cit9CisKK3N0YXRpYyBpbnQgdmlub19tbWFwKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYWRyLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3Qgdmlub19kZXZpY2UgKnZpZGV2ID0gKHN0cnVjdCB2aW5vX2RldmljZSAqKWRldjsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpbm9faW9jdGwoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpbm9fZGV2aWNlICp2aWRldiA9IChzdHJ1Y3Qgdmlub19kZXZpY2UgKilkZXY7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2aWRlb19kZXZpY2Ugdmlub19kZXZpY2UgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS50eXBlCQk9IFZJRF9UWVBFX0NBUFRVUkUgfCBWSURfVFlQRV9TVUJDQVBUVVJFLAorCS5oYXJkd2FyZQk9IFZJRF9IQVJEV0FSRV9WSU5PLAorCS5uYW1lCQk9ICJWSU5PIiwKKwkub3BlbgkJPSB2aW5vX29wZW4sCisJLmNsb3NlCQk9IHZpbm9fY2xvc2UsCisJLmlvY3RsCQk9IHZpbm9faW9jdGwsCisJLm1tYXAJCT0gdmlub19tbWFwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdmlub19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByZXY7CisJaW50IGksIHJldCA9IDA7CisKKwkvKiBWSU5PIGlzIEluZHkgc3BlY2lmaWMgYmVhc3QgKi8KKwlpZiAoaXAyMl9pc19mdWxsaG91c2UoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIFZJTk8gaXMgaW4gdGhlIEVJU0EgYWRkcmVzcyBzcGFjZSwgc28gdGhlIHN5c2lkIHJlZ2lzdGVyIHdpbGwgdGVsbAorCSAqIHVzIGlmIHRoZSBFSVNBX1BSRVNFTlQgcGluIG9uIE1DIGhhcyBiZWVuIHB1bGxlZCBsb3cuCisJICoKKwkgKiBJZiBFSVNBX1BSRVNFTlQgaXMgbm90IHNldCB3ZSBkZWZpbml0ZWx5IGRvbid0IGhhdmUgYSBWSU5PIGVxdWlwZWQKKwkgKiBzeXN0ZW0uCisJICovCisJaWYgKCEoc2dpbWMtPnN5c3RlbWlkICYgU0dJTUNfU1lTSURfRVBSRVNFTlQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklOTyBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl2aW5vID0gKHN0cnVjdCBzZ2lfdmlubyAqKWlvcmVtYXAoVklOT19CQVNFLCBzaXplb2Yoc3RydWN0IHNnaV92aW5vKSk7CisJaWYgKCF2aW5vKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIE9rYXksIG9uY2Ugd2Uga25vdyB0aGF0IFZJTk8gaXMgcHJlc2VudCB3ZSdsbCByZWFkIGl0cyByZXZpc2lvbgorCSAqIHNhZmUgd2F5LiBPbmUgbmV2ZXIga25vd3MuLi4gKi8KKwlpZiAoZ2V0X2RiZShyZXYsICYodmluby0+cmV2X2lkKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU5POiBmYWlsZWQgdG8gcmVhZCByZXZpc2lvbiByZWdpc3RlclxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3VubWFwOworCX0KKwlpZiAoVklOT19JRF9WQUxVRShyZXYpICE9IFZJTk9fQ0hJUF9JRCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTk8gaXMgbm90IFZJTk8gKFJldi9JRDogMHglMDRseClcbiIsIHJldik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3VubWFwOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJWSU5PIFJldjogMHglMDJseFxuIiwgVklOT19SRVZfTlVNKHJldikpOworCisJVmlubyA9IChzdHJ1Y3Qgdmlub192aWRlbyAqKQorCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdmlub192aWRlbyksIEdGUF9LRVJORUwpOworCWlmICghVmlubykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bm1hcDsKKwl9CisKKwlWaW5vLT5kdW1teV9wYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIVZpbm8tPmR1bW15X3BhZ2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV92aW5vOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlWaW5vLT5kdW1teV9idWZbaV0gPSBQSFlTQUREUihWaW5vLT5kdW1teV9wYWdlKTsKKworCXZpbm8tPmNvbnRyb2wgPSAwOworCS8qIHByZXZlbnQgVklOTyBmcm9tIHRocm93aW5nIHNwdXJpb3VzIGludGVycnVwdHMgKi8KKwl2aW5vLT5hLm5leHRfNF9kZXNjID0gUEhZU0FERFIoVmluby0+ZHVtbXlfYnVmKTsKKwl2aW5vLT5iLm5leHRfNF9kZXNjID0gUEhZU0FERFIoVmluby0+ZHVtbXlfYnVmKTsKKwl1ZGVsYXkoNSk7CisJdmluby0+aW50cl9zdGF0dXMgPSAwOworICAgICAgICAvKiBzZXQgdGhyZXNob2xkIGxldmVsICovCisgICAgICAgIHZpbm8tPmEuZmlmb190aHJlcyA9IHRocmVzaG9sZF9hOworCXZpbm8tPmIuZmlmb190aHJlcyA9IHRocmVzaG9sZF9iOworCisJaW5pdF9NVVRFWCgmVmluby0+aW5wdXRfbG9jayk7CisKKwlpZiAocmVxdWVzdF9pcnEoU0dJX1ZJTk9fSVJRLCB2aW5vX2ludGVycnVwdCwgMCwgdmlub3N0ciwgTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU5POiBpcnElMDJkIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsCisJCSAgICAgICBTR0lfVklOT19JUlEpOworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dF9mcmVlX3BhZ2U7CisJfQorCisJcmV0ID0gdmlub19pMmNfYWRkX2J1cygpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU5POiBJMkMgYnVzIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9mcmVlX2lycTsKKwl9CisKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZWaW5vLT5jaEEudmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpIDwgMCkgeworCQlwcmludGsoIiVzLCBjaG5sICVkOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIsCisJCQlWaW5vLT5jaEEudmRldi5uYW1lLCBWaW5vLT5jaEEuY2hhbik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2kyY19kZWxfYnVzOworCX0KKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZWaW5vLT5jaEIudmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpIDwgMCkgeworCQlwcmludGsoIiVzLCBjaG5sICVkOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIsCisJCQlWaW5vLT5jaEIudmRldi5uYW1lLCBWaW5vLT5jaEIuY2hhbik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfdmRldjsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X3VucmVnaXN0ZXJfdmRldjoKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmVmluby0+Y2hBLnZkZXYpOworb3V0X2kyY19kZWxfYnVzOgorCXZpbm9faTJjX2RlbF9idXMoKTsKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShTR0lfVklOT19JUlEsIE5VTEwpOworb3V0X2ZyZWVfcGFnZToKKwlmcmVlX3BhZ2UoVmluby0+ZHVtbXlfcGFnZSk7CitvdXRfZnJlZV92aW5vOgorCWtmcmVlKFZpbm8pOworb3V0X3VubWFwOgorCWlvdW5tYXAodmlubyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmlub19leGl0KHZvaWQpCit7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJlZpbm8tPmNoQS52ZGV2KTsKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmVmluby0+Y2hCLnZkZXYpOworCXZpbm9faTJjX2RlbF9idXMoKTsKKwlmcmVlX2lycShTR0lfVklOT19JUlEsIE5VTEwpOworCWZyZWVfcGFnZShWaW5vLT5kdW1teV9wYWdlKTsKKwlrZnJlZShWaW5vKTsKKwlpb3VubWFwKHZpbm8pOworfQorCittb2R1bGVfaW5pdCh2aW5vX2luaXQpOworbW9kdWxlX2V4aXQodmlub19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJWaWRlbzRMaW51eCBkcml2ZXIgZm9yIFNHSSBJbmR5IFZJTk8gKEluZHlDYW0pIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZmNlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBVbGYgS2FybHNzb24gPHVsZmNAYnVuLmZhbGtlbmJlcmcuc2U+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTGFkaXNsYXYgTWljaGwgPGxhZGlzQGxpbnV4LW1pcHMub3JnPgorICovCisKKyNpZm5kZWYgVklOT19ICisjZGVmaW5lIFZJTk9fSAorCisjZGVmaW5lIFZJTk9fQkFTRQkweDAwMDgwMDAwCS8qIFZpbm8gaXMgaW4gdGhlIEVJU0EgYWRkcmVzcyBzcGFjZSwKKwkJCQkJICogYnV0IGl0IGlzIG5vdCBhbiBFSVNBIGJ1cyBjYXJkICovCisKK3N0cnVjdCBzZ2lfdmlub19jaGFubmVsIHsKKwl1MzIgX3BhZF9hbHBoYTsKKwl2b2xhdGlsZSB1MzIgYWxwaGE7CisKKyNkZWZpbmUgVklOT19DTElQX1goeCkJCSgoeCkgJiAweDNmZikJCS8qIGJpdHMgMDo5ICovCisjZGVmaW5lIFZJTk9fQ0xJUF9PREQoeCkJKCgoeCkgJiAweDFmZikgPDwgMTApCS8qIGJpdHMgMTA6MTggKi8KKyNkZWZpbmUgVklOT19DTElQX0VWRU4oeCkJKCgoeCkgJiAweDFmZikgPDwgMTkpCS8qIGJpdHMgMTk6MjcgKi8KKwl1MzIgX3BhZF9jbGlwX3N0YXJ0OworCXZvbGF0aWxlIHUzMiBjbGlwX3N0YXJ0OworCXUzMiBfcGFkX2NsaXBfZW5kOworCXZvbGF0aWxlIHUzMiBjbGlwX2VuZDsKKworI2RlZmluZSBWSU5PX0ZSQU1FUlRfUEFMCSgxPDwwKQkJCS8qIDA9TlRTQyAxPVBBTCAqLworI2RlZmluZSBWSU5PX0ZSQU1FUlRfUlQoeCkJKCgoeCkgJiAweDFmZmYpIDw8IDEpCS8qIGJpdHMgMToxMiAqLworCXUzMiBfcGFkX2ZyYW1lX3JhdGU7CisJdm9sYXRpbGUgdTMyIGZyYW1lX3JhdGU7CisKKwl1MzIgX3BhZF9maWVsZF9jb3VudGVyOworCXZvbGF0aWxlIHUzMiBmaWVsZF9jb3VudGVyOworCXUzMiBfcGFkX2xpbmVfc2l6ZTsKKwl2b2xhdGlsZSB1MzIgbGluZV9zaXplOworCXUzMiBfcGFkX2xpbmVfY291bnQ7CisJdm9sYXRpbGUgdTMyIGxpbmVfY291bnQ7CisJdTMyIF9wYWRfcGFnZV9pbmRleDsKKwl2b2xhdGlsZSB1MzIgcGFnZV9pbmRleDsKKwl1MzIgX3BhZF9uZXh0XzRfZGVzYzsKKwl2b2xhdGlsZSB1MzIgbmV4dF80X2Rlc2M7CisJdTMyIF9wYWRfc3RhcnRfZGVzY190Ymw7CisJdm9sYXRpbGUgdTMyIHN0YXJ0X2Rlc2NfdGJsOworCisjZGVmaW5lIFZJTk9fREVTQ19KVU1QCQkoMTw8MzApCisjZGVmaW5lIFZJTk9fREVTQ19TVE9QCQkoMTw8MzEpCisjZGVmaW5lIFZJTk9fREVTQ19WQUxJRAkJKDE8PDMyKQorCXUzMiBfcGFkX2Rlc2NfMDsKKwl2b2xhdGlsZSB1MzIgZGVzY18wOworCXUzMiBfcGFkX2Rlc2NfMTsKKwl2b2xhdGlsZSB1MzIgZGVzY18xOworCXUzMiBfcGFkX2Rlc2NfMjsKKwl2b2xhdGlsZSB1MzIgZGVzY18yOworCXUzMiBfcGFkX0JkZXNjXzM7CisJdm9sYXRpbGUgdTMyIGRlc2NfMzsKKworCXUzMiBfcGFkX2ZpZm9fdGhyZXM7CisJdm9sYXRpbGUgdTMyIGZpZm9fdGhyZXM7CisJdTMyIF9wYWRfZmlmb19yZWFkOworCXZvbGF0aWxlIHUzMiBmaWZvX3JlYWQ7CisJdTMyIF9wYWRfZmlmb193cml0ZTsKKwl2b2xhdGlsZSB1MzIgZmlmb193cml0ZTsKK307CisKK3N0cnVjdCBzZ2lfdmlubyB7CisjZGVmaW5lIFZJTk9fQ0hJUF9JRAkJMHhiCisjZGVmaW5lIFZJTk9fUkVWX05VTSh4KQkJKCh4KSAmIDB4MGYpCisjZGVmaW5lIFZJTk9fSURfVkFMVUUoeCkJKCgoeCkgJiAweGYwKSA+PiA0KQorCXUzMiBfcGFkX3Jldl9pZDsKKwl2b2xhdGlsZSB1MzIgcmV2X2lkOworCisjZGVmaW5lIFZJTk9fQ1RSTF9MSVRUTEVfRU5ESUFOCQkoMTw8MCkKKyNkZWZpbmUgVklOT19DVFJMX0FfRklFTERfVFJBTlNfSU5UCSgxPDwxKQkvKiBGaWVsZCB0cmFuc2ZlcnJlZCBpbnQgKi8KKyNkZWZpbmUgVklOT19DVFJMX0FfRklGT19PRl9JTlQJCSgxPDwyKQkvKiBGSUZPIG92ZXJmbG93IGludCAqLworI2RlZmluZSBWSU5PX0NUUkxfQV9FTkRfREVTQ19UQkxfSU5UCSgxPDwzKQkvKiBFbmQgb2YgZGVzYyB0YWJsZSBpbnQgKi8KKyNkZWZpbmUgVklOT19DVFJMX0FfSU5UCQkJKFZJTk9fQ1RSTF9BX0ZJRUxEX1RSQU5TX0lOVCB8IFwKKwkJCQkJIFZJTk9fQ1RSTF9BX0ZJRk9fT0ZfSU5UIHwgXAorCQkJCQkgVklOT19DVFJMX0FfRU5EX0RFU0NfVEJMX0lOVCkKKyNkZWZpbmUgVklOT19DVFJMX0JfRklFTERfVFJBTlNfSU5UCSgxPDw0KQkvKiBGaWVsZCB0cmFuc2ZlcnJlZCBpbnQgKi8KKyNkZWZpbmUgVklOT19DVFJMX0JfRklGT19PRl9JTlQJCSgxPDw1KQkvKiBGSUZPIG92ZXJmbG93IGludCAqLworI2RlZmluZSBWSU5PX0NUUkxfQl9FTkRfREVTQ19UQkxfSU5UCSgxPDw2KQkvKiBFbmQgb2YgZGVzYyB0YWJsZSBpbnQgKi8KKyNkZWZpbmUgVklOT19DVFJMX0JfSU5UCQkJKFZJTk9fQ1RSTF9CX0ZJRUxEX1RSQU5TX0lOVCB8IFwKKwkJCQkJIFZJTk9fQ1RSTF9CX0ZJRk9fT0ZfSU5UIHwgXAorCQkJCQkgVklOT19DVFJMX0JfRU5EX0RFU0NfVEJMX0lOVCkKKyNkZWZpbmUgVklOT19DVFJMX0FfRE1BX0VOQkwJCSgxPDw3KQorI2RlZmluZSBWSU5PX0NUUkxfQV9JTlRFUkxFQVZFX0VOQkwJKDE8PDgpCisjZGVmaW5lIFZJTk9fQ1RSTF9BX1NZTkNfRU5CTAkJKDE8PDkpCisjZGVmaW5lIFZJTk9fQ1RSTF9BX1NFTEVDVAkJKDE8PDEwKQkvKiAxPUQxIDA9UGhpbGlwcyAqLworI2RlZmluZSBWSU5PX0NUUkxfQV9SR0IJCQkoMTw8MTEpCS8qIDE9UkdCIDA9WVVWICovCisjZGVmaW5lIFZJTk9fQ1RSTF9BX0xVTUFfT05MWQkJKDE8PDEyKQorI2RlZmluZSBWSU5PX0NUUkxfQV9ERUNfRU5CTAkJKDE8PDEzKQkvKiBEZWNpbWF0aW9uICovCisjZGVmaW5lIFZJTk9fQ1RSTF9BX0RFQ19TQ0FMRV9NQVNLCTB4MWMwMDAJLyogYml0cyAxNDoxNyAqLworI2RlZmluZSBWSU5PX0NUUkxfQV9ERUNfU0NBTEVfU0hJRlQJKDE0KQorI2RlZmluZSBWSU5PX0NUUkxfQV9ERUNfSE9SX09OTFkJKDE8PDE3KQkvKiBIb3Jpem9udGFsIG9ubHkgKi8KKyNkZWZpbmUgVklOT19DVFJMX0FfRElUSEVSCQkoMTw8MTgpCS8qIDI0IC0+IDggYml0IGRpdGhlciAqLworI2RlZmluZSBWSU5PX0NUUkxfQl9ETUFfRU5CTAkJKDE8PDE5KQorI2RlZmluZSBWSU5PX0NUUkxfQl9JTlRFUkxFQVZFX0VOQkwJKDE8PDIwKQorI2RlZmluZSBWSU5PX0NUUkxfQl9TWU5DX0VOQkwJCSgxPDwyMSkKKyNkZWZpbmUgVklOT19DVFJMX0JfU0VMRUNUCQkoMTw8MjIpCS8qIDE9RDEgMD1QaGlsaXBzICovCisjZGVmaW5lIFZJTk9fQ1RSTF9CX1JHQgkJCSgxPDwyMykJLyogMT1SR0IgMD1ZVVYgKi8KKyNkZWZpbmUgVklOT19DVFJMX0JfTFVNQV9PTkxZCQkoMTw8MjQpCisjZGVmaW5lIFZJTk9fQ1RSTF9CX0RFQ19FTkJMCQkoMTw8MjUpCS8qIERlY2ltYXRpb24gKi8KKyNkZWZpbmUgVklOT19DVFJMX0JfREVDX1NDQUxFX01BU0sJMHgxYzAwMDAwMAkvKiBiaXRzIDI2OjI4ICovCisjZGVmaW5lIFZJTk9fQ1RSTF9CX0RFQ19TQ0FMRV9TSElGVAkoMjYpCisjZGVmaW5lIFZJTk9fQ1RSTF9CX0RFQ19IT1JfT05MWQkoMTw8MjkpCS8qIERlY2ltYXRpb24gaG9yaXpvbnRhbCBvbmx5ICovCisjZGVmaW5lIFZJTk9fQ1RSTF9CX0RJVEhFUgkJKDE8PDMwKQkvKiBDaGFuQiAyNCAtPiA4IGJpdCBkaXRoZXIgKi8KKwl1MzIgX3BhZF9jb250cm9sOworCXZvbGF0aWxlIHUzMiBjb250cm9sOworCisjZGVmaW5lIFZJTk9fSU5UU1RBVF9BX0ZJRUxEX1RSQU5TCSgxPDwwKQkvKiBGaWVsZCB0cmFuc2ZlcnJlZCBpbnQgKi8KKyNkZWZpbmUgVklOT19JTlRTVEFUX0FfRklGT19PRgkJKDE8PDEpCS8qIEZJRk8gb3ZlcmZsb3cgaW50ICovCisjZGVmaW5lIFZJTk9fSU5UU1RBVF9BX0VORF9ERVNDX1RCTAkoMTw8MikJLyogRW5kIG9mIGRlc2MgdGFibGUgaW50ICovCisjZGVmaW5lIFZJTk9fSU5UU1RBVF9BCQkJKFZJTk9fSU5UU1RBVF9BX0ZJRUxEX1RSQU5TIHwgXAorCQkJCQkgVklOT19JTlRTVEFUX0FfRklGT19PRiB8IFwKKwkJCQkJIFZJTk9fSU5UU1RBVF9BX0VORF9ERVNDX1RCTCkKKyNkZWZpbmUgVklOT19JTlRTVEFUX0JfRklFTERfVFJBTlMJKDE8PDMpCS8qIEZpZWxkIHRyYW5zZmVycmVkIGludCAqLworI2RlZmluZSBWSU5PX0lOVFNUQVRfQl9GSUZPX09GCQkoMTw8NCkJLyogRklGTyBvdmVyZmxvdyBpbnQgKi8KKyNkZWZpbmUgVklOT19JTlRTVEFUX0JfRU5EX0RFU0NfVEJMCSgxPDw1KQkvKiBFbmQgb2YgZGVzYyB0YWJsZSBpbnQgKi8KKyNkZWZpbmUgVklOT19JTlRTVEFUX0IJCQkoVklOT19JTlRTVEFUX0JfRklFTERfVFJBTlMgfCBcCisJCQkJCSBWSU5PX0lOVFNUQVRfQl9GSUZPX09GIHwgXAorCQkJCQkgVklOT19JTlRTVEFUX0JfRU5EX0RFU0NfVEJMKQorCXUzMiBfcGFkX2ludHJfc3RhdHVzOworCXZvbGF0aWxlIHUzMiBpbnRyX3N0YXR1czsKKworCXUzMiBfcGFkX2kyY19jb250cm9sOworCXZvbGF0aWxlIHUzMiBpMmNfY29udHJvbDsKKwl1MzIgX3BhZF9pMmNfZGF0YTsKKwl2b2xhdGlsZSB1MzIgaTJjX2RhdGE7CisKKwlzdHJ1Y3Qgc2dpX3Zpbm9fY2hhbm5lbCBhOworCXN0cnVjdCBzZ2lfdmlub19jaGFubmVsIGI7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkNmM5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jCkBAIC0wLDAgKzEsNzU0IEBACisvKiAKKyAqIHZweDMyMjBhLCB2cHgzMjE2YiAmIHZweDMyMTRjIHZpZGVvIGRlY29kZXIgZHJpdmVyIHZlcnNpb24gMC4wLjEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTGF1cmVudCBQaW5jaGFydCA8bHBpbmNoYXJ0QGZyZWVnYXRlcy5iZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4KKworI2RlZmluZSBJMkNfTkFNRSh4KSAoeCktPm5hbWUKKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgorCisjZGVmaW5lIEkyQ19WUFgzMjIwICAgICAgICAweDg2CisjZGVmaW5lIFZQWDMyMjBfREVCVUcJS0VSTl9ERUJVRyAidnB4MzIyMDogIgorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC0xKSIpOworCisjZGVmaW5lIGRwcmludGsobnVtLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGRlYnVnID49IG51bSkgXAorCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVlBYX1RJTUVPVVRfQ09VTlQgIDEwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCB2cHgzMjIwIHsKKwl1bnNpZ25lZCBjaGFyIHJlZ1syNTVdOworCisJaW50IG5vcm07CisJaW50IGlucHV0OworCWludCBlbmFibGU7CisJaW50IGJyaWdodDsKKwlpbnQgY29udHJhc3Q7CisJaW50IGh1ZTsKKwlpbnQgc2F0OworfTsKKworc3RhdGljIGNoYXIgKmlucHV0c1tdID0geyAiaW50ZXJuYWwiLCAiY29tcG9zaXRlIiwgInN2aWRlbyIgfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit2cHgzMjIwX3dyaXRlIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCSAgICAgICB1OCAgICAgICAgICAgICAgICAgcmVnLAorCSAgICAgICB1OCAgICAgICAgICAgICAgICAgdmFsdWUpCit7CisJc3RydWN0IHZweDMyMjAgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRlY29kZXItPnJlZ1tyZWddID0gdmFsdWU7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3ZweDMyMjBfcmVhZCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkgICAgICB1OCAgICAgICAgICAgICAgICAgcmVnKQoreworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCitzdGF0aWMgaW50Cit2cHgzMjIwX2ZwX3N0YXR1cyAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBWUFhfVElNRU9VVF9DT1VOVDsgaSsrKSB7CisJCXN0YXR1cyA9IHZweDMyMjBfcmVhZChjbGllbnQsIDB4MjkpOworCisJCWlmICghKHN0YXR1cyAmIDQpKQorCQkJcmV0dXJuIDA7CisKKwkJdWRlbGF5KDEwKTsKKworCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK3ZweDMyMjBfZnBfd3JpdGUgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCSAgdTggICAgICAgICAgICAgICAgIGZwYWRkciwKKwkJICB1MTYgICAgICAgICAgICAgICAgZGF0YSkKK3sKKwkvKiBXcml0ZSB0aGUgMTYtYml0IGFkZHJlc3MgdG8gdGhlIEZQV1IgcmVnaXN0ZXIgKi8KKwlpZiAoaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDB4MjcsIHN3YWIxNihmcGFkZHIpKSA9PSAtMSkgeworCQlkcHJpbnRrKDEsIFZQWDMyMjBfREVCVUcgIiVzOiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh2cHgzMjIwX2ZwX3N0YXR1cyhjbGllbnQpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJLyogV3JpdGUgdGhlIDE2LWJpdCBkYXRhIHRvIHRoZSBGUERBVCByZWdpc3RlciAqLworCWlmIChpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMHgyOCwgc3dhYjE2KGRhdGEpKSA9PSAtMSkgeworCQlkcHJpbnRrKDEsIFZQWDMyMjBfREVCVUcgIiVzOiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTE2Cit2cHgzMjIwX2ZwX3JlYWQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCSB1MTYgICAgICAgICAgICAgICAgZnBhZGRyKQoreworCXMxNiBkYXRhOworCisJLyogV3JpdGUgdGhlIDE2LWJpdCBhZGRyZXNzIHRvIHRoZSBGUFJEIHJlZ2lzdGVyICovCisJaWYgKGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAweDI2LCBzd2FiMTYoZnBhZGRyKSkgPT0gLTEpIHsKKwkJZHByaW50aygxLCBWUFgzMjIwX0RFQlVHICIlczogZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodnB4MzIyMF9mcF9zdGF0dXMoY2xpZW50KSA8IDApCisJCXJldHVybiAtMTsKKworCS8qIFJlYWQgdGhlIDE2LWJpdCBkYXRhIGZyb20gdGhlIEZQREFUIHJlZ2lzdGVyICovCisJZGF0YSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDB4MjgpOworCWlmIChkYXRhID09IC0xKSB7CisJCWRwcmludGsoMSwgVlBYMzIyMF9ERUJVRyAiJXM6IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHN3YWIxNihkYXRhKTsKK30KKworc3RhdGljIGludAordnB4MzIyMF93cml0ZV9ibG9jayAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICAgICBjb25zdCB1OCAgICAgICAgICAqZGF0YSwKKwkJICAgICB1bnNpZ25lZCBpbnQgICAgICAgbGVuKQoreworCXU4IHJlZzsKKwlpbnQgcmV0ID0gLTE7CisKKwl3aGlsZSAobGVuID49IDIpIHsKKwkJcmVnID0gKmRhdGErKzsKKwkJaWYgKChyZXQgPQorCQkgICAgIHZweDMyMjBfd3JpdGUoY2xpZW50LCByZWcsICpkYXRhKyspKSA8IDApCisJCQlicmVhazsKKwkJbGVuIC09IDI7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordnB4MzIyMF93cml0ZV9mcF9ibG9jayAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICAgICAgICBjb25zdCB1MTYgICAgICAgICAqZGF0YSwKKwkJICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgbGVuKQoreworCXU4IHJlZzsKKwlpbnQgcmV0ID0gMDsKKworCXdoaWxlIChsZW4gPiAxKSB7CisJCXJlZyA9ICpkYXRhKys7CisJCXJldCB8PSB2cHgzMjIwX2ZwX3dyaXRlKGNsaWVudCwgcmVnLCAqZGF0YSsrKTsKKwkJbGVuIC09IDI7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW5pdF9udHNjW10gPSB7CisJMHgxYywgMHgwMCwJCS8qIE5UU0MgdGludCBhbmdsZSAqLworCTB4ODgsIDE3LAkJLyogV2luZG93IDEgdmVydGljYWwgKi8KKwkweDg5LCAyNDAsCQkvKiBWZXJ0aWNhbCBsaW5lcyBpbiAqLworCTB4OGEsIDI0MCwJCS8qIFZlcnRpY2FsIGxpbmVzIG91dCAqLworCTB4OGIsIDAwMCwJCS8qIEhvcml6b250YWwgYmVnaW4gKi8KKwkweDhjLCA2NDAsCQkvKiBIb3Jpem9udGFsIGxlbmd0aCAqLworCTB4OGQsIDY0MCwJCS8qIE51bWJlciBvZiBwaXhlbHMgKi8KKwkweDhmLCAweGMwMCwJCS8qIERpc2FibGUgd2luZG93IDIgKi8KKwkweGYwLCAweDE3MywJCS8qIDEzLjUgTUh6IHRyYW5zcG9ydCwgRm9yY2VkCisJCQkJICogbW9kZSwgbGF0Y2ggd2luZG93cyAqLworCTB4ZjIsIDB4MTMsCQkvKiBOVFNDIE0sIGNvbXBvc2l0ZSBpbnB1dCAqLworCTB4ZTcsIDB4MWUxLAkJLyogRW5hYmxlIHZlcnRpY2FsIHN0YW5kYXJkCisJCQkJICogbG9ja2luZyBAIDI0MCBsaW5lcyAqLworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGluaXRfcGFsW10gPSB7CisJMHg4OCwgMjMsCQkvKiBXaW5kb3cgMSB2ZXJ0aWNhbCBiZWdpbiAqLworCTB4ODksIDI4OCArIDE2LAkJLyogVmVydGljYWwgbGluZXMgaW4gKDE2IGxpbmVzCisJCQkJICogc2tpcHBlZCBieSB0aGUgVkZFKSAqLworCTB4OGEsIDI4OCArIDE2LAkJLyogVmVydGljYWwgbGluZXMgb3V0ICgxNiBsaW5lcworCQkJCSAqIHNraXBwZWQgYnkgdGhlIFZGRSkgKi8KKwkweDhiLCAxNiwJCS8qIEhvcml6b250YWwgYmVnaW4gKi8KKwkweDhjLCA3NjgsCQkvKiBIb3Jpem9udGFsIGxlbmd0aCAqLworCTB4OGQsIDc4NCwgCQkvKiBOdW1iZXIgb2YgcGl4ZWxzCisJCQkJICogTXVzdCBiZSA+PSBIb3Jpem9udGFsIGJlZ2luICsgSG9yaXpvbnRhbCBsZW5ndGggKi8KKwkweDhmLCAweGMwMCwJCS8qIERpc2FibGUgd2luZG93IDIgKi8KKwkweGYwLCAweDE3NywJCS8qIDEzLjUgTUh6IHRyYW5zcG9ydCwgRm9yY2VkCisJCQkJICogbW9kZSwgbGF0Y2ggd2luZG93cyAqLworCTB4ZjIsIDB4M2QxLAkJLyogUEFMIEIsRyxILEksIGNvbXBvc2l0ZSBpbnB1dCAqLworCTB4ZTcsIDB4MjYxLAkJLyogUEFML1NFQ0FNIHNldCB0byAyODggKyAxNiBsaW5lcyAKKwkJCQkgKiBjaGFuZ2UgdG8gMHgyNDEgZm9yIDI4OCBsaW5lcyAqLworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGluaXRfc2VjYW1bXSA9IHsKKwkweDg4LCAyMyAgLSAxNiwJCS8qIFdpbmRvdyAxIHZlcnRpY2FsIGJlZ2luICovCisJMHg4OSwgMjg4ICsgMTYsCQkvKiBWZXJ0aWNhbCBsaW5lcyBpbiAoMTYgbGluZXMKKwkJCQkgKiBza2lwcGVkIGJ5IHRoZSBWRkUpICovCisJMHg4YSwgMjg4ICsgMTYsCQkvKiBWZXJ0aWNhbCBsaW5lcyBvdXQgKDE2IGxpbmVzCisJCQkJICogc2tpcHBlZCBieSB0aGUgVkZFKSAqLworCTB4OGIsIDE2LAkJLyogSG9yaXpvbnRhbCBiZWdpbiAqLworCTB4OGMsIDc2OCwJCS8qIEhvcml6b250YWwgbGVuZ3RoICovCisJMHg4ZCwgNzg0LAkJLyogTnVtYmVyIG9mIHBpeGVscworCQkJCSAqIE11c3QgYmUgPj0gSG9yaXpvbnRhbCBiZWdpbiArIEhvcml6b250YWwgbGVuZ3RoICovCisJMHg4ZiwgMHhjMDAsCQkvKiBEaXNhYmxlIHdpbmRvdyAyICovCisJMHhmMCwgMHgxNzcsCQkvKiAxMy41IE1IeiB0cmFuc3BvcnQsIEZvcmNlZAorCQkJCSAqIG1vZGUsIGxhdGNoIHdpbmRvd3MgKi8KKwkweGYyLCAweDNkNSwJCS8qIFNFQ0FNLCBjb21wb3NpdGUgaW5wdXQgKi8KKwkweGU3LCAweDI2MSwJCS8qIFBBTC9TRUNBTSBzZXQgdG8gMjg4ICsgMTYgbGluZXMgCisJCQkJICogY2hhbmdlIHRvIDB4MjQxIGZvciAyODggbGluZXMgKi8KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGluaXRfY29tbW9uW10gPSB7CisJMHhmMiwgMHgwMCwJCS8qIERpc2FibGUgYWxsIG91dHB1dHMgKi8KKwkweDMzLCAweDBkLAkJLyogTHVtYSA6IFZJTjIsIENocm9tYSA6IENJTgorCQkJCSAqIChjbGFtcCBvZmYpICovCisJMHhkOCwgMHhhOCwJCS8qIEhSRUYvVlJFRiBhY3RpdmUgaGlnaCwgVlJFRgorCQkJCSAqIHB1bHNlID0gMiwgT2RkL0V2ZW4gZmxhZyAqLworCTB4MjAsIDB4MDMsCQkvKiBJRiBjb21wZW5zYXRpb24gMGRCL29jdCAqLworCTB4ZTAsIDB4ZmYsCQkvKiBPcGVuIHVwIGFsbCBjb21wYXJhdG9ycyAqLworCTB4ZTEsIDB4MDAsCisJMHhlMiwgMHg3ZiwKKwkweGUzLCAweDgwLAorCTB4ZTQsIDB4N2YsCisJMHhlNSwgMHg4MCwKKwkweGU2LCAweDAwLAkJLyogQnJpZ2h0bmVzcyBzZXQgdG8gMCAqLworCTB4ZTcsIDB4ZTAsCQkvKiBDb250cmFzdCB0byAxLjAsIG5vaXNlIHNoYXBpbmcKKwkJCQkgKiAxMCB0byA4IDItYml0IGVycm9yIGRpZmZ1c2lvbiAqLworCTB4ZTgsIDB4ZjgsCQkvKiBZVVY0MjIsIENiQ3IgYmluYXJ5IG9mZnNldCwKKwkJCQkgKiAuLi4gKHAuMzIpICovCisJMHhlYSwgMHgxOCwJCS8qIExMQzIgY29ubmVjdGVkLCBvdXRwdXQgRklGTworCQkJCSAqIHJlc2V0IHdpdGggVkFDVGludGVybiAqLworCTB4ZjAsIDB4OGEsCQkvKiBIYWxmIGZ1bGwgbGV2ZWwgdG8gMTAsIGJ1cworCQkJCSAqIHNodWZmbGVyIFs3OjAsIDIzOjE2LCAxNTo4XSAqLworCTB4ZjEsIDB4MTgsCQkvKiBTaW5nbGUgY2xvY2ssIHN5bmMgbW9kZSwgbm8KKwkJCQkgKiBGRSBkZWxheSwgbm8gSExFTiBjb3VudGVyICovCisJMHhmOCwgMHgxMiwJCS8qIFBvcnQgQSwgUElYQ0xLLCBIRiMgJiBGRSMKKwkJCQkgKiBzdHJlbmd0aCB0byAyICovCisJMHhmOSwgMHgyNCwJCS8qIFBvcnQgQiwgSFJFRiwgVlJFRiwgUFJFRiAmCisJCQkJICogQUxQSEEgc3RyZW5ndGggdG8gNCAqLworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGluaXRfZnBbXSA9IHsKKwkweDU5LCAwLAorCTB4YTAsIDIwNzAsCQkvKiBBQ0MgcmVmZXJlbmNlICovCisJMHhhMywgMCwKKwkweGE0LCAwLAorCTB4YTgsIDMwLAorCTB4YjIsIDc2OCwKKwkweGJlLCAyNywKKwkweDU4LCAwLAorCTB4MjYsIDAsCisJMHg0YiwgMHgyOTgsCQkvKiBQTEwgZ2FpbiAqLworfTsKKworc3RhdGljIHZvaWQKK3ZweDMyMjBfZHVtcF9pMmMgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGxlbiA9IHNpemVvZihpbml0X2NvbW1vbik7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSA9IGluaXRfY29tbW9uOworCisJd2hpbGUgKGxlbiA+IDEpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9ERUJVRyAidnB4MzIxNmIgaTJjIHJlZyAweCUwMnggZGF0YSAweCUwMnhcbiIsCisJCQkqZGF0YSwgdnB4MzIyMF9yZWFkKGNsaWVudCwgKmRhdGEpKTsKKwkJZGF0YSArPSAyOworCQlsZW4gLT0gMjsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3ZweDMyMjBfY29tbWFuZCAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJIHVuc2lnbmVkIGludCAgICAgICBjbWQsCisJCSB2b2lkICAgICAgICAgICAgICAqYXJnKQoreworCXN0cnVjdCB2cHgzMjIwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgMDoKKwl7CisJCXZweDMyMjBfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0X2NvbW1vbiwKKwkJCQkgICAgc2l6ZW9mKGluaXRfY29tbW9uKSk7CisJCXZweDMyMjBfd3JpdGVfZnBfYmxvY2soY2xpZW50LCBpbml0X2ZwLAorCQkJCSAgICAgICBzaXplb2YoaW5pdF9mcCkgPj4gMSk7CisJCXN3aXRjaCAoZGVjb2Rlci0+bm9ybSkgeworCQkJCisJCWNhc2UgVklERU9fTU9ERV9OVFNDOgorCQkJdnB4MzIyMF93cml0ZV9mcF9ibG9jayhjbGllbnQsIGluaXRfbnRzYywKKwkJCQkJICAgICAgIHNpemVvZihpbml0X250c2MpID4+IDEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJCXZweDMyMjBfd3JpdGVfZnBfYmxvY2soY2xpZW50LCBpbml0X3BhbCwKKwkJCQkgICAgICAgCSAgICAgICBzaXplb2YoaW5pdF9wYWwpID4+IDEpOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fTU9ERV9TRUNBTToKKwkJCXZweDMyMjBfd3JpdGVfZnBfYmxvY2soY2xpZW50LCBpbml0X3NlY2FtLAorCQkJCQkgICAgICAgc2l6ZW9mKGluaXRfc2VjYW0pID4+IDEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2cHgzMjIwX3dyaXRlX2ZwX2Jsb2NrKGNsaWVudCwgaW5pdF9wYWwsCisJCQkJICAgICAgIAkgICAgICAgc2l6ZW9mKGluaXRfcGFsKSA+PiAxKTsKKwkJCWJyZWFrOworCQl9CisJfQkJCisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX0RVTVA6CisJeworCQl2cHgzMjIwX2R1bXBfaTJjKGNsaWVudCk7CisJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9HRVRfQ0FQQUJJTElUSUVTOgorCXsKKwkJc3RydWN0IHZpZGVvX2RlY29kZXJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOworCisJCWRwcmludGsoMSwgS0VSTl9ERUJVRyAiJXM6IERFQ09ERVJfR0VUX0NBUEFCSUxJVElFU1xuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCkpOworCisJCWNhcC0+ZmxhZ3MgPSBWSURFT19ERUNPREVSX1BBTCB8CisJCQkgICAgIFZJREVPX0RFQ09ERVJfTlRTQyB8CisJCQkgICAgIFZJREVPX0RFQ09ERVJfU0VDQU0gfAorCQkJICAgICBWSURFT19ERUNPREVSX0FVVE8gfAorCQkJICAgICBWSURFT19ERUNPREVSX0NDSVI7CisJCWNhcC0+aW5wdXRzID0gMzsKKwkJY2FwLT5vdXRwdXRzID0gMTsKKwl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX0dFVF9TVEFUVVM6CisJeworCQlpbnQgcmVzID0gMCwgc3RhdHVzOworCisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogREVDT0RFUl9HRVRfU1RBVFVTXG4iLAorCQkJSTJDX05BTUUoY2xpZW50KSk7CisKKwkJc3RhdHVzID0gdnB4MzIyMF9mcF9yZWFkKGNsaWVudCwgMHgwZjMpOworCisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogc3RhdHVzOiAweCUwNHhcbiIsIEkyQ19OQU1FKGNsaWVudCksCisJCQlzdGF0dXMpOworCisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlpZiAoKHN0YXR1cyAmIDB4MjApID09IDApIHsKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19HT09EIHwgREVDT0RFUl9TVEFUVVNfQ09MT1I7CisKKwkJCXN3aXRjaCAoc3RhdHVzICYgMHgxOCkgeworCisJCQljYXNlIDB4MDA6CisJCQljYXNlIDB4MTA6CisJCQljYXNlIDB4MTQ6CisJCQljYXNlIDB4MTg6CisJCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX1BBTDsKKwkJCQlicmVhazsKKworCQkJY2FzZSAweDA4OgorCQkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19TRUNBTTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAweDA0OgorCQkJY2FzZSAweDBjOgorCQkJY2FzZSAweDFjOgorCQkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19OVFNDOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJKihpbnQgKikgYXJnID0gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIERFQ09ERVJfU0VUX05PUk06CisJeworCQlpbnQgKmlhcmcgPSBhcmcsIGRhdGE7CisKKwkJZHByaW50aygxLCBLRVJOX0RFQlVHICIlczogREVDT0RFUl9TRVRfTk9STSAlZFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksICppYXJnKTsKKwkJc3dpdGNoICgqaWFyZykgeworCisJCWNhc2UgVklERU9fTU9ERV9OVFNDOgorCQkJdnB4MzIyMF93cml0ZV9mcF9ibG9jayhjbGllbnQsIGluaXRfbnRzYywKKwkJCQkJICAgICAgIHNpemVvZihpbml0X250c2MpID4+IDEpOworCQkJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiBub3JtIHN3aXRjaGVkIHRvIE5UU0NcbiIsCisJCQkJSTJDX05BTUUoY2xpZW50KSk7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfUEFMOgorCQkJdnB4MzIyMF93cml0ZV9mcF9ibG9jayhjbGllbnQsIGluaXRfcGFsLAorCQkJCQkgICAgICAgc2l6ZW9mKGluaXRfcGFsKSA+PiAxKTsKKwkJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogbm9ybSBzd2l0Y2hlZCB0byBQQUxcbiIsCisJCQkJSTJDX05BTUUoY2xpZW50KSk7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfU0VDQU06CisJCQl2cHgzMjIwX3dyaXRlX2ZwX2Jsb2NrKGNsaWVudCwgaW5pdF9zZWNhbSwKKwkJCQkJICAgICAgIHNpemVvZihpbml0X3NlY2FtKSA+PiAxKTsKKwkJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogbm9ybSBzd2l0Y2hlZCB0byBTRUNBTVxuIiwKKwkJCQlJMkNfTkFNRShjbGllbnQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVklERU9fTU9ERV9BVVRPOgorCQkJLyogRklYTUUgVGhpcyBpcyBvbmx5IHByZWxpbWluYXJ5IHN1cHBvcnQgKi8KKwkJCWRhdGEgPSB2cHgzMjIwX2ZwX3JlYWQoY2xpZW50LCAweGYyKSAmIDB4MjA7CisJCQl2cHgzMjIwX2ZwX3dyaXRlKGNsaWVudCwgMHhmMiwgMHgwMGMwIHwgZGF0YSk7CisJCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IG5vcm0gc3dpdGNoZWQgdG8gQXV0b1xuIiwKKwkJCQlJMkNfTkFNRShjbGllbnQpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9CisJCWRlY29kZXItPm5vcm0gPSAqaWFyZzsKKwl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX1NFVF9JTlBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZywgZGF0YTsKKworCQkvKiBSSjogICppYXJnID0gMDogU1Q4IChQQ1RWKSBpbnB1dAorCQkgKmlhcmcgPSAxOiBDT01QT1NJVEUgIGlucHV0CisJCSAqaWFyZyA9IDI6IFNWSFMgICAgICAgaW5wdXQgICovCisKKwkJY29uc3QgaW50IGlucHV0WzNdWzJdID0geworCQkJezB4MGMsIDB9LAorCQkJezB4MGQsIDB9LAorCQkJezB4MGUsIDF9CisJCX07CisKKwkJaWYgKCppYXJnIDwgMCB8fCAqaWFyZyA+IDIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IGlucHV0IHN3aXRjaGVkIHRvICVzXG4iLAorCQkJSTJDX05BTUUoY2xpZW50KSwgaW5wdXRzWyppYXJnXSk7CisKKwkJdnB4MzIyMF93cml0ZShjbGllbnQsIDB4MzMsIGlucHV0WyppYXJnXVswXSk7CisKKwkJZGF0YSA9IHZweDMyMjBfZnBfcmVhZChjbGllbnQsIDB4ZjIpICYgfigweDAwMjApOworCQlpZiAoZGF0YSA8IDApCisJCQlyZXR1cm4gZGF0YTsKKwkJLyogMHgwMDEwIGlzIHJlcXVpcmVkIHRvIGxhdGNoIHRoZSBzZXR0aW5nICovCisJCXZweDMyMjBfZnBfd3JpdGUoY2xpZW50LCAweGYyLAorCQkJCSBkYXRhIHwgKGlucHV0WyppYXJnXVsxXSA8PCA1KSB8IDB4MDAxMCk7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX1NFVF9PVVRQVVQ6CisJeworCQlpbnQgKmlhcmcgPSBhcmc7CisKKwkJLyogbm90IG11Y2ggY2hvaWNlIG9mIG91dHB1dHMgKi8KKwkJaWYgKCppYXJnICE9IDApIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9FTkFCTEVfT1VUUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCWRwcmludGsoMSwgS0VSTl9ERUJVRyAiJXM6IERFQ09ERVJfRU5BQkxFX09VVFBVVCAlZFxuIiwKKwkJCUkyQ19OQU1FKGNsaWVudCksICppYXJnKTsKKworCQl2cHgzMjIwX3dyaXRlKGNsaWVudCwgMHhmMiwgKCppYXJnID8gMHgxYiA6IDB4MDApKTsKKwl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX1NFVF9QSUNUVVJFOgorCXsKKwkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnBpYyA9IGFyZzsKKworCQlpZiAoZGVjb2Rlci0+YnJpZ2h0ICE9IHBpYy0+YnJpZ2h0bmVzcykgeworCQkJLyogV2Ugd2FudCAtMTI4IHRvIDEyOCB3ZSBnZXQgMC02NTUzNSAqLworCQkJZGVjb2Rlci0+YnJpZ2h0ID0gcGljLT5icmlnaHRuZXNzOworCQkJdnB4MzIyMF93cml0ZShjbGllbnQsIDB4ZTYsCisJCQkJICAgICAgKGRlY29kZXItPmJyaWdodCAtIDMyNzY4KSA+PiA4KTsKKwkJfQorCQlpZiAoZGVjb2Rlci0+Y29udHJhc3QgIT0gcGljLT5jb250cmFzdCkgeworCQkJLyogV2Ugd2FudCAwIHRvIDY0IHdlIGdldCAwLTY1NTM1ICovCisJCQkvKiBCaXQgNyBhbmQgOCBpcyBmb3Igbm9pc2Ugc2hhcGluZyAqLworCQkJZGVjb2Rlci0+Y29udHJhc3QgPSBwaWMtPmNvbnRyYXN0OworCQkJdnB4MzIyMF93cml0ZShjbGllbnQsIDB4ZTcsCisJCQkJICAgICAgKGRlY29kZXItPmNvbnRyYXN0ID4+IDEwKSArIDE5Mik7CisJCX0KKwkJaWYgKGRlY29kZXItPnNhdCAhPSBwaWMtPmNvbG91cikgeworCQkJLyogV2Ugd2FudCAwIHRvIDQwOTYgd2UgZ2V0IDAtNjU1MzUgKi8KKwkJCWRlY29kZXItPnNhdCA9IHBpYy0+Y29sb3VyOworCQkJdnB4MzIyMF9mcF93cml0ZShjbGllbnQsIDB4YTAsCisJCQkJCSBkZWNvZGVyLT5zYXQgPj4gNCk7CisJCX0KKwkJaWYgKGRlY29kZXItPmh1ZSAhPSBwaWMtPmh1ZSkgeworCQkJLyogV2Ugd2FudCAtNTEyIHRvIDUxMiB3ZSBnZXQgMC02NTUzNSAqLworCQkJZGVjb2Rlci0+aHVlID0gcGljLT5odWU7CisJCQl2cHgzMjIwX2ZwX3dyaXRlKGNsaWVudCwgMHgxYywKKwkJCQkJICgoZGVjb2Rlci0+aHVlIC0gMzI3NjgpID4+IDYpICYgMHhGRkYpOworCQl9CisJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit2cHgzMjIwX2luaXRfY2xpZW50IChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXZweDMyMjBfd3JpdGVfYmxvY2soY2xpZW50LCBpbml0X2NvbW1vbiwgc2l6ZW9mKGluaXRfY29tbW9uKSk7CisJdnB4MzIyMF93cml0ZV9mcF9ibG9jayhjbGllbnQsIGluaXRfZnAsIHNpemVvZihpbml0X2ZwKSA+PiAxKTsKKwkvKiBEZWZhdWx0IHRvIFBBTCAqLworCXZweDMyMjBfd3JpdGVfZnBfYmxvY2soY2xpZW50LCBpbml0X3BhbCwgc2l6ZW9mKGluaXRfcGFsKSA+PiAxKTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2xpZW50IG1hbmFnbWVudCBjb2RlCisgKi8KKworLyoKKyAqIEdlbmVyaWMgaTJjIHByb2JlCisgKiBjb25jZXJuaW5nIHRoZSBhZGRyZXNzZXM6IGkyYyB3YW50cyA3IGJpdCAod2l0aG91dCB0aGUgci93IGJpdCksIHNvICc+PjEnCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPQorICAgIHsgSTJDX1ZQWDMyMjAgPj4gMSwgKEkyQ19WUFgzMjIwID4+IDEpICsgNCwKKwlJMkNfQ0xJRU5UX0VORAorfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjX3JhbmdlW10gPSB7IEkyQ19DTElFTlRfRU5EIH07CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHJvYmVfcmFuZ2VbMl0gPSB7IEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGlnbm9yZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlX3JhbmdlWzJdID0geyBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZVsyXSA9IHsgSTJDX0NMSUVOVF9FTkQgLCBJMkNfQ0xJRU5UX0VORCB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0geworCS5ub3JtYWxfaTJjCQk9IG5vcm1hbF9pMmMsCisJLm5vcm1hbF9pMmNfcmFuZ2UJPSBub3JtYWxfaTJjX3JhbmdlLAorCS5wcm9iZQkJCT0gcHJvYmUsCisJLnByb2JlX3JhbmdlCQk9IHByb2JlX3JhbmdlLAorCS5pZ25vcmUJCQk9IGlnbm9yZSwKKwkuaWdub3JlX3JhbmdlCQk9IGlnbm9yZV9yYW5nZSwKKwkuZm9yY2UJCQk9IGZvcmNlCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdnB4MzIyMF9pMmNfZHJpdmVyOworCitzdGF0aWMgaW50Cit2cHgzMjIwX2RldGFjaF9jbGllbnQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHZweDMyMjAgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoZGVjb2Rlcik7CisJa2ZyZWUoY2xpZW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit2cHgzMjIwX2RldGVjdF9jbGllbnQgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJICAgICAgIGludCAgICAgICAgICAgICAgICAgYWRkcmVzcywKKwkJICAgICAgIGludCAgICAgICAgICAgICAgICAga2luZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IHZweDMyMjAgKmRlY29kZXI7CisKKwlkcHJpbnRrKDEsIFZQWDMyMjBfREVCVUcgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBDaGVjayBpZiB0aGUgYWRhcHRlciBzdXBwb3J0cyB0aGUgbmVlZGVkIGZlYXR1cmVzICovCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eQorCSAgICAoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKKwkJcmV0dXJuIDA7CisKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmIChjbGllbnQgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKKworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZ2cHgzMjIwX2kyY19kcml2ZXI7CisJY2xpZW50LT5mbGFncyA9IEkyQ19DTElFTlRfQUxMT1dfVVNFOworCisJLyogQ2hlY2sgZm9yIG1hbnVmYWN0dXJlIElEIGFuZCBwYXJ0IG51bWJlciAqLworCWlmIChraW5kIDwgMCkgeworCQl1OCBpZDsKKwkJdTE2IHBuOworCisJCWlkID0gdnB4MzIyMF9yZWFkKGNsaWVudCwgMHgwMCk7CisJCWlmIChpZCAhPSAweGVjKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9JTkZPCisJCQkJInZweDMyMjBfYXR0YWNoOiBXcm9uZyBtYW51ZmFjdHVyZXIgSUQgKDB4JTAyeClcbiIsCisJCQkJaWQpOworCQkJa2ZyZWUoY2xpZW50KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcG4gPSAodnB4MzIyMF9yZWFkKGNsaWVudCwgMHgwMikgPDwgOCkgKworCQkgICAgdnB4MzIyMF9yZWFkKGNsaWVudCwgMHgwMSk7CisJCXN3aXRjaCAocG4pIHsKKwkJY2FzZSAweDQ2ODA6CisJCQlzdHJsY3B5KEkyQ19OQU1FKGNsaWVudCksICJ2cHgzMjIwYSIsCisJCQkJc2l6ZW9mKEkyQ19OQU1FKGNsaWVudCkpKTsKKwkJCWJyZWFrOworCQljYXNlIDB4NDI2MDoKKwkJCXN0cmxjcHkoSTJDX05BTUUoY2xpZW50KSwgInZweDMyMTZiIiwKKwkJCQlzaXplb2YoSTJDX05BTUUoY2xpZW50KSkpOworCQkJYnJlYWs7CisJCWNhc2UgMHg0MjgwOgorCQkJc3RybGNweShJMkNfTkFNRShjbGllbnQpLCAidnB4MzIxNGMiLAorCQkJCXNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0lORk8gCisJCQkJIiVzOiBXcm9uZyBwYXJ0IG51bWJlciAoMHglMDR4KVxuIiwKKwkJCQlfX2Z1bmNfXywgcG4pOworCQkJa2ZyZWUoY2xpZW50KTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJc3RybGNweShJMkNfTkFNRShjbGllbnQpLCAiZm9yY2VkIHZweDMyeHgiLAorCQkJc2l6ZW9mKEkyQ19OQU1FKGNsaWVudCkpKTsKKwl9CisKKwlkZWNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZweDMyMjApLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGVjb2RlciA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZGVjb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCB2cHgzMjIwKSk7CisJZGVjb2Rlci0+bm9ybSA9IFZJREVPX01PREVfUEFMOworCWRlY29kZXItPmlucHV0ID0gMDsKKwlkZWNvZGVyLT5lbmFibGUgPSAxOworCWRlY29kZXItPmJyaWdodCA9IDMyNzY4OworCWRlY29kZXItPmNvbnRyYXN0ID0gMzI3Njg7CisJZGVjb2Rlci0+aHVlID0gMzI3Njg7CisJZGVjb2Rlci0+c2F0ID0gMzI3Njg7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGVjb2Rlcik7CisKKwllcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZGVjb2Rlcik7CisJCXJldHVybiBlcnI7CisJfQorCisJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiB2cHgzMnh4IGNsaWVudCBmb3VuZCBhdCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJSTJDX05BTUUoY2xpZW50KSwgY2xpZW50LT5hZGRyIDw8IDEpOworCisJdnB4MzIyMF9pbml0X2NsaWVudChjbGllbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ZweDMyMjBfYXR0YWNoX2FkYXB0ZXIgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsICZ2cHgzMjIwX2RldGVjdF9jbGllbnQpOworCWRwcmludGsoMSwgVlBYMzIyMF9ERUJVRyAiJXM6IGkyY19wcm9iZSByZXR1cm5lZCAlZFxuIiwKKwkJX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERyaXZlciBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBjb2RlCisgKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHZweDMyMjBfaTJjX2RyaXZlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJ2cHgzMjIwIiwKKworCS5pZCA9IEkyQ19EUklWRVJJRF9WUFgzMjIwLAorCS5mbGFncyA9IEkyQ19ERl9OT1RJRlksCisKKwkuYXR0YWNoX2FkYXB0ZXIgPSB2cHgzMjIwX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50ID0gdnB4MzIyMF9kZXRhY2hfY2xpZW50LAorCS5jb21tYW5kID0gdnB4MzIyMF9jb21tYW5kLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK3ZweDMyMjBfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnZweDMyMjBfaTJjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAordnB4MzIyMF9jbGVhbnVwICh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ2cHgzMjIwX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh2cHgzMjIwX2luaXQpOworbW9kdWxlX2V4aXQodnB4MzIyMF9jbGVhbnVwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJ2cHgzMjIwYS92cHgzMjE2Yi92cHgzMjE0YyB2aWRlbyBlbmNvZGVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGF1cmVudCBQaW5jaGFydCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMThiYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMKQEAgLTAsMCArMSw5ODQgQEAKKy8qCisJV2luYm9uZCB3OTk2NmNmIFdlYmNhbSBwYXJwb3J0IGRyaXZlci4KKworCVZlcnNpb24gMC4zMgorCisJQ29weXJpZ2h0IChDKSAyMDAxIEpha29iIEtlbWkgPGpha29iLmtlbWlAcG9zdC51dGZvcnMuc2U+CisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKwlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisvKgorCVN1cHBvcnRlZCBkZXZpY2VzOgorCSpMaWZldmlldyBGbHlDYW0gU3VwcmEgKHVzaW5nIHRoZSBQaGlsaXBzIHNhYTcxMTFhIGNoaXApCisKKwlEb2VzIGFueSBvdGhlciBtb2RlbCB1c2luZyB0aGUgdzk5NjYgaW50ZXJmYWNlIGNoaXAgZXhpc3QgPworCisJVG9kbzoKKwkKKwkqQWRkIGEgd29ya2luZyBFUFAgbW9kZSwgc2luY2UgRE1BIEVDUCByZWFkIGlzbid0IGltcGxlbWVudGVkCisJaW4gdGhlIHBhcnBvcnQgZHJpdmVycy4gKFRoYXQncyB3aHkgaXQncyBzbyBzbG9vdykKKworCSpBZGQgc3VwcG9ydCBmb3Igb3RoZXIgY2NkLWNvbnRyb2wgY2hpcHMgdGhhbiB0aGUgc2FhNzExMQorCXBsZWFzZSBzZW5kIG1lIGZlZWRiYWNrIG9uIHdoYXQga2luZCBvZiBjaGlwcyB5b3UgaGF2ZS4KKworCSpBZGQgcHJvcGVyIHByb2JpbmcuIEkgZG9uJ3Qga25vdyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGUgSUVFRTEyODQKKwlwYXJwb3J0IGRyaXZlcnMgYnV0IChJRUVFMTI4NF9NT0RFX05JQkJMRXxJRUVFMTI4NF9ERVZJQ0VfSUQpCisJYW5kIG5pYmJsZSByZWFkIHNlZW1zIHRvIGJlIGJyb2tlbiBmb3Igc29tZSBwZXJpcGhlcmFscy4KKworCSpBZGQgcHJvYmluZyBmb3Igb25ib2FyZCBTUkFNLCBwb3J0IGRpcmVjdGlvbnMgZXRjLiAoaWYgcG9zc2libGUpCisKKwkqQWRkIHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZSBjb21wcmVzc2VkIG1vZGVzIChtYXliZSB1c2luZyB2NGwyKQorCisJKkZpeCBiZXR0ZXIgc3VwcG9ydCBmb3IgdGhlIGNhcHR1cmUgd2luZG93IChubyBza2V3ZWQgaW1hZ2VzLCB2NGwKKwlpbnRlcmZhY2UgdG8gY2FwdC4gd2luZG93KQorCisJKlByb2JhYmx5IHNvbWUgYnVncyB0aGF0IEkgZG9uJ3Qga25vdyBvZgorCisJUGxlYXNlIHN1cHBvcnQgbWUgYnkgc2VuZGluZyBmZWVkYmFjayEKKwkKKwlDaGFuZ2VzOgorCQorCUFsYW4gQ294OglSZW1vdmVkIFJHQiBtb2RlIGZvciBrZXJuZWwgbWVyZ2UsIGFkZGVkIFRISVNfTU9EVUxFCisJCQlhbmQgb3duZXIgc3VwcG9ydCBmb3IgbmV3ZXIgbW9kdWxlIGxvY2tzCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisKKy8vI2RlZmluZSBERUJVRwkJCQkvLyBVbmRlZiBtZSBmb3IgcHJvZHVjdGlvbgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgRFBSSU5URih4LCBhLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiVzk5NjY6ICVzKCk6ICJ4LCBfX0ZVTkNUSU9OX18gLCAjI2EpCisjZWxzZQorI2RlZmluZSBEUFJJTlRGKHguLi4pCisjZW5kaWYKKworLyoKKyAqCURlZmluZXMsIHNpbXBsZSB0eXBlZGVmcyBldGMuCisgKi8KKworI2RlZmluZSBXOTk2Nl9EUklWRVJOQU1FCSJXOTk2NkNGIFdlYmNhbSIKKyNkZWZpbmUgVzk5NjZfTUFYQ0FNUwkJNAkvLyBNYXhpbXVtIG51bWJlciBvZiBjYW1lcmFzCisjZGVmaW5lIFc5OTY2X1JCVUZGRVIJCTIwNDgJLy8gUmVhZCBidWZmZXIgKG11c3QgYmUgYW4gZXZlbiBudW1iZXIpCisjZGVmaW5lIFc5OTY2X1NSQU1TSVpFCQkxMzEwNzIJLy8gMTI4a2IKKyNkZWZpbmUgVzk5NjZfU1JBTUlECQkweDAyCS8vIGNoZWNrIHc5OTY2Y2YucGRmCisKKy8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgd2luZG93IGxpbWl0cworI2RlZmluZSBXOTk2Nl9XTkRfTUlOX1gJCTE2CisjZGVmaW5lIFc5OTY2X1dORF9NSU5fWQkJMTQKKyNkZWZpbmUgVzk5NjZfV05EX01BWF9YCQk3MDUKKyNkZWZpbmUgVzk5NjZfV05EX01BWF9ZCQkyNTMKKyNkZWZpbmUgVzk5NjZfV05EX01BWF9XCQkoVzk5NjZfV05EX01BWF9YIC0gVzk5NjZfV05EX01JTl9YKQorI2RlZmluZSBXOTk2Nl9XTkRfTUFYX0gJCShXOTk2Nl9XTkRfTUFYX1kgLSBXOTk2Nl9XTkRfTUlOX1kpCisKKy8vIEtlZXAgdHJhY2sgb2Ygb3VyIGN1cnJlbnQgc3RhdGUKKyNkZWZpbmUgVzk5NjZfU1RBVEVfUERFVgkweDAxCisjZGVmaW5lIFc5OTY2X1NUQVRFX0NMQUlNRUQJMHgwMgorI2RlZmluZSBXOTk2Nl9TVEFURV9WREVWCTB4MDQKKworI2RlZmluZSBXOTk2Nl9JMkNfV19JRAkJMHg0OAorI2RlZmluZSBXOTk2Nl9JMkNfUl9JRAkJMHg0OQorI2RlZmluZSBXOTk2Nl9JMkNfUl9EQVRBCTB4MDgKKyNkZWZpbmUgVzk5NjZfSTJDX1JfQ0xPQ0sJMHgwNAorI2RlZmluZSBXOTk2Nl9JMkNfV19EQVRBCTB4MDIKKyNkZWZpbmUgVzk5NjZfSTJDX1dfQ0xPQ0sJMHgwMQorCitzdHJ1Y3Qgdzk5NjZfZGV2IHsKKwl1bnNpZ25lZCBjaGFyIGRldl9zdGF0ZTsKKwl1bnNpZ25lZCBjaGFyIGkyY19zdGF0ZTsKKwl1bnNpZ25lZCBzaG9ydCBwcG1vZGU7CisJc3RydWN0IHBhcnBvcnQqIHBwb3J0OworCXN0cnVjdCBwYXJkZXZpY2UqIHBkZXY7CisJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OworCXVuc2lnbmVkIHNob3J0IHdpZHRoOworCXVuc2lnbmVkIHNob3J0IGhlaWdodDsKKwl1bnNpZ25lZCBjaGFyIGJyaWdodG5lc3M7CisJc2lnbmVkIGNoYXIgY29udHJhc3Q7CisJc2lnbmVkIGNoYXIgY29sb3I7CisJc2lnbmVkIGNoYXIgaHVlOworfTsKKworLyoKKyAqCU1vZHVsZSBzcGVjaWZpYyBwcm9wZXJ0aWVzCisgKi8KKworTU9EVUxFX0FVVEhPUigiSmFrb2IgS2VtaSA8amFrb2Iua2VtaUBwb3N0LnV0Zm9ycy5zZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCB3OTk2NmNmIFdlYkNhbSBkcml2ZXIgKDAuMzIpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworI2lmZGVmIE1PRFVMRQorc3RhdGljIGNvbnN0IGNoYXIqIHBhcmRldltdID0ge1swIC4uLiBXOTk2Nl9NQVhDQU1TXSA9ICIifTsKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhciogcGFyZGV2W10gPSB7WzAgLi4uIFc5OTY2X01BWENBTVNdID0gImFnZ3Jlc3NpdmUifTsKKyNlbmRpZgorbW9kdWxlX3BhcmFtX2FycmF5KHBhcmRldiwgY2hhcnAsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhwYXJkZXYsICJwYXJkZXY6IHdoZXJlIHRvIHNlYXJjaCBmb3JcblwKK1x0ZWFjaCBjYW1lcmEuICdhZ2dyZXNzaXZlJyBtZWFucyBicnV0ZS1mb3JjZSBzZWFyY2guXG5cCitcdEVnOiA+cGFyZGV2PXBhcnBvcnQzLGFnZ3Jlc3NpdmUscGFycG9ydDIscGFycG9ydDE8IHdvdWxkIGFzc2lnblxuXAorXHRjYW0gMSB0byBwYXJwb3J0MyBhbmQgc2VhcmNoIGV2ZXJ5IHBhcnBvcnQgZm9yIGNhbSAyIGV0Yy4uLiIpOworCitzdGF0aWMgaW50IHBhcm1vZGUgPSAwOworbW9kdWxlX3BhcmFtKHBhcm1vZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhcm1vZGUsICJwYXJtb2RlOiB0cmFuc2ZlciBtb2RlICgwPWF1dG8sIDE9ZWNwLCAyPWVwcCIpOworCitzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7Cittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CisKKy8qCisgKglQcml2YXRlIGRhdGEKKyAqLworCitzdGF0aWMgc3RydWN0IHc5OTY2X2RldiB3OTk2Nl9jYW1zW1c5OTY2X01BWENBTVNdOworCisvKgorICoJUHJpdmF0ZSBmdW5jdGlvbiBkZWNsYXJlcworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3OTk2Nl9zZXRTdGF0ZShzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0sIGludCBtYXNrLCBpbnQgdmFsKTsKK3N0YXRpYyBpbmxpbmUgaW50ICB3OTk2Nl9nZXRTdGF0ZShzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0sIGludCBtYXNrLCBpbnQgdmFsKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB3OTk2Nl9wZGV2X2NsYWltKHN0cnVjdCB3OTk2Nl9kZXYgKnZkZXYpOworc3RhdGljIGlubGluZSB2b2lkIHc5OTY2X3BkZXZfcmVsZWFzZShzdHJ1Y3Qgdzk5NjZfZGV2ICp2ZGV2KTsKKworc3RhdGljIGludCB3OTk2Nl9yUmVnKHN0cnVjdCB3OTk2Nl9kZXYqIGNhbSwgaW50IHJlZyk7CitzdGF0aWMgaW50IHc5OTY2X3dSZWcoc3RydWN0IHc5OTY2X2RldiogY2FtLCBpbnQgcmVnLCBpbnQgZGF0YSk7CisjaWYgMAorc3RhdGljIGludCB3OTk2Nl9yUmVnX2kyYyhzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0sIGludCByZWcpOworI2VuZGlmCitzdGF0aWMgaW50IHc5OTY2X3dSZWdfaTJjKHN0cnVjdCB3OTk2Nl9kZXYqIGNhbSwgaW50IHJlZywgaW50IGRhdGEpOworc3RhdGljIGludCB3OTk2Nl9maW5kbGVuKGludCBuZWFyLCBpbnQgc2l6ZSwgaW50IG1heGxlbik7CitzdGF0aWMgaW50IHc5OTY2X2NhbGNzY2FsZShpbnQgc2l6ZSwgaW50IG1pbiwgaW50IG1heCwgaW50KiBiZWcsIGludCogZW5kLCB1bnNpZ25lZCBjaGFyKiBmYWN0b3IpOworc3RhdGljIGludCB3OTk2Nl9zZXR1cChzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0sIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IHcsIGludCBoKTsKKworc3RhdGljIGludCAgdzk5NjZfaW5pdChzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0sIHN0cnVjdCBwYXJwb3J0KiBwb3J0KTsKK3N0YXRpYyB2b2lkIHc5OTY2X3Rlcm0oc3RydWN0IHc5OTY2X2RldiogY2FtKTsKKworc3RhdGljIGlubGluZSB2b2lkIHc5OTY2X2kyY19zZXRzZGEoc3RydWN0IHc5OTY2X2RldiogY2FtLCBpbnQgc3RhdGUpOworc3RhdGljIGlubGluZSBpbnQgIHc5OTY2X2kyY19zZXRzY2woc3RydWN0IHc5OTY2X2RldiogY2FtLCBpbnQgc3RhdGUpOworc3RhdGljIGlubGluZSBpbnQgIHc5OTY2X2kyY19nZXRzZGEoc3RydWN0IHc5OTY2X2RldiogY2FtKTsKK3N0YXRpYyBpbmxpbmUgaW50ICB3OTk2Nl9pMmNfZ2V0c2NsKHN0cnVjdCB3OTk2Nl9kZXYqIGNhbSk7CitzdGF0aWMgaW50IHc5OTY2X2kyY193Ynl0ZShzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0sIGludCBkYXRhKTsKKyNpZiAwCitzdGF0aWMgaW50IHc5OTY2X2kyY19yYnl0ZShzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0pOworI2VuZGlmCisKK3N0YXRpYyBpbnQgdzk5NjZfdjRsX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHNzaXplX3Qgdzk5NjZfdjRsX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHc5OTY2X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAorCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAorCS5pb2N0bCAgICAgICAgICA9IHc5OTY2X3Y0bF9pb2N0bCwKKwkucmVhZCAgICAgICAgICAgPSB3OTk2Nl92NGxfcmVhZCwKKwkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCit9Oworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugdzk5NjZfdGVtcGxhdGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lICAgICAgICAgICA9IFc5OTY2X0RSSVZFUk5BTUUsCisJLnR5cGUgICAgICAgICAgID0gVklEX1RZUEVfQ0FQVFVSRSB8IFZJRF9UWVBFX1NDQUxFUywKKwkuaGFyZHdhcmUgICAgICAgPSBWSURfSEFSRFdBUkVfVzk5NjYsCisJLmZvcHMgICAgICAgICAgID0gJnc5OTY2X2ZvcHMsCit9OworCisvKgorICoJUHJpdmF0ZSBmdW5jdGlvbiBkZWZpbmVzCisgKi8KKworCisvLyBTZXQgY2FtZXJhIHBoYXNlIGZsYWdzLCBzbyB3ZSBrbm93IHdoYXQgdG8gdW5pbml0IHdoZW4gdGVybWluYXRpbmcgCitzdGF0aWMgaW5saW5lIHZvaWQgdzk5NjZfc2V0U3RhdGUoc3RydWN0IHc5OTY2X2RldiogY2FtLCBpbnQgbWFzaywgaW50IHZhbCkKK3sKKwljYW0tPmRldl9zdGF0ZSA9IChjYW0tPmRldl9zdGF0ZSAmIH5tYXNrKSBeIHZhbDsKK30KKworLy8gR2V0IGNhbWVyYSBwaGFzZSBmbGFncworc3RhdGljIGlubGluZSBpbnQgdzk5NjZfZ2V0U3RhdGUoc3RydWN0IHc5OTY2X2RldiogY2FtLCBpbnQgbWFzaywgaW50IHZhbCkKK3sKKwlyZXR1cm4gKChjYW0tPmRldl9zdGF0ZSAmIG1hc2spID09IHZhbCk7Cit9CisKKy8vIENsYWltIHBhcnBvcnQgZm9yIG91cnNlbGYKK3N0YXRpYyBpbmxpbmUgdm9pZCB3OTk2Nl9wZGV2X2NsYWltKHN0cnVjdCB3OTk2Nl9kZXYqIGNhbSkKK3sKKwlpZiAodzk5NjZfZ2V0U3RhdGUoY2FtLCBXOTk2Nl9TVEFURV9DTEFJTUVELCBXOTk2Nl9TVEFURV9DTEFJTUVEKSkKKwkJcmV0dXJuOworCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2soY2FtLT5wZGV2KTsKKwl3OTk2Nl9zZXRTdGF0ZShjYW0sIFc5OTY2X1NUQVRFX0NMQUlNRUQsIFc5OTY2X1NUQVRFX0NMQUlNRUQpOworfQorCisvLyBSZWxlYXNlIHBhcnBvcnQgZm9yIG90aGVycyB0byB1c2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB3OTk2Nl9wZGV2X3JlbGVhc2Uoc3RydWN0IHc5OTY2X2RldiogY2FtKQoreworCWlmICh3OTk2Nl9nZXRTdGF0ZShjYW0sIFc5OTY2X1NUQVRFX0NMQUlNRUQsIDApKQorCQlyZXR1cm47CisJcGFycG9ydF9yZWxlYXNlKGNhbS0+cGRldik7CisJdzk5NjZfc2V0U3RhdGUoY2FtLCBXOTk2Nl9TVEFURV9DTEFJTUVELCAwKTsKK30KKyAKKy8vIFJlYWQgcmVnaXN0ZXIgZnJvbSBXOTk2NiBpbnRlcmZhY2UtY2hpcAorLy8gRXhwZWN0cyBhIGNsYWltZWQgcGRldgorLy8gLTEgb24gZXJyb3IsIGVsc2UgcmVnaXN0ZXIgZGF0YSAoYnl0ZSkKK3N0YXRpYyBpbnQgdzk5NjZfclJlZyhzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0sIGludCByZWcpCit7CisJLy8gRUNQLCByZWFkLCByZWd0cmFuc2ZlciwgUkVHLCBSRUcsIFJFRywgUkVHLCBSRUcKKwljb25zdCB1bnNpZ25lZCBjaGFyIGFkZHIgPSAweDgwIHwgKHJlZyAmIDB4MWYpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCQorCWlmIChwYXJwb3J0X25lZ290aWF0ZShjYW0tPnBwb3J0LCBjYW0tPnBwbW9kZSB8IElFRUUxMjg0X0FERFIpICE9IDApCisJCXJldHVybiAtMTsKKwlpZiAocGFycG9ydF93cml0ZShjYW0tPnBwb3J0LCAmYWRkciwgMSkgIT0gMSkKKwkJcmV0dXJuIC0xOworCWlmIChwYXJwb3J0X25lZ290aWF0ZShjYW0tPnBwb3J0LCBjYW0tPnBwbW9kZSB8IElFRUUxMjg0X0RBVEEpICE9IDApCisJCXJldHVybiAtMTsKKwlpZiAocGFycG9ydF9yZWFkKGNhbS0+cHBvcnQsICZ2YWwsIDEpICE9IDEpCisJCXJldHVybiAtMTsKKworCXJldHVybiB2YWw7Cit9CisKKy8vIFdyaXRlIHJlZ2lzdGVyIHRvIFc5OTY2IGludGVyZmFjZS1jaGlwCisvLyBFeHBlY3RzIGEgY2xhaW1lZCBwZGV2CisvLyAtMSBvbiBlcnJvcgorc3RhdGljIGludCB3OTk2Nl93UmVnKHN0cnVjdCB3OTk2Nl9kZXYqIGNhbSwgaW50IHJlZywgaW50IGRhdGEpCit7CisJLy8gRUNQLCB3cml0ZSwgcmVndHJhbnNmZXIsIFJFRywgUkVHLCBSRUcsIFJFRywgUkVHCisJY29uc3QgdW5zaWduZWQgY2hhciBhZGRyID0gMHhjMCB8IChyZWcgJiAweDFmKTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIHZhbCA9IGRhdGE7CisJCisJaWYgKHBhcnBvcnRfbmVnb3RpYXRlKGNhbS0+cHBvcnQsIGNhbS0+cHBtb2RlIHwgSUVFRTEyODRfQUREUikgIT0gMCkKKwkJcmV0dXJuIC0xOworCWlmIChwYXJwb3J0X3dyaXRlKGNhbS0+cHBvcnQsICZhZGRyLCAxKSAhPSAxKQorCQlyZXR1cm4gLTE7CisJaWYgKHBhcnBvcnRfbmVnb3RpYXRlKGNhbS0+cHBvcnQsIGNhbS0+cHBtb2RlIHwgSUVFRTEyODRfREFUQSkgIT0gMCkKKwkJcmV0dXJuIC0xOworCWlmIChwYXJwb3J0X3dyaXRlKGNhbS0+cHBvcnQsICZ2YWwsIDEpICE9IDEpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisvLyBJbml0aWFsaXplIGNhbWVyYSBkZXZpY2UuIFNldHVwIGFsbCBpbnRlcm5hbCBmbGFncywgc2V0IGEKKy8vIGRlZmF1bHQgdmlkZW8gbW9kZSwgc2V0dXAgY2NkLWNoaXAsIHJlZ2lzdGVyIHY0bCBkZXZpY2UgZXRjLi4KKy8vIEFsc28gdXNlZCBmb3IgJ3Byb2JpbmcnIG9mIGhhcmR3YXJlLgorLy8gLTEgb24gZXJyb3IKK3N0YXRpYyBpbnQgdzk5NjZfaW5pdChzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0sIHN0cnVjdCBwYXJwb3J0KiBwb3J0KQoreworCWlmIChjYW0tPmRldl9zdGF0ZSAhPSAwKQorCQlyZXR1cm4gLTE7CisJCisJY2FtLT5wcG9ydCA9IHBvcnQ7CisJY2FtLT5icmlnaHRuZXNzID0gMTI4OworCWNhbS0+Y29udHJhc3QgPSA2NDsKKwljYW0tPmNvbG9yID0gNjQ7CisJY2FtLT5odWUgPSAwOworCisvLyBTZWxlY3QgcmVxdWVzdGVkIHRyYW5zZmVyIG1vZGUKKwlzd2l0Y2gocGFybW9kZSkKKwl7CisJZGVmYXVsdDoJLy8gQXV0by1kZXRlY3QgKHByaW9yaXR5OiBody1lY3AsIGh3LWVwcCwgc3ctZWNwKQorCWNhc2UgMDoKKwkJaWYgKHBvcnQtPm1vZGVzICYgUEFSUE9SVF9NT0RFX0VDUCkKKwkJCWNhbS0+cHBtb2RlID0gSUVFRTEyODRfTU9ERV9FQ1A7CisJCWVsc2UgaWYgKHBvcnQtPm1vZGVzICYgUEFSUE9SVF9NT0RFX0VQUCkKKwkJCWNhbS0+cHBtb2RlID0gSUVFRTEyODRfTU9ERV9FUFA7CisJCWVsc2UKKwkJCWNhbS0+cHBtb2RlID0gSUVFRTEyODRfTU9ERV9FQ1A7CisJCWJyZWFrOwkKKwljYXNlIDE6CQkvLyBody0gb3Igc3ctZWNwCisJCWNhbS0+cHBtb2RlID0gSUVFRTEyODRfTU9ERV9FQ1A7CisJCWJyZWFrOworCWNhc2UgMjoJCS8vIGh3LSBvciBzdy1lcHAKKwkJY2FtLT5wcG1vZGUgPSBJRUVFMTI4NF9NT0RFX0VQUDsKKwlicmVhazsKKwl9CisJCisvLyBUZWxsIHRoZSBwYXJwb3J0IGRyaXZlciB0aGF0IHdlIGV4aXN0cworCWNhbS0+cGRldiA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHBvcnQsICJ3OTk2NiIsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOworCWlmIChjYW0tPnBkZXYgPT0gTlVMTCkgeworCQlEUFJJTlRGKCJwYXJwb3J0X3JlZ2lzdGVyX2RldmljZSgpIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJdzk5NjZfc2V0U3RhdGUoY2FtLCBXOTk2Nl9TVEFURV9QREVWLCBXOTk2Nl9TVEFURV9QREVWKTsKKworCXc5OTY2X3BkZXZfY2xhaW0oY2FtKTsKKwkKKy8vIFNldHVwIGEgZGVmYXVsdCBjYXB0dXJlIG1vZGUKKwlpZiAodzk5NjZfc2V0dXAoY2FtLCAwLCAwLCAxMDIzLCAxMDIzLCAyMDAsIDE2MCkgIT0gMCkgeworCQlEUFJJTlRGKCJ3OTk2Nl9zZXR1cCgpIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdzk5NjZfcGRldl9yZWxlYXNlKGNhbSk7CisKKy8vIEZpbGwgaW4gdGhlIHZpZGVvX2RldmljZSBzdHJ1Y3QgYW5kIHJlZ2lzdGVyIHVzIHRvIHY0bAorCW1lbWNweSgmY2FtLT52ZGV2LCAmdzk5NjZfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgdmlkZW9fZGV2aWNlKSk7CisJY2FtLT52ZGV2LnByaXYgPSBjYW07CisKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKSA9PSAtMSkJCSAKKwkJcmV0dXJuIC0xOworCQorCXc5OTY2X3NldFN0YXRlKGNhbSwgVzk5NjZfU1RBVEVfVkRFViwgVzk5NjZfU1RBVEVfVkRFVik7CisJCisJLy8gQWxsIG9rCisJcHJpbnRrKAorCQkidzk5NjZjZjogRm91bmQgYW5kIGluaXRpYWxpemVkIGEgd2ViY2FtIG9uICVzLlxuIiwKKwkJY2FtLT5wcG9ydC0+bmFtZQorCSk7CisJcmV0dXJuIDA7Cit9CisKKworLy8gVGVybWluYXRlIGV2ZXJ5dGhpbmcgZ3JhY2VmdWxseQorc3RhdGljIHZvaWQgdzk5NjZfdGVybShzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0pCit7CisvLyBVbnJlZ2lzdGVyIGZyb20gdjRsCisJaWYgKHc5OTY2X2dldFN0YXRlKGNhbSwgVzk5NjZfU1RBVEVfVkRFViwgVzk5NjZfU1RBVEVfVkRFVikpIHsKKwkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+dmRldik7CisJCXc5OTY2X3NldFN0YXRlKGNhbSwgVzk5NjZfU1RBVEVfVkRFViwgMCk7CisJfQorCisvLyBUZXJtaW5hdGUgZnJvbSBJRUVFMTI4NCBtb2RlIGFuZCByZWxlYXNlIHBkZXYgYmxvY2sKKwlpZiAodzk5NjZfZ2V0U3RhdGUoY2FtLCBXOTk2Nl9TVEFURV9QREVWLCBXOTk2Nl9TVEFURV9QREVWKSkgeworCQl3OTk2Nl9wZGV2X2NsYWltKGNhbSk7CisJCXBhcnBvcnRfbmVnb3RpYXRlKGNhbS0+cHBvcnQsIElFRUUxMjg0X01PREVfQ09NUEFUKTsKKwkJdzk5NjZfcGRldl9yZWxlYXNlKGNhbSk7CisJfQorCisvLyBVbnJlZ2lzdGVyIGZyb20gcGFycG9ydAorCWlmICh3OTk2Nl9nZXRTdGF0ZShjYW0sIFc5OTY2X1NUQVRFX1BERVYsIFc5OTY2X1NUQVRFX1BERVYpKSB7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoY2FtLT5wZGV2KTsKKwkJdzk5NjZfc2V0U3RhdGUoY2FtLCBXOTk2Nl9TVEFURV9QREVWLCAwKTsKKwl9Cit9CisKKworLy8gRmluZCBhIGdvb2QgbGVuZ3RoIGZvciBjYXB0dXJlIHdpbmRvdyAodXNlZCBib3RoIGZvciBXIGFuZCBIKQorLy8gQSBiaXQgdWdseSBidXQgcHJldHR5IGZ1bmN0aW9uYWwuIFRoZSBjYXB0dXJlIGxlbmd0aAorLy8gaGF2ZSB0byBtYXRjaCB0aGUgZG93bnNjYWxlCitzdGF0aWMgaW50IHc5OTY2X2ZpbmRsZW4oaW50IG5lYXIsIGludCBzaXplLCBpbnQgbWF4bGVuKQoreworCWludCBiZXN0bGVuID0gc2l6ZTsKKwlpbnQgYmVzdGVyciA9IGFicyhuZWFyIC0gYmVzdGxlbik7CisJaW50IGxlbjsKKworCWZvcihsZW4gPSBzaXplKzE7bGVuIDwgbWF4bGVuO2xlbisrKQorCXsKKwkJaW50IGVycjsKKwkJaWYgKCAoKDY0KnNpemUpICVsZW4pICE9IDApCisJCQljb250aW51ZTsKKworCQllcnIgPSBhYnMobmVhciAtIGxlbik7CisKKwkJLy8gT25seSBjb250aW51ZSBhcyBsb25nIGFzIHdlIGtlZXAgZ2V0dGluZyBiZXR0ZXIgdmFsdWVzCisJCWlmIChlcnIgPiBiZXN0ZXJyKQorCQkJYnJlYWs7CisJCQorCQliZXN0ZXJyID0gZXJyOworCQliZXN0bGVuID0gbGVuOworCX0KKworCXJldHVybiBiZXN0bGVuOworfQorCisvLyBNb2RpZnkgY2FwdHVyZSB3aW5kb3cgKGlmIG5lY2Vzc2FyeSkgCisvLyBhbmQgY2FsY3VsYXRlIGRvd25zY2FsaW5nCisvLyBSZXR1cm4gLTEgb24gZXJyb3IKK3N0YXRpYyBpbnQgdzk5NjZfY2FsY3NjYWxlKGludCBzaXplLCBpbnQgbWluLCBpbnQgbWF4LCBpbnQqIGJlZywgaW50KiBlbmQsIHVuc2lnbmVkIGNoYXIqIGZhY3RvcikKK3sKKwlpbnQgbWF4bGVuID0gbWF4IC0gbWluOworCWludCBsZW4gPSAqZW5kIC0gKmJlZyArIDE7CisJaW50IG5ld2xlbiA9IHc5OTY2X2ZpbmRsZW4obGVuLCBzaXplLCBtYXhsZW4pOworCWludCBlcnIgPSBuZXdsZW4gLSBsZW47IAorCisJLy8gQ2hlY2sgZm9yIGJhZCBmb3JtYXQKKwlpZiAobmV3bGVuID4gbWF4bGVuIHx8IG5ld2xlbiA8IHNpemUpCisJCXJldHVybiAtMTsKKworCS8vIFNldCBmYWN0b3IgKDYgYml0IGZpeGVkKQorCSpmYWN0b3IgPSAoNjQqc2l6ZSkgLyBuZXdsZW47CisJaWYgKCpmYWN0b3IgPT0gNjQpCisJCSpmYWN0b3IgPSAweDAwOwkvLyBkb3duc2NhbGUgaXMgZGlzYWJsZWQKKwllbHNlCisJCSpmYWN0b3IgfD0gMHg4MDsgLy8gc2V0IGRvd25zY2FsZS1lbmFibGUgYml0CisKKwkvLyBNb2RpZnkgb2xkIGJlZ2lubmluZyBhbmQgZW5kCisJKmJlZyAtPSBlcnIgLyAyOworCSplbmQgKz0gZXJyIC0gKGVyciAvIDIpOworCisJLy8gTW92ZSB3aW5kb3cgaWYgb3V0c2lkZSBib3JkZXJzCisJaWYgKCpiZWcgPCBtaW4pIHsKKwkJKmVuZCArPSBtaW4gLSAqYmVnOworCQkqYmVnICs9IG1pbiAtICpiZWc7CisJfQorCWlmICgqZW5kID4gbWF4KSB7CisJCSpiZWcgLT0gKmVuZCAtIG1heDsKKwkJKmVuZCAtPSAqZW5kIC0gbWF4OworCX0KKworCXJldHVybiAwOworfQorCisvLyBTZXR1cCB0aGUgY2FtZXJhcyBjYXB0dXJlIHdpbmRvdyBldGMuCisvLyBFeHBlY3RzIGEgY2xhaW1lZCBwZGV2CisvLyByZXR1cm4gLTEgb24gZXJyb3IKK3N0YXRpYyBpbnQgdzk5NjZfc2V0dXAoc3RydWN0IHc5OTY2X2RldiogY2FtLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCB3LCBpbnQgaCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZW5oX3MsIGVuaF9lOworCXVuc2lnbmVkIGNoYXIgc2NhbGVfeCwgc2NhbGVfeTsKKwl1bnNpZ25lZCBjaGFyIHJlZ3NbMHgxY107CisJdW5zaWduZWQgY2hhciBzYWE3MTExX3JlZ3NbXSA9IHsKKwkJMHgyMSwgMHgwMCwgMHhkOCwgMHgyMywgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwKKwkJMHg4OCwgMHgxMCwgMHg4MCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkJMHg0OCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJMHgwMCwgMHgwMCwgMHgwMCwgMHg3MSwgMHhlNywgMHgwMCwgMHgwMCwgMHhjMAorCX07CisJCisJCisJaWYgKHcqaCoyID4gVzk5NjZfU1JBTVNJWkUpCisJeworCQlEUFJJTlRGKCJjYXB0dXJlIHdpbmRvdyBleGNlZWRzIFNSQU0gc2l6ZSEuXG4iKTsKKwkJdyA9IDIwMDsgaCA9IDE2MDsJLy8gUGljayBkZWZhdWx0IHZhbHVlcworCX0KKworCXcgJj0gfjB4MTsKKwlpZiAodyA8IDIpIHcgPSAyOworCWlmIChoIDwgMSkgaCA9IDE7CisJaWYgKHcgPiBXOTk2Nl9XTkRfTUFYX1cpIHcgPSBXOTk2Nl9XTkRfTUFYX1c7CisJaWYgKGggPiBXOTk2Nl9XTkRfTUFYX0gpIGggPSBXOTk2Nl9XTkRfTUFYX0g7CisKKwljYW0tPndpZHRoID0gdzsKKwljYW0tPmhlaWdodCA9IGg7CisKKwllbmhfcyA9IDA7CQorCWVuaF9lID0gdypoKjI7CisJCisvLyBNb2RpZnkgY2FwdHVyZSB3aW5kb3cgaWYgbmVjZXNzYXJ5IGFuZCBjYWxjdWxhdGUgZG93bnNjYWxpbmcKKwlpZiAoCisJCXc5OTY2X2NhbGNzY2FsZSh3LCBXOTk2Nl9XTkRfTUlOX1gsIFc5OTY2X1dORF9NQVhfWCwgJngxLCAmeDIsICZzY2FsZV94KSAhPSAwIHx8CisJCXc5OTY2X2NhbGNzY2FsZShoLCBXOTk2Nl9XTkRfTUlOX1ksIFc5OTY2X1dORF9NQVhfWSwgJnkxLCAmeTIsICZzY2FsZV95KSAhPSAwCisJKSByZXR1cm4gLTE7CisKKwlEUFJJTlRGKAorCQkiJWR4JWQsIHg6ICVkPC0+JWQsIHk6ICVkPC0+JWQsIHN4OiAlZC82NCwgc3k6ICVkLzY0LlxuIiwKKwkJdywgaCwgeDEsIHgyLCB5MSwgeTIsIHNjYWxlX3gmfjB4ODAsIHNjYWxlX3kmfjB4ODAKKwkpOworCQorLy8gU2V0dXAgcmVnaXN0ZXJzCisJcmVnc1sweDAwXSA9IDB4MDA7CQkJLy8gU2V0IG5vcm1hbCBvcGVyYXRpb24KKwlyZWdzWzB4MDFdID0gMHgxODsJCQkvLyBDYXB0dXJlIG1vZGUKKwlyZWdzWzB4MDJdID0gc2NhbGVfeTsJCQkvLyBWLXNjYWxpbmcKKwlyZWdzWzB4MDNdID0gc2NhbGVfeDsJCQkvLyBILXNjYWxpbmcKKwkKKwkvLyBDYXB0dXJlIHdpbmRvdwkKKwlyZWdzWzB4MDRdID0gKHgxICYgMHgwZmYpOwkJLy8gWC1zdGFydCAoOCBsb3cgYml0cykKKwlyZWdzWzB4MDVdID0gKHgxICYgMHgzMDApPj44OwkJLy8gWC1zdGFydCAoMiBoaWdoIGJpdHMpCisJcmVnc1sweDA2XSA9ICh5MSAmIDB4MGZmKTsJCS8vIFktc3RhcnQgKDggbG93IGJpdHMpCisJcmVnc1sweDA3XSA9ICh5MSAmIDB4MzAwKT4+ODsJCS8vIFktc3RhcnQgKDIgaGlnaCBiaXRzKQorCXJlZ3NbMHgwOF0gPSAoeDIgJiAweDBmZik7CQkvLyBYLWVuZCAoOCBsb3cgYml0cykKKwlyZWdzWzB4MDldID0gKHgyICYgMHgzMDApPj44OwkJLy8gWC1lbmQgKDIgaGlnaCBiaXRzKQorCXJlZ3NbMHgwYV0gPSAoeTIgJiAweDBmZik7CQkvLyBZLWVuZCAoOCBsb3cgYml0cykKKworCXJlZ3NbMHgwY10gPSBXOTk2Nl9TUkFNSUQ7CQkvLyBTUkFNLWJhbmtzICgxeCAxMjhrYikKKwkKKwkvLyBFbmhhbmNlbWVudCBsYXllcgorCXJlZ3NbMHgwZF0gPSAoZW5oX3MmIDB4MDAwZmYpOwkJLy8gRW5oLiBzdGFydCAoMC03KQorCXJlZ3NbMHgwZV0gPSAoZW5oX3MmIDB4MGZmMDApPj44OwkvLyBFbmguIHN0YXJ0ICg4LTE1KQorCXJlZ3NbMHgwZl0gPSAoZW5oX3MmIDB4NzAwMDApPj4xNjsJLy8gRW5oLiBzdGFydCAoMTYtMTcvMTg/PykKKwlyZWdzWzB4MTBdID0gKGVuaF9lJiAweDAwMGZmKTsJCS8vIEVuaC4gZW5kICgwLTcpCisJcmVnc1sweDExXSA9IChlbmhfZSYgMHgwZmYwMCk+Pjg7CS8vIEVuaC4gZW5kICg4LTE1KQorCXJlZ3NbMHgxMl0gPSAoZW5oX2UmIDB4NzAwMDApPj4xNjsJLy8gRW5oLiBlbmQgKDE2LTE3LzE4Pz8pCisKKwkvLyBNaXNjCisJcmVnc1sweDEzXSA9IDB4NDA7CQkJLy8gVkVFIGNvbnRyb2wgKHJhdyA0OjI6MikKKwlyZWdzWzB4MTddID0gMHgwMDsJCQkvLyA/Pz8KKwlyZWdzWzB4MThdID0gY2FtLT5pMmNfc3RhdGUgPSAweDAwOwkvLyBTZXJpYWwgYnVzCisJcmVnc1sweDE5XSA9IDB4ZmY7CQkJLy8gSS9PIHBvcnQgZGlyZWN0aW9uIGNvbnRyb2wKKwlyZWdzWzB4MWFdID0gMHhmZjsJCQkvLyBJL08gcG9ydCBkYXRhIHJlZ2lzdGVyCisJcmVnc1sweDFiXSA9IDB4MTA7CQkJLy8gPz8/CisJCisJLy8gU0FBNzExMSBjaGlwIHNldHRpbmdzCisJc2FhNzExMV9yZWdzWzB4MGFdID0gY2FtLT5icmlnaHRuZXNzOworCXNhYTcxMTFfcmVnc1sweDBiXSA9IGNhbS0+Y29udHJhc3Q7CisJc2FhNzExMV9yZWdzWzB4MGNdID0gY2FtLT5jb2xvcjsKKwlzYWE3MTExX3JlZ3NbMHgwZF0gPSBjYW0tPmh1ZTsKKworLy8gUmVzZXQgKEVDUC1maWZvICYgc2VyaWFsLWJ1cykKKwlpZiAodzk5NjZfd1JlZyhjYW0sIDB4MDAsIDB4MDMpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKy8vIFdyaXRlIHJlZ3MgdG8gdzk5NjZjZiBjaGlwCisJZm9yIChpID0gMDsgaSA8IDB4MWM7IGkrKykKKwkJaWYgKHc5OTY2X3dSZWcoY2FtLCBpLCByZWdzW2ldKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKworLy8gV3JpdGUgcmVncyB0byBzYWE3MTExIGNoaXAKKwlmb3IgKGkgPSAwOyBpIDwgMHgyMDsgaSsrKQorCQlpZiAodzk5NjZfd1JlZ19pMmMoY2FtLCBpLCBzYWE3MTExX3JlZ3NbaV0pID09IC0xKQorCQkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglVZ2x5IGFuZCBwcmltaXRpdmUgaTJjIHByb3RvY29sIGZ1bmN0aW9ucworICovCisKKy8vIFNldHMgdGhlIGRhdGEgbGluZSBvbiB0aGUgaTJjIGJ1cy4KKy8vIEV4cGVjdHMgYSBjbGFpbWVkIHBkZXYuCitzdGF0aWMgaW5saW5lIHZvaWQgdzk5NjZfaTJjX3NldHNkYShzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0sIGludCBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUpCisJCWNhbS0+aTJjX3N0YXRlIHw9IFc5OTY2X0kyQ19XX0RBVEE7CisJZWxzZQorCQljYW0tPmkyY19zdGF0ZSAmPSB+Vzk5NjZfSTJDX1dfREFUQTsKKwkKKwl3OTk2Nl93UmVnKGNhbSwgMHgxOCwgY2FtLT5pMmNfc3RhdGUpOworCXVkZWxheSg1KTsKK30KKworLy8gR2V0IHBlcmlwaGVyYWwgY2xvY2sgbGluZQorLy8gRXhwZWN0cyBhIGNsYWltZWQgcGRldi4KK3N0YXRpYyBpbmxpbmUgaW50IHc5OTY2X2kyY19nZXRzY2woc3RydWN0IHc5OTY2X2RldiogY2FtKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgc3RhdGUgPSB3OTk2Nl9yUmVnKGNhbSwgMHgxOCk7CisJcmV0dXJuICgoc3RhdGUgJiBXOTk2Nl9JMkNfUl9DTE9DSykgPiAwKTsKK30KKworLy8gU2V0cyB0aGUgY2xvY2sgbGluZSBvbiB0aGUgaTJjIGJ1cy4KKy8vIEV4cGVjdHMgYSBjbGFpbWVkIHBkZXYuIC0xIG9uIGVycm9yCitzdGF0aWMgaW5saW5lIGludCB3OTk2Nl9pMmNfc2V0c2NsKHN0cnVjdCB3OTk2Nl9kZXYqIGNhbSwgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWlmIChzdGF0ZSkKKwkJY2FtLT5pMmNfc3RhdGUgfD0gVzk5NjZfSTJDX1dfQ0xPQ0s7CisJZWxzZQorCQljYW0tPmkyY19zdGF0ZSAmPSB+Vzk5NjZfSTJDX1dfQ0xPQ0s7CisKKwl3OTk2Nl93UmVnKGNhbSwgMHgxOCwgY2FtLT5pMmNfc3RhdGUpOworCXVkZWxheSg1KTsKKwkKKwkvLyB3ZSBnbyB0byBoaWdoLCB3ZSBhbHNvIGV4cGVjdCB0aGUgcGVyaXBoZXJhbCB0byBhY2suCisJaWYgKHN0YXRlKSB7CisJCXRpbWVvdXQgPSBqaWZmaWVzICsgMTAwOworCQl3aGlsZSAoIXc5OTY2X2kyY19nZXRzY2woY2FtKSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvLyBHZXQgcGVyaXBoZXJhbCBkYXRhIGxpbmUKKy8vIEV4cGVjdHMgYSBjbGFpbWVkIHBkZXYuCitzdGF0aWMgaW5saW5lIGludCB3OTk2Nl9pMmNfZ2V0c2RhKHN0cnVjdCB3OTk2Nl9kZXYqIGNhbSkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyIHN0YXRlID0gdzk5NjZfclJlZyhjYW0sIDB4MTgpOworCXJldHVybiAoKHN0YXRlICYgVzk5NjZfSTJDX1JfREFUQSkgPiAwKTsKK30KKworLy8gV3JpdGUgYSBieXRlIHdpdGggYWNrIHRvIHRoZSBpMmMgYnVzLgorLy8gRXhwZWN0cyBhIGNsYWltZWQgcGRldi4gLTEgb24gZXJyb3IKK3N0YXRpYyBpbnQgdzk5NjZfaTJjX3dieXRlKHN0cnVjdCB3OTk2Nl9kZXYqIGNhbSwgaW50IGRhdGEpCit7CisJaW50IGk7CisJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pCisJeworCQl3OTk2Nl9pMmNfc2V0c2RhKGNhbSwgKGRhdGEgPj4gaSkgJiAweDAxKTsKKworCQlpZiAodzk5NjZfaTJjX3NldHNjbChjYW0sIDEpID09IC0xKQorCQkJcmV0dXJuIC0xOwkJCQorCQl3OTk2Nl9pMmNfc2V0c2NsKGNhbSwgMCk7CisJfQorCisJdzk5NjZfaTJjX3NldHNkYShjYW0sIDEpOworCQorCWlmICh3OTk2Nl9pMmNfc2V0c2NsKGNhbSwgMSkgPT0gLTEpCisJCXJldHVybiAtMTsKKwl3OTk2Nl9pMmNfc2V0c2NsKGNhbSwgMCk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8vIFJlYWQgYSBkYXRhIGJ5dGUgd2l0aCBhY2sgZnJvbSB0aGUgaTJjLWJ1cworLy8gRXhwZWN0cyBhIGNsYWltZWQgcGRldi4gLTEgb24gZXJyb3IKKyNpZiAwCitzdGF0aWMgaW50IHc5OTY2X2kyY19yYnl0ZShzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0pCit7CisJdW5zaWduZWQgY2hhciBkYXRhID0gMHgwMDsKKwlpbnQgaTsJCisJCisJdzk5NjZfaTJjX3NldHNkYShjYW0sIDEpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCWlmICh3OTk2Nl9pMmNfc2V0c2NsKGNhbSwgMSkgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJCWRhdGEgPSBkYXRhIDw8IDE7CisJCWlmICh3OTk2Nl9pMmNfZ2V0c2RhKGNhbSkpCisJCQlkYXRhIHw9IDB4MDE7CisJCQorCQl3OTk2Nl9pMmNfc2V0c2NsKGNhbSwgMCk7CisJfQorCXJldHVybiBkYXRhOworfQorI2VuZGlmCisKKy8vIFJlYWQgYSByZWdpc3RlciBmcm9tIHRoZSBpMmMgZGV2aWNlLgorLy8gRXhwZWN0cyBjbGFpbWVkIHBkZXYuIC0xIG9uIGVycm9yCisjaWYgMAorc3RhdGljIGludCB3OTk2Nl9yUmVnX2kyYyhzdHJ1Y3Qgdzk5NjZfZGV2KiBjYW0sIGludCByZWcpCit7CisJaW50IGRhdGE7CisKKwl3OTk2Nl9pMmNfc2V0c2RhKGNhbSwgMCk7CisJdzk5NjZfaTJjX3NldHNjbChjYW0sIDApOworCisJaWYgKAorCQl3OTk2Nl9pMmNfd2J5dGUoY2FtLCBXOTk2Nl9JMkNfV19JRCkgPT0gLTEgfHwKKwkJdzk5NjZfaTJjX3dieXRlKGNhbSwgcmVnKSA9PSAtMQorCSkKKwkJcmV0dXJuIC0xOworCisJdzk5NjZfaTJjX3NldHNkYShjYW0sIDEpOworCWlmICh3OTk2Nl9pMmNfc2V0c2NsKGNhbSwgMSkgPT0gLTEpCisJCXJldHVybiAtMTsKKwl3OTk2Nl9pMmNfc2V0c2RhKGNhbSwgMCk7CisJdzk5NjZfaTJjX3NldHNjbChjYW0sIDApOworCisJaWYgKAorCQl3OTk2Nl9pMmNfd2J5dGUoY2FtLCBXOTk2Nl9JMkNfUl9JRCkgPT0gLTEgfHwKKwkJKGRhdGEgPSB3OTk2Nl9pMmNfcmJ5dGUoY2FtKSkgPT0gLTEKKwkpCisJCXJldHVybiAtMTsKKworCXc5OTY2X2kyY19zZXRzZGEoY2FtLCAwKTsKKwkKKwlpZiAodzk5NjZfaTJjX3NldHNjbChjYW0sIDEpID09IC0xKQorCQlyZXR1cm4gLTE7CisJdzk5NjZfaTJjX3NldHNkYShjYW0sIDEpOworCQorCXJldHVybiBkYXRhOworfQorI2VuZGlmCisKKy8vIFdyaXRlIGEgcmVnaXN0ZXIgdG8gdGhlIGkyYyBkZXZpY2UuCisvLyBFeHBlY3RzIGNsYWltZWQgcGRldi4gLTEgb24gZXJyb3IKK3N0YXRpYyBpbnQgdzk5NjZfd1JlZ19pMmMoc3RydWN0IHc5OTY2X2RldiogY2FtLCBpbnQgcmVnLCBpbnQgZGF0YSkKK3sKKwl3OTk2Nl9pMmNfc2V0c2RhKGNhbSwgMCk7CisJdzk5NjZfaTJjX3NldHNjbChjYW0sIDApOworCisJaWYgKAorCQl3OTk2Nl9pMmNfd2J5dGUoY2FtLCBXOTk2Nl9JMkNfV19JRCkgPT0gLTEgfHwKKwkJdzk5NjZfaTJjX3dieXRlKGNhbSwgcmVnKSA9PSAtMSB8fAorCQl3OTk2Nl9pMmNfd2J5dGUoY2FtLCBkYXRhKSA9PSAtMQorCSkKKwkJcmV0dXJuIC0xOworCisJdzk5NjZfaTJjX3NldHNkYShjYW0sIDApOworCWlmICh3OTk2Nl9pMmNfc2V0c2NsKGNhbSwgMSkgPT0gLTEpCisJCXJldHVybiAtMTsKKwkJCisJdzk5NjZfaTJjX3NldHNkYShjYW0sIDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglWaWRlbzRsaW51eCBpbnRlcmZhY2luZworICovCisKK3N0YXRpYyBpbnQgdzk5NjZfdjRsX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB3OTk2Nl9kZXYgKmNhbSA9IHZkZXYtPnByaXY7CisJCisJc3dpdGNoKGNtZCkKKwl7CisJY2FzZSBWSURJT0NHQ0FQOgorCXsKKwkJc3RhdGljIHN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IHZjYXAgPSB7CisJCQkubmFtZSAgICAgID0gVzk5NjZfRFJJVkVSTkFNRSwKKwkJCS50eXBlICAgICAgPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfU0NBTEVTLAorCQkJLmNoYW5uZWxzICA9IDEsCisJCQkubWF4d2lkdGggID0gVzk5NjZfV05EX01BWF9XLAorCQkJLm1heGhlaWdodCA9IFc5OTY2X1dORF9NQVhfSCwKKwkJCS5taW53aWR0aCAgPSAyLAorCQkJLm1pbmhlaWdodCA9IDEsCisJCX07CisJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisJCSpjYXAgPSB2Y2FwOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NHQ0hBTjoKKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2Y2ggPSBhcmc7CisJCWlmKHZjaC0+Y2hhbm5lbCAhPSAwKQkvLyBXZSBvbmx5IHN1cHBvcnQgb25lIGNoYW5uZWwgKCMwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbXNldCh2Y2gsMCxzaXplb2YoKnZjaCkpOworCQlzdHJjcHkodmNoLT5uYW1lLCAiQ0NELWlucHV0Iik7CisJCXZjaC0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTQ0hBTjoKKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2Y2ggPSBhcmc7CisJCWlmKHZjaC0+Y2hhbm5lbCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ0dUVU5FUjoKKwl7CisJCXN0cnVjdCB2aWRlb190dW5lciAqdnR1bmUgPSBhcmc7CisJCWlmKHZ0dW5lLT50dW5lciAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0cmNweSh2dHVuZS0+bmFtZSwgIm5vIHR1bmVyIik7CisJCXZ0dW5lLT5yYW5nZWxvdyA9IDA7CisJCXZ0dW5lLT5yYW5nZWhpZ2ggPSAwOworCQl2dHVuZS0+ZmxhZ3MgPSBWSURFT19UVU5FUl9OT1JNOworCQl2dHVuZS0+bW9kZSA9IFZJREVPX01PREVfQVVUTzsKKwkJdnR1bmUtPnNpZ25hbCA9IDB4ZmZmZjsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU1RVTkVSOgorCXsKKwkJc3RydWN0IHZpZGVvX3R1bmVyICp2dHVuZSA9IGFyZzsKKwkJaWYgKHZ0dW5lLT50dW5lciAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2dHVuZS0+bW9kZSAhPSBWSURFT19NT0RFX0FVVE8pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DR1BJQ1Q6CisJeworCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSB2cGljID0geworCQkJY2FtLT5icmlnaHRuZXNzIDw8IDgsCS8vIGJyaWdodG5lc3MKKwkJCShjYW0tPmh1ZSArIDEyOCkgPDwgOCwJLy8gaHVlCisJCQljYW0tPmNvbG9yIDw8IDksCS8vIGNvbG9yCisJCQljYW0tPmNvbnRyYXN0IDw8IDksCS8vIGNvbnRyYXN0CisJCQkweDgwMDAsCQkJLy8gd2hpdGVuZXNzCisJCQkxNiwgVklERU9fUEFMRVRURV9ZVVY0MjIvLyBicHAsIHBhbGV0dGUgZm9ybWF0CisJCX07CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwaWMgPSBhcmc7CisJCSpwaWMgPSB2cGljOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTUElDVDoKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICp2cGljID0gYXJnOworCQlpZiAodnBpYy0+ZGVwdGggIT0gMTYgfHwgdnBpYy0+cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1lVVjQyMikKKwkJCXJldHVybiAtRUlOVkFMOworCQkJCisJCWNhbS0+YnJpZ2h0bmVzcyA9IHZwaWMtPmJyaWdodG5lc3MgPj4gODsKKwkJY2FtLT5odWUgPSAodnBpYy0+aHVlID4+IDgpIC0gMTI4OworCQljYW0tPmNvbG9yID0gdnBpYy0+Y29sb3VyID4+IDk7CisJCWNhbS0+Y29udHJhc3QgPSB2cGljLT5jb250cmFzdCA+PiA5OworCisJCXc5OTY2X3BkZXZfY2xhaW0oY2FtKTsKKwkJCisJCWlmICgKKwkJCXc5OTY2X3dSZWdfaTJjKGNhbSwgMHgwYSwgY2FtLT5icmlnaHRuZXNzKSA9PSAtMSB8fAorCQkJdzk5NjZfd1JlZ19pMmMoY2FtLCAweDBiLCBjYW0tPmNvbnRyYXN0KSA9PSAtMSB8fAorCQkJdzk5NjZfd1JlZ19pMmMoY2FtLCAweDBjLCBjYW0tPmNvbG9yKSA9PSAtMSB8fAorCQkJdzk5NjZfd1JlZ19pMmMoY2FtLCAweDBkLCBjYW0tPmh1ZSkgPT0gLTEKKwkJKSB7CisJCQl3OTk2Nl9wZGV2X3JlbGVhc2UoY2FtKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCQorCQl3OTk2Nl9wZGV2X3JlbGVhc2UoY2FtKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU1dJTjoKKwl7CisJCWludCByZXQ7CisJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3aW4gPSBhcmc7CisJCQorCQlpZiAodndpbi0+ZmxhZ3MgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAodndpbi0+Y2xpcGNvdW50ICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHZ3aW4tPndpZHRoIDwgMiB8fCB2d2luLT53aWR0aCA+IFc5OTY2X1dORF9NQVhfVykKKwkJCXJldHVybiAtRUlOVkFMOwkJCisJCWlmICh2d2luLT5oZWlnaHQgPCAxIHx8IHZ3aW4tPmhlaWdodCA+IFc5OTY2X1dORF9NQVhfSCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8vIFVwZGF0ZSBjYW1lcmEgcmVncworCQl3OTk2Nl9wZGV2X2NsYWltKGNhbSk7CisJCXJldCA9IHc5OTY2X3NldHVwKGNhbSwgMCwgMCwgMTAyMywgMTAyMywgdndpbi0+d2lkdGgsIHZ3aW4tPmhlaWdodCk7CisJCXc5OTY2X3BkZXZfcmVsZWFzZShjYW0pOworCQkKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlEUFJJTlRGKCJWSURJT0NTV0lOOiB3OTk2Nl9zZXR1cCgpIGZhaWxlZC5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ0dXSU46CisJeworCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2d2luID0gYXJnOworCQltZW1zZXQodndpbiwgMCwgc2l6ZW9mKCp2d2luKSk7CisJCXZ3aW4tPndpZHRoID0gY2FtLT53aWR0aDsKKwkJdndpbi0+aGVpZ2h0ID0gY2FtLT5oZWlnaHQ7CisJCXJldHVybiAwOworCX0KKwkvLyBVbmltcGxlbWVudGVkCisJY2FzZSBWSURJT0NDQVBUVVJFOgkKKwljYXNlIFZJRElPQ0dGQlVGOgorCWNhc2UgVklESU9DU0ZCVUY6CisJY2FzZSBWSURJT0NLRVk6CisJY2FzZSBWSURJT0NHRlJFUToKKwljYXNlIFZJRElPQ1NGUkVROgorCWNhc2UgVklESU9DR0FVRElPOgorCWNhc2UgVklESU9DU0FVRElPOgorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3OTk2Nl92NGxfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCB3OTk2Nl92NGxfZG9faW9jdGwpOworfQorCisvLyBDYXB0dXJlIGRhdGEKK3N0YXRpYyBzc2l6ZV90IHc5OTY2X3Y0bF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB3OTk2Nl9kZXYgKmNhbSA9IHZkZXYtPnByaXY7CisJdW5zaWduZWQgY2hhciBhZGRyID0gMHhhMDsJLy8gRUNQLCByZWFkLCBDQ0QtdHJhbnNmZXIsIDAwMDAwCisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRlc3QgPSAodW5zaWduZWQgY2hhciBfX3VzZXIgKilidWY7CisJdW5zaWduZWQgbG9uZyBkbGVmdCA9IGNvdW50OworCXVuc2lnbmVkIGNoYXIgKnRidWY7CisJCisJLy8gV2h5IHdvdWxkIGFueW9uZSB3YW50IG1vcmUgdGhhbiB0aGlzPz8KKwlpZiAoY291bnQgPiBjYW0tPndpZHRoICogY2FtLT5oZWlnaHQgKiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwl3OTk2Nl9wZGV2X2NsYWltKGNhbSk7CisJdzk5NjZfd1JlZyhjYW0sIDB4MDAsIDB4MDIpOwkvLyBSZXNldCBFQ1AtRklGTyBidWZmZXIKKwl3OTk2Nl93UmVnKGNhbSwgMHgwMCwgMHgwMCk7CS8vIFJldHVybiB0byBub3JtYWwgb3BlcmF0aW9uCisJdzk5NjZfd1JlZyhjYW0sIDB4MDEsIDB4OTgpOwkvLyBFbmFibGUgY2FwdHVyZQorCisJLy8gd3JpdGUgc3BlY2lhbCBjYXB0dXJlLWFkZHIgYW5kIG5lZ290aWF0ZSBpbnRvIGRhdGEgdHJhbnNmZXIJCisJaWYgKAorCQkocGFycG9ydF9uZWdvdGlhdGUoY2FtLT5wcG9ydCwgY2FtLT5wcG1vZGV8SUVFRTEyODRfQUREUikgIT0gMAkpfHwKKwkJKHBhcnBvcnRfd3JpdGUoY2FtLT5wcG9ydCwgJmFkZHIsIDEpICE9IDEJCQkJCQkpfHwKKwkJKHBhcnBvcnRfbmVnb3RpYXRlKGNhbS0+cHBvcnQsIGNhbS0+cHBtb2RlfElFRUUxMjg0X0RBVEEpICE9IDAJKQorCSkgeworCQl3OTk2Nl9wZGV2X3JlbGVhc2UoY2FtKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdGJ1ZiA9IGttYWxsb2MoVzk5NjZfUkJVRkZFUiwgR0ZQX0tFUk5FTCk7CisJaWYgKHRidWYgPT0gTlVMTCkgeworCQljb3VudCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlKGRsZWZ0ID4gMCkKKwl7CisJCXVuc2lnbmVkIGxvbmcgdHNpemUgPSAoZGxlZnQgPiBXOTk2Nl9SQlVGRkVSKSA/IFc5OTY2X1JCVUZGRVIgOiBkbGVmdDsKKwkKKwkJaWYgKHBhcnBvcnRfcmVhZChjYW0tPnBwb3J0LCB0YnVmLCB0c2l6ZSkgPCB0c2l6ZSkgeworCQkJY291bnQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihkZXN0LCB0YnVmLCB0c2l6ZSkgIT0gMCkgeworCQkJY291bnQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJZGVzdCArPSB0c2l6ZTsKKwkJZGxlZnQgLT0gdHNpemU7CisJfQorCisJdzk5NjZfd1JlZyhjYW0sIDB4MDEsIDB4MTgpOwkvLyBEaXNhYmxlIGNhcHR1cmUKKworb3V0OgorCWtmcmVlKHRidWYpOworCXc5OTY2X3BkZXZfcmVsZWFzZShjYW0pOworCisJcmV0dXJuIGNvdW50OworfQorCisKKy8vIENhbGxlZCBvbmNlIGZvciBldmVyeSBwYXJwb3J0IG9uIGluaXQKK3N0YXRpYyB2b2lkIHc5OTY2X2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgVzk5NjZfTUFYQ0FNUzsgaSsrKQorCXsKKwkJaWYgKHc5OTY2X2NhbXNbaV0uZGV2X3N0YXRlICE9IDApCS8vIENhbSBpcyBhbHJlYWR5IGFzc2lnbmVkCisJCQljb250aW51ZTsKKwkJaWYgKAorCQkJc3RyY21wKHBhcmRldltpXSwgImFnZ3Jlc3NpdmUiKSA9PSAwIHx8CisJCQlzdHJjbXAocGFyZGV2W2ldLCBwb3J0LT5uYW1lKSA9PSAwCisJCSkgeworCQkJaWYgKHc5OTY2X2luaXQoJnc5OTY2X2NhbXNbaV0sIHBvcnQpICE9IDApCisJCQl3OTk2Nl90ZXJtKCZ3OTk2Nl9jYW1zW2ldKTsKKwkJCWJyZWFrOwkvLyByZXR1cm4KKwkJfQorCX0KK30KKworLy8gQ2FsbGVkIG9uY2UgZm9yIGV2ZXJ5IHBhcnBvcnQgb24gdGVybWluYXRpb24KK3N0YXRpYyB2b2lkIHc5OTY2X2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgVzk5NjZfTUFYQ0FNUzsgaSsrKQorCWlmICh3OTk2Nl9jYW1zW2ldLmRldl9zdGF0ZSAhPSAwICYmIHc5OTY2X2NhbXNbaV0ucHBvcnQgPT0gcG9ydCkKKwkJdzk5NjZfdGVybSgmdzk5NjZfY2Ftc1tpXSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciB3OTk2Nl9wcGQgPSB7CisJLm5hbWUgPSBXOTk2Nl9EUklWRVJOQU1FLAorCS5hdHRhY2ggPSB3OTk2Nl9hdHRhY2gsCisJLmRldGFjaCA9IHc5OTY2X2RldGFjaCwKK307CisKKy8vIE1vZHVsZSBlbnRyeSBwb2ludAorc3RhdGljIGludCBfX2luaXQgdzk5NjZfbW9kX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgVzk5NjZfTUFYQ0FNUzsgaSsrKQorCQl3OTk2Nl9jYW1zW2ldLmRldl9zdGF0ZSA9IDA7CisKKwlyZXR1cm4gcGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIoJnc5OTY2X3BwZCk7Cit9CisKKy8vIE1vZHVsZSBjbGVhbnVwCitzdGF0aWMgdm9pZCBfX2V4aXQgdzk5NjZfbW9kX3Rlcm0odm9pZCkKK3sKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZ3OTk2Nl9wcGQpOworfQorCittb2R1bGVfaW5pdCh3OTk2Nl9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdCh3OTk2Nl9tb2RfdGVybSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlNmFkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4uaApAQCAtMCwwICsxLDUxNSBAQAorLyogCisgKiB6b3JhbiAtIElvbWVnYSBCdXogZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFJhaW5lciBKb2hhbm5pIDxSYWluZXJASm9oYW5uaS5kZT4KKyAqCisgKiBiYXNlZCBvbgorICoKKyAqIHpvcmFuLjAuMC4zIENvcHlyaWdodCAoQykgMTk5OCBEYXZlIFBlcmtzIDxkcGVya3NAaWJtLm5ldD4KKyAqCisgKiBhbmQKKyAqCisgKiBidHR2IC0gQnQ4NDggZnJhbWUgZ3JhYmJlciBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMTk5Niw5Nyw5OCBSYWxwaCAgTWV0emxlciAocmprbUB0aHAudW5pLWtvZWxuLmRlKQorICogICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIChtb2NtQHRocC51bmkta29lbG4uZGUpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQlVaX0hfCisjZGVmaW5lIF9CVVpfSF8KKworc3RydWN0IHpvcmFuX3JlcXVlc3RidWZmZXJzIHsKKwl1bnNpZ25lZCBsb25nIGNvdW50OwkvKiBOdW1iZXIgb2YgYnVmZmVycyBmb3IgTUpQRUcgZ3JhYmJpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHNpemU7CS8qIFNpemUgUEVSIEJVRkZFUiBpbiBieXRlcyAqLworfTsKKworc3RydWN0IHpvcmFuX3N5bmMgeworCXVuc2lnbmVkIGxvbmcgZnJhbWU7CS8qIG51bWJlciBvZiBidWZmZXIgdGhhdCBoYXMgYmVlbiBmcmVlJ2QgKi8KKwl1bnNpZ25lZCBsb25nIGxlbmd0aDsJLyogbnVtYmVyIG9mIGNvZGUgYnl0ZXMgaW4gYnVmZmVyIChjYXB0dXJlIG9ubHkpICovCisJdW5zaWduZWQgbG9uZyBzZXE7CS8qIGZyYW1lIHNlcXVlbmNlIG51bWJlciAqLworCXN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsJLyogdGltZXN0YW1wICovCit9OworCitzdHJ1Y3Qgem9yYW5fc3RhdHVzIHsKKwlpbnQgaW5wdXQ7CQkvKiBJbnB1dCBjaGFubmVsLCBoYXMgdG8gYmUgc2V0IHByaW9yIHRvIEJVWklPQ19HX1NUQVRVUyAqLworCWludCBzaWduYWw7CQkvKiBSZXR1cm5lZDogMSBpZiB2YWxpZCB2aWRlbyBzaWduYWwgZGV0ZWN0ZWQgKi8KKwlpbnQgbm9ybTsJCS8qIFJldHVybmVkOiBWSURFT19NT0RFX1BBTCBvciBWSURFT19NT0RFX05UU0MgKi8KKwlpbnQgY29sb3I7CQkvKiBSZXR1cm5lZDogMSBpZiBjb2xvciBzaWduYWwgZGV0ZWN0ZWQgKi8KK307CisKK3N0cnVjdCB6b3Jhbl9wYXJhbXMgeworCisJLyogVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBvbmx5IGJlIHF1ZXJpZWQgKi8KKworCWludCBtYWpvcl92ZXJzaW9uOwkvKiBNYWpvciB2ZXJzaW9uIG51bWJlciBvZiBkcml2ZXIgKi8KKwlpbnQgbWlub3JfdmVyc2lvbjsJLyogTWlub3IgdmVyc2lvbiBudW1iZXIgb2YgZHJpdmVyICovCisKKwkvKiBNYWluIGNvbnRyb2wgcGFyYW1ldGVycyAqLworCisJaW50IGlucHV0OwkJLyogSW5wdXQgY2hhbm5lbDogMCA9IENvbXBvc2l0ZSwgMSA9IFMtVkhTICovCisJaW50IG5vcm07CQkvKiBOb3JtOiBWSURFT19NT0RFX1BBTCBvciBWSURFT19NT0RFX05UU0MgKi8KKwlpbnQgZGVjaW1hdGlvbjsJCS8qIGRlY2ltYXRpb24gb2YgY2FwdHVyZWQgdmlkZW8sCisJCQkJICogZW5sYXJnZW1lbnQgb2YgdmlkZW8gcGxheWVkIGJhY2suCisJCQkJICogVmFsaWQgdmFsdWVzIGFyZSAxLCAyLCA0IG9yIDAuCisJCQkJICogMCBpcyBhIHNwZWNpYWwgdmFsdWUgd2hlcmUgdGhlIHVzZXIKKwkJCQkgKiBoYXMgZnVsbCBjb250cm9sIG92ZXIgdmlkZW8gc2NhbGluZyAqLworCisJLyogVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG9ubHkgaGF2ZSB0byBiZSBzZXQgaWYgZGVjaW1hdGlvbj09MCwKKwkgKiBmb3Igb3RoZXIgdmFsdWVzIG9mIGRlY2ltYXRpb24gdGhleSBwcm92aWRlIHRoZSBkYXRhIGhvdyB0aGUgaW1hZ2UgaXMgY2FwdHVyZWQgKi8KKworCWludCBIb3JEY207CQkvKiBIb3Jpem9udGFsIGRlY2ltYXRpb246IDEsIDIgb3IgNCAqLworCWludCBWZXJEY207CQkvKiBWZXJ0aWNhbCBkZWNpbWF0aW9uOiAxIG9yIDIgKi8KKwlpbnQgVG1wRGNtOwkJLyogVGVtcG9yYWwgZGVjaW1hdGlvbjogMSBvciAyLAorCQkJCSAqIGlmIFRtcERjbT09MiBpbiBjYXB0dXJlIGV2ZXJ5IHNlY29uZCBmcmFtZSBpcyBkcm9wcGVkLAorCQkJCSAqIGluIHBsYXliYWNrIGV2ZXJ5IGZyYW1lIGlzIHBsYXllZCB0d2ljZSAqLworCWludCBmaWVsZF9wZXJfYnVmZjsJLyogTnVtYmVyIG9mIGZpZWxkcyBwZXIgYnVmZmVyOiAxIG9yIDIgKi8KKwlpbnQgaW1nX3g7CQkvKiBzdGFydCBvZiBpbWFnZSBpbiB4IGRpcmVjdGlvbiAqLworCWludCBpbWdfeTsJCS8qIHN0YXJ0IG9mIGltYWdlIGluIHkgZGlyZWN0aW9uICovCisJaW50IGltZ193aWR0aDsJCS8qIGltYWdlIHdpZHRoIEJFRk9SRSBkZWNpbWF0aW9uLAorCQkJCSAqIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBIb3JEY20qMTYgKi8KKwlpbnQgaW1nX2hlaWdodDsJCS8qIGltYWdlIGhlaWdodCBCRUZPUkUgZGVjaW1hdGlvbiwKKwkJCQkgKiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgVmVyRGNtKjggKi8KKworCS8qIC0tLSBFbmQgb2YgcGFyYW1ldGVycyBmb3IgZGVjaW1hdGlvbj09MCBvbmx5IC0tLSAqLworCisJLyogSlBFRyBjb250cm9sIHBhcmFtZXRlcnMgKi8KKworCWludCBxdWFsaXR5OwkJLyogTWVhc3VyZSBmb3IgcXVhbGl0eSBvZiBjb21wcmVzc2VkIGltYWdlcy4KKwkJCQkgKiBTY2FsZXMgbGluZWFybHkgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBpbWFnZXMuCisJCQkJICogTXVzdCBiZSBiZWV0d2VlbiAwIGFuZCAxMDAsIDEwMCBpcyBhIGNvbXByZXNzaW9uCisJCQkJICogcmF0aW8gb2YgMTo0ICovCisKKwlpbnQgb2RkX2V2ZW47CQkvKiBXaGljaCBmaWVsZCBzaG91bGQgY29tZSBmaXJzdCA/Pz8gKi8KKworCWludCBBUFBuOwkJLyogTnVtYmVyIG9mIEFQUCBzZWdtZW50IHRvIGJlIHdyaXR0ZW4sIG11c3QgYmUgMC4uMTUgKi8KKwlpbnQgQVBQX2xlbjsJCS8qIExlbmd0aCBvZiBkYXRhIGluIEpQRUcgQVBQbiBzZWdtZW50ICovCisJY2hhciBBUFBfZGF0YVs2MF07CS8qIERhdGEgaW4gdGhlIEpQRUcgQVBQbiBzZWdtZW50LiAqLworCisJaW50IENPTV9sZW47CQkvKiBMZW5ndGggb2YgZGF0YSBpbiBKUEVHIENPTSBzZWdtZW50ICovCisJY2hhciBDT01fZGF0YVs2MF07CS8qIERhdGEgaW4gSlBFRyBDT00gc2VnbWVudCAqLworCisJdW5zaWduZWQgbG9uZyBqcGVnX21hcmtlcnM7CS8qIFdoaWNoIG1hcmtlcnMgc2hvdWxkIGdvIGludG8gdGhlIEpQRUcgb3V0cHV0LgorCQkJCQkgKiBVbmxlc3MgeW91IGV4YWN0bHkga25vdyB3aGF0IHlvdSBkbywgbGVhdmUgdGhlbSB1bnRvdWNoZWQuCisJCQkJCSAqIElubHVkaW5nIGxlc3MgbWFya2VycyB3aWxsIG1ha2UgdGhlIHJlc3VsdGluZyBjb2RlCisJCQkJCSAqIHNtYWxsZXIsIGJ1dCB0aGVyZSB3aWxsIGJlIGZld2VyIGFwbGljYXRpb25zCisJCQkJCSAqIHdoaWNoIGNhbiByZWFkIGl0LgorCQkJCQkgKiBUaGUgcHJlc2VuY2Ugb2YgdGhlIEFQUCBhbmQgQ09NIG1hcmtlciBpcworCQkJCQkgKiBpbmZsdWVuY2VkIGJ5IEFQUDBfbGVuIGFuZCBDT01fbGVuIE9OTFkhICovCisjZGVmaW5lIEpQRUdfTUFSS0VSX0RIVCAoMTw8MykJLyogRGVmaW5lIEh1ZmZtYW4gVGFibGVzICovCisjZGVmaW5lIEpQRUdfTUFSS0VSX0RRVCAoMTw8NCkJLyogRGVmaW5lIFF1YW50aXphdGlvbiBUYWJsZXMgKi8KKyNkZWZpbmUgSlBFR19NQVJLRVJfRFJJICgxPDw1KQkvKiBEZWZpbmUgUmVzdGFydCBJbnRlcnZhbCAqLworI2RlZmluZSBKUEVHX01BUktFUl9DT00gKDE8PDYpCS8qIENvbW1lbnQgc2VnbWVudCAqLworI2RlZmluZSBKUEVHX01BUktFUl9BUFAgKDE8PDcpCS8qIEFwcCBzZWdtZW50LCBkcml2ZXIgd2lsbCBhbGx3YXlzIHVzZSBBUFAwICovCisKKwlpbnQgVkZJRk9fRkI7CQkvKiBGbGFnIGZvciBlbmFibGluZyBWaWRlbyBGaWZvIEZlZWRiYWNrLgorCQkJCSAqIElmIHRoaXMgZmxhZyBpcyB0dXJuZWQgb24gYW5kIEpQRUcgZGVjb21wcmVzc2luZworCQkJCSAqIGlzIGdvaW5nIHRvIHRoZSBzY3JlZW4sIHRoZSBkZWNvbXByZXNzIHByb2Nlc3MKKwkJCQkgKiBpcyBzdG9wcGVkIGV2ZXJ5IHRpbWUgdGhlIFZpZGVvIEZpZm8gaXMgZnVsbC4KKwkJCQkgKiBUaGlzIGVuYWJsZXMgYSBzbW9vdGggZGVjb21wcmVzcyB0byB0aGUgc2NyZWVuCisJCQkJICogYnV0IHRoZSB2aWRlbyBvdXRwdXQgc2lnbmFsIHdpbGwgZ2V0IHNjcmFtYmxlZCAqLworCisJLyogTWlzYyAqLworCisJY2hhciByZXNlcnZlZFszMTJdOwkvKiBNYWtlcyA1MTIgYnl0ZXMgZm9yIHRoaXMgc3RydWN0dXJlICovCit9OworCisvKgorUHJpdmF0ZSBJT0NUTCB0byBzZXQgdXAgZm9yIGRpc3BsYXlpbmcgTUpQRUcKKyovCisjZGVmaW5lIEJVWklPQ19HX1BBUkFNUyAgICAgICBfSU9SICgndicsIEJBU0VfVklESU9DUFJJVkFURSswLCAgc3RydWN0IHpvcmFuX3BhcmFtcykKKyNkZWZpbmUgQlVaSU9DX1NfUEFSQU1TICAgICAgIF9JT1dSKCd2JywgQkFTRV9WSURJT0NQUklWQVRFKzEsICBzdHJ1Y3Qgem9yYW5fcGFyYW1zKQorI2RlZmluZSBCVVpJT0NfUkVRQlVGUyAgICAgICAgX0lPV1IoJ3YnLCBCQVNFX1ZJRElPQ1BSSVZBVEUrMiwgIHN0cnVjdCB6b3Jhbl9yZXF1ZXN0YnVmZmVycykKKyNkZWZpbmUgQlVaSU9DX1FCVUZfQ0FQVCAgICAgIF9JT1cgKCd2JywgQkFTRV9WSURJT0NQUklWQVRFKzMsICBpbnQpCisjZGVmaW5lIEJVWklPQ19RQlVGX1BMQVkgICAgICBfSU9XICgndicsIEJBU0VfVklESU9DUFJJVkFURSs0LCAgaW50KQorI2RlZmluZSBCVVpJT0NfU1lOQyAgICAgICAgICAgX0lPUiAoJ3YnLCBCQVNFX1ZJRElPQ1BSSVZBVEUrNSwgIHN0cnVjdCB6b3Jhbl9zeW5jKQorI2RlZmluZSBCVVpJT0NfR19TVEFUVVMgICAgICAgX0lPV1IoJ3YnLCBCQVNFX1ZJRElPQ1BSSVZBVEUrNiwgIHN0cnVjdCB6b3Jhbl9zdGF0dXMpCisKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNQUpPUl9WRVJTSU9OIDAJCS8qIGRyaXZlciBtYWpvciB2ZXJzaW9uICovCisjZGVmaW5lIE1JTk9SX1ZFUlNJT04gOQkJLyogZHJpdmVyIG1pbm9yIHZlcnNpb24gKi8KKyNkZWZpbmUgUkVMRUFTRV9WRVJTSU9OIDUJLyogcmVsZWFzZSB2ZXJzaW9uICovCisKKyNkZWZpbmUgWk9SQU5fTkFNRSAgICAiWk9SQU4iCS8qIG5hbWUgb2YgdGhlIGRldmljZSAqLworCisjZGVmaW5lIFpSX0RFVk5BTUUoenIpICgoenIpLT5uYW1lKQorCisjZGVmaW5lICAgQlVaX01BWF9XSURUSCAgICh6ci0+dGltaW5nLT5XYSkKKyNkZWZpbmUgICBCVVpfTUFYX0hFSUdIVCAgKHpyLT50aW1pbmctPkhhKQorI2RlZmluZSAgIEJVWl9NSU5fV0lEVEggICAgMzIJLyogbmV2ZXIgZGlzcGxheSBsZXNzIHRoYW4gMzIgcGl4ZWxzICovCisjZGVmaW5lICAgQlVaX01JTl9IRUlHSFQgICAyNAkvKiBuZXZlciBkaXNwbGF5IGxlc3MgdGhhbiAyNCByb3dzICovCisKKyNkZWZpbmUgQlVaX05VTV9TVEFUX0NPTSAgICA0CisjZGVmaW5lIEJVWl9NQVNLX1NUQVRfQ09NICAgMworCisjZGVmaW5lIEJVWl9NQVhfRlJBTUUgICAgIDI1NgkvKiBNdXN0IGJlIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBCVVpfTUFTS19GUkFNRSAgICAyNTUJLyogTXVzdCBiZSBCVVpfTUFYX0ZSQU1FLTEgKi8KKworI2RlZmluZSBCVVpfTUFYX0lOUFVUICAgICAgIDgKKworI2lmIFZJREVPX01BWF9GUkFNRSA8PSAzMgorIyAgIGRlZmluZSAgIFY0TF9NQVhfRlJBTUUgICAzMgorI2VsaWYgVklERU9fTUFYX0ZSQU1FIDw9IDY0CisjICAgZGVmaW5lICAgVjRMX01BWF9GUkFNRSAgIDY0CisjZWxzZQorIyAgIGVycm9yICAgIlRvbyBtYW55IHZpZGVvIGZyYW1lIGJ1ZmZlcnMgdG8gaGFuZGxlIgorI2VuZGlmCisjZGVmaW5lICAgVjRMX01BU0tfRlJBTUUgICAoVjRMX01BWF9GUkFNRSAtIDEpCisKKyNkZWZpbmUgTUFYX0tNQUxMT0NfTUVNICgxMjgqMTAyNCkKKworI2luY2x1ZGUgInpyMzYwNTcuaCIKKworZW51bSBjYXJkX3R5cGUgeworCVVOS05PV04gPSAtMSwKKworCS8qIFBpbm5hY2xlL01pcm8gKi8KKwlEQzEwX29sZCwJCS8qIERDMzAgbGlrZSAqLworCURDMTBfbmV3LAkJLyogREMxMHBsdXMgbGlrZSAqLworCURDMTBwbHVzLAorCURDMzAsCisJREMzMHBsdXMsCisKKwkvKiBMaW51eCBNZWRpYSBMYWJzICovCisJTE1MMzMsCisJTE1MMzNSMTAsCisKKwkvKiBJb21lZ2EgKi8KKwlCVVosCisKKwkvKiB0b3RhbCBudW1iZXIgb2YgY2FyZHMgKi8KKwlOVU1fQ0FSRFMKK307CisKK2VudW0gem9yYW5fY29kZWNfbW9kZSB7CisJQlVaX01PREVfSURMRSwJCS8qIG5vdGhpbmcgZ29pbmcgb24gKi8KKwlCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1MsCS8qIGdyYWJiaW5nIGZyYW1lcyAqLworCUJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTLAkvKiBwbGF5aW5nIGZyYW1lcyAqLworCUJVWl9NT0RFX1NUSUxMX0NPTVBSRVNTLAkvKiBzdGlsbCBmcmFtZSBjb252ZXJzaW9uICovCisJQlVaX01PREVfU1RJTExfREVDT01QUkVTUwkvKiBzdGlsbCBmcmFtZSBjb252ZXJzaW9uICovCit9OworCitlbnVtIHpvcmFuX2J1ZmZlcl9zdGF0ZSB7CisJQlVaX1NUQVRFX1VTRVIsCQkvKiBidWZmZXIgaXMgb3duZWQgYnkgYXBwbGljYXRpb24gKi8KKwlCVVpfU1RBVEVfUEVORCwJCS8qIGJ1ZmZlciBpcyBxdWV1ZWQgaW4gcGVuZFtdIHJlYWR5IHRvIGZlZWQgdG8gSS9PICovCisJQlVaX1NUQVRFX0RNQSwJCS8qIGJ1ZmZlciBpcyBxdWV1ZWQgaW4gZG1hW10gZm9yIEkvTyAqLworCUJVWl9TVEFURV9ET05FCQkvKiBidWZmZXIgaXMgcmVhZHkgdG8gcmV0dXJuIHRvIGFwcGxpY2F0aW9uICovCit9OworCitlbnVtIHpvcmFuX21hcF9tb2RlIHsKKwlaT1JBTl9NQVBfTU9ERV9SQVcsCisJWk9SQU5fTUFQX01PREVfSlBHX1JFQywKKyNkZWZpbmUgWk9SQU5fTUFQX01PREVfSlBHIFpPUkFOX01BUF9NT0RFX0pQR19SRUMKKwlaT1JBTl9NQVBfTU9ERV9KUEdfUExBWSwKK307CisKK2VudW0gZ3Bpb190eXBlIHsKKwlHUElPX0pQRUdfU0xFRVAgPSAwLAorCUdQSU9fSlBFR19SRVNFVCwKKwlHUElPX0pQRUdfRlJBTUUsCisJR1BJT19WSURfRElSLAorCUdQSU9fVklEX0VOLAorCUdQSU9fVklEX1JFU0VULAorCUdQSU9fQ0xLX1NFTDEsCisJR1BJT19DTEtfU0VMMiwKKwlHUElPX01BWCwKK307CisKK2VudW0gZ3Bjc190eXBlIHsKKwlHUENTX0pQRUdfUkVTRVQgPSAwLAorCUdQQ1NfSlBFR19TVEFSVCwKKwlHUENTX01BWCwKK307CisKK3N0cnVjdCB6b3Jhbl9mb3JtYXQgeworCWNoYXIgKm5hbWU7CisJaW50IHBhbGV0dGU7CisJX191MzIgZm91cmNjOworCWludCBjb2xvcnNwYWNlOworCWludCBkZXB0aDsKKwlfX3UzMiBmbGFnczsKK307CisvKiBmbGFncyAqLworI2RlZmluZSBaT1JBTl9GT1JNQVRfQ09NUFJFU1NFRCAxPDwwCisjZGVmaW5lIFpPUkFOX0ZPUk1BVF9PVkVSTEFZICAgIDE8PDEKKyNkZWZpbmUgWk9SQU5fRk9STUFUX0NBUFRVUkUJMTw8MgorI2RlZmluZSBaT1JBTl9GT1JNQVRfUExBWUJBQ0sJMTw8MworCisvKiBvdmVybGF5LXNldHRpbmdzICovCitzdHJ1Y3Qgem9yYW5fb3ZlcmxheV9zZXR0aW5ncyB7CisJaW50IGlzX3NldDsKKwlpbnQgeCwgeSwgd2lkdGgsIGhlaWdodDsJLyogcG9zaXRpb24gKi8KKwlpbnQgY2xpcGNvdW50OwkJLyogcG9zaXRpb24gYW5kIG51bWJlciBvZiBjbGlwcyAqLworCWNvbnN0IHN0cnVjdCB6b3Jhbl9mb3JtYXQgKmZvcm1hdDsJLyogb3ZlcmxheSBmb3JtYXQgKi8KK307CisKKy8qIHY0bC1jYXB0dXJlIHNldHRpbmdzICovCitzdHJ1Y3Qgem9yYW5fdjRsX3NldHRpbmdzIHsKKwlpbnQgd2lkdGgsIGhlaWdodCwgYnl0ZXNwZXJsaW5lOwkvKiBjYXB0dXJlIHNpemUgKi8KKwljb25zdCBzdHJ1Y3Qgem9yYW5fZm9ybWF0ICpmb3JtYXQ7CS8qIGNhcHR1cmUgZm9ybWF0ICovCit9OworCisvKiB3aG9vcHMsIHRoaXMgb25lIGlzIHVuZGVjbGFyZWQgaWYgIXY0bDIgKi8KKyNpZm5kZWYgSEFWRV9WNEwyCitzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24geworCWludCBxdWFsaXR5OworCWludCBBUFBuOworCWludCBBUFBfbGVuOworCWNoYXIgQVBQX2RhdGFbNjBdOworCWludCBDT01fbGVuOworCWNoYXIgQ09NX2RhdGFbNjBdOworCV9fdTMyIGpwZWdfbWFya2VyczsKKwlfX3U4IHJlc2VydmVkWzExNl07Cit9OworI2VuZGlmCisKKy8qIGpwZy1jYXB0dXJlLy1wbGF5YmFjayBzZXR0aW5ncyAqLworc3RydWN0IHpvcmFuX2pwZ19zZXR0aW5ncyB7CisJaW50IGRlY2ltYXRpb247CQkvKiB0aGlzIGJpdCBpcyB1c2VkIHRvIHNldCBldmVyeXRoaW5nIHRvIGRlZmF1bHQgKi8KKwlpbnQgSG9yRGNtLCBWZXJEY20sIFRtcERjbTsJLyogY2FwdHVyZSBkZWNpbWF0aW9uIHNldHRpbmdzIChUbXBEY209MSBtZWFucyBib3RoIGZpZWxkcykgKi8KKwlpbnQgZmllbGRfcGVyX2J1ZmYsIG9kZF9ldmVuOwkvKiBmaWVsZC1zZXR0aW5ncyAob2RkX2V2ZW49MSAoK1RtcERjbT0xKSBtZWFucyB0b3AtZmllbGQtZmlyc3QpICovCisJaW50IGltZ194LCBpbWdfeSwgaW1nX3dpZHRoLCBpbWdfaGVpZ2h0OwkvKiBjcm9wIHNldHRpbmdzIChzdWJmcmFtZSBjYXB0dXJlKSAqLworCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiBqcGdfY29tcDsJLyogSlBFRy1zcGVjaWZpYyBjYXB0dXJlIHNldHRpbmdzICovCit9OworCitzdHJ1Y3Qgem9yYW5fbWFwcGluZyB7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGNvdW50OworfTsKKworc3RydWN0IHpvcmFuX2pwZ19idWZmZXIgeworCXN0cnVjdCB6b3Jhbl9tYXBwaW5nICptYXA7CisJdTMyICpmcmFnX3RhYjsJCS8qIGFkZHJlc3NlcyBvZiBmcmFnIHRhYmxlICovCisJdTMyIGZyYWdfdGFiX2J1czsJLyogc2FtZSB2YWx1ZSBjYWNoZWQgdG8gc2F2ZSB0aW1lIGluIElTUiAqLworCWVudW0gem9yYW5fYnVmZmVyX3N0YXRlIHN0YXRlOwkvKiBub24temVybyBpZiBjb3JyZXNwb25kaW5nIGJ1ZmZlciBpcyBpbiB1c2UgaW4gZ3JhYiBxdWV1ZSAqLworCXN0cnVjdCB6b3Jhbl9zeW5jIGJzOwkvKiBET05FOiBpbmZvIHRvIHJldHVybiB0byBhcHBsaWNhdGlvbiAqLworfTsKKworc3RydWN0IHpvcmFuX3Y0bF9idWZmZXIgeworCXN0cnVjdCB6b3Jhbl9tYXBwaW5nICptYXA7CisJY2hhciAqZmJ1ZmZlcjsJCS8qIHZpcnR1YWwgIGFkZHJlc3Mgb2YgZnJhbWUgYnVmZmVyICovCisJdW5zaWduZWQgbG9uZyBmYnVmZmVyX3BoeXM7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZnJhbWUgYnVmZmVyICovCisJdW5zaWduZWQgbG9uZyBmYnVmZmVyX2J1czsJLyogYnVzICAgICAgYWRkcmVzcyBvZiBmcmFtZSBidWZmZXIgKi8KKwllbnVtIHpvcmFuX2J1ZmZlcl9zdGF0ZSBzdGF0ZTsJLyogc3RhdGU6IHVudXNlZC9wZW5kaW5nL2RvbmUgKi8KKwlzdHJ1Y3Qgem9yYW5fc3luYyBiczsJLyogRE9ORTogaW5mbyB0byByZXR1cm4gdG8gYXBwbGljYXRpb24gKi8KK307CisKK2VudW0gem9yYW5fbG9ja19hY3Rpdml0eSB7CisJWk9SQU5fRlJFRSwJCS8qIGZyZWUgZm9yIHVzZSAqLworCVpPUkFOX0FDVElWRSwJCS8qIGFjdGl2ZSBidXQgdW5sb2NrZWQgKi8KKwlaT1JBTl9MT0NLRUQsCQkvKiBsb2NrZWQgKi8KK307CisKKy8qIGJ1ZmZlciBjb2xsZWN0aW9ucyAqLworc3RydWN0IHpvcmFuX2pwZ19zdHJ1Y3QgeworCWVudW0gem9yYW5fbG9ja19hY3Rpdml0eSBhY3RpdmU7CS8qIGZlYXR1cmUgY3VycmVudGx5IGluIHVzZT8gKi8KKwlzdHJ1Y3Qgem9yYW5fanBnX2J1ZmZlciBidWZmZXJbQlVaX01BWF9GUkFNRV07CS8qIGJ1ZmZlcnMgKi8KKwlpbnQgbnVtX2J1ZmZlcnMsIGJ1ZmZlcl9zaXplOworCXU4IGFsbG9jYXRlZDsJCS8qIEZsYWcgaWYgYnVmZmVycyBhcmUgYWxsb2NhdGVkICAqLworCXU4IHJlYWR5X3RvX2JlX2ZyZWVkOwkvKiBoYWNrIC0gc2VlIHpvcmFuX2RyaXZlci5jICovCisJdTggbmVlZF9jb250aWd1b3VzOwkvKiBGbGFnIGlmIGNvbnRpZ3VvdXMgYnVmZmVycyBhcmUgbmVlZGVkICovCit9OworCitzdHJ1Y3Qgem9yYW5fdjRsX3N0cnVjdCB7CisJZW51bSB6b3Jhbl9sb2NrX2FjdGl2aXR5IGFjdGl2ZTsJLyogZmVhdHVyZSBjdXJyZW50bHkgaW4gdXNlPyAqLworCXN0cnVjdCB6b3Jhbl92NGxfYnVmZmVyIGJ1ZmZlcltWSURFT19NQVhfRlJBTUVdOwkvKiBidWZmZXJzICovCisJaW50IG51bV9idWZmZXJzLCBidWZmZXJfc2l6ZTsKKwl1OCBhbGxvY2F0ZWQ7CQkvKiBGbGFnIGlmIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCAgKi8KKwl1OCByZWFkeV90b19iZV9mcmVlZDsJLyogaGFjayAtIHNlZSB6b3Jhbl9kcml2ZXIuYyAqLworfTsKKworc3RydWN0IHpvcmFuOworCisvKiB6b3Jhbl9maCBjb250YWlucyBwZXItb3BlbigpIHNldHRpbmdzICovCitzdHJ1Y3Qgem9yYW5fZmggeworCXN0cnVjdCB6b3JhbiAqenI7CisKKwllbnVtIHpvcmFuX21hcF9tb2RlIG1hcF9tb2RlOwkvKiBGbGFnIHdoaWNoIGJ1ZmZlcnNldCB3aWxsIG1hcCBieSBuZXh0IG1tYXAoKSAqLworCisJc3RydWN0IHpvcmFuX292ZXJsYXlfc2V0dGluZ3Mgb3ZlcmxheV9zZXR0aW5nczsKKwl1MzIgKm92ZXJsYXlfbWFzazsJLyogb3ZlcmxheSBtYXNrICovCisJZW51bSB6b3Jhbl9sb2NrX2FjdGl2aXR5IG92ZXJsYXlfYWN0aXZlOwkvKiBmZWF0dXJlIGN1cnJlbnRseSBpbiB1c2U/ICovCisKKwlzdHJ1Y3Qgem9yYW5fdjRsX3NldHRpbmdzIHY0bF9zZXR0aW5nczsJLyogc3RydWN0dXJlIHdpdGggYSBsb3Qgb2YgdGhpbmdzIHRvIHBsYXkgd2l0aCAqLworCXN0cnVjdCB6b3Jhbl92NGxfc3RydWN0IHY0bF9idWZmZXJzOwkvKiBWNEwgYnVmZmVycycgaW5mbyAqLworCisJc3RydWN0IHpvcmFuX2pwZ19zZXR0aW5ncyBqcGdfc2V0dGluZ3M7CS8qIHN0cnVjdHVyZSB3aXRoIGEgbG90IG9mIHRoaW5ncyB0byBwbGF5IHdpdGggKi8KKwlzdHJ1Y3Qgem9yYW5fanBnX3N0cnVjdCBqcGdfYnVmZmVyczsJLyogTUpQRUcgYnVmZmVycycgaW5mbyAqLworfTsKKworc3RydWN0IGNhcmRfaW5mbyB7CisJZW51bSBjYXJkX3R5cGUgdHlwZTsKKwljaGFyIG5hbWVbMzJdOworCXUxNiBpMmNfZGVjb2RlciwgaTJjX2VuY29kZXI7CQkJLyogSTJDIHR5cGVzICovCisJdTE2IHZpZGVvX3ZmZSwgdmlkZW9fY29kZWM7CQkJLyogdmlkZW9jb2RlYyB0eXBlcyAqLworCXUxNiBhdWRpb19jaGlwOwkJCQkJLyogYXVkaW8gdHlwZSAqLworCXUxNiB2ZW5kb3JfaWQsIGRldmljZV9pZDsJLyogc3Vic3lzdGVtIHZlbmRvci9kZXZpY2UgSUQgKi8KKworCWludCBpbnB1dHM7CQkvKiBudW1iZXIgb2YgdmlkZW8gaW5wdXRzICovCisJc3RydWN0IGlucHV0IHsKKwkJaW50IG11eHNlbDsKKwkJY2hhciBuYW1lWzMyXTsKKwl9IGlucHV0W0JVWl9NQVhfSU5QVVRdOworCisJaW50IG5vcm1zOworCXN0cnVjdCB0dm5vcm0gKnR2blszXTsJLyogc3VwcG9ydGVkIFRWIG5vcm1zICovCisKKwl1MzIganBlZ19pbnQ7CQkvKiBKUEVHIGludGVycnVwdCAqLworCXUzMiB2c3luY19pbnQ7CQkvKiBWU1lOQyBpbnRlcnJ1cHQgKi8KKwlzOCBncGlvW0dQSU9fTUFYXTsKKwl1OCBncGNzW0dQQ1NfTUFYXTsKKworCXN0cnVjdCB2ZmVfcG9sYXJpdHkgdmZlX3BvbDsKKwl1OCBncGlvX3BvbFtHUElPX01BWF07CisKKwkvKiBpcyB0aGUgL0dXUyBsaW5lIGNvbmVjdGVkPyAqLworCXU4IGd3c19ub3RfY29ubmVjdGVkOworCisJdm9pZCAoKmluaXQpIChzdHJ1Y3Qgem9yYW4gKiB6cik7Cit9OworCitzdHJ1Y3Qgem9yYW4geworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvX2RldjsKKworCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcHRlcjsJLyogKi8KKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgaTJjX2FsZ287CS8qICovCisJdTMyIGkyY2JyOworCisJc3RydWN0IGkyY19jbGllbnQgKmRlY29kZXI7CS8qIHZpZGVvIGRlY29kZXIgaTJjIGNsaWVudCAqLworCXN0cnVjdCBpMmNfY2xpZW50ICplbmNvZGVyOwkvKiB2aWRlbyBlbmNvZGVyIGkyYyBjbGllbnQgKi8KKworCXN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYzsJLyogdmlkZW8gY29kZWMgKi8KKwlzdHJ1Y3QgdmlkZW9jb2RlYyAqdmZlOwkvKiB2aWRlbyBmcm9udCBlbmQgKi8KKworCXN0cnVjdCBzZW1hcGhvcmUgcmVzb3VyY2VfbG9jazsJLyogcHJldmVudCBldmlsIHN0dWZmICovCisKKwl1OCBpbml0aWFsaXplZDsJCS8qIGZsYWcgaWYgem9yYW4gaGFzIGJlZW4gY29ycmVjdGx5IGluaXRhbGl6ZWQgKi8KKwlpbnQgdXNlcjsJCS8qIG51bWJlciBvZiBjdXJyZW50IHVzZXJzICovCisJc3RydWN0IGNhcmRfaW5mbyBjYXJkOworCXN0cnVjdCB0dm5vcm0gKnRpbWluZzsKKworCXVuc2lnbmVkIHNob3J0IGlkOwkvKiBudW1iZXIgb2YgdGhpcyBkZXZpY2UgKi8KKwljaGFyIG5hbWVbMzJdOwkJLyogbmFtZSBvZiB0aGlzIGRldmljZSAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwkvKiBQQ0kgZGV2aWNlICovCisJdW5zaWduZWQgY2hhciByZXZpc2lvbjsJLyogcmV2aXNpb24gb2YgenIzNjA1NyAqLworCXVuc2lnbmVkIGludCB6cjM2MDU3X2FkcjsJLyogYnVzIGFkZHJlc3Mgb2YgSU8gbWVtIHJldHVybmVkIGJ5IFBDSSBCSU9TICovCisJdW5zaWduZWQgY2hhciBfX2lvbWVtICp6cjM2MDU3X21lbTsvKiBwb2ludGVyIHRvIG1hcHBlZCBJTyBtZW1vcnkgKi8KKworCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CS8qIFNwaW5sb2NrICovCisKKwkvKiBWaWRlbyBmb3IgTGludXggcGFyYW1ldGVycyAqLworCWludCBpbnB1dCwgbm9ybTsJLyogY2FyZCdzIG5vcm0gYW5kIGlucHV0IC0gbm9ybT1WSURFT19NT0RFXyogKi8KKwlpbnQgaHVlLCBzYXR1cmF0aW9uLCBjb250cmFzdCwgYnJpZ2h0bmVzczsJLyogQ3VycmVudCBwaWN0dXJlIHBhcmFtcyAqLworCXN0cnVjdCB2aWRlb19idWZmZXIgYnVmZmVyOwkvKiBDdXJyZW50IGJ1ZmZlciBwYXJhbXMgKi8KKwlzdHJ1Y3Qgem9yYW5fb3ZlcmxheV9zZXR0aW5ncyBvdmVybGF5X3NldHRpbmdzOworCXUzMiAqb3ZlcmxheV9tYXNrOwkvKiBvdmVybGF5IG1hc2sgKi8KKwllbnVtIHpvcmFuX2xvY2tfYWN0aXZpdHkgb3ZlcmxheV9hY3RpdmU7CS8qIGZlYXR1cmUgY3VycmVudGx5IGluIHVzZT8gKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHY0bF9jYXBxOworCisJaW50IHY0bF9vdmVybGF5X2FjdGl2ZTsJLyogT3ZlcmxheSBncmFiIGlzIGFjdGl2YXRlZCAqLworCWludCB2NGxfbWVtZ3JhYl9hY3RpdmU7CS8qIE1lbW9yeSBncmFiIGlzIGFjdGl2YXRlZCAqLworCisJaW50IHY0bF9ncmFiX2ZyYW1lOwkvKiBGcmFtZSBudW1iZXIgYmVpbmcgY3VycmVudGx5IGdyYWJiZWQgKi8KKyNkZWZpbmUgTk9fR1JBQl9BQ1RJVkUgKC0xKQorCXVuc2lnbmVkIGxvbmcgdjRsX2dyYWJfc2VxOwkvKiBOdW1iZXIgb2YgZnJhbWVzIGdyYWJiZWQgKi8KKwlzdHJ1Y3Qgem9yYW5fdjRsX3NldHRpbmdzIHY0bF9zZXR0aW5nczsJLyogc3RydWN0dXJlIHdpdGggYSBsb3Qgb2YgdGhpbmdzIHRvIHBsYXkgd2l0aCAqLworCisJLyogVjRMIGdyYWIgcXVldWUgb2YgZnJhbWVzIHBlbmRpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHY0bF9wZW5kX2hlYWQ7CisJdW5zaWduZWQgbG9uZyB2NGxfcGVuZF90YWlsOworCXVuc2lnbmVkIGxvbmcgdjRsX3N5bmNfdGFpbDsKKwlpbnQgdjRsX3BlbmRbVjRMX01BWF9GUkFNRV07CisJc3RydWN0IHpvcmFuX3Y0bF9zdHJ1Y3QgdjRsX2J1ZmZlcnM7CS8qIFY0TCBidWZmZXJzJyBpbmZvICovCisKKwkvKiBCdXogTUpQRUcgcGFyYW1ldGVycyAqLworCWVudW0gem9yYW5fY29kZWNfbW9kZSBjb2RlY19tb2RlOwkvKiBzdGF0dXMgb2YgY29kZWMgKi8KKwlzdHJ1Y3Qgem9yYW5fanBnX3NldHRpbmdzIGpwZ19zZXR0aW5nczsJLyogc3RydWN0dXJlIHdpdGggYSBsb3Qgb2YgdGhpbmdzIHRvIHBsYXkgd2l0aCAqLworCisJd2FpdF9xdWV1ZV9oZWFkX3QganBnX2NhcHE7CS8qIHdhaXQgaGVyZSBmb3IgZ3JhYiB0byBmaW5pc2ggKi8KKworCS8qIGdyYWIgcXVldWUgY291bnRzL2luZGljZXMsIG1hc2sgd2l0aCBCVVpfTUFTS19TVEFUX0NPTSBiZWZvcmUgdXNpbmcgYXMgaW5kZXggKi8KKwkvKiAoZG1hX2hlYWQgLSBkbWFfdGFpbCkgaXMgbnVtYmVyIGFjdGl2ZSBpbiBETUEsIG11c3QgYmUgPD0gQlVaX05VTV9TVEFUX0NPTSAqLworCS8qICh2YWx1ZSAmIEJVWl9NQVNLX1NUQVRfQ09NKSBjb3JyZXNwb25kcyB0byBpbmRleCBpbiBzdGF0X2NvbSB0YWJsZSAqLworCXVuc2lnbmVkIGxvbmcganBnX3F1ZV9oZWFkOwkvKiBJbmRleCB3aGVyZSB0byBwdXQgbmV4dCBidWZmZXIgd2hpY2ggaXMgcXVldWVkICovCisJdW5zaWduZWQgbG9uZyBqcGdfZG1hX2hlYWQ7CS8qIEluZGV4IG9mIG5leHQgYnVmZmVyIHdoaWNoIGdvZXMgaW50byBzdGF0X2NvbSAgKi8KKwl1bnNpZ25lZCBsb25nIGpwZ19kbWFfdGFpbDsJLyogSW5kZXggb2YgbGFzdCBidWZmZXIgaW4gc3RhdF9jb20gICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcganBnX3F1ZV90YWlsOwkvKiBJbmRleCBvZiBsYXN0IGJ1ZmZlciBpbiBxdWV1ZSAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyBqcGdfc2VxX251bTsJLyogY291bnQgb2YgZnJhbWVzIHNpbmNlIGdyYWIvcGxheSBzdGFydGVkICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcganBnX2Vycl9zZXE7CS8qIGxhc3Qgc2VxX251bSBiZWZvcmUgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIGpwZ19lcnJfc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBqcGdfcXVldWVkX251bTsJLyogY291bnQgb2YgZnJhbWVzIHF1ZXVlZCBzaW5jZSBncmFiL3BsYXkgc3RhcnRlZCAqLworCisJLyogenIzNjA1NydzIGNvZGUgYnVmZmVyIHRhYmxlICovCisJdTMyICpzdGF0X2NvbTsJCS8qIHN0YXRfY29tW2ldIGlzIGluZGV4ZWQgYnkgZG1hX2hlYWQvdGFpbCAmIEJVWl9NQVNLX1NUQVRfQ09NICovCisKKwkvKiAodmFsdWUgJiBCVVpfTUFTS19GUkFNRSkgY29ycmVzcG9uZHMgdG8gaW5kZXggaW4gcGVuZFtdIHF1ZXVlICovCisJaW50IGpwZ19wZW5kW0JVWl9NQVhfRlJBTUVdOworCisJLyogYXJyYXkgaW5kZXhlZCBieSBmcmFtZSBudW1iZXIgKi8KKwlzdHJ1Y3Qgem9yYW5fanBnX3N0cnVjdCBqcGdfYnVmZmVyczsJLyogTUpQRUcgYnVmZmVycycgaW5mbyAqLworCisJLyogQWRkaXRpb25hbCBzdHVmZiBmb3IgdGVzdGluZyAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICp6b3Jhbl9wcm9jOworI2Vsc2UKKwl2b2lkICp6b3Jhbl9wcm9jOworI2VuZGlmCisJaW50IHRlc3Rpbmc7CisJaW50IGpwZWdfZXJyb3I7CisJaW50IGludHJfY291bnRlcl9HSVJRMTsKKwlpbnQgaW50cl9jb3VudGVyX0dJUlEwOworCWludCBpbnRyX2NvdW50ZXJfQ29kUmVwSVJROworCWludCBpbnRyX2NvdW50ZXJfSlBFR1JlcElSUTsKKwlpbnQgZmllbGRfY291bnRlcjsKKwlpbnQgSVJRMV9pbjsKKwlpbnQgSVJRMV9vdXQ7CisJaW50IEpQRUdfaW47CisJaW50IEpQRUdfb3V0OworCWludCBKUEVHXzA7CisJaW50IEpQRUdfMTsKKwlpbnQgRU5EX2V2ZW50X21pc3NlZDsKKwlpbnQgSlBFR19taXNzZWQ7CisJaW50IEpQRUdfZXJyb3I7CisJaW50IG51bV9lcnJvcnM7CisJaW50IEpQRUdfbWF4X21pc3NlZDsKKwlpbnQgSlBFR19taW5fbWlzc2VkOworCisJdTMyIGxhc3RfaXNyOworCXVuc2lnbmVkIGxvbmcgZnJhbWVfbnVtOworCisJd2FpdF9xdWV1ZV9oZWFkX3QgdGVzdF9xOworfTsKKworLypUaGUgZm9sbG93aW5nIHNob3VsZCBiZSBkb25lIGluIG1vcmUgcG9ydGFibGUgd2F5LiBJdCBkZXBlbmRzIG9uIGRlZmluZQorICBvZiBfQUxQSEFfQlVaIGluIHRoZSBNYWtlZmlsZS4qLworCisjaWZkZWYgX0FMUEhBX0JVWgorI2RlZmluZSBidHdyaXRlKGRhdCxhZHIpICAgIHdyaXRlbCgoZGF0KSwgenItPnpyMzYwNTdfYWRyKyhhZHIpKQorI2RlZmluZSBidHJlYWQoYWRyKSAgICAgICAgIHJlYWRsKHpyLT56cjM2MDU3X2FkcisoYWRyKSkKKyNlbHNlCisjZGVmaW5lIGJ0d3JpdGUoZGF0LGFkcikgICAgd3JpdGVsKChkYXQpLCB6ci0+enIzNjA1N19tZW0rKGFkcikpCisjZGVmaW5lIGJ0cmVhZChhZHIpICAgICAgICAgcmVhZGwoenItPnpyMzYwNTdfbWVtKyhhZHIpKQorI2VuZGlmCisKKyNkZWZpbmUgYnRhbmQoZGF0LGFkcikgICAgICBidHdyaXRlKChkYXQpICYgYnRyZWFkKGFkciksIGFkcikKKyNkZWZpbmUgYnRvcihkYXQsYWRyKSAgICAgICBidHdyaXRlKChkYXQpIHwgYnRyZWFkKGFkciksIGFkcikKKyNkZWZpbmUgYnRhb3IoZGF0LG1hc2ssYWRyKSBidHdyaXRlKChkYXQpIHwgKChtYXNrKSAmIGJ0cmVhZChhZHIpKSwgYWRyKQorCisjZW5kaWYJCQkJLyogX19rZXJuZWxfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fY2FyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3NDMwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fY2FyZC5jCkBAIC0wLDAgKzEsMTU4MyBAQAorLyoKKyAqIFpvcmFuIHpyMzYwNTcvenIzNjA2NyBQQ0kgY29udHJvbGxlciBkcml2ZXIsIGZvciB0aGUKKyAqIFBpbm5hY2xlL01pcm8gREMxMC9EQzEwKy9EQzMwL0RDMzArLCBJb21lZ2EgQnV6LCBMaW51eAorICogTWVkaWEgTGFicyBMTUwzMy9MTUwzM1IxMC4KKyAqCisgKiBUaGlzIHBhcnQgaGFuZGxlcyBjYXJkLXNwZWNpZmljIGRhdGEgYW5kIGRldGVjdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgU2VyZ3VlaSBNaXJpZG9ub3YgPG1pcnNldkBjaWNlc2UubXg+CisgKgorICogQ3VycmVudGx5IG1haW50YWluZWQgYnk6CisgKiAgIFJvbmFsZCBCdWx0amUgICAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBza3luZXQuYmU+CisgKiAgIE1haWxpbmdsaXN0ICAgICAgPG1qcGVnLXVzZXJzQGxpc3RzLnNmLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2VuY29kZXIuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAidmlkZW9jb2RlYy5oIgorI2luY2x1ZGUgInpvcmFuLmgiCisjaW5jbHVkZSAiem9yYW5fY2FyZC5oIgorI2luY2x1ZGUgInpvcmFuX2RldmljZS5oIgorI2luY2x1ZGUgInpvcmFuX3Byb2Nmcy5oIgorCisjZGVmaW5lIEkyQ19OQU1FKHgpICh4KS0+bmFtZQorCitleHRlcm4gY29uc3Qgc3RydWN0IHpvcmFuX2Zvcm1hdCB6b3Jhbl9mb3JtYXRzW107CisKK3N0YXRpYyBpbnQgY2FyZFtCVVpfTUFYXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTsKK21vZHVsZV9wYXJhbV9hcnJheShjYXJkLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhjYXJkLCAiVGhlIHR5cGUgb2YgY2FyZCIpOworCitzdGF0aWMgaW50IGVuY29kZXJbQlVaX01BWF0gPSB7IC0xLCAtMSwgLTEsIC0xIH07Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5jb2RlciwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5jb2RlciwgImkyYyBUViBlbmNvZGVyIik7CisKK3N0YXRpYyBpbnQgZGVjb2RlcltCVVpfTUFYXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTsKK21vZHVsZV9wYXJhbV9hcnJheShkZWNvZGVyLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWNvZGVyLCAiaTJjIFRWIGRlY29kZXIiKTsKKworLyoKKyAgIFRoZSB2aWRlbyBtZW0gYWRkcmVzcyBvZiB0aGUgdmlkZW8gY2FyZC4KKyAgIFRoZSBkcml2ZXIgaGFzIGEgbGl0dGxlIGRhdGFiYXNlIGZvciBzb21lIHZpZGVvY2FyZHMKKyAgIHRvIGRldGVybWluZSBpdCBmcm9tIHRoZXJlLiBJZiB5b3VyIHZpZGVvIGNhcmQgaXMgbm90IGluIHRoZXJlCisgICB5b3UgaGF2ZSBlaXRoZXIgdG8gZ2l2ZSBpdCB0byB0aGUgZHJpdmVyIGFzIGEgcGFyYW1ldGVyCisgICBvciBzZXQgaW4gaW4gYSBWSURJT0NTRkJVRiBpb2N0bAorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZpZG1lbSA9IDA7CS8qIFZpZGVvIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KK21vZHVsZV9wYXJhbSh2aWRtZW0sIHVsb25nLCAwKTsKKworLyoKKyAgIERlZmF1bHQgaW5wdXQgYW5kIHZpZGVvIG5vcm0gYXQgc3RhcnR1cCBvZiB0aGUgZHJpdmVyLgorKi8KKworc3RhdGljIGludCBkZWZhdWx0X2lucHV0ID0gMDsJLyogMD1Db21wb3NpdGUsIDE9Uy1WaWRlbyAqLworbW9kdWxlX3BhcmFtKGRlZmF1bHRfaW5wdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlZmF1bHRfaW5wdXQsCisJCSAiRGVmYXVsdCBpbnB1dCAoMD1Db21wb3NpdGUsIDE9Uy1WaWRlbywgMj1JbnRlcm5hbCkiKTsKKworc3RhdGljIGludCBkZWZhdWx0X25vcm0gPSAwOwkvKiAwPVBBTCwgMT1OVFNDIDI9U0VDQU0gKi8KK21vZHVsZV9wYXJhbShkZWZhdWx0X25vcm0sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlZmF1bHRfbm9ybSwgIkRlZmF1bHQgbm9ybSAoMD1QQUwsIDE9TlRTQywgMj1TRUNBTSkiKTsKKworc3RhdGljIGludCB2aWRlb19uciA9IC0xOwkvKiAvZGV2L3ZpZGVvTiwgLTEgZm9yIGF1dG9kZXRlY3QgKi8KK21vZHVsZV9wYXJhbSh2aWRlb19uciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsICJ2aWRlbyBkZXZpY2UgbnVtYmVyIik7CisKKy8qCisgICBOdW1iZXIgYW5kIHNpemUgb2YgZ3JhYiBidWZmZXJzIGZvciBWaWRlbyA0IExpbnV4CisgICBUaGUgdmFzdCBtYWpvcml0eSBvZiBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBuZWVkIG1vcmUgdGhhbiAyLAorICAgdGhlIHZlcnkgcG9wdWxhciBCVFRWIGRyaXZlciBhY3R1YWxseSBkb2VzIE9OTFkgaGF2ZSAyLgorICAgVGltZSBzZW5zaXRpdmUgYXBwbGljYXRpb25zIG1pZ2h0IG5lZWQgbW9yZSwgdGhlIG1heGltdW0KKyAgIGlzIFZJREVPX01BWF9GUkFNRSAoZGVmaW5lZCBpbiA8bGludXgvdmlkZW9kZXYuaD4pLgorCisgICBUaGUgc2l6ZSBpcyBzZXQgc28gdGhhdCB0aGUgbWF4aW11bSBwb3NzaWJsZSByZXF1ZXN0CisgICBjYW4gYmUgc2F0aXNmaWVkLiBEZWNyZWFzZSAgaXQsIGlmIGJpZ3BoeXNfYXJlYSBhbGxvYydkCisgICBtZW1vcnkgaXMgbG93LiBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgYmlncGh5c19hcmVhIHBhdGNoLAorICAgc2V0IGl0IHRvIDEyOCBLQi4gV2lsbCB5b3UgYWxsb3cgb25seSB0byBncmFiIHNtYWxsCisgICBpbWFnZXMgd2l0aCBWNEwsIGJ1dCB0aGF0J3MgYmV0dGVyIHRoYW4gbm90aGluZy4KKworICAgdjRsX2J1ZnNpemUgaGFzIHRvIGJlIGdpdmVuIGluIEtCICEKKworKi8KKworaW50IHY0bF9uYnVmcyA9IDI7CitpbnQgdjRsX2J1ZnNpemUgPSAxMjg7CQkvKiBFdmVyeWJvZHkgc2hvdWxkIGJlIGFibGUgdG8gd29yayB3aXRoIHRoaXMgc2V0dGluZyAqLworbW9kdWxlX3BhcmFtKHY0bF9uYnVmcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModjRsX25idWZzLCAiTWF4aW11bSBudW1iZXIgb2YgVjRMIGJ1ZmZlcnMgdG8gdXNlIik7Cittb2R1bGVfcGFyYW0odjRsX2J1ZnNpemUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHY0bF9idWZzaXplLCAiTWF4aW11bSBzaXplIHBlciBWNEwgYnVmZmVyIChpbiBrQikiKTsKKworaW50IGpwZ19uYnVmcyA9IDMyOworaW50IGpwZ19idWZzaXplID0gNTEyOwkJLyogbWF4IHNpemUgZm9yIDEwMCUgcXVhbGl0eSBmdWxsLVBBTCBmcmFtZSAqLworbW9kdWxlX3BhcmFtKGpwZ19uYnVmcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoanBnX25idWZzLCAiTWF4aW11bSBudW1iZXIgb2YgSlBHIGJ1ZmZlcnMgdG8gdXNlIik7Cittb2R1bGVfcGFyYW0oanBnX2J1ZnNpemUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGpwZ19idWZzaXplLCAiTWF4aW11bSBzaXplIHBlciBKUEcgYnVmZmVyIChpbiBrQikiKTsKKworaW50IHBhc3NfdGhyb3VnaCA9IDA7CQkvKiAxPVBhc3MgdGhyb3VnaCBUViBzaWduYWwgd2hlbiBkZXZpY2UgaXMgbm90IHVzZWQgKi8KKwkJCQkvKiAwPVNob3cgY29sb3IgYmFyIHdoZW4gZGV2aWNlIGlzIG5vdCB1c2VkIChMTUwzMzogb25seSBpZiBsbWwzM2RwYXRoPTEpICovCittb2R1bGVfcGFyYW0ocGFzc190aHJvdWdoLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwYXNzX3Rocm91Z2gsCisJCSAiUGFzcyBUViBzaWduYWwgdGhyb3VnaCB0byBUVi1vdXQgd2hlbiBpZGxpbmciKTsKKworc3RhdGljIGludCBkZWJ1ZyA9IDE7CitpbnQgKnpyX2RlYnVnID0gJmRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTQpIik7CisKK01PRFVMRV9ERVNDUklQVElPTigiWm9yYW4tMzYwNTcvMzYwNjcgSlBFRyBjb2RlYyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlNlcmd1ZWkgTWlyaWRvbm92Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB6cjM2MDY3X3BjaV90YmxbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9aT1JBTiwgUENJX0RFVklDRV9JRF9aT1JBTl8zNjA1NywKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHpyMzYwNjdfcGNpX3RibCk7CisKKyNkZWZpbmUgZHByaW50ayhudW0sIGZvcm1hdCwgYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoKnpyX2RlYnVnID49IG51bSkgXAorCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKK2ludCB6b3Jhbl9udW07CQkJLyogbnVtYmVyIG9mIEJ1enMgaW4gdXNlICovCitzdHJ1Y3Qgem9yYW4gem9yYW5bQlVaX01BWF07CisKKy8qIHZpZGVvY29kZWMgYnVzIGZ1bmN0aW9ucyBaUjM2MDYwICovCitzdGF0aWMgdTMyCit6cjM2MDYwX3JlYWQgKHN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYywKKwkgICAgICB1MTYgICAgICAgICAgICAgICAgcmVnKQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGNvZGVjLT5tYXN0ZXJfZGF0YS0+ZGF0YTsKKwlfX3UzMiBkYXRhOworCisJaWYgKHBvc3Rfb2ZmaWNlX3dhaXQoenIpCisJICAgIHx8IHBvc3Rfb2ZmaWNlX3dyaXRlKHpyLCAwLCAxLCByZWcgPj4gOCkKKwkgICAgfHwgcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDAsIDIsIHJlZyAmIDB4ZmYpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlkYXRhID0gcG9zdF9vZmZpY2VfcmVhZCh6ciwgMCwgMykgJiAweGZmOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZAorenIzNjA2MF93cml0ZSAoc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjLAorCSAgICAgICB1MTYgICAgICAgICAgICAgICAgcmVnLAorCSAgICAgICB1MzIgICAgICAgICAgICAgICAgdmFsKQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGNvZGVjLT5tYXN0ZXJfZGF0YS0+ZGF0YTsKKworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKQorCSAgICB8fCBwb3N0X29mZmljZV93cml0ZSh6ciwgMCwgMSwgcmVnID4+IDgpCisJICAgIHx8IHBvc3Rfb2ZmaWNlX3dyaXRlKHpyLCAwLCAyLCByZWcgJiAweGZmKSkgeworCQlyZXR1cm47CisJfQorCisJcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDAsIDMsIHZhbCAmIDB4ZmYpOworfQorCisvKiB2aWRlb2NvZGVjIGJ1cyBmdW5jdGlvbnMgWlIzNjA1MCAqLworc3RhdGljIHUzMgorenIzNjA1MF9yZWFkIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMsCisJICAgICAgdTE2ICAgICAgICAgICAgICAgIHJlZykKK3sKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBjb2RlYy0+bWFzdGVyX2RhdGEtPmRhdGE7CisJX191MzIgZGF0YTsKKworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKQorCSAgICB8fCBwb3N0X29mZmljZV93cml0ZSh6ciwgMSwgMCwgcmVnID4+IDIpKSB7CS8vIHJlZy4gSElHSEJZVEVTCisJCXJldHVybiAtMTsKKwl9CisKKwlkYXRhID0gcG9zdF9vZmZpY2VfcmVhZCh6ciwgMCwgcmVnICYgMHgwMykgJiAweGZmOwkvLyByZWcuIExPV0JZVEVTICsgcmVhZAorCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZAorenIzNjA1MF93cml0ZSAoc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjLAorCSAgICAgICB1MTYgICAgICAgICAgICAgICAgcmVnLAorCSAgICAgICB1MzIgICAgICAgICAgICAgICAgdmFsKQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGNvZGVjLT5tYXN0ZXJfZGF0YS0+ZGF0YTsKKworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKQorCSAgICB8fCBwb3N0X29mZmljZV93cml0ZSh6ciwgMSwgMCwgcmVnID4+IDIpKSB7CS8vIHJlZy4gSElHSEJZVEVTCisJCXJldHVybjsKKwl9CisKKwlwb3N0X29mZmljZV93cml0ZSh6ciwgMCwgcmVnICYgMHgwMywgdmFsICYgMHhmZik7CS8vIHJlZy4gTE9XQllURVMgKyB3ci4gZGF0YQorfQorCisvKiB2aWRlb2NvZGVjIGJ1cyBmdW5jdGlvbnMgWlIzNjAxNiAqLworc3RhdGljIHUzMgorenIzNjAxNl9yZWFkIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMsCisJICAgICAgdTE2ICAgICAgICAgICAgICAgIHJlZykKK3sKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBjb2RlYy0+bWFzdGVyX2RhdGEtPmRhdGE7CisJX191MzIgZGF0YTsKKworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJZGF0YSA9IHBvc3Rfb2ZmaWNlX3JlYWQoenIsIDIsIHJlZyAmIDB4MDMpICYgMHhmZjsJLy8gcmVhZAorCXJldHVybiBkYXRhOworfQorCisvKiBoYWNrIGZvciBpbiB6b3Jhbl9kZXZpY2UuYyAqLwordm9pZAorenIzNjAxNl93cml0ZSAoc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjLAorCSAgICAgICB1MTYgICAgICAgICAgICAgICAgcmVnLAorCSAgICAgICB1MzIgICAgICAgICAgICAgICAgdmFsKQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGNvZGVjLT5tYXN0ZXJfZGF0YS0+ZGF0YTsKKworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKSkgeworCQlyZXR1cm47CisJfQorCisJcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDIsIHJlZyAmIDB4MDMsIHZhbCAmIDB4MGZmKTsJLy8gd3IuIGRhdGEKK30KKworLyoKKyAqIEJvYXJkIHNwZWNpZmljIGluZm9ybWF0aW9uCisgKi8KKworc3RhdGljIHZvaWQKK2RjMTBfaW5pdCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBkYzEwX2luaXQoKVxuIiwgWlJfREVWTkFNRSh6cikpOworCisJLyogUGl4ZWwgY2xvY2sgc2VsZWN0aW9uICovCisJR1BJTyh6ciwgNCwgMCk7CisJR1BJTyh6ciwgNSwgMSk7CisJLyogRW5hYmxlIHRoZSB2aWRlbyBidXMgc3luYyBzaWduYWxzICovCisJR1BJTyh6ciwgNywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitkYzEwcGx1c19pbml0IChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IGRjMTBwbHVzX2luaXQoKVxuIiwgWlJfREVWTkFNRSh6cikpOworfQorCitzdGF0aWMgdm9pZAorYnV6X2luaXQgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogYnV6X2luaXQoKVxuIiwgWlJfREVWTkFNRSh6cikpOworCisJLyogc29tZSBzdHVmZiBmcm9tIElvbWVnYSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoenItPnBjaV9kZXYsIDB4ZmMsIDB4OTA2ODBmMTUpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoenItPnBjaV9kZXYsIDB4MGMsIDB4MDAwMTIwMjApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoenItPnBjaV9kZXYsIDB4ZTgsIDB4YzAyMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbG1sMzNfaW5pdCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBsbWwzM19pbml0KClcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCUdQSU8oenIsIDIsIDEpOwkJLy8gU2V0IENvbXBvc2l0ZSBpbnB1dC9vdXRwdXQKK30KKworc3RhdGljIGNoYXIgKgoraTJjaWRfdG9fbW9kdWxlbmFtZSAodTE2IGkyY19pZCkKK3sKKwljaGFyICpuYW1lID0gTlVMTDsKKworCXN3aXRjaCAoaTJjX2lkKSB7CisJY2FzZSBJMkNfRFJJVkVSSURfU0FBNzExMDoKKwkJbmFtZSA9ICJzYWE3MTEwIjsKKwkJYnJlYWs7CisJY2FzZSBJMkNfRFJJVkVSSURfU0FBNzExMUE6CisJCW5hbWUgPSAic2FhNzExMSI7CisJCWJyZWFrOworCWNhc2UgSTJDX0RSSVZFUklEX1NBQTcxMTQ6CisJCW5hbWUgPSAic2FhNzExNCI7CisJCWJyZWFrOworCWNhc2UgSTJDX0RSSVZFUklEX1NBQTcxODVCOgorCQluYW1lID0gInNhYTcxODUiOworCQlicmVhazsKKwljYXNlIEkyQ19EUklWRVJJRF9BRFY3MTcwOgorCQluYW1lID0gImFkdjcxNzAiOworCQlicmVhazsKKwljYXNlIEkyQ19EUklWRVJJRF9BRFY3MTc1OgorCQluYW1lID0gImFkdjcxNzUiOworCQlicmVhazsKKwljYXNlIEkyQ19EUklWRVJJRF9CVDgxOToKKwkJbmFtZSA9ICJidDgxOSI7CisJCWJyZWFrOworCWNhc2UgSTJDX0RSSVZFUklEX0JUODU2OgorCQluYW1lID0gImJ0ODU2IjsKKwkJYnJlYWs7CisJY2FzZSBJMkNfRFJJVkVSSURfVlBYMzIyMDoKKwkJbmFtZSA9ICJ2cHgzMjIwIjsKKwkJYnJlYWs7CisvKgljYXNlIEkyQ19EUklWRVJJRF9WUFgzMjI0OgorCQluYW1lID0gInZweDMyMjQiOworCQlicmVhazsKKwljYXNlIEkyQ19EUklWRVJJRF9NU0UzMDAwOgorCQluYW1lID0gIm1zZTMwMDAiOworCQlicmVhazsqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgY2hhciAqCitjb2RlY2lkX3RvX21vZHVsZW5hbWUgKHUxNiBjb2RlY2lkKQoreworCWNoYXIgKm5hbWUgPSBOVUxMOworCisJc3dpdGNoIChjb2RlY2lkKSB7CisJY2FzZSBDT0RFQ19UWVBFX1pSMzYwNjA6CisJCW5hbWUgPSAienIzNjA2MCI7CisJCWJyZWFrOworCWNhc2UgQ09ERUNfVFlQRV9aUjM2MDUwOgorCQluYW1lID0gInpyMzYwNTAiOworCQlicmVhazsKKwljYXNlIENPREVDX1RZUEVfWlIzNjAxNjoKKwkJbmFtZSA9ICJ6cjM2MDE2IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5hbWU7Cit9CisKKy8vIHN0cnVjdCB0dm5vcm0geworLy8gICAgICB1MTYgV3QsIFdhLCBIU3RhcnQsIEhTeW5jU3RhcnQsIEh0LCBIYSwgVlN0YXJ0OworLy8gfTsKKworc3RhdGljIHN0cnVjdCB0dm5vcm0gZjUwc3FwaXhlbCA9IHsgOTQ0LCA3NjgsIDgzLCA4ODAsIDYyNSwgNTc2LCAxNiB9Oworc3RhdGljIHN0cnVjdCB0dm5vcm0gZjYwc3FwaXhlbCA9IHsgNzgwLCA2NDAsIDUxLCA3MTYsIDUyNSwgNDgwLCAxMiB9Oworc3RhdGljIHN0cnVjdCB0dm5vcm0gZjUwY2NpcjYwMSA9IHsgODY0LCA3MjAsIDc1LCA4MDQsIDYyNSwgNTc2LCAxOCB9Oworc3RhdGljIHN0cnVjdCB0dm5vcm0gZjYwY2NpcjYwMSA9IHsgODU4LCA3MjAsIDU3LCA3ODgsIDUyNSwgNDgwLCAxNiB9OworCitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNTBjY2lyNjAxX2xtbDMzID0geyA4NjQsIDcyMCwgNzUrMzQsIDgwNCwgNjI1LCA1NzYsIDE4IH07CitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNjBjY2lyNjAxX2xtbDMzID0geyA4NTgsIDcyMCwgNTcrMzQsIDc4OCwgNTI1LCA0ODAsIDE2IH07CisKKy8qIFRoZSBEQzEwICg1Ny8xNi81MCkgdXNlcyBWQWN0aXZlIGFzIEhTeW5jLCBzbyBIU3RhcnQgbXVzdCBiZSAwICovCitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNTBzcXBpeGVsX2RjMTAgPSB7IDk0NCwgNzY4LCAwLCA4ODAsIDYyNSwgNTc2LCAwIH07CitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNjBzcXBpeGVsX2RjMTAgPSB7IDc4MCwgNjQwLCAwLCA3MTYsIDUyNSwgNDgwLCAxMiB9OworCisvKiBGSVhNRTogSSBjYW5ub3Qgc3dhcCBVIGFuZCBWIGluIHNhYTcxMTQsIHNvIGkgZG8gb25lCisgKiBwaXhlbCBsZWZ0IHNoaWZ0IGluIHpvcmFuICg3NSAtPiA3NCkKKyAqIChNYXhpbSBZZXZ0eXVzaGtpbiA8bWF4QGxpbnV4bWVkaWFsYWJzLmNvbT4pICovCitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNTBjY2lyNjAxX2xtMzNyMTAgPSB7IDg2NCwgNzIwLCA3NCs1NCwgODA0LCA2MjUsIDU3NiwgMTggfTsKK3N0YXRpYyBzdHJ1Y3QgdHZub3JtIGY2MGNjaXI2MDFfbG0zM3IxMCA9IHsgODU4LCA3MjAsIDU2KzU0LCA3ODgsIDUyNSwgNDgwLCAxNiB9OworCitzdGF0aWMgc3RydWN0IGNhcmRfaW5mbyB6b3Jhbl9jYXJkc1tOVU1fQ0FSRFNdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkudHlwZSA9IERDMTBfb2xkLAorCQkubmFtZSA9ICJEQzEwKG9sZCkiLAorCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfVlBYMzIyMCwKKwkJLyouaTJjX2VuY29kZXIgPSBJMkNfRFJJVkVSSURfTVNFMzAwMCwqLworCQkudmlkZW9fY29kZWMgPSBDT0RFQ19UWVBFX1pSMzYwNTAsCisJCS52aWRlb192ZmUgPSBDT0RFQ19UWVBFX1pSMzYwMTYsCisKKwkJLmlucHV0cyA9IDMsCisJCS5pbnB1dCA9IHsKKwkJCXsgMSwgIkNvbXBvc2l0ZSIgfSwKKwkJCXsgMiwgIlMtVmlkZW8iIH0sCisJCQl7IDAsICJJbnRlcm5hbC9jb21wIiB9CisJCX0sCisJCS5ub3JtcyA9IDMsCisJCS50dm4gPSB7CisJCQkmZjUwc3FwaXhlbF9kYzEwLAorCQkJJmY2MHNxcGl4ZWxfZGMxMCwKKwkJCSZmNTBzcXBpeGVsX2RjMTAKKwkJfSwKKwkJLmpwZWdfaW50ID0gMCwKKwkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAorCQkuZ3BpbyA9IHsgMiwgMSwgLTEsIDMsIDcsIDAsIDQsIDUgfSwKKwkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwIH0sCisJCS5ncGNzID0geyAtMSwgMCB9LAorCQkudmZlX3BvbCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAwLAorCQkuaW5pdCA9ICZkYzEwX2luaXQsCisJfSwgeworCQkudHlwZSA9IERDMTBfbmV3LAorCQkubmFtZSA9ICJEQzEwKG5ldykiLAorCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfU0FBNzExMCwKKwkJLmkyY19lbmNvZGVyID0gSTJDX0RSSVZFUklEX0FEVjcxNzUsCisJCS52aWRlb19jb2RlYyA9IENPREVDX1RZUEVfWlIzNjA2MCwKKworCQkuaW5wdXRzID0gMywKKwkJLmlucHV0ID0geworCQkJCXsgMCwgIkNvbXBvc2l0ZSIgfSwKKwkJCQl7IDcsICJTLVZpZGVvIiB9LAorCQkJCXsgNSwgIkludGVybmFsL2NvbXAiIH0KKwkJCX0sCisJCS5ub3JtcyA9IDMsCisJCS50dm4gPSB7CisJCQkJJmY1MHNxcGl4ZWwsCisJCQkJJmY2MHNxcGl4ZWwsCisJCQkJJmY1MHNxcGl4ZWx9LAorCQkuanBlZ19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMCwKKwkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAorCQkuZ3BpbyA9IHsgMywgMCwgNiwgMSwgMiwgLTEsIDQsIDUgfSwKKwkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisJCS5ncGNzID0geyAtMSwgMX0sCisJCS52ZmVfcG9sID0geyAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwIH0sCisJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbml0ID0gJmRjMTBwbHVzX2luaXQsCisJfSwgeworCQkudHlwZSA9IERDMTBwbHVzLAorCQkubmFtZSA9ICJEQzEwcGx1cyIsCisJCS52ZW5kb3JfaWQgPSBQQ0lfVkVORE9SX0lEX01JUk8sCisJCS5kZXZpY2VfaWQgPSBQQ0lfREVWSUNFX0lEX01JUk9fREMxMFBMVVMsCisJCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9TQUE3MTEwLAorCQkuaTJjX2VuY29kZXIgPSBJMkNfRFJJVkVSSURfQURWNzE3NSwKKwkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDYwLAorCisJCS5pbnB1dHMgPSAzLAorCQkuaW5wdXQgPSB7CisJCQl7IDAsICJDb21wb3NpdGUiIH0sCisJCQl7IDcsICJTLVZpZGVvIiB9LAorCQkJeyA1LCAiSW50ZXJuYWwvY29tcCIgfQorCQl9LAorCQkubm9ybXMgPSAzLAorCQkudHZuID0geworCQkJJmY1MHNxcGl4ZWwsCisJCQkmZjYwc3FwaXhlbCwKKwkJCSZmNTBzcXBpeGVsCisJCX0sCisJCS5qcGVnX2ludCA9IFpSMzYwNTdfSVNSX0dJUlEwLAorCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTEsCisJCS5ncGlvID0geyAzLCAwLCA2LCAxLCAyLCAtMSwgNCwgNSB9LAorCQkuZ3Bpb19wb2wgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKwkJLmdwY3MgPSB7IC0xLCAxIH0sCisJCS52ZmVfcG9sID0geyAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwIH0sCisJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbml0ID0gJmRjMTBwbHVzX2luaXQsCisJfSwgeworCQkudHlwZSA9IERDMzAsCisJCS5uYW1lID0gIkRDMzAiLAorCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfVlBYMzIyMCwKKwkJLmkyY19lbmNvZGVyID0gSTJDX0RSSVZFUklEX0FEVjcxNzUsCisJCS52aWRlb19jb2RlYyA9IENPREVDX1RZUEVfWlIzNjA1MCwKKwkJLnZpZGVvX3ZmZSA9IENPREVDX1RZUEVfWlIzNjAxNiwKKworCQkuaW5wdXRzID0gMywKKwkJLmlucHV0ID0geworCQkJeyAxLCAiQ29tcG9zaXRlIiB9LAorCQkJeyAyLCAiUy1WaWRlbyIgfSwKKwkJCXsgMCwgIkludGVybmFsL2NvbXAiIH0KKwkJfSwKKwkJLm5vcm1zID0gMywKKwkJLnR2biA9IHsKKwkJCSZmNTBzcXBpeGVsX2RjMTAsCisJCQkmZjYwc3FwaXhlbF9kYzEwLAorCQkJJmY1MHNxcGl4ZWxfZGMxMAorCQl9LAorCQkuanBlZ19pbnQgPSAwLAorCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTEsCisJCS5ncGlvID0geyAyLCAxLCAtMSwgMywgNywgMCwgNCwgNSB9LAorCQkuZ3Bpb19wb2wgPSB7IDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAgfSwKKwkJLmdwY3MgPSB7IC0xLCAwIH0sCisJCS52ZmVfcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbml0ID0gJmRjMTBfaW5pdCwKKwl9LCB7CisJCS50eXBlID0gREMzMHBsdXMsCisJCS5uYW1lID0gIkRDMzBwbHVzIiwKKwkJLnZlbmRvcl9pZCA9IFBDSV9WRU5ET1JfSURfTUlSTywKKwkJLmRldmljZV9pZCA9IFBDSV9ERVZJQ0VfSURfTUlST19EQzMwUExVUywKKwkJLmkyY19kZWNvZGVyID0gSTJDX0RSSVZFUklEX1ZQWDMyMjAsCisJCS5pMmNfZW5jb2RlciA9IEkyQ19EUklWRVJJRF9BRFY3MTc1LAorCQkudmlkZW9fY29kZWMgPSBDT0RFQ19UWVBFX1pSMzYwNTAsCisJCS52aWRlb192ZmUgPSBDT0RFQ19UWVBFX1pSMzYwMTYsCisKKwkJLmlucHV0cyA9IDMsCisJCS5pbnB1dCA9IHsKKwkJCXsgMSwgIkNvbXBvc2l0ZSIgfSwKKwkJCXsgMiwgIlMtVmlkZW8iIH0sCisJCQl7IDAsICJJbnRlcm5hbC9jb21wIiB9CisJCX0sCisJCS5ub3JtcyA9IDMsCisJCS50dm4gPSB7CisJCQkmZjUwc3FwaXhlbF9kYzEwLAorCQkJJmY2MHNxcGl4ZWxfZGMxMCwKKwkJCSZmNTBzcXBpeGVsX2RjMTAKKwkJfSwKKwkJLmpwZWdfaW50ID0gMCwKKwkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAorCQkuZ3BpbyA9IHsgMiwgMSwgLTEsIDMsIDcsIDAsIDQsIDUgfSwKKwkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwIH0sCisJCS5ncGNzID0geyAtMSwgMCB9LAorCQkudmZlX3BvbCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAwLAorCQkuaW5pdCA9ICZkYzEwX2luaXQsCisJfSwgeworCQkudHlwZSA9IExNTDMzLAorCQkubmFtZSA9ICJMTUwzMyIsCisJCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9CVDgxOSwKKwkJLmkyY19lbmNvZGVyID0gSTJDX0RSSVZFUklEX0JUODU2LAorCQkudmlkZW9fY29kZWMgPSBDT0RFQ19UWVBFX1pSMzYwNjAsCisKKwkJLmlucHV0cyA9IDIsCisJCS5pbnB1dCA9IHsKKwkJCXsgMCwgIkNvbXBvc2l0ZSIgfSwKKwkJCXsgNywgIlMtVmlkZW8iIH0KKwkJfSwKKwkJLm5vcm1zID0gMiwKKwkJLnR2biA9IHsKKwkJCSZmNTBjY2lyNjAxX2xtbDMzLAorCQkJJmY2MGNjaXI2MDFfbG1sMzMsCisJCQlOVUxMCisJCX0sCisJCS5qcGVnX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAorCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTAsCisJCS5ncGlvID0geyAxLCAtMSwgMywgNSwgNywgLTEsIC0xLCAtMSB9LAorCQkuZ3Bpb19wb2wgPSB7IDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAgfSwKKwkJLmdwY3MgPSB7IDMsIDEgfSwKKwkJLnZmZV9wb2wgPSB7IDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAgfSwKKwkJLmd3c19ub3RfY29ubmVjdGVkID0gMSwKKwkJLmluaXQgPSAmbG1sMzNfaW5pdCwKKwl9LCB7CisJCS50eXBlID0gTE1MMzNSMTAsCisJCS5uYW1lID0gIkxNTDMzUjEwIiwKKwkJLnZlbmRvcl9pZCA9IFBDSV9WRU5ET1JfSURfRUxFQ1RST05JQ0RFU0lHTkdNQkgsCisJCS5kZXZpY2VfaWQgPSBQQ0lfREVWSUNFX0lEX0xNTF8zM1IxMCwKKwkJLmkyY19kZWNvZGVyID0gSTJDX0RSSVZFUklEX1NBQTcxMTQsCisJCS5pMmNfZW5jb2RlciA9IEkyQ19EUklWRVJJRF9BRFY3MTcwLAorCQkudmlkZW9fY29kZWMgPSBDT0RFQ19UWVBFX1pSMzYwNjAsCisKKwkJLmlucHV0cyA9IDIsCisJCS5pbnB1dCA9IHsKKwkJCXsgMCwgIkNvbXBvc2l0ZSIgfSwKKwkJCXsgNywgIlMtVmlkZW8iIH0KKwkJfSwKKwkJLm5vcm1zID0gMiwKKwkJLnR2biA9IHsKKwkJCSZmNTBjY2lyNjAxX2xtMzNyMTAsCisJCQkmZjYwY2NpcjYwMV9sbTMzcjEwLAorCQkJTlVMTAorCQl9LAorCQkuanBlZ19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMSwKKwkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlEwLAorCQkuZ3BpbyA9IHsgMSwgLTEsIDMsIDUsIDcsIC0xLCAtMSwgLTEgfSwKKwkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwIH0sCisJCS5ncGNzID0geyAzLCAxIH0sCisJCS52ZmVfcG9sID0geyAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwIH0sCisJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDEsCisJCS5pbml0ID0gJmxtbDMzX2luaXQsCisJfSwgeworCQkudHlwZSA9IEJVWiwKKwkJLm5hbWUgPSAiQnV6IiwKKwkJLnZlbmRvcl9pZCA9IFBDSV9WRU5ET1JfSURfSU9NRUdBLAorCQkuZGV2aWNlX2lkID0gUENJX0RFVklDRV9JRF9JT01FR0FfQlVaLAorCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfU0FBNzExMUEsCisJCS5pMmNfZW5jb2RlciA9IEkyQ19EUklWRVJJRF9TQUE3MTg1QiwKKwkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDYwLAorCisJCS5pbnB1dHMgPSAyLAorCQkuaW5wdXQgPSB7CisJCQl7IDMsICJDb21wb3NpdGUiIH0sCisJCQl7IDcsICJTLVZpZGVvIiB9CisJCX0sCisJCS5ub3JtcyA9IDMsCisJCS50dm4gPSB7CisJCQkmZjUwY2NpcjYwMSwKKwkJCSZmNjBjY2lyNjAxLAorCQkJJmY1MGNjaXI2MDEKKwkJfSwKKwkJLmpwZWdfaW50ID0gWlIzNjA1N19JU1JfR0lSUTEsCisJCS52c3luY19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMCwKKwkJLmdwaW8gPSB7IDEsIC0xLCAzLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKwkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisJCS5ncGNzID0geyAzLCAxIH0sCisJCS52ZmVfcG9sID0geyAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwIH0sCisJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDEsCisJCS5pbml0ID0gJmJ1el9pbml0LAorCX0KK307CisKKy8qCisgKiBJMkMgZnVuY3Rpb25zCisgKi8KKy8qIHNvZnR3YXJlIEkyQyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQKK3pvcmFuX2kyY19nZXRzZGEgKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHpvcmFuICp6ciA9IChzdHJ1Y3Qgem9yYW4gKikgZGF0YTsKKworCXJldHVybiAoYnRyZWFkKFpSMzYwNTdfSTJDQlIpID4+IDEpICYgMTsKK30KKworc3RhdGljIGludAorem9yYW5faTJjX2dldHNjbCAodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBkYXRhOworCisJcmV0dXJuIGJ0cmVhZChaUjM2MDU3X0kyQ0JSKSAmIDE7Cit9CisKK3N0YXRpYyB2b2lkCit6b3Jhbl9pMmNfc2V0c2RhICh2b2lkICpkYXRhLAorCQkgIGludCAgIHN0YXRlKQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGRhdGE7CisKKwlpZiAoc3RhdGUpCisJCXpyLT5pMmNiciB8PSAyOworCWVsc2UKKwkJenItPmkyY2JyICY9IH4yOworCWJ0d3JpdGUoenItPmkyY2JyLCBaUjM2MDU3X0kyQ0JSKTsKK30KKworc3RhdGljIHZvaWQKK3pvcmFuX2kyY19zZXRzY2wgKHZvaWQgKmRhdGEsCisJCSAgaW50ICAgc3RhdGUpCit7CisJc3RydWN0IHpvcmFuICp6ciA9IChzdHJ1Y3Qgem9yYW4gKikgZGF0YTsKKworCWlmIChzdGF0ZSkKKwkJenItPmkyY2JyIHw9IDE7CisJZWxzZQorCQl6ci0+aTJjYnIgJj0gfjE7CisJYnR3cml0ZSh6ci0+aTJjYnIsIFpSMzYwNTdfSTJDQlIpOworfQorCitzdGF0aWMgaW50Cit6b3Jhbl9pMmNfY2xpZW50X3JlZ2lzdGVyIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKwlpbnQgcmVzID0gMDsKKworCWRwcmludGsoMiwKKwkJS0VSTl9ERUJVRyAiJXM6IGkyY19jbGllbnRfcmVnaXN0ZXIoKSAtIGRyaXZlciBpZCA9ICVkXG4iLAorCQlaUl9ERVZOQU1FKHpyKSwgY2xpZW50LT5kcml2ZXItPmlkKTsKKworCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCWlmICh6ci0+dXNlciA+IDApIHsKKwkJLyogd2UncmUgYWxyZWFkeSBidXN5LCBzbyB3ZSBrZWVwIGEgcmVmZXJlbmNlIHRvCisJCSAqIHRoZW0uLi4gQ291bGQgZG8gYSBsb3Qgb2Ygc3R1ZmYgaGVyZSwgYnV0IHRoaXMKKwkJICogaXMgZWFzaWVzdC4gKERpZCBJIGV2ZXIgbWVudGlvbiBJJ20gYSBsYXp5IGFzcz8pCisJCSAqLworCQlyZXMgPSAtRUJVU1k7CisJCWdvdG8gY2xpZW50cmVnX3VubG9ja19hbmRfcmV0dXJuOworCX0KKworCWlmIChjbGllbnQtPmRyaXZlci0+aWQgPT0genItPmNhcmQuaTJjX2RlY29kZXIpCisJCXpyLT5kZWNvZGVyID0gY2xpZW50OworCWVsc2UgaWYgKGNsaWVudC0+ZHJpdmVyLT5pZCA9PSB6ci0+Y2FyZC5pMmNfZW5jb2RlcikKKwkJenItPmVuY29kZXIgPSBjbGllbnQ7CisJZWxzZSB7CisJCXJlcyA9IC1FTk9ERVY7CisJCWdvdG8gY2xpZW50cmVnX3VubG9ja19hbmRfcmV0dXJuOworCX0KKworY2xpZW50cmVnX3VubG9ja19hbmRfcmV0dXJuOgorCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50Cit6b3Jhbl9pMmNfY2xpZW50X3VucmVnaXN0ZXIgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHpvcmFuICp6ciA9IChzdHJ1Y3Qgem9yYW4gKikgaTJjX2dldF9hZGFwZGF0YShjbGllbnQtPmFkYXB0ZXIpOworCWludCByZXMgPSAwOworCisJZHByaW50aygyLCBLRVJOX0RFQlVHICIlczogaTJjX2NsaWVudF91bnJlZ2lzdGVyKClcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCWlmICh6ci0+dXNlciA+IDApIHsKKwkJcmVzID0gLUVCVVNZOworCQlnb3RvIGNsaWVudHVucmVnX3VubG9ja19hbmRfcmV0dXJuOworCX0KKworCS8qIHRyeSB0byBsb2NhdGUgaXQgKi8KKwlpZiAoY2xpZW50ID09IHpyLT5lbmNvZGVyKSB7CisJCXpyLT5lbmNvZGVyID0gTlVMTDsKKwl9IGVsc2UgaWYgKGNsaWVudCA9PSB6ci0+ZGVjb2RlcikgeworCQl6ci0+ZGVjb2RlciA9IE5VTEw7CisJCXNucHJpbnRmKFpSX0RFVk5BTUUoenIpLCBzaXplb2YoWlJfREVWTkFNRSh6cikpLCAiTUpQRUdbJWRdIiwgenItPmlkKTsKKwl9CitjbGllbnR1bnJlZ191bmxvY2tfYW5kX3JldHVybjoKKwl1cCgmenItPnJlc291cmNlX2xvY2spOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgem9yYW5faTJjX2JpdF9kYXRhX3RlbXBsYXRlID0geworCS5zZXRzZGEgPSB6b3Jhbl9pMmNfc2V0c2RhLAorCS5zZXRzY2wgPSB6b3Jhbl9pMmNfc2V0c2NsLAorCS5nZXRzZGEgPSB6b3Jhbl9pMmNfZ2V0c2RhLAorCS5nZXRzY2wgPSB6b3Jhbl9pMmNfZ2V0c2NsLAorCS51ZGVsYXkgPSAxMCwKKwkubWRlbGF5ID0gMCwKKwkudGltZW91dCA9IDEwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgem9yYW5faTJjX2FkYXB0ZXJfdGVtcGxhdGUgPSB7CisJSTJDX0RFVk5BTUUoInpyMzYwNTciKSwKKwkuaWQgPSBJMkNfSFdfQl9aUjM2MDY3LAorCS5hbGdvID0gTlVMTCwKKwkuY2xpZW50X3JlZ2lzdGVyID0gem9yYW5faTJjX2NsaWVudF9yZWdpc3RlciwKKwkuY2xpZW50X3VucmVnaXN0ZXIgPSB6b3Jhbl9pMmNfY2xpZW50X3VucmVnaXN0ZXIsCit9OworCitzdGF0aWMgaW50Cit6b3Jhbl9yZWdpc3Rlcl9pMmMgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJbWVtY3B5KCZ6ci0+aTJjX2FsZ28sICZ6b3Jhbl9pMmNfYml0X2RhdGFfdGVtcGxhdGUsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEpKTsKKwl6ci0+aTJjX2FsZ28uZGF0YSA9IHpyOworCW1lbWNweSgmenItPmkyY19hZGFwdGVyLCAmem9yYW5faTJjX2FkYXB0ZXJfdGVtcGxhdGUsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaTJjX2FkYXB0ZXIpKTsKKwlzdHJuY3B5KEkyQ19OQU1FKCZ6ci0+aTJjX2FkYXB0ZXIpLCBaUl9ERVZOQU1FKHpyKSwKKwkJc2l6ZW9mKEkyQ19OQU1FKCZ6ci0+aTJjX2FkYXB0ZXIpKSAtIDEpOworCWkyY19zZXRfYWRhcGRhdGEoJnpyLT5pMmNfYWRhcHRlciwgenIpOworCXpyLT5pMmNfYWRhcHRlci5hbGdvX2RhdGEgPSAmenItPmkyY19hbGdvOworCXJldHVybiBpMmNfYml0X2FkZF9idXMoJnpyLT5pMmNfYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCit6b3Jhbl91bnJlZ2lzdGVyX2kyYyAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlpMmNfYml0X2RlbF9idXMoKCZ6ci0+aTJjX2FkYXB0ZXIpKTsKK30KKworLyogQ2hlY2sgYSB6b3Jhbl9wYXJhbXMgc3RydWN0IGZvciBjb3JyZWN0bmVzcywgaW5zZXJ0IGRlZmF1bHQgcGFyYW1zICovCisKK2ludAorem9yYW5fY2hlY2tfanBnX3NldHRpbmdzIChzdHJ1Y3Qgem9yYW4gICAgICAgICAgICAgICp6ciwKKwkJCSAgc3RydWN0IHpvcmFuX2pwZ19zZXR0aW5ncyAqc2V0dGluZ3MpCit7CisJaW50IGVyciA9IDAsIGVycjAgPSAwOworCisJZHByaW50ayg0LAorCQlLRVJOX0RFQlVHCisJCSIlczogY2hlY2tfanBnX3NldHRpbmdzKCkgLSBkZWM6ICVkLCBIZGNtOiAlZCwgVmRjbTogJWQsIFRkY206ICVkXG4iLAorCQlaUl9ERVZOQU1FKHpyKSwgc2V0dGluZ3MtPmRlY2ltYXRpb24sIHNldHRpbmdzLT5Ib3JEY20sCisJCXNldHRpbmdzLT5WZXJEY20sIHNldHRpbmdzLT5UbXBEY20pOworCWRwcmludGsoNCwKKwkJS0VSTl9ERUJVRworCQkiJXM6IGNoZWNrX2pwZ19zZXR0aW5ncygpIC0geDogJWQsIHk6ICVkLCB3OiAlZCwgeTogJWRcbiIsCisJCVpSX0RFVk5BTUUoenIpLCBzZXR0aW5ncy0+aW1nX3gsIHNldHRpbmdzLT5pbWdfeSwKKwkJc2V0dGluZ3MtPmltZ193aWR0aCwgc2V0dGluZ3MtPmltZ19oZWlnaHQpOworCS8qIENoZWNrIGRlY2ltYXRpb24sIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgZGVjaW1hdGlvbiA9IDEsIDIsIDQgKi8KKwlzd2l0Y2ggKHNldHRpbmdzLT5kZWNpbWF0aW9uKSB7CisJY2FzZSAxOgorCisJCXNldHRpbmdzLT5Ib3JEY20gPSAxOworCQlzZXR0aW5ncy0+VmVyRGNtID0gMTsKKwkJc2V0dGluZ3MtPlRtcERjbSA9IDE7CisJCXNldHRpbmdzLT5maWVsZF9wZXJfYnVmZiA9IDI7CisJCXNldHRpbmdzLT5pbWdfeCA9IDA7CisJCXNldHRpbmdzLT5pbWdfeSA9IDA7CisJCXNldHRpbmdzLT5pbWdfd2lkdGggPSBCVVpfTUFYX1dJRFRIOworCQlzZXR0aW5ncy0+aW1nX2hlaWdodCA9IEJVWl9NQVhfSEVJR0hUIC8gMjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCisJCXNldHRpbmdzLT5Ib3JEY20gPSAyOworCQlzZXR0aW5ncy0+VmVyRGNtID0gMTsKKwkJc2V0dGluZ3MtPlRtcERjbSA9IDI7CisJCXNldHRpbmdzLT5maWVsZF9wZXJfYnVmZiA9IDE7CisJCXNldHRpbmdzLT5pbWdfeCA9IChCVVpfTUFYX1dJRFRIID09IDcyMCkgPyA4IDogMDsKKwkJc2V0dGluZ3MtPmltZ195ID0gMDsKKwkJc2V0dGluZ3MtPmltZ193aWR0aCA9CisJCSAgICAoQlVaX01BWF9XSURUSCA9PSA3MjApID8gNzA0IDogQlVaX01BWF9XSURUSDsKKwkJc2V0dGluZ3MtPmltZ19oZWlnaHQgPSBCVVpfTUFYX0hFSUdIVCAvIDI7CisJCWJyZWFrOworCWNhc2UgNDoKKworCQlpZiAoenItPmNhcmQudHlwZSA9PSBEQzEwX25ldykgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fREVCVUcKKwkJCQkiJXM6IGNoZWNrX2pwZ19zZXR0aW5ncygpIC0gSERlYyBieSA0IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIERDMTBcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJZXJyMCsrOworCQkJYnJlYWs7CisJCX0KKworCQlzZXR0aW5ncy0+SG9yRGNtID0gNDsKKwkJc2V0dGluZ3MtPlZlckRjbSA9IDI7CisJCXNldHRpbmdzLT5UbXBEY20gPSAyOworCQlzZXR0aW5ncy0+ZmllbGRfcGVyX2J1ZmYgPSAxOworCQlzZXR0aW5ncy0+aW1nX3ggPSAoQlVaX01BWF9XSURUSCA9PSA3MjApID8gOCA6IDA7CisJCXNldHRpbmdzLT5pbWdfeSA9IDA7CisJCXNldHRpbmdzLT5pbWdfd2lkdGggPQorCQkgICAgKEJVWl9NQVhfV0lEVEggPT0gNzIwKSA/IDcwNCA6IEJVWl9NQVhfV0lEVEg7CisJCXNldHRpbmdzLT5pbWdfaGVpZ2h0ID0gQlVaX01BWF9IRUlHSFQgLyAyOworCQlicmVhazsKKwljYXNlIDA6CisKKwkJLyogV2UgaGF2ZSB0byBjaGVjayB0aGUgZGF0YSB0aGUgdXNlciBoYXMgc2V0ICovCisKKwkJaWYgKHNldHRpbmdzLT5Ib3JEY20gIT0gMSAmJiBzZXR0aW5ncy0+SG9yRGNtICE9IDIgJiYKKwkJICAgICh6ci0+Y2FyZC50eXBlID09IERDMTBfbmV3IHx8IHNldHRpbmdzLT5Ib3JEY20gIT0gNCkpCisJCQllcnIwKys7CisJCWlmIChzZXR0aW5ncy0+VmVyRGNtICE9IDEgJiYgc2V0dGluZ3MtPlZlckRjbSAhPSAyKQorCQkJZXJyMCsrOworCQlpZiAoc2V0dGluZ3MtPlRtcERjbSAhPSAxICYmIHNldHRpbmdzLT5UbXBEY20gIT0gMikKKwkJCWVycjArKzsKKwkJaWYgKHNldHRpbmdzLT5maWVsZF9wZXJfYnVmZiAhPSAxICYmCisJCSAgICBzZXR0aW5ncy0+ZmllbGRfcGVyX2J1ZmYgIT0gMikKKwkJCWVycjArKzsKKwkJaWYgKHNldHRpbmdzLT5pbWdfeCA8IDApCisJCQllcnIwKys7CisJCWlmIChzZXR0aW5ncy0+aW1nX3kgPCAwKQorCQkJZXJyMCsrOworCQlpZiAoc2V0dGluZ3MtPmltZ193aWR0aCA8IDApCisJCQllcnIwKys7CisJCWlmIChzZXR0aW5ncy0+aW1nX2hlaWdodCA8IDApCisJCQllcnIwKys7CisJCWlmIChzZXR0aW5ncy0+aW1nX3ggKyBzZXR0aW5ncy0+aW1nX3dpZHRoID4gQlVaX01BWF9XSURUSCkKKwkJCWVycjArKzsKKwkJaWYgKHNldHRpbmdzLT5pbWdfeSArIHNldHRpbmdzLT5pbWdfaGVpZ2h0ID4KKwkJICAgIEJVWl9NQVhfSEVJR0hUIC8gMikKKwkJCWVycjArKzsKKwkJaWYgKHNldHRpbmdzLT5Ib3JEY20gJiYgc2V0dGluZ3MtPlZlckRjbSkgeworCQkJaWYgKHNldHRpbmdzLT5pbWdfd2lkdGggJQorCQkJICAgICgxNiAqIHNldHRpbmdzLT5Ib3JEY20pICE9IDApCisJCQkJZXJyMCsrOworCQkJaWYgKHNldHRpbmdzLT5pbWdfaGVpZ2h0ICUKKwkJCSAgICAoOCAqIHNldHRpbmdzLT5WZXJEY20pICE9IDApCisJCQkJZXJyMCsrOworCQl9CisKKwkJaWYgKGVycjApIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogY2hlY2tfanBnX3NldHRpbmdzKCkgLSBlcnJvciBpbiBwYXJhbXMgZm9yIGRlY2ltYXRpb24gPSAwXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCWVycisrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IGNoZWNrX2pwZ19zZXR0aW5ncygpIC0gZGVjaW1hdGlvbiA9ICVkLCBtdXN0IGJlIDAsIDEsIDIgb3IgNFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBzZXR0aW5ncy0+ZGVjaW1hdGlvbik7CisJCWVycisrOworCQlicmVhazsKKwl9CisKKwlpZiAoc2V0dGluZ3MtPmpwZ19jb21wLnF1YWxpdHkgPiAxMDApCisJCXNldHRpbmdzLT5qcGdfY29tcC5xdWFsaXR5ID0gMTAwOworCWlmIChzZXR0aW5ncy0+anBnX2NvbXAucXVhbGl0eSA8IDUpCisJCXNldHRpbmdzLT5qcGdfY29tcC5xdWFsaXR5ID0gNTsKKwlpZiAoc2V0dGluZ3MtPmpwZ19jb21wLkFQUG4gPCAwKQorCQlzZXR0aW5ncy0+anBnX2NvbXAuQVBQbiA9IDA7CisJaWYgKHNldHRpbmdzLT5qcGdfY29tcC5BUFBuID4gMTUpCisJCXNldHRpbmdzLT5qcGdfY29tcC5BUFBuID0gMTU7CisJaWYgKHNldHRpbmdzLT5qcGdfY29tcC5BUFBfbGVuIDwgMCkKKwkJc2V0dGluZ3MtPmpwZ19jb21wLkFQUF9sZW4gPSAwOworCWlmIChzZXR0aW5ncy0+anBnX2NvbXAuQVBQX2xlbiA+IDYwKQorCQlzZXR0aW5ncy0+anBnX2NvbXAuQVBQX2xlbiA9IDYwOworCWlmIChzZXR0aW5ncy0+anBnX2NvbXAuQ09NX2xlbiA8IDApCisJCXNldHRpbmdzLT5qcGdfY29tcC5DT01fbGVuID0gMDsKKwlpZiAoc2V0dGluZ3MtPmpwZ19jb21wLkNPTV9sZW4gPiA2MCkKKwkJc2V0dGluZ3MtPmpwZ19jb21wLkNPTV9sZW4gPSA2MDsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorem9yYW5fb3Blbl9pbml0X3BhcmFtcyAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlpbnQgaTsKKworCS8qIFVzZXIgbXVzdCBleHBsaWNpdGx5IHNldCBhIHdpbmRvdyAqLworCXpyLT5vdmVybGF5X3NldHRpbmdzLmlzX3NldCA9IDA7CisJenItPm92ZXJsYXlfbWFzayA9IE5VTEw7CisJenItPm92ZXJsYXlfYWN0aXZlID0gWk9SQU5fRlJFRTsKKworCXpyLT52NGxfbWVtZ3JhYl9hY3RpdmUgPSAwOworCXpyLT52NGxfb3ZlcmxheV9hY3RpdmUgPSAwOworCXpyLT52NGxfZ3JhYl9mcmFtZSA9IE5PX0dSQUJfQUNUSVZFOworCXpyLT52NGxfZ3JhYl9zZXEgPSAwOworCXpyLT52NGxfc2V0dGluZ3Mud2lkdGggPSAxOTI7CisJenItPnY0bF9zZXR0aW5ncy5oZWlnaHQgPSAxNDQ7CisJenItPnY0bF9zZXR0aW5ncy5mb3JtYXQgPSAmem9yYW5fZm9ybWF0c1s0XTsJLyogWVVZMiAtIFlVVi00OjI6MiBwYWNrZWQgKi8KKwl6ci0+djRsX3NldHRpbmdzLmJ5dGVzcGVybGluZSA9CisJICAgIHpyLT52NGxfc2V0dGluZ3Mud2lkdGggKgorCSAgICAoKHpyLT52NGxfc2V0dGluZ3MuZm9ybWF0LT5kZXB0aCArIDcpIC8gOCk7CisKKwkvKiBETUEgcmluZyBzdHVmZiBmb3IgVjRMICovCisJenItPnY0bF9wZW5kX3RhaWwgPSAwOworCXpyLT52NGxfcGVuZF9oZWFkID0gMDsKKwl6ci0+djRsX3N5bmNfdGFpbCA9IDA7CisJenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9IFpPUkFOX0ZSRUU7CisJZm9yIChpID0gMDsgaSA8IFZJREVPX01BWF9GUkFNRTsgaSsrKSB7CisJCXpyLT52NGxfYnVmZmVycy5idWZmZXJbaV0uc3RhdGUgPSBCVVpfU1RBVEVfVVNFUjsJLyogbm90aGluZyBnb2luZyBvbiAqLworCX0KKwl6ci0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBCVVpfTUFYX0ZSQU1FOyBpKyspIHsKKwkJenItPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5zdGF0ZSA9IEJVWl9TVEFURV9VU0VSOwkvKiBub3RoaW5nIGdvaW5nIG9uICovCisJfQorCXpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOworCXpyLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOworCS8qIFNldCBuZWNlc3NhcnkgcGFyYW1zIGFuZCBjYWxsIHpvcmFuX2NoZWNrX2pwZ19zZXR0aW5ncyB0byBzZXQgdGhlIGRlZmF1bHRzICovCisJenItPmpwZ19zZXR0aW5ncy5kZWNpbWF0aW9uID0gMTsKKwl6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLnF1YWxpdHkgPSA1MDsJLyogZGVmYXVsdCBjb21wcmVzc2lvbiBmYWN0b3IgOCAqLworCWlmICh6ci0+Y2FyZC50eXBlICE9IEJVWikKKwkJenItPmpwZ19zZXR0aW5ncy5vZGRfZXZlbiA9IDE7CisJZWxzZQorCQl6ci0+anBnX3NldHRpbmdzLm9kZF9ldmVuID0gMDsKKwl6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUG4gPSAwOworCXpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQX2xlbiA9IDA7CS8qIE5vIEFQUG4gbWFya2VyICovCisJbWVtc2V0KHpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQX2RhdGEsIDAsCisJICAgICAgIHNpemVvZih6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUF9kYXRhKSk7CisJenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5DT01fbGVuID0gMDsJLyogTm8gQ09NIG1hcmtlciAqLworCW1lbXNldCh6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9kYXRhLCAwLAorCSAgICAgICBzaXplb2YoenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5DT01fZGF0YSkpOworCXpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuanBlZ19tYXJrZXJzID0KKwkgICAgSlBFR19NQVJLRVJfREhUIHwgSlBFR19NQVJLRVJfRFFUOworCWkgPSB6b3Jhbl9jaGVja19qcGdfc2V0dGluZ3MoenIsICZ6ci0+anBnX3NldHRpbmdzKTsKKwlpZiAoaSkKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogem9yYW5fb3Blbl9pbml0X3BhcmFtcygpIGludGVybmFsIGVycm9yXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCisJY2xlYXJfaW50ZXJydXB0X2NvdW50ZXJzKHpyKTsKKwl6ci0+dGVzdGluZyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAordGVzdF9pbnRlcnJ1cHRzIChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCURFRklORV9XQUlUKHdhaXQpOworCWludCB0aW1lb3V0LCBpY3I7CisKKwljbGVhcl9pbnRlcnJ1cHRfY291bnRlcnMoenIpOworCisJenItPnRlc3RpbmcgPSAxOworCWljciA9IGJ0cmVhZChaUjM2MDU3X0lDUik7CisJYnR3cml0ZSgweDc4MDAwMDAwIHwgWlIzNjA1N19JQ1JfSW50UGluRW4sIFpSMzYwNTdfSUNSKTsKKwlwcmVwYXJlX3RvX3dhaXQoJnpyLT50ZXN0X3EsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KEhaKTsKKwlmaW5pc2hfd2FpdCgmenItPnRlc3RfcSwgJndhaXQpOworCWJ0d3JpdGUoMCwgWlIzNjA1N19JQ1IpOworCWJ0d3JpdGUoMHg3ODAwMDAwMCwgWlIzNjA1N19JU1IpOworCXpyLT50ZXN0aW5nID0gMDsKKwlkcHJpbnRrKDUsIEtFUk5fSU5GTyAiJXM6IFRlc3RpbmcgaW50ZXJydXB0cy4uLlxuIiwgWlJfREVWTkFNRSh6cikpOworCWlmICh0aW1lb3V0KSB7CisJCWRwcmludGsoMSwgIjogdGltZSBzcGVudDogJWRcbiIsIDEgKiBIWiAtIHRpbWVvdXQpOworCX0KKwlpZiAoKnpyX2RlYnVnID4gMSkKKwkJcHJpbnRfaW50ZXJydXB0cyh6cik7CisJYnR3cml0ZShpY3IsIFpSMzYwNTdfSUNSKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3pyMzYwNTdfaW5pdCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwl1bnNpZ25lZCBsb25nIG1lbTsKKwl2b2lkICp2ZGV2OworCXVuc2lnbmVkIG1lbV9uZWVkZWQ7CisJaW50IGo7CisJaW50IHR3byA9IDI7CisJaW50IHplcm8gPSAwOworCisJZHByaW50aygxLAorCQlLRVJOX0lORk8KKwkJIiVzOiB6cjM2MDU3X2luaXQoKSAtIGluaXRpYWxpemluZyBjYXJkWyVkXSwgenI9JXBcbiIsCisJCVpSX0RFVk5BTUUoenIpLCB6ci0+aWQsIHpyKTsKKworCS8qIGRlZmF1bHQgc2V0dXAgb2YgYWxsIHBhcmFtZXRlcnMgd2hpY2ggd2lsbCBwZXJzaXN0IGJldHdlZW4gb3BlbnMgKi8KKwl6ci0+dXNlciA9IDA7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ6ci0+djRsX2NhcHEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnpyLT5qcGdfY2FwcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmenItPnRlc3RfcSk7CisJenItPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisKKwl6ci0+YnVmZmVyLmJhc2UgPSAodm9pZCAqKSB2aWRtZW07CisJenItPmJ1ZmZlci53aWR0aCA9IDA7CisJenItPmJ1ZmZlci5oZWlnaHQgPSAwOworCXpyLT5idWZmZXIuZGVwdGggPSAwOworCXpyLT5idWZmZXIuYnl0ZXNwZXJsaW5lID0gMDsKKworCS8qIEF2b2lkIG5vbnNlbnNlIHNldHRpbmdzIGZyb20gdXNlciBmb3IgZGVmYXVsdCBpbnB1dC9ub3JtICovCisJaWYgKGRlZmF1bHRfbm9ybSA8IFZJREVPX01PREVfUEFMICYmCisJICAgIGRlZmF1bHRfbm9ybSA+IFZJREVPX01PREVfU0VDQU0pCisJCWRlZmF1bHRfbm9ybSA9IFZJREVPX01PREVfUEFMOworCXpyLT5ub3JtID0gZGVmYXVsdF9ub3JtOworCWlmICghKHpyLT50aW1pbmcgPSB6ci0+Y2FyZC50dm5benItPm5vcm1dKSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX1dBUk5JTkcKKwkJCSIlczogenIzNjA1N19pbml0KCkgLSBkZWZhdWx0IFRWIHN0YW5kYXJkIG5vdCBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUuIFBBTCB3aWxsIGJlIHVzZWQuXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQl6ci0+bm9ybSA9IFZJREVPX01PREVfUEFMOworCQl6ci0+dGltaW5nID0genItPmNhcmQudHZuW3pyLT5ub3JtXTsKKwl9CisKKwl6ci0+aW5wdXQgPSBkZWZhdWx0X2lucHV0ID0gKGRlZmF1bHRfaW5wdXQgPyAxIDogMCk7CisKKwkvKiBTaG91bGQgdGhlIGZvbGxvd2luZyBiZSByZXNldCBhdCBldmVyeSBvcGVuID8gKi8KKwl6ci0+aHVlID0gMzI3Njg7CisJenItPmNvbnRyYXN0ID0gMzI3Njg7CisJenItPnNhdHVyYXRpb24gPSAzMjc2ODsKKwl6ci0+YnJpZ2h0bmVzcyA9IDMyNzY4OworCisJLyogZGVmYXVsdCBzZXR1cCAod2lsbCBiZSByZXBlYXRlZCBhdCBldmVyeSBvcGVuKSAqLworCXpvcmFuX29wZW5faW5pdF9wYXJhbXMoenIpOworCisJLyogYWxsb2NhdGUgbWVtb3J5ICpiZWZvcmUqIGRvaW5nIGFueXRoaW5nIHRvIHRoZSBoYXJkd2FyZQorCSAqIGluIGNhc2UgYWxsb2NhdGlvbiBmYWlscyAqLworCW1lbV9uZWVkZWQgPSBCVVpfTlVNX1NUQVRfQ09NICogNDsKKwltZW0gPSAodW5zaWduZWQgbG9uZykga21hbGxvYyhtZW1fbmVlZGVkLCBHRlBfS0VSTkVMKTsKKwl2ZGV2ID0gKHZvaWQgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghbWVtIHx8ICF2ZGV2KSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHpyMzYwNTdfaW5pdCgpIC0ga21hbGxvYyAoU1RBVF9DT00pIGZhaWxlZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJaWYgKHZkZXYpCisJCQlrZnJlZSh2ZGV2KTsKKwkJaWYgKG1lbSkKKwkJCWtmcmVlKCh2b2lkICopbWVtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCgodm9pZCAqKSBtZW0sIDAsIG1lbV9uZWVkZWQpOworCXpyLT5zdGF0X2NvbSA9ICh1MzIgKikgbWVtOworCWZvciAoaiA9IDA7IGogPCBCVVpfTlVNX1NUQVRfQ09NOyBqKyspIHsKKwkJenItPnN0YXRfY29tW2pdID0gMTsJLyogbWFyayBhcyB1bmF2YWlsYWJsZSB0byB6cjM2MDU3ICovCisJfQorCisJLyoKKwkgKiAgIE5vdyBhZGQgdGhlIHRlbXBsYXRlIGFuZCByZWdpc3RlciB0aGUgZGV2aWNlIHVuaXQuCisJICovCisJenItPnZpZGVvX2RldiA9IHZkZXY7CisJbWVtY3B5KHpyLT52aWRlb19kZXYsICZ6b3Jhbl90ZW1wbGF0ZSwgc2l6ZW9mKHpvcmFuX3RlbXBsYXRlKSk7CisJc3RyY3B5KHpyLT52aWRlb19kZXYtPm5hbWUsIFpSX0RFVk5BTUUoenIpKTsKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHpyLT52aWRlb19kZXYsIFZGTF9UWVBFX0dSQUJCRVIsCisJCQkJICB2aWRlb19ucikgPCAwKSB7CisJCXpvcmFuX3VucmVnaXN0ZXJfaTJjKHpyKTsKKwkJa2ZyZWUoKHZvaWQgKikgenItPnN0YXRfY29tKTsKKwkJa2ZyZWUodmRldik7CisJCXJldHVybiAtMTsKKwl9CisKKwl6b3Jhbl9pbml0X2hhcmR3YXJlKHpyKTsKKwlpZiAoKnpyX2RlYnVnID4gMikKKwkJZGV0ZWN0X2d1ZXN0X2FjdGl2aXR5KHpyKTsKKwl0ZXN0X2ludGVycnVwdHMoenIpOworCWlmICghcGFzc190aHJvdWdoKSB7CisJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9FTkFCTEVfT1VUUFVULCAmemVybyk7CisJCWVuY29kZXJfY29tbWFuZCh6ciwgRU5DT0RFUl9TRVRfSU5QVVQsICZ0d28pOworCX0KKworCXpyLT56b3Jhbl9wcm9jID0gTlVMTDsKKwl6ci0+aW5pdGlhbGl6ZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorem9yYW5fcmVsZWFzZSAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlpZiAoIXpyLT5pbml0aWFsaXplZCkKKwkJcmV0dXJuOworCS8qIHVucmVnaXN0ZXIgdmlkZW9jb2RlYyBidXMgKi8KKwlpZiAoenItPmNvZGVjKSB7CisJCXN0cnVjdCB2aWRlb2NvZGVjX21hc3RlciAqbWFzdGVyID0genItPmNvZGVjLT5tYXN0ZXJfZGF0YTsKKwkJdmlkZW9jb2RlY19kZXRhY2goenItPmNvZGVjKTsKKwkJaWYgKG1hc3RlcikKKwkJCWtmcmVlKG1hc3Rlcik7CisJfQorCWlmICh6ci0+dmZlKSB7CisJCXN0cnVjdCB2aWRlb2NvZGVjX21hc3RlciAqbWFzdGVyID0genItPnZmZS0+bWFzdGVyX2RhdGE7CisJCXZpZGVvY29kZWNfZGV0YWNoKHpyLT52ZmUpOworCQlpZiAobWFzdGVyKQorCQkJa2ZyZWUobWFzdGVyKTsKKwl9CisKKwkvKiB1bnJlZ2lzdGVyIGkyYyBidXMgKi8KKwl6b3Jhbl91bnJlZ2lzdGVyX2kyYyh6cik7CisJLyogZGlzYWJsZSBQQ0kgYnVzLW1hc3RlcmluZyAqLworCXpvcmFuX3NldF9wY2lfbWFzdGVyKHpyLCAwKTsKKwkvKiBwdXQgY2hpcCBpbnRvIHJlc2V0ICovCisJYnR3cml0ZSgwLCBaUjM2MDU3X1NQR1BQQ1IpOworCWZyZWVfaXJxKHpyLT5wY2lfZGV2LT5pcnEsIHpyKTsKKwkvKiB1bm1hcCBhbmQgZnJlZSBtZW1vcnkgKi8KKwlrZnJlZSgodm9pZCAqKSB6ci0+c3RhdF9jb20pOworCXpvcmFuX3Byb2NfY2xlYW51cCh6cik7CisJaW91bm1hcCh6ci0+enIzNjA1N19tZW0pOworCXBjaV9kaXNhYmxlX2RldmljZSh6ci0+cGNpX2Rldik7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoenItPnZpZGVvX2Rldik7Cit9CisKK3ZvaWQKK3pvcmFuX3ZkZXZfcmVsZWFzZSAoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3sKKwlrZnJlZSh2ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb2NvZGVjX21hc3RlciAqIF9fZGV2aW5pdAorem9yYW5fc2V0dXBfdmlkZW9jb2RlYyAoc3RydWN0IHpvcmFuICp6ciwKKwkJCWludCAgICAgICAgICAgdHlwZSkKK3sKKwlzdHJ1Y3QgdmlkZW9jb2RlY19tYXN0ZXIgKm0gPSBOVUxMOworCisJbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWRlb2NvZGVjX21hc3RlciksIEdGUF9LRVJORUwpOworCWlmICghbSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB6b3Jhbl9zZXR1cF92aWRlb2NvZGVjKCkgLSBubyBtZW1vcnlcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiBtOworCX0KKworCW0tPm1hZ2ljID0gMEw7IC8qIG1hZ2ljIG5vdCB1c2VkICovCisJbS0+dHlwZSA9IFZJRF9IQVJEV0FSRV9aUjM2MDY3OworCW0tPmZsYWdzID0gQ09ERUNfRkxBR19FTkNPREVSIHwgQ09ERUNfRkxBR19ERUNPREVSOworCXN0cm5jcHkobS0+bmFtZSwgWlJfREVWTkFNRSh6ciksIHNpemVvZihtLT5uYW1lKSk7CisJbS0+ZGF0YSA9IHpyOworCisJc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIENPREVDX1RZUEVfWlIzNjA2MDoKKwkJbS0+cmVhZHJlZyA9IHpyMzYwNjBfcmVhZDsKKwkJbS0+d3JpdGVyZWcgPSB6cjM2MDYwX3dyaXRlOworCQltLT5mbGFncyB8PSBDT0RFQ19GTEFHX0pQRUcgfCBDT0RFQ19GTEFHX1ZGRTsKKwkJYnJlYWs7CisJY2FzZSBDT0RFQ19UWVBFX1pSMzYwNTA6CisJCW0tPnJlYWRyZWcgPSB6cjM2MDUwX3JlYWQ7CisJCW0tPndyaXRlcmVnID0genIzNjA1MF93cml0ZTsKKwkJbS0+ZmxhZ3MgfD0gQ09ERUNfRkxBR19KUEVHOworCQlicmVhazsKKwljYXNlIENPREVDX1RZUEVfWlIzNjAxNjoKKwkJbS0+cmVhZHJlZyA9IHpyMzYwMTZfcmVhZDsKKwkJbS0+d3JpdGVyZWcgPSB6cjM2MDE2X3dyaXRlOworCQltLT5mbGFncyB8PSBDT0RFQ19GTEFHX1ZGRTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG07Cit9CisKKy8qCisgKiAgIFNjYW4gZm9yIGEgQnV6IGNhcmQgKGFjdHVhbGx5IGZvciB0aGUgUENJIGNvbnRvbGVyIFpSMzYwNTcpLAorICogICByZXF1ZXN0IHRoZSBpcnEgYW5kIG1hcCB0aGUgaW8gbWVtb3J5CisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CitmaW5kX3pyMzYwNTcgKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBsYXRlbmN5LCBuZWVkX2xhdGVuY3k7CisJc3RydWN0IHpvcmFuICp6cjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCB2aWRlb2NvZGVjX21hc3RlciAqbWFzdGVyX3ZmZSA9IE5VTEw7CisJc3RydWN0IHZpZGVvY29kZWNfbWFzdGVyICptYXN0ZXJfY29kZWMgPSBOVUxMOworCWludCBjYXJkX251bTsKKwljaGFyICppMmNfZW5jX25hbWUsICppMmNfZGVjX25hbWUsICpjb2RlY19uYW1lLCAqdmZlX25hbWU7CisKKwl6b3Jhbl9udW0gPSAwOworCXdoaWxlICh6b3Jhbl9udW0gPCBCVVpfTUFYICYmCisJICAgICAgIChkZXYgPQorCQlwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9aT1JBTiwKKwkJCQlQQ0lfREVWSUNFX0lEX1pPUkFOXzM2MDU3LCBkZXYpKSAhPSBOVUxMKSB7CisJCWNhcmRfbnVtID0gY2FyZFt6b3Jhbl9udW1dOworCQl6ciA9ICZ6b3Jhblt6b3Jhbl9udW1dOworCQltZW1zZXQoenIsIDAsIHNpemVvZihzdHJ1Y3Qgem9yYW4pKTsJLy8gSnVzdCBpbiBjYXNlIGlmIHByZXZpb3VzIGN5Y2xlIGZhaWxlZAorCQl6ci0+cGNpX2RldiA9IGRldjsKKwkJLy96ci0+enIzNjA1N19tZW0gPSBOVUxMOworCQl6ci0+aWQgPSB6b3Jhbl9udW07CisJCXNucHJpbnRmKFpSX0RFVk5BTUUoenIpLCBzaXplb2YoWlJfREVWTkFNRSh6cikpLCAiTUpQRUdbJXVdIiwgenItPmlkKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnpyLT5zcGlubG9jayk7CisJCWluaXRfTVVURVgoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCisJCQljb250aW51ZTsKKwkJenItPnpyMzYwNTdfYWRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHpyLT5wY2lfZGV2LCAwKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoenItPnBjaV9kZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwKKwkJCQkgICAgICZ6ci0+cmV2aXNpb24pOworCQlpZiAoenItPnJldmlzaW9uIDwgMikgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fSU5GTworCQkJCSIlczogWm9yYW4gWlIzNjA1NyAocmV2ICVkKSBpcnE6ICVkLCBtZW1vcnk6IDB4JTA4eC5cbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIHpyLT5yZXZpc2lvbiwgenItPnBjaV9kZXYtPmlycSwKKwkJCQl6ci0+enIzNjA1N19hZHIpOworCisJCQlpZiAoY2FyZF9udW0gPT0gLTEpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBubyBjYXJkIHNwZWNpZmllZCwgcGxlYXNlIHVzZSB0aGUgY2FyZD1YIGluc21vZCBvcHRpb25cbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWludCBpOworCQkJdW5zaWduZWQgc2hvcnQgc3NfdmVuZG9yLCBzc19kZXZpY2U7CisKKwkJCXNzX3ZlbmRvciA9IHpyLT5wY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCQkJc3NfZGV2aWNlID0genItPnBjaV9kZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9JTkZPCisJCQkJIiVzOiBab3JhbiBaUjM2MDY3IChyZXYgJWQpIGlycTogJWQsIG1lbW9yeTogMHglMDh4XG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCB6ci0+cmV2aXNpb24sIHpyLT5wY2lfZGV2LT5pcnEsCisJCQkJenItPnpyMzYwNTdfYWRyKTsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0lORk8KKwkJCQkiJXM6IHN1YnN5c3RlbSB2ZW5kb3I9MHglMDR4IGlkPTB4JTA0eFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgc3NfdmVuZG9yLCBzc19kZXZpY2UpOworCQkJaWYgKGNhcmRfbnVtID09IC0xKSB7CisJCQkJZHByaW50aygzLAorCQkJCQlLRVJOX0RFQlVHCisJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSB0cnlpbmcgdG8gYXV0b2RldGVjdCBjYXJkIHR5cGVcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQlmb3IgKGk9MDtpPE5VTV9DQVJEUztpKyspIHsKKwkJCQkJaWYgKHNzX3ZlbmRvciA9PSB6b3Jhbl9jYXJkc1tpXS52ZW5kb3JfaWQgJiYKKwkJCQkJICAgIHNzX2RldmljZSA9PSB6b3Jhbl9jYXJkc1tpXS5kZXZpY2VfaWQpIHsKKwkJCQkJCWRwcmludGsoMywKKwkJCQkJCQlLRVJOX0RFQlVHCisJCQkJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIGNhcmQgJXMgZGV0ZWN0ZWRcbiIsCisJCQkJCQkJWlJfREVWTkFNRSh6ciksCisJCQkJCQkJem9yYW5fY2FyZHNbaV0ubmFtZSk7CisJCQkJCQljYXJkX251bSA9IGk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoaSA9PSBOVU1fQ0FSRFMpIHsKKwkJCQkJZHByaW50aygxLAorCQkJCQkJS0VSTl9FUlIKKwkJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSB1bmtub3duIGNhcmRcbiIsCisJCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChjYXJkX251bSA8IDAgfHwgY2FyZF9udW0gPj0gTlVNX0NBUkRTKSB7CisJCQlkcHJpbnRrKDIsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gaW52YWxpZCBjYXJkbnVtICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBjYXJkX251bSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGV2ZW4gdGhvdWdoIHdlIG1ha2UgdGhpcyBhIG5vbiBwb2ludGVyIGFuZCB0aHVzCisJCSAqIHRoZW9yZXRpY2FsbHkgYWxsb3cgZm9yIG1ha2luZyBjaGFuZ2VzIHRvIHRoaXMgc3RydWN0CisJCSAqIG9uIGEgcGVyLWluZGl2aWR1YWwgY2FyZCBiYXNpcyBhdCBydW50aW1lLCB0aGlzIGlzCisJCSAqIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLiBUaGlzIHN0cnVjdHVyZSBpcyBpbnRlbmRlZCB0bworCQkgKiBrZWVwIGdlbmVyYWwgY2FyZCBpbmZvcm1hdGlvbiwgbm8gc2V0dGluZ3Mgb3IgYW55dGhpbmcgKi8KKwkJenItPmNhcmQgPSB6b3Jhbl9jYXJkc1tjYXJkX251bV07CisJCXNucHJpbnRmKFpSX0RFVk5BTUUoenIpLCBzaXplb2YoWlJfREVWTkFNRSh6cikpLAorCQkJICIlc1sldV0iLCB6ci0+Y2FyZC5uYW1lLCB6ci0+aWQpOworCisJCXpyLT56cjM2MDU3X21lbSA9IGlvcmVtYXBfbm9jYWNoZSh6ci0+enIzNjA1N19hZHIsIDB4MTAwMCk7CisJCWlmICghenItPnpyMzYwNTdfbWVtKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gaW9yZW1hcCBmYWlsZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJY29udGludWU7CisJCX0KKworCQlyZXN1bHQgPSByZXF1ZXN0X2lycSh6ci0+cGNpX2Rldi0+aXJxLAorCQkJCSAgICAgem9yYW5faXJxLAorCQkJCSAgICAgU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQsCisJCQkJICAgICBaUl9ERVZOQU1FKHpyKSwKKwkJCQkgICAgICh2b2lkICopIHpyKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWlmIChyZXN1bHQgPT0gLUVJTlZBTCkgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIGJhZCBpcnEgbnVtYmVyIG9yIGhhbmRsZXJcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCX0gZWxzZSBpZiAocmVzdWx0ID09IC1FQlVTWSkgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIElSUSAlZCBidXN5LCBjaGFuZ2UgeW91ciBQblAgY29uZmlnIGluIEJJT1NcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCB6ci0+cGNpX2Rldi0+aXJxKTsKKwkJCX0gZWxzZSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gY2FuJ3QgYXNzaWduIGlycSwgZXJyb3IgY29kZSAlZFxuIiwKKwkJCQkJWlJfREVWTkFNRSh6ciksIHJlc3VsdCk7CisJCQl9CisJCQlnb3RvIHpyX3VubWFwOworCQl9CisKKwkJLyogc2V0IFBDSSBsYXRlbmN5IHRpbWVyICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHpyLT5wY2lfZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwKKwkJCQkgICAgICZsYXRlbmN5KTsKKwkJbmVlZF9sYXRlbmN5ID0genItPnJldmlzaW9uID4gMSA/IDMyIDogNDg7CisJCWlmIChsYXRlbmN5ICE9IG5lZWRfbGF0ZW5jeSkgeworCQkJZHByaW50aygyLAorCQkJCUtFUk5fSU5GTworCQkJCSIlczogQ2hhbmdpbmcgUENJIGxhdGVuY3kgZnJvbSAlZCB0byAlZC5cbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGxhdGVuY3ksIG5lZWRfbGF0ZW5jeSk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoenItPnBjaV9kZXYsCisJCQkJCSAgICAgIFBDSV9MQVRFTkNZX1RJTUVSLAorCQkJCQkgICAgICBuZWVkX2xhdGVuY3kpOworCQl9CisKKwkJenIzNjA1N19yZXN0YXJ0KHpyKTsKKwkJLyogaTJjICovCisJCWRwcmludGsoMiwgS0VSTl9JTkZPICIlczogSW5pdGlhbGl6aW5nIGkyYyBidXMuLi5cbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisKKwkJLyogaTJjIGRlY29kZXIgKi8KKwkJaWYgKGRlY29kZXJbenItPmlkXSAhPSAtMSkgeworCQkJaTJjX2RlY19uYW1lID0gaTJjaWRfdG9fbW9kdWxlbmFtZShkZWNvZGVyW3pyLT5pZF0pOworCQkJenItPmNhcmQuaTJjX2RlY29kZXIgPSBkZWNvZGVyW3pyLT5pZF07CisJCX0gZWxzZSBpZiAoenItPmNhcmQuaTJjX2RlY29kZXIgIT0gMCkgeworCQkJaTJjX2RlY19uYW1lID0KKwkJCQlpMmNpZF90b19tb2R1bGVuYW1lKHpyLT5jYXJkLmkyY19kZWNvZGVyKTsKKwkJfSBlbHNlIHsKKwkJCWkyY19kZWNfbmFtZSA9IE5VTEw7CisJCX0KKworCQlpZiAoaTJjX2RlY19uYW1lKSB7CisJCQlpZiAoKHJlc3VsdCA9IHJlcXVlc3RfbW9kdWxlKGkyY19kZWNfbmFtZSkpIDwgMCkgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBmYWlsZWQgdG8gbG9hZCBtb2R1bGUgJXM6ICVkXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgaTJjX2RlY19uYW1lLCByZXN1bHQpOworCQkJfQorCQl9CisKKwkJLyogaTJjIGVuY29kZXIgKi8KKwkJaWYgKGVuY29kZXJbenItPmlkXSAhPSAtMSkgeworCQkJaTJjX2VuY19uYW1lID0gaTJjaWRfdG9fbW9kdWxlbmFtZShlbmNvZGVyW3pyLT5pZF0pOworCQkJenItPmNhcmQuaTJjX2VuY29kZXIgPSBlbmNvZGVyW3pyLT5pZF07CisJCX0gZWxzZSBpZiAoenItPmNhcmQuaTJjX2VuY29kZXIgIT0gMCkgeworCQkJaTJjX2VuY19uYW1lID0KKwkJCQlpMmNpZF90b19tb2R1bGVuYW1lKHpyLT5jYXJkLmkyY19lbmNvZGVyKTsKKwkJfSBlbHNlIHsKKwkJCWkyY19lbmNfbmFtZSA9IE5VTEw7CisJCX0KKworCQlpZiAoaTJjX2VuY19uYW1lKSB7CisJCQlpZiAoKHJlc3VsdCA9IHJlcXVlc3RfbW9kdWxlKGkyY19lbmNfbmFtZSkpIDwgMCkgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBmYWlsZWQgdG8gbG9hZCBtb2R1bGUgJXM6ICVkXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgaTJjX2VuY19uYW1lLCByZXN1bHQpOworCQkJfQorCQl9CisKKwkJaWYgKHpvcmFuX3JlZ2lzdGVyX2kyYyh6cikgPCAwKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gY2FuJ3QgaW5pdGlhbGl6ZSBpMmMgYnVzXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCWdvdG8genJfZnJlZV9pcnE7CisJCX0KKworCQlkcHJpbnRrKDIsCisJCQlLRVJOX0lORk8gIiVzOiBJbml0aWFsaXppbmcgdmlkZW9jb2RlYyBidXMuLi5cbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisKKwkJaWYgKHpyLT5jYXJkLnZpZGVvX2NvZGVjICE9IDAgJiYKKwkJICAgIChjb2RlY19uYW1lID0KKwkJICAgICBjb2RlY2lkX3RvX21vZHVsZW5hbWUoenItPmNhcmQudmlkZW9fY29kZWMpKSAhPSBOVUxMKSB7CisJCQlpZiAoKHJlc3VsdCA9IHJlcXVlc3RfbW9kdWxlKGNvZGVjX25hbWUpKSA8IDApIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogZmFpbGVkIHRvIGxvYWQgbW9kdWxlcyAlczogJWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBjb2RlY19uYW1lLCByZXN1bHQpOworCQkJfQorCQl9CisJCWlmICh6ci0+Y2FyZC52aWRlb192ZmUgIT0gMCAmJgorCQkgICAgKHZmZV9uYW1lID0KKwkJICAgICBjb2RlY2lkX3RvX21vZHVsZW5hbWUoenItPmNhcmQudmlkZW9fdmZlKSkgIT0gTlVMTCkgeworCQkJaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSh2ZmVfbmFtZSkpIDwgMCkgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBmYWlsZWQgdG8gbG9hZCBtb2R1bGVzICVzOiAlZFxuIiwKKwkJCQkJWlJfREVWTkFNRSh6ciksIHZmZV9uYW1lLCByZXN1bHQpOworCQkJfQorCQl9CisKKwkJLyogcmVzZXQgSlBFRyBjb2RlYyAqLworCQlqcGVnX2NvZGVjX3NsZWVwKHpyLCAxKTsKKwkJanBlZ19jb2RlY19yZXNldCh6cik7CisJCS8qIHZpZGVvIGJ1cyBlbmFibGVkICovCisJCS8qIGRpc3BsYXkgY29kZWMgcmV2aXNpb24gKi8KKwkJaWYgKHpyLT5jYXJkLnZpZGVvX2NvZGVjICE9IDApIHsKKwkJCW1hc3Rlcl9jb2RlYyA9IHpvcmFuX3NldHVwX3ZpZGVvY29kZWMoenIsCisJCQkJCQkJICAgICAgenItPmNhcmQudmlkZW9fY29kZWMpOworCQkJaWYgKCFtYXN0ZXJfY29kZWMpCisJCQkJZ290byB6cl91bnJlZ19pMmM7CisJCQl6ci0+Y29kZWMgPSB2aWRlb2NvZGVjX2F0dGFjaChtYXN0ZXJfY29kZWMpOworCQkJaWYgKCF6ci0+Y29kZWMpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBubyBjb2RlYyBmb3VuZFxuIiwKKwkJCQkJWlJfREVWTkFNRSh6cikpOworCQkJCWdvdG8genJfZnJlZV9jb2RlYzsKKwkJCX0KKwkJCWlmICh6ci0+Y29kZWMtPnR5cGUgIT0genItPmNhcmQudmlkZW9fY29kZWMpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSB3cm9uZyBjb2RlY1xuIiwKKwkJCQkJWlJfREVWTkFNRSh6cikpOworCQkJCWdvdG8genJfZGV0YWNoX2NvZGVjOworCQkJfQorCQl9CisJCWlmICh6ci0+Y2FyZC52aWRlb192ZmUgIT0gMCkgeworCQkJbWFzdGVyX3ZmZSA9IHpvcmFuX3NldHVwX3ZpZGVvY29kZWMoenIsCisJCQkJCQkJICAgIHpyLT5jYXJkLnZpZGVvX3ZmZSk7CisJCQlpZiAoIW1hc3Rlcl92ZmUpCisJCQkJZ290byB6cl9kZXRhY2hfY29kZWM7CisJCQl6ci0+dmZlID0gdmlkZW9jb2RlY19hdHRhY2gobWFzdGVyX3ZmZSk7CisJCQlpZiAoIXpyLT52ZmUpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBubyBWRkUgZm91bmRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQlnb3RvIHpyX2ZyZWVfdmZlOworCQkJfQorCQkJaWYgKHpyLT52ZmUtPnR5cGUgIT0genItPmNhcmQudmlkZW9fdmZlKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IGZpbmRfenIzNjA1NygpID0gd3JvbmcgVkZFXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQkJZ290byB6cl9kZXRhY2hfdmZlOworCQkJfQorCQl9CisKKwkJem9yYW5fbnVtKys7CisJCWNvbnRpbnVlOworCisJCS8vIEluaXQgZXJyb3JzCisJICAgICAgenJfZGV0YWNoX3ZmZToKKwkJdmlkZW9jb2RlY19kZXRhY2goenItPnZmZSk7CisJICAgICAgenJfZnJlZV92ZmU6CisJCWtmcmVlKG1hc3Rlcl92ZmUpOworCSAgICAgIHpyX2RldGFjaF9jb2RlYzoKKwkJdmlkZW9jb2RlY19kZXRhY2goenItPmNvZGVjKTsKKwkgICAgICB6cl9mcmVlX2NvZGVjOgorCQlrZnJlZShtYXN0ZXJfY29kZWMpOworCSAgICAgIHpyX3VucmVnX2kyYzoKKwkJem9yYW5fdW5yZWdpc3Rlcl9pMmMoenIpOworCSAgICAgIHpyX2ZyZWVfaXJxOgorCQlidHdyaXRlKDAsIFpSMzYwNTdfU1BHUFBDUik7CisJCWZyZWVfaXJxKHpyLT5wY2lfZGV2LT5pcnEsIHpyKTsKKwkgICAgICB6cl91bm1hcDoKKwkJaW91bm1hcCh6ci0+enIzNjA1N19tZW0pOworCQljb250aW51ZTsKKwl9CisJaWYgKHpvcmFuX251bSA9PSAwKSB7CisJCWRwcmludGsoMSwgS0VSTl9JTkZPICJObyBrbm93biBNSlBFRyBjYXJkcyBmb3VuZC5cbiIpOworCX0KKwlyZXR1cm4gem9yYW5fbnVtOworfQorCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9kYzEwX2NhcmRzICh2b2lkKQoreworCWludCBpOworCisJbWVtc2V0KHpvcmFuLCAwLCBzaXplb2Yoem9yYW4pKTsKKwlwcmludGsoS0VSTl9JTkZPICJab3JhbiBNSlBFRyBib2FyZCBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZFxuIiwKKwkgICAgICAgTUFKT1JfVkVSU0lPTiwgTUlOT1JfVkVSU0lPTiwgUkVMRUFTRV9WRVJTSU9OKTsKKworCS8qIExvb2sgZm9yIGNhcmRzICovCisJaWYgKGZpbmRfenIzNjA1NygpIDwgMCkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHpvcmFuX251bSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6ICVkIGNhcmQocykgZm91bmRcbiIsIFpPUkFOX05BTUUsCisJCXpvcmFuX251bSk7CisJLyogY2hlY2sgdGhlIHBhcmFtZXRlcnMgd2UgaGF2ZSBiZWVuIGdpdmVuLCBhZGp1c3QgaWYgbmVjZXNzYXJ5ICovCisJaWYgKHY0bF9uYnVmcyA8IDIpCisJCXY0bF9uYnVmcyA9IDI7CisJaWYgKHY0bF9uYnVmcyA+IFZJREVPX01BWF9GUkFNRSkKKwkJdjRsX25idWZzID0gVklERU9fTUFYX0ZSQU1FOworCS8qIFRoZSB1c2VyIHNwZWNmaWVzIHRoZSBpbiBLQiwgd2Ugd2FudCB0aGVtIGluIGJ5dGUKKwkgKiAoYW5kIHBhZ2UgYWxpZ25lZCkgKi8KKwl2NGxfYnVmc2l6ZSA9IFBBR0VfQUxJR04odjRsX2J1ZnNpemUgKiAxMDI0KTsKKwlpZiAodjRsX2J1ZnNpemUgPCAzMjc2OCkKKwkJdjRsX2J1ZnNpemUgPSAzMjc2ODsKKwkvKiAyIE1CIGlzIGFyYml0cmFyeSBidXQgc3VmZmljaWVudCBmb3IgdGhlIG1heGltdW0gcG9zc2libGUgaW1hZ2VzICovCisJaWYgKHY0bF9idWZzaXplID4gMjA0OCAqIDEwMjQpCisJCXY0bF9idWZzaXplID0gMjA0OCAqIDEwMjQ7CisJaWYgKGpwZ19uYnVmcyA8IDQpCisJCWpwZ19uYnVmcyA9IDQ7CisJaWYgKGpwZ19uYnVmcyA+IEJVWl9NQVhfRlJBTUUpCisJCWpwZ19uYnVmcyA9IEJVWl9NQVhfRlJBTUU7CisJanBnX2J1ZnNpemUgPSBQQUdFX0FMSUdOKGpwZ19idWZzaXplICogMTAyNCk7CisJaWYgKGpwZ19idWZzaXplIDwgODE5MikKKwkJanBnX2J1ZnNpemUgPSA4MTkyOworCWlmIChqcGdfYnVmc2l6ZSA+ICg1MTIgKiAxMDI0KSkKKwkJanBnX2J1ZnNpemUgPSA1MTIgKiAxMDI0OworCS8qIFVzZSBwYXJhbWV0ZXIgZm9yIHZpZG1lbSBvciB0cnkgdG8gZmluZCBhIHZpZGVvIGNhcmQgKi8KKwlpZiAodmlkbWVtKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fSU5GTworCQkJIiVzOiBVc2luZyBzdXBwbGllZCB2aWRlbyBtZW1vcnkgYmFzZSBhZGRyZXNzIEAgMHglbHhcbiIsCisJCQlaT1JBTl9OQU1FLCB2aWRtZW0pOworCX0KKworCS8qIHJhbmRvbSBub25zZW5zZSAqLworCWRwcmludGsoNSwgS0VSTl9ERUJVRyAiSm90dGkgaXMgZWVuIGhlbGQhXG4iKTsKKworCS8qIHNvbWUgbWFpbmJvYXJkcyBtaWdodCBub3QgZG8gUENJLVBDSSBkYXRhIHRyYW5zZmVyIHdlbGwgKi8KKwlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9GQUlMKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fV0FSTklORworCQkJIiVzOiBjaGlwc2V0IG1heSBub3Qgc3VwcG9ydCByZWxpYWJsZSBQQ0ktUENJIERNQVxuIiwKKwkJCVpPUkFOX05BTUUpOworCX0KKworCS8qIHRha2UgY2FyZSBvZiBOYXRvbWEgY2hpcHNldCBhbmQgYSByZXZpc2lvbiAxIHpyMzYwNTcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgem9yYW5fbnVtOyBpKyspIHsKKwkJc3RydWN0IHpvcmFuICp6ciA9ICZ6b3JhbltpXTsKKworCQlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9OQVRPTUEgJiYgenItPnJldmlzaW9uIDw9IDEpIHsKKwkJCXpyLT5qcGdfYnVmZmVycy5uZWVkX2NvbnRpZ3VvdXMgPSAxOworCQkJZHByaW50aygxLAorCQkJCUtFUk5fSU5GTworCQkJCSIlczogWlIzNjA1Ny9OYXRvbWEgYnVnLCBtYXguIGJ1ZmZlciBzaXplIGlzIDEyOEtcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQl9CisKKwkJaWYgKHpyMzYwNTdfaW5pdCh6cikgPCAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgem9yYW5fbnVtOyBpKyspCisJCQkJem9yYW5fcmVsZWFzZSgmem9yYW5baV0pOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJem9yYW5fcHJvY19pbml0KHpyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0Cit1bmxvYWRfZGMxMF9jYXJkcyAodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB6b3Jhbl9udW07IGkrKykKKwkJem9yYW5fcmVsZWFzZSgmem9yYW5baV0pOworfQorCittb2R1bGVfaW5pdChpbml0X2RjMTBfY2FyZHMpOworbW9kdWxlX2V4aXQodW5sb2FkX2RjMTBfY2FyZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2NhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI2YWNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIFpvcmFuIHpyMzYwNTcvenIzNjA2NyBQQ0kgY29udHJvbGxlciBkcml2ZXIsIGZvciB0aGUKKyAqIFBpbm5hY2xlL01pcm8gREMxMC9EQzEwKy9EQzMwL0RDMzArLCBJb21lZ2EgQnV6LCBMaW51eAorICogTWVkaWEgTGFicyBMTUwzMy9MTUwzM1IxMC4KKyAqCisgKiBUaGlzIHBhcnQgaGFuZGxlcyBjYXJkLXNwZWNpZmljIGRhdGEgYW5kIGRldGVjdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgU2VyZ3VlaSBNaXJpZG9ub3YgPG1pcnNldkBjaWNlc2UubXg+CisgKgorICogQ3VycmVudGx5IG1haW50YWluZWQgYnk6CisgKiAgIFJvbmFsZCBCdWx0amUgICAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBza3luZXQuYmU+CisgKiAgIE1haWxpbmdsaXN0ICAgICAgPG1qcGVnLXVzZXJzQGxpc3RzLnNmLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fWk9SQU5fQ0FSRF9IX18KKyNkZWZpbmUgX19aT1JBTl9DQVJEX0hfXworCisvKiBBbnlib2R5IHdobyB1c2VzIG1vcmUgdGhhbiBmb3VyPyAqLworI2RlZmluZSBCVVpfTUFYIDQKK2V4dGVybiBpbnQgem9yYW5fbnVtOworZXh0ZXJuIHN0cnVjdCB6b3JhbiB6b3JhbltCVVpfTUFYXTsKKworZXh0ZXJuIHN0cnVjdCB2aWRlb19kZXZpY2Ugem9yYW5fdGVtcGxhdGU7CisKK2V4dGVybiBpbnQgem9yYW5fY2hlY2tfanBnX3NldHRpbmdzKHN0cnVjdCB6b3JhbiAqenIsCisJCQkJICAgIHN0cnVjdCB6b3Jhbl9qcGdfc2V0dGluZ3MgKnNldHRpbmdzKTsKK2V4dGVybiB2b2lkIHpvcmFuX29wZW5faW5pdF9wYXJhbXMoc3RydWN0IHpvcmFuICp6cik7CitleHRlcm4gdm9pZCB6b3Jhbl92ZGV2X3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldik7CisKKyNlbmRpZgkJCQkvKiBfX1pPUkFOX0NBUkRfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RldmljZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTE1YWZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kZXZpY2UuYwpAQCAtMCwwICsxLDE3ODUgQEAKKy8qCisgKiBab3JhbiB6cjM2MDU3L3pyMzYwNjcgUENJIGNvbnRyb2xsZXIgZHJpdmVyLCBmb3IgdGhlCisgKiBQaW5uYWNsZS9NaXJvIERDMTAvREMxMCsvREMzMC9EQzMwKywgSW9tZWdhIEJ1eiwgTGludXgKKyAqIE1lZGlhIExhYnMgTE1MMzMvTE1MMzNSMTAuCisgKgorICogVGhpcyBwYXJ0IGhhbmRsZXMgZGV2aWNlIGFjY2VzcyAoUENJL0kyQy9jb2RlYy8uLi4pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKyAqCisgKiBDdXJyZW50bHkgbWFpbnRhaW5lZCBieToKKyAqICAgUm9uYWxkIEJ1bHRqZSAgICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZT4KKyAqICAgTWFpbGluZ2xpc3QgICAgICA8bWpwZWctdXNlcnNAbGlzdHMuc2YubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19lbmNvZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInZpZGVvY29kZWMuaCIKKyNpbmNsdWRlICJ6b3Jhbi5oIgorI2luY2x1ZGUgInpvcmFuX2RldmljZS5oIgorCisjZGVmaW5lIElSUV9NQVNLICggWlIzNjA1N19JU1JfR0lSUTAgfCBcCisJCSAgIFpSMzYwNTdfSVNSX0dJUlExIHwgXAorCQkgICBaUjM2MDU3X0lTUl9KUEVHUmVwSVJRICkKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB6b3Jhbl9mb3JtYXQgem9yYW5fZm9ybWF0c1tdOworCitleHRlcm4gaW50ICp6cl9kZWJ1ZzsKKworI2RlZmluZSBkcHJpbnRrKG51bSwgZm9ybWF0LCBhcmdzLi4uKSBcCisJZG8geyBcCisJCWlmICgqenJfZGVidWcgPj0gbnVtKSBcCisJCQlwcmludGsoZm9ybWF0LCAjI2FyZ3MpOyBcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBsbWwzM2RwYXRoID0gMDsJLyogMSB3aWxsIHVzZSBkaWdpdGFsIHBhdGggaW4gY2FwdHVyZQorCQkJCSAqIG1vZGUgaW5zdGVhZCBvZiBhbmFsb2cuIEl0IGNhbiBiZQorCQkJCSAqIHVzZWQgZm9yIHBpY3R1cmUgYWRqdXN0bWVudHMgdXNpbmcKKwkJCQkgKiB0b29sIGxpa2UgeGF3dHYgd2hpbGUgd2F0Y2hpbmcgaW1hZ2UKKwkJCQkgKiBvbiBUViBtb25pdG9yIGNvbm5lY3RlZCB0byB0aGUgb3V0cHV0LgorCQkJCSAqIEhvd2V2ZXIsIGR1ZSB0byBhYnNlbmNlIG9mIDc1IE9obQorCQkJCSAqIGxvYWQgb24gQnQ4MTkgaW5wdXQsIHRoZXJlIHdpbGwgYmUKKwkJCQkgKiBzb21lIGltYWdlIGltcGVyZmVjdGlvbnMgKi8KKworbW9kdWxlX3BhcmFtKGxtbDMzZHBhdGgsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhsbWwzM2RwYXRoLAorCQkgIlVzZSBkaWdpdGFsIHBhdGggY2FwdHVyZSBtb2RlIChvbiBMTUwzMyBjYXJkcykiKTsKKworc3RhdGljIHZvaWQKK3pyMzYwNTdfaW5pdF92ZmUgKHN0cnVjdCB6b3JhbiAqenIpOworCisvKgorICogR2VuZXJhbCBQdXJwb3NlIEkvTyBhbmQgR3Vlc3QgYnVzIGFjY2VzcworICovCisKKy8qCisgKiBUaGlzIGlzIGEgYml0IHRyaWNreS4gV2hlbiBhIGJvYXJkIGxhY2tzIGEgR1BJTyBmdW5jdGlvbiwgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIEdQSU8gYml0IG51bWJlciBpbiB0aGUgY2FyZF9pbmZvIHN0cnVjdHVyZSBpcyBzZXQgdG8gMC4KKyAqLworCit2b2lkCitHUElPIChzdHJ1Y3Qgem9yYW4gKnpyLAorICAgICAgaW50ICAgICAgICAgICBiaXQsCisgICAgICB1bnNpZ25lZCBpbnQgIHZhbHVlKQoreworCXUzMiByZWc7CisJdTMyIG1hc2s7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGJpdCBudW1iZXIgaXMgbGVnYWwKKwkgKiBBIGJpdCBudW1iZXIgb2YgLTEgKGxhY2tpbmcpIGdpdmVzIGEgbWFzayBvZiAwLAorCSAqIG1ha2luZyBpdCBoYXJtbGVzcyAqLworCW1hc2sgPSAoMSA8PCAoMjQgKyBiaXQpKSAmIDB4ZmYwMDAwMDA7CisJcmVnID0gYnRyZWFkKFpSMzYwNTdfR1BQR0NSMSkgJiB+bWFzazsKKwlpZiAodmFsdWUpIHsKKwkJcmVnIHw9IG1hc2s7CisJfQorCWJ0d3JpdGUocmVnLCBaUjM2MDU3X0dQUEdDUjEpOworCXVkZWxheSgxKTsKK30KKworLyoKKyAqIFdhaXQgdGlsIHBvc3Qgb2ZmaWNlIGlzIG5vIGxvbmdlciBidXN5CisgKi8KKworaW50Citwb3N0X29mZmljZV93YWl0IChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCXUzMiBwb3I7CisKKy8vICAgICAgd2hpbGUgKCgocG9yID0gYnRyZWFkKFpSMzYwNTdfUE9SKSkgJiAoWlIzNjA1N19QT1JfUE9QZW4gfCBaUjM2MDU3X1BPUl9QT1RpbWUpKSA9PSBaUjM2MDU3X1BPUl9QT1BlbikgeworCXdoaWxlICgocG9yID0gYnRyZWFkKFpSMzYwNTdfUE9SKSkgJiBaUjM2MDU3X1BPUl9QT1BlbikgeworCQkvKiB3YWl0IGZvciBzb21ldGhpbmcgdG8gaGFwcGVuICovCisJfQorCWlmICgocG9yICYgWlIzNjA1N19QT1JfUE9UaW1lKSAmJiAhenItPmNhcmQuZ3dzX25vdF9jb25uZWN0ZWQpIHsKKwkJLyogSW4gTE1MMzMvQlVaIFxHV1MgbGluZSBpcyBub3QgY29ubmVjdGVkLCBzbyBpdCBoYXMgYWx3YXlzIHRpbWVvdXQgc2V0ICovCisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogcG9wIHRpbWVvdXQgJTA4eFxuIiwgWlJfREVWTkFNRSh6ciksCisJCQlwb3IpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAorcG9zdF9vZmZpY2Vfd3JpdGUgKHN0cnVjdCB6b3JhbiAqenIsCisJCSAgIHVuc2lnbmVkIGludCAgZ3Vlc3QsCisJCSAgIHVuc2lnbmVkIGludCAgcmVnLAorCQkgICB1bnNpZ25lZCBpbnQgIHZhbHVlKQoreworCXUzMiBwb3I7CisKKwlwb3IgPQorCSAgICBaUjM2MDU3X1BPUl9QT0RpciB8IFpSMzYwNTdfUE9SX1BPVGltZSB8ICgoZ3Vlc3QgJiA3KSA8PCAyMCkgfAorCSAgICAoKHJlZyAmIDcpIDw8IDE2KSB8ICh2YWx1ZSAmIDB4RkYpOworCWJ0d3JpdGUocG9yLCBaUjM2MDU3X1BPUik7CisKKwlyZXR1cm4gcG9zdF9vZmZpY2Vfd2FpdCh6cik7Cit9CisKK2ludAorcG9zdF9vZmZpY2VfcmVhZCAoc3RydWN0IHpvcmFuICp6ciwKKwkJICB1bnNpZ25lZCBpbnQgIGd1ZXN0LAorCQkgIHVuc2lnbmVkIGludCAgcmVnKQoreworCXUzMiBwb3I7CisKKwlwb3IgPSBaUjM2MDU3X1BPUl9QT1RpbWUgfCAoKGd1ZXN0ICYgNykgPDwgMjApIHwgKChyZWcgJiA3KSA8PCAxNik7CisJYnR3cml0ZShwb3IsIFpSMzYwNTdfUE9SKTsKKwlpZiAocG9zdF9vZmZpY2Vfd2FpdCh6cikgPCAwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gYnRyZWFkKFpSMzYwNTdfUE9SKSAmIDB4RkY7Cit9CisKKy8qCisgKiBkZXRlY3QgZ3Vlc3RzCisgKi8KKworc3RhdGljIHZvaWQKK2R1bXBfZ3Vlc3RzIChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCWlmICgqenJfZGVidWcgPiAyKSB7CisJCWludCBpLCBndWVzdFs4XTsKKworCQlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7CS8vIERvbid0IHJlYWQganBlZyBjb2RlYyBoZXJlCisJCQlndWVzdFtpXSA9IHBvc3Rfb2ZmaWNlX3JlYWQoenIsIGksIDApOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEd1ZXN0czoiLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworCQkJcHJpbnRrKCIgMHglMDJ4IiwgZ3Vlc3RbaV0pOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworZ2V0X3RpbWUgKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwlyZXR1cm4gKDEwMDAwMDAgKiB0di50dl9zZWMgKyB0di50dl91c2VjKTsKK30KKwordm9pZAorZGV0ZWN0X2d1ZXN0X2FjdGl2aXR5IChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCWludCB0aW1lb3V0LCBpLCBqLCByZXMsIGd1ZXN0WzhdLCBndWVzdDBbOF0sIGNoYW5nZVs4XVszXTsKKwl1bnNpZ25lZCBsb25nIHQwLCB0MTsKKworCWR1bXBfZ3Vlc3RzKHpyKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogRGV0ZWN0aW5nIGd1ZXN0cyBhY3Rpdml0eSwgcGxlYXNlIHdhaXQuLi5cbiIsCisJICAgICAgIFpSX0RFVk5BTUUoenIpKTsKKwlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7CS8vIERvbid0IHJlYWQganBlZyBjb2RlYyBoZXJlCisJCWd1ZXN0MFtpXSA9IGd1ZXN0W2ldID0gcG9zdF9vZmZpY2VfcmVhZCh6ciwgaSwgMCk7CisJfQorCisJdGltZW91dCA9IDA7CisJaiA9IDA7CisJdDAgPSBnZXRfdGltZSgpOworCXdoaWxlICh0aW1lb3V0IDwgMTAwMDApIHsKKwkJdWRlbGF5KDEwKTsKKwkJdGltZW91dCsrOworCQlmb3IgKGkgPSAxOyAoaSA8IDgpICYmIChqIDwgOCk7IGkrKykgeworCQkJcmVzID0gcG9zdF9vZmZpY2VfcmVhZCh6ciwgaSwgMCk7CisJCQlpZiAocmVzICE9IGd1ZXN0W2ldKSB7CisJCQkJdDEgPSBnZXRfdGltZSgpOworCQkJCWNoYW5nZVtqXVswXSA9ICh0MSAtIHQwKTsKKwkJCQl0MCA9IHQxOworCQkJCWNoYW5nZVtqXVsxXSA9IGk7CisJCQkJY2hhbmdlW2pdWzJdID0gcmVzOworCQkJCWorKzsKKwkJCQlndWVzdFtpXSA9IHJlczsKKwkJCX0KKwkJfQorCQlpZiAoaiA+PSA4KQorCQkJYnJlYWs7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBHdWVzdHM6IiwgWlJfREVWTkFNRSh6cikpOworCisJZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworCQlwcmludGsoIiAweCUwMngiLCBndWVzdDBbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisJaWYgKGogPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gYWN0aXZpdHkgZGV0ZWN0ZWQuXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogJTZkOiAlZCA9PiAweCUwMnhcbiIsIFpSX0RFVk5BTUUoenIpLAorCQkgICAgICAgY2hhbmdlW2ldWzBdLCBjaGFuZ2VbaV1bMV0sIGNoYW5nZVtpXVsyXSk7CisJfQorfQorCisvKgorICogSlBFRyBDb2RlYyBhY2Nlc3MKKyAqLworCit2b2lkCitqcGVnX2NvZGVjX3NsZWVwIChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkgIGludCAgICAgICAgICAgc2xlZXApCit7CisJR1BJTyh6ciwgenItPmNhcmQuZ3Bpb1tHUElPX0pQRUdfU0xFRVBdLCAhc2xlZXApOworCWlmICghc2xlZXApIHsKKwkJZHByaW50aygzLAorCQkJS0VSTl9ERUJVRworCQkJIiVzOiBqcGVnX2NvZGVjX3NsZWVwKCkgLSB3YWtlIEdQSU89MHglMDh4XG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGJ0cmVhZChaUjM2MDU3X0dQUEdDUjEpKTsKKwkJdWRlbGF5KDUwMCk7CisJfSBlbHNlIHsKKwkJZHByaW50aygzLAorCQkJS0VSTl9ERUJVRworCQkJIiVzOiBqcGVnX2NvZGVjX3NsZWVwKCkgLSBzbGVlcCBHUElPPTB4JTA4eFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBidHJlYWQoWlIzNjA1N19HUFBHQ1IxKSk7CisJCXVkZWxheSgyKTsKKwl9Cit9CisKK2ludAoranBlZ19jb2RlY19yZXNldCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwkvKiBUYWtlIHRoZSBjb2RlYyBvdXQgb2Ygc2xlZXAgKi8KKwlqcGVnX2NvZGVjX3NsZWVwKHpyLCAwKTsKKworCWlmICh6ci0+Y2FyZC5ncGNzW0dQQ1NfSlBFR19SRVNFVF0gIT0gMHhmZikgeworCQlwb3N0X29mZmljZV93cml0ZSh6ciwgenItPmNhcmQuZ3Bjc1tHUENTX0pQRUdfUkVTRVRdLCAwLAorCQkJCSAgMCk7CisJCXVkZWxheSgyKTsKKwl9IGVsc2UgeworCQlHUElPKHpyLCB6ci0+Y2FyZC5ncGlvW0dQSU9fSlBFR19SRVNFVF0sIDApOworCQl1ZGVsYXkoMik7CisJCUdQSU8oenIsIHpyLT5jYXJkLmdwaW9bR1BJT19KUEVHX1JFU0VUXSwgMSk7CisJCXVkZWxheSgyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICAgU2V0IHRoZSByZWdpc3RlcnMgZm9yIHRoZSBzaXplIHdlIGhhdmUgc3BlY2lmaWVkLiBEb24ndCBib3RoZXIKKyAqICAgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhpcyB3aXRob3V0IHRoZSBaUjM2MDU3IG1hbnVhbCBpbiBmcm9udCBvZgorICogICB5b3UgW0FDXS4KKyAqCisgKiAgIFBTOiBUaGUgbWFudWFsIGlzIGZyZWUgZm9yIGRvd25sb2FkIGluIC5wZGYgZm9ybWF0IGZyb20KKyAqICAgd3d3LnpvcmFuLmNvbSAtIG5pY2VseSBkb25lIHRob3NlIGZvbGtzLgorICovCisKK3N0YXRpYyB2b2lkCit6cjM2MDU3X2FkanVzdF92ZmUgKHN0cnVjdCB6b3JhbiAgICAgICAgICAqenIsCisJCSAgICBlbnVtIHpvcmFuX2NvZGVjX21vZGUgIG1vZGUpCit7CisJdTMyIHJlZzsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1M6CisJCWJ0YW5kKH5aUjM2MDU3X1ZGRVNQRlJfRXh0RmwsIFpSMzYwNTdfVkZFU1BGUik7CisJCXJlZyA9IGJ0cmVhZChaUjM2MDU3X1ZGRUhDUik7CisJCWlmICgocmVnICYgKDEgPDwgMTApKSAmJiB6ci0+Y2FyZC50eXBlICE9IExNTDMzUjEwKSB7CisJCQlyZWcgKz0gKCgxIDw8IDEwKSB8IDEpOworCQl9CisJCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZGRUhDUik7CisJCWJyZWFrOworCWNhc2UgQlVaX01PREVfTU9USU9OX0NPTVBSRVNTOgorCWNhc2UgQlVaX01PREVfSURMRToKKwlkZWZhdWx0OgorCQlpZiAoenItPm5vcm0gPT0gVklERU9fTU9ERV9OVFNDIHx8CisJCSAgICAoenItPmNhcmQudHlwZSA9PSBMTUwzM1IxMCAmJgorCQkgICAgIHpyLT5ub3JtID09IFZJREVPX01PREVfUEFMKSkKKwkJCWJ0YW5kKH5aUjM2MDU3X1ZGRVNQRlJfRXh0RmwsIFpSMzYwNTdfVkZFU1BGUik7CisJCWVsc2UKKwkJCWJ0b3IoWlIzNjA1N19WRkVTUEZSX0V4dEZsLCBaUjM2MDU3X1ZGRVNQRlIpOworCQlyZWcgPSBidHJlYWQoWlIzNjA1N19WRkVIQ1IpOworCQlpZiAoIShyZWcgJiAoMSA8PCAxMCkpICYmIHpyLT5jYXJkLnR5cGUgIT0gTE1MMzNSMTApIHsKKwkJCXJlZyAtPSAoKDEgPDwgMTApIHwgMSk7CisJCX0KKwkJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkZFSENSKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogc2V0IGdlb21ldHJ5CisgKi8KKworc3RhdGljIHZvaWQKK3pyMzYwNTdfc2V0X3ZmZSAoc3RydWN0IHpvcmFuICAgICAgICAgICAgICAqenIsCisJCSBpbnQgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb193aWR0aCwKKwkJIGludCAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2hlaWdodCwKKwkJIGNvbnN0IHN0cnVjdCB6b3Jhbl9mb3JtYXQgKmZvcm1hdCkKK3sKKwlzdHJ1Y3QgdHZub3JtICp0dm47CisJdW5zaWduZWQgSFN0YXJ0LCBIRW5kLCBWU3RhcnQsIFZFbmQ7CisJdW5zaWduZWQgRGlzcE1vZGU7CisJdW5zaWduZWQgVmlkV2luV2lkLCBWaWRXaW5IdDsKKwl1bnNpZ25lZCBoY3JvcDEsIGhjcm9wMiwgdmNyb3AxLCB2Y3JvcDI7CisJdW5zaWduZWQgV2EsIFdlLCBIYSwgSGU7CisJdW5zaWduZWQgWCwgWSwgSG9yRGNtLCBWZXJEY207CisJdTMyIHJlZzsKKwl1bnNpZ25lZCBtYXNrX2xpbmVfc2l6ZTsKKworCXR2biA9IHpyLT50aW1pbmc7CisKKwlXYSA9IHR2bi0+V2E7CisJSGEgPSB0dm4tPkhhOworCisJZHByaW50aygyLCBLRVJOX0lORk8gIiVzOiBzZXRfdmZlKCkgLSB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwKKwkJWlJfREVWTkFNRSh6ciksIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQpOworCisJaWYgKHpyLT5ub3JtICE9IFZJREVPX01PREVfUEFMICYmCisJICAgIHpyLT5ub3JtICE9IFZJREVPX01PREVfTlRTQyAmJgorCSAgICB6ci0+bm9ybSAhPSBWSURFT19NT0RFX1NFQ0FNKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSICIlczogc2V0X3ZmZSgpIC0gbm9ybSA9ICVkIG5vdCB2YWxpZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCB6ci0+bm9ybSk7CisJCXJldHVybjsKKwl9CisJaWYgKHZpZGVvX3dpZHRoIDwgQlVaX01JTl9XSURUSCB8fAorCSAgICB2aWRlb19oZWlnaHQgPCBCVVpfTUlOX0hFSUdIVCB8fAorCSAgICB2aWRlb193aWR0aCA+IFdhIHx8IHZpZGVvX2hlaWdodCA+IEhhKSB7CisJCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzOiBzZXRfdmZlOiB3PSVkIGg9JWQgbm90IHZhbGlkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQpOworCQlyZXR1cm47CisJfQorCisJLyoqKiogenIzNjA1NyAqKioqLworCisJLyogaG9yaXpvbnRhbCAqLworCVZpZFdpbldpZCA9IHZpZGVvX3dpZHRoOworCVggPSAoVmlkV2luV2lkICogNjQgKyB0dm4tPldhIC0gMSkgLyB0dm4tPldhOworCVdlID0gKFZpZFdpbldpZCAqIDY0KSAvIFg7CisJSG9yRGNtID0gNjQgLSBYOworCWhjcm9wMSA9IDIgKiAoKHR2bi0+V2EgLSBXZSkgLyA0KTsKKwloY3JvcDIgPSB0dm4tPldhIC0gV2UgLSBoY3JvcDE7CisJSFN0YXJ0ID0gdHZuLT5IU3RhcnQgPyB0dm4tPkhTdGFydCA6IDE7CisJLyogKFJvbmFsZCkgT3JpZ2luYWwgY29tbWVudDoKKwkgKiAifCAxIERvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0LCB0ZXN0ZWQgb24gYm90aCBhIERDMTAgYW5kIGEgREMxMCsiCisJICogdGhpcyBpcyBmYWxzZS4gSXQgaW52ZXJzZXMgY2hyb21hIHZhbHVlcyBvbiB0aGUgTE1MMzNSMTAgKHNvIENyCisJICogc3VkZGVubHkgaXMgc2hvd24gYXMgQ2IgYW5kIHJldmVyc2UsIHJlYWxseSBjb29sIGVmZmVjdCBpZiB5b3UKKwkgKiB3YW50IHRvIHNlZSBibHVlIGZhY2VzLCBub3QgdXNlZnVsIG90aGVyd2lzZSkuIFNvIGRvbid0IHVzZSB8MS4KKwkgKiBIb3dldmVyLCB0aGUgREMxMCBoYXMgJzAnIGFzIEhTdGFydCwgYnV0IGRvZXMgbmVlZCB8MSwgc28gd2UKKwkgKiB1c2UgYSBkaXJ0eSBjaGVjay4uLgorCSAqLworCUhFbmQgPSBIU3RhcnQgKyB0dm4tPldhIC0gMTsKKwlIU3RhcnQgKz0gaGNyb3AxOworCUhFbmQgLT0gaGNyb3AyOworCXJlZyA9ICgoSFN0YXJ0ICYgWlIzNjA1N19WRkVIQ1JfSG1hc2spIDw8IFpSMzYwNTdfVkZFSENSX0hTdGFydCkKKwkgICAgfCAoKEhFbmQgJiBaUjM2MDU3X1ZGRUhDUl9IbWFzaykgPDwgWlIzNjA1N19WRkVIQ1JfSEVuZCk7CisJaWYgKHpyLT5jYXJkLnZmZV9wb2wuaHN5bmNfcG9sKQorCQlyZWcgfD0gWlIzNjA1N19WRkVIQ1JfSFNQb2w7CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkZFSENSKTsKKworCS8qIFZlcnRpY2FsICovCisJRGlzcE1vZGUgPSAhKHZpZGVvX2hlaWdodCA+IEJVWl9NQVhfSEVJR0hUIC8gMik7CisJVmlkV2luSHQgPSBEaXNwTW9kZSA/IHZpZGVvX2hlaWdodCA6IHZpZGVvX2hlaWdodCAvIDI7CisJWSA9IChWaWRXaW5IdCAqIDY0ICogMiArIHR2bi0+SGEgLSAxKSAvIHR2bi0+SGE7CisJSGUgPSAoVmlkV2luSHQgKiA2NCkgLyBZOworCVZlckRjbSA9IDY0IC0gWTsKKwl2Y3JvcDEgPSAodHZuLT5IYSAvIDIgLSBIZSkgLyAyOworCXZjcm9wMiA9IHR2bi0+SGEgLyAyIC0gSGUgLSB2Y3JvcDE7CisJVlN0YXJ0ID0gdHZuLT5WU3RhcnQ7CisJVkVuZCA9IFZTdGFydCArIHR2bi0+SGEgLyAyOwkvLyAtIDE7IEZJWE1FIFNuYXBTaG90IHRpbWVzIG91dCB3aXRoIC0xIGluIDc2OCo1NzYgb24gdGhlIERDMTAgLSBMUAorCVZTdGFydCArPSB2Y3JvcDE7CisJVkVuZCAtPSB2Y3JvcDI7CisJcmVnID0gKChWU3RhcnQgJiBaUjM2MDU3X1ZGRVZDUl9WbWFzaykgPDwgWlIzNjA1N19WRkVWQ1JfVlN0YXJ0KQorCSAgICB8ICgoVkVuZCAmIFpSMzYwNTdfVkZFVkNSX1ZtYXNrKSA8PCBaUjM2MDU3X1ZGRVZDUl9WRW5kKTsKKwlpZiAoenItPmNhcmQudmZlX3BvbC52c3luY19wb2wpCisJCXJlZyB8PSBaUjM2MDU3X1ZGRVZDUl9WU1BvbDsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19WRkVWQ1IpOworCisJLyogc2NhbGVyIGFuZCBwaXhlbCBmb3JtYXQgKi8KKwlyZWcgPSAwOworCXJlZyB8PSAoSG9yRGNtIDw8IFpSMzYwNTdfVkZFU1BGUl9Ib3JEY20pOworCXJlZyB8PSAoVmVyRGNtIDw8IFpSMzYwNTdfVkZFU1BGUl9WZXJEY20pOworCXJlZyB8PSAoRGlzcE1vZGUgPDwgWlIzNjA1N19WRkVTUEZSX0Rpc3BNb2RlKTsKKwlpZiAoZm9ybWF0LT5wYWxldHRlICE9IFZJREVPX1BBTEVUVEVfWVVWNDIyKQorCQlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX0xpdHRsZUVuZGlhbjsKKwkvKiBSSjogSSBkb24ndCBrbm93LCB3aHkgdGhlIGZvbGxvd2luZyBoYXMgdG8gYmUgdGhlIG9wcG9zaXRlCisJICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgWlIzNjA2MCBzZXR0aW5nLCBidXQgb25seSB0aGlzIHdheQorCSAqIHdlIGdldCB0aGUgY29ycmVjdCBjb2xvcnMgd2hlbiB1bmNvbXByZXNzaW5nIHRvIHRoZSBzY3JlZW4gICovCisJLy9yZWcgfD0gWlIzNjA1N19WRkVTUEZSX1ZDTEtQb2w7IC8qKi8KKwkvKiBSSjogRG9uJ3Qga25vdyBpZiB0aGF0IGlzIG5lZWRlZCBmb3IgTlRTQyBhbHNvICovCisJaWYgKHpyLT5ub3JtICE9IFZJREVPX01PREVfTlRTQykKKwkJcmVnIHw9IFpSMzYwNTdfVkZFU1BGUl9FeHRGbDsJLy8gTkVFREVEISEhISEhISBXb2xmZ2FuZworCXJlZyB8PSBaUjM2MDU3X1ZGRVNQRlJfVG9wRmllbGQ7CisJc3dpdGNoIChmb3JtYXQtPnBhbGV0dGUpIHsKKworCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjI6CisJCXJlZyB8PSBaUjM2MDU3X1ZGRVNQRlJfWVVWNDIyOworCQlicmVhazsKKworCWNhc2UgVklERU9fUEFMRVRURV9SR0I1NTU6CisJCXJlZyB8PSBaUjM2MDU3X1ZGRVNQRlJfUkdCNTU1IHwgWlIzNjA1N19WRkVTUEZSX0VyckRpZjsKKwkJYnJlYWs7CisKKwljYXNlIFZJREVPX1BBTEVUVEVfUkdCNTY1OgorCQlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX1JHQjU2NSB8IFpSMzYwNTdfVkZFU1BGUl9FcnJEaWY7CisJCWJyZWFrOworCisJY2FzZSBWSURFT19QQUxFVFRFX1JHQjI0OgorCQlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX1JHQjg4OCB8IFpSMzYwNTdfVkZFU1BGUl9QYWNrMjQ7CisJCWJyZWFrOworCisJY2FzZSBWSURFT19QQUxFVFRFX1JHQjMyOgorCQlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX1JHQjg4ODsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkcHJpbnRrKDEsCisJCQlLRVJOX0lORk8gIiVzOiBzZXRfdmZlKCkgLSB1bmtub3duIGNvbG9yX2ZtdD0leFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBmb3JtYXQtPnBhbGV0dGUpOworCQlyZXR1cm47CisKKwl9CisJaWYgKEhvckRjbSA+PSA0OCkgeworCQlyZWcgfD0gMyA8PCBaUjM2MDU3X1ZGRVNQRlJfSEZpbHRlcjsJLyogNSB0YXAgZmlsdGVyICovCisJfSBlbHNlIGlmIChIb3JEY20gPj0gMzIpIHsKKwkJcmVnIHw9IDIgPDwgWlIzNjA1N19WRkVTUEZSX0hGaWx0ZXI7CS8qIDQgdGFwIGZpbHRlciAqLworCX0gZWxzZSBpZiAoSG9yRGNtID49IDE2KSB7CisJCXJlZyB8PSAxIDw8IFpSMzYwNTdfVkZFU1BGUl9IRmlsdGVyOwkvKiAzIHRhcCBmaWx0ZXIgKi8KKwl9CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkZFU1BGUik7CisKKwkvKiBkaXNwbGF5IGNvbmZpZ3VyYXRpb24gKi8KKwlyZWcgPSAoMTYgPDwgWlIzNjA1N19WRENSX01pblBpeCkKKwkgICAgfCAoVmlkV2luSHQgPDwgWlIzNjA1N19WRENSX1ZpZFdpbkh0KQorCSAgICB8IChWaWRXaW5XaWQgPDwgWlIzNjA1N19WRENSX1ZpZFdpbldpZCk7CisJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfVFJJVE9OKQorCQkvLyB8fCB6ci0+cmV2aXNpb24gPCAxKSAvLyBSZXZpc2lvbiAxIGhhcyBhbHNvIFRyaXRvbiBzdXBwb3J0CisJCXJlZyAmPSB+WlIzNjA1N19WRENSX1RyaXRvbjsKKwllbHNlCisJCXJlZyB8PSBaUjM2MDU3X1ZEQ1JfVHJpdG9uOworCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZEQ1IpOworCisJLyogKFJvbmFsZCkgZG9uJ3Qgd3JpdGUgdGhpcyBpZiBvdmVybGF5X21hc2sgPSBOVUxMICovCisJaWYgKHpyLT5vdmVybGF5X21hc2spIHsKKwkJLyogV3JpdGUgb3ZlcmxheSBjbGlwcGluZyBtYXNrIGRhdGEsIGJ1dCBkb24ndCBlbmFibGUgb3ZlcmxheSBjbGlwcGluZyAqLworCQkvKiBSSjogc2luY2UgdGhpcyBtYWtlcyBvbmx5IHNlbnNlIG9uIHRoZSBzY3JlZW4sIHdlIHVzZSAKKwkJICogenItPm92ZXJsYXlfc2V0dGluZ3Mud2lkdGggaW5zdGVhZCBvZiB2aWRlb193aWR0aCAqLworCisJCW1hc2tfbGluZV9zaXplID0gKEJVWl9NQVhfV0lEVEggKyAzMSkgLyAzMjsKKwkJcmVnID0gdmlydF90b19idXMoenItPm92ZXJsYXlfbWFzayk7CisJCWJ0d3JpdGUocmVnLCBaUjM2MDU3X01NVFIpOworCQlyZWcgPSB2aXJ0X3RvX2J1cyh6ci0+b3ZlcmxheV9tYXNrICsgbWFza19saW5lX3NpemUpOworCQlidHdyaXRlKHJlZywgWlIzNjA1N19NTUJSKTsKKwkJcmVnID0KKwkJICAgIG1hc2tfbGluZV9zaXplIC0gKHpyLT5vdmVybGF5X3NldHRpbmdzLndpZHRoICsKKwkJCQkgICAgICAzMSkgLyAzMjsKKwkJaWYgKERpc3BNb2RlID09IDApCisJCQlyZWcgKz0gbWFza19saW5lX3NpemU7CisJCXJlZyA8PD0gWlIzNjA1N19PQ1JfTWFza1N0cmlkZTsKKwkJYnR3cml0ZShyZWcsIFpSMzYwNTdfT0NSKTsKKwl9CisKKwl6cjM2MDU3X2FkanVzdF92ZmUoenIsIHpyLT5jb2RlY19tb2RlKTsKK30KKworLyoKKyAqIFN3aXRjaCBvdmVybGF5IG9uIG9yIG9mZgorICovCisKK3ZvaWQKK3pyMzYwNTdfb3ZlcmxheSAoc3RydWN0IHpvcmFuICp6ciwKKwkJIGludCAgICAgICAgICAgb24pCit7CisJdTMyIHJlZzsKKworCWlmIChvbikgeworCQkvKiBkbyB0aGUgbmVjZXNzYXJ5IHNldHRpbmdzIC4uLiAqLworCQlidGFuZCh+WlIzNjA1N19WRENSX1ZpZEVuLCBaUjM2MDU3X1ZEQ1IpOwkvKiBzd2l0Y2ggaXQgb2ZmIGZpcnN0ICovCisKKwkJenIzNjA1N19zZXRfdmZlKHpyLAorCQkJCXpyLT5vdmVybGF5X3NldHRpbmdzLndpZHRoLAorCQkJCXpyLT5vdmVybGF5X3NldHRpbmdzLmhlaWdodCwKKwkJCQl6ci0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQpOworCisJCS8qIFN0YXJ0IGFuZCBsZW5ndGggb2YgZWFjaCBsaW5lIE1VU1QgYmUgNC1ieXRlIGFsaWduZWQuCisJCSAqIFRoaXMgc2hvdWxkIGJlIGFsbHJlYWR5IGNoZWNrZWQgYmVmb3JlIHRoZSBjYWxsIHRvIHRoaXMgcm91dGluZS4KKwkJICogQWxsIGVycm9yIG1lc3NhZ2VzIGFyZSBpbnRlcm5hbCBkcml2ZXIgY2hlY2tpbmcgb25seSEgKi8KKworCQkvKiB2aWRlbyBkaXNwbGF5IHRvcCBhbmQgYm90dG9tIHJlZ2lzdGVycyAqLworCQlyZWcgPSAodTMyKSB6ci0+YnVmZmVyLmJhc2UgKworCQkgICAgenItPm92ZXJsYXlfc2V0dGluZ3MueCAqCisJCSAgICAoKHpyLT5vdmVybGF5X3NldHRpbmdzLmZvcm1hdC0+ZGVwdGggKyA3KSAvIDgpICsKKwkJICAgIHpyLT5vdmVybGF5X3NldHRpbmdzLnkgKgorCQkgICAgenItPmJ1ZmZlci5ieXRlc3BlcmxpbmU7CisJCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZEVFIpOworCQlpZiAocmVnICYgMykKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogenIzNjA1N19vdmVybGF5KCkgLSB2aWRlb19hZGRyZXNzIG5vdCBhbGlnbmVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJaWYgKHpyLT5vdmVybGF5X3NldHRpbmdzLmhlaWdodCA+IEJVWl9NQVhfSEVJR0hUIC8gMikKKwkJCXJlZyArPSB6ci0+YnVmZmVyLmJ5dGVzcGVybGluZTsKKwkJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkRCUik7CisKKwkJLyogdmlkZW8gc3RyaWRlLCBzdGF0dXMsIGFuZCBmcmFtZSBncmFiIHJlZ2lzdGVyICovCisJCXJlZyA9IHpyLT5idWZmZXIuYnl0ZXNwZXJsaW5lIC0KKwkJICAgIHpyLT5vdmVybGF5X3NldHRpbmdzLndpZHRoICoKKwkJICAgICgoenItPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0LT5kZXB0aCArIDcpIC8gOCk7CisJCWlmICh6ci0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQgPiBCVVpfTUFYX0hFSUdIVCAvIDIpCisJCQlyZWcgKz0genItPmJ1ZmZlci5ieXRlc3BlcmxpbmU7CisJCWlmIChyZWcgJiAzKQorCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiB6cjM2MDU3X292ZXJsYXkoKSAtIHZpZGVvX3N0cmlkZSBub3QgYWxpZ25lZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJlZyA9IChyZWcgPDwgWlIzNjA1N19WU1NGR1JfRGlzcFN0cmlkZSk7CisJCXJlZyB8PSBaUjM2MDU3X1ZTU0ZHUl9WaWRPdmY7CS8qIGNsZWFyIG92ZXJmbG93IHN0YXR1cyAqLworCQlidHdyaXRlKHJlZywgWlIzNjA1N19WU1NGR1IpOworCisJCS8qIFNldCBvdmVybGF5IGNsaXBwaW5nICovCisJCWlmICh6ci0+b3ZlcmxheV9zZXR0aW5ncy5jbGlwY291bnQgPiAwKQorCQkJYnRvcihaUjM2MDU3X09DUl9PdmxFbmFibGUsIFpSMzYwNTdfT0NSKTsKKworCQkvKiAuLi4gYW5kIHN3aXRjaCBpdCBvbiAqLworCQlidG9yKFpSMzYwNTdfVkRDUl9WaWRFbiwgWlIzNjA1N19WRENSKTsKKwl9IGVsc2UgeworCQkvKiBTd2l0Y2ggaXQgb2ZmICovCisJCWJ0YW5kKH5aUjM2MDU3X1ZEQ1JfVmlkRW4sIFpSMzYwNTdfVkRDUik7CisJfQorfQorCisvKgorICogVGhlIG92ZXJsYXkgbWFzayBoYXMgb25lIGJpdCBmb3IgZWFjaCBwaXhlbCBvbiBhIHNjYW4gbGluZSwKKyAqICBhbmQgdGhlIG1heGltdW0gd2luZG93IHNpemUgaXMgQlVaX01BWF9XSURUSCAqIEJVWl9NQVhfSEVJR0hUIHBpeGVscy4KKyAqLworCit2b2lkCit3cml0ZV9vdmVybGF5X21hc2sgKHN0cnVjdCBmaWxlICAgICAgICpmaWxlLAorCQkgICAgc3RydWN0IHZpZGVvX2NsaXAgKnZwLAorCQkgICAgaW50ICAgICAgICAgICAgICAgIGNvdW50KQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwl1bnNpZ25lZCBtYXNrX2xpbmVfc2l6ZSA9IChCVVpfTUFYX1dJRFRIICsgMzEpIC8gMzI7CisJdTMyICptYXNrOworCWludCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworCXVuc2lnbmVkIGksIGosIGs7CisJdTMyIHJlZzsKKworCS8qIGZpbGwgbWFzayB3aXRoIG9uZSBiaXRzICovCisJbWVtc2V0KGZoLT5vdmVybGF5X21hc2ssIH4wLCBtYXNrX2xpbmVfc2l6ZSAqIDQgKiBCVVpfTUFYX0hFSUdIVCk7CisJcmVnID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCS8qIHBpY2sgdXAgbG9jYWwgY29weSBvZiBjbGlwICovCisJCXggPSB2cFtpXS54OworCQl5ID0gdnBbaV0ueTsKKwkJd2lkdGggPSB2cFtpXS53aWR0aDsKKwkJaGVpZ2h0ID0gdnBbaV0uaGVpZ2h0OworCisJCS8qIHRyaW0gY2xpcHMgdGhhdCBleHRlbmQgYmV5b25kIHRoZSB3aW5kb3cgKi8KKwkJaWYgKHggPCAwKSB7CisJCQl3aWR0aCArPSB4OworCQkJeCA9IDA7CisJCX0KKwkJaWYgKHkgPCAwKSB7CisJCQloZWlnaHQgKz0geTsKKwkJCXkgPSAwOworCQl9CisJCWlmICh4ICsgd2lkdGggPiBmaC0+b3ZlcmxheV9zZXR0aW5ncy53aWR0aCkgeworCQkJd2lkdGggPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy53aWR0aCAtIHg7CisJCX0KKwkJaWYgKHkgKyBoZWlnaHQgPiBmaC0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQpIHsKKwkJCWhlaWdodCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLmhlaWdodCAtIHk7CisJCX0KKworCQkvKiBpZ25vcmUgZGVnZW5lcmF0ZSBjbGlwcyAqLworCQlpZiAoaGVpZ2h0IDw9IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh3aWR0aCA8PSAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGFwcGx5IGNsaXAgZm9yIGVhY2ggc2NhbiBsaW5lICovCisJCWZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworCQkJLyogcmVzZXQgYml0IGZvciBlYWNoIHBpeGVsICovCisJCQkvKiB0aGlzIGNhbiBiZSBvcHRpbWl6ZWQgbGF0ZXIgaWYgbmVlZCBiZSAqLworCQkJbWFzayA9IGZoLT5vdmVybGF5X21hc2sgKyAoeSArIGopICogbWFza19saW5lX3NpemU7CisJCQlmb3IgKGsgPSAwOyBrIDwgd2lkdGg7ICsraykgeworCQkJCW1hc2tbKHggKyBrKSAvIDMyXSAmPQorCQkJCSAgICB+KCh1MzIpIDEgPDwgKHggKyBrKSAlIDMyKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyogRW5hYmxlL0Rpc2FibGUgdW5jb21wcmVzc2VkIG1lbW9yeSBncmFiYmluZyBvZiB0aGUgMzYwNTcgKi8KKwordm9pZAorenIzNjA1N19zZXRfbWVtZ3JhYiAoc3RydWN0IHpvcmFuICp6ciwKKwkJICAgICBpbnQgICAgICAgICAgIG1vZGUpCit7CisJaWYgKG1vZGUpIHsKKwkJaWYgKGJ0cmVhZChaUjM2MDU3X1ZTU0ZHUikgJgorCQkgICAgKFpSMzYwNTdfVlNTRkdSX1NuYXBTaG90IHwgWlIzNjA1N19WU1NGR1JfRnJhbWVHcmFiKSkKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IHpyMzYwNTdfc2V0X21lbWdyYWIoMSkgd2l0aCBTbmFwU2hvdCBvciBGcmFtZUdyYWIgb24hP1xuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisKKwkJLyogc3dpdGNoIG9uIFZTeW5jIGludGVycnVwdHMgKi8KKwkJYnR3cml0ZShJUlFfTUFTSywgWlIzNjA1N19JU1IpOwkvLyBDbGVhciBJbnRlcnJ1cHRzCisJCWJ0b3IoenItPmNhcmQudnN5bmNfaW50LCBaUjM2MDU3X0lDUik7CS8vIFNXCisKKwkJLyogZW5hYmxlIFNuYXBTaG90ICovCisJCWJ0b3IoWlIzNjA1N19WU1NGR1JfU25hcFNob3QsIFpSMzYwNTdfVlNTRkdSKTsKKworCQkvKiBTZXQgenIzNjA1NyB2aWRlbyBmcm9udCBlbmQgIGFuZCBlbmFibGUgdmlkZW8gKi8KKwkJenIzNjA1N19zZXRfdmZlKHpyLCB6ci0+djRsX3NldHRpbmdzLndpZHRoLAorCQkJCXpyLT52NGxfc2V0dGluZ3MuaGVpZ2h0LAorCQkJCXpyLT52NGxfc2V0dGluZ3MuZm9ybWF0KTsKKworCQl6ci0+djRsX21lbWdyYWJfYWN0aXZlID0gMTsKKwl9IGVsc2UgeworCQl6ci0+djRsX21lbWdyYWJfYWN0aXZlID0gMDsKKworCQkvKiBzd2l0Y2ggb2ZmIFZTeW5jIGludGVycnVwdHMgKi8KKwkJYnRhbmQofnpyLT5jYXJkLnZzeW5jX2ludCwgWlIzNjA1N19JQ1IpOwkvLyBTVworCisJCS8qIHJlZW5hYmxlIGdyYWJiaW5nIHRvIHNjcmVlbiBpZiBpdCB3YXMgcnVubmluZyAqLworCQlpZiAoenItPnY0bF9vdmVybGF5X2FjdGl2ZSkgeworCQkJenIzNjA1N19vdmVybGF5KHpyLCAxKTsKKwkJfSBlbHNlIHsKKwkJCWJ0YW5kKH5aUjM2MDU3X1ZEQ1JfVmlkRW4sIFpSMzYwNTdfVkRDUik7CisJCQlidGFuZCh+WlIzNjA1N19WU1NGR1JfU25hcFNob3QsIFpSMzYwNTdfVlNTRkdSKTsKKwkJfQorCX0KK30KKworaW50Cit3YWl0X2dyYWJfcGVuZGluZyAoc3RydWN0IHpvcmFuICp6cikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogd2FpdCB1bnRpbCBhbGwgcGVuZGluZyBncmFicyBhcmUgZmluaXNoZWQgKi8KKworCWlmICghenItPnY0bF9tZW1ncmFiX2FjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoenItPnY0bF9jYXBxLAorCQkJKHpyLT52NGxfcGVuZF90YWlsID09IHpyLT52NGxfcGVuZF9oZWFkKSk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCXpyMzYwNTdfc2V0X21lbWdyYWIoenIsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgU2V0IHVwIHRoZSBCdXotc3BlY2lmaWMgTUpQRUcgcGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldF9mcmFtZSAoc3RydWN0IHpvcmFuICp6ciwKKwkgICBpbnQgICAgICAgICAgIHZhbCkKK3sKKwlHUElPKHpyLCB6ci0+Y2FyZC5ncGlvW0dQSU9fSlBFR19GUkFNRV0sIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdmlkZW9idXNfZGlyIChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkgIGludCAgICAgICAgICAgdmFsKQoreworCXN3aXRjaCAoenItPmNhcmQudHlwZSkgeworCWNhc2UgTE1MMzM6CisJY2FzZSBMTUwzM1IxMDoKKwkJaWYgKGxtbDMzZHBhdGggPT0gMCkKKwkJCUdQSU8oenIsIDUsIHZhbCk7CisJCWVsc2UKKwkJCUdQSU8oenIsIDUsIDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlHUElPKHpyLCB6ci0+Y2FyZC5ncGlvW0dQSU9fVklEX0RJUl0sCisJCSAgICAgenItPmNhcmQuZ3Bpb19wb2xbR1BJT19WSURfRElSXSA/ICF2YWwgOiB2YWwpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X2pwZWdfcXVldWUgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJaW50IGk7CisKKwkvKiByZS1pbml0aWFsaXplIERNQSByaW5nIHN0dWZmICovCisJenItPmpwZ19xdWVfaGVhZCA9IDA7CisJenItPmpwZ19kbWFfaGVhZCA9IDA7CisJenItPmpwZ19kbWFfdGFpbCA9IDA7CisJenItPmpwZ19xdWVfdGFpbCA9IDA7CisJenItPmpwZ19zZXFfbnVtID0gMDsKKwl6ci0+SlBFR19lcnJvciA9IDA7CisJenItPm51bV9lcnJvcnMgPSAwOworCXpyLT5qcGdfZXJyX3NlcSA9IDA7CisJenItPmpwZ19lcnJfc2hpZnQgPSAwOworCXpyLT5qcGdfcXVldWVkX251bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IHpyLT5qcGdfYnVmZmVycy5udW1fYnVmZmVyczsgaSsrKSB7CisJCXpyLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uc3RhdGUgPSBCVVpfU1RBVEVfVVNFUjsJLyogbm90aGluZyBnb2luZyBvbiAqLworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQlVaX05VTV9TVEFUX0NPTTsgaSsrKSB7CisJCXpyLT5zdGF0X2NvbVtpXSA9IGNwdV90b19sZTMyKDEpOwkvKiBtYXJrIGFzIHVuYXZhaWxhYmxlIHRvIHpyMzYwNTcgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkCit6cjM2MDU3X3NldF9qcGcgKHN0cnVjdCB6b3JhbiAgICAgICAgICAqenIsCisJCSBlbnVtIHpvcmFuX2NvZGVjX21vZGUgIG1vZGUpCit7CisJc3RydWN0IHR2bm9ybSAqdHZuOworCXUzMiByZWc7CisKKwl0dm4gPSB6ci0+dGltaW5nOworCisJLyogYXNzZXJ0IFBfUmVzZXQsIGRpc2FibGUgY29kZSB0cmFuc2ZlciwgZGVhc3NlcnQgQWN0aXZlICovCisJYnR3cml0ZSgwLCBaUjM2MDU3X0pQQyk7CisKKwkvKiBNSlBFRyBjb21wcmVzc2lvbiBtb2RlICovCisJc3dpdGNoIChtb2RlKSB7CisKKwljYXNlIEJVWl9NT0RFX01PVElPTl9DT01QUkVTUzoKKwlkZWZhdWx0OgorCQlyZWcgPSBaUjM2MDU3X0pNQ19NSlBHQ21wTW9kZTsKKwkJYnJlYWs7CisKKwljYXNlIEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTOgorCQlyZWcgPSBaUjM2MDU3X0pNQ19NSlBHRXhwTW9kZTsKKwkJcmVnIHw9IFpSMzYwNTdfSk1DX1N5bmNNc3RyOworCQkvKiBSSjogVGhlIGZvbGxvd2luZyBpcyBleHBlcmltZW50YWwgLSBpbXByb3ZlcyB0aGUgb3V0cHV0IHRvIHNjcmVlbiAqLworCQkvL2lmKHpyLT5qcGdfc2V0dGluZ3MuVkZJRk9fRkIpIHJlZyB8PSBaUjM2MDU3X0pNQ19WRklGT19GQjsgLy8gTm8sIGl0IGRvZXNuJ3QuIFNNCisJCWJyZWFrOworCisJY2FzZSBCVVpfTU9ERV9TVElMTF9DT01QUkVTUzoKKwkJcmVnID0gWlIzNjA1N19KTUNfSlBHQ21wTW9kZTsKKwkJYnJlYWs7CisKKwljYXNlIEJVWl9NT0RFX1NUSUxMX0RFQ09NUFJFU1M6CisJCXJlZyA9IFpSMzYwNTdfSk1DX0pQR0V4cE1vZGU7CisJCWJyZWFrOworCisJfQorCXJlZyB8PSBaUjM2MDU3X0pNQ19KUEc7CisJaWYgKHpyLT5qcGdfc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmYgPT0gMSkKKwkJcmVnIHw9IFpSMzYwNTdfSk1DX0ZsZF9wZXJfYnVmZjsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19KTUMpOworCisJLyogdmVydGljYWwgKi8KKwlidG9yKFpSMzYwNTdfVkZFVkNSX1ZTUG9sLCBaUjM2MDU3X1ZGRVZDUik7CisJcmVnID0gKDYgPDwgWlIzNjA1N19WU1BfVnN5bmNTaXplKSB8CisJICAgICAgKHR2bi0+SHQgPDwgWlIzNjA1N19WU1BfRnJtVG90KTsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19WU1ApOworCXJlZyA9ICgoenItPmpwZ19zZXR0aW5ncy5pbWdfeSArIHR2bi0+VlN0YXJ0KSA8PCBaUjM2MDU3X0ZWQVBfTkFZKSB8CisJICAgICAgKHpyLT5qcGdfc2V0dGluZ3MuaW1nX2hlaWdodCA8PCBaUjM2MDU3X0ZWQVBfUEFZKTsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19GVkFQKTsKKworCS8qIGhvcml6b250YWwgKi8KKwlpZiAoenItPmNhcmQudmZlX3BvbC5oc3luY19wb2wpCisJCWJ0b3IoWlIzNjA1N19WRkVIQ1JfSFNQb2wsIFpSMzYwNTdfVkZFSENSKTsKKwllbHNlCisJCWJ0YW5kKH5aUjM2MDU3X1ZGRUhDUl9IU1BvbCwgWlIzNjA1N19WRkVIQ1IpOwkJCisJcmVnID0gKCh0dm4tPkhTeW5jU3RhcnQpIDw8IFpSMzYwNTdfSFNQX0hzeW5jU3RhcnQpIHwKKwkgICAgICAodHZuLT5XdCA8PCBaUjM2MDU3X0hTUF9MaW5lVG90KTsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19IU1ApOworCXJlZyA9ICgoenItPmpwZ19zZXR0aW5ncy5pbWdfeCArCisJICAgICAgICB0dm4tPkhTdGFydCArIDQpIDw8IFpSMzYwNTdfRkhBUF9OQVgpIHwKKwkgICAgICAoenItPmpwZ19zZXR0aW5ncy5pbWdfd2lkdGggPDwgWlIzNjA1N19GSEFQX1BBWCk7CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfRkhBUCk7CisKKwkvKiBmaWVsZCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KKwlpZiAoenItPmpwZ19zZXR0aW5ncy5vZGRfZXZlbikKKwkJcmVnID0gWlIzNjA1N19GUFBfT2RkX0V2ZW47CisJZWxzZQorCQlyZWcgPSAwOworCisJYnR3cml0ZShyZWcsIFpSMzYwNTdfRlBQKTsKKworCS8qIFNldCBwcm9wZXIgVkNMSyBQb2xhcml0eSwgZWxzZSBjb2xvcnMgd2lsbCBiZSB3cm9uZyBkdXJpbmcgcGxheWJhY2sgKi8KKwkvL2J0b3IoWlIzNjA1N19WRkVTUEZSX1ZDTEtQb2wsIFpSMzYwNTdfVkZFU1BGUik7CisKKwkvKiBjb2RlIGJhc2UgYWRkcmVzcyAqLworCXJlZyA9IHZpcnRfdG9fYnVzKHpyLT5zdGF0X2NvbSk7CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfSkNCQSk7CisKKwkvKiBGSUZPIHRocmVzaG9sZCAoRklGTyBpcyAxNjAuIGRvdWJsZSB3b3JkcykgKi8KKwkvKiBOT1RFOiBkZWNpbWFsIHZhbHVlcyBoZXJlICovCisJc3dpdGNoIChtb2RlKSB7CisKKwljYXNlIEJVWl9NT0RFX1NUSUxMX0NPTVBSRVNTOgorCWNhc2UgQlVaX01PREVfTU9USU9OX0NPTVBSRVNTOgorCQlpZiAoenItPmNhcmQudHlwZSAhPSBCVVopCisJCQlyZWcgPSAxNDA7CisJCWVsc2UKKwkJCXJlZyA9IDYwOworCQlicmVhazsKKworCWNhc2UgQlVaX01PREVfU1RJTExfREVDT01QUkVTUzoKKwljYXNlIEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTOgorCQlyZWcgPSAyMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZWcgPSA4MDsKKwkJYnJlYWs7CisKKwl9CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfSkNGVCk7CisJenIzNjA1N19hZGp1c3RfdmZlKHpyLCBtb2RlKTsKKworfQorCit2b2lkCitwcmludF9pbnRlcnJ1cHRzIChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCWludCByZXMsIG5vZXJyID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcnJ1cHRzIHJlY2VpdmVkOiIsIFpSX0RFVk5BTUUoenIpKTsKKwlpZiAoKHJlcyA9IHpyLT5maWVsZF9jb3VudGVyKSA8IC0xIHx8IHJlcyA+IDEpIHsKKwkJcHJpbnRrKCIgRkQ6JWQiLCByZXMpOworCX0KKwlpZiAoKHJlcyA9IHpyLT5pbnRyX2NvdW50ZXJfR0lSUTEpICE9IDApIHsKKwkJcHJpbnRrKCIgR0lSUTE6JWQiLCByZXMpOworCQlub2VycisrOworCX0KKwlpZiAoKHJlcyA9IHpyLT5pbnRyX2NvdW50ZXJfR0lSUTApICE9IDApIHsKKwkJcHJpbnRrKCIgR0lSUTA6JWQiLCByZXMpOworCQlub2VycisrOworCX0KKwlpZiAoKHJlcyA9IHpyLT5pbnRyX2NvdW50ZXJfQ29kUmVwSVJRKSAhPSAwKSB7CisJCXByaW50aygiIENvZFJlcElSUTolZCIsIHJlcyk7CisJCW5vZXJyKys7CisJfQorCWlmICgocmVzID0genItPmludHJfY291bnRlcl9KUEVHUmVwSVJRKSAhPSAwKSB7CisJCXByaW50aygiIEpQRUdSZXBJUlE6JWQiLCByZXMpOworCQlub2VycisrOworCX0KKwlpZiAoenItPkpQRUdfbWF4X21pc3NlZCkgeworCQlwcmludGsoIiBKUEVHIGRlbGF5czogbWF4PSVkIG1pbj0lZCIsIHpyLT5KUEVHX21heF9taXNzZWQsCisJCSAgICAgICB6ci0+SlBFR19taW5fbWlzc2VkKTsKKwl9CisJaWYgKHpyLT5FTkRfZXZlbnRfbWlzc2VkKSB7CisJCXByaW50aygiIEVORHMgbWlzc2VkOiAlZCIsIHpyLT5FTkRfZXZlbnRfbWlzc2VkKTsKKwl9CisJLy9pZiAoenItPmpwZ19xdWV1ZWRfbnVtKSB7CisJcHJpbnRrKCIgcXVldWVfc3RhdGU9JWxkLyVsZC8lbGQvJWxkIiwgenItPmpwZ19xdWVfdGFpbCwKKwkgICAgICAgenItPmpwZ19kbWFfdGFpbCwgenItPmpwZ19kbWFfaGVhZCwgenItPmpwZ19xdWVfaGVhZCk7CisJLy99CisJaWYgKCFub2VycikgeworCQlwcmludGsoIjogbm8gaW50ZXJydXB0cyBkZXRlY3RlZC4iKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCit2b2lkCitjbGVhcl9pbnRlcnJ1cHRfY291bnRlcnMgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJenItPmludHJfY291bnRlcl9HSVJRMSA9IDA7CisJenItPmludHJfY291bnRlcl9HSVJRMCA9IDA7CisJenItPmludHJfY291bnRlcl9Db2RSZXBJUlEgPSAwOworCXpyLT5pbnRyX2NvdW50ZXJfSlBFR1JlcElSUSA9IDA7CisJenItPmZpZWxkX2NvdW50ZXIgPSAwOworCXpyLT5JUlExX2luID0gMDsKKwl6ci0+SVJRMV9vdXQgPSAwOworCXpyLT5KUEVHX2luID0gMDsKKwl6ci0+SlBFR19vdXQgPSAwOworCXpyLT5KUEVHXzAgPSAwOworCXpyLT5KUEVHXzEgPSAwOworCXpyLT5FTkRfZXZlbnRfbWlzc2VkID0gMDsKKwl6ci0+SlBFR19taXNzZWQgPSAwOworCXpyLT5KUEVHX21heF9taXNzZWQgPSAwOworCXpyLT5KUEVHX21pbl9taXNzZWQgPSAweDdmZmZmZmZmOworfQorCitzdGF0aWMgdTMyCitjb3VudF9yZXNldF9pbnRlcnJ1cHQgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJdTMyIGlzcjsKKworCWlmICgoaXNyID0gYnRyZWFkKFpSMzYwNTdfSVNSKSAmIDB4NzgwMDAwMDApKSB7CisJCWlmIChpc3IgJiBaUjM2MDU3X0lTUl9HSVJRMSkgeworCQkJYnR3cml0ZShaUjM2MDU3X0lTUl9HSVJRMSwgWlIzNjA1N19JU1IpOworCQkJenItPmludHJfY291bnRlcl9HSVJRMSsrOworCQl9CisJCWlmIChpc3IgJiBaUjM2MDU3X0lTUl9HSVJRMCkgeworCQkJYnR3cml0ZShaUjM2MDU3X0lTUl9HSVJRMCwgWlIzNjA1N19JU1IpOworCQkJenItPmludHJfY291bnRlcl9HSVJRMCsrOworCQl9CisJCWlmIChpc3IgJiBaUjM2MDU3X0lTUl9Db2RSZXBJUlEpIHsKKwkJCWJ0d3JpdGUoWlIzNjA1N19JU1JfQ29kUmVwSVJRLCBaUjM2MDU3X0lTUik7CisJCQl6ci0+aW50cl9jb3VudGVyX0NvZFJlcElSUSsrOworCQl9CisJCWlmIChpc3IgJiBaUjM2MDU3X0lTUl9KUEVHUmVwSVJRKSB7CisJCQlidHdyaXRlKFpSMzYwNTdfSVNSX0pQRUdSZXBJUlEsIFpSMzYwNTdfSVNSKTsKKwkJCXpyLT5pbnRyX2NvdW50ZXJfSlBFR1JlcElSUSsrOworCQl9CisJfQorCXJldHVybiBpc3I7Cit9CisKKy8qIGhhY2sgKi8KK2V4dGVybiB2b2lkIHpyMzYwMTZfd3JpdGUgKHN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYywKKwkJCSAgIHUxNiAgICAgICAgICAgICAgICByZWcsCisJCQkgICB1MzIgICAgICAgICAgICAgICAgdmFsKTsKKwordm9pZAoranBlZ19zdGFydCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlpbnQgcmVnOworCisJenItPmZyYW1lX251bSA9IDA7CisKKwkvKiBkZWFzc2VydCBQX3Jlc2V0LCBkaXNhYmxlIGNvZGUgdHJhbnNmZXIsIGRlYXNzZXJ0IEFjdGl2ZSAqLworCWJ0d3JpdGUoWlIzNjA1N19KUENfUF9SZXNldCwgWlIzNjA1N19KUEMpOworCS8qIHN0b3AgZmx1c2hpbmcgdGhlIGludGVybmFsIGNvZGUgYnVmZmVyICovCisJYnRhbmQoflpSMzYwNTdfTUNUQ1JfQ0ZsdXNoLCBaUjM2MDU3X01DVENSKTsKKwkvKiBlbmFibGUgY29kZSB0cmFuc2ZlciAqLworCWJ0b3IoWlIzNjA1N19KUENfQ29kVHJuc0VuLCBaUjM2MDU3X0pQQyk7CisKKwkvKiBjbGVhciBJUlFzICovCisJYnR3cml0ZShJUlFfTUFTSywgWlIzNjA1N19JU1IpOworCS8qIGVuYWJsZSB0aGUgSlBFRyBJUlFzICovCisJYnR3cml0ZSh6ci0+Y2FyZC5qcGVnX2ludCB8CisJCQlaUjM2MDU3X0lDUl9KUEVHUmVwSVJRIHwKKwkJCVpSMzYwNTdfSUNSX0ludFBpbkVuLAorCQlaUjM2MDU3X0lDUik7CisKKwlzZXRfZnJhbWUoenIsIDApOwkvLyBcRlJBTUUKKworCS8qIHNldCB0aGUgSlBFRyBjb2RlYyBndWVzdCBJRCAqLworCXJlZyA9ICh6ci0+Y2FyZC5ncGNzWzFdIDw8IFpSMzYwNTdfSkNHSV9KUEVHdWVzdElEKSB8CisJICAgICAgICgwIDw8IFpSMzYwNTdfSkNHSV9KUEVHdWVzdFJlZyk7CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfSkNHSSk7CisKKwlpZiAoenItPmNhcmQudmlkZW9fdmZlID09IENPREVDX1RZUEVfWlIzNjAxNiAmJgorCSAgICB6ci0+Y2FyZC52aWRlb19jb2RlYyA9PSBDT0RFQ19UWVBFX1pSMzYwNTApIHsKKwkJLyogRW5hYmxlIHByb2Nlc3Npbmcgb24gdGhlIFpSMzYwMTYgKi8KKwkJaWYgKHpyLT52ZmUpCisJCQl6cjM2MDE2X3dyaXRlKHpyLT52ZmUsIDAsIDEpOworCisJCS8qIGxvYWQgdGhlIGFkZHJlc3Mgb2YgdGhlIEdPIHJlZ2lzdGVyIGluIHRoZSBaUjM2MDUwIGxhdGNoICovCisJCXBvc3Rfb2ZmaWNlX3dyaXRlKHpyLCAwLCAwLCAwKTsKKwl9CisKKwkvKiBhc3NlcnQgQWN0aXZlICovCisJYnRvcihaUjM2MDU3X0pQQ19BY3RpdmUsIFpSMzYwNTdfSlBDKTsKKworCS8qIGVuYWJsZSB0aGUgR28gZ2VuZXJhdGlvbiAqLworCWJ0b3IoWlIzNjA1N19KTUNfR29fZW4sIFpSMzYwNTdfSk1DKTsKKwl1ZGVsYXkoMzApOworCisJc2V0X2ZyYW1lKHpyLCAxKTsJLy8gL0ZSQU1FCisKKwlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBqcGVnX3N0YXJ0XG4iLCBaUl9ERVZOQU1FKHpyKSk7Cit9CisKK3ZvaWQKK3pyMzYwNTdfZW5hYmxlX2pwZyAoc3RydWN0IHpvcmFuICAgICAgICAgICp6ciwKKwkJICAgIGVudW0gem9yYW5fY29kZWNfbW9kZSAgbW9kZSkKK3sKKwlzdGF0aWMgaW50IHplcm8gPSAwOworCXN0YXRpYyBpbnQgb25lID0gMTsKKwlzdHJ1Y3QgdmZlX3NldHRpbmdzIGNhcDsKKwlpbnQgZmllbGRfc2l6ZSA9CisJICAgIHpyLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSAvIHpyLT5qcGdfc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmY7CisKKwl6ci0+Y29kZWNfbW9kZSA9IG1vZGU7CisKKwljYXAueCA9IHpyLT5qcGdfc2V0dGluZ3MuaW1nX3g7CisJY2FwLnkgPSB6ci0+anBnX3NldHRpbmdzLmltZ195OworCWNhcC53aWR0aCA9IHpyLT5qcGdfc2V0dGluZ3MuaW1nX3dpZHRoOworCWNhcC5oZWlnaHQgPSB6ci0+anBnX3NldHRpbmdzLmltZ19oZWlnaHQ7CisJY2FwLmRlY2ltYXRpb24gPQorCSAgICB6ci0+anBnX3NldHRpbmdzLkhvckRjbSB8ICh6ci0+anBnX3NldHRpbmdzLlZlckRjbSA8PCA4KTsKKwljYXAucXVhbGl0eSA9IHpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAucXVhbGl0eTsKKworCXN3aXRjaCAobW9kZSkgeworCisJY2FzZSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1M6IHsKKwkJc3RydWN0IGpwZWdfYXBwX21hcmtlciBhcHA7CisJCXN0cnVjdCBqcGVnX2NvbV9tYXJrZXIgY29tOworCisJCS8qIEluIG1vdGlvbiBjb21wcmVzcyBtb2RlLCB0aGUgZGVjb2RlciBvdXRwdXQgbXVzdCBiZSBlbmFibGVkLCBhbmQKKwkJICogdGhlIHZpZGVvIGJ1cyBkaXJlY3Rpb24gc2V0IHRvIGlucHV0LgorCQkgKi8KKwkJc2V0X3ZpZGVvYnVzX2Rpcih6ciwgMCk7CisJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9FTkFCTEVfT1VUUFVULCAmb25lKTsKKwkJZW5jb2Rlcl9jb21tYW5kKHpyLCBFTkNPREVSX1NFVF9JTlBVVCwgJnplcm8pOworCisJCS8qIFRha2UgdGhlIEpQRUcgY29kZWMgYW5kIHRoZSBWRkUgb3V0IG9mIHNsZWVwICovCisJCWpwZWdfY29kZWNfc2xlZXAoenIsIDApOworCisJCS8qIHNldCBKUEVHIGFwcC9jb20gbWFya2VyICovCisJCWFwcC5hcHBuID0genItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBuOworCQlhcHAubGVuID0genItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfbGVuOworCQltZW1jcHkoYXBwLmRhdGEsIHpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQX2RhdGEsIDYwKTsKKwkJenItPmNvZGVjLT5jb250cm9sKHpyLT5jb2RlYywgQ09ERUNfU19KUEVHX0FQUF9EQVRBLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QganBlZ19hcHBfbWFya2VyKSwgJmFwcCk7CisKKwkJY29tLmxlbiA9IHpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQ09NX2xlbjsKKwkJbWVtY3B5KGNvbS5kYXRhLCB6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9kYXRhLCA2MCk7CisJCXpyLT5jb2RlYy0+Y29udHJvbCh6ci0+Y29kZWMsIENPREVDX1NfSlBFR19DT01fREFUQSwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGpwZWdfY29tX21hcmtlciksICZjb20pOworCisJCS8qIFNldHVwIHRoZSBKUEVHIGNvZGVjICovCisJCXpyLT5jb2RlYy0+Y29udHJvbCh6ci0+Y29kZWMsIENPREVDX1NfSlBFR19URFNfQllURSwKKwkJCQkgICBzaXplb2YoaW50KSwgJmZpZWxkX3NpemUpOworCQl6ci0+Y29kZWMtPnNldF92aWRlbyh6ci0+Y29kZWMsIHpyLT50aW1pbmcsICZjYXAsCisJCQkJICAgICAmenItPmNhcmQudmZlX3BvbCk7CisJCXpyLT5jb2RlYy0+c2V0X21vZGUoenItPmNvZGVjLCBDT0RFQ19ET19DT01QUkVTU0lPTik7CisKKwkJLyogU2V0dXAgdGhlIFZGRSAqLworCQlpZiAoenItPnZmZSkgeworCQkJenItPnZmZS0+Y29udHJvbCh6ci0+dmZlLCBDT0RFQ19TX0pQRUdfVERTX0JZVEUsCisJCQkJCSBzaXplb2YoaW50KSwgJmZpZWxkX3NpemUpOworCQkJenItPnZmZS0+c2V0X3ZpZGVvKHpyLT52ZmUsIHpyLT50aW1pbmcsICZjYXAsCisJCQkJCSAgICZ6ci0+Y2FyZC52ZmVfcG9sKTsKKwkJCXpyLT52ZmUtPnNldF9tb2RlKHpyLT52ZmUsIENPREVDX0RPX0NPTVBSRVNTSU9OKTsKKwkJfQorCisJCWluaXRfanBlZ19xdWV1ZSh6cik7CisJCXpyMzYwNTdfc2V0X2pwZyh6ciwgbW9kZSk7CS8vIFxQX1Jlc2V0LCAuLi4gVmlkZW8gcGFyYW0sIEZJRk8KKworCQljbGVhcl9pbnRlcnJ1cHRfY291bnRlcnMoenIpOworCQlkcHJpbnRrKDIsIEtFUk5fSU5GTyAiJXM6IGVuYWJsZV9qcGcoTU9USU9OX0NPTVBSRVNTKVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUzoKKwkJLyogSW4gbW90aW9uIGRlY29tcHJlc3Npb24gbW9kZSwgdGhlIGRlY29kZXIgb3V0cHV0IG11c3QgYmUgZGlzYWJsZWQsIGFuZAorCQkgKiB0aGUgdmlkZW8gYnVzIGRpcmVjdGlvbiBzZXQgdG8gb3V0cHV0LgorCQkgKi8KKwkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0VOQUJMRV9PVVRQVVQsICZ6ZXJvKTsKKwkJc2V0X3ZpZGVvYnVzX2Rpcih6ciwgMSk7CisJCWVuY29kZXJfY29tbWFuZCh6ciwgRU5DT0RFUl9TRVRfSU5QVVQsICZvbmUpOworCisJCS8qIFRha2UgdGhlIEpQRUcgY29kZWMgYW5kIHRoZSBWRkUgb3V0IG9mIHNsZWVwICovCisJCWpwZWdfY29kZWNfc2xlZXAoenIsIDApOworCQkvKiBTZXR1cCB0aGUgVkZFICovCisJCWlmICh6ci0+dmZlKSB7CisJCQl6ci0+dmZlLT5zZXRfdmlkZW8oenItPnZmZSwgenItPnRpbWluZywgJmNhcCwKKwkJCQkJICAgJnpyLT5jYXJkLnZmZV9wb2wpOworCQkJenItPnZmZS0+c2V0X21vZGUoenItPnZmZSwgQ09ERUNfRE9fRVhQQU5TSU9OKTsKKwkJfQorCQkvKiBTZXR1cCB0aGUgSlBFRyBjb2RlYyAqLworCQl6ci0+Y29kZWMtPnNldF92aWRlbyh6ci0+Y29kZWMsIHpyLT50aW1pbmcsICZjYXAsCisJCQkJICAgICAmenItPmNhcmQudmZlX3BvbCk7CisJCXpyLT5jb2RlYy0+c2V0X21vZGUoenItPmNvZGVjLCBDT0RFQ19ET19FWFBBTlNJT04pOworCisJCWluaXRfanBlZ19xdWV1ZSh6cik7CisJCXpyMzYwNTdfc2V0X2pwZyh6ciwgbW9kZSk7CS8vIFxQX1Jlc2V0LCAuLi4gVmlkZW8gcGFyYW0sIEZJRk8KKworCQljbGVhcl9pbnRlcnJ1cHRfY291bnRlcnMoenIpOworCQlkcHJpbnRrKDIsIEtFUk5fSU5GTyAiJXM6IGVuYWJsZV9qcGcoTU9USU9OX0RFQ09NUFJFU1MpXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlicmVhazsKKworCWNhc2UgQlVaX01PREVfSURMRToKKwlkZWZhdWx0OgorCQkvKiBzaHV0IGRvd24gcHJvY2Vzc2luZyAqLworCQlidGFuZCh+KHpyLT5jYXJkLmpwZWdfaW50IHwgWlIzNjA1N19JQ1JfSlBFR1JlcElSUSksCisJCSAgICAgIFpSMzYwNTdfSUNSKTsKKwkJYnR3cml0ZSh6ci0+Y2FyZC5qcGVnX2ludCB8IFpSMzYwNTdfSUNSX0pQRUdSZXBJUlEsCisJCQlaUjM2MDU3X0lTUik7CisJCWJ0YW5kKH5aUjM2MDU3X0pNQ19Hb19lbiwgWlIzNjA1N19KTUMpOwkvLyBcR29fZW4KKworCQltc2xlZXAoNTApOworCisJCXNldF92aWRlb2J1c19kaXIoenIsIDApOworCQlzZXRfZnJhbWUoenIsIDEpOwkvLyAvRlJBTUUKKwkJYnRvcihaUjM2MDU3X01DVENSX0NGbHVzaCwgWlIzNjA1N19NQ1RDUik7CS8vIC9DRmx1c2gKKwkJYnR3cml0ZSgwLCBaUjM2MDU3X0pQQyk7CS8vIFxQX1Jlc2V0LFxDb2RUcm5zRW4sXEFjdGl2ZQorCQlidGFuZCh+WlIzNjA1N19KTUNfVkZJRk9fRkIsIFpSMzYwNTdfSk1DKTsKKwkJYnRhbmQoflpSMzYwNTdfSk1DX1N5bmNNc3RyLCBaUjM2MDU3X0pNQyk7CisJCWpwZWdfY29kZWNfcmVzZXQoenIpOworCQlqcGVnX2NvZGVjX3NsZWVwKHpyLCAxKTsKKwkJenIzNjA1N19hZGp1c3RfdmZlKHpyLCBtb2RlKTsKKworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfRU5BQkxFX09VVFBVVCwgJm9uZSk7CisJCWVuY29kZXJfY29tbWFuZCh6ciwgRU5DT0RFUl9TRVRfSU5QVVQsICZ6ZXJvKTsKKworCQlkcHJpbnRrKDIsIEtFUk5fSU5GTyAiJXM6IGVuYWJsZV9qcGcoSURMRSlcbiIsIFpSX0RFVk5BTUUoenIpKTsKKwkJYnJlYWs7CisKKwl9Cit9CisKKy8qIHdoZW4gdGhpcyBpcyBjYWxsZWQgdGhlIHNwaW5sb2NrIG11c3QgYmUgaGVsZCAqLwordm9pZAorem9yYW5fZmVlZF9zdGF0X2NvbSAoc3RydWN0IHpvcmFuICp6cikKK3sKKwkvKiBtb3ZlIGZyYW1lcyBmcm9tIHBlbmRpbmcgcXVldWUgdG8gRE1BICovCisKKwlpbnQgZnJhbWUsIGksIG1heF9zdGF0X2NvbTsKKworCW1heF9zdGF0X2NvbSA9CisJICAgICh6ci0+anBnX3NldHRpbmdzLlRtcERjbSA9PQorCSAgICAgMSkgPyBCVVpfTlVNX1NUQVRfQ09NIDogKEJVWl9OVU1fU1RBVF9DT00gPj4gMSk7CisKKwl3aGlsZSAoKHpyLT5qcGdfZG1hX2hlYWQgLSB6ci0+anBnX2RtYV90YWlsKSA8IG1heF9zdGF0X2NvbSAmJgorCSAgICAgICB6ci0+anBnX2RtYV9oZWFkIDwgenItPmpwZ19xdWVfaGVhZCkgeworCisJCWZyYW1lID0genItPmpwZ19wZW5kW3pyLT5qcGdfZG1hX2hlYWQgJiBCVVpfTUFTS19GUkFNRV07CisJCWlmICh6ci0+anBnX3NldHRpbmdzLlRtcERjbSA9PSAxKSB7CisJCQkvKiBmaWxsIDEgc3RhdF9jb20gZW50cnkgKi8KKwkJCWkgPSAoenItPmpwZ19kbWFfaGVhZCAtCisJCQkgICAgIHpyLT5qcGdfZXJyX3NoaWZ0KSAmIEJVWl9NQVNLX1NUQVRfQ09NOworCQkJaWYgKCEoenItPnN0YXRfY29tW2ldICYgY3B1X3RvX2xlMzIoMSkpKQorCQkJCWJyZWFrOworCQkJenItPnN0YXRfY29tW2ldID0KKwkJCSAgICBjcHVfdG9fbGUzMih6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5mcmFnX3RhYl9idXMpOworCQl9IGVsc2UgeworCQkJLyogZmlsbCAyIHN0YXRfY29tIGVudHJpZXMgKi8KKwkJCWkgPSAoKHpyLT5qcGdfZG1hX2hlYWQgLQorCQkJICAgICAgenItPmpwZ19lcnJfc2hpZnQpICYgMSkgKiAyOworCQkJaWYgKCEoenItPnN0YXRfY29tW2ldICYgY3B1X3RvX2xlMzIoMSkpKQorCQkJCWJyZWFrOworCQkJenItPnN0YXRfY29tW2ldID0KKwkJCSAgICBjcHVfdG9fbGUzMih6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5mcmFnX3RhYl9idXMpOworCQkJenItPnN0YXRfY29tW2kgKyAxXSA9CisJCQkgICAgY3B1X3RvX2xlMzIoenItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0uZnJhZ190YWJfYnVzKTsKKwkJfQorCQl6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZSA9IEJVWl9TVEFURV9ETUE7CisJCXpyLT5qcGdfZG1hX2hlYWQrKzsKKworCX0KKwlpZiAoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MpCisJCXpyLT5qcGdfcXVldWVkX251bSsrOworfQorCisvKiB3aGVuIHRoaXMgaXMgY2FsbGVkIHRoZSBzcGlubG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkCit6b3Jhbl9yZWFwX3N0YXRfY29tIChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCS8qIG1vdmUgZnJhbWVzIGZyb20gRE1BIHF1ZXVlIHRvIGRvbmUgcXVldWUgKi8KKworCWludCBpOworCXUzMiBzdGF0X2NvbTsKKwl1bnNpZ25lZCBpbnQgc2VxOworCXVuc2lnbmVkIGludCBkaWY7CisJc3RydWN0IHpvcmFuX2pwZ19idWZmZXIgKmJ1ZmZlcjsKKwlpbnQgZnJhbWU7CisKKwkvKiBJbiBtb3Rpb24gZGVjb21wcmVzcyB3ZSBkb24ndCBoYXZlIGEgaGFyZHdhcmUgZnJhbWUgY291bnRlciwKKwkgKiB3ZSBqdXN0IGNvdW50IHRoZSBpbnRlcnJ1cHRzIGhlcmUgKi8KKworCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUykgeworCQl6ci0+anBnX3NlcV9udW0rKzsKKwl9CisJd2hpbGUgKHpyLT5qcGdfZG1hX3RhaWwgPCB6ci0+anBnX2RtYV9oZWFkKSB7CisJCWlmICh6ci0+anBnX3NldHRpbmdzLlRtcERjbSA9PSAxKQorCQkJaSA9ICh6ci0+anBnX2RtYV90YWlsIC0KKwkJCSAgICAgenItPmpwZ19lcnJfc2hpZnQpICYgQlVaX01BU0tfU1RBVF9DT007CisJCWVsc2UKKwkJCWkgPSAoKHpyLT5qcGdfZG1hX3RhaWwgLQorCQkJICAgICAgenItPmpwZ19lcnJfc2hpZnQpICYgMSkgKiAyICsgMTsKKworCQlzdGF0X2NvbSA9IGxlMzJfdG9fY3B1KHpyLT5zdGF0X2NvbVtpXSk7CisKKwkJaWYgKChzdGF0X2NvbSAmIDEpID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlmcmFtZSA9IHpyLT5qcGdfcGVuZFt6ci0+anBnX2RtYV90YWlsICYgQlVaX01BU0tfRlJBTUVdOworCQlidWZmZXIgPSAmenItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV07CisJCWRvX2dldHRpbWVvZmRheSgmYnVmZmVyLT5icy50aW1lc3RhbXApOworCisJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1MpIHsKKwkJCWJ1ZmZlci0+YnMubGVuZ3RoID0gKHN0YXRfY29tICYgMHg3ZmZmZmYpID4+IDE7CisKKwkJCS8qIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgd2l0aCB0aGUgaGVscCBvZiB0aGUgY291bnRlciBpbiBzdGF0X2NvbSAqLworCisJCQlzZXEgPSAoKHN0YXRfY29tID4+IDI0KSArIHpyLT5qcGdfZXJyX3NlcSkgJiAweGZmOworCQkJZGlmID0gKHNlcSAtIHpyLT5qcGdfc2VxX251bSkgJiAweGZmOworCQkJenItPmpwZ19zZXFfbnVtICs9IGRpZjsKKwkJfSBlbHNlIHsKKwkJCWJ1ZmZlci0+YnMubGVuZ3RoID0gMDsKKwkJfQorCQlidWZmZXItPmJzLnNlcSA9CisJCSAgICB6ci0+anBnX3NldHRpbmdzLlRtcERjbSA9PQorCQkgICAgMiA/ICh6ci0+anBnX3NlcV9udW0gPj4gMSkgOiB6ci0+anBnX3NlcV9udW07CisJCWJ1ZmZlci0+c3RhdGUgPSBCVVpfU1RBVEVfRE9ORTsKKworCQl6ci0+anBnX2RtYV90YWlsKys7CisJfQorfQorCitzdGF0aWMgdm9pZAorZXJyb3JfaGFuZGxlciAoc3RydWN0IHpvcmFuICp6ciwKKwkgICAgICAgdTMyICAgICAgICAgICBhc3RhdCwKKwkgICAgICAgdTMyICAgICAgICAgICBzdGF0KQoreworCS8qIFRoaXMgaXMgSlBFRyBlcnJvciBoYW5kbGluZyBwYXJ0ICovCisJaWYgKCh6ci0+Y29kZWNfbW9kZSAhPSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1MpICYmCisJICAgICh6ci0+Y29kZWNfbW9kZSAhPSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUykpIHsKKwkJLy9kcHJpbnRrKDEsIEtFUk5fRVJSICIlczogSW50ZXJuYWwgZXJyb3I6IGVycm9yIGhhbmRsaW5nIHJlcXVlc3QgaW4gbW9kZSAlZFxuIiwgWlJfREVWTkFNRSh6ciksIHpyLT5jb2RlY19tb2RlKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoc3RhdCAmIDEpID09IDAgJiYKKwkgICAgenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0NPTVBSRVNTICYmCisJICAgIHpyLT5qcGdfZG1hX3RhaWwgLSB6ci0+anBnX3F1ZV90YWlsID49CisJICAgICB6ci0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMpIHsKKwkJLyogTm8gZnJlZSBidWZmZXJzLi4uICovCisJCXpvcmFuX3JlYXBfc3RhdF9jb20oenIpOworCQl6b3Jhbl9mZWVkX3N0YXRfY29tKHpyKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ6ci0+anBnX2NhcHEpOworCQl6ci0+SlBFR19taXNzZWQgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKHpyLT5KUEVHX2Vycm9yICE9IDEpIHsKKwkJLyoKKwkJICogRmlyc3QgZW50cnk6IGVycm9yIGp1c3QgaGFwcGVuZWQgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24KKwkJICogCisJCSAqIEluIEJVWl9NT0RFX01PVElPTl9DT01QUkVTUzoKKwkJICogCisJCSAqIFBvc3NpYmxlIGdsaXRjaCBpbiBUViBzaWduYWwuIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQKKwkJICogc3RvcCB0aGUgY29kZWMgYW5kIHdhaXQgZm9yIGdvb2QgcXVhbGl0eSBzaWduYWwgYmVmb3JlCisJCSAqIHJlc3RhcnRpbmcgaXQgdG8gYXZvaWQgZnVydGhlciBwcm9ibGVtcworCQkgKiAKKwkJICogSW4gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1M6CisJCSAqIAorCQkgKiBCYWQgSlBFRyBmcmFtZTogd2UgaGF2ZSB0byBtYXJrIGl0IGFzIHByb2Nlc3NlZCAoY29kZWMgY3Jhc2hlZAorCQkgKiBhbmQgd2FzIG5vdCBhYmxlIHRvIGRvIGl0IGl0c2VsZiksIGFuZCB0byByZW1vdmUgaXQgZnJvbSBxdWV1ZS4KKwkJICovCisJCWJ0YW5kKH5aUjM2MDU3X0pNQ19Hb19lbiwgWlIzNjA1N19KTUMpOworCQl1ZGVsYXkoMSk7CisJCXN0YXQgPSBzdGF0IHwgKHBvc3Rfb2ZmaWNlX3JlYWQoenIsIDcsIDApICYgMykgPDwgODsKKwkJYnR3cml0ZSgwLCBaUjM2MDU3X0pQQyk7CisJCWJ0b3IoWlIzNjA1N19NQ1RDUl9DRmx1c2gsIFpSMzYwNTdfTUNUQ1IpOworCQlqcGVnX2NvZGVjX3Jlc2V0KHpyKTsKKwkJanBlZ19jb2RlY19zbGVlcCh6ciwgMSk7CisJCXpyLT5KUEVHX2Vycm9yID0gMTsKKwkJenItPm51bV9lcnJvcnMrKzsKKworCQkvKiBSZXBvcnQgZXJyb3IgKi8KKwkJaWYgKCp6cl9kZWJ1ZyA+IDEgJiYgenItPm51bV9lcnJvcnMgPD0gOCkgeworCQkJbG9uZyBmcmFtZTsKKwkJCWZyYW1lID0KKwkJCSAgICB6ci0+anBnX3BlbmRbenItPmpwZ19kbWFfdGFpbCAmIEJVWl9NQVNLX0ZSQU1FXTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogSlBFRyBlcnJvciBzdGF0PTB4JTA4eCgweCUwOHgpIHF1ZXVlX3N0YXRlPSVsZC8lbGQvJWxkLyVsZCBzZXE9JWxkIGZyYW1lPSVsZC4gQ29kZWMgc3RvcHBlZC4gIiwKKwkJCSAgICAgICBaUl9ERVZOQU1FKHpyKSwgc3RhdCwgenItPmxhc3RfaXNyLAorCQkJICAgICAgIHpyLT5qcGdfcXVlX3RhaWwsIHpyLT5qcGdfZG1hX3RhaWwsCisJCQkgICAgICAgenItPmpwZ19kbWFfaGVhZCwgenItPmpwZ19xdWVfaGVhZCwKKwkJCSAgICAgICB6ci0+anBnX3NlcV9udW0sIGZyYW1lKTsKKwkJCXByaW50aygic3RhdF9jb20gZnJhbWVzOiIpOworCQkJeworCQkJCWludCBpLCBqOworCQkJCWZvciAoaiA9IDA7IGogPCBCVVpfTlVNX1NUQVRfQ09NOyBqKyspIHsKKwkJCQkJZm9yIChpID0gMDsKKwkJCQkJICAgICBpIDwgenItPmpwZ19idWZmZXJzLm51bV9idWZmZXJzOworCQkJCQkgICAgIGkrKykgeworCQkJCQkJaWYgKGxlMzJfdG9fY3B1KHpyLT5zdGF0X2NvbVtqXSkgPT0KKwkJCQkJCSAgICB6ci0+anBnX2J1ZmZlcnMuCisJCQkJCQkgICAgYnVmZmVyW2ldLgorCQkJCQkJICAgIGZyYWdfdGFiX2J1cykgeworCQkJCQkJCXByaW50aygiJSBkLT4lZCIsCisJCQkJCQkJICAgICAgIGosIGkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXByaW50aygiXG4iKTsKKwkJCX0KKwkJfQorCQkvKiBGaW5kIGFuIGVudHJ5IGluIHN0YXRfY29tIGFuZCByb3RhdGUgY29udGVudHMgKi8KKwkJeworCQkJaW50IGk7CisKKwkJCWlmICh6ci0+anBnX3NldHRpbmdzLlRtcERjbSA9PSAxKQorCQkJCWkgPSAoenItPmpwZ19kbWFfdGFpbCAtCisJCQkJICAgICB6ci0+anBnX2Vycl9zaGlmdCkgJiBCVVpfTUFTS19TVEFUX0NPTTsKKwkJCWVsc2UKKwkJCQlpID0gKCh6ci0+anBnX2RtYV90YWlsIC0KKwkJCQkgICAgICB6ci0+anBnX2Vycl9zaGlmdCkgJiAxKSAqIDI7CisJCQlpZiAoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MpIHsKKwkJCQkvKiBNaW1pYyB6cjM2MDY3IG9wZXJhdGlvbiAqLworCQkJCXpyLT5zdGF0X2NvbVtpXSB8PSBjcHVfdG9fbGUzMigxKTsKKwkJCQlpZiAoenItPmpwZ19zZXR0aW5ncy5UbXBEY20gIT0gMSkKKwkJCQkJenItPnN0YXRfY29tW2kgKyAxXSB8PSBjcHVfdG9fbGUzMigxKTsKKwkJCQkvKiBSZWZpbGwgKi8KKwkJCQl6b3Jhbl9yZWFwX3N0YXRfY29tKHpyKTsKKwkJCQl6b3Jhbl9mZWVkX3N0YXRfY29tKHpyKTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnpyLT5qcGdfY2FwcSk7CisJCQkJLyogRmluZCBhbiBlbnRyeSBpbiBzdGF0X2NvbSBhZ2FpbiBhZnRlciByZWZpbGwgKi8KKwkJCQlpZiAoenItPmpwZ19zZXR0aW5ncy5UbXBEY20gPT0gMSkKKwkJCQkJaSA9ICh6ci0+anBnX2RtYV90YWlsIC0KKwkJCQkJICAgICB6ci0+anBnX2Vycl9zaGlmdCkgJgorCQkJCQkgICAgQlVaX01BU0tfU1RBVF9DT007CisJCQkJZWxzZQorCQkJCQlpID0gKCh6ci0+anBnX2RtYV90YWlsIC0KKwkJCQkJICAgICAgenItPmpwZ19lcnJfc2hpZnQpICYgMSkgKiAyOworCQkJfQorCQkJaWYgKGkpIHsKKwkJCQkvKiBSb3RhdGUgc3RhdF9jb21tIGVudHJpZXMgdG8gbWFrZSBjdXJyZW50IGVudHJ5IGZpcnN0ICovCisJCQkJaW50IGo7CisJCQkJdTMyIGJ1c19hZGRyW0JVWl9OVU1fU1RBVF9DT01dOworCisJCQkJLyogSGVyZSB3ZSBhcmUgY29weWluZyB0aGUgc3RhdF9jb20gYXJyYXksIHdoaWNoCisJCQkJICogaXMgYWxyZWFkeSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28KKwkJCQkgKiBubyBlbmRpYW4gY29udmVyc2lvbnMgaGVyZQorCQkJCSAqLworCQkJCW1lbWNweShidXNfYWRkciwgenItPnN0YXRfY29tLAorCQkJCSAgICAgICBzaXplb2YoYnVzX2FkZHIpKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgQlVaX05VTV9TVEFUX0NPTTsgaisrKSB7CisJCQkJCXpyLT5zdGF0X2NvbVtqXSA9CisJCQkJCSAgICBidXNfYWRkclsoaSArIGopICYKKwkJCQkJCSAgICAgQlVaX01BU0tfU1RBVF9DT01dOworCisJCQkJfQorCQkJCXpyLT5qcGdfZXJyX3NoaWZ0ICs9IGk7CisJCQkJenItPmpwZ19lcnJfc2hpZnQgJj0gQlVaX01BU0tfU1RBVF9DT007CisJCQl9CisJCQlpZiAoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0NPTVBSRVNTKQorCQkJCXpyLT5qcGdfZXJyX3NlcSA9IHpyLT5qcGdfc2VxX251bTsJLyogKyAxOyAqLworCQl9CisJfQorCisJLyogTm93IHRoZSBzdGF0X2NvbW0gYnVmZmVyIGlzIHJlYWR5IGZvciByZXN0YXJ0ICovCisJZG8geworCQlpbnQgc3RhdHVzLCBtb2RlOworCisJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1MpIHsKKwkJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9HRVRfU1RBVFVTLCAmc3RhdHVzKTsKKwkJCW1vZGUgPSBDT0RFQ19ET19DT01QUkVTU0lPTjsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IDA7CisJCQltb2RlID0gQ09ERUNfRE9fRVhQQU5TSU9OOworCQl9CisJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUyB8fAorCQkgICAgKHN0YXR1cyAmIERFQ09ERVJfU1RBVFVTX0dPT0QpKSB7CisJCQkvKioqKioqKioqKiBSRVNUQVJUIGNvZGUgKioqKioqKioqKioqKi8KKwkJCWpwZWdfY29kZWNfcmVzZXQoenIpOworCQkJenItPmNvZGVjLT5zZXRfbW9kZSh6ci0+Y29kZWMsIG1vZGUpOworCQkJenIzNjA1N19zZXRfanBnKHpyLCB6ci0+Y29kZWNfbW9kZSk7CisJCQlqcGVnX3N0YXJ0KHpyKTsKKworCQkJaWYgKHpyLT5udW1fZXJyb3JzIDw9IDgpCisJCQkJZHByaW50aygyLCBLRVJOX0lORk8gIiVzOiBSZXN0YXJ0XG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisKKwkJCXpyLT5KUEVHX21pc3NlZCA9IDA7CisJCQl6ci0+SlBFR19lcnJvciA9IDI7CisJCQkvKioqKioqKioqKiBFbmQgUkVTVEFSVCBjb2RlICoqKioqKioqKioqLworCQl9CisJfSB3aGlsZSAoMCk7Cit9CisKK2lycXJldHVybl90Cit6b3Jhbl9pcnEgKGludCAgICAgICAgICAgICBpcnEsCisJICAgdm9pZCAgICAgICAgICAgKmRldl9pZCwKKwkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgc3RhdCwgYXN0YXQ7CisJaW50IGNvdW50OworCXN0cnVjdCB6b3JhbiAqenI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXpyID0gKHN0cnVjdCB6b3JhbiAqKSBkZXZfaWQ7CisJY291bnQgPSAwOworCisJaWYgKHpyLT50ZXN0aW5nKSB7CisJCS8qIFRlc3RpbmcgaW50ZXJydXB0cyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisJCXdoaWxlICgoc3RhdCA9IGNvdW50X3Jlc2V0X2ludGVycnVwdCh6cikpKSB7CisJCQlpZiAoY291bnQrKyA+IDEwMCkgeworCQkJCWJ0YW5kKH5aUjM2MDU3X0lDUl9JbnRQaW5FbiwgWlIzNjA1N19JQ1IpOworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBJUlEgbG9ja3VwIHdoaWxlIHRlc3RpbmcsIGlzcj0weCUwOHgsIGNsZWFyZWQgaW50IG1hc2tcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBzdGF0KTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnpyLT50ZXN0X3EpOworCQkJfQorCQl9CisJCXpyLT5sYXN0X2lzciA9IHN0YXQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCXdoaWxlICgxKSB7CisJCS8qIGdldC9jbGVhciBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMgKi8KKwkJc3RhdCA9IGNvdW50X3Jlc2V0X2ludGVycnVwdCh6cik7CisJCWFzdGF0ID0gc3RhdCAmIElSUV9NQVNLOworCQlpZiAoIWFzdGF0KSB7CisJCQlicmVhazsKKwkJfQorCQlkcHJpbnRrKDQsCisJCQlLRVJOX0RFQlVHCisJCQkiem9yYW5faXJxOiBhc3RhdDogMHglMDh4LCBtYXNrOiAweCUwOHhcbiIsCisJCQlhc3RhdCwgYnRyZWFkKFpSMzYwNTdfSUNSKSk7CisJCWlmIChhc3RhdCAmIHpyLT5jYXJkLnZzeW5jX2ludCkgewkvLyBTVworCisJCQlpZiAoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MgfHwKKwkJCSAgICB6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1MpIHsKKwkJCQkvKiBjb3VudCBtaXNzZWQgaW50ZXJydXB0cyAqLworCQkJCXpyLT5KUEVHX21pc3NlZCsrOworCQkJfQorCQkJLy9wb3N0X29mZmljZV9yZWFkKHpyLDEsMCk7CisJCQkvKiBJbnRlcnJ1cHRzIG1heSBzdGlsbCBoYXBwZW4gd2hlbgorCQkJICogenItPnY0bF9tZW1ncmFiX2FjdGl2ZSBpcyBzd2l0Y2hlZCBvZmYuCisJCQkgKiBXZSBzaW1wbHkgaWdub3JlIHRoZW0gKi8KKworCQkJaWYgKHpyLT52NGxfbWVtZ3JhYl9hY3RpdmUpIHsKKworCQkJCS8qIEEgbG90IG1vcmUgY2hlY2tzIHNob3VsZCBiZSBoZXJlIC4uLiAqLworCQkJCWlmICgoYnRyZWFkKFpSMzYwNTdfVlNTRkdSKSAmCisJCQkJICAgICBaUjM2MDU3X1ZTU0ZHUl9TbmFwU2hvdCkgPT0gMCkKKwkJCQkJZHByaW50aygxLAorCQkJCQkJS0VSTl9XQVJOSU5HCisJCQkJCQkiJXM6IEJ1eklSUSB3aXRoIFNuYXBTaG90IG9mZiA/Pz9cbiIsCisJCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisKKwkJCQlpZiAoenItPnY0bF9ncmFiX2ZyYW1lICE9IE5PX0dSQUJfQUNUSVZFKSB7CisJCQkJCS8qIFRoZXJlIGlzIGEgZ3JhYiBvbiBhIGZyYW1lIGdvaW5nIG9uLCBjaGVjayBpZiBpdCBoYXMgZmluaXNoZWQgKi8KKworCQkJCQlpZiAoKGJ0cmVhZChaUjM2MDU3X1ZTU0ZHUikgJgorCQkJCQkgICAgIFpSMzYwNTdfVlNTRkdSX0ZyYW1lR3JhYikgPT0KKwkJCQkJICAgIDApIHsKKwkJCQkJCS8qIGl0IGlzIGZpbmlzaGVkLCBub3RpZnkgdGhlIHVzZXIgKi8KKworCQkJCQkJenItPnY0bF9idWZmZXJzLmJ1ZmZlclt6ci0+djRsX2dyYWJfZnJhbWVdLnN0YXRlID0gQlVaX1NUQVRFX0RPTkU7CisJCQkJCQl6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW3pyLT52NGxfZ3JhYl9mcmFtZV0uYnMuc2VxID0genItPnY0bF9ncmFiX3NlcTsKKwkJCQkJCWRvX2dldHRpbWVvZmRheSgmenItPnY0bF9idWZmZXJzLmJ1ZmZlclt6ci0+djRsX2dyYWJfZnJhbWVdLmJzLnRpbWVzdGFtcCk7CisJCQkJCQl6ci0+djRsX2dyYWJfZnJhbWUgPSBOT19HUkFCX0FDVElWRTsKKwkJCQkJCXpyLT52NGxfcGVuZF90YWlsKys7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoenItPnY0bF9ncmFiX2ZyYW1lID09IE5PX0dSQUJfQUNUSVZFKQorCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnpyLT52NGxfY2FwcSk7CisKKwkJCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIGdyYWIgcXVldWVkICovCisKKwkJCQlpZiAoenItPnY0bF9ncmFiX2ZyYW1lID09IE5PX0dSQUJfQUNUSVZFICYmCisJCQkJICAgIHpyLT52NGxfcGVuZF90YWlsICE9IHpyLT52NGxfcGVuZF9oZWFkKSB7CisKKwkJCQkJaW50IGZyYW1lID0genItPnY0bF9wZW5kW3pyLT52NGxfcGVuZF90YWlsICYKKwkJCQkJCQkgVjRMX01BU0tfRlJBTUVdOworCQkJCQl1MzIgcmVnOworCisJCQkJCXpyLT52NGxfZ3JhYl9mcmFtZSA9IGZyYW1lOworCisJCQkJCS8qIFNldCB6cjM2MDU3IHZpZGVvIGZyb250IGVuZCBhbmQgZW5hYmxlIHZpZGVvICovCisKKwkJCQkJLyogQnVmZmVyIGFkZHJlc3MgKi8KKworCQkJCQlyZWcgPQorCQkJCQkgICAgenItPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV0uCisJCQkJCSAgICBmYnVmZmVyX2J1czsKKwkJCQkJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkRUUik7CisJCQkJCWlmICh6ci0+djRsX3NldHRpbmdzLmhlaWdodCA+CisJCQkJCSAgICBCVVpfTUFYX0hFSUdIVCAvIDIpCisJCQkJCQlyZWcgKz0KKwkJCQkJCSAgICB6ci0+djRsX3NldHRpbmdzLgorCQkJCQkJICAgIGJ5dGVzcGVybGluZTsKKwkJCQkJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkRCUik7CisKKwkJCQkJLyogdmlkZW8gc3RyaWRlLCBzdGF0dXMsIGFuZCBmcmFtZSBncmFiIHJlZ2lzdGVyICovCisJCQkJCXJlZyA9IDA7CisJCQkJCWlmICh6ci0+djRsX3NldHRpbmdzLmhlaWdodCA+CisJCQkJCSAgICBCVVpfTUFYX0hFSUdIVCAvIDIpCisJCQkJCQlyZWcgKz0KKwkJCQkJCSAgICB6ci0+djRsX3NldHRpbmdzLgorCQkJCQkJICAgIGJ5dGVzcGVybGluZTsKKwkJCQkJcmVnID0KKwkJCQkJICAgIChyZWcgPDwKKwkJCQkJICAgICBaUjM2MDU3X1ZTU0ZHUl9EaXNwU3RyaWRlKTsKKwkJCQkJcmVnIHw9IFpSMzYwNTdfVlNTRkdSX1ZpZE92ZjsKKwkJCQkJcmVnIHw9IFpSMzYwNTdfVlNTRkdSX1NuYXBTaG90OworCQkJCQlyZWcgfD0gWlIzNjA1N19WU1NGR1JfRnJhbWVHcmFiOworCQkJCQlidHdyaXRlKHJlZywgWlIzNjA1N19WU1NGR1IpOworCisJCQkJCWJ0b3IoWlIzNjA1N19WRENSX1ZpZEVuLAorCQkJCQkgICAgIFpSMzYwNTdfVkRDUik7CisJCQkJfQorCQkJfQorCisJCQkvKiBldmVuIGlmIHdlIGRvbid0IGdyYWIsIHdlIGRvIHdhbnQgdG8gaW5jcmVtZW50CisJCQkgKiB0aGUgc2VxdWVuY2UgY291bnRlciB0byBzZWUgbG9zdCBmcmFtZXMgKi8KKwkJCXpyLT52NGxfZ3JhYl9zZXErKzsKKwkJfQorI2lmIChJUlFfTUFTSyAmIFpSMzYwNTdfSVNSX0NvZFJlcElSUSkKKwkJaWYgKGFzdGF0ICYgWlIzNjA1N19JU1JfQ29kUmVwSVJRKSB7CisJCQl6ci0+aW50cl9jb3VudGVyX0NvZFJlcElSUSsrOworCQkJSURFQlVHKHByaW50aworCQkJICAgICAgIChLRVJOX0RFQlVHICIlczogWlIzNjA1N19JU1JfQ29kUmVwSVJRXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKSk7CisJCQlidGFuZCh+WlIzNjA1N19JQ1JfQ29kUmVwSVJRLCBaUjM2MDU3X0lDUik7CisJCX0KKyNlbmRpZgkJCQkvKiAoSVJRX01BU0sgJiBaUjM2MDU3X0lTUl9Db2RSZXBJUlEpICovCisKKyNpZiAoSVJRX01BU0sgJiBaUjM2MDU3X0lTUl9KUEVHUmVwSVJRKQorCQlpZiAoYXN0YXQgJiBaUjM2MDU3X0lTUl9KUEVHUmVwSVJRKSB7CisKKwkJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUyB8fAorCQkJICAgIHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9DT01QUkVTUykgeworCQkJCWlmICgqenJfZGVidWcgPiAxICYmCisJCQkJICAgICghenItPmZyYW1lX251bSB8fCB6ci0+SlBFR19lcnJvcikpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkgICAgICAgIiVzOiBmaXJzdCBmcmFtZSByZWFkeTogc3RhdGU9MHglMDh4IG9kZF9ldmVuPSVkIGZpZWxkX3Blcl9idWZmPSVkIGRlbGF5PSVkXG4iLAorCQkJCQkgICAgICAgWlJfREVWTkFNRSh6ciksIHN0YXQsCisJCQkJCSAgICAgICB6ci0+anBnX3NldHRpbmdzLm9kZF9ldmVuLAorCQkJCQkgICAgICAgenItPmpwZ19zZXR0aW5ncy4KKwkJCQkJICAgICAgIGZpZWxkX3Blcl9idWZmLAorCQkJCQkgICAgICAgenItPkpQRUdfbWlzc2VkKTsKKwkJCQkJeworCQkJCQkJY2hhciBzY1tdID0gIjAwMDAiOworCQkJCQkJY2hhciBzdls1XTsKKwkJCQkJCWludCBpOworCQkJCQkJc3RyY3B5KHN2LCBzYyk7CisJCQkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJCQkJaWYgKGxlMzJfdG9fY3B1KHpyLT5zdGF0X2NvbVtpXSkgJiAxKQorCQkJCQkJCQlzdltpXSA9ICcxJzsKKwkJCQkJCX0KKwkJCQkJCXN2WzRdID0gMDsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJCSAgICAgICAiJXM6IHN0YXRfY29tPSVzIHF1ZXVlX3N0YXRlPSVsZC8lbGQvJWxkLyVsZFxuIiwKKwkJCQkJCSAgICAgICBaUl9ERVZOQU1FKHpyKSwgc3YsCisJCQkJCQkgICAgICAgenItPmpwZ19xdWVfdGFpbCwKKwkJCQkJCSAgICAgICB6ci0+anBnX2RtYV90YWlsLAorCQkJCQkJICAgICAgIHpyLT5qcGdfZG1hX2hlYWQsCisJCQkJCQkgICAgICAgenItPmpwZ19xdWVfaGVhZCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoenItPkpQRUdfbWlzc2VkID4genItPkpQRUdfbWF4X21pc3NlZCkJLy8gR2V0IHN0YXRpc3RpY3MKKwkJCQkJCXpyLT5KUEVHX21heF9taXNzZWQgPQorCQkJCQkJICAgIHpyLT5KUEVHX21pc3NlZDsKKwkJCQkJaWYgKHpyLT5KUEVHX21pc3NlZCA8CisJCQkJCSAgICB6ci0+SlBFR19taW5fbWlzc2VkKQorCQkJCQkJenItPkpQRUdfbWluX21pc3NlZCA9CisJCQkJCQkgICAgenItPkpQRUdfbWlzc2VkOworCQkJCX0KKworCQkJCWlmICgqenJfZGVidWcgPiAyICYmIHpyLT5mcmFtZV9udW0gPCA2KSB7CisJCQkJCWludCBpOworCQkJCQlwcmludGsoIiVzOiBzZXE9JWxkIHN0YXRfY29tOiIsCisJCQkJCSAgICAgICBaUl9ERVZOQU1FKHpyKSwgenItPmpwZ19zZXFfbnVtKTsKKwkJCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCQkJcHJpbnRrKCIgJTA4eCIsCisJCQkJCQkgICAgICAgbGUzMl90b19jcHUoenItPnN0YXRfY29tW2ldKSk7CisJCQkJCX0KKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJCX0KKwkJCQl6ci0+ZnJhbWVfbnVtKys7CisJCQkJenItPkpQRUdfbWlzc2VkID0gMDsKKwkJCQl6ci0+SlBFR19lcnJvciA9IDA7CisJCQkJem9yYW5fcmVhcF9zdGF0X2NvbSh6cik7CisJCQkJem9yYW5fZmVlZF9zdGF0X2NvbSh6cik7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ6ci0+anBnX2NhcHEpOworCQkJfSAvKmVsc2UgeworCQkJICAgICAgZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IEpQRUcgaW50ZXJydXB0IHdoaWxlIG5vdCBpbiBtb3Rpb24gKGRlKWNvbXByZXNzIG1vZGUhXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQl9Ki8KKwkJfQorI2VuZGlmCQkJCS8qIChJUlFfTUFTSyAmIFpSMzYwNTdfSVNSX0pQRUdSZXBJUlEpICovCisKKwkJLyogREFURVJSLCB0b28gbWFueSBmaWVsZHMgbWlzc2VkLCBlcnJvciBwcm9jZXNzaW5nICovCisJCWlmICgoYXN0YXQgJiB6ci0+Y2FyZC5qcGVnX2ludCkgfHwKKwkJICAgIHpyLT5KUEVHX21pc3NlZCA+IDI1IHx8CisJCSAgICB6ci0+SlBFR19lcnJvciA9PSAxCXx8CisJCSAgICAoKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTKSAmJgorCQkgICAgICh6ci0+ZnJhbWVfbnVtICYgKHpyLT5KUEVHX21pc3NlZCA+CisJCQkJICAgICAgIHpyLT5qcGdfc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmYpKSkpIHsKKwkJCWVycm9yX2hhbmRsZXIoenIsIGFzdGF0LCBzdGF0KTsKKwkJfQorCisJCWNvdW50Kys7CisJCWlmIChjb3VudCA+IDEwKSB7CisJCQlkcHJpbnRrKDIsIEtFUk5fV0FSTklORyAiJXM6IGlycSBsb29wICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBjb3VudCk7CisJCQlpZiAoY291bnQgPiAyMCkgeworCQkJCWJ0YW5kKH5aUjM2MDU3X0lDUl9JbnRQaW5FbiwgWlIzNjA1N19JQ1IpOworCQkJCWRwcmludGsoMiwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBJUlEgbG9ja3VwLCBjbGVhcmVkIGludCBtYXNrXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJenItPmxhc3RfaXNyID0gc3RhdDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3ZvaWQKK3pvcmFuX3NldF9wY2lfbWFzdGVyIChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkgICAgICBpbnQgICAgICAgICAgIHNldF9tYXN0ZXIpCit7CisJaWYgKHNldF9tYXN0ZXIpIHsKKwkJcGNpX3NldF9tYXN0ZXIoenItPnBjaV9kZXYpOworCX0gZWxzZSB7CisJCXUxNiBjb21tYW5kOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHpyLT5wY2lfZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOworCQljb21tYW5kICY9IH5QQ0lfQ09NTUFORF9NQVNURVI7CisJCXBjaV93cml0ZV9jb25maWdfd29yZCh6ci0+cGNpX2RldiwgUENJX0NPTU1BTkQsIGNvbW1hbmQpOworCX0KK30KKwordm9pZAorem9yYW5faW5pdF9oYXJkd2FyZSAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlpbnQgaiwgemVybyA9IDA7CisKKwkvKiBFbmFibGUgYnVzLW1hc3RlcmluZyAqLworCXpvcmFuX3NldF9wY2lfbWFzdGVyKHpyLCAxKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGJvYXJkICovCisJaWYgKHpyLT5jYXJkLmluaXQpIHsKKwkJenItPmNhcmQuaW5pdCh6cik7CisJfQorCisJaiA9IHpyLT5jYXJkLmlucHV0W3pyLT5pbnB1dF0ubXV4c2VsOworCisJZGVjb2Rlcl9jb21tYW5kKHpyLCAwLCBOVUxMKTsKKwlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX05PUk0sICZ6ci0+bm9ybSk7CisJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9JTlBVVCwgJmopOworCisJZW5jb2Rlcl9jb21tYW5kKHpyLCAwLCBOVUxMKTsKKwllbmNvZGVyX2NvbW1hbmQoenIsIEVOQ09ERVJfU0VUX05PUk0sICZ6ci0+bm9ybSk7CisJZW5jb2Rlcl9jb21tYW5kKHpyLCBFTkNPREVSX1NFVF9JTlBVVCwgJnplcm8pOworCisJLyogdG9nZ2xlIEpQRUcgY29kZWMgc2xlZXAgdG8gc3luYyBQTEwgKi8KKwlqcGVnX2NvZGVjX3NsZWVwKHpyLCAxKTsKKwlqcGVnX2NvZGVjX3NsZWVwKHpyLCAwKTsKKworCS8qIHNldCBpbmRpdmlkdWFsIGludGVycnVwdCBlbmFibGVzICh3aXRob3V0IEdJUlExKQorCSAqIGJ1dCBkb24ndCBnbG9iYWwgZW5hYmxlIHVudGlsIHpvcmFuX29wZW4oKSAqLworCisJLy9idHdyaXRlKElSUV9NQVNLICYgflpSMzYwNTdfSVNSX0dJUlExLCBaUjM2MDU3X0lDUik7ICAvLyBTVworCS8vIEl0IGxvb2tzIGxpa2UgdXNpbmcgb25seSBKUEVHUmVwSVJRRW4gaXMgbm90IGFsd2F5cyByZWxpYWJsZSwKKwkvLyBtYXkgYmUgd2hlbiBKUEVHIGNvZGVjIGNyYXNoZXMgaXQgd29uJ3QgZ2VuZXJhdGUgSVJRPyBTbywKKwkgLypDUCovCQkJLy8gICAgICAgIGJ0d3JpdGUoSVJRX01BU0ssIFpSMzYwNTdfSUNSKTsgLy8gRW5hYmxlIFZzeW5jIGludGVycnVwdHMgdG9vLiBTTSAgICBXSFkgPyBMUAorCSAgICB6cjM2MDU3X2luaXRfdmZlKHpyKTsKKworCXpyMzYwNTdfZW5hYmxlX2pwZyh6ciwgQlVaX01PREVfSURMRSk7CisKKwlidHdyaXRlKElSUV9NQVNLLCBaUjM2MDU3X0lTUik7CS8vIENsZWFycyBpbnRlcnJ1cHRzCit9CisKK3ZvaWQKK3pyMzYwNTdfcmVzdGFydCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlidHdyaXRlKDAsIFpSMzYwNTdfU1BHUFBDUik7CisJbWRlbGF5KDEpOworCWJ0b3IoWlIzNjA1N19TUEdQUENSX1NvZnRSZXNldCwgWlIzNjA1N19TUEdQUENSKTsKKwltZGVsYXkoMSk7CisKKwkvKiBhc3NlcnQgUF9SZXNldCAqLworCWJ0d3JpdGUoMCwgWlIzNjA1N19KUEMpOworCS8qIHNldCB1cCBHUElPIGRpcmVjdGlvbiAtIGFsbCBvdXRwdXQgKi8KKwlidHdyaXRlKFpSMzYwNTdfU1BHUFBDUl9Tb2Z0UmVzZXQgfCAwLCBaUjM2MDU3X1NQR1BQQ1IpOworCisJLyogc2V0IHVwIEdQSU8gcGlucyBhbmQgZ3Vlc3QgYnVzIHRpbWluZyAqLworCWJ0d3JpdGUoKDB4ODEgPDwgMjQpIHwgMHg4ODg4LCBaUjM2MDU3X0dQUEdDUjEpOworfQorCisvKgorICogaW5pdGlhbGl6ZSB2aWRlbyBmcm9udCBlbmQKKyAqLworCitzdGF0aWMgdm9pZAorenIzNjA1N19pbml0X3ZmZSAoc3RydWN0IHpvcmFuICp6cikKK3sKKwl1MzIgcmVnOworCisJcmVnID0gYnRyZWFkKFpSMzYwNTdfVkZFU1BGUik7CisJcmVnIHw9IFpSMzYwNTdfVkZFU1BGUl9MaXR0bGVFbmRpYW47CisJcmVnICY9IH5aUjM2MDU3X1ZGRVNQRlJfVkNMS1BvbDsKKwlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX0V4dEZsOworCXJlZyB8PSBaUjM2MDU3X1ZGRVNQRlJfVG9wRmllbGQ7CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkZFU1BGUik7CisJcmVnID0gYnRyZWFkKFpSMzYwNTdfVkRDUik7CisJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfVFJJVE9OKQorCQkvLyB8fCB6ci0+cmV2aXNpb24gPCAxKSAvLyBSZXZpc2lvbiAxIGhhcyBhbHNvIFRyaXRvbiBzdXBwb3J0CisJCXJlZyAmPSB+WlIzNjA1N19WRENSX1RyaXRvbjsKKwllbHNlCisJCXJlZyB8PSBaUjM2MDU3X1ZEQ1JfVHJpdG9uOworCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZEQ1IpOworfQorCisvKgorICogSW50ZXJmYWNlIHRvIGRlY29kZXIgYW5kIGVuY29kZXIgY2hpcHMgdXNpbmcgaTJjIGJ1cworICovCisKK2ludAorZGVjb2Rlcl9jb21tYW5kIChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkgaW50ICAgICAgICAgICBjbWQsCisJCSB2b2lkICAgICAgICAgKmRhdGEpCit7CisJaWYgKHpyLT5kZWNvZGVyID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJaWYgKHpyLT5jYXJkLnR5cGUgPT0gTE1MMzMgJiYKKwkgICAgKGNtZCA9PSBERUNPREVSX1NFVF9OT1JNIHx8IERFQ09ERVJfU0VUX0lOUFVUKSkgeworCQlpbnQgcmVzOworCisJCS8vIEJ0ODE5IG5lZWRzIHRvIHJlc2V0IGl0cyBGSUZPIGJ1ZmZlciB1c2luZyAjRlJTVCBwaW4gYW5kCisJCS8vIExNTDMzIGNhcmQgdXNlcyBHUElPKDcpIGZvciB0aGF0LgorCQlHUElPKHpyLCA3LCAwKTsKKwkJcmVzID0genItPmRlY29kZXItPmRyaXZlci0+Y29tbWFuZCh6ci0+ZGVjb2RlciwgY21kLCBkYXRhKTsKKwkJLy8gUHVsbCAjRlJTVCBoaWdoLgorCQlHUElPKHpyLCA3LCAxKTsKKwkJcmV0dXJuIHJlczsKKwl9IGVsc2UKKwkJcmV0dXJuIHpyLT5kZWNvZGVyLT5kcml2ZXItPmNvbW1hbmQoenItPmRlY29kZXIsIGNtZCwKKwkJCQkJCSAgICBkYXRhKTsKK30KKworaW50CitlbmNvZGVyX2NvbW1hbmQgKHN0cnVjdCB6b3JhbiAqenIsCisJCSBpbnQgICAgICAgICAgIGNtZCwKKwkJIHZvaWQgICAgICAgICAqZGF0YSkKK3sKKwlpZiAoenItPmVuY29kZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIHpyLT5lbmNvZGVyLT5kcml2ZXItPmNvbW1hbmQoenItPmVuY29kZXIsIGNtZCwgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RldmljZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE1MjAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kZXZpY2UuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogWm9yYW4genIzNjA1Ny96cjM2MDY3IFBDSSBjb250cm9sbGVyIGRyaXZlciwgZm9yIHRoZQorICogUGlubmFjbGUvTWlybyBEQzEwL0RDMTArL0RDMzAvREMzMCssIElvbWVnYSBCdXosIExpbnV4CisgKiBNZWRpYSBMYWJzIExNTDMzL0xNTDMzUjEwLgorICoKKyAqIFRoaXMgcGFydCBoYW5kbGVzIGNhcmQtc3BlY2lmaWMgZGF0YSBhbmQgZGV0ZWN0aW9uCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKyAqCisgKiBDdXJyZW50bHkgbWFpbnRhaW5lZCBieToKKyAqICAgUm9uYWxkIEJ1bHRqZSAgICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZT4KKyAqICAgTWFpbGluZ2xpc3QgICAgICA8bWpwZWctdXNlcnNAbGlzdHMuc2YubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19aT1JBTl9ERVZJQ0VfSF9fCisjZGVmaW5lIF9fWk9SQU5fREVWSUNFX0hfXworCisvKiBnZW5lcmFsIHB1cnBvc2UgSS9PICovCitleHRlcm4gdm9pZCBHUElPKHN0cnVjdCB6b3JhbiAqenIsCisJCSBpbnQgYml0LAorCQkgdW5zaWduZWQgaW50IHZhbHVlKTsKKworLyogY29kZWMgKG9yIGFjdHVhbGx5OiBndWVzdCBidXMpIGFjY2VzcyAqLworZXh0ZXJuIGludCBwb3N0X29mZmljZV93YWl0KHN0cnVjdCB6b3JhbiAqenIpOworZXh0ZXJuIGludCBwb3N0X29mZmljZV93cml0ZShzdHJ1Y3Qgem9yYW4gKnpyLAorCQkJICAgICB1bnNpZ25lZCBndWVzdCwKKwkJCSAgICAgdW5zaWduZWQgcmVnLAorCQkJICAgICB1bnNpZ25lZCB2YWx1ZSk7CitleHRlcm4gaW50IHBvc3Rfb2ZmaWNlX3JlYWQoc3RydWN0IHpvcmFuICp6ciwKKwkJCSAgICB1bnNpZ25lZCBndWVzdCwKKwkJCSAgICB1bnNpZ25lZCByZWcpOworCitleHRlcm4gdm9pZCBkZXRlY3RfZ3Vlc3RfYWN0aXZpdHkoc3RydWN0IHpvcmFuICp6cik7CisKK2V4dGVybiB2b2lkIGpwZWdfY29kZWNfc2xlZXAoc3RydWN0IHpvcmFuICp6ciwKKwkJCSAgICAgaW50IHNsZWVwKTsKK2V4dGVybiBpbnQganBlZ19jb2RlY19yZXNldChzdHJ1Y3Qgem9yYW4gKnpyKTsKKworLyogenIzNjB4NyBhY2Nlc3MgdG8gcmF3IGNhcHR1cmUgKi8KK2V4dGVybiB2b2lkIHpyMzYwNTdfb3ZlcmxheShzdHJ1Y3Qgem9yYW4gKnpyLAorCQkJICAgIGludCBvbik7CitleHRlcm4gdm9pZCB3cml0ZV9vdmVybGF5X21hc2soc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgc3RydWN0IHZpZGVvX2NsaXAgKnZwLAorCQkJICAgICAgIGludCBjb3VudCk7CitleHRlcm4gdm9pZCB6cjM2MDU3X3NldF9tZW1ncmFiKHN0cnVjdCB6b3JhbiAqenIsCisJCQkJaW50IG1vZGUpOworZXh0ZXJuIGludCB3YWl0X2dyYWJfcGVuZGluZyhzdHJ1Y3Qgem9yYW4gKnpyKTsKKworLyogaW50ZXJydXB0cyAqLworZXh0ZXJuIHZvaWQgcHJpbnRfaW50ZXJydXB0cyhzdHJ1Y3Qgem9yYW4gKnpyKTsKK2V4dGVybiB2b2lkIGNsZWFyX2ludGVycnVwdF9jb3VudGVycyhzdHJ1Y3Qgem9yYW4gKnpyKTsKK2V4dGVybiBpcnFyZXR1cm5fdCB6b3Jhbl9pcnEoaW50IGlycSwKKwkJCSAgICAgdm9pZCAqZGV2X2lkLAorCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qIEpQRUcgY29kZWMgYWNjZXNzICovCitleHRlcm4gdm9pZCBqcGVnX3N0YXJ0KHN0cnVjdCB6b3JhbiAqenIpOworZXh0ZXJuIHZvaWQgenIzNjA1N19lbmFibGVfanBnKHN0cnVjdCB6b3JhbiAqenIsCisJCQkgICAgICAgZW51bSB6b3Jhbl9jb2RlY19tb2RlIG1vZGUpOworZXh0ZXJuIHZvaWQgem9yYW5fZmVlZF9zdGF0X2NvbShzdHJ1Y3Qgem9yYW4gKnpyKTsKKworLyogZ2VuZXJhbCAqLworZXh0ZXJuIHZvaWQgem9yYW5fc2V0X3BjaV9tYXN0ZXIoc3RydWN0IHpvcmFuICp6ciwKKwkJCQkgaW50IHNldF9tYXN0ZXIpOworZXh0ZXJuIHZvaWQgem9yYW5faW5pdF9oYXJkd2FyZShzdHJ1Y3Qgem9yYW4gKnpyKTsKK2V4dGVybiB2b2lkIHpyMzYwNTdfcmVzdGFydChzdHJ1Y3Qgem9yYW4gKnpyKTsKKworLyogaTJjICovCitleHRlcm4gaW50IGRlY29kZXJfY29tbWFuZChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkJICAgaW50IGNtZCwKKwkJCSAgIHZvaWQgKmRhdGEpOworZXh0ZXJuIGludCBlbmNvZGVyX2NvbW1hbmQoc3RydWN0IHpvcmFuICp6ciwKKwkJCSAgIGludCBjbWQsCisJCQkgICB2b2lkICpkYXRhKTsKKworI2VuZGlmCQkJCS8qIF9fWk9SQU5fREVWSUNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4MzhhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMKQEAgLTAsMCArMSw0Njk5IEBACisvKgorICogWm9yYW4genIzNjA1Ny96cjM2MDY3IFBDSSBjb250cm9sbGVyIGRyaXZlciwgZm9yIHRoZQorICogUGlubmFjbGUvTWlybyBEQzEwL0RDMTArL0RDMzAvREMzMCssIElvbWVnYSBCdXosIExpbnV4CisgKiBNZWRpYSBMYWJzIExNTDMzL0xNTDMzUjEwLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKyAqCisgKiBDaGFuZ2VzIGZvciBCVVogYnkgV29sZmdhbmcgU2NoZXJyIDxzY2hlcnJAbmV0NHlvdS5uZXQ+CisgKgorICogQ2hhbmdlcyBmb3IgREMxMC9EQzMwIGJ5IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAc2t5bmV0LmJlPgorICoKKyAqIENoYW5nZXMgZm9yIExNTDMzUjEwIGJ5IE1heGltIFlldnR5dXNoa2luIDxtYXhAbGludXhtZWRpYWxhYnMuY29tPgorICoKKyAqIENoYW5nZXMgZm9yIHZpZGVvZGV2Mi92NGwyIGJ5IFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiBCYXNlZCBvbgorICoKKyAqIE1pcm8gREMxMCBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSBXb2xmZ2FuZyBTY2hlcnIgPHNjaGVyckBuZXQ0eW91Lm5ldD4KKyAqCisgKiBJb21lZ2EgQnV6IGRyaXZlciB2ZXJzaW9uIDEuMAorICogQ29weXJpZ2h0IChDKSAxOTk5IFJhaW5lciBKb2hhbm5pIDxSYWluZXJASm9oYW5uaS5kZT4KKyAqCisgKiBidXouMC4wLjMKKyAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZlIFBlcmtzIDxkcGVya3NAaWJtLm5ldD4KKyAqCisgKiBidHR2IC0gQnQ4NDggZnJhbWUgZ3JhYmJlciBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMTk5Niw5Nyw5OCBSYWxwaCAgTWV0emxlciAocmprbUB0aHAudW5pLWtvZWxuLmRlKQorICogICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIChtb2NtQHRocC51bmkta29lbG4uZGUpCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNkZWZpbmUgICAgIE1BUF9OUih4KSAgICAgICB2aXJ0X3RvX3BhZ2UoeCkKKyNkZWZpbmUgICAgIFpPUkFOX0hBUkRXQVJFICBWSURfSEFSRFdBUkVfWlIzNjA2NworI2RlZmluZSAgICAgWk9SQU5fVklEX1RZUEUgICggXAorCQkJCVZJRF9UWVBFX0NBUFRVUkUgfCBcCisJCQkJVklEX1RZUEVfT1ZFUkxBWSB8IFwKKwkJCQlWSURfVFlQRV9DTElQUElORyB8IFwKKwkJCQlWSURfVFlQRV9GUkFNRVJBTSB8IFwKKwkJCQlWSURfVFlQRV9TQ0FMRVMgfCBcCisJCQkJVklEX1RZUEVfTUpQRUdfREVDT0RFUiB8IFwKKwkJCQlWSURfVFlQRV9NSlBFR19FTkNPREVSIFwKKwkJCSAgICAgKQorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlICJ2aWRlb2NvZGVjLmgiCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19lbmNvZGVyLmg+CisjaW5jbHVkZSAiem9yYW4uaCIKKyNpbmNsdWRlICJ6b3Jhbl9kZXZpY2UuaCIKKyNpbmNsdWRlICJ6b3Jhbl9jYXJkLmgiCisKKyNpZmRlZiBIQVZFX1Y0TDIKKwkvKiB3ZSBkZWNsYXJlIHNvbWUgY2FyZCB0eXBlIGRlZmluaXRpb25zIGhlcmUsIHRoZXkgbWVhbgorCSAqIHRoZSBzYW1lIGFzIHRoZSB2NGwxIFpPUkFOX1ZJRF9UWVBFIGFib3ZlLCBleGNlcHQgaXQncyB2NGwyICovCisjZGVmaW5lIFpPUkFOX1Y0TDJfVklEX0ZMQUdTICggXAorCQkJCVY0TDJfQ0FQX1NUUkVBTUlORyB8XAorCQkJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfFwKKwkJCQlWNEwyX0NBUF9WSURFT19PVVRQVVQgfFwKKwkJCQlWNEwyX0NBUF9WSURFT19PVkVSTEFZIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCitjb25zdCBzdHJ1Y3Qgem9yYW5fZm9ybWF0IHpvcmFuX2Zvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lID0gIjE1LWJpdCBSR0IiLAorCQkucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCNTU1LAorI2lmZGVmIEhBVkVfVjRMMgorI2lmZGVmIF9fTElUVExFX0VORElBTgorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1JHQjU1NSwKKyNlbHNlCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfUkdCNTU1WCwKKyNlbmRpZgorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorI2VuZGlmCisJCS5kZXB0aCA9IDE1LAorCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8CisJCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCisJfSwgeworCQkubmFtZSA9ICIxNi1iaXQgUkdCIiwKKwkJLnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JHQjU2NSwKKyNpZmRlZiBIQVZFX1Y0TDIKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9SR0I1NjUsCisjZWxzZQorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1JHQjU2NVgsCisjZW5kaWYKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKyNlbmRpZgorCQkuZGVwdGggPSAxNiwKKwkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAorCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAorCX0sIHsKKwkJLm5hbWUgPSAiMjQtYml0IFJHQiIsCisJCS5wYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IyNCwKKyNpZmRlZiBIQVZFX1Y0TDIKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9CR1IyNCwKKyNlbHNlCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfUkdCMjQsCisjZW5kaWYKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKyNlbmRpZgorCQkuZGVwdGggPSAyNCwKKwkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAorCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAorCX0sIHsKKwkJLm5hbWUgPSAiMzItYml0IFJHQiIsCisJCS5wYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IzMiwKKyNpZmRlZiBIQVZFX1Y0TDIKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9CR1IzMiwKKyNlbHNlCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfUkdCMzIsCisjZW5kaWYKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKyNlbmRpZgorCQkuZGVwdGggPSAzMiwKKwkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAorCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAorCX0sIHsKKwkJLm5hbWUgPSAiNDoyOjIsIHBhY2tlZCwgWVVZViIsCisJCS5wYWxldHRlID0gVklERU9fUEFMRVRURV9ZVVY0MjIsCisjaWZkZWYgSEFWRV9WNEwyCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVZViwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNLAorI2VuZGlmCisJCS5kZXB0aCA9IDE2LAorCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8CisJCSAgICAgICAgIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAorCX0sIHsKKwkJLm5hbWUgPSAiSGFyZHdhcmUtZW5jb2RlZCBNb3Rpb24tSlBFRyIsCisJCS5wYWxldHRlID0gLTEsCisjaWZkZWYgSEFWRV9WNEwyCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTUpQRUcsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSwKKyNlbmRpZgorCQkuZGVwdGggPSAwLAorCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8CisJCQkgWk9SQU5fRk9STUFUX1BMQVlCQUNLIHwKKwkJCSBaT1JBTl9GT1JNQVRfQ09NUFJFU1NFRCwKKwl9Cit9Oworc3RhdGljIGNvbnN0IGludCB6b3Jhbl9udW1fZm9ybWF0cyA9CisgICAgKHNpemVvZih6b3Jhbl9mb3JtYXRzKSAvIHNpemVvZihzdHJ1Y3Qgem9yYW5fZm9ybWF0KSk7CisKKy8vIFJKOiBUZXN0IG9ubHkgLSB3YW50IHRvIHRlc3QgQlVaX1VTRV9ISU1FTSBldmVuIHdoZW4gQ09ORklHX0JJR1BIWVNfQVJFQSBpcyBkZWZpbmVkCisjaWYgIWRlZmluZWQoQ09ORklHX0JJR1BIWVNfQVJFQSkKKy8vI3VuZGVmIENPTkZJR19CSUdQSFlTX0FSRUEKKyNkZWZpbmUgQlVaX1VTRV9ISU1FTQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CSUdQSFlTX0FSRUEpCisjICAgaW5jbHVkZSA8bGludXgvYmlncGh5c2FyZWEuaD4KKyNlbmRpZgorCitleHRlcm4gaW50ICp6cl9kZWJ1ZzsKKworI2RlZmluZSBkcHJpbnRrKG51bSwgZm9ybWF0LCBhcmdzLi4uKSBcCisJZG8geyBcCisJCWlmICgqenJfZGVidWcgPj0gbnVtKSBcCisJCQlwcmludGsoZm9ybWF0LCAjI2FyZ3MpOwlcCisJfSB3aGlsZSAoMCkKKworZXh0ZXJuIGludCB2NGxfbmJ1ZnM7CitleHRlcm4gaW50IHY0bF9idWZzaXplOworZXh0ZXJuIGludCBqcGdfbmJ1ZnM7CitleHRlcm4gaW50IGpwZ19idWZzaXplOworZXh0ZXJuIGludCBwYXNzX3Rocm91Z2g7CisKK3N0YXRpYyBpbnQgbG9ja19ub3JtID0gMDsJLyogMT1Eb24ndCBjaGFuZ2UgVFYgc3RhbmRhcmQgKG5vcm0pICovCittb2R1bGVfcGFyYW0obG9ja19ub3JtLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhsb2NrX25vcm0sICJVc2VycyBjYW4ndCBjaGFuZ2Ugbm9ybSIpOworCisjaWZkZWYgSEFWRV9WNEwyCisJLyogc21hbGwgaGVscGVyIGZ1bmN0aW9uIGZvciBjYWxjdWxhdGluZyBidWZmZXJzaXplcyBmb3IgdjRsMgorCSAqIHdlIGNhbGN1bGF0ZSB0aGUgbmVhcmVzdCBoaWdoZXIgcG93ZXItb2YtdHdvLCB3aGljaAorCSAqIHdpbGwgYmUgdGhlIHJlY29tbWVuZGVkIGJ1ZmZlcnNpemUgKi8KK3N0YXRpYyBfX3UzMgorem9yYW5fdjRsMl9jYWxjX2J1ZnNpemUgKHN0cnVjdCB6b3Jhbl9qcGdfc2V0dGluZ3MgKnNldHRpbmdzKQoreworCV9fdTggZGl2ID0gc2V0dGluZ3MtPlZlckRjbSAqIHNldHRpbmdzLT5Ib3JEY20gKiBzZXR0aW5ncy0+VG1wRGNtOworCV9fdTMyIG51bSA9ICgxMDI0ICogNTEyKSAvIChkaXYpOworCV9fdTMyIHJlc3VsdCA9IDI7CisKKwludW0tLTsKKwl3aGlsZSAobnVtKSB7CisJCW51bSA+Pj0gMTsKKwkJcmVzdWx0IDw8PSAxOworCX0KKworCWlmIChyZXN1bHQgPiBqcGdfYnVmc2l6ZSkKKwkJcmV0dXJuIGpwZ19idWZzaXplOworCWlmIChyZXN1bHQgPCA4MTkyKQorCQlyZXR1cm4gODE5MjsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKy8qIGZvcndhcmQgcmVmZXJlbmNlcyAqLworc3RhdGljIHZvaWQgdjRsX2ZidWZmZXJfZnJlZShzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCBqcGdfZmJ1ZmZlcl9mcmVlKHN0cnVjdCBmaWxlICpmaWxlKTsKKworLyoKKyAqICAgQWxsb2NhdGUgdGhlIFY0TCBncmFiIGJ1ZmZlcnMKKyAqCisgKiAgIFRoZXNlIGhhdmUgdG8gYmUgcHlzaWNhbGx5IGNvbnRpZ3VvdXMuCisgKiAgIElmIHY0bF9idWZzaXplIDw9IE1BWF9LTUFMTE9DX01FTSB3ZSB1c2Uga21hbGxvYworICogICBlbHNlIHdlIHRyeSB0byBhbGxvY2F0ZSB0aGVtIHdpdGggYmlncGh5c2FyZWFfYWxsb2NfcGFnZXMKKyAqICAgaWYgdGhlIGJpZ3BoeXNhcmVhIHBhdGNoIGlzIHByZXNlbnQgaW4gdGhlIGtlcm5lbCwKKyAqICAgZWxzZSB3ZSB0cnkgdG8gdXNlIGhpZ2ggbWVtb3J5IChpZiB0aGUgdXNlciBoYXMgYm9vdGV0CisgKiAgIExpbnV4IHdpdGggdGhlIG5lY2Vzc2FyeSBtZW1vcnkgbGVmdCBvdmVyKS4KKyAqLworCisjaWYgZGVmaW5lZChCVVpfVVNFX0hJTUVNKSAmJiAhZGVmaW5lZChDT05GSUdfQklHUEhZU19BUkVBKQorc3RhdGljIHVuc2lnbmVkIGxvbmcKK2dldF9oaWdoX21lbSAodW5zaWduZWQgbG9uZyBzaXplKQoreworLyoKKyAqIENoZWNrIGlmIHRoZXJlIGlzIHVzYWJsZSBtZW1vcnkgYXQgdGhlIGVuZCBvZiBMaW51eCBtZW1vcnkKKyAqIG9mIGF0IGxlYXN0IHNpemUuIFJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIG1lbW9yeSwKKyAqIHJldHVybiAwIG9uIGZhaWx1cmUuCisgKgorICogVGhlIGlkZWEgaXMgZnJvbSBBbGV4YW5kcm8gUnViaW5pJ3MgYm9vayAiTGludXggZGV2aWNlIGRyaXZlcnMiLgorICogVGhlIGRyaXZlciBmcm9tIGhpbSB3aGljaCBpcyBkb3dubG9hZGFibGUgZnJvbSBPJ1JlaWxseSdzCisgKiB3ZWIgc2l0ZSBtaXNzZXMgdGhlICJ2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpIiBwYXJ0CisgKiAoYW5kIHRoZXJlZm9yZSBkb2Vzbid0IHdvcmsgYXQgYWxsIC0gYXQgbGVhc3Qgd2l0aCAyLjIueCBrZXJuZWxzKS4KKyAqCisgKiBJdCBzaG91bGQgYmUgdW5uZWNlc3NhcnkgdG8gbWVudGlvbiB0aGF0IFRISVMgSVMgREFOR0VST1VTLAorICogaWYgbW9yZSB0aGFuIG9uZSBkcml2ZXIgYXQgYSB0aW1lIGhhcyB0aGUgaWRlYSB0byB1c2UgdGhpcyBtZW1vcnkhISEhCisgKi8KKworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqbWVtOworCXVuc2lnbmVkIGNoYXIgYzsKKwl1bnNpZ25lZCBsb25nIGhpX21lbV9waDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwkvKiBNYXAgdGhlIGhpZ2ggbWVtb3J5IHRvIHVzZXIgc3BhY2UgKi8KKworCWhpX21lbV9waCA9IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSk7CisKKwltZW0gPSBpb3JlbWFwKGhpX21lbV9waCwgc2l6ZSk7CisJaWYgKCFtZW0pIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIgIiVzOiBnZXRfaGlnaF9tZW0oKSAtIGlvcmVtYXAgZmFpbGVkXG4iLAorCQkJWk9SQU5fTkFNRSk7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJLyogQ2hlY2sgaWYgaXQgaXMgbWVtb3J5ICovCisJCWMgPSBpICYgMHhmZjsKKwkJd3JpdGViKGMsIG1lbSArIGkpOworCQlpZiAocmVhZGIobWVtICsgaSkgIT0gYykKKwkJCWJyZWFrOworCQljID0gMjU1IC0gYzsKKwkJd3JpdGViKGMsIG1lbSArIGkpOworCQlpZiAocmVhZGIobWVtICsgaSkgIT0gYykKKwkJCWJyZWFrOworCQl3cml0ZWIoMCwgbWVtICsgaSk7CS8qIHplcm8gb3V0IG1lbW9yeSAqLworCisJCS8qIGdpdmUgdGhlIGtlcm5lbCBhaXIgdG8gYnJlYXRoICovCisJCWlmICgoaSAmIDB4M2ZmZmYpID09IDB4M2ZmZmYpCisJCQlzY2hlZHVsZSgpOworCX0KKworCWlvdW5tYXAobWVtKTsKKworCWlmIChpICE9IHNpemUpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogZ2V0X2hpZ2hfbWVtKCkgLSByZXF1ZXN0ZWQgJWx1LCBhdmFpbCAlbHVcbiIsCisJCQlaT1JBTl9OQU1FLCBzaXplLCBpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGhpX21lbV9waDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50Cit2NGxfZmJ1ZmZlcl9hbGxvYyAoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCWludCBpLCBvZmY7CisJdW5zaWduZWQgY2hhciAqbWVtOworI2lmIGRlZmluZWQoQlVaX1VTRV9ISU1FTSkgJiYgIWRlZmluZWQoQ09ORklHX0JJR1BIWVNfQVJFQSkKKwl1bnNpZ25lZCBsb25nIHBtZW0gPSAwOworI2VuZGlmCisKKwkvKiB3ZSBtaWdodCBoYXZlIG9sZCBidWZmZXJzIGx5aW5nIGFyb3VuZC4uLiAqLworCWlmIChmaC0+djRsX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQpIHsKKwkJdjRsX2ZidWZmZXJfZnJlZShmaWxlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzOyBpKyspIHsKKwkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlcikKKwkJCWRwcmludGsoMiwKKwkJCQlLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IHY0bF9mYnVmZmVyX2FsbG9jKCkgLSBidWZmZXIgJWQgYWxscmVhZHkgYWxsb2NhdGVkIT9cbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGkpOworCisJCS8vdWRlbGF5KDIwKTsKKwkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSA8PSBNQVhfS01BTExPQ19NRU0pIHsKKwkJCS8qIFVzZSBrbWFsbG9jICovCisKKwkJCW1lbSA9CisJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyhmaC0+djRsX2J1ZmZlcnMuCisJCQkJCQkgICAgICBidWZmZXJfc2l6ZSwKKwkJCQkJCSAgICAgIEdGUF9LRVJORUwpOworCQkJaWYgKG1lbSA9PSAwKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IHY0bF9mYnVmZmVyX2FsbG9jKCkgLSBrbWFsbG9jIGZvciBWNEwgYnVmICVkIGZhaWxlZFxuIiwKKwkJCQkJWlJfREVWTkFNRSh6ciksIGkpOworCQkJCXY0bF9mYnVmZmVyX2ZyZWUoZmlsZSk7CisJCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJfQorCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyID0gbWVtOworCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyX3BoeXMgPQorCQkJICAgIHZpcnRfdG9fcGh5cyhtZW0pOworCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyX2J1cyA9CisJCQkgICAgdmlydF90b19idXMobWVtKTsKKwkJCWZvciAob2ZmID0gMDsgb2ZmIDwgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOworCQkJICAgICBvZmYgKz0gUEFHRV9TSVpFKQorCQkJCVNldFBhZ2VSZXNlcnZlZChNQVBfTlIobWVtICsgb2ZmKSk7CisJCQlkcHJpbnRrKDQsCisJCQkJS0VSTl9JTkZPCisJCQkJIiVzOiB2NGxfZmJ1ZmZlcl9hbGxvYygpIC0gVjRMIGZyYW1lICVkIG1lbSAweCVseCAoYnVzOiAweCVseClcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGksICh1bnNpZ25lZCBsb25nKSBtZW0sCisJCQkJdmlydF90b19idXMobWVtKSk7CisJCX0gZWxzZSB7CisjaWYgZGVmaW5lZChDT05GSUdfQklHUEhZU19BUkVBKQorCQkJLyogVXNlIGJpZ3BoeXNhcmVhX2FsbG9jX3BhZ2VzICovCisKKwkJCWludCBuID0KKwkJCSAgICAoZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplICsgUEFHRV9TSVpFIC0KKwkJCSAgICAgMSkgLyBQQUdFX1NJWkU7CisKKwkJCW1lbSA9CisJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgYmlncGh5c2FyZWFfYWxsb2NfcGFnZXMobiwgMCwKKwkJCQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAobWVtID09IDApIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogdjRsX2ZidWZmZXJfYWxsb2MoKSAtIGJpZ3BoeXNhcmVhX2FsbG9jX3BhZ2VzIGZvciBWNEwgYnVmICVkIGZhaWxlZFxuIiwKKwkJCQkJWlJfREVWTkFNRSh6ciksIGkpOworCQkJCXY0bF9mYnVmZmVyX2ZyZWUoZmlsZSk7CisJCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJfQorCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyID0gbWVtOworCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyX3BoeXMgPQorCQkJICAgIHZpcnRfdG9fcGh5cyhtZW0pOworCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyX2J1cyA9CisJCQkgICAgdmlydF90b19idXMobWVtKTsKKwkJCWRwcmludGsoNCwKKwkJCQlLRVJOX0lORk8KKwkJCQkiJXM6IEJpZ3BoeXNhcmVhIGZyYW1lICVkIG1lbSAweCV4IChidXM6IDB4JXgpXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBpLCAodW5zaWduZWQpIG1lbSwKKwkJCQkodW5zaWduZWQpIHZpcnRfdG9fYnVzKG1lbSkpOworCisJCQkvKiBaZXJvIG91dCB0aGUgYWxsb2NhdGVkIG1lbW9yeSAqLworCQkJbWVtc2V0KGZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlciwgMCwKKwkJCSAgICAgICBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUpOworI2VsaWYgZGVmaW5lZChCVVpfVVNFX0hJTUVNKQorCisJCQkvKiBVc2UgaGlnaCBtZW1vcnkgd2hpY2ggaGFzIGJlZW4gbGVmdCBhdCBib290IHRpbWUgKi8KKworCQkJLyogT2suLCBPay4gdGhpcyBpcyBhbiBldmlsIGhhY2sgLSB3ZSBtYWtlCisJCQkgKiB0aGUgYXNzdW1wdGlvbiB0aGF0IHBoeXNpY2FsIGFkZHJlc3NlcyBhcmUKKwkJCSAqIHRoZSBzYW1lIGFzIGJ1cyBhZGRyZXNzZXMgKHRydWUgYXQgbGVhc3QKKwkJCSAqIGZvciBJbnRlbCBwcm9jZXNzb3JzKS4gVGhlIHdob2xlIG1ldGhvZCBvZgorCQkJICogb2J0YWluaW5nIGFuZCB1c2luZyB0aGlzIG1lbW9yeSBpcyBub3QgdmVyeQorCQkJICogbmljZSAtIGJ1dCBJIGhvcGUgaXQgc2F2ZXMgc29tZSBwb29yIHVzZXJzCisJCQkgKiBmcm9tIGtlcm5lbCBoYWNraW5nLCB3aGljaCBtaWdodCBoYXZlIGV2ZW4KKwkJCSAqIG1vcmUgZXZpbCByZXN1bHRzICovCisKKwkJCWlmIChpID09IDApIHsKKwkJCQlpbnQgc2l6ZSA9CisJCQkJICAgIGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyAqCisJCQkJICAgIGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZTsKKworCQkJCXBtZW0gPSBnZXRfaGlnaF9tZW0oc2l6ZSk7CisJCQkJaWYgKHBtZW0gPT0gMCkgeworCQkJCQlkcHJpbnRrKDEsCisJCQkJCQlLRVJOX0VSUgorCQkJCQkJIiVzOiB2NGxfZmJ1ZmZlcl9hbGxvYygpIC0gZ2V0X2hpZ2hfbWVtIChzaXplID0gJWQgS0IpIGZvciBWNEwgYnVmcyBmYWlsZWRcbiIsCisJCQkJCQlaUl9ERVZOQU1FKHpyKSwgc2l6ZSA+PiAxMCk7CisJCQkJCXJldHVybiAtRU5PQlVGUzsKKwkJCQl9CisJCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlclswXS5mYnVmZmVyID0gTlVMTDsKKwkJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyWzBdLmZidWZmZXJfcGh5cyA9IHBtZW07CisJCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlclswXS5mYnVmZmVyX2J1cyA9IHBtZW07CisJCQkJZHByaW50ayg0LAorCQkJCQlLRVJOX0lORk8KKwkJCQkJIiVzOiB2NGxfZmJ1ZmZlcl9hbGxvYygpIC0gdXNpbmcgJWQgS0IgaGlnaCBtZW1vcnlcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBzaXplID4+IDEwKTsKKwkJCX0gZWxzZSB7CisJCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyID0gTlVMTDsKKwkJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXJfcGh5cyA9CisJCQkJICAgIHBtZW0gKyBpICogZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOworCQkJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlcl9idXMgPQorCQkJCSAgICBwbWVtICsgaSAqIGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZTsKKwkJCX0KKyNlbHNlCisJCQkvKiBObyBiaWdwaHlzYXJlYSBwcmVzZW50LCB1c2FnZSBvZiBoaWdoIG1lbW9yeSBkaXNhYmxlZCwKKwkJCSAqIGJ1dCB1c2VyIHdhbnRzIGJ1ZmZlcnMgb2YgbW9yZSB0aGFuIE1BWF9LTUFMTE9DX01FTSAqLworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiB2NGxfZmJ1ZmZlcl9hbGxvYygpIC0gbm8gYmlncGh5c2FyZWFfcGF0Y2ggcHJlc2VudCwgdXNhZ2Ugb2YgaGlnaCBtZW1vcnkgZGlzYWJsZWQsXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogdjRsX2ZidWZmZXJfYWxsb2MoKSAtIHNvcnJ5LCBjb3VsZCBub3QgYWxsb2NhdGUgJWQgVjRMIGJ1ZmZlcnMgb2Ygc2l6ZSAlZCBLQi5cbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycywKKwkJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUgPj4gMTApOworCQkJcmV0dXJuIC1FTk9CVUZTOworI2VuZGlmCisJCX0KKwl9CisKKwlmaC0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKiBmcmVlIHRoZSBWNEwgZ3JhYiBidWZmZXJzICovCitzdGF0aWMgdm9pZAordjRsX2ZidWZmZXJfZnJlZSAoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCWludCBpLCBvZmY7CisJdW5zaWduZWQgY2hhciAqbWVtOworCisJZHByaW50ayg0LCBLRVJOX0lORk8gIiVzOiB2NGxfZmJ1ZmZlcl9mcmVlKClcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCWZvciAoaSA9IDA7IGkgPCBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykgeworCQlpZiAoIWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlcikKKwkJCWNvbnRpbnVlOworCisJCWlmIChmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUgPD0gTUFYX0tNQUxMT0NfTUVNKSB7CisJCQltZW0gPSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXI7CisJCQlmb3IgKG9mZiA9IDA7IG9mZiA8IGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZTsKKwkJCSAgICAgb2ZmICs9IFBBR0VfU0laRSkKKwkJCQlDbGVhclBhZ2VSZXNlcnZlZChNQVBfTlIobWVtICsgb2ZmKSk7CisJCQlrZnJlZSgodm9pZCAqKSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXIpOworCQl9CisjaWYgZGVmaW5lZChDT05GSUdfQklHUEhZU19BUkVBKQorCQllbHNlCisJCQliaWdwaHlzYXJlYV9mcmVlX3BhZ2VzKCh2b2lkICopIGZoLT52NGxfYnVmZmVycy4KKwkJCQkJICAgICAgIGJ1ZmZlcltpXS5mYnVmZmVyKTsKKyNlbmRpZgorCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXIgPSBOVUxMOworCX0KKworCWZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOworCWZoLT52NGxfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCA9IDA7Cit9CisKKy8qCisgKiAgIEFsbG9jYXRlIHRoZSBNSlBFRyBncmFiIGJ1ZmZlcnMuCisgKgorICogICBJZiB0aGUgcmVxdWVzdGVkIGJ1ZmZlciBzaXplIGlzIHNtYWxsZXIgdGhhbiBNQVhfS01BTExPQ19NRU0sCisgKiAgIGttYWxsb2MgaXMgdXNlZCB0byByZXF1ZXN0IGEgcGh5c2ljYWxseSBjb250aWd1b3VzIGFyZWEsCisgKiAgIGVsc2Ugd2UgYWxsb2NhdGUgdGhlIG1lbW9yeSBpbiBmcmFtZ2VudHMgd2l0aCBnZXRfemVyb2VkX3BhZ2UuCisgKgorICogICBJZiBhIE5hdG9tYSBjaGlwc2V0IGlzIHByZXNlbnQgYW5kIHRoaXMgaXMgYSByZXZpc2lvbiAxIHpyMzYwNTcsCisgKiAgIGVhY2ggTUpQRUcgYnVmZmVyIG5lZWRzIHRvIGJlIHBoeXNpY2FsbHkgY29udGlndW91cy4KKyAqICAgKFJKOiBUaGlzIHN0YXRlbWVudCBpcyBmcm9tIERhdmUgUGVya3MnIG9yaWdpbmFsIGRyaXZlciwKKyAqICAgSSBjb3VsZCBuZXZlciBjaGVjayBpdCBiZWNhdXNlIEkgaGF2ZSBhIHpyMzYwNjcpCisgKiAgIFRoZSBkcml2ZXIgY2FyZXMgYWJvdXQgdGhpcyBiZWNhdXNlIGl0IHJlZHVjZXMgdGhlIGJ1ZmZlcgorICogICBzaXplIHRvIE1BWF9LTUFMTE9DX01FTSBpbiB0aGF0IGNhc2UgKHdoaWNoIGZvcmNlcyBjb250aWd1b3VzIGFsbG9jYXRpb24pLgorICoKKyAqICAgUko6IFRoZSBjb250ZW50cyBncmFiIGJ1ZmZlcnMgbmVlZHMgbmV2ZXIgYmUgYWNjZXNzZWQgaW4gdGhlIGRyaXZlci4KKyAqICAgICAgIFRoZXJlZm9yZSB0aGVyZSBpcyBubyBuZWVkIHRvIGFsbG9jYXRlIHRoZW0gd2l0aCB2bWFsbG9jIGluIG9yZGVyCisgKiAgICAgICB0byBnZXQgYSBjb250aWd1b3VzIHZpcnR1YWwgbWVtb3J5IHNwYWNlLgorICogICAgICAgSSBkb24ndCB1bmRlcnN0YW5kIHdoeSBtYW55IG90aGVyIGRyaXZlcnMgZmlyc3QgYWxsb2NhdGUgdGhlbSB3aXRoCisgKiAgICAgICB2bWFsbG9jICh3aGljaCB1c2VzIGludGVybmFsbHkgYWxzbyBnZXRfemVyb2VkX3BhZ2UsIGJ1dCBkZWxpdmVycyB5b3UKKyAqICAgICAgIHZpcnR1YWwgYWRkcmVzc2VzKSBhbmQgdGhlbiBhZ2FpbiBoYXZlIHRvIG1ha2UgYSBsb3Qgb2YgZWZmb3J0cworICogICAgICAgdG8gZ2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzLgorICoKKyAqICAgQmVuIENhcHBlcjoKKyAqICAgICAgIE9uIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcyAoc3VjaCBhcyBwcGMpIHNvbWUgZXh0cmEgc3RlcHMKKyAqICAgICAgIGFyZSBuZWVkZWQuIFdoZW4gcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgc3RhdF9jb20gYXJyYXkKKyAqICAgICAgIGFuZCBmcmFnbWVudCBidWZmZXJzLCB0aGUgZGV2aWNlIGV4cGVjdHMgdG8gc2VlIGxpdHRsZS0KKyAqICAgICAgIGVuZGlhbiB2YWx1ZXMuIFRoZSB1c2Ugb2YgY3B1X3RvX2xlMzIoKSBhbmQgbGUzMl90b19jcHUoKQorICogICAgICAgaW4gdGhpcyBmdW5jdGlvbiAoYW5kIG9uZSBvciB0d28gb3RoZXJzIGluIHpvcmFuX2RldmljZS5jKQorICogICAgICAgZW5zdXJlIHRoYXQgdGhlc2UgdmFsdWVzIGFyZSBhbHdheXMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4KKyAqICAgICAgIGZvcm0sIHJlZ2FyZGxlc3Mgb2YgYXJjaGl0ZWN0dXJlLiBUaGUgenIzNjA1NyBkb2VzIFZlcnkgQmFkCisgKiAgICAgICBUaGluZ3Mgb24gYmlnIGVuZGlhbiBhcmNoaXRlY3R1cmVzIGlmIHRoZSBzdGF0X2NvbSBhcnJheQorICogICAgICAgYW5kIGZyYWdtZW50IGJ1ZmZlcnMgYXJlIG5vdCBsaXR0bGUtZW5kaWFuLgorICovCisKK3N0YXRpYyBpbnQKK2pwZ19mYnVmZmVyX2FsbG9jIChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisJaW50IGksIGosIG9mZjsKKwl1bnNpZ25lZCBsb25nIG1lbTsKKworCS8qIHdlIG1pZ2h0IGhhdmUgb2xkIGJ1ZmZlcnMgbHlpbmcgYXJvdW5kICovCisJaWYgKGZoLT5qcGdfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCkgeworCQlqcGdfZmJ1ZmZlcl9mcmVlKGZpbGUpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykgeworCQlpZiAoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYikKKwkJCWRwcmludGsoMiwKKwkJCQlLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IGpwZ19mYnVmZmVyX2FsbG9jKCkgLSBidWZmZXIgJWQgYWxscmVhZHkgYWxsb2NhdGVkIT9cbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGkpOworCisJCS8qIEFsbG9jYXRlIGZyYWdtZW50IHRhYmxlIGZvciB0aGlzIGJ1ZmZlciAqLworCisJCW1lbSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKG1lbSA9PSAwKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IGpwZ19mYnVmZmVyX2FsbG9jKCkgLSBnZXRfemVyb2VkX3BhZ2UgKGZyYWdfdGFiKSBmYWlsZWQgZm9yIGJ1ZmZlciAlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgaSk7CisJCQlqcGdfZmJ1ZmZlcl9mcmVlKGZpbGUpOworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCW1lbXNldCgodm9pZCAqKSBtZW0sIDAsIFBBR0VfU0laRSk7CisJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWIgPSAodTMyICopIG1lbTsKKwkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYl9idXMgPQorCQkgICAgdmlydF90b19idXMoKHZvaWQgKikgbWVtKTsKKworCQkvL2lmIChhbGxvY19jb250aWcpIHsKKwkJaWYgKGZoLT5qcGdfYnVmZmVycy5uZWVkX2NvbnRpZ3VvdXMpIHsKKwkJCW1lbSA9CisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIGttYWxsb2MoZmgtPmpwZ19idWZmZXJzLgorCQkJCQkJICAgIGJ1ZmZlcl9zaXplLAorCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJaWYgKG1lbSA9PSAwKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IGpwZ19mYnVmZmVyX2FsbG9jKCkgLSBrbWFsbG9jIGZhaWxlZCBmb3IgYnVmZmVyICVkXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgaSk7CisJCQkJanBnX2ZidWZmZXJfZnJlZShmaWxlKTsKKwkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQl9CisJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiWzBdID0KKwkJCSAgICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygodm9pZCAqKSBtZW0pKTsKKwkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMV0gPQorCQkJICAgIGNwdV90b19sZTMyKCgoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplIC8gNCkgPDwgMSkgfCAxKTsKKwkJCWZvciAob2ZmID0gMDsgb2ZmIDwgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplOworCQkJICAgICBvZmYgKz0gUEFHRV9TSVpFKQorCQkJCVNldFBhZ2VSZXNlcnZlZChNQVBfTlIobWVtICsgb2ZmKSk7CisJCX0gZWxzZSB7CisJCQkvKiBqcGdfYnVmc2l6ZSBpcyBhbGxyZWF5IHBhZ2UgYWxpZ25lZCAqLworCQkJZm9yIChqID0gMDsKKwkJCSAgICAgaiA8IGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSAvIFBBR0VfU0laRTsKKwkJCSAgICAgaisrKSB7CisJCQkJbWVtID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQkJCWlmIChtZW0gPT0gMCkgeworCQkJCQlkcHJpbnRrKDEsCisJCQkJCQlLRVJOX0VSUgorCQkJCQkJIiVzOiBqcGdfZmJ1ZmZlcl9hbGxvYygpIC0gZ2V0X3plcm9lZF9wYWdlIGZhaWxlZCBmb3IgYnVmZmVyICVkXG4iLAorCQkJCQkJWlJfREVWTkFNRSh6ciksIGkpOworCQkJCQlqcGdfZmJ1ZmZlcl9mcmVlKGZpbGUpOworCQkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQkJfQorCisJCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlsyICogal0gPQorCQkJCSAgICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygodm9pZCAqKSBtZW0pKTsKKwkJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiWzIgKiBqICsKKwkJCQkJCQkJICAgMV0gPQorCQkJCSAgICBjcHVfdG9fbGUzMigoUEFHRV9TSVpFIC8gNCkgPDwgMSk7CisJCQkJU2V0UGFnZVJlc2VydmVkKE1BUF9OUihtZW0pKTsKKwkJCX0KKworCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlsyICogaiAtIDFdIHw9IGNwdV90b19sZTMyKDEpOworCQl9CisJfQorCisJZHByaW50ayg0LAorCQlLRVJOX0RFQlVHICIlczoganBnX2ZidWZmZXJfYWxsb2MoKSAtICVkIEtCIGFsbG9jYXRlZFxuIiwKKwkJWlJfREVWTkFNRSh6ciksCisJCShmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMgKgorCQkgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplKSA+PiAxMCk7CisKKwlmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKiBmcmVlIHRoZSBNSlBFRyBncmFiIGJ1ZmZlcnMgKi8KK3N0YXRpYyB2b2lkCitqcGdfZmJ1ZmZlcl9mcmVlIChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisJaW50IGksIGosIG9mZjsKKwl1bnNpZ25lZCBjaGFyICptZW07CisKKwlkcHJpbnRrKDQsIEtFUk5fREVCVUcgIiVzOiBqcGdfZmJ1ZmZlcl9mcmVlKClcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCWZvciAoaSA9IDA7IGkgPCBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykgeworCQlpZiAoIWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWIpCisJCQljb250aW51ZTsKKworCQkvL2lmIChhbGxvY19jb250aWcpIHsKKwkJaWYgKGZoLT5qcGdfYnVmZmVycy5uZWVkX2NvbnRpZ3VvdXMpIHsKKwkJCWlmIChmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiWzBdKSB7CisJCQkJbWVtID0gKHVuc2lnbmVkIGNoYXIgKikgYnVzX3RvX3ZpcnQobGUzMl90b19jcHUoCisJCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMF0pKTsKKwkJCQlmb3IgKG9mZiA9IDA7CisJCQkJICAgICBvZmYgPCBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemU7CisJCQkJICAgICBvZmYgKz0gUEFHRV9TSVpFKQorCQkJCQlDbGVhclBhZ2VSZXNlcnZlZChNQVBfTlIKKwkJCQkJCQkgIChtZW0gKyBvZmYpKTsKKwkJCQlrZnJlZSgodm9pZCAqKSBtZW0pOworCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMF0gPSAwOworCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMV0gPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJZm9yIChqID0gMDsKKwkJCSAgICAgaiA8IGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSAvIFBBR0VfU0laRTsKKwkJCSAgICAgaisrKSB7CisJCQkJaWYgKCFmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLgorCQkJCSAgICBmcmFnX3RhYlsyICogal0pCisJCQkJCWJyZWFrOworCQkJCUNsZWFyUGFnZVJlc2VydmVkKE1BUF9OUgorCQkJCQkJICAoYnVzX3RvX3ZpcnQKKwkJCQkJCSAgIChsZTMyX3RvX2NwdQorCQkJCQkJICAgIChmaC0+anBnX2J1ZmZlcnMuCisJCQkJCQkgICAgIGJ1ZmZlcltpXS5mcmFnX3RhYlsyICoKKwkJCQkJCQkJICAgICAgIGpdKSkpKTsKKwkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpCisJCQkJCSAgYnVzX3RvX3ZpcnQKKwkJCQkJICAgICAgICAgIChsZTMyX3RvX2NwdQorCQkJCQkJICAgKGZoLT5qcGdfYnVmZmVycy4KKwkJCQkJCSAgICAgIGJ1ZmZlcltpXS4KKwkJCQkJCSAgICAgIGZyYWdfdGFiWzIgKiBqXSkpKTsKKwkJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiWzIgKiBqXSA9CisJCQkJICAgIDA7CisJCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlsyICogaiArCisJCQkJCQkJCSAgIDFdID0gMDsKKwkJCX0KKwkJfQorCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS4KKwkJCSAgZnJhZ190YWIpOworCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiID0gTlVMTDsKKwl9CisKKwlmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwlmaC0+anBnX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQgPSAwOworfQorCisvKgorICogICBWNEwgQnVmZmVyIGdyYWJiaW5nCisgKi8KKworc3RhdGljIGludAorem9yYW5fdjRsX3NldF9mb3JtYXQgKHN0cnVjdCBmaWxlICAgICAgICAgICAgICAgKmZpbGUsCisJCSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorCQkgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisJCSAgICAgIGNvbnN0IHN0cnVjdCB6b3Jhbl9mb3JtYXQgKmZvcm1hdCkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisJaW50IGJwcDsKKworCS8qIENoZWNrIHNpemUgYW5kIGZvcm1hdCBvZiB0aGUgZ3JhYiB3YW50ZWQgKi8KKworCWlmIChoZWlnaHQgPCBCVVpfTUlOX0hFSUdIVCB8fCB3aWR0aCA8IEJVWl9NSU5fV0lEVEggfHwKKwkgICAgaGVpZ2h0ID4gQlVaX01BWF9IRUlHSFQgfHwgd2lkdGggPiBCVVpfTUFYX1dJRFRIKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHY0bF9zZXRfZm9ybWF0KCkgLSB3cm9uZyBmcmFtZSBzaXplICglZHglZClcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgd2lkdGgsIGhlaWdodCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJwcCA9IChmb3JtYXQtPmRlcHRoICsgNykgLyA4OworCisJLyogQ2hlY2sgYWdhaW5zdCBhdmFpbGFibGUgYnVmZmVyIHNpemUgKi8KKwlpZiAoaGVpZ2h0ICogd2lkdGggKiBicHAgPiBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogdjRsX3NldF9mb3JtYXQoKSAtIHZpZGVvIGJ1ZmZlciBzaXplICglZCBrQikgaXMgdG9vIHNtYWxsXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSA+PiAxMCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRoZSB2aWRlbyBmcm9udCBlbmQgbmVlZHMgNC1ieXRlIGFsaW5nZWQgbGluZSBzaXplcyAqLworCisJaWYgKChicHAgPT0gMiAmJiAod2lkdGggJiAxKSkgfHwgKGJwcCA9PSAzICYmICh3aWR0aCAmIDMpKSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB2NGxfc2V0X2Zvcm1hdCgpIC0gd3JvbmcgZnJhbWUgYWxpbmdtZW50XG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmaC0+djRsX3NldHRpbmdzLndpZHRoID0gd2lkdGg7CisJZmgtPnY0bF9zZXR0aW5ncy5oZWlnaHQgPSBoZWlnaHQ7CisJZmgtPnY0bF9zZXR0aW5ncy5mb3JtYXQgPSBmb3JtYXQ7CisJZmgtPnY0bF9zZXR0aW5ncy5ieXRlc3BlcmxpbmUgPSBicHAgKiBmaC0+djRsX3NldHRpbmdzLndpZHRoOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3pvcmFuX3Y0bF9xdWV1ZV9mcmFtZSAoc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICBpbnQgICAgICAgICAgbnVtKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXMgPSAwOworCisJaWYgKCFmaC0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHY0bF9xdWV1ZV9mcmFtZSgpIC0gYnVmZmVycyBub3QgeWV0IGFsbG9jYXRlZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmVzID0gLUVOT01FTTsKKwl9CisKKwkvKiBObyBncmFiYmluZyBvdXRzaWRlIHRoZSBidWZmZXIgcmFuZ2UhICovCisJaWYgKG51bSA+PSBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnMgfHwgbnVtIDwgMCkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB2NGxfcXVldWVfZnJhbWUoKSAtIGJ1ZmZlciAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgbnVtKTsKKwkJcmVzID0gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7CisJCWlmICh6ci0+djRsX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKKwkJCXpyLT52NGxfYnVmZmVycyA9IGZoLT52NGxfYnVmZmVyczsKKwkJCWZoLT52NGxfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9BQ1RJVkU7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IHY0bF9xdWV1ZV9mcmFtZSgpIC0gYW5vdGhlciBzZXNzaW9uIGlzIGFscmVhZHkgY2FwdHVyaW5nXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FQlVTWTsKKwkJfQorCX0KKworCS8qIG1ha2Ugc3VyZSBhIGdyYWIgaXNuJ3QgZ29pbmcgb24gY3VycmVudGx5IHdpdGggdGhpcyBidWZmZXIgKi8KKwlpZiAoIXJlcykgeworCQlzd2l0Y2ggKHpyLT52NGxfYnVmZmVycy5idWZmZXJbbnVtXS5zdGF0ZSkgeworCQlkZWZhdWx0OgorCQljYXNlIEJVWl9TVEFURV9QRU5EOgorCQkJaWYgKHpyLT52NGxfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkgeworCQkJCWZoLT52NGxfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOworCQkJCXpyLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOworCQkJfQorCQkJcmVzID0gLUVCVVNZOwkvKiB3aGF0IGFyZSB5b3UgZG9pbmc/ICovCisJCQlicmVhazsKKwkJY2FzZSBCVVpfU1RBVEVfRE9ORToKKwkJCWRwcmludGsoMiwKKwkJCQlLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IHY0bF9xdWV1ZV9mcmFtZSgpIC0gcXVldWVpbmcgYnVmZmVyICVkIGluIHN0YXRlIERPTkUhP1xuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgbnVtKTsKKwkJY2FzZSBCVVpfU1RBVEVfVVNFUjoKKwkJCS8qIHNpbmNlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB1bnVzZWQgYnVmZmVyIHRoZXJlJ3Mgcm9vbSBmb3IgYXQgbGVhc3QKKwkJCSAqIG9uZSBtb3JlIHBlbmRbXSBlbnRyeSAqLworCQkJenItPnY0bF9wZW5kW3pyLT52NGxfcGVuZF9oZWFkKysgJgorCQkJCQlWNExfTUFTS19GUkFNRV0gPSBudW07CisJCQl6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUgPSBCVVpfU1RBVEVfUEVORDsKKwkJCXpyLT52NGxfYnVmZmVycy5idWZmZXJbbnVtXS5icy5sZW5ndGggPQorCQkJICAgIGZoLT52NGxfc2V0dGluZ3MuYnl0ZXNwZXJsaW5lICoKKwkJCSAgICB6ci0+djRsX3NldHRpbmdzLmhlaWdodDsKKwkJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbbnVtXSA9CisJCQkgICAgenItPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWlmICghcmVzICYmIHpyLT52NGxfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkKKwkJenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9IGZoLT52NGxfYnVmZmVycy5hY3RpdmU7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50Cit2NGxfZ3JhYiAoc3RydWN0IGZpbGUgICAgICAgKmZpbGUsCisJICBzdHJ1Y3QgdmlkZW9fbW1hcCAqbXApCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCWludCByZXMgPSAwLCBpOworCisJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bV9mb3JtYXRzOyBpKyspIHsKKwkJaWYgKHpvcmFuX2Zvcm1hdHNbaV0ucGFsZXR0ZSA9PSBtcC0+Zm9ybWF0ICYmCisJCSAgICB6b3Jhbl9mb3JtYXRzW2ldLmZsYWdzICYgWk9SQU5fRk9STUFUX0NBUFRVUkUgJiYKKwkJICAgICEoem9yYW5fZm9ybWF0c1tpXS5mbGFncyAmIFpPUkFOX0ZPUk1BVF9DT01QUkVTU0VEKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSB6b3Jhbl9udW1fZm9ybWF0cyB8fCB6b3Jhbl9mb3JtYXRzW2ldLmRlcHRoID09IDApIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogdjRsX2dyYWIoKSAtIHdyb25nIGJ5dGVzLXBlci1waXhlbCBmb3JtYXRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogVG8gbWluaW1pemUgdGhlIHRpbWUgc3BlbnQgaW4gdGhlIElSUSByb3V0aW5lLCB3ZSBhdm9pZCBzZXR0aW5nIHVwCisJICogdGhlIHZpZGVvIGZyb250IGVuZCB0aGVyZS4KKwkgKiBJZiB0aGlzIGdyYWIgaGFzIGRpZmZlcmVudCBwYXJhbWV0ZXJzIGZyb20gYSBydW5uaW5nIHN0cmVhbWluZyBjYXB0dXJlCisJICogd2Ugc3RvcCB0aGUgc3RyZWFtaW5nIGNhcHR1cmUgYW5kIHN0YXJ0IGl0IG92ZXIgYWdhaW4uCisJICovCisJaWYgKHpyLT52NGxfbWVtZ3JhYl9hY3RpdmUgJiYKKwkgICAgKHpyLT52NGxfc2V0dGluZ3Mud2lkdGggIT0gbXAtPndpZHRoIHx8CisJICAgICB6ci0+djRsX3NldHRpbmdzLmhlaWdodCAhPSBtcC0+aGVpZ2h0IHx8CisJICAgICB6ci0+djRsX3NldHRpbmdzLmZvcm1hdC0+cGFsZXR0ZSAhPSBtcC0+Zm9ybWF0KSkgeworCQlyZXMgPSB3YWl0X2dyYWJfcGVuZGluZyh6cik7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOworCX0KKwlpZiAoKHJlcyA9IHpvcmFuX3Y0bF9zZXRfZm9ybWF0KGZpbGUsCisJCQkJCW1wLT53aWR0aCwKKwkJCQkJbXAtPmhlaWdodCwKKwkJCQkJJnpvcmFuX2Zvcm1hdHNbaV0pKSkKKwkJcmV0dXJuIHJlczsKKwl6ci0+djRsX3NldHRpbmdzID0gZmgtPnY0bF9zZXR0aW5nczsKKworCS8qIHF1ZXVlIHRoZSBmcmFtZSBpbiB0aGUgcGVuZGluZyBxdWV1ZSAqLworCWlmICgocmVzID0gem9yYW5fdjRsX3F1ZXVlX2ZyYW1lKGZpbGUsIG1wLT5mcmFtZSkpKSB7CisJCWZoLT52NGxfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOworCQlyZXR1cm4gcmVzOworCX0KKworCS8qIHB1dCB0aGUgMzYwNTcgaW50byBmcmFtZSBncmFiYmluZyBtb2RlICovCisJaWYgKCFyZXMgJiYgIXpyLT52NGxfbWVtZ3JhYl9hY3RpdmUpCisJCXpyMzYwNTdfc2V0X21lbWdyYWIoenIsIDEpOworCisJLy9kcHJpbnRrKDQsIEtFUk5fSU5GTyAiJXM6IEZyYW1lIGdyYWIgMy4uLlxuIiwgWlJfREVWTkFNRSh6cikpOworCisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFN5bmMgb24gYSBWNEwgYnVmZmVyCisgKi8KKworc3RhdGljIGludAordjRsX3N5bmMgKHN0cnVjdCBmaWxlICpmaWxlLAorCSAgaW50ICAgICAgICAgIGZyYW1lKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGZoLT52NGxfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB2NGxfc3luYygpIC0gbm8gZ3JhYiBhY3RpdmUgZm9yIHRoaXMgc2Vzc2lvblxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2hlY2sgcGFzc2VkLWluIGZyYW1lIG51bWJlciAqLworCWlmIChmcmFtZSA+PSBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnMgfHwgZnJhbWUgPCAwKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSICIlczogdjRsX3N5bmMoKSAtIGZyYW1lICVkIGlzIGludmFsaWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgZnJhbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayBpZiBpcyBidWZmZXIgd2FzIHF1ZXVlZCBhdCBhbGwgKi8KKwlpZiAoenItPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgPT0gQlVaX1NUQVRFX1VTRVIpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogdjRsX3N5bmMoKSAtIGF0dGVtcHQgdG8gc3luYyBvbiBhIGJ1ZmZlciB3aGljaCB3YXMgbm90IHF1ZXVlZD9cbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCS8qIHdhaXQgb24gdGhpcyBidWZmZXIgdG8gZ2V0IHJlYWR5ICovCisJaWYgKCF3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh6ci0+djRsX2NhcHEsCisJCQkJKHpyLT52NGxfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlICE9IEJVWl9TVEFURV9QRU5EKSwKKwkJCQkxMCpIWikpCisJCXJldHVybiAtRVRJTUU7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJLyogYnVmZmVyIHNob3VsZCBub3cgYmUgaW4gQlVaX1NUQVRFX0RPTkUgKi8KKwlpZiAoenItPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgIT0gQlVaX1NUQVRFX0RPTkUpCisJCWRwcmludGsoMiwKKwkJCUtFUk5fRVJSICIlczogdjRsX3N5bmMoKSAtIGludGVybmFsIHN0YXRlIGVycm9yXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCisJenItPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgPSBCVVpfU1RBVEVfVVNFUjsKKwlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXSA9IHpyLT52NGxfYnVmZmVycy5idWZmZXJbZnJhbWVdOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgc3RyZWFtaW5nIGNhcHR1cmUgaGFzIGZpbmlzaGVkICovCisJaWYgKHpyLT52NGxfcGVuZF90YWlsID09IHpyLT52NGxfcGVuZF9oZWFkKSB7CisJCXpyMzYwNTdfc2V0X21lbWdyYWIoenIsIDApOworCQlpZiAoenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9BQ1RJVkUpIHsKKwkJCWZoLT52NGxfYnVmZmVycy5hY3RpdmUgPSB6ci0+djRsX2J1ZmZlcnMuYWN0aXZlID0KKwkJCSAgICBaT1JBTl9GUkVFOworCQkJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogICBRdWV1ZSBhIE1KUEVHIGJ1ZmZlciBmb3IgY2FwdHVyZS9wbGF5YmFjaworICovCisKK3N0YXRpYyBpbnQKK3pvcmFuX2pwZ19xdWV1ZV9mcmFtZSAoc3RydWN0IGZpbGUgICAgICAgICAgKmZpbGUsCisJCSAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbnVtLAorCQkgICAgICAgZW51bSB6b3Jhbl9jb2RlY19tb2RlIG1vZGUpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlcyA9IDA7CisKKwkvKiBDaGVjayBpZiBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgKi8KKwlpZiAoIWZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczoganBnX3F1ZXVlX2ZyYW1lKCkgLSBidWZmZXJzIG5vdCB5ZXQgYWxsb2NhdGVkXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBObyBncmFiYmluZyBvdXRzaWRlIHRoZSBidWZmZXIgcmFuZ2UhICovCisJaWYgKG51bSA+PSBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMgfHwgbnVtIDwgMCkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBqcGdfcXVldWVfZnJhbWUoKSAtIGJ1ZmZlciAlZCBvdXQgb2YgcmFuZ2VcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgbnVtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogd2hhdCBpcyB0aGUgY29kZWMgbW9kZSByaWdodCBub3c/ICovCisJaWYgKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX0lETEUpIHsKKwkJenItPmpwZ19zZXR0aW5ncyA9IGZoLT5qcGdfc2V0dGluZ3M7CisJfSBlbHNlIGlmICh6ci0+Y29kZWNfbW9kZSAhPSBtb2RlKSB7CisJCS8qIHdyb25nIGNvZGVjIG1vZGUgYWN0aXZlIC0gaW52YWxpZCAqLworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBqcGdfcXVldWVfZnJhbWUoKSAtIGNvZGVjIGluIHdyb25nIG1vZGVcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWlmIChmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKKwkJaWYgKHpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkgeworCQkJenItPmpwZ19idWZmZXJzID0gZmgtPmpwZ19idWZmZXJzOworCQkJZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9IFpPUkFOX0FDVElWRTsKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczoganBnX3F1ZXVlX2ZyYW1lKCkgLSBhbm90aGVyIHNlc3Npb24gaXMgYWxyZWFkeSBjYXB0dXJpbmdcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmVzID0gLUVCVVNZOworCQl9CisJfQorCisJaWYgKCFyZXMgJiYgenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfSURMRSkgeworCQkvKiBPayBsb2FkIHVwIHRoZSBqcGVnIGNvZGVjICovCisJCXpyMzYwNTdfZW5hYmxlX2pwZyh6ciwgbW9kZSk7CisJfQorCisJaWYgKCFyZXMpIHsKKwkJc3dpdGNoICh6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUpIHsKKwkJY2FzZSBCVVpfU1RBVEVfRE9ORToKKwkJCWRwcmludGsoMiwKKwkJCQlLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IGpwZ19xdWV1ZV9mcmFtZSgpIC0gcXVlaW5nIGZyYW1lIGluIEJVWl9TVEFURV9ET05FIHN0YXRlIT9cbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQljYXNlIEJVWl9TVEFURV9VU0VSOgorCQkJLyogc2luY2UgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHVudXNlZCBidWZmZXIgdGhlcmUncyByb29tIGZvciBhdAorCQkJICpsZWFzdCBvbmUgbW9yZSBwZW5kW10gZW50cnkgKi8KKwkJCXpyLT5qcGdfcGVuZFt6ci0+anBnX3F1ZV9oZWFkKysgJiBCVVpfTUFTS19GUkFNRV0gPQorCQkJICAgIG51bTsKKwkJCXpyLT5qcGdfYnVmZmVycy5idWZmZXJbbnVtXS5zdGF0ZSA9IEJVWl9TVEFURV9QRU5EOworCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltudW1dID0KKwkJCSAgICB6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV07CisJCQl6b3Jhbl9mZWVkX3N0YXRfY29tKHpyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIEJVWl9TVEFURV9ETUE6CisJCWNhc2UgQlVaX1NUQVRFX1BFTkQ6CisJCQlpZiAoenItPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7CisJCQkJZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9IFpPUkFOX0ZSRUU7CisJCQkJenItPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJCQl9CisJCQlyZXMgPSAtRUJVU1k7CS8qIHdoYXQgYXJlIHlvdSBkb2luZz8gKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXJlcyAmJiB6ci0+anBnX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKKwkJenItPmpwZ19idWZmZXJzLmFjdGl2ZSA9IGZoLT5qcGdfYnVmZmVycy5hY3RpdmU7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAoranBnX3FidWYgKHN0cnVjdCBmaWxlICAgICAgICAgICpmaWxlLAorCSAgaW50ICAgICAgICAgICAgICAgICAgIGZyYW1lLAorCSAgZW51bSB6b3Jhbl9jb2RlY19tb2RlIG1vZGUpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCWludCByZXMgPSAwOworCisJLyogRG9lcyB0aGUgdXNlciB3YW50IHRvIHN0b3Agc3RyZWFtaW5nPyAqLworCWlmIChmcmFtZSA8IDApIHsKKwkJaWYgKHpyLT5jb2RlY19tb2RlID09IG1vZGUpIHsKKwkJCWlmIChmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczoganBnX3FidWYoLTEpIC0gc2Vzc2lvbiBub3QgYWN0aXZlXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID0genItPmpwZ19idWZmZXJzLmFjdGl2ZSA9CisJCQkgICAgWk9SQU5fRlJFRTsKKwkJCXpyLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOworCQkJenIzNjA1N19lbmFibGVfanBnKHpyLCBCVVpfTU9ERV9JRExFKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBqcGdfcWJ1ZigpIC0gc3RvcCBzdHJlYW1pbmcgYnV0IG5vdCBpbiBzdHJlYW1pbmcgbW9kZVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmICgocmVzID0gem9yYW5fanBnX3F1ZXVlX2ZyYW1lKGZpbGUsIGZyYW1lLCBtb2RlKSkpCisJCXJldHVybiByZXM7CisKKwkvKiBTdGFydCB0aGUganBlZyBjb2RlYyB3aGVuIHRoZSBmaXJzdCBmcmFtZSBpcyBxdWV1ZWQgICovCisJaWYgKCFyZXMgJiYgenItPmpwZ19xdWVfaGVhZCA9PSAxKQorCQlqcGVnX3N0YXJ0KHpyKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiAgIFN5bmMgb24gYSBNSlBFRyBidWZmZXIKKyAqLworCitzdGF0aWMgaW50CitqcGdfc3luYyAoc3RydWN0IGZpbGUgICAgICAgKmZpbGUsCisJICBzdHJ1Y3Qgem9yYW5fc3luYyAqYnMpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGZyYW1lOworCisJaWYgKGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBqcGdfc3luYygpIC0gY2FwdHVyZSBpcyBub3QgY3VycmVudGx5IGFjdGl2ZVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh6ci0+Y29kZWNfbW9kZSAhPSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUyAmJgorCSAgICB6ci0+Y29kZWNfbW9kZSAhPSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1MpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczoganBnX3N5bmMoKSAtIGNvZGVjIG5vdCBpbiBzdHJlYW1pbmcgbW9kZVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoenItPmpwZ19jYXBxLAorCQkJKHpyLT5qcGdfcXVlX3RhaWwgIT0genItPmpwZ19kbWFfdGFpbCB8fAorCQkJIHpyLT5qcGdfZG1hX3RhaWwgPT0genItPmpwZ19kbWFfaGVhZCksCisJCQkxMCpIWikpIHsKKwkJaW50IGlzcjsKKworCQlidGFuZCh+WlIzNjA1N19KTUNfR29fZW4sIFpSMzYwNTdfSk1DKTsKKwkJdWRlbGF5KDEpOworCQl6ci0+Y29kZWMtPmNvbnRyb2woenItPmNvZGVjLCBDT0RFQ19HX1NUQVRVUywKKwkJCQkJICAgc2l6ZW9mKGlzciksICZpc3IpOworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBqcGdfc3luYygpIC0gdGltZW91dDogY29kZWMgaXNyPTB4JTAyeFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBpc3IpOworCisJCXJldHVybiAtRVRJTUU7CisKKwl9CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKHpyLT5qcGdfZG1hX3RhaWwgIT0genItPmpwZ19kbWFfaGVhZCkKKwkJZnJhbWUgPSB6ci0+anBnX3BlbmRbenItPmpwZ19xdWVfdGFpbCsrICYgQlVaX01BU0tfRlJBTUVdOworCWVsc2UKKwkJZnJhbWUgPSB6ci0+anBnX3BlbmRbenItPmpwZ19xdWVfdGFpbCAmIEJVWl9NQVNLX0ZSQU1FXTsKKworCS8qIGJ1ZmZlciBzaG91bGQgbm93IGJlIGluIEJVWl9TVEFURV9ET05FICovCisJaWYgKCp6cl9kZWJ1ZyA+IDApCisJCWlmICh6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZSAhPSBCVVpfU1RBVEVfRE9ORSkKKwkJCWRwcmludGsoMiwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczoganBnX3N5bmMoKSAtIGludGVybmFsIHN0YXRlIGVycm9yXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKworCSpicyA9IHpyLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdLmJzOworCWJzLT5mcmFtZSA9IGZyYW1lOworCXpyLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlID0gQlVaX1NUQVRFX1VTRVI7CisJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0gPSB6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit6b3Jhbl9vcGVuX2luaXRfc2Vzc2lvbiAoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGk7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCisJLyogUGVyIGRlZmF1bHQsIG1hcCB0aGUgVjRMIEJ1ZmZlcnMgKi8KKwlmaC0+bWFwX21vZGUgPSBaT1JBTl9NQVBfTU9ERV9SQVc7CisKKwkvKiB0YWtlIG92ZXIgdGhlIGNhcmQncyBjdXJyZW50IHNldHRpbmdzICovCisJZmgtPm92ZXJsYXlfc2V0dGluZ3MgPSB6ci0+b3ZlcmxheV9zZXR0aW5nczsKKwlmaC0+b3ZlcmxheV9zZXR0aW5ncy5pc19zZXQgPSAwOworCWZoLT5vdmVybGF5X3NldHRpbmdzLmZvcm1hdCA9IHpyLT5vdmVybGF5X3NldHRpbmdzLmZvcm1hdDsKKwlmaC0+b3ZlcmxheV9hY3RpdmUgPSBaT1JBTl9GUkVFOworCisJLyogdjRsIHNldHRpbmdzICovCisJZmgtPnY0bF9zZXR0aW5ncyA9IHpyLT52NGxfc2V0dGluZ3M7CisKKwkvKiB2NGxfYnVmZmVycyAqLworCW1lbXNldCgmZmgtPnY0bF9idWZmZXJzLCAwLCBzaXplb2Yoc3RydWN0IHpvcmFuX3Y0bF9zdHJ1Y3QpKTsKKwlmb3IgKGkgPSAwOyBpIDwgVklERU9fTUFYX0ZSQU1FOyBpKyspIHsKKwkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5zdGF0ZSA9IEJVWl9TVEFURV9VU0VSOwkvKiBub3RoaW5nIGdvaW5nIG9uICovCisJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uYnMuZnJhbWUgPSBpOworCX0KKwlmaC0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwlmaC0+djRsX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQgPSAwOworCWZoLT52NGxfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOworCWZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSA9IHY0bF9idWZzaXplOworCWZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyA9IHY0bF9uYnVmczsKKworCS8qIGpwZyBzZXR0aW5ncyAqLworCWZoLT5qcGdfc2V0dGluZ3MgPSB6ci0+anBnX3NldHRpbmdzOworCisJLyoganBnX2J1ZmZlcnMgKi8KKwltZW1zZXQoJmZoLT5qcGdfYnVmZmVycywgMCwgc2l6ZW9mKHN0cnVjdCB6b3Jhbl9qcGdfc3RydWN0KSk7CisJZm9yIChpID0gMDsgaSA8IEJVWl9NQVhfRlJBTUU7IGkrKykgeworCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLnN0YXRlID0gQlVaX1NUQVRFX1VTRVI7CS8qIG5vdGhpbmcgZ29pbmcgb24gKi8KKwkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5icy5mcmFtZSA9IGk7CisJfQorCWZoLT5qcGdfYnVmZmVycy5uZWVkX2NvbnRpZ3VvdXMgPSB6ci0+anBnX2J1ZmZlcnMubmVlZF9jb250aWd1b3VzOworCWZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOworCWZoLT5qcGdfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCA9IDA7CisJZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9IFpPUkFOX0ZSRUU7CisJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplID0ganBnX2J1ZnNpemU7CisJZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzID0ganBnX25idWZzOworfQorCitzdGF0aWMgdm9pZAorem9yYW5fY2xvc2VfZW5kX3Nlc3Npb24gKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKworCS8qIG92ZXJsYXkgKi8KKwlpZiAoZmgtPm92ZXJsYXlfYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKKwkJZmgtPm92ZXJsYXlfYWN0aXZlID0genItPm92ZXJsYXlfYWN0aXZlID0gWk9SQU5fRlJFRTsKKwkJenItPnY0bF9vdmVybGF5X2FjdGl2ZSA9IDA7CisJCWlmICghenItPnY0bF9tZW1ncmFiX2FjdGl2ZSkKKwkJCXpyMzYwNTdfb3ZlcmxheSh6ciwgMCk7CisJCXpyLT5vdmVybGF5X21hc2sgPSBOVUxMOworCX0KKworCS8qIHY0bCBjYXB0dXJlICovCisJaWYgKGZoLT52NGxfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSkgeworCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAwKTsKKwkJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJCXpyLT52NGxfYnVmZmVycy5hY3RpdmUgPSBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0KKwkJICAgIFpPUkFOX0ZSRUU7CisJfQorCisJLyogdjRsIGJ1ZmZlcnMgKi8KKwlpZiAoZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCB8fAorCSAgICBmaC0+djRsX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQpIHsKKwkJdjRsX2ZidWZmZXJfZnJlZShmaWxlKTsKKwl9CisKKwkvKiBqcGcgY2FwdHVyZSAqLworCWlmIChmaC0+anBnX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKKwkJenIzNjA1N19lbmFibGVfanBnKHpyLCBCVVpfTU9ERV9JRExFKTsKKwkJenItPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJCXpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID0KKwkJICAgIFpPUkFOX0ZSRUU7CisJfQorCisJLyoganBnIGJ1ZmZlcnMgKi8KKwlpZiAoZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCB8fAorCSAgICBmaC0+anBnX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQpIHsKKwkJanBnX2ZidWZmZXJfZnJlZShmaWxlKTsKKwl9Cit9CisKKy8qCisgKiAgIE9wZW4gYSB6b3JhbiBjYXJkLiBSaWdodCBub3cgdGhlIGZsYWdzIHN0dWZmIGlzIGp1c3QgcGxheWluZworICovCisKK3N0YXRpYyBpbnQKK3pvcmFuX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJICAgIHN0cnVjdCBmaWxlICAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCB6b3JhbiAqenIgPSBOVUxMOworCXN0cnVjdCB6b3Jhbl9maCAqZmg7CisJaW50IGksIHJlcywgZmlyc3Rfb3BlbiA9IDAsIGhhdmVfbW9kdWxlX2xvY2tzID0gMDsKKworCS8qIGZpbmQgdGhlIGRldmljZSAqLworCWZvciAoaSA9IDA7IGkgPCB6b3Jhbl9udW07IGkrKykgeworCQlpZiAoem9yYW5baV0udmlkZW9fZGV2LT5taW5vciA9PSBtaW5vcikgeworCQkJenIgPSAmem9yYW5baV07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghenIpIHsKKwkJZHByaW50aygxLCBLRVJOX0VSUiAiJXM6IGRldmljZSBub3QgZm91bmQhXG4iLCBaT1JBTl9OQU1FKTsKKwkJcmVzID0gLUVOT0RFVjsKKwkJZ290byBvcGVuX3VubG9ja19hbmRfcmV0dXJuOworCX0KKworCS8qIHNlZSBmcy9kZXZpY2UuYyAtIHRoZSBrZXJuZWwgYWxyZWFkeSBsb2NrcyBkdXJpbmcgb3BlbigpLAorCSAqIHNvIGxvY2tpbmcgb3Vyc2VsdmVzIG9ubHkgY2F1c2VzIGRlYWRsb2NrcyAqLworCS8qZG93bigmenItPnJlc291cmNlX2xvY2spOyovCisKKwlpZiAoIXpyLT5kZWNvZGVyKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSICIlczogbm8gVFYgZGVjb2RlciBsb2FkZWQgZm9yIGRldmljZSFcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJlcyA9IC1FSU87CisJCWdvdG8gb3Blbl91bmxvY2tfYW5kX3JldHVybjsKKwl9CisKKwkvKiB0cnkgdG8gZ3JhYiBhIG1vZHVsZSBsb2NrICovCisJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogZmFpbGVkIHRvIGFjcXVpcmUgbXkgb3duIGxvY2shIFBBTklDIVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmVzID0gLUVOT0RFVjsKKwkJZ290byBvcGVuX3VubG9ja19hbmRfcmV0dXJuOworCX0KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHpyLT5kZWNvZGVyLT5kcml2ZXItPm93bmVyKSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBmYWlsZWQgdG8gZ3JhYiBvd25lcnNoaXAgb2YgaTJjIGRlY29kZXJcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJlcyA9IC1FSU87CisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQlnb3RvIG9wZW5fdW5sb2NrX2FuZF9yZXR1cm47CisJfQorCWlmICh6ci0+ZW5jb2RlciAmJgorCSAgICAhdHJ5X21vZHVsZV9nZXQoenItPmVuY29kZXItPmRyaXZlci0+b3duZXIpKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IGZhaWxlZCB0byBncmFiIG93bmVyc2hpcCBvZiBpMmMgZW5jb2RlclxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmVzID0gLUVJTzsKKwkJbW9kdWxlX3B1dCh6ci0+ZGVjb2Rlci0+ZHJpdmVyLT5vd25lcik7CisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQlnb3RvIG9wZW5fdW5sb2NrX2FuZF9yZXR1cm47CisJfQorCisJaGF2ZV9tb2R1bGVfbG9ja3MgPSAxOworCisJaWYgKHpyLT51c2VyID49IDIwNDgpIHsKKwkJZHByaW50aygxLCBLRVJOX0VSUiAiJXM6IHRvbyBtYW55IHVzZXJzICglZCkgb24gZGV2aWNlXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHpyLT51c2VyKTsKKwkJcmVzID0gLUVCVVNZOworCQlnb3RvIG9wZW5fdW5sb2NrX2FuZF9yZXR1cm47CisJfQorCisJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiB6b3Jhbl9vcGVuKCVzLCBwaWQ9WyVkXSksIHVzZXJzKC0pPSVkXG4iLAorCQlaUl9ERVZOQU1FKHpyKSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCB6ci0+dXNlcik7CisKKwkvKiBub3csIGNyZWF0ZSB0aGUgb3BlbigpLXNwZWNpZmljIGZpbGVfb3BzIHN0cnVjdCAqLworCWZoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHpvcmFuX2ZoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaCkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB6b3Jhbl9vcGVuKCkgLSBhbGxvY2F0aW9uIG9mIHpvcmFuX2ZoIGZhaWxlZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBvcGVuX3VubG9ja19hbmRfcmV0dXJuOworCX0KKwltZW1zZXQoZmgsIDAsIHNpemVvZihzdHJ1Y3Qgem9yYW5fZmgpKTsKKwkvKiB1c2VkIHRvIGJlIEJVWl9NQVhfV0lEVEgvSEVJR0hULCBidXQgdGhhdCBnaXZlcyBvdmVyZmxvd3MKKwkgKiBvbiBub3JtLWNoYW5nZSEgKi8KKwlmaC0+b3ZlcmxheV9tYXNrID0KKwkgICAga21hbGxvYygoKDc2OCArIDMxKSAvIDMyKSAqIDU3NiAqIDQsIEdGUF9LRVJORUwpOworCWlmICghZmgtPm92ZXJsYXlfbWFzaykgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB6b3Jhbl9vcGVuKCkgLSBhbGxvY2F0aW9uIG9mIG92ZXJsYXlfbWFzayBmYWlsZWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCWtmcmVlKGZoKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBvcGVuX3VubG9ja19hbmRfcmV0dXJuOworCX0KKworCWlmICh6ci0+dXNlcisrID09IDApCisJCWZpcnN0X29wZW4gPSAxOworCisJLyp1cCgmenItPnJlc291cmNlX2xvY2spOyovCisKKwkvKiBkZWZhdWx0IHNldHVwIC0gVE9ETzogbG9vayBhdCBmbGFncyAqLworCWlmIChmaXJzdF9vcGVuKSB7CS8qIEZpcnN0IGRldmljZSBvcGVuICovCisJCXpyMzYwNTdfcmVzdGFydCh6cik7CisJCXpvcmFuX29wZW5faW5pdF9wYXJhbXMoenIpOworCQl6b3Jhbl9pbml0X2hhcmR3YXJlKHpyKTsKKworCQlidG9yKFpSMzYwNTdfSUNSX0ludFBpbkVuLCBaUjM2MDU3X0lDUik7CisJfQorCisJLyogc2V0IGZpbGVfb3BzIHN0dWZmICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CisJZmgtPnpyID0genI7CisJem9yYW5fb3Blbl9pbml0X3Nlc3Npb24oZmlsZSk7CisKKwlyZXR1cm4gMDsKKworb3Blbl91bmxvY2tfYW5kX3JldHVybjoKKwkvKiBpZiB3ZSBncmFiYmVkIGxvY2tzLCByZWxlYXNlIHRoZW0gYWNjb3JkaW5nbHkgKi8KKwlpZiAoaGF2ZV9tb2R1bGVfbG9ja3MpIHsKKwkJbW9kdWxlX3B1dCh6ci0+ZGVjb2Rlci0+ZHJpdmVyLT5vd25lcik7CisJCWlmICh6ci0+ZW5jb2RlcikgeworCQkJbW9kdWxlX3B1dCh6ci0+ZW5jb2Rlci0+ZHJpdmVyLT5vd25lcik7CisJCX0KKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJfQorCisJLyogaWYgdGhlcmUncyBubyBkZXZpY2UgZm91bmQsIHdlIGRpZG4ndCBvYnRhaW4gdGhlIGxvY2sgZWl0aGVyICovCisJaWYgKHpyKSB7CisJCS8qdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsqLworCX0KKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK3pvcmFuX2Nsb3NlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCSAgICAgc3RydWN0IGZpbGUgICpmaWxlKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKworCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogem9yYW5fY2xvc2UoJXMsIHBpZD1bJWRdKSwgdXNlcnMoKyk9JWRcbiIsCisJCVpSX0RFVk5BTUUoenIpLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHpyLT51c2VyKTsKKworCS8qIGtlcm5lbCBsb2NrcyAoZnMvZGV2aWNlLmMpLCBzbyBkb24ndCBkbyB0aGF0IG91cnNlbHZlcworCSAqIChwcmV2ZW50cyBkZWFkbG9ja3MpICovCisJLypkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ki8KKworCXpvcmFuX2Nsb3NlX2VuZF9zZXNzaW9uKGZpbGUpOworCisJaWYgKHpyLT51c2VyLS0gPT0gMSkgewkvKiBMYXN0IHByb2Nlc3MgKi8KKwkJLyogQ2xlYW4gdXAgSlBFRyBwcm9jZXNzICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenItPmpwZ19jYXBxKTsKKwkJenIzNjA1N19lbmFibGVfanBnKHpyLCBCVVpfTU9ERV9JRExFKTsKKwkJenItPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJCXpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQlidGFuZCh+WlIzNjA1N19JQ1JfSW50UGluRW4sIFpSMzYwNTdfSUNSKTsKKworCQlpZiAoKnpyX2RlYnVnID4gMSkKKwkJCXByaW50X2ludGVycnVwdHMoenIpOworCisJCS8qIE92ZXJsYXkgb2ZmICovCisJCXpyLT52NGxfb3ZlcmxheV9hY3RpdmUgPSAwOworCQl6cjM2MDU3X292ZXJsYXkoenIsIDApOworCQl6ci0+b3ZlcmxheV9tYXNrID0gTlVMTDsKKworCQkvKiBjYXB0dXJlIG9mZiAqLworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnpyLT52NGxfY2FwcSk7CisJCXpyMzYwNTdfc2V0X21lbWdyYWIoenIsIDApOworCQl6ci0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwkJenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9IFpPUkFOX0ZSRUU7CisJCXpvcmFuX3NldF9wY2lfbWFzdGVyKHpyLCAwKTsKKworCQlpZiAoIXBhc3NfdGhyb3VnaCkgewkvKiBTd2l0Y2ggdG8gY29sb3IgYmFyICovCisJCQlpbnQgemVybyA9IDAsIHR3byA9IDI7CisJCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfRU5BQkxFX09VVFBVVCwgJnplcm8pOworCQkJZW5jb2Rlcl9jb21tYW5kKHpyLCBFTkNPREVSX1NFVF9JTlBVVCwgJnR3byk7CisJCX0KKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWtmcmVlKGZoLT5vdmVybGF5X21hc2spOworCWtmcmVlKGZoKTsKKworCS8qIHJlbGVhc2UgbG9ja3Mgb24gdGhlIGkyYyBtb2R1bGVzICovCisJbW9kdWxlX3B1dCh6ci0+ZGVjb2Rlci0+ZHJpdmVyLT5vd25lcik7CisJaWYgKHpyLT5lbmNvZGVyKSB7CisJCSBtb2R1bGVfcHV0KHpyLT5lbmNvZGVyLT5kcml2ZXItPm93bmVyKTsKKwl9CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisKKwkvKnVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ki8KKworCWRwcmludGsoNCwgS0VSTl9JTkZPICIlczogem9yYW5fY2xvc2UoKSBkb25lXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3NpemVfdAorem9yYW5fcmVhZCAoc3RydWN0IGZpbGUgKmZpbGUsCisJICAgIGNoYXIgICAgICAgIF9fdXNlciAqZGF0YSwKKwkgICAgc2l6ZV90ICAgICAgIGNvdW50LAorCSAgICBsb2ZmX3QgICAgICAqcHBvcykKK3sKKwkvKiB3ZSBzaW1wbHkgZG9uJ3Qgc3VwcG9ydCByZWFkKCkgKHlldCkuLi4gKi8KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3NpemVfdAorem9yYW5fd3JpdGUgKHN0cnVjdCBmaWxlICpmaWxlLAorCSAgICAgY29uc3QgY2hhciAgX191c2VyICpkYXRhLAorCSAgICAgc2l6ZV90ICAgICAgIGNvdW50LAorCSAgICAgbG9mZl90ICAgICAgKnBwb3MpCit7CisJLyogLi4uYW5kIHRoZSBzYW1lIGdvZXMgZm9yIHdyaXRlKCkgKi8KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50CitzZXR1cF9mYnVmZmVyIChzdHJ1Y3QgZmlsZSAgICAgICAgICAgICAgICpmaWxlLAorCSAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpiYXNlLAorCSAgICAgICBjb25zdCBzdHJ1Y3Qgem9yYW5fZm9ybWF0ICpmbXQsCisJICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorCSAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisJICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzcGVybGluZSkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisKKwkvKiAoUm9uYWxkKSB2NGwvdjRsMiBndWlkZWxpbmVzICovCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pICYmICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQlyZXR1cm4gLUVQRVJNOworCisJLyogd2UgbmVlZCBhIGJ5dGVzcGVybGluZSB2YWx1ZSwgZXZlbiBpZiBub3QgZ2l2ZW4gKi8KKwlpZiAoIWJ5dGVzcGVybGluZSkKKwkJYnl0ZXNwZXJsaW5lID0gd2lkdGggKiAoKGZtdC0+ZGVwdGggKyA3KSAmIH43KSAvIDg7CisKKyNpZiAwCisJaWYgKHpyLT5vdmVybGF5X2FjdGl2ZSkgeworCQkvKiBkemplZS4uLiBzdHVwaWQgdXNlcnMuLi4gZG9uJ3QgZXZlbiBib3RoZXIgdG8gdHVybiBvZmYKKwkJICogb3ZlcmxheSBiZWZvcmUgY2hhbmdpbmcgdGhlIG1lbW9yeSBsb2NhdGlvbi4uLgorCQkgKiBub3JtYWxseSwgd2Ugd291bGQgcmV0dXJuIGVycm9ycyBoZXJlLiBIb3dldmVyLCBvbmUgb2YKKwkJICogdGhlIHRvb2xzIHRoYXQgZG9lcyB0aGlzIGlzLi4uIHhhd3R2ISBhbmQgc2luY2UgeGF3dHYKKwkJICogaXMgdXNlZCBieSArLy0gOTklIG9mIHRoZSB1c2Vycywgd2UnZCByYXRoZXIgYmUgdXNlci0KKwkJICogZnJpZW5kbHkgYW5kIHNpbGVudGx5IGRvIGFzIGlmIG5vdGhpbmcgd2VudCB3cm9uZyAqLworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBzZXR1cF9mYnVmZmVyKCkgLSBmb3JjZWQgb3ZlcmxheSB0dXJub2ZmIGJlY2F1c2UgZnJhbWVidWZmZXIgY2hhbmdlZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJenIzNjA1N19vdmVybGF5KHpyLCAwKTsKKwl9CisjZW5kaWYKKworCWlmICghKGZtdC0+ZmxhZ3MgJiBaT1JBTl9GT1JNQVRfT1ZFUkxBWSkpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogc2V0dXBfZmJ1ZmZlcigpIC0gbm8gdmFsaWQgb3ZlcmxheSBmb3JtYXQgZ2l2ZW5cbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoaGVpZ2h0IDw9IDAgfHwgd2lkdGggPD0gMCB8fCBieXRlc3BlcmxpbmUgPD0gMCkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBzZXR1cF9mYnVmZmVyKCkgLSBpbnZhbGlkIGhlaWdodC93aWR0aC9icGwgdmFsdWUgKCVkfCVkfCVkKVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCB3aWR0aCwgaGVpZ2h0LCBieXRlc3BlcmxpbmUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGJ5dGVzcGVybGluZSAmIDMpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogc2V0dXBfZmJ1ZmZlcigpIC0gYnl0ZXNwZXJsaW5lICglZCkgbXVzdCBiZSA0LWJ5dGUgYWxpZ25lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBieXRlc3BlcmxpbmUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl6ci0+YnVmZmVyLmJhc2UgPSAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGJhc2UgJiB+Myk7CisJenItPmJ1ZmZlci5oZWlnaHQgPSBoZWlnaHQ7CisJenItPmJ1ZmZlci53aWR0aCA9IHdpZHRoOworCXpyLT5idWZmZXIuZGVwdGggPSBmbXQtPmRlcHRoOworCXpyLT5vdmVybGF5X3NldHRpbmdzLmZvcm1hdCA9IGZtdDsKKwl6ci0+YnVmZmVyLmJ5dGVzcGVybGluZSA9IGJ5dGVzcGVybGluZTsKKworCS8qIFRoZSB1c2VyIHNob3VsZCBzZXQgbmV3IHdpbmRvdyBwYXJhbWV0ZXJzICovCisJenItPm92ZXJsYXlfc2V0dGluZ3MuaXNfc2V0ID0gMDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3NldHVwX3dpbmRvdyAoc3RydWN0IGZpbGUgICAgICAgKmZpbGUsCisJICAgICAgaW50ICAgICAgICAgICAgICAgIHgsCisJICAgICAgaW50ICAgICAgICAgICAgICAgIHksCisJICAgICAgaW50ICAgICAgICAgICAgICAgIHdpZHRoLAorCSAgICAgIGludCAgICAgICAgICAgICAgICBoZWlnaHQsCisJICAgICAgc3RydWN0IHZpZGVvX2NsaXAgX191c2VyICpjbGlwcywKKwkgICAgICBpbnQgICAgICAgICAgICAgICAgY2xpcGNvdW50LAorCSAgICAgIHZvaWQgICAgICAgICAgICAgIF9fdXNlciAqYml0bWFwKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwlzdHJ1Y3QgdmlkZW9fY2xpcCAqdmNwID0gTlVMTDsKKwlpbnQgb24sIGVuZDsKKworCisJaWYgKCF6ci0+YnVmZmVyLmJhc2UpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogc2V0dXBfd2luZG93KCkgLSBmcmFtZSBidWZmZXIgaGFzIHRvIGJlIHNldCBmaXJzdFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogc2V0dXBfd2luZG93KCkgLSBubyBvdmVybGF5IGZvcm1hdCBzZXRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogVGhlIHZpZGVvIGZyb250IGVuZCBuZWVkcyA0LWJ5dGUgYWxpbmdlZCBsaW5lIHNpemVzLCB3ZSBjb3JyZWN0IHRoYXQKKwkgKiBzaWxlbnRseSBoZXJlIGlmIG5lY2Vzc2FyeQorCSAqLworCWlmICh6ci0+YnVmZmVyLmRlcHRoID09IDE1IHx8IHpyLT5idWZmZXIuZGVwdGggPT0gMTYpIHsKKwkJZW5kID0gKHggKyB3aWR0aCkgJiB+MTsJLyogcm91bmQgZG93biAqLworCQl4ID0gKHggKyAxKSAmIH4xOwkvKiByb3VuZCB1cCAqLworCQl3aWR0aCA9IGVuZCAtIHg7CisJfQorCisJaWYgKHpyLT5idWZmZXIuZGVwdGggPT0gMjQpIHsKKwkJZW5kID0gKHggKyB3aWR0aCkgJiB+MzsJLyogcm91bmQgZG93biAqLworCQl4ID0gKHggKyAzKSAmIH4zOwkvKiByb3VuZCB1cCAqLworCQl3aWR0aCA9IGVuZCAtIHg7CisJfQorCisJaWYgKHdpZHRoID4gQlVaX01BWF9XSURUSCkKKwkJd2lkdGggPSBCVVpfTUFYX1dJRFRIOworCWlmIChoZWlnaHQgPiBCVVpfTUFYX0hFSUdIVCkKKwkJaGVpZ2h0ID0gQlVaX01BWF9IRUlHSFQ7CisKKwkvKiBDaGVjayBmb3IgdmFpbGQgcGFyYW1ldGVycyAqLworCWlmICh3aWR0aCA8IEJVWl9NSU5fV0lEVEggfHwgaGVpZ2h0IDwgQlVaX01JTl9IRUlHSFQgfHwKKwkgICAgd2lkdGggPiBCVVpfTUFYX1dJRFRIIHx8IGhlaWdodCA+IEJVWl9NQVhfSEVJR0hUKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHNldHVwX3dpbmRvdygpIC0gd2lkdGggPSAlZCBvciBoZWlnaHQgPSAlZCBpbnZhbGlkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHdpZHRoLCBoZWlnaHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmaC0+b3ZlcmxheV9zZXR0aW5ncy54ID0geDsKKwlmaC0+b3ZlcmxheV9zZXR0aW5ncy55ID0geTsKKwlmaC0+b3ZlcmxheV9zZXR0aW5ncy53aWR0aCA9IHdpZHRoOworCWZoLT5vdmVybGF5X3NldHRpbmdzLmhlaWdodCA9IGhlaWdodDsKKwlmaC0+b3ZlcmxheV9zZXR0aW5ncy5jbGlwY291bnQgPSBjbGlwY291bnQ7CisKKwkvKgorCSAqIElmIGFuIG92ZXJsYXkgaXMgcnVubmluZywgd2UgaGF2ZSB0byBzd2l0Y2ggaXQgb2ZmCisJICogYW5kIHN3aXRjaCBpdCBvbiBhZ2FpbiBpbiBvcmRlciB0byBnZXQgdGhlIG5ldyBzZXR0aW5ncyBpbiBlZmZlY3QuCisJICoKKwkgKiBXZSBhbHNvIHdhbnQgdG8gYXZvaWQgdGhhdCB0aGUgb3ZlcmxheSBtYXNrIGlzIHdyaXR0ZW4KKwkgKiB3aGVuIGFuIG92ZXJsYXkgaXMgcnVubmluZy4KKwkgKi8KKworCW9uID0genItPnY0bF9vdmVybGF5X2FjdGl2ZSAmJiAhenItPnY0bF9tZW1ncmFiX2FjdGl2ZSAmJgorCSAgICB6ci0+b3ZlcmxheV9hY3RpdmUgIT0gWk9SQU5fRlJFRSAmJgorCSAgICBmaC0+b3ZlcmxheV9hY3RpdmUgIT0gWk9SQU5fRlJFRTsKKwlpZiAob24pCisJCXpyMzYwNTdfb3ZlcmxheSh6ciwgMCk7CisKKwkvKgorCSAqICAgV3JpdGUgdGhlIG92ZXJsYXkgbWFzayBpZiBjbGlwcyBhcmUgd2FudGVkLgorCSAqICAgV2UgcHJlZmVyIGEgYml0bWFwLgorCSAqLworCWlmIChiaXRtYXApIHsKKwkJLyogZmFrZSB2YWx1ZSAtIGl0IGp1c3QgbWVhbnMgd2Ugd2FudCBjbGlwcyAqLworCQlmaC0+b3ZlcmxheV9zZXR0aW5ncy5jbGlwY291bnQgPSAxOworCisJCWlmIChjb3B5X2Zyb21fdXNlcihmaC0+b3ZlcmxheV9tYXNrLCBiaXRtYXAsCisJCQkJICAgKHdpZHRoICogaGVpZ2h0ICsgNykgLyA4KSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UgaWYgKGNsaXBjb3VudCA+IDApIHsKKwkJLyogd3JpdGUgb3VyIG93biBiaXRtYXAgZnJvbSB0aGUgY2xpcHMgKi8KKwkJdmNwID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvX2NsaXApICogKGNsaXBjb3VudCArIDQpKTsKKwkJaWYgKHZjcCA9PSBOVUxMKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IHNldHVwX3dpbmRvdygpIC0gQWxsb2Mgb2YgY2xpcCBtYXNrIGZhaWxlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgICh2Y3AsIGNsaXBzLCBzaXplb2Yoc3RydWN0IHZpZGVvX2NsaXApICogY2xpcGNvdW50KSkgeworCQkJdmZyZWUodmNwKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXdyaXRlX292ZXJsYXlfbWFzayhmaWxlLCB2Y3AsIGNsaXBjb3VudCk7CisJCXZmcmVlKHZjcCk7CisJfQorCisJZmgtPm92ZXJsYXlfc2V0dGluZ3MuaXNfc2V0ID0gMTsKKwlpZiAoZmgtPm92ZXJsYXlfYWN0aXZlICE9IFpPUkFOX0ZSRUUgJiYKKwkgICAgenItPm92ZXJsYXlfYWN0aXZlICE9IFpPUkFOX0ZSRUUpCisJCXpyLT5vdmVybGF5X3NldHRpbmdzID0gZmgtPm92ZXJsYXlfc2V0dGluZ3M7CisKKwlpZiAob24pCisJCXpyMzYwNTdfb3ZlcmxheSh6ciwgMSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGNoYW5nZXMgY29tZSBpbnRvIGVmZmVjdCAqLworCXJldHVybiB3YWl0X2dyYWJfcGVuZGluZyh6cik7Cit9CisKK3N0YXRpYyBpbnQKK3NldHVwX292ZXJsYXkgKHN0cnVjdCBmaWxlICpmaWxlLAorCSAgICAgICBpbnQgICAgICAgICAgb24pCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCisJLyogSWYgdGhlcmUgaXMgbm90aGluZyB0byBkbywgcmV0dXJuIGltbWVkaWF0bHkgKi8KKwlpZiAoKG9uICYmIGZoLT5vdmVybGF5X2FjdGl2ZSAhPSBaT1JBTl9GUkVFKSB8fAorCSAgICAoIW9uICYmIGZoLT5vdmVybGF5X2FjdGl2ZSA9PSBaT1JBTl9GUkVFKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBjaGVjayB3aGV0aGVyIHdlJ3JlIHRvdWNoaW5nIHNvbWVvbmUgZWxzZSdzIG92ZXJsYXkgKi8KKwlpZiAob24gJiYgenItPm92ZXJsYXlfYWN0aXZlICE9IFpPUkFOX0ZSRUUgJiYKKwkgICAgZmgtPm92ZXJsYXlfYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogc2V0dXBfb3ZlcmxheSgpIC0gb3ZlcmxheSBpcyBhbHJlYWR5IGFjdGl2ZSBmb3IgYW5vdGhlciBzZXNzaW9uXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpZiAoIW9uICYmIHpyLT5vdmVybGF5X2FjdGl2ZSAhPSBaT1JBTl9GUkVFICYmCisJICAgIGZoLT5vdmVybGF5X2FjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHNldHVwX292ZXJsYXkoKSAtIHlvdSBjYW5ub3QgY2FuY2VsIHNvbWVvbmUgZWxzZSdzIHNlc3Npb25cbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKG9uID09IDApIHsKKwkJenItPm92ZXJsYXlfYWN0aXZlID0gZmgtPm92ZXJsYXlfYWN0aXZlID0gWk9SQU5fRlJFRTsKKwkJenItPnY0bF9vdmVybGF5X2FjdGl2ZSA9IDA7CisJCS8qIFdoZW4gYSBncmFiIGlzIHJ1bm5pbmcsIHRoZSB2aWRlbyBzaW1wbHkKKwkJICogd29uJ3QgYmUgc3dpdGNoZWQgb24gYW55IG1vcmUgKi8KKwkJaWYgKCF6ci0+djRsX21lbWdyYWJfYWN0aXZlKQorCQkJenIzNjA1N19vdmVybGF5KHpyLCAwKTsKKwkJenItPm92ZXJsYXlfbWFzayA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaWYgKCF6ci0+YnVmZmVyLmJhc2UgfHwgIWZoLT5vdmVybGF5X3NldHRpbmdzLmlzX3NldCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBzZXR1cF9vdmVybGF5KCkgLSBidWZmZXIgb3Igd2luZG93IG5vdCBzZXRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKCFmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogc2V0dXBfb3ZlcmxheSgpIC0gbm8gb3ZlcmxheSBmb3JtYXQgc2V0XG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXpyLT5vdmVybGF5X2FjdGl2ZSA9IGZoLT5vdmVybGF5X2FjdGl2ZSA9IFpPUkFOX0xPQ0tFRDsKKwkJenItPnY0bF9vdmVybGF5X2FjdGl2ZSA9IDE7CisJCXpyLT5vdmVybGF5X21hc2sgPSBmaC0+b3ZlcmxheV9tYXNrOworCQl6ci0+b3ZlcmxheV9zZXR0aW5ncyA9IGZoLT5vdmVybGF5X3NldHRpbmdzOworCQlpZiAoIXpyLT52NGxfbWVtZ3JhYl9hY3RpdmUpCisJCQl6cjM2MDU3X292ZXJsYXkoenIsIDEpOworCQkvKiBXaGVuIGEgZ3JhYiBpcyBydW5uaW5nLCB0aGUgdmlkZW8gd2lsbCBiZQorCQkgKiBzd2l0Y2hlZCBvbiB3aGVuIGdyYWIgaXMgZmluaXNoZWQgKi8KKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhlIGNoYW5nZXMgY29tZSBpbnRvIGVmZmVjdCAqLworCXJldHVybiB3YWl0X2dyYWJfcGVuZGluZyh6cik7Cit9CisKKyNpZmRlZiBIQVZFX1Y0TDIKKwkvKiBnZXQgdGhlIHN0YXR1cyBvZiBhIGJ1ZmZlciBpbiB0aGUgY2xpZW50cyBidWZmZXIgcXVldWUgKi8KK3N0YXRpYyBpbnQKK3pvcmFuX3Y0bDJfYnVmZmVyX3N0YXR1cyAoc3RydWN0IGZpbGUgICAgICAgICpmaWxlLAorCQkJICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiwKKwkJCSAgaW50ICAgICAgICAgICAgICAgICBudW0pCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCisJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOworCisJc3dpdGNoIChmaC0+bWFwX21vZGUpIHsKKwljYXNlIFpPUkFOX01BUF9NT0RFX1JBVzoKKworCQkvKiBjaGVjayByYW5nZSAqLworCQlpZiAobnVtIDwgMCB8fCBudW0gPj0gZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzIHx8CisJCSAgICAhZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiB2NGwyX2J1ZmZlcl9zdGF0dXMoKSAtIHdyb25nIG51bWJlciBvciBidWZmZXJzIG5vdCBhbGxvY2F0ZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlidWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCWJ1Zi0+bGVuZ3RoID0gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOworCisJCS8qIGdldCBidWZmZXIgKi8KKwkJYnVmLT5ieXRlc3VzZWQgPSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW251bV0uYnMubGVuZ3RoOworCQlpZiAoZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLnN0YXRlID09IEJVWl9TVEFURV9ET05FIHx8CisJCSAgICBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUgPT0gQlVaX1NUQVRFX1VTRVIpIHsKKwkJCWJ1Zi0+c2VxdWVuY2UgPSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW251bV0uYnMuc2VxOworCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0RPTkU7CisJCQlidWYtPnRpbWVzdGFtcCA9CisJCQkgICAgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLmJzLnRpbWVzdGFtcDsKKwkJfSBlbHNlIHsKKwkJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7CisJCX0KKworCQlpZiAoZmgtPnY0bF9zZXR0aW5ncy5oZWlnaHQgPD0gQlVaX01BWF9IRUlHSFQgLyAyKQorCQkJYnVmLT5maWVsZCA9IFY0TDJfRklFTERfVE9QOworCQllbHNlCisJCQlidWYtPmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCisJCWJyZWFrOworCisJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUkVDOgorCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1BMQVk6CisKKwkJLyogY2hlY2sgcmFuZ2UgKi8KKwkJaWYgKG51bSA8IDAgfHwgbnVtID49IGZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVycyB8fAorCQkgICAgIWZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogdjRsMl9idWZmZXJfc3RhdHVzKCkgLSB3cm9uZyBudW1iZXIgb3IgYnVmZmVycyBub3QgYWxsb2NhdGVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJYnVmLT50eXBlID0gKGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9KUEdfUkVDKSA/CisJCQkgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgOgorCQkJICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ7CisJCWJ1Zi0+bGVuZ3RoID0gZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplOworCisJCS8qIHRoZXNlIHZhcmlhYmxlcyBhcmUgb25seSB3cml0dGVuIGFmdGVyIGZyYW1lIGhhcyBiZWVuIGNhcHR1cmVkICovCisJCWlmIChmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUgPT0gQlVaX1NUQVRFX0RPTkUgfHwKKwkJICAgIGZoLT5qcGdfYnVmZmVycy5idWZmZXJbbnVtXS5zdGF0ZSA9PSBCVVpfU1RBVEVfVVNFUikgeworCQkJYnVmLT5zZXF1ZW5jZSA9IGZoLT5qcGdfYnVmZmVycy5idWZmZXJbbnVtXS5icy5zZXE7CisJCQlidWYtPnRpbWVzdGFtcCA9CisJCQkgICAgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltudW1dLmJzLnRpbWVzdGFtcDsKKwkJCWJ1Zi0+Ynl0ZXN1c2VkID0KKwkJCSAgICBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV0uYnMubGVuZ3RoOworCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0RPTkU7CisJCX0gZWxzZSB7CisJCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOworCQl9CisKKwkJLyogd2hpY2ggZmllbGRzIGFyZSB0aGVzZT8gKi8KKwkJaWYgKGZoLT5qcGdfc2V0dGluZ3MuVG1wRGNtICE9IDEpCisJCQlidWYtPmZpZWxkID0KKwkJCSAgICBmaC0+anBnX3NldHRpbmdzLgorCQkJICAgIG9kZF9ldmVuID8gVjRMMl9GSUVMRF9UT1AgOiBWNEwyX0ZJRUxEX0JPVFRPTTsKKwkJZWxzZQorCQkJYnVmLT5maWVsZCA9CisJCQkgICAgZmgtPmpwZ19zZXR0aW5ncy4KKwkJCSAgICBvZGRfZXZlbiA/IFY0TDJfRklFTERfU0VRX1RCIDoKKwkJCSAgICBWNEwyX0ZJRUxEX1NFUV9CVDsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJZHByaW50ayg1LAorCQkJS0VSTl9FUlIKKwkJCSIlczogdjRsMl9idWZmZXJfc3RhdHVzKCkgLSBpbnZhbGlkIGJ1ZmZlciB0eXBlfG1hcF9tb2RlICglZHwlZClcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgYnVmLT50eXBlLCBmaC0+bWFwX21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJYnVmLT5pbmRleCA9IG51bTsKKwlidWYtPm0ub2Zmc2V0ID0gYnVmLT5sZW5ndGggKiBudW07CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50Cit6b3Jhbl9zZXRfbm9ybSAoc3RydWN0IHpvcmFuICp6ciwKKwkgICAgICAgIGludCAgICAgICAgICAgbm9ybSkgLyogVklERU9fTU9ERV8qICovCit7CisJaW50IG5vcm1fZW5jb2Rlciwgb247CisKKwlpZiAoenItPnY0bF9idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFIHx8CisJICAgIHpyLT5qcGdfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX1dBUk5JTkcKKwkJCSIlczogc2V0X25vcm0oKSBjYWxsZWQgd2hpbGUgaW4gcGxheWJhY2svY2FwdHVyZSBtb2RlXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChsb2NrX25vcm0gJiYgbm9ybSAhPSB6ci0+bm9ybSkgeworCQlpZiAobG9ja19ub3JtID4gMSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fV0FSTklORworCQkJCSIlczogc2V0X25vcm0oKSAtIFRWIHN0YW5kYXJkIGlzIGxvY2tlZCwgY2FuIG5vdCBzd2l0Y2ggbm9ybVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9IGVsc2UgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fV0FSTklORworCQkJCSIlczogc2V0X25vcm0oKSAtIFRWIHN0YW5kYXJkIGlzIGxvY2tlZCwgbm9ybSB3YXMgbm90IGNoYW5nZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJbm9ybSA9IHpyLT5ub3JtOworCQl9CisJfQorCisJaWYgKG5vcm0gIT0gVklERU9fTU9ERV9BVVRPICYmCisJICAgIChub3JtIDwgMCB8fCBub3JtID49IHpyLT5jYXJkLm5vcm1zIHx8CisJICAgICAhenItPmNhcmQudHZuW25vcm1dKSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUiAiJXM6IHNldF9ub3JtKCkgLSB1bnN1cHBvcnRlZCBub3JtICVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIG5vcm0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobm9ybSA9PSBWSURFT19NT0RFX0FVVE8pIHsKKwkJaW50IHN0YXR1czsKKworCQkvKiBpZiB3ZSBoYXZlIGF1dG9kZXRlY3QsIC4uLiAqLworCQlzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9jYXBhYmlsaXR5IGNhcHM7CisJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9HRVRfQ0FQQUJJTElUSUVTLCAmY2Fwcyk7CisJCWlmICghKGNhcHMuZmxhZ3MgJiBWSURFT19ERUNPREVSX0FVVE8pKSB7CisJCQlkcHJpbnRrKDEsIEtFUk5fRVJSICIlczogbm9ybT1hdXRvIHVuc3VwcG9ydGVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9OT1JNLCAmbm9ybSk7CisKKwkJLyogbGV0IGNoYW5nZXMgY29tZSBpbnRvIGVmZmVjdCAqLworCQlzc2xlZXAoMik7CisKKwkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0dFVF9TVEFUVVMsICZzdGF0dXMpOworCQlpZiAoIShzdGF0dXMgJiBERUNPREVSX1NUQVRVU19HT09EKSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBzZXRfbm9ybSgpIC0gbm8gbm9ybSBkZXRlY3RlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQkvKiByZXNldCBub3JtICovCisJCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX05PUk0sICZ6ci0+bm9ybSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBERUNPREVSX1NUQVRVU19OVFNDKQorCQkJbm9ybSA9IFZJREVPX01PREVfTlRTQzsKKwkJZWxzZSBpZiAoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfU0VDQU0pCisJCQlub3JtID0gVklERU9fTU9ERV9TRUNBTTsKKwkJZWxzZQorCQkJbm9ybSA9IFZJREVPX01PREVfUEFMOworCX0KKwl6ci0+dGltaW5nID0genItPmNhcmQudHZuW25vcm1dOworCW5vcm1fZW5jb2RlciA9IG5vcm07CisKKwkvKiBXZSBzd2l0Y2ggb3ZlcmxheSBvZmYgYW5kIG9uIHNpbmNlIGEgY2hhbmdlIGluIHRoZQorCSAqIG5vcm0gbmVlZHMgZGlmZmVyZW50IFZGRSBzZXR0aW5ncyAqLworCW9uID0genItPm92ZXJsYXlfYWN0aXZlICYmICF6ci0+djRsX21lbWdyYWJfYWN0aXZlOworCWlmIChvbikKKwkJenIzNjA1N19vdmVybGF5KHpyLCAwKTsKKworCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfTk9STSwgJm5vcm0pOworCWVuY29kZXJfY29tbWFuZCh6ciwgRU5DT0RFUl9TRVRfTk9STSwgJm5vcm1fZW5jb2Rlcik7CisKKwlpZiAob24pCisJCXpyMzYwNTdfb3ZlcmxheSh6ciwgMSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGNoYW5nZXMgY29tZSBpbnRvIGVmZmVjdCAqLworCXpyLT5ub3JtID0gbm9ybTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit6b3Jhbl9zZXRfaW5wdXQgKHN0cnVjdCB6b3JhbiAqenIsCisJCSBpbnQgICAgICAgICAgIGlucHV0KQoreworCWludCByZWFsaW5wdXQ7CisKKwlpZiAoaW5wdXQgPT0genItPmlucHV0KSB7CisJCXJldHVybiAwOworCX0KKworCWlmICh6ci0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUgfHwKKwkgICAgenItPmpwZ19idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fV0FSTklORworCQkJIiVzOiBzZXRfaW5wdXQoKSBjYWxsZWQgd2hpbGUgaW4gcGxheWJhY2svY2FwdHVyZSBtb2RlXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChpbnB1dCA8IDAgfHwgaW5wdXQgPj0genItPmNhcmQuaW5wdXRzKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHNldF9pbnB1dCgpIC0gdW5uc3VwcG9ydGVkIGlucHV0ICVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGlucHV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVhbGlucHV0ID0genItPmNhcmQuaW5wdXRbaW5wdXRdLm11eHNlbDsKKwl6ci0+aW5wdXQgPSBpbnB1dDsKKworCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfSU5QVVQsICZyZWFsaW5wdXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgIGlvY3RsIHJvdXRpbmUKKyAqLworCitzdGF0aWMgaW50Cit6b3Jhbl9kb19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwKKwkgICAgICAgIHN0cnVjdCBmaWxlICAqZmlsZSwKKwkgICAgICAgIHVuc2lnbmVkIGludCAgY21kLAorCSAgICAgICAgdm9pZCAgICAgICAgICphcmcpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCS8qIENBUkVGVUw6IHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzIGhlcmUgKi8KKwlzdHJ1Y3Qgem9yYW5fanBnX3NldHRpbmdzIHNldHRpbmdzOworCisJLyogd2UgbWlnaHQgaGF2ZSBvbGRlciBidWZmZXJzIGx5aW5nIGFyb3VuZC4uLiBXZSBkb24ndCB3YW50CisJICogdG8gd2FpdCwgYnV0IHdlIGRvIHdhbnQgdG8gdHJ5IGNsZWFuaW5nIHRoZW0gdXAgQVNBUC4gU28KKwkgKiB3ZSB0cnkgdG8gb2J0YWluIHRoZSBsb2NrIGFuZCBmcmVlIHRoZW0uIElmIHRoYXQgZmFpbHMsIHdlCisJICogZG9uJ3QgZG8gYW55dGhpbmcgYW5kIHdhaXQgZm9yIHRoZSBuZXh0IHR1cm4uIEluIHRoZSBlbmQsCisJICogem9yYW5fY2xvc2UoKSBvciBhIG5ldyBhbGxvY2F0aW9uIHdpbGwgc3RpbGwgZnJlZSB0aGVtLi4uCisJICogVGhpcyBpcyBqdXN0IGEgJ3RoZSBzb29uZXIgdGhlIGJldHRlcicgZXh0cmEgJ2ZlYXR1cmUnCisJICoKKwkgKiBXZSBkb24ndCBmcmVlIHRoZSBidWZmZXJzIHJpZ2h0IG9uIG11bm1hcCgpIGJlY2F1c2UgdGhhdAorCSAqIGNhdXNlcyBvb3BzZXMgKGtmcmVlKCkgaW5zaWRlIG11bm1hcCgpIG9vcHNlcyBmb3Igbm8KKwkgKiBhcHBhcmVudCByZWFzb24gLSBpdCdzIGFsc28gbm90IHJlcHJvZHVjZWFibGUgaW4gYW55IHdheSwKKwkgKiBidXQgbW92aW5nIHRoZSBmcmVlIGNvZGUgb3V0c2lkZSB0aGUgbXVubWFwKCkgaGFuZGxlciBmaXhlcworCSAqIGFsbCB0aGlzLi4uIElmIHNvbWVvbmUga25vd3Mgd2h5LCBwbGVhc2UgZXhwbGFpbiBtZSAoUm9uYWxkKQorCSAqLworCWlmICghZG93bl90cnlsb2NrKCZ6ci0+cmVzb3VyY2VfbG9jaykpIHsKKwkJLyogd2Ugb2J0YWluZWQgaXQhIExldCdzIHRyeSB0byBmcmVlIHNvbWUgdGhpbmdzICovCisJCWlmIChmaC0+anBnX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQpCisJCQlqcGdfZmJ1ZmZlcl9mcmVlKGZpbGUpOworCQlpZiAoZmgtPnY0bF9idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkKQorCQkJdjRsX2ZidWZmZXJfZnJlZShmaWxlKTsKKworCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCX0KKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIFZJRElPQ0dDQVA6CisJeworCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqdmNhcCA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHQ0FQXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJbWVtc2V0KHZjYXAsIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSkpOworCQlzdHJuY3B5KHZjYXAtPm5hbWUsIFpSX0RFVk5BTUUoenIpLCBzaXplb2YodmNhcC0+bmFtZSkpOworCQl2Y2FwLT50eXBlID0gWk9SQU5fVklEX1RZUEU7CisKKwkJdmNhcC0+Y2hhbm5lbHMgPSB6ci0+Y2FyZC5pbnB1dHM7CisJCXZjYXAtPmF1ZGlvcyA9IDA7CisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJdmNhcC0+bWF4d2lkdGggPSBCVVpfTUFYX1dJRFRIOworCQl2Y2FwLT5tYXhoZWlnaHQgPSBCVVpfTUFYX0hFSUdIVDsKKwkJdmNhcC0+bWlud2lkdGggPSBCVVpfTUlOX1dJRFRIOworCQl2Y2FwLT5taW5oZWlnaHQgPSBCVVpfTUlOX0hFSUdIVDsKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NHQ0hBTjoKKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2Y2hhbiA9IGFyZzsKKwkJaW50IGNoYW5uZWwgPSB2Y2hhbi0+Y2hhbm5lbDsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHQ0hBTiAtIGNoYW5uZWw9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgdmNoYW4tPmNoYW5uZWwpOworCisJCW1lbXNldCh2Y2hhbiwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19jaGFubmVsKSk7CisJCWlmIChjaGFubmVsID4genItPmNhcmQuaW5wdXRzIHx8IGNoYW5uZWwgPCAwKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ0dDSEFOIG9uIG5vdCBleGlzdGluZyBjaGFubmVsICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBjaGFubmVsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3RyY3B5KHZjaGFuLT5uYW1lLCB6ci0+Y2FyZC5pbnB1dFtjaGFubmVsXS5uYW1lKTsKKworCQl2Y2hhbi0+dHVuZXJzID0gMDsKKwkJdmNoYW4tPmZsYWdzID0gMDsKKwkJdmNoYW4tPnR5cGUgPSBWSURFT19UWVBFX0NBTUVSQTsKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCQl2Y2hhbi0+bm9ybSA9IHpyLT5ub3JtOworCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCQl2Y2hhbi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCQkvKiBSSjogdGhlIGRvY3VtZW50YXRpb24gYXQgaHR0cDovL3JvYWRydW5uZXIuc3dhbnNlYS5saW51eC5vcmcudWsvdjRsYXBpLnNodG1sIHNheXM6CisJCSAqIAorCQkgKiAqICJUaGUgVklESU9DU0NIQU4gaW9jdGwgdGFrZXMgYW4gaW50ZWdlciBhcmd1bWVudCBhbmQgc3dpdGNoZXMgdGhlIGNhcHR1cmUgdG8gdGhpcyBpbnB1dC4iCisJCSAqICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eCisJCSAqICogVGhlIGZhbW9zIEJUVFYgZHJpdmVyIGhhcyBpdCBpbXBsZW1lbnRlZCB3aXRoIGEgc3RydWN0IHZpZGVvX2NoYW5uZWwgYXJndW1lbnQKKwkJICogKiBhbmQgd2UgZm9sbG93IGl0IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMKKwkJICogKgorCQkgKiAqIEJUVzogdGhpcyBpcyB0aGUgb25seSB3YXkgdGhlIHVzZXIgY2FuIHNldCB0aGUgbm9ybSEKKwkJICovCisKKwljYXNlIFZJRElPQ1NDSEFOOgorCXsKKwkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnZjaGFuID0gYXJnOworCQlpbnQgcmVzOworCisJCWRwcmludGsoMywKKwkJCUtFUk5fREVCVUcKKwkJCSIlczogVklESU9DU0NIQU4gLSBjaGFubmVsPSVkLCBub3JtPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHZjaGFuLT5jaGFubmVsLCB2Y2hhbi0+bm9ybSk7CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCQlpZiAoKHJlcyA9IHpvcmFuX3NldF9pbnB1dCh6ciwgdmNoYW4tPmNoYW5uZWwpKSkKKwkJCWdvdG8gc2NoYW5fdW5sb2NrX2FuZF9yZXR1cm47CisJCWlmICgocmVzID0gem9yYW5fc2V0X25vcm0oenIsIHZjaGFuLT5ub3JtKSkpCisJCQlnb3RvIHNjaGFuX3VubG9ja19hbmRfcmV0dXJuOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgY2hhbmdlcyBjb21lIGludG8gZWZmZWN0ICovCisJCXJlcyA9IHdhaXRfZ3JhYl9wZW5kaW5nKHpyKTsKKwlzY2hhbl91bmxvY2tfYW5kX3JldHVybjoKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NHUElDVDoKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICp2cGljdCA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHUElDVFxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCW1lbXNldCh2cGljdCwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19waWN0dXJlKSk7CisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJdnBpY3QtPmh1ZSA9IHpyLT5odWU7CisJCXZwaWN0LT5icmlnaHRuZXNzID0genItPmJyaWdodG5lc3M7CisJCXZwaWN0LT5jb250cmFzdCA9IHpyLT5jb250cmFzdDsKKwkJdnBpY3QtPmNvbG91ciA9IHpyLT5zYXR1cmF0aW9uOworCQlpZiAoZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0KSB7CisJCQl2cGljdC0+ZGVwdGggPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQtPmRlcHRoOworCQkJdnBpY3QtPnBhbGV0dGUgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQtPnBhbGV0dGU7CisJCX0gZWxzZSB7CisJCQl2cGljdC0+ZGVwdGggPSAwOworCQl9CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DU1BJQ1Q6CisJeworCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqdnBpY3QgPSBhcmc7CisJCWludCBpOworCisJCWRwcmludGsoMywKKwkJCUtFUk5fREVCVUcKKwkJCSIlczogVklESU9DU1BJQ1QgLSBicmk9JWQsIGh1ZT0lZCwgY29sPSVkLCBjb249JWQsIGRlcD0lZCwgcGFsPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHZwaWN0LT5icmlnaHRuZXNzLCB2cGljdC0+aHVlLAorCQkJdnBpY3QtPmNvbG91ciwgdnBpY3QtPmNvbnRyYXN0LCB2cGljdC0+ZGVwdGgsCisJCQl2cGljdC0+cGFsZXR0ZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bV9mb3JtYXRzOyBpKyspIHsKKwkJCWNvbnN0IHN0cnVjdCB6b3Jhbl9mb3JtYXQgKmZtdCA9ICZ6b3Jhbl9mb3JtYXRzW2ldOworCisJCQlpZiAoZm10LT5wYWxldHRlICE9IC0xICYmCisJCQkgICAgZm10LT5mbGFncyAmIFpPUkFOX0ZPUk1BVF9PVkVSTEFZICYmCisJCQkgICAgZm10LT5wYWxldHRlID09IHZwaWN0LT5wYWxldHRlICYmCisJCQkgICAgZm10LT5kZXB0aCA9PSB2cGljdC0+ZGVwdGgpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gem9yYW5fbnVtX2Zvcm1hdHMpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DU1BJQ1QgLSBJbnZhbGlkIHBhbGV0dGUgJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIHZwaWN0LT5wYWxldHRlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfUElDVFVSRSwgdnBpY3QpOworCisJCXpyLT5odWUgPSB2cGljdC0+aHVlOworCQl6ci0+Y29udHJhc3QgPSB2cGljdC0+Y29udHJhc3Q7CisJCXpyLT5zYXR1cmF0aW9uID0gdnBpY3QtPmNvbG91cjsKKwkJenItPmJyaWdodG5lc3MgPSB2cGljdC0+YnJpZ2h0bmVzczsKKworCQlmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQgPSAmem9yYW5fZm9ybWF0c1tpXTsKKworCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ0NBUFRVUkU6CisJeworCQlpbnQgKm9uID0gYXJnLCByZXM7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DQ0FQVFVSRSAtIG9uPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksICpvbik7CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCQlyZXMgPSBzZXR1cF9vdmVybGF5KGZpbGUsICpvbik7CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NHV0lOOgorCXsKKwkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdndpbiA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHV0lOXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJbWVtc2V0KHZ3aW4sIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fd2luZG93KSk7CisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJdndpbi0+eCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLng7CisJCXZ3aW4tPnkgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy55OworCQl2d2luLT53aWR0aCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLndpZHRoOworCQl2d2luLT5oZWlnaHQgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQ7CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXZ3aW4tPmNsaXBjb3VudCA9IDA7CisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ1NXSU46CisJeworCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2d2luID0gYXJnOworCQlpbnQgcmVzOworCisJCWRwcmludGsoMywKKwkJCUtFUk5fREVCVUcKKwkJCSIlczogVklESU9DU1dJTiAtIHg9JWQsIHk9JWQsIHc9JWQsIGg9JWQsIGNsaXBjb3VudD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCB2d2luLT54LCB2d2luLT55LCB2d2luLT53aWR0aCwKKwkJCXZ3aW4tPmhlaWdodCwgdndpbi0+Y2xpcGNvdW50KTsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJlcyA9CisJCSAgICBzZXR1cF93aW5kb3coZmlsZSwgdndpbi0+eCwgdndpbi0+eSwgdndpbi0+d2lkdGgsCisJCQkJIHZ3aW4tPmhlaWdodCwgdndpbi0+Y2xpcHMsCisJCQkJIHZ3aW4tPmNsaXBjb3VudCwgTlVMTCk7CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NHRkJVRjoKKwl7CisJCXN0cnVjdCB2aWRlb19idWZmZXIgKnZidWYgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DR0ZCVUZcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCSp2YnVmID0genItPmJ1ZmZlcjsKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DU0ZCVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyICp2YnVmID0gYXJnOworCQlpbnQgaSwgcmVzID0gMDsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHCisJCQkiJXM6IFZJRElPQ1NGQlVGIC0gYmFzZT0lcCwgdz0lZCwgaD0lZCwgZGVwdGg9JWQsIGJwbD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCB2YnVmLT5iYXNlLCB2YnVmLT53aWR0aCwKKwkJCXZidWYtPmhlaWdodCwgdmJ1Zi0+ZGVwdGgsIHZidWYtPmJ5dGVzcGVybGluZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bV9mb3JtYXRzOyBpKyspCisJCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5kZXB0aCA9PSB2YnVmLT5kZXB0aCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gem9yYW5fbnVtX2Zvcm1hdHMpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DU0ZCVUYgLSBpbnZhbGlkIGZidWYgZGVwdGggJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIHZidWYtPmRlcHRoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCQlyZXMgPQorCQkgICAgc2V0dXBfZmJ1ZmZlcihmaWxlLCB2YnVmLT5iYXNlLCAmem9yYW5fZm9ybWF0c1tpXSwKKwkJCQkgIHZidWYtPndpZHRoLCB2YnVmLT5oZWlnaHQsCisJCQkJICB2YnVmLT5ieXRlc3BlcmxpbmUpOworCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DU1lOQzoKKwl7CisJCWludCAqZnJhbWUgPSBhcmcsIHJlczsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NTWU5DIC0gZnJhbWU9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgKmZyYW1lKTsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJlcyA9IHY0bF9zeW5jKGZpbGUsICpmcmFtZSk7CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCWlmICghcmVzKQorCQkJenItPnY0bF9zeW5jX3RhaWwrKzsKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NNQ0FQVFVSRToKKwl7CisJCXN0cnVjdCB2aWRlb19tbWFwICp2bWFwID0gYXJnOworCQlpbnQgcmVzOworCisJCWRwcmludGsoMywKKwkJCUtFUk5fREVCVUcKKwkJCSIlczogVklESU9DTUNBUFRVUkUgLSBmcmFtZT0lZCwgZ2VvbT0lZHglZCwgZm10PSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHZtYXAtPmZyYW1lLCB2bWFwLT53aWR0aCwgdm1hcC0+aGVpZ2h0LAorCQkJdm1hcC0+Zm9ybWF0KTsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJlcyA9IHY0bF9ncmFiKGZpbGUsIHZtYXApOworCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ0dNQlVGOgorCXsKKwkJc3RydWN0IHZpZGVvX21idWYgKnZtYnVmID0gYXJnOworCQlpbnQgaSwgcmVzID0gMDsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHTUJVRlxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCXZtYnVmLT5zaXplID0KKwkJICAgIGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyAqCisJCSAgICBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7CisJCXZtYnVmLT5mcmFtZXMgPSBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnM7CisJCWZvciAoaSA9IDA7IGkgPCB2bWJ1Zi0+ZnJhbWVzOyBpKyspIHsKKwkJCXZtYnVmLT5vZmZzZXRzW2ldID0KKwkJCSAgICBpICogZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOworCQl9CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCWlmIChmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkIHx8IGZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DR01CVUYgLSBidWZmZXJzIGFscmVhZHkgYWxsb2NhdGVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIHY0bDFyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQlpZiAodjRsX2ZidWZmZXJfYWxsb2MoZmlsZSkpIHsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIHY0bDFyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQkvKiBUaGUgbmV4dCBtbWFwIHdpbGwgbWFwIHRoZSBWNEwgYnVmZmVycyAqLworCQlmaC0+bWFwX21vZGUgPSBaT1JBTl9NQVBfTU9ERV9SQVc7CisJdjRsMXJlcWJ1Zl91bmxvY2tfYW5kX3JldHVybjoKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ0dVTklUOgorCXsKKwkJc3RydWN0IHZpZGVvX3VuaXQgKnZ1bml0ID0gYXJnOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ0dVTklUXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJdnVuaXQtPnZpZGVvID0genItPnZpZGVvX2Rldi0+bWlub3I7CisJCXZ1bml0LT52YmkgPSBWSURFT19OT19VTklUOworCQl2dW5pdC0+cmFkaW8gPSBWSURFT19OT19VTklUOworCQl2dW5pdC0+YXVkaW8gPSBWSURFT19OT19VTklUOworCQl2dW5pdC0+dGVsZXRleHQgPSBWSURFT19OT19VTklUOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwkJLyoKKwkJICogUko6IEluIHByaW5jaXBhbCB3ZSBjb3VsZCBzdXBwb3J0IHN1YmNhcHR1cmVzIGZvciBWNEwgZ3JhYmJpbmcuCisJCSAqICAgICBOb3QgZXZlbiB0aGUgZmFtb3VzIEJUVFYgZHJpdmVyIGhhcyB0aGVtLCBob3dldmVyLgorCQkgKiAgICAgSWYgdGhlcmUgc2hvdWxkIGJlIGEgc3Ryb25nIGRlbWFuZCwgb25lIGNvdWxkIGNvbnNpZGVyCisJCSAqICAgICB0byBpbXBsZW1lbnQgdGhlbS4KKwkJICovCisJY2FzZSBWSURJT0NHQ0FQVFVSRToKKwl7CisJCWRwcmludGsoMywgS0VSTl9FUlIgIiVzOiBWSURJT0NHQ0FQVFVSRSBub3Qgc3VwcG9ydGVkXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NTQ0FQVFVSRToKKwl7CisJCWRwcmludGsoMywgS0VSTl9FUlIgIiVzOiBWSURJT0NTQ0FQVFVSRSBub3Qgc3VwcG9ydGVkXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBCVVpJT0NfR19QQVJBTVM6CisJeworCQlzdHJ1Y3Qgem9yYW5fcGFyYW1zICpicGFyYW1zID0gYXJnOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IEJVWklPQ19HX1BBUkFNU1xuIiwgWlJfREVWTkFNRSh6cikpOworCisJCW1lbXNldChicGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IHpvcmFuX3BhcmFtcykpOworCQlicGFyYW1zLT5tYWpvcl92ZXJzaW9uID0gTUFKT1JfVkVSU0lPTjsKKwkJYnBhcmFtcy0+bWlub3JfdmVyc2lvbiA9IE1JTk9SX1ZFUlNJT047CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCWJwYXJhbXMtPm5vcm0gPSB6ci0+bm9ybTsKKwkJYnBhcmFtcy0+aW5wdXQgPSB6ci0+aW5wdXQ7CisKKwkJYnBhcmFtcy0+ZGVjaW1hdGlvbiA9IGZoLT5qcGdfc2V0dGluZ3MuZGVjaW1hdGlvbjsKKwkJYnBhcmFtcy0+SG9yRGNtID0gZmgtPmpwZ19zZXR0aW5ncy5Ib3JEY207CisJCWJwYXJhbXMtPlZlckRjbSA9IGZoLT5qcGdfc2V0dGluZ3MuVmVyRGNtOworCQlicGFyYW1zLT5UbXBEY20gPSBmaC0+anBnX3NldHRpbmdzLlRtcERjbTsKKwkJYnBhcmFtcy0+ZmllbGRfcGVyX2J1ZmYgPSBmaC0+anBnX3NldHRpbmdzLmZpZWxkX3Blcl9idWZmOworCQlicGFyYW1zLT5pbWdfeCA9IGZoLT5qcGdfc2V0dGluZ3MuaW1nX3g7CisJCWJwYXJhbXMtPmltZ195ID0gZmgtPmpwZ19zZXR0aW5ncy5pbWdfeTsKKwkJYnBhcmFtcy0+aW1nX3dpZHRoID0gZmgtPmpwZ19zZXR0aW5ncy5pbWdfd2lkdGg7CisJCWJwYXJhbXMtPmltZ19oZWlnaHQgPSBmaC0+anBnX3NldHRpbmdzLmltZ19oZWlnaHQ7CisJCWJwYXJhbXMtPm9kZF9ldmVuID0gZmgtPmpwZ19zZXR0aW5ncy5vZGRfZXZlbjsKKworCQlicGFyYW1zLT5xdWFsaXR5ID0gZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5xdWFsaXR5OworCQlicGFyYW1zLT5BUFBuID0gZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBuOworCQlicGFyYW1zLT5BUFBfbGVuID0gZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfbGVuOworCQltZW1jcHkoYnBhcmFtcy0+QVBQX2RhdGEsCisJCSAgICAgICBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUF9kYXRhLAorCQkgICAgICAgc2l6ZW9mKGJwYXJhbXMtPkFQUF9kYXRhKSk7CisJCWJwYXJhbXMtPkNPTV9sZW4gPSB6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9sZW47CisJCW1lbWNweShicGFyYW1zLT5DT01fZGF0YSwKKwkJICAgICAgIGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQ09NX2RhdGEsCisJCSAgICAgICBzaXplb2YoYnBhcmFtcy0+Q09NX2RhdGEpKTsKKwkJYnBhcmFtcy0+anBlZ19tYXJrZXJzID0KKwkJICAgIGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuanBlZ19tYXJrZXJzOworCisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJYnBhcmFtcy0+VkZJRk9fRkIgPSAwOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIEJVWklPQ19TX1BBUkFNUzoKKwl7CisJCXN0cnVjdCB6b3Jhbl9wYXJhbXMgKmJwYXJhbXMgPSBhcmc7CisJCWludCByZXMgPSAwOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IEJVWklPQ19TX1BBUkFNU1xuIiwgWlJfREVWTkFNRSh6cikpOworCisJCXNldHRpbmdzLmRlY2ltYXRpb24gPSBicGFyYW1zLT5kZWNpbWF0aW9uOworCQlzZXR0aW5ncy5Ib3JEY20gPSBicGFyYW1zLT5Ib3JEY207CisJCXNldHRpbmdzLlZlckRjbSA9IGJwYXJhbXMtPlZlckRjbTsKKwkJc2V0dGluZ3MuVG1wRGNtID0gYnBhcmFtcy0+VG1wRGNtOworCQlzZXR0aW5ncy5maWVsZF9wZXJfYnVmZiA9IGJwYXJhbXMtPmZpZWxkX3Blcl9idWZmOworCQlzZXR0aW5ncy5pbWdfeCA9IGJwYXJhbXMtPmltZ194OworCQlzZXR0aW5ncy5pbWdfeSA9IGJwYXJhbXMtPmltZ195OworCQlzZXR0aW5ncy5pbWdfd2lkdGggPSBicGFyYW1zLT5pbWdfd2lkdGg7CisJCXNldHRpbmdzLmltZ19oZWlnaHQgPSBicGFyYW1zLT5pbWdfaGVpZ2h0OworCQlzZXR0aW5ncy5vZGRfZXZlbiA9IGJwYXJhbXMtPm9kZF9ldmVuOworCisJCXNldHRpbmdzLmpwZ19jb21wLnF1YWxpdHkgPSBicGFyYW1zLT5xdWFsaXR5OworCQlzZXR0aW5ncy5qcGdfY29tcC5BUFBuID0gYnBhcmFtcy0+QVBQbjsKKwkJc2V0dGluZ3MuanBnX2NvbXAuQVBQX2xlbiA9IGJwYXJhbXMtPkFQUF9sZW47CisJCW1lbWNweShzZXR0aW5ncy5qcGdfY29tcC5BUFBfZGF0YSwgYnBhcmFtcy0+QVBQX2RhdGEsCisJCSAgICAgICBzaXplb2YoYnBhcmFtcy0+QVBQX2RhdGEpKTsKKwkJc2V0dGluZ3MuanBnX2NvbXAuQ09NX2xlbiA9IGJwYXJhbXMtPkNPTV9sZW47CisJCW1lbWNweShzZXR0aW5ncy5qcGdfY29tcC5DT01fZGF0YSwgYnBhcmFtcy0+Q09NX2RhdGEsCisJCSAgICAgICBzaXplb2YoYnBhcmFtcy0+Q09NX2RhdGEpKTsKKwkJc2V0dGluZ3MuanBnX2NvbXAuanBlZ19tYXJrZXJzID0gYnBhcmFtcy0+anBlZ19tYXJrZXJzOworCisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlpZiAoenItPmNvZGVjX21vZGUgIT0gQlVaX01PREVfSURMRSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBCVVpJT0NfU19QQVJBTVMgY2FsbGVkLCBidXQgQnV6IGluIGNhcHR1cmUvcGxheWJhY2sgbW9kZVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byBzcGFyYW1zX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisKKwkJLyogQ2hlY2sgdGhlIHBhcmFtcyBmaXJzdCBiZWZvcmUgb3ZlcndyaXRpbmcgb3VyCisJCSAqIG50ZXJuYWwgdmFsdWVzICovCisJCWlmICh6b3Jhbl9jaGVja19qcGdfc2V0dGluZ3MoenIsICZzZXR0aW5ncykpIHsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIHNwYXJhbXNfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQlmaC0+anBnX3NldHRpbmdzID0gc2V0dGluZ3M7CisJc3BhcmFtc191bmxvY2tfYW5kX3JldHVybjoKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIEJVWklPQ19SRVFCVUZTOgorCXsKKwkJc3RydWN0IHpvcmFuX3JlcXVlc3RidWZmZXJzICpicmVxID0gYXJnOworCQlpbnQgcmVzID0gMDsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHCisJCQkiJXM6IEJVWklPQ19SRVFCVUZTIC0gY291bnQ9JWx1LCBzaXplPSVsdVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBicmVxLT5jb3VudCwgYnJlcS0+c2l6ZSk7CisKKwkJLyogRW5mb3JjZSByZWFzb25hYmxlIGxvd2VyIGFuZCB1cHBlciBsaW1pdHMgKi8KKwkJaWYgKGJyZXEtPmNvdW50IDwgNCkKKwkJCWJyZXEtPmNvdW50ID0gNDsJLyogQ291bGQgYmUgY2hvb3NlbiBzbWFsbGVyICovCisJCWlmIChicmVxLT5jb3VudCA+IGpwZ19uYnVmcykKKwkJCWJyZXEtPmNvdW50ID0ganBnX25idWZzOworCQlicmVxLT5zaXplID0gUEFHRV9BTElHTihicmVxLT5zaXplKTsKKwkJaWYgKGJyZXEtPnNpemUgPCA4MTkyKQorCQkJYnJlcS0+c2l6ZSA9IDgxOTI7CS8qIEFyYml0cmFyeSAqLworCQkvKiBicmVxLT5zaXplIGlzIGxpbWl0ZWQgYnkgMSBwYWdlIGZvciB0aGUgc3RhdF9jb20KKwkJICogdGFibGVzIHRvIGEgTWF4aW11bSBvZiAyIE1CICovCisJCWlmIChicmVxLT5zaXplID4ganBnX2J1ZnNpemUpCisJCQlicmVxLT5zaXplID0ganBnX2J1ZnNpemU7CisJCWlmIChmaC0+anBnX2J1ZmZlcnMubmVlZF9jb250aWd1b3VzICYmCisJCSAgICBicmVxLT5zaXplID4gTUFYX0tNQUxMT0NfTUVNKQorCQkJYnJlcS0+c2l6ZSA9IE1BWF9LTUFMTE9DX01FTTsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJaWYgKGZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgfHwgZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBCVVpJT0NfUkVRQlVGUyAtIGJ1ZmZlcnMgYWxscmVhZHkgYWxsb2NhdGVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FQlVTWTsKKwkJCWdvdG8ganBncmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisKKwkJZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzID0gYnJlcS0+Y291bnQ7CisJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSA9IGJyZXEtPnNpemU7CisKKwkJaWYgKGpwZ19mYnVmZmVyX2FsbG9jKGZpbGUpKSB7CisJCQlyZXMgPSAtRU5PTUVNOworCQkJZ290byBqcGdyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQkvKiBUaGUgbmV4dCBtbWFwIHdpbGwgbWFwIHRoZSBNSlBFRyBidWZmZXJzIC0gY291bGQKKwkJICogYWxzbyBiZSAqX1BMQVksIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBoZXJlICovCisJCWZoLT5tYXBfbW9kZSA9IFpPUkFOX01BUF9NT0RFX0pQR19SRUM7CisJanBncmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOgorCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgQlVaSU9DX1FCVUZfQ0FQVDoKKwl7CisJCWludCAqZnJhbWUgPSBhcmcsIHJlczsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBCVVpJT0NfUUJVRl9DQVBUIC0gZnJhbWU9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgKmZyYW1lKTsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJlcyA9IGpwZ19xYnVmKGZpbGUsICpmcmFtZSwgQlVaX01PREVfTU9USU9OX0NPTVBSRVNTKTsKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIEJVWklPQ19RQlVGX1BMQVk6CisJeworCQlpbnQgKmZyYW1lID0gYXJnLCByZXM7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogQlVaSU9DX1FCVUZfUExBWSAtIGZyYW1lPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksICpmcmFtZSk7CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCQlyZXMgPSBqcGdfcWJ1ZihmaWxlLCAqZnJhbWUsIEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTKTsKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIEJVWklPQ19TWU5DOgorCXsKKwkJc3RydWN0IHpvcmFuX3N5bmMgKmJzeW5jID0gYXJnOworCQlpbnQgcmVzOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IEJVWklPQ19TWU5DXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCQlyZXMgPSBqcGdfc3luYyhmaWxlLCBic3luYyk7CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBCVVpJT0NfR19TVEFUVVM6CisJeworCQlzdHJ1Y3Qgem9yYW5fc3RhdHVzICpic3RhdCA9IGFyZzsKKwkJaW50IG5vcm0sIGlucHV0LCBzdGF0dXMsIHJlcyA9IDA7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogQlVaSU9DX0dfU1RBVFVTXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJaWYgKHpyLT5jb2RlY19tb2RlICE9IEJVWl9NT0RFX0lETEUpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogQlVaSU9DX0dfU1RBVFVTIGNhbGxlZCBidXQgQnV6IGluIGNhcHR1cmUvcGxheWJhY2sgbW9kZVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlucHV0ID0genItPmNhcmQuaW5wdXRbYnN0YXQtPmlucHV0XS5tdXhzZWw7CisJCW5vcm0gPSBWSURFT19NT0RFX0FVVE87CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCWlmICh6ci0+Y29kZWNfbW9kZSAhPSBCVVpfTU9ERV9JRExFKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IEJVWklPQ19HX1NUQVRVUyBjYWxsZWQsIGJ1dCBCdXogaW4gY2FwdHVyZS9wbGF5YmFjayBtb2RlXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIGdzdGF0X3VubG9ja19hbmRfcmV0dXJuOworCQl9CisKKwkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9JTlBVVCwgJmlucHV0KTsKKwkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9OT1JNLCAmbm9ybSk7CisKKwkJLyogc2xlZXAgMSBzZWNvbmQgKi8KKwkJc3NsZWVwKDEpOworCisJCS8qIEdldCBzdGF0dXMgb2YgdmlkZW8gZGVjb2RlciAqLworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfR0VUX1NUQVRVUywgJnN0YXR1cyk7CisKKwkJLyogcmVzdG9yZSBwcmV2aW91cyBpbnB1dCBhbmQgbm9ybSAqLworCQlpbnB1dCA9IHpyLT5jYXJkLmlucHV0W3pyLT5pbnB1dF0ubXV4c2VsOworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX0lOUFVULCAmaW5wdXQpOworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX05PUk0sICZ6ci0+bm9ybSk7CisJZ3N0YXRfdW5sb2NrX2FuZF9yZXR1cm46CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJaWYgKCFyZXMpIHsKKwkJCWJzdGF0LT5zaWduYWwgPQorCQkJICAgIChzdGF0dXMgJiBERUNPREVSX1NUQVRVU19HT09EKSA/IDEgOiAwOworCQkJaWYgKHN0YXR1cyAmIERFQ09ERVJfU1RBVFVTX05UU0MpCisJCQkJYnN0YXQtPm5vcm0gPSBWSURFT19NT0RFX05UU0M7CisJCQllbHNlIGlmIChzdGF0dXMgJiBERUNPREVSX1NUQVRVU19TRUNBTSkKKwkJCQlic3RhdC0+bm9ybSA9IFZJREVPX01PREVfU0VDQU07CisJCQllbHNlCisJCQkJYnN0YXQtPm5vcm0gPSBWSURFT19NT0RFX1BBTDsKKworCQkJYnN0YXQtPmNvbG9yID0KKwkJCSAgICAoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfQ09MT1IpID8gMSA6IDA7CisJCX0KKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKyNpZmRlZiBIQVZFX1Y0TDIKKworCQkvKiBUaGUgbmV3IHZpZGVvNGxpbnV4MiBjYXB0dXJlIGludGVyZmFjZSAtIG11Y2ggbmljZXIgdGhhbiB2aWRlbzRsaW51eDEsIHNpbmNlCisJCSAqIGl0IGFsbG93cyBmb3IgaW50ZWdyYXRpbmcgdGhlIEpQRUcgY2FwdHVyaW5nIGNhbGxzIGluc2lkZSBzdGFuZGFyZCB2NGwyCisJCSAqLworCisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1FVRVJZQ0FQXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKCpjYXApKTsKKwkJc3RybmNweShjYXAtPmNhcmQsIFpSX0RFVk5BTUUoenIpLCBzaXplb2YoY2FwLT5jYXJkKSk7CisJCXN0cm5jcHkoY2FwLT5kcml2ZXIsICJ6b3JhbiIsIHNpemVvZihjYXAtPmRyaXZlcikpOworCQlzbnByaW50ZihjYXAtPmJ1c19pbmZvLCBzaXplb2YoY2FwLT5idXNfaW5mbyksICJQQ0k6JXMiLAorCQkJIHBjaV9uYW1lKHpyLT5wY2lfZGV2KSk7CisJCWNhcC0+dmVyc2lvbiA9CisJCSAgICBLRVJORUxfVkVSU0lPTihNQUpPUl9WRVJTSU9OLCBNSU5PUl9WRVJTSU9OLAorCQkJCSAgIFJFTEVBU0VfVkVSU0lPTik7CisJCWNhcC0+Y2FwYWJpbGl0aWVzID0gWk9SQU5fVjRMMl9WSURfRkxBR1M7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX0VOVU1fRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10ID0gYXJnOworCQlpbnQgaW5kZXggPSBmbXQtPmluZGV4LCBudW0gPSAtMSwgaSwgZmxhZyA9IDAsIHR5cGUgPQorCQkgICAgZm10LT50eXBlOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19FTlVNX0ZNVCAtIGluZGV4PSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGZtdC0+aW5kZXgpOworCisJCXN3aXRjaCAoZm10LT50eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQkJZmxhZyA9IFpPUkFOX0ZPUk1BVF9DQVBUVVJFOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisJCQlmbGFnID0gWk9SQU5fRk9STUFUX1BMQVlCQUNLOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCQkJZmxhZyA9IFpPUkFOX0ZPUk1BVF9PVkVSTEFZOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19FTlVNX0ZNVCAtIHVua25vd24gdHlwZSAlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgZm10LT50eXBlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bV9mb3JtYXRzOyBpKyspIHsKKwkJCWlmICh6b3Jhbl9mb3JtYXRzW2ldLmZsYWdzICYgZmxhZykKKwkJCQludW0rKzsKKwkJCWlmIChudW0gPT0gZm10LT5pbmRleCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoZm10LT5pbmRleCA8IDAgLyogbGF0ZSwgYnV0IG5vdCB0b28gbGF0ZSAqLyAgfHwKKwkJICAgIGkgPT0gem9yYW5fbnVtX2Zvcm1hdHMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQltZW1zZXQoZm10LCAwLCBzaXplb2YoKmZtdCkpOworCQlmbXQtPmluZGV4ID0gaW5kZXg7CisJCWZtdC0+dHlwZSA9IHR5cGU7CisJCXN0cm5jcHkoZm10LT5kZXNjcmlwdGlvbiwgem9yYW5fZm9ybWF0c1tpXS5uYW1lLCAzMSk7CisJCWZtdC0+cGl4ZWxmb3JtYXQgPSB6b3Jhbl9mb3JtYXRzW2ldLmZvdXJjYzsKKwkJaWYgKHpvcmFuX2Zvcm1hdHNbaV0uZmxhZ3MgJiBaT1JBTl9GT1JNQVRfQ09NUFJFU1NFRCkKKwkJCWZtdC0+ZmxhZ3MgfD0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19HX0ZNVDoKKwl7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10ID0gYXJnOworCQlpbnQgdHlwZSA9IGZtdC0+dHlwZTsKKworCQlkcHJpbnRrKDUsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfR19GTVRcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCQltZW1zZXQoZm10LCAwLCBzaXplb2YoKmZtdCkpOworCQlmbXQtPnR5cGUgPSB0eXBlOworCisJCXN3aXRjaCAoZm10LT50eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCisJCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJCWZtdC0+Zm10Lndpbi53LmxlZnQgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy54OworCQkJZm10LT5mbXQud2luLncudG9wID0gZmgtPm92ZXJsYXlfc2V0dGluZ3MueTsKKwkJCWZtdC0+Zm10Lndpbi53LndpZHRoID0gZmgtPm92ZXJsYXlfc2V0dGluZ3Mud2lkdGg7CisJCQlmbXQtPmZtdC53aW4udy5oZWlnaHQgPQorCQkJICAgIGZoLT5vdmVybGF5X3NldHRpbmdzLmhlaWdodDsKKwkJCWlmIChmaC0+b3ZlcmxheV9zZXR0aW5ncy53aWR0aCAqIDIgPgorCQkJICAgIEJVWl9NQVhfSEVJR0hUKQorCQkJCWZtdC0+Zm10Lndpbi5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJCWVsc2UKKwkJCQlmbXQtPmZtdC53aW4uZmllbGQgPSBWNEwyX0ZJRUxEX1RPUDsKKworCQkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisKKwkJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQkJaWYgKGZtdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgJiYKKwkJCSAgICBmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfUkFXKSB7CisKKwkJCQlmbXQtPmZtdC5waXgud2lkdGggPQorCQkJCSAgICBmaC0+djRsX3NldHRpbmdzLndpZHRoOworCQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPQorCQkJCSAgICBmaC0+djRsX3NldHRpbmdzLmhlaWdodDsKKwkJCQlmbXQtPmZtdC5waXguc2l6ZWltYWdlID0KKwkJCQkgICAgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOworCQkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9CisJCQkJICAgIGZoLT52NGxfc2V0dGluZ3MuZm9ybWF0LT5mb3VyY2M7CisJCQkJZm10LT5mbXQucGl4LmNvbG9yc3BhY2UgPQorCQkJCSAgICBmaC0+djRsX3NldHRpbmdzLmZvcm1hdC0+Y29sb3JzcGFjZTsKKwkJCQlmbXQtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gMDsKKwkJCQlpZiAoQlVaX01BWF9IRUlHSFQgPAorCQkJCSAgICAoZmgtPnY0bF9zZXR0aW5ncy5oZWlnaHQgKiAyKSkKKwkJCQkJZm10LT5mbXQucGl4LmZpZWxkID0KKwkJCQkJICAgIFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJCQllbHNlCisJCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9CisJCQkJCSAgICBWNEwyX0ZJRUxEX1RPUDsKKworCQkJfSBlbHNlIHsKKworCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9CisJCQkJICAgIGZoLT5qcGdfc2V0dGluZ3MuaW1nX3dpZHRoIC8KKwkJCQkgICAgZmgtPmpwZ19zZXR0aW5ncy5Ib3JEY207CisJCQkJZm10LT5mbXQucGl4LmhlaWdodCA9CisJCQkJICAgIGZoLT5qcGdfc2V0dGluZ3MuaW1nX2hlaWdodCAvCisJCQkJICAgIChmaC0+anBnX3NldHRpbmdzLlZlckRjbSAqCisJCQkJICAgICBmaC0+anBnX3NldHRpbmdzLlRtcERjbSk7CisJCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9CisJCQkJICAgIHpvcmFuX3Y0bDJfY2FsY19idWZzaXplKCZmaC0+CisJCQkJCQkJICAgIGpwZ19zZXR0aW5ncyk7CisJCQkJZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0ID0KKwkJCQkgICAgVjRMMl9QSVhfRk1UX01KUEVHOworCQkJCWlmIChmaC0+anBnX3NldHRpbmdzLlRtcERjbSA9PSAxKQorCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQorCQkJCQkgICAgKGZoLT5qcGdfc2V0dGluZ3MuCisJCQkJCSAgICAgb2RkX2V2ZW4gPyBWNEwyX0ZJRUxEX1NFUV9CVCA6CisJCQkJCSAgICAgVjRMMl9GSUVMRF9TRVFfQlQpOworCQkJCWVsc2UKKwkJCQkJZm10LT5mbXQucGl4LmZpZWxkID0KKwkJCQkJICAgIChmaC0+anBnX3NldHRpbmdzLgorCQkJCQkgICAgIG9kZF9ldmVuID8gVjRMMl9GSUVMRF9UT1AgOgorCQkJCQkgICAgIFY0TDJfRklFTERfQk9UVE9NKTsKKworCQkJCWZtdC0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSAwOworCQkJCWZtdC0+Zm10LnBpeC5jb2xvcnNwYWNlID0KKwkJCQkgICAgVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKKwkJCX0KKworCQkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX0dfRk1UIC0gdW5zdXBwb3J0ZWQgdHlwZSAlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgZm10LT50eXBlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19TX0ZNVDoKKwl7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10ID0gYXJnOworCQlpbnQgaSwgcmVzID0gMDsKKwkJX191MzIgcHJpbnRmb3JtYXQ7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NfRk1UIC0gdHlwZT0lZCwgIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBmbXQtPnR5cGUpOworCisJCXN3aXRjaCAoZm10LT50eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCisJCQlkcHJpbnRrKDMsICJ4PSVkLCB5PSVkLCB3PSVkLCBoPSVkLCBjbnQ9JWQsIG1hcD0weCVwXG4iLAorCQkJCWZtdC0+Zm10Lndpbi53LmxlZnQsIGZtdC0+Zm10Lndpbi53LnRvcCwKKwkJCQlmbXQtPmZtdC53aW4udy53aWR0aCwKKwkJCQlmbXQtPmZtdC53aW4udy5oZWlnaHQsCisJCQkJZm10LT5mbXQud2luLmNsaXBjb3VudCwKKwkJCQlmbXQtPmZtdC53aW4uYml0bWFwKTsKKwkJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJCXJlcyA9CisJCQkgICAgc2V0dXBfd2luZG93KGZpbGUsIGZtdC0+Zm10Lndpbi53LmxlZnQsCisJCQkJCSBmbXQtPmZtdC53aW4udy50b3AsCisJCQkJCSBmbXQtPmZtdC53aW4udy53aWR0aCwKKwkJCQkJIGZtdC0+Zm10Lndpbi53LmhlaWdodCwKKwkJCQkJIChzdHJ1Y3QgdmlkZW9fY2xpcCBfX3VzZXIgKikKKwkJCQkJICAgZm10LT5mbXQud2luLmNsaXBzLAorCQkJCQkgZm10LT5mbXQud2luLmNsaXBjb3VudCwKKwkJCQkJIGZtdC0+Zm10Lndpbi5iaXRtYXApOworCQkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJCXJldHVybiByZXM7CisJCQlicmVhazsKKworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKworCQkJcHJpbnRmb3JtYXQgPQorCQkJICAgIF9fY3B1X3RvX2xlMzIoZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKwkJCWRwcmludGsoMywgInNpemU9JWR4JWQsIGZtdD0weCV4ICglNC40cylcbiIsCisJCQkJZm10LT5mbXQucGl4LndpZHRoLCBmbXQtPmZtdC5waXguaGVpZ2h0LAorCQkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCwKKwkJCQkoY2hhciAqKSAmcHJpbnRmb3JtYXQpOworCisJCQlpZiAoZm10LT5mbXQucGl4LmJ5dGVzcGVybGluZSA+IDApIHsKKwkJCQlkcHJpbnRrKDUsCisJCQkJCUtFUk5fRVJSICIlczogYnBsIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJLyogd2UgY2FuIGJlIHJlcXVlc3RlZCB0byBkbyBKUEVHL3JhdyBwbGF5YmFjay9jYXB0dXJlICovCisJCQlpZiAoIQorCQkJICAgIChmbXQtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCQkgICAgIChmbXQtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgJiYKKwkJCSAgICAgIGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PQorCQkJICAgICAgVjRMMl9QSVhfRk1UX01KUEVHKSkpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogVklESU9DX1NfRk1UIC0gdW5rbm93biB0eXBlICVkLzB4JXgoJTQuNHMpIGNvbWJpbmF0aW9uXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgZm10LT50eXBlLAorCQkJCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQsCisJCQkJCShjaGFyICopICZwcmludGZvcm1hdCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmIChmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX01KUEVHKSB7CisJCQkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCQkJc2V0dGluZ3MgPSBmaC0+anBnX3NldHRpbmdzOworCisJCQkJaWYgKGZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgfHwKKwkJCQkgICAgZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCkgeworCQkJCQlkcHJpbnRrKDEsCisJCQkJCQlLRVJOX0VSUgorCQkJCQkJIiVzOiBWSURJT0NfU19GTVQgLSBjYW5ub3QgY2hhbmdlIGNhcHR1cmUgbW9kZVxuIiwKKwkJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQkJcmVzID0gLUVCVVNZOworCQkJCQlnb3RvIHNmbXRqcGdfdW5sb2NrX2FuZF9yZXR1cm47CisJCQkJfQorCisJCQkJLyogd2UgYWN0dWFsbHkgbmVlZCB0byBzZXQgJ3JlYWwnIHBhcmFtZXRlcnMgbm93ICovCisJCQkJaWYgKChmbXQtPmZtdC5waXguaGVpZ2h0ICogMikgPgorCQkJCSAgICBCVVpfTUFYX0hFSUdIVCkKKwkJCQkJc2V0dGluZ3MuVG1wRGNtID0gMTsKKwkJCQllbHNlCisJCQkJCXNldHRpbmdzLlRtcERjbSA9IDI7CisJCQkJc2V0dGluZ3MuZGVjaW1hdGlvbiA9IDA7CisJCQkJaWYgKGZtdC0+Zm10LnBpeC5oZWlnaHQgPD0KKwkJCQkgICAgZmgtPmpwZ19zZXR0aW5ncy5pbWdfaGVpZ2h0IC8gMikKKwkJCQkJc2V0dGluZ3MuVmVyRGNtID0gMjsKKwkJCQllbHNlCisJCQkJCXNldHRpbmdzLlZlckRjbSA9IDE7CisJCQkJaWYgKGZtdC0+Zm10LnBpeC53aWR0aCA8PQorCQkJCSAgICBmaC0+anBnX3NldHRpbmdzLmltZ193aWR0aCAvIDQpCisJCQkJCXNldHRpbmdzLkhvckRjbSA9IDQ7CisJCQkJZWxzZSBpZiAoZm10LT5mbXQucGl4LndpZHRoIDw9CisJCQkJCSBmaC0+anBnX3NldHRpbmdzLmltZ193aWR0aCAvIDIpCisJCQkJCXNldHRpbmdzLkhvckRjbSA9IDI7CisJCQkJZWxzZQorCQkJCQlzZXR0aW5ncy5Ib3JEY20gPSAxOworCQkJCWlmIChzZXR0aW5ncy5UbXBEY20gPT0gMSkKKwkJCQkJc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmYgPSAyOworCQkJCWVsc2UKKwkJCQkJc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmYgPSAxOworCisJCQkJLyogY2hlY2sgKi8KKwkJCQlpZiAoKHJlcyA9CisJCQkJICAgICB6b3Jhbl9jaGVja19qcGdfc2V0dGluZ3MoenIsCisJCQkJCQkJICAgICAgJnNldHRpbmdzKSkpCisJCQkJCWdvdG8gc2ZtdGpwZ191bmxvY2tfYW5kX3JldHVybjsKKworCQkJCS8qIGl0J3Mgb2ssIHNvIHNldCB0aGVtICovCisJCQkJZmgtPmpwZ19zZXR0aW5ncyA9IHNldHRpbmdzOworCisJCQkJLyogdGVsbCB0aGUgdXNlciB3aGF0IHdlIGFjdHVhbGx5IGRpZCAqLworCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9CisJCQkJICAgIHNldHRpbmdzLmltZ193aWR0aCAvIHNldHRpbmdzLkhvckRjbTsKKwkJCQlmbXQtPmZtdC5waXguaGVpZ2h0ID0KKwkJCQkgICAgc2V0dGluZ3MuaW1nX2hlaWdodCAqIDIgLworCQkJCSAgICAoc2V0dGluZ3MuVG1wRGNtICogc2V0dGluZ3MuVmVyRGNtKTsKKwkJCQlpZiAoc2V0dGluZ3MuVG1wRGNtID09IDEpCisJCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9CisJCQkJCSAgICAoZmgtPmpwZ19zZXR0aW5ncy4KKwkJCQkJICAgICBvZGRfZXZlbiA/IFY0TDJfRklFTERfU0VRX1RCIDoKKwkJCQkJICAgICBWNEwyX0ZJRUxEX1NFUV9CVCk7CisJCQkJZWxzZQorCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQorCQkJCQkgICAgKGZoLT5qcGdfc2V0dGluZ3MuCisJCQkJCSAgICAgb2RkX2V2ZW4gPyBWNEwyX0ZJRUxEX1RPUCA6CisJCQkJCSAgICAgVjRMMl9GSUVMRF9CT1RUT00pOworCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSA9CisJCQkJICAgIHpvcmFuX3Y0bDJfY2FsY19idWZzaXplKCZmaC0+CisJCQkJCQkJICAgIGpwZ19zZXR0aW5ncyk7CisJCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9CisJCQkJICAgIGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZTsKKworCQkJCS8qIHdlIGhlcmVieSBhYnVzZSB0aGlzIHZhcmlhYmxlIHRvIHNob3cgdGhhdAorCQkJCSAqIHdlJ3JlIGdvbm5hIGRvIG1qcGVnIGNhcHR1cmUgKi8KKwkJCQlmaC0+bWFwX21vZGUgPQorCQkJCSAgICAoZm10LT50eXBlID09CisJCQkJICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpID8KKwkJCQkgICAgWk9SQU5fTUFQX01PREVfSlBHX1JFQyA6CisJCQkJICAgIFpPUkFOX01BUF9NT0RFX0pQR19QTEFZOworCQkJc2ZtdGpwZ191bmxvY2tfYW5kX3JldHVybjoKKwkJCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgem9yYW5fbnVtX2Zvcm1hdHM7IGkrKykKKwkJCQkJaWYgKGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PQorCQkJCQkgICAgem9yYW5fZm9ybWF0c1tpXS5mb3VyY2MpCisJCQkJCQlicmVhazsKKwkJCQlpZiAoaSA9PSB6b3Jhbl9udW1fZm9ybWF0cykgeworCQkJCQlkcHJpbnRrKDEsCisJCQkJCQlLRVJOX0VSUgorCQkJCQkJIiVzOiBWSURJT0NfU19GTVQgLSB1bmtub3duL3Vuc3VwcG9ydGVkIGZvcm1hdCAweCV4ICglNC40cylcbiIsCisJCQkJCQlaUl9ERVZOQU1FKHpyKSwKKwkJCQkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCwKKwkJCQkJCShjaGFyICopICZwcmludGZvcm1hdCk7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCQkJaWYgKGZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgfHwKKwkJCQkgICAgKGZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgJiYKKwkJCQkgICAgIGZoLT52NGxfYnVmZmVycy5hY3RpdmUgIT0KKwkJCQkgICAgIFpPUkFOX0ZSRUUpKSB7CisJCQkJCWRwcmludGsoMSwKKwkJCQkJCUtFUk5fRVJSCisJCQkJCQkiJXM6IFZJRElPQ19TX0ZNVCAtIGNhbm5vdCBjaGFuZ2UgY2FwdHVyZSBtb2RlXG4iLAorCQkJCQkJWlJfREVWTkFNRSh6cikpOworCQkJCQlyZXMgPSAtRUJVU1k7CisJCQkJCWdvdG8gc2ZtdHY0bF91bmxvY2tfYW5kX3JldHVybjsKKwkJCQl9CisJCQkJaWYgKGZtdC0+Zm10LnBpeC5oZWlnaHQgPiBCVVpfTUFYX0hFSUdIVCkKKwkJCQkJZm10LT5mbXQucGl4LmhlaWdodCA9CisJCQkJCSAgICBCVVpfTUFYX0hFSUdIVDsKKwkJCQlpZiAoZm10LT5mbXQucGl4LndpZHRoID4gQlVaX01BWF9XSURUSCkKKwkJCQkJZm10LT5mbXQucGl4LndpZHRoID0gQlVaX01BWF9XSURUSDsKKworCQkJCWlmICgocmVzID0KKwkJCQkgICAgIHpvcmFuX3Y0bF9zZXRfZm9ybWF0KGZpbGUsCisJCQkJCQkJICBmbXQtPmZtdC5waXguCisJCQkJCQkJICB3aWR0aCwKKwkJCQkJCQkgIGZtdC0+Zm10LnBpeC4KKwkJCQkJCQkgIGhlaWdodCwKKwkJCQkJCQkgICZ6b3Jhbl9mb3JtYXRzCisJCQkJCQkJICBbaV0pKSkKKwkJCQkJZ290byBzZm10djRsX3VubG9ja19hbmRfcmV0dXJuOworCisJCQkJLyogdGVsbCB0aGUgdXNlciB0aGUKKwkJCQkgKiByZXN1bHRzL21pc3Npbmcgc3R1ZmYgKi8KKwkJCQlmbXQtPmZtdC5waXguc2l6ZWltYWdlID0gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplCS8qenItPmdicGwgKiB6ci0+Z2hlaWdodCAqLworCQkJCSAgICA7CisJCQkJaWYgKEJVWl9NQVhfSEVJR0hUIDwKKwkJCQkgICAgKGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0ICogMikpCisJCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9CisJCQkJCSAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJCQkJZWxzZQorCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQorCQkJCQkgICAgVjRMMl9GSUVMRF9UT1A7CisKKwkJCQlmaC0+bWFwX21vZGUgPSBaT1JBTl9NQVBfTU9ERV9SQVc7CisJCQlzZm10djRsX3VubG9ja19hbmRfcmV0dXJuOgorCQkJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKDMsICJ1bnN1cHBvcnRlZFxuIik7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19TX0ZNVCAtIHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGZtdC0+dHlwZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfRkJVRjoKKwl7CisJCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYiA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfR19GQlVGXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJbWVtc2V0KGZiLCAwLCBzaXplb2YoKmZiKSk7CisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJZmItPmJhc2UgPSB6ci0+YnVmZmVyLmJhc2U7CisJCWZiLT5mbXQud2lkdGggPSB6ci0+YnVmZmVyLndpZHRoOworCQlmYi0+Zm10LmhlaWdodCA9IHpyLT5idWZmZXIuaGVpZ2h0OworCQlpZiAoenItPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0KSB7CisJCQlmYi0+Zm10LnBpeGVsZm9ybWF0ID0KKwkJCQlmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQtPmZvdXJjYzsKKwkJfQorCQlmYi0+Zm10LmJ5dGVzcGVybGluZSA9IHpyLT5idWZmZXIuYnl0ZXNwZXJsaW5lOworCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCQlmYi0+Zm10LmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKwkJZmItPmZtdC5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJZmItPmZsYWdzID0gVjRMMl9GQlVGX0ZMQUdfT1ZFUkxBWTsKKwkJZmItPmNhcGFiaWxpdHkgPSBWNEwyX0ZCVUZfQ0FQX0xJU1RfQ0xJUFBJTkc7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1NfRkJVRjoKKwl7CisJCWludCBpLCByZXMgPSAwOworCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmIgPSBhcmc7CisJCV9fdTMyIHByaW50Zm9ybWF0ID0gX19jcHVfdG9fbGUzMihmYi0+Zm10LnBpeGVsZm9ybWF0KTsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHCisJCQkiJXM6IFZJRElPQ19TX0ZCVUYgLSBiYXNlPTB4JXAsIHNpemU9JWR4JWQsIGJwbD0lZCwgZm10PTB4JXggKCU0LjRzKVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBmYi0+YmFzZSwgZmItPmZtdC53aWR0aCwgZmItPmZtdC5oZWlnaHQsCisJCQlmYi0+Zm10LmJ5dGVzcGVybGluZSwgZmItPmZtdC5waXhlbGZvcm1hdCwKKwkJCShjaGFyICopICZwcmludGZvcm1hdCk7CisKKwkJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bV9mb3JtYXRzOyBpKyspCisJCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5mb3VyY2MgPT0gZmItPmZtdC5waXhlbGZvcm1hdCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gem9yYW5fbnVtX2Zvcm1hdHMpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX1NfRkJVRiAtIGZvcm1hdD0weCV4ICglNC40cykgbm90IGFsbG93ZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGZiLT5mbXQucGl4ZWxmb3JtYXQsCisJCQkJKGNoYXIgKikgJnByaW50Zm9ybWF0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCQlyZXMgPQorCQkgICAgc2V0dXBfZmJ1ZmZlcihmaWxlLCBmYi0+YmFzZSwgJnpvcmFuX2Zvcm1hdHNbaV0sCisJCQkJICBmYi0+Zm10LndpZHRoLCBmYi0+Zm10LmhlaWdodCwKKwkJCQkgIGZiLT5mbXQuYnl0ZXNwZXJsaW5lKTsKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19PVkVSTEFZOgorCXsKKwkJaW50ICpvbiA9IGFyZywgcmVzOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19QUkVWSUVXIC0gb249JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgKm9uKTsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJlcyA9IHNldHVwX292ZXJsYXkoZmlsZSwgKm9uKTsKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19SRVFCVUZTOgorCXsKKwkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSA9IGFyZzsKKwkJaW50IHJlcyA9IDA7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1JFUUJVRlMgLSB0eXBlPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHJlcS0+dHlwZSk7CisKKwkJaWYgKHJlcS0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogb25seSBNRU1PUllfTU1BUCBjYXB0dXJlIGlzIHN1cHBvcnRlZCwgbm90ICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCByZXEtPm1lbW9yeSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlpZiAoZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCB8fCBmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19SRVFCVUZTIC0gYnVmZmVycyBhbGxyZWFkeSBhbGxvY2F0ZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmVzID0gLUVCVVNZOworCQkJZ290byB2NGwycmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisKKwkJaWYgKGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9SQVcgJiYKKwkJICAgIHJlcS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKworCQkJLyogY29udHJvbCB1c2VyIGlucHV0ICovCisJCQlpZiAocmVxLT5jb3VudCA8IDIpCisJCQkJcmVxLT5jb3VudCA9IDI7CisJCQlpZiAocmVxLT5jb3VudCA+IHY0bF9uYnVmcykKKwkJCQlyZXEtPmNvdW50ID0gdjRsX25idWZzOworCQkJZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzID0gcmVxLT5jb3VudDsKKworCQkJaWYgKHY0bF9mYnVmZmVyX2FsbG9jKGZpbGUpKSB7CisJCQkJcmVzID0gLUVOT01FTTsKKwkJCQlnb3RvIHY0bDJyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQl9CisKKwkJCS8qIFRoZSBuZXh0IG1tYXAgd2lsbCBtYXAgdGhlIFY0TCBidWZmZXJzICovCisJCQlmaC0+bWFwX21vZGUgPSBaT1JBTl9NQVBfTU9ERV9SQVc7CisKKwkJfSBlbHNlIGlmIChmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfSlBHX1JFQyB8fAorCQkJICAgZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX0pQR19QTEFZKSB7CisKKwkJCS8qIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHNpemUgb3Vyc2VsdmVzIG5vdyAqLworCQkJaWYgKHJlcS0+Y291bnQgPCA0KQorCQkJCXJlcS0+Y291bnQgPSA0OworCQkJaWYgKHJlcS0+Y291bnQgPiBqcGdfbmJ1ZnMpCisJCQkJcmVxLT5jb3VudCA9IGpwZ19uYnVmczsKKwkJCWZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVycyA9IHJlcS0+Y291bnQ7CisJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemUgPQorCQkJICAgIHpvcmFuX3Y0bDJfY2FsY19idWZzaXplKCZmaC0+anBnX3NldHRpbmdzKTsKKworCQkJaWYgKGpwZ19mYnVmZmVyX2FsbG9jKGZpbGUpKSB7CisJCQkJcmVzID0gLUVOT01FTTsKKwkJCQlnb3RvIHY0bDJyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQl9CisKKwkJCS8qIFRoZSBuZXh0IG1tYXAgd2lsbCBtYXAgdGhlIE1KUEVHIGJ1ZmZlcnMgKi8KKwkJCWlmIChyZXEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkJCWZoLT5tYXBfbW9kZSA9IFpPUkFOX01BUF9NT0RFX0pQR19SRUM7CisJCQllbHNlCisJCQkJZmgtPm1hcF9tb2RlID0gWk9SQU5fTUFQX01PREVfSlBHX1BMQVk7CisKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX1JFUUJVRlMgLSB1bmtub3duIHR5cGUgJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIHJlcS0+dHlwZSk7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byB2NGwycmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisJdjRsMnJlcWJ1Zl91bmxvY2tfYW5kX3JldHVybjoKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfUVVFUllCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKKwkJX191MzIgdHlwZSA9IGJ1Zi0+dHlwZTsKKwkJaW50IGluZGV4ID0gYnVmLT5pbmRleCwgcmVzOworCisJCWRwcmludGsoMywKKwkJCUtFUk5fREVCVUcKKwkJCSIlczogVklESU9DX1FVRVJZQlVGIC0gaW5kZXg9JWQsIHR5cGU9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgYnVmLT5pbmRleCwgYnVmLT50eXBlKTsKKworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCWJ1Zi0+dHlwZSA9IHR5cGU7CisJCWJ1Zi0+aW5kZXggPSBpbmRleDsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJlcyA9IHpvcmFuX3Y0bDJfYnVmZmVyX3N0YXR1cyhmaWxlLCBidWYsIGJ1Zi0+aW5kZXgpOworCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1FCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKKwkJaW50IHJlcyA9IDAsIGNvZGVjX21vZGUsIGJ1Zl90eXBlOworCisJCWRwcmludGsoMywKKwkJCUtFUk5fREVCVUcgIiVzOiBWSURJT0NfUUJVRiAtIHR5cGU9JWQsIGluZGV4PSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGJ1Zi0+dHlwZSwgYnVmLT5pbmRleCk7CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7CisJCWNhc2UgWk9SQU5fTUFQX01PREVfUkFXOgorCQkJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogVklESU9DX1FCVUYgLSBpbnZhbGlkIGJ1Zi0+dHlwZT0lZCBmb3IgbWFwX21vZGU9JWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUsIGZoLT5tYXBfbW9kZSk7CisJCQkJcmVzID0gLUVJTlZBTDsKKwkJCQlnb3RvIHFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQl9CisKKwkJCXJlcyA9IHpvcmFuX3Y0bF9xdWV1ZV9mcmFtZShmaWxlLCBidWYtPmluZGV4KTsKKwkJCWlmIChyZXMpCisJCQkJZ290byBxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQkJaWYgKCF6ci0+djRsX21lbWdyYWJfYWN0aXZlICYmCisJCQkgICAgZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9MT0NLRUQpCisJCQkJenIzNjA1N19zZXRfbWVtZ3JhYih6ciwgMSk7CisJCQlicmVhazsKKworCQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19SRUM6CisJCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1BMQVk6CisJCQlpZiAoZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX0pQR19QTEFZKSB7CisJCQkJYnVmX3R5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKwkJCQljb2RlY19tb2RlID0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1M7CisJCQl9IGVsc2UgeworCQkJCWJ1Zl90eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQkJCWNvZGVjX21vZGUgPSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1M7CisJCQl9CisKKwkJCWlmIChidWYtPnR5cGUgIT0gYnVmX3R5cGUpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogVklESU9DX1FCVUYgLSBpbnZhbGlkIGJ1Zi0+dHlwZT0lZCBmb3IgbWFwX21vZGU9JWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUsIGZoLT5tYXBfbW9kZSk7CisJCQkJcmVzID0gLUVJTlZBTDsKKwkJCQlnb3RvIHFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQl9CisKKwkJCXJlcyA9CisJCQkgICAgem9yYW5fanBnX3F1ZXVlX2ZyYW1lKGZpbGUsIGJ1Zi0+aW5kZXgsCisJCQkJCQkgIGNvZGVjX21vZGUpOworCQkJaWYgKHJlcyAhPSAwKQorCQkJCWdvdG8gcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKKwkJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9JRExFICYmCisJCQkgICAgZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9MT0NLRUQpIHsKKwkJCQl6cjM2MDU3X2VuYWJsZV9qcGcoenIsIGNvZGVjX21vZGUpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX1FCVUYgLSB1bnN1cHBvcnRlZCB0eXBlICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUpOworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWdvdG8gcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCXFidWZfdW5sb2NrX2FuZF9yZXR1cm46CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfRFFCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKKwkJaW50IHJlcyA9IDAsIGJ1Zl90eXBlLCBudW0gPSAtMTsJLyogY29tcGlsZXIgYm9ya3MgaGVyZSAoPykgKi8KKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfRFFCVUYgLSB0eXBlPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGJ1Zi0+dHlwZSk7CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7CisJCWNhc2UgWk9SQU5fTUFQX01PREVfUkFXOgorCQkJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogVklESU9DX1FCVUYgLSBpbnZhbGlkIGJ1Zi0+dHlwZT0lZCBmb3IgbWFwX21vZGU9JWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUsIGZoLT5tYXBfbW9kZSk7CisJCQkJcmVzID0gLUVJTlZBTDsKKwkJCQlnb3RvIGRxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCisJCQludW0gPSB6ci0+djRsX3BlbmRbenItPnY0bF9zeW5jX3RhaWwgJiBWNExfTUFTS19GUkFNRV07CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgJiYKKwkJCSAgICB6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUgIT0KKwkJCSAgICBCVVpfU1RBVEVfRE9ORSkgeworCQkJCXJlcyA9IC1FQUdBSU47CisJCQkJZ290byBkcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKKwkJCX0KKwkJCXJlcyA9IHY0bF9zeW5jKGZpbGUsIG51bSk7CisJCQlpZiAocmVzKQorCQkJCWdvdG8gZHFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQllbHNlCisJCQkJenItPnY0bF9zeW5jX3RhaWwrKzsKKwkJCXJlcyA9IHpvcmFuX3Y0bDJfYnVmZmVyX3N0YXR1cyhmaWxlLCBidWYsIG51bSk7CisJCQlicmVhazsKKworCQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19SRUM6CisJCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1BMQVk6CisJCXsKKwkJCXN0cnVjdCB6b3Jhbl9zeW5jIGJzOworCisJCQlpZiAoZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX0pQR19QTEFZKQorCQkJCWJ1Zl90eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ7CisJCQllbHNlCisJCQkJYnVmX3R5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisKKwkJCWlmIChidWYtPnR5cGUgIT0gYnVmX3R5cGUpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogVklESU9DX1FCVUYgLSBpbnZhbGlkIGJ1Zi0+dHlwZT0lZCBmb3IgbWFwX21vZGU9JWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUsIGZoLT5tYXBfbW9kZSk7CisJCQkJcmVzID0gLUVJTlZBTDsKKwkJCQlnb3RvIGRxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCisJCQludW0gPQorCQkJICAgIHpyLT5qcGdfcGVuZFt6ci0+CisJCQkJCSBqcGdfcXVlX3RhaWwgJiBCVVpfTUFTS19GUkFNRV07CisKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyAmJgorCQkJICAgIHpyLT5qcGdfYnVmZmVycy5idWZmZXJbbnVtXS5zdGF0ZSAhPQorCQkJICAgIEJVWl9TVEFURV9ET05FKSB7CisJCQkJcmVzID0gLUVBR0FJTjsKKwkJCQlnb3RvIGRxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCQkJcmVzID0ganBnX3N5bmMoZmlsZSwgJmJzKTsKKwkJCWlmIChyZXMpCisJCQkJZ290byBkcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKKwkJCXJlcyA9CisJCQkgICAgem9yYW5fdjRsMl9idWZmZXJfc3RhdHVzKGZpbGUsIGJ1ZiwgYnMuZnJhbWUpOworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBWSURJT0NfRFFCVUYgLSB1bnN1cHBvcnRlZCB0eXBlICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUpOworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWdvdG8gZHFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKwlkcWJ1Zl91bmxvY2tfYW5kX3JldHVybjoKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19TVFJFQU1PTjoKKwl7CisJCWludCByZXMgPSAwOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19TVFJFQU1PTlxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlzd2l0Y2ggKGZoLT5tYXBfbW9kZSkgeworCQljYXNlIFpPUkFOX01BUF9NT0RFX1JBVzoJLyogcmF3IGNhcHR1cmUgKi8KKwkJCWlmICh6ci0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0FDVElWRSB8fAorCQkJICAgIGZoLT52NGxfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fQUNUSVZFKSB7CisJCQkJcmVzID0gLUVCVVNZOworCQkJCWdvdG8gc3RybW9uX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCisJCQl6ci0+djRsX2J1ZmZlcnMuYWN0aXZlID0gZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9CisJCQkgICAgWk9SQU5fTE9DS0VEOworCQkJenItPnY0bF9zZXR0aW5ncyA9IGZoLT52NGxfc2V0dGluZ3M7CisKKwkJCXpyLT52NGxfc3luY190YWlsID0genItPnY0bF9wZW5kX3RhaWw7CisJCQlpZiAoIXpyLT52NGxfbWVtZ3JhYl9hY3RpdmUgJiYKKwkJCSAgICB6ci0+djRsX3BlbmRfaGVhZCAhPSB6ci0+djRsX3BlbmRfdGFpbCkgeworCQkJCXpyMzYwNTdfc2V0X21lbWdyYWIoenIsIDEpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUkVDOgorCQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19QTEFZOgorCQkJLyogd2hhdCBpcyB0aGUgY29kZWMgbW9kZSByaWdodCBub3c/ICovCisJCQlpZiAoenItPmpwZ19idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9BQ1RJVkUgfHwKKwkJCSAgICBmaC0+anBnX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0FDVElWRSkgeworCQkJCXJlcyA9IC1FQlVTWTsKKwkJCQlnb3RvIHN0cm1vbl91bmxvY2tfYW5kX3JldHVybjsKKwkJCX0KKworCQkJenItPmpwZ19idWZmZXJzLmFjdGl2ZSA9IGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgPQorCQkJICAgIFpPUkFOX0xPQ0tFRDsKKworCQkJaWYgKHpyLT5qcGdfcXVlX2hlYWQgIT0genItPmpwZ19xdWVfdGFpbCkgeworCQkJCS8qIFN0YXJ0IHRoZSBqcGVnIGNvZGVjIHdoZW4gdGhlIGZpcnN0IGZyYW1lIGlzIHF1ZXVlZCAgKi8KKwkJCQlqcGVnX3N0YXJ0KHpyKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19TVFJFQU1PTiAtIGludmFsaWQgbWFwIG1vZGUgJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGZoLT5tYXBfbW9kZSk7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byBzdHJtb25fdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKwlzdHJtb25fdW5sb2NrX2FuZF9yZXR1cm46CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgorCXsKKwkJaW50IGksIHJlcyA9IDA7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NUUkVBTU9GRlxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlzd2l0Y2ggKGZoLT5tYXBfbW9kZSkgeworCQljYXNlIFpPUkFOX01BUF9NT0RFX1JBVzoJLyogcmF3IGNhcHR1cmUgKi8KKwkJCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUgJiYKKwkJCSAgICB6ci0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKKwkJCQlyZXMgPSAtRVBFUk07CS8qIHN0YXkgb2ZmIG90aGVyJ3Mgc2V0dGluZ3MhICovCisJCQkJZ290byBzdHJtb2ZmX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCQkJaWYgKHpyLT52NGxfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkKKwkJCQlnb3RvIHN0cm1vZmZfdW5sb2NrX2FuZF9yZXR1cm47CisKKwkJCS8qIHVubG9hZCBjYXB0dXJlICovCisJCQlpZiAoenItPnY0bF9tZW1ncmFiX2FjdGl2ZSkKKwkJCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAwKTsKKworCQkJZm9yIChpID0gMDsgaSA8IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVyczsgaSsrKQorCQkJCXpyLT52NGxfYnVmZmVycy5idWZmZXJbaV0uc3RhdGUgPQorCQkJCSAgICBCVVpfU1RBVEVfVVNFUjsKKwkJCWZoLT52NGxfYnVmZmVycyA9IHpyLT52NGxfYnVmZmVyczsKKworCQkJenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9IGZoLT52NGxfYnVmZmVycy5hY3RpdmUgPQorCQkJICAgIFpPUkFOX0ZSRUU7CisKKwkJCXpyLT52NGxfZ3JhYl9zZXEgPSAwOworCQkJenItPnY0bF9wZW5kX2hlYWQgPSB6ci0+djRsX3BlbmRfdGFpbCA9IDA7CisJCQl6ci0+djRsX3N5bmNfdGFpbCA9IDA7CisKKwkJCWJyZWFrOworCisJCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1JFQzoKKwkJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWToKKwkJCWlmIChmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUgJiYKKwkJCSAgICB6ci0+anBnX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKKwkJCQlyZXMgPSAtRVBFUk07CS8qIHN0YXkgb2ZmIG90aGVyJ3Mgc2V0dGluZ3MhICovCisJCQkJZ290byBzdHJtb2ZmX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCQkJaWYgKHpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkKKwkJCQlnb3RvIHN0cm1vZmZfdW5sb2NrX2FuZF9yZXR1cm47CisKKwkJCXJlcyA9CisJCQkgICAganBnX3FidWYoZmlsZSwgLTEsCisJCQkJICAgICAoZmgtPm1hcF9tb2RlID09CisJCQkJICAgICAgWk9SQU5fTUFQX01PREVfSlBHX1JFQykgPworCQkJCSAgICAgQlVaX01PREVfTU9USU9OX0NPTVBSRVNTIDoKKwkJCQkgICAgIEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTKTsKKwkJCWlmIChyZXMpCisJCQkJZ290byBzdHJtb2ZmX3VubG9ja19hbmRfcmV0dXJuOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19TVFJFQU1PRkYgLSBpbnZhbGlkIG1hcCBtb2RlICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBmaC0+bWFwX21vZGUpOworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWdvdG8gc3RybW9mZl91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCXN0cm1vZmZfdW5sb2NrX2FuZF9yZXR1cm46CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsID0gYXJnOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19RVUVSWUNUUkwgLSBpZD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBjdHJsLT5pZCk7CisKKwkJLyogd2Ugb25seSBzdXBwb3J0IGh1ZS9zYXR1cmF0aW9uL2NvbnRyYXN0L2JyaWdodG5lc3MgKi8KKwkJaWYgKGN0cmwtPmlkIDwgVjRMMl9DSURfQlJJR0hUTkVTUyB8fAorCQkgICAgY3RybC0+aWQgPiBWNEwyX0NJRF9IVUUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWxzZSB7CisJCQlpbnQgaWQgPSBjdHJsLT5pZDsKKwkJCW1lbXNldChjdHJsLCAwLCBzaXplb2YoKmN0cmwpKTsKKwkJCWN0cmwtPmlkID0gaWQ7CisJCX0KKworCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCXN0cm5jcHkoY3RybC0+bmFtZSwgIkJyaWdodG5lc3MiLCAzMSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJCXN0cm5jcHkoY3RybC0+bmFtZSwgIkNvbnRyYXN0IiwgMzEpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJCXN0cm5jcHkoY3RybC0+bmFtZSwgIlNhdHVyYXRpb24iLCAzMSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9IVUU6CisJCQlzdHJuY3B5KGN0cmwtPm5hbWUsICJIdWUiLCAzMSk7CisJCQlicmVhazsKKwkJfQorCisJCWN0cmwtPm1pbmltdW0gPSAwOworCQljdHJsLT5tYXhpbXVtID0gNjU1MzU7CisJCWN0cmwtPnN0ZXAgPSAxOworCQljdHJsLT5kZWZhdWx0X3ZhbHVlID0gMzI3Njg7CisJCWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19HX0NUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19HX0NUUkwgLSBpZD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBjdHJsLT5pZCk7CisKKwkJLyogd2Ugb25seSBzdXBwb3J0IGh1ZS9zYXR1cmF0aW9uL2NvbnRyYXN0L2JyaWdodG5lc3MgKi8KKwkJaWYgKGN0cmwtPmlkIDwgVjRMMl9DSURfQlJJR0hUTkVTUyB8fAorCQkgICAgY3RybC0+aWQgPiBWNEwyX0NJRF9IVUUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXN3aXRjaCAoY3RybC0+aWQpIHsKKwkJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQkJY3RybC0+dmFsdWUgPSB6ci0+YnJpZ2h0bmVzczsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJY3RybC0+dmFsdWUgPSB6ci0+Y29udHJhc3Q7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQkJY3RybC0+dmFsdWUgPSB6ci0+c2F0dXJhdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCWN0cmwtPnZhbHVlID0genItPmh1ZTsKKwkJCWJyZWFrOworCQl9CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1NfQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlIHBpY3Q7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NfQ1RSTCAtIGlkPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGN0cmwtPmlkKTsKKworCQkvKiB3ZSBvbmx5IHN1cHBvcnQgaHVlL3NhdHVyYXRpb24vY29udHJhc3QvYnJpZ2h0bmVzcyAqLworCQlpZiAoY3RybC0+aWQgPCBWNEwyX0NJRF9CUklHSFRORVNTIHx8CisJCSAgICBjdHJsLT5pZCA+IFY0TDJfQ0lEX0hVRSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjdHJsLT52YWx1ZSA8IDAgfHwgY3RybC0+dmFsdWUgPiA2NTUzNSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBWSURJT0NfU19DVFJMIC0gaW52YWxpZCB2YWx1ZSAlZCBmb3IgaWQ9JWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGN0cmwtPnZhbHVlLCBjdHJsLT5pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJc3dpdGNoIChjdHJsLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQl6ci0+YnJpZ2h0bmVzcyA9IGN0cmwtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCQl6ci0+Y29udHJhc3QgPSBjdHJsLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQl6ci0+c2F0dXJhdGlvbiA9IGN0cmwtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfSFVFOgorCQkJenItPmh1ZSA9IGN0cmwtPnZhbHVlOworCQkJYnJlYWs7CisJCX0KKwkJcGljdC5icmlnaHRuZXNzID0genItPmJyaWdodG5lc3M7CisJCXBpY3QuY29udHJhc3QgPSB6ci0+Y29udHJhc3Q7CisJCXBpY3QuY29sb3VyID0genItPnNhdHVyYXRpb247CisJCXBpY3QuaHVlID0genItPmh1ZTsKKworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX1BJQ1RVUkUsICZwaWN0KTsKKworCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19FTlVNU1REOgorCXsKKwkJc3RydWN0IHY0bDJfc3RhbmRhcmQgKnN0ZCA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfRU5VTVNURCAtIGluZGV4PSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHN0ZC0+aW5kZXgpOworCisJCWlmIChzdGQtPmluZGV4IDwgMCB8fCBzdGQtPmluZGV4ID49ICh6ci0+Y2FyZC5ub3JtcyArIDEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVsc2UgeworCQkJaW50IGlkID0gc3RkLT5pbmRleDsKKwkJCW1lbXNldChzdGQsIDAsIHNpemVvZigqc3RkKSk7CisJCQlzdGQtPmluZGV4ID0gaWQ7CisJCX0KKworCQlpZiAoc3RkLT5pbmRleCA9PSB6ci0+Y2FyZC5ub3JtcykgeworCQkJLyogaWYgd2UgaGF2ZSBhdXRvZGV0ZWN0LCAuLi4gKi8KKwkJCXN0cnVjdCB2aWRlb19kZWNvZGVyX2NhcGFiaWxpdHkgY2FwczsKKwkJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9HRVRfQ0FQQUJJTElUSUVTLAorCQkJCQkmY2Fwcyk7CisJCQlpZiAoY2Fwcy5mbGFncyAmIFZJREVPX0RFQ09ERVJfQVVUTykgeworCQkJCXN0ZC0+aWQgPSBWNEwyX1NURF9BTEw7CisJCQkJc3RybmNweShzdGQtPm5hbWUsICJBdXRvZGV0ZWN0IiwgMzEpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc3dpdGNoIChzdGQtPmluZGV4KSB7CisJCWNhc2UgMDoKKwkJCXN0ZC0+aWQgPSBWNEwyX1NURF9QQUw7CisJCQlzdHJuY3B5KHN0ZC0+bmFtZSwgIlBBTCIsIDMxKTsKKwkJCXN0ZC0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gMTsKKwkJCXN0ZC0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPSAyNTsKKwkJCXN0ZC0+ZnJhbWVsaW5lcyA9IHpyLT5jYXJkLnR2blswXS0+SHQ7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc3RkLT5pZCA9IFY0TDJfU1REX05UU0M7CisJCQlzdHJuY3B5KHN0ZC0+bmFtZSwgIk5UU0MiLCAzMSk7CisJCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDEwMDE7CisJCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMzAwMDA7CisJCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMV0tPkh0OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXN0ZC0+aWQgPSBWNEwyX1NURF9TRUNBTTsKKwkJCXN0cm5jcHkoc3RkLT5uYW1lLCAiU0VDQU0iLCAzMSk7CisJCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDE7CisJCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMjU7CisJCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMl0tPkh0OworCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOworCQlpbnQgbm9ybTsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfR19TVERcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCW5vcm0gPSB6ci0+bm9ybTsKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlzd2l0Y2ggKG5vcm0pIHsKKwkJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJCSpzdGQgPSBWNEwyX1NURF9QQUw7CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19NT0RFX05UU0M6CisJCQkqc3RkID0gVjRMMl9TVERfTlRTQzsKKwkJCWJyZWFrOworCQljYXNlIFZJREVPX01PREVfU0VDQU06CisJCQkqc3RkID0gVjRMMl9TVERfU0VDQU07CisJCQlicmVhazsKKwkJfQorCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19TX1NURDoKKwl7CisJCWludCBub3JtID0gLTEsIHJlcyA9IDA7CisJCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NfU1REIC0gbm9ybT0weCVsbHhcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgKHVuc2lnbmVkIGxvbmcgbG9uZykqc3RkKTsKKworCQlpZiAoKnN0ZCA9PSBWNEwyX1NURF9QQUwpCisJCQlub3JtID0gVklERU9fTU9ERV9QQUw7CisJCWVsc2UgaWYgKCpzdGQgPT0gVjRMMl9TVERfTlRTQykKKwkJCW5vcm0gPSBWSURFT19NT0RFX05UU0M7CisJCWVsc2UgaWYgKCpzdGQgPT0gVjRMMl9TVERfU0VDQU0pCisJCQlub3JtID0gVklERU9fTU9ERV9TRUNBTTsKKwkJZWxzZSBpZiAoKnN0ZCA9PSBWNEwyX1NURF9BTEwpCisJCQlub3JtID0gVklERU9fTU9ERV9BVVRPOworCQllbHNlIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX1NfU1REIC0gaW52YWxpZCBub3JtIDB4JWxseFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgKHVuc2lnbmVkIGxvbmcgbG9uZykqc3RkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCQlpZiAoKHJlcyA9IHpvcmFuX3NldF9ub3JtKHpyLCBub3JtKSkpCisJCQlnb3RvIHNzdGRfdW5sb2NrX2FuZF9yZXR1cm47CisKKwkJcmVzID0gd2FpdF9ncmFiX3BlbmRpbmcoenIpOworCXNzdGRfdW5sb2NrX2FuZF9yZXR1cm46CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwl7CisJCXN0cnVjdCB2NGwyX2lucHV0ICppbnAgPSBhcmc7CisJCWludCBzdGF0dXM7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX0VOVU1JTlBVVCAtIGluZGV4PSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGlucC0+aW5kZXgpOworCisJCWlmIChpbnAtPmluZGV4IDwgMCB8fCBpbnAtPmluZGV4ID49IHpyLT5jYXJkLmlucHV0cykKKwkJCXJldHVybiAtRUlOVkFMOworCQllbHNlIHsKKwkJCWludCBpZCA9IGlucC0+aW5kZXg7CisJCQltZW1zZXQoaW5wLCAwLCBzaXplb2YoKmlucCkpOworCQkJaW5wLT5pbmRleCA9IGlkOworCQl9CisKKwkJc3RybmNweShpbnAtPm5hbWUsIHpyLT5jYXJkLmlucHV0W2lucC0+aW5kZXhdLm5hbWUsCisJCQlzaXplb2YoaW5wLT5uYW1lKSAtIDEpOworCQlpbnAtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCQlpbnAtPnN0ZCA9IFY0TDJfU1REX0FMTDsKKworCQkvKiBHZXQgc3RhdHVzIG9mIHZpZGVvIGRlY29kZXIgKi8KKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfR0VUX1NUQVRVUywgJnN0YXR1cyk7CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJaWYgKCEoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfR09PRCkpIHsKKwkJCWlucC0+c3RhdHVzIHw9IFY0TDJfSU5fU1RfTk9fUE9XRVI7CisJCQlpbnAtPnN0YXR1cyB8PSBWNEwyX0lOX1NUX05PX1NJR05BTDsKKwkJfQorCQlpZiAoIShzdGF0dXMgJiBERUNPREVSX1NUQVRVU19DT0xPUikpCisJCQlpbnAtPnN0YXR1cyB8PSBWNEwyX0lOX1NUX05PX0NPTE9SOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19HX0lOUFVUOgorCXsKKwkJaW50ICppbnB1dCA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfR19JTlBVVFxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJKmlucHV0ID0genItPmlucHV0OworCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19TX0lOUFVUOgorCXsKKwkJaW50ICppbnB1dCA9IGFyZywgcmVzID0gMDsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfU19JTlBVVCAtIGlucHV0PSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksICppbnB1dCk7CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCQlpZiAoKHJlcyA9IHpvcmFuX3NldF9pbnB1dCh6ciwgKmlucHV0KSkpCisJCQlnb3RvIHNpbnB1dF91bmxvY2tfYW5kX3JldHVybjsKKworCQkvKiBNYWtlIHN1cmUgdGhlIGNoYW5nZXMgY29tZSBpbnRvIGVmZmVjdCAqLworCQlyZXMgPSB3YWl0X2dyYWJfcGVuZGluZyh6cik7CisJc2lucHV0X3VubG9ja19hbmRfcmV0dXJuOgorCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19FTlVNT1VUUFVUOgorCXsKKwkJc3RydWN0IHY0bDJfb3V0cHV0ICpvdXRwID0gYXJnOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19FTlVNT1VUUFVUIC0gaW5kZXg9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgb3V0cC0+aW5kZXgpOworCisJCWlmIChvdXRwLT5pbmRleCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtc2V0KG91dHAsIDAsIHNpemVvZigqb3V0cCkpOworCQlvdXRwLT5pbmRleCA9IDA7CisJCW91dHAtPnR5cGUgPSBWNEwyX09VVFBVVF9UWVBFX0FOQUxPR1ZHQU9WRVJMQVk7CisJCXN0cm5jcHkob3V0cC0+bmFtZSwgIkF1dG9kZXRlY3QiLCAzMSk7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfT1VUUFVUOgorCXsKKwkJaW50ICpvdXRwdXQgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX0dfT1VUUFVUXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJKm91dHB1dCA9IDA7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1NfT1VUUFVUOgorCXsKKwkJaW50ICpvdXRwdXQgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NfT1VUUFVUIC0gb3V0cHV0PSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksICpvdXRwdXQpOworCisJCWlmICgqb3V0cHV0ICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJCS8qIGNyb3BwaW5nIChzdWItZnJhbWUgY2FwdHVyZSkgKi8KKwljYXNlIFZJRElPQ19DUk9QQ0FQOgorCXsKKwkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCA9IGFyZzsKKwkJaW50IHR5cGUgPSBjcm9wY2FwLT50eXBlLCByZXMgPSAwOworCisJCWRwcmludGsoMywgS0VSTl9FUlIgIiVzOiBWSURJT0NfQ1JPUENBUCAtIHR5cGU9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgY3JvcGNhcC0+dHlwZSk7CisKKwkJbWVtc2V0KGNyb3BjYXAsIDAsIHNpemVvZigqY3JvcGNhcCkpOworCQljcm9wY2FwLT50eXBlID0gdHlwZTsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJaWYgKGNyb3BjYXAtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgJiYKKwkJICAgIChjcm9wY2FwLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fAorCQkgICAgIGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9SQVcpKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19DUk9QQ0FQIC0gc3ViY2FwdHVyZSBvbmx5IHN1cHBvcnRlZCBmb3IgY29tcHJlc3NlZCBjYXB0dXJlXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIGNyb3BjYXBfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQljcm9wY2FwLT5ib3VuZHMudG9wID0gY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOworCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSBCVVpfTUFYX1dJRFRIOworCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gQlVaX01BWF9IRUlHSFQ7CisJCWNyb3BjYXAtPmRlZnJlY3QudG9wID0gY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC53aWR0aCA9IEJVWl9NSU5fV0lEVEg7CisJCWNyb3BjYXAtPmRlZnJlY3QuaGVpZ2h0ID0gQlVaX01JTl9IRUlHSFQ7CisJY3JvcGNhcF91bmxvY2tfYW5kX3JldHVybjoKKwkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19DUk9QOgorCXsKKwkJc3RydWN0IHY0bDJfY3JvcCAqY3JvcCA9IGFyZzsKKwkJaW50IHR5cGUgPSBjcm9wLT50eXBlLCByZXMgPSAwOworCisJCWRwcmludGsoMywgS0VSTl9FUlIgIiVzOiBWSURJT0NfR19DUk9QIC0gdHlwZT0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBjcm9wLT50eXBlKTsKKworCQltZW1zZXQoY3JvcCwgMCwgc2l6ZW9mKCpjcm9wKSk7CisJCWNyb3AtPnR5cGUgPSB0eXBlOworCisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAmJgorCQkgICAgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCSAgICAgZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX1JBVykpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX0dfQ1JPUCAtIHN1YmNhcHR1cmUgb25seSBzdXBwb3J0ZWQgZm9yIGNvbXByZXNzZWQgY2FwdHVyZVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byBnY3JvcF91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCisJCWNyb3AtPmMudG9wID0gZmgtPmpwZ19zZXR0aW5ncy5pbWdfeTsKKwkJY3JvcC0+Yy5sZWZ0ID0gZmgtPmpwZ19zZXR0aW5ncy5pbWdfeDsKKwkJY3JvcC0+Yy53aWR0aCA9IGZoLT5qcGdfc2V0dGluZ3MuaW1nX3dpZHRoOworCQljcm9wLT5jLmhlaWdodCA9IGZoLT5qcGdfc2V0dGluZ3MuaW1nX2hlaWdodDsKKworCWdjcm9wX3VubG9ja19hbmRfcmV0dXJuOgorCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1NfQ1JPUDoKKwl7CisJCXN0cnVjdCB2NGwyX2Nyb3AgKmNyb3AgPSBhcmc7CisJCWludCByZXMgPSAwOworCisJCXNldHRpbmdzID0gZmgtPmpwZ19zZXR0aW5nczsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBWSURJT0NfU19DUk9QIC0gdHlwZT0lZCwgeD0lZCx5PSVkLHc9JWQsaD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBjcm9wLT50eXBlLCBjcm9wLT5jLmxlZnQsIGNyb3AtPmMudG9wLAorCQkJY3JvcC0+Yy53aWR0aCwgY3JvcC0+Yy5oZWlnaHQpOworCisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlpZiAoZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCB8fCBmaC0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19TX0NST1AgLSBjYW5ub3QgY2hhbmdlIHNldHRpbmdzIHdoaWxlIGFjdGl2ZVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXMgPSAtRUJVU1k7CisJCQlnb3RvIHNjcm9wX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisKKwkJaWYgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgJiYKKwkJICAgIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fAorCQkgICAgIGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9SQVcpKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19HX0NST1AgLSBzdWJjYXB0dXJlIG9ubHkgc3VwcG9ydGVkIGZvciBjb21wcmVzc2VkIGNhcHR1cmVcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWdvdG8gc2Nyb3BfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQkvKiBtb3ZlIGludG8gYSBmb3JtIHRoYXQgd2UgdW5kZXJzdGFuZCAqLworCQlzZXR0aW5ncy5pbWdfeCA9IGNyb3AtPmMubGVmdDsKKwkJc2V0dGluZ3MuaW1nX3kgPSBjcm9wLT5jLnRvcDsKKwkJc2V0dGluZ3MuaW1nX3dpZHRoID0gY3JvcC0+Yy53aWR0aDsKKwkJc2V0dGluZ3MuaW1nX2hlaWdodCA9IGNyb3AtPmMuaGVpZ2h0OworCisJCS8qIGNoZWNrIHZhbGlkaXR5ICovCisJCWlmICgocmVzID0gem9yYW5fY2hlY2tfanBnX3NldHRpbmdzKHpyLCAmc2V0dGluZ3MpKSkKKwkJCWdvdG8gc2Nyb3BfdW5sb2NrX2FuZF9yZXR1cm47CisKKwkJLyogYWNjZXB0ICovCisJCWZoLT5qcGdfc2V0dGluZ3MgPSBzZXR0aW5nczsKKworCXNjcm9wX3VubG9ja19hbmRfcmV0dXJuOgorCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19HX0pQRUdDT01QOgorCXsKKwkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwYXJhbXMgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX0dfSlBFR0NPTVBcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisKKwkJbWVtc2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKKworCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcGFyYW1zLT5xdWFsaXR5ID0gZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5xdWFsaXR5OworCQlwYXJhbXMtPkFQUG4gPSBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUG47CisJCW1lbWNweShwYXJhbXMtPkFQUF9kYXRhLAorCQkgICAgICAgZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfZGF0YSwKKwkJICAgICAgIGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQX2xlbik7CisJCXBhcmFtcy0+QVBQX2xlbiA9IGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQX2xlbjsKKwkJbWVtY3B5KHBhcmFtcy0+Q09NX2RhdGEsCisJCSAgICAgICBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9kYXRhLAorCQkgICAgICAgZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5DT01fbGVuKTsKKwkJcGFyYW1zLT5DT01fbGVuID0gZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5DT01fbGVuOworCQlwYXJhbXMtPmpwZWdfbWFya2VycyA9CisJCSAgICBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLmpwZWdfbWFya2VyczsKKworCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19TX0pQRUdDT01QOgorCXsKKwkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwYXJhbXMgPSBhcmc7CisJCWludCByZXMgPSAwOworCisJCXNldHRpbmdzID0gZmgtPmpwZ19zZXR0aW5nczsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHCisJCQkiJXM6IFZJRElPQ19TX0pQRUdDT01QIC0gcXVhbGl0eT0lZCwgQVBQTj0lZCwgQVBQX2xlbj0lZCwgQ09NX2xlbj0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBwYXJhbXMtPnF1YWxpdHksIHBhcmFtcy0+QVBQbiwKKwkJCXBhcmFtcy0+QVBQX2xlbiwgcGFyYW1zLT5DT01fbGVuKTsKKworCQlzZXR0aW5ncy5qcGdfY29tcCA9ICpwYXJhbXM7CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUgfHwKKwkJICAgIGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fV0FSTklORworCQkJCSIlczogVklESU9DX1NfSlBFR0NPTVAgY2FsbGVkIHdoaWxlIGluIHBsYXliYWNrL2NhcHR1cmUgbW9kZVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXMgPSAtRUJVU1k7CisJCQlnb3RvIHNqcGVnY191bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCisJCWlmICgocmVzID0gem9yYW5fY2hlY2tfanBnX3NldHRpbmdzKHpyLCAmc2V0dGluZ3MpKSkKKwkJCWdvdG8gc2pwZWdjX3VubG9ja19hbmRfcmV0dXJuOworCQlpZiAoIWZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQpCisJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemUgPQorCQkJICAgIHpvcmFuX3Y0bDJfY2FsY19idWZzaXplKCZmaC0+anBnX3NldHRpbmdzKTsKKwkJZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcCA9ICpwYXJhbXMgPSBzZXR0aW5ncy5qcGdfY29tcDsKKwlzanBlZ2NfdW5sb2NrX2FuZF9yZXR1cm46CisJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1FVRVJZU1REOgkvKiB3aHkgaXMgdGhpcyB1c2VmdWw/ICovCisJeworCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOworCisJCWRwcmludGsoMywKKwkJCUtFUk5fREVCVUcgIiVzOiBWSURJT0NfUVVFUllfU1REIC0gc3RkPTB4JWxseFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCAodW5zaWduZWQgbG9uZyBsb25nKSpzdGQpOworCisJCWlmICgqc3RkID09IFY0TDJfU1REX0FMTCB8fCAqc3RkID09IFY0TDJfU1REX05UU0MgfHwKKwkJICAgICpzdGQgPT0gVjRMMl9TVERfUEFMIHx8ICgqc3RkID09IFY0TDJfU1REX1NFQ0FNICYmCisJCQkJCSAgICAgenItPmNhcmQubm9ybXMgPT0gMykpIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1RSWV9GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCA9IGFyZzsKKwkJaW50IHJlcyA9IDA7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1RSWV9GTVQgLSB0eXBlPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGZtdC0+dHlwZSk7CisKKwkJc3dpdGNoIChmbXQtPnR5cGUpIHsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCQlkb3duKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJCWlmIChmbXQtPmZtdC53aW4udy53aWR0aCA+IEJVWl9NQVhfV0lEVEgpCisJCQkJZm10LT5mbXQud2luLncud2lkdGggPSBCVVpfTUFYX1dJRFRIOworCQkJaWYgKGZtdC0+Zm10Lndpbi53LndpZHRoIDwgQlVaX01JTl9XSURUSCkKKwkJCQlmbXQtPmZtdC53aW4udy53aWR0aCA9IEJVWl9NSU5fV0lEVEg7CisJCQlpZiAoZm10LT5mbXQud2luLncuaGVpZ2h0ID4gQlVaX01BWF9IRUlHSFQpCisJCQkJZm10LT5mbXQud2luLncuaGVpZ2h0ID0gQlVaX01BWF9IRUlHSFQ7CisJCQlpZiAoZm10LT5mbXQud2luLncuaGVpZ2h0IDwgQlVaX01JTl9IRUlHSFQpCisJCQkJZm10LT5mbXQud2luLncuaGVpZ2h0ID0gQlVaX01JTl9IRUlHSFQ7CisKKwkJCXVwKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCQlicmVhazsKKworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKwkJCWlmIChmbXQtPmZtdC5waXguYnl0ZXNwZXJsaW5lID4gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCQlpZiAoZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9NSlBFRykgeworCQkJCXNldHRpbmdzID0gZmgtPmpwZ19zZXR0aW5nczsKKworCQkJCS8qIHdlIGFjdHVhbGx5IG5lZWQgdG8gc2V0ICdyZWFsJyBwYXJhbWV0ZXJzIG5vdyAqLworCQkJCWlmICgoZm10LT5mbXQucGl4LmhlaWdodCAqIDIpID4KKwkJCQkgICAgQlVaX01BWF9IRUlHSFQpCisJCQkJCXNldHRpbmdzLlRtcERjbSA9IDE7CisJCQkJZWxzZQorCQkJCQlzZXR0aW5ncy5UbXBEY20gPSAyOworCQkJCXNldHRpbmdzLmRlY2ltYXRpb24gPSAwOworCQkJCWlmIChmbXQtPmZtdC5waXguaGVpZ2h0IDw9CisJCQkJICAgIGZoLT5qcGdfc2V0dGluZ3MuaW1nX2hlaWdodCAvIDIpCisJCQkJCXNldHRpbmdzLlZlckRjbSA9IDI7CisJCQkJZWxzZQorCQkJCQlzZXR0aW5ncy5WZXJEY20gPSAxOworCQkJCWlmIChmbXQtPmZtdC5waXgud2lkdGggPD0KKwkJCQkgICAgZmgtPmpwZ19zZXR0aW5ncy5pbWdfd2lkdGggLyA0KQorCQkJCQlzZXR0aW5ncy5Ib3JEY20gPSA0OworCQkJCWVsc2UgaWYgKGZtdC0+Zm10LnBpeC53aWR0aCA8PQorCQkJCQkgZmgtPmpwZ19zZXR0aW5ncy5pbWdfd2lkdGggLyAyKQorCQkJCQlzZXR0aW5ncy5Ib3JEY20gPSAyOworCQkJCWVsc2UKKwkJCQkJc2V0dGluZ3MuSG9yRGNtID0gMTsKKwkJCQlpZiAoc2V0dGluZ3MuVG1wRGNtID09IDEpCisJCQkJCXNldHRpbmdzLmZpZWxkX3Blcl9idWZmID0gMjsKKwkJCQllbHNlCisJCQkJCXNldHRpbmdzLmZpZWxkX3Blcl9idWZmID0gMTsKKworCQkJCS8qIGNoZWNrICovCisJCQkJaWYgKChyZXMgPQorCQkJCSAgICAgem9yYW5fY2hlY2tfanBnX3NldHRpbmdzKHpyLAorCQkJCQkJCSAgICAgICZzZXR0aW5ncykpKQorCQkJCQlnb3RvIHRyeWZtdF91bmxvY2tfYW5kX3JldHVybjsKKworCQkJCS8qIHRlbGwgdGhlIHVzZXIgd2hhdCB3ZSBhY3R1YWxseSBkaWQgKi8KKwkJCQlmbXQtPmZtdC5waXgud2lkdGggPQorCQkJCSAgICBzZXR0aW5ncy5pbWdfd2lkdGggLyBzZXR0aW5ncy5Ib3JEY207CisJCQkJZm10LT5mbXQucGl4LmhlaWdodCA9CisJCQkJICAgIHNldHRpbmdzLmltZ19oZWlnaHQgKiAyIC8KKwkJCQkgICAgKHNldHRpbmdzLlRtcERjbSAqIHNldHRpbmdzLlZlckRjbSk7CisJCQkJaWYgKHNldHRpbmdzLlRtcERjbSA9PSAxKQorCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQorCQkJCQkgICAgKGZoLT5qcGdfc2V0dGluZ3MuCisJCQkJCSAgICAgb2RkX2V2ZW4gPyBWNEwyX0ZJRUxEX1NFUV9UQiA6CisJCQkJCSAgICAgVjRMMl9GSUVMRF9TRVFfQlQpOworCQkJCWVsc2UKKwkJCQkJZm10LT5mbXQucGl4LmZpZWxkID0KKwkJCQkJICAgIChmaC0+anBnX3NldHRpbmdzLgorCQkJCQkgICAgIG9kZF9ldmVuID8gVjRMMl9GSUVMRF9UT1AgOgorCQkJCQkgICAgIFY0TDJfRklFTERfQk9UVE9NKTsKKworCQkJCWZtdC0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQkJCSAgICB6b3Jhbl92NGwyX2NhbGNfYnVmc2l6ZSgmc2V0dGluZ3MpOworCQkJfSBlbHNlIGlmIChmbXQtPnR5cGUgPT0KKwkJCQkgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJCQlpbnQgaTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCB6b3Jhbl9udW1fZm9ybWF0czsgaSsrKQorCQkJCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5mb3VyY2MgPT0KKwkJCQkJICAgIGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCkKKwkJCQkJCWJyZWFrOworCQkJCWlmIChpID09IHpvcmFuX251bV9mb3JtYXRzKSB7CisJCQkJCXJlcyA9IC1FSU5WQUw7CisJCQkJCWdvdG8gdHJ5Zm10X3VubG9ja19hbmRfcmV0dXJuOworCQkJCX0KKworCQkJCWlmIChmbXQtPmZtdC5waXgud2lkdGggPiBCVVpfTUFYX1dJRFRIKQorCQkJCQlmbXQtPmZtdC5waXgud2lkdGggPSBCVVpfTUFYX1dJRFRIOworCQkJCWlmIChmbXQtPmZtdC5waXgud2lkdGggPCBCVVpfTUlOX1dJRFRIKQorCQkJCQlmbXQtPmZtdC5waXgud2lkdGggPSBCVVpfTUlOX1dJRFRIOworCQkJCWlmIChmbXQtPmZtdC5waXguaGVpZ2h0ID4gQlVaX01BWF9IRUlHSFQpCisJCQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPQorCQkJCQkgICAgQlVaX01BWF9IRUlHSFQ7CisJCQkJaWYgKGZtdC0+Zm10LnBpeC5oZWlnaHQgPCBCVVpfTUlOX0hFSUdIVCkKKwkJCQkJZm10LT5mbXQucGl4LmhlaWdodCA9CisJCQkJCSAgICBCVVpfTUlOX0hFSUdIVDsKKwkJCX0gZWxzZSB7CisJCQkJcmVzID0gLUVJTlZBTDsKKwkJCQlnb3RvIHRyeWZtdF91bmxvY2tfYW5kX3JldHVybjsKKwkJCX0KKwkJdHJ5Zm10X3VubG9ja19hbmRfcmV0dXJuOgorCQkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQkJcmV0dXJuIHJlczsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisjZW5kaWYKKworCWRlZmF1bHQ6CisJCWRwcmludGsoMSwgS0VSTl9ERUJVRyAiJXM6IFVOS05PV04gaW9jdGwgY21kOiAweCV4XG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGNtZCk7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3pvcmFuX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCSAgICAgc3RydWN0IGZpbGUgICpmaWxlLAorCSAgICAgdW5zaWduZWQgaW50ICBjbWQsCisJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCB6b3Jhbl9kb19pb2N0bCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3pvcmFuX3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLAorCSAgICBwb2xsX3RhYmxlICAqd2FpdCkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKnF1ZXVlID0gTlVMTDsKKwlpbnQgcmVzID0gMCwgZnJhbWU7CisKKwkvKiB3ZSBzaG91bGQgY2hlY2sgd2hldGhlciBidWZmZXJzIGFyZSByZWFkeSB0byBiZSBzeW5jZWQgb24KKwkgKiAody9vIHdhaXRzIC0gT19OT05CTE9DSykgaGVyZQorCSAqIGlmIHJlYWR5IGZvciByZWFkIChzeW5jKSwgcmV0dXJuIFBPTExJTnxQT0xMUkROT1JNLAorCSAqIGlmIHJlYWR5IGZvciB3cml0ZSAoc3luYyksIHJldHVybiBQT0xMT1VUfFBPTExXUk5PUk0sCisJICogaWYgZXJyb3IsIHJldHVybiBQT0xMRVJSLAorCSAqIGlmIG5vIGJ1ZmZlcnMgcXVldWVkIG9yIHNvLCByZXR1cm4gUE9MTE5WQUwKKwkgKi8KKworCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7CisJY2FzZSBaT1JBTl9NQVBfTU9ERV9SQVc6CisJCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUgfHwKKwkJICAgIHpyLT52NGxfcGVuZF9oZWFkID09IHpyLT52NGxfcGVuZF90YWlsKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJIiVzOiB6b3Jhbl9wb2xsKCkgLSBubyBidWZmZXJzIHF1ZXVlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXMgPSBQT0xMTlZBTDsKKwkJCWdvdG8gcG9sbF91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCQlxdWV1ZSA9ICZ6ci0+djRsX2NhcHE7CisJCWZyYW1lID0genItPnY0bF9wZW5kW3pyLT52NGxfcGVuZF90YWlsICYgVjRMX01BU0tfRlJBTUVdOworCQlwb2xsX3dhaXQoZmlsZSwgcXVldWUsIHdhaXQpOworCQlpZiAoZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgPT0gQlVaX1NUQVRFX0RPTkUpCisJCQlyZXMgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQlicmVhazsKKworCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1JFQzoKKwljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19QTEFZOgorCQlpZiAoZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFIHx8CisJCSAgICB6ci0+anBnX3F1ZV9oZWFkID09IHpyLT5qcGdfcXVlX3RhaWwpIHsKKwkJCWRwcmludGsoMSwKKwkJCQkiJXM6IHpvcmFuX3BvbGwoKSAtIG5vIGJ1ZmZlcnMgcXVldWVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IFBPTExOVkFMOworCQkJZ290byBwb2xsX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisJCXF1ZXVlID0gJnpyLT5qcGdfY2FwcTsKKwkJZnJhbWUgPSB6ci0+anBnX3BlbmRbenItPmpwZ19xdWVfdGFpbCAmIEJVWl9NQVNLX0ZSQU1FXTsKKwkJcG9sbF93YWl0KGZpbGUsIHF1ZXVlLCB3YWl0KTsKKwkJaWYgKGZoLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlID09IEJVWl9TVEFURV9ET05FKSB7CisJCQlpZiAoZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX0pQR19SRUMpCisJCQkJcmVzID0gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJCWVsc2UKKwkJCQlyZXMgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRwcmludGsoMSwKKwkJCSIlczogem9yYW5fcG9sbCgpIC0gaW50ZXJuYWwgZXJyb3IsIHVua25vd24gbWFwX21vZGU9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgZmgtPm1hcF9tb2RlKTsKKwkJcmVzID0gUE9MTE5WQUw7CisJCWdvdG8gcG9sbF91bmxvY2tfYW5kX3JldHVybjsKKwl9CisKK3BvbGxfdW5sb2NrX2FuZF9yZXR1cm46CisJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCXJldHVybiByZXM7Cit9CisKKworLyoKKyAqIFRoaXMgbWFwcyB0aGUgYnVmZmVycyB0byB1c2VyIHNwYWNlLgorICoKKyAqIERlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgZmgtPm1hcF9tb2RlCisgKiB0aGUgVjRMIG9yIHRoZSBNSlBFRyBidWZmZXJzIGFyZSBtYXBwZWQKKyAqIHBlciBidWZmZXIgb3IgYWxsIHRvZ2V0aGVyCisgKgorICogTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29ubmVjdCB0byBzb21lCisgKiB1bm1hcCBzaWduYWwgZXZlbnQgdG8gdW5tYXAgdGhlIGRlLWFsbG9jYXRlCisgKiB0aGUgYnVmZmVyIGFjY29yZGluZ2x5ICh6b3Jhbl92bV9jbG9zZSgpKQorICovCisKK3N0YXRpYyB2b2lkCit6b3Jhbl92bV9vcGVuIChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgem9yYW5fbWFwcGluZyAqbWFwID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwltYXAtPmNvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkCit6b3Jhbl92bV9jbG9zZSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHpvcmFuX21hcHBpbmcgKm1hcCA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmaWxlICpmaWxlID0gbWFwLT5maWxlOworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwlpbnQgaTsKKworCW1hcC0+Y291bnQtLTsKKwlpZiAobWFwLT5jb3VudCA9PSAwKSB7CisJCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7CisJCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1JFQzoKKwkJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWToKKworCQkJZHByaW50aygzLCBLRVJOX0lORk8gIiVzOiBtdW5tYXAoTUpQRUcpXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKworCQkJZm9yIChpID0gMDsgaSA8IGZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVyczsgaSsrKSB7CisJCQkJaWYgKGZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0ubWFwID09IG1hcCkgeworCQkJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLm1hcCA9CisJCQkJCSAgICBOVUxMOworCQkJCX0KKwkJCX0KKwkJCWtmcmVlKG1hcCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykKKwkJCQlpZiAoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5tYXApCisJCQkJCWJyZWFrOworCQkJaWYgKGkgPT0gZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzKSB7CisJCQkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCQkJaWYgKGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSkgeworCQkJCQlqcGdfcWJ1ZihmaWxlLCAtMSwgenItPmNvZGVjX21vZGUpOworCQkJCQl6ci0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwkJCQkJenItPmpwZ19idWZmZXJzLmFjdGl2ZSA9CisJCQkJCSAgICBmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID0KKwkJCQkJICAgIFpPUkFOX0ZSRUU7CisJCQkJfQorCQkJCS8vanBnX2ZidWZmZXJfZnJlZShmaWxlKTsKKwkJCQlmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwkJCQlmaC0+anBnX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQgPSAxOworCisJCQkJdXAoJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBaT1JBTl9NQVBfTU9ERV9SQVc6CisKKwkJCWRwcmludGsoMywgS0VSTl9JTkZPICIlczogbXVubWFwKFY0TClcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzOyBpKyspIHsKKwkJCQlpZiAoZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5tYXAgPT0gbWFwKSB7CisJCQkJCS8qIHVucXVldWUvdW5tYXAgKi8KKwkJCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5tYXAgPQorCQkJCQkgICAgTlVMTDsKKwkJCQl9CisJCQl9CisJCQlrZnJlZShtYXApOworCisJCQlmb3IgKGkgPSAwOyBpIDwgZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzOyBpKyspCisJCQkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0ubWFwKQorCQkJCQlicmVhazsKKwkJCWlmIChpID09IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycykgeworCQkJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQkJCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKKwkJCQkJenIzNjA1N19zZXRfbWVtZ3JhYih6ciwgMCk7CisJCQkJCXpyLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOworCQkJCQl6ci0+djRsX2J1ZmZlcnMuYWN0aXZlID0KKwkJCQkJICAgIGZoLT52NGxfYnVmZmVycy5hY3RpdmUgPQorCQkJCQkgICAgWk9SQU5fRlJFRTsKKwkJCQl9CisJCQkJLy92NGxfZmJ1ZmZlcl9mcmVlKGZpbGUpOworCQkJCWZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOworCQkJCWZoLT52NGxfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCA9IDE7CisKKwkJCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCQkJfQorCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiBtdW5tYXAoKSAtIGludGVybmFsIGVycm9yIC0gdW5rbm93biBtYXAgbW9kZSAlZFxuIiwKKwkJCSAgICAgICBaUl9ERVZOQU1FKHpyKSwgZmgtPm1hcF9tb2RlKTsKKwkJCWJyZWFrOworCisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgem9yYW5fdm1fb3BzID0geworCS5vcGVuID0gem9yYW5fdm1fb3BlbiwKKwkuY2xvc2UgPSB6b3Jhbl92bV9jbG9zZSwKK307CisKK3N0YXRpYyBpbnQKK3pvcmFuX21tYXAgKHN0cnVjdCBmaWxlICAgICAgICAgICAqZmlsZSwKKwkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCWludCBpLCBqOworCXVuc2lnbmVkIGxvbmcgcGFnZSwgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0LCB0b2RvLCBwb3MsIGZyYWdsZW47CisJaW50IGZpcnN0LCBsYXN0OworCXN0cnVjdCB6b3Jhbl9tYXBwaW5nICptYXA7CisJaW50IHJlcyA9IDA7CisKKwlkcHJpbnRrKDMsCisJCUtFUk5fSU5GTyAiJXM6IG1tYXAoJXMpIG9mIDB4JTA4bHgtMHglMDhseCAoc2l6ZT0lbHUpXG4iLAorCQlaUl9ERVZOQU1FKHpyKSwKKwkJZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX1JBVyA/ICJWNEwiIDogIk1KUEVHIiwKKwkJdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHNpemUpOworCisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgfHwgISh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgfHwKKwkgICAgISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IG1tYXAoKSAtIG5vIE1BUF9TSEFSRUQvUFJPVF97UkVBRCxXUklURX0gZ2l2ZW5cbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7CisKKwljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19SRUM6CisJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWToKKworCQkvKiBsb2NrICovCisJCWRvd24oJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQkvKiBNYXAgdGhlIE1KUEVHIGJ1ZmZlcnMgKi8KKwkJaWYgKCFmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IHpvcmFuX21tYXAoTUpQRUcpIC0gYnVmZmVycyBub3QgeWV0IGFsbG9jYXRlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXMgPSAtRU5PTUVNOworCQkJZ290byBqcGdfbW1hcF91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCisJCWZpcnN0ID0gb2Zmc2V0IC8gZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplOworCQlsYXN0ID0gZmlyc3QgLSAxICsgc2l6ZSAvIGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZTsKKwkJaWYgKG9mZnNldCAlIGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSAhPSAwIHx8CisJCSAgICBzaXplICUgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplICE9IDAgfHwgZmlyc3QgPCAwIHx8CisJCSAgICBsYXN0IDwgMCB8fCBmaXJzdCA+PSBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMgfHwKKwkJICAgIGxhc3QgPj0gZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IG1tYXAoTUpQRUcpIC0gb2Zmc2V0PSVsdSBvciBzaXplPSVsdSBpbnZhbGlkIGZvciBidWZzaXplPSVkIGFuZCBudW1idWZzPSVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBvZmZzZXQsIHNpemUsCisJCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplLAorCQkJCWZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVycyk7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byBqcGdfbW1hcF91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCQlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJCWlmIChmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLm1hcCkgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBtbWFwKE1KUEVHKSAtIGJ1ZmZlciAlZCBhbHJlYWR5IG1hcHBlZFxuIiwKKwkJCQkJWlJfREVWTkFNRSh6ciksIGkpOworCQkJCXJlcyA9IC1FQlVTWTsKKwkJCQlnb3RvIGpwZ19tbWFwX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCQl9CisKKwkJLyogbWFwIHRoZXNlIGJ1ZmZlcnMgKHY0bF9idWZmZXJzW2ldKSAqLworCQltYXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgem9yYW5fbWFwcGluZyksIEdGUF9LRVJORUwpOworCQlpZiAoIW1hcCkgeworCQkJcmVzID0gLUVOT01FTTsKKwkJCWdvdG8ganBnX21tYXBfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKwkJbWFwLT5maWxlID0gZmlsZTsKKwkJbWFwLT5jb3VudCA9IDE7CisKKwkJdm1hLT52bV9vcHMgPSAmem9yYW5fdm1fb3BzOworCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0RPTlRFWFBBTkQ7CisJCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gbWFwOworCisJCWZvciAoaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgeworCQkJZm9yIChqID0gMDsKKwkJCSAgICAgaiA8IGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSAvIFBBR0VfU0laRTsKKwkJCSAgICAgaisrKSB7CisJCQkJZnJhZ2xlbiA9CisJCQkJICAgIChsZTMyX3RvX2NwdShmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLgorCQkJCSAgICAgZnJhZ190YWJbMiAqIGogKyAxXSkgJiB+MSkgPDwgMTsKKwkJCQl0b2RvID0gc2l6ZTsKKwkJCQlpZiAodG9kbyA+IGZyYWdsZW4pCisJCQkJCXRvZG8gPSBmcmFnbGVuOworCQkJCXBvcyA9CisJCQkJICAgIGxlMzJfdG9fY3B1KCh1bnNpZ25lZCBsb25nKSBmaC0+anBnX2J1ZmZlcnMuCisJCQkJICAgIGJ1ZmZlcltpXS5mcmFnX3RhYlsyICogal0pOworCQkJCS8qIHNob3VsZCBqdXN0IGJlIHBvcyBvbiBpMzg2ICovCisJCQkJcGFnZSA9IHZpcnRfdG9fcGh5cyhidXNfdG9fdmlydChwb3MpKQorCQkJCQkJCQk+PiBQQUdFX1NISUZUOworCQkJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwKKwkJCQkJCQl0b2RvLCBQQUdFX1NIQVJFRCkpIHsKKwkJCQkJZHByaW50aygxLAorCQkJCQkJS0VSTl9FUlIKKwkJCQkJCSIlczogem9yYW5fbW1hcChWNEwpIC0gcmVtYXBfcGZuX3JhbmdlIGZhaWxlZFxuIiwKKwkJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQkJcmVzID0gLUVBR0FJTjsKKwkJCQkJZ290byBqcGdfbW1hcF91bmxvY2tfYW5kX3JldHVybjsKKwkJCQl9CisJCQkJc2l6ZSAtPSB0b2RvOworCQkJCXN0YXJ0ICs9IHRvZG87CisJCQkJaWYgKHNpemUgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGxlMzJfdG9fY3B1KGZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uCisJCQkJICAgIGZyYWdfdGFiWzIgKiBqICsgMV0pICYgMSkKKwkJCQkJYnJlYWs7CS8qIHdhcyBsYXN0IGZyYWdtZW50ICovCisJCQl9CisJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLm1hcCA9IG1hcDsKKwkJCWlmIChzaXplID09IDApCisJCQkJYnJlYWs7CisKKwkJfQorCWpwZ19tbWFwX3VubG9ja19hbmRfcmV0dXJuOgorCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCisJCWJyZWFrOworCisJY2FzZSBaT1JBTl9NQVBfTU9ERV9SQVc6CisKKwkJZG93bigmenItPnJlc291cmNlX2xvY2spOworCisJCS8qIE1hcCB0aGUgVjRMIGJ1ZmZlcnMgKi8KKwkJaWYgKCFmaC0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IHpvcmFuX21tYXAoVjRMKSAtIGJ1ZmZlcnMgbm90IHlldCBhbGxvY2F0ZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmVzID0gLUVOT01FTTsKKwkJCWdvdG8gdjRsX21tYXBfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQlmaXJzdCA9IG9mZnNldCAvIGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZTsKKwkJbGFzdCA9IGZpcnN0IC0gMSArIHNpemUgLyBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7CisJCWlmIChvZmZzZXQgJSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUgIT0gMCB8fAorCQkgICAgc2l6ZSAlIGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSAhPSAwIHx8IGZpcnN0IDwgMCB8fAorCQkgICAgbGFzdCA8IDAgfHwgZmlyc3QgPj0gZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzIHx8CisJCSAgICBsYXN0ID49IGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBtbWFwKFY0TCkgLSBvZmZzZXQ9JWx1IG9yIHNpemU9JWx1IGludmFsaWQgZm9yIGJ1ZnNpemU9JWQgYW5kIG51bWJ1ZnM9JWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIG9mZnNldCwgc2l6ZSwKKwkJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUsCisJCQkJZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIHY0bF9tbWFwX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisJCWZvciAoaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgeworCQkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0ubWFwKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IG1tYXAoVjRMKSAtIGJ1ZmZlciAlZCBhbHJlYWR5IG1hcHBlZFxuIiwKKwkJCQkJWlJfREVWTkFNRSh6ciksIGkpOworCQkJCXJlcyA9IC1FQlVTWTsKKwkJCQlnb3RvIHY0bF9tbWFwX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCQl9CisKKwkJLyogbWFwIHRoZXNlIGJ1ZmZlcnMgKHY0bF9idWZmZXJzW2ldKSAqLworCQltYXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgem9yYW5fbWFwcGluZyksIEdGUF9LRVJORUwpOworCQlpZiAoIW1hcCkgeworCQkJcmVzID0gLUVOT01FTTsKKwkJCWdvdG8gdjRsX21tYXBfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKwkJbWFwLT5maWxlID0gZmlsZTsKKwkJbWFwLT5jb3VudCA9IDE7CisKKwkJdm1hLT52bV9vcHMgPSAmem9yYW5fdm1fb3BzOworCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0RPTlRFWFBBTkQ7CisJCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gbWFwOworCisJCWZvciAoaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgeworCQkJdG9kbyA9IHNpemU7CisJCQlpZiAodG9kbyA+IGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSkKKwkJCQl0b2RvID0gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOworCQkJcGFnZSA9IGZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlcl9waHlzOworCQkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlID4+IFBBR0VfU0hJRlQsCisJCQkJCQkJdG9kbywgUEFHRV9TSEFSRUQpKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IHpvcmFuX21tYXAoVjRMKWkgLSByZW1hcF9wZm5fcmFuZ2UgZmFpbGVkXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQkJcmVzID0gLUVBR0FJTjsKKwkJCQlnb3RvIHY0bF9tbWFwX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCQkJc2l6ZSAtPSB0b2RvOworCQkJc3RhcnQgKz0gdG9kbzsKKwkJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0ubWFwID0gbWFwOworCQkJaWYgKHNpemUgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCXY0bF9tbWFwX3VubG9ja19hbmRfcmV0dXJuOgorCQl1cCgmenItPnJlc291cmNlX2xvY2spOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogem9yYW5fbW1hcCgpIC0gaW50ZXJuYWwgZXJyb3IgLSB1bmtub3duIG1hcCBtb2RlICVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGZoLT5tYXBfbW9kZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6b3Jhbl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gem9yYW5fb3BlbiwKKwkucmVsZWFzZSA9IHpvcmFuX2Nsb3NlLAorCS5pb2N0bCA9IHpvcmFuX2lvY3RsLAorCS5sbHNlZWsgPSBub19sbHNlZWssCisJLnJlYWQgPSB6b3Jhbl9yZWFkLAorCS53cml0ZSA9IHpvcmFuX3dyaXRlLAorCS5tbWFwID0gem9yYW5fbW1hcCwKKwkucG9sbCA9IHpvcmFuX3BvbGwsCit9OworCitzdHJ1Y3QgdmlkZW9fZGV2aWNlIHpvcmFuX3RlbXBsYXRlIF9fZGV2aW5pdGRhdGEgPSB7CisJLm5hbWUgPSBaT1JBTl9OQU1FLAorCS50eXBlID0gWk9SQU5fVklEX1RZUEUsCisjaWZkZWYgSEFWRV9WNEwyCisJLnR5cGUyID0gWk9SQU5fVjRMMl9WSURfRkxBR1MsCisjZW5kaWYKKwkuaGFyZHdhcmUgPSBaT1JBTl9IQVJEV0FSRSwKKwkuZm9wcyA9ICZ6b3Jhbl9mb3BzLAorCS5yZWxlYXNlID0gJnpvcmFuX3ZkZXZfcmVsZWFzZSwKKwkubWlub3IgPSAtMQorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9wcm9jZnMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fcHJvY2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkOWIxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fcHJvY2ZzLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBab3JhbiB6cjM2MDU3L3pyMzYwNjcgUENJIGNvbnRyb2xsZXIgZHJpdmVyLCBmb3IgdGhlCisgKiBQaW5uYWNsZS9NaXJvIERDMTAvREMxMCsvREMzMC9EQzMwKywgSW9tZWdhIEJ1eiwgTGludXgKKyAqIE1lZGlhIExhYnMgTE1MMzMvTE1MMzNSMTAuCisgKgorICogVGhpcyBwYXJ0IGhhbmRsZXMgdGhlIHByb2NGUyBlbnRyaWVzICgvcHJvYy9aT1JBTlslZF0pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKyAqCisgKiBDdXJyZW50bHkgbWFpbnRhaW5lZCBieToKKyAqICAgUm9uYWxkIEJ1bHRqZSAgICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZT4KKyAqICAgTWFpbGluZ2xpc3QgICAgICA8bWpwZWctdXNlcnNAbGlzdHMuc2YubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VtLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJ2aWRlb2NvZGVjLmgiCisjaW5jbHVkZSAiem9yYW4uaCIKKyNpbmNsdWRlICJ6b3Jhbl9wcm9jZnMuaCIKKworZXh0ZXJuIGludCAqenJfZGVidWc7CisKKyNkZWZpbmUgZHByaW50ayhudW0sIGZvcm1hdCwgYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoKnpyX2RlYnVnID49IG51bSkgXAorCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RydWN0IHByb2Nmc19wYXJhbXNfenIzNjA2NyB7CisJY2hhciAqbmFtZTsKKwlzaG9ydCByZWc7CisJdTMyIG1hc2s7CisJc2hvcnQgYml0OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwcm9jZnNfcGFyYW1zX3pyMzYwNjcgenI2N1tdID0geworCXsiSFNQb2wiLCAweDAwMCwgMSwgMzB9LAorCXsiSFN0YXJ0IiwgMHgwMDAsIDB4M2ZmLCAxMH0sCisJeyJIRW5kIiwgMHgwMDAsIDB4M2ZmLCAwfSwKKworCXsiVlNQb2wiLCAweDAwNCwgMSwgMzB9LAorCXsiVlN0YXJ0IiwgMHgwMDQsIDB4M2ZmLCAxMH0sCisJeyJWRW5kIiwgMHgwMDQsIDB4M2ZmLCAwfSwKKworCXsiRXh0RmwiLCAweDAwOCwgMSwgMjZ9LAorCXsiVG9wRmllbGQiLCAweDAwOCwgMSwgMjV9LAorCXsiVkNMS1BvbCIsIDB4MDA4LCAxLCAyNH0sCisJeyJEdXBGbGQiLCAweDAwOCwgMSwgMjB9LAorCXsiTGl0dGxlRW5kaWFuIiwgMHgwMDgsIDEsIDB9LAorCisJeyJIc3luY1N0YXJ0IiwgMHgxMGMsIDB4ZmZmZiwgMTZ9LAorCXsiTGluZVRvdCIsIDB4MTBjLCAweGZmZmYsIDB9LAorCisJeyJOQVgiLCAweDExMCwgMHhmZmZmLCAxNn0sCisJeyJQQVgiLCAweDExMCwgMHhmZmZmLCAwfSwKKworCXsiTkFZIiwgMHgxMTQsIDB4ZmZmZiwgMTZ9LAorCXsiUEFZIiwgMHgxMTQsIDB4ZmZmZiwgMH0sCisKKwkvKiB7IiIsLCx9LCAqLworCisJe05VTEwsIDAsIDAsIDB9LAorfTsKKworc3RhdGljIHZvaWQKK3NldHBhcmFtIChzdHJ1Y3Qgem9yYW4gKnpyLAorCSAgY2hhciAgICAgICAgICpuYW1lLAorCSAgY2hhciAgICAgICAgICpzdmFsKQoreworCWludCBpID0gMCwgcmVnMCwgcmVnLCB2YWw7CisKKwl3aGlsZSAoenI2N1tpXS5uYW1lICE9IE5VTEwpIHsKKwkJaWYgKCFzdHJuY21wKG5hbWUsIHpyNjdbaV0ubmFtZSwgc3RybGVuKHpyNjdbaV0ubmFtZSkpKSB7CisJCQlyZWcgPSByZWcwID0gYnRyZWFkKHpyNjdbaV0ucmVnKTsKKwkJCXJlZyAmPSB+KHpyNjdbaV0ubWFzayA8PCB6cjY3W2ldLmJpdCk7CisJCQlpZiAoIWlzZGlnaXQoc3ZhbFswXSkpCisJCQkJYnJlYWs7CisJCQl2YWwgPSBzaW1wbGVfc3RydG91bChzdmFsLCBOVUxMLCAwKTsKKwkJCWlmICgodmFsICYgfnpyNjdbaV0ubWFzaykpCisJCQkJYnJlYWs7CisJCQlyZWcgfD0gKHZhbCAmIHpyNjdbaV0ubWFzaykgPDwgenI2N1tpXS5iaXQ7CisJCQlkcHJpbnRrKDQsCisJCQkJS0VSTl9JTkZPCisJCQkJIiVzOiBzZXRwYXJhbTogc2V0dGluZyBaUjM2MDY3IHJlZ2lzdGVyIDB4JTAzeDogMHglMDh4PT4weCUwOHggJXM9JWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIHpyNjdbaV0ucmVnLCByZWcwLCByZWcsCisJCQkJenI2N1tpXS5uYW1lLCB2YWwpOworCQkJYnR3cml0ZShyZWcsIHpyNjdbaV0ucmVnKTsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgem9yYW5fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJc3RydWN0IHpvcmFuICp6ciA9IHAtPnByaXZhdGU7CisJaW50IGk7CisKKwlzZXFfcHJpbnRmKHAsICJaUjM2MDY3IHJlZ2lzdGVyczpcbiIpOworCWZvciAoaSA9IDA7IGkgPCAweDEzMDsgaSArPSAxNikKKwkJc2VxX3ByaW50ZihwLCAiJTAzWCAlMDhYICAlMDhYICAlMDhYICAlMDhYIFxuIiwgaSwKKwkJCSAgIGJ0cmVhZChpKSwgYnRyZWFkKGkrNCksIGJ0cmVhZChpKzgpLCBidHJlYWQoaSsxMikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHpvcmFuX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHpvcmFuICpkYXRhID0gUERFKGlub2RlKS0+ZGF0YTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgem9yYW5fc2hvdywgZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHpvcmFuX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHpvcmFuICp6ciA9IFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CisJY2hhciAqc3RyaW5nLCAqc3A7CisJY2hhciAqbGluZSwgKmxkZWxpbSwgKnZhcm5hbWUsICpzdmFyLCAqdGRlbGltOworCisJaWYgKGNvdW50ID4gMzI3NjgpCS8qIFN0dXBpZGl0eSBmaWx0ZXIgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJpbmcgPSBzcCA9IHZtYWxsb2MoY291bnQgKyAxKTsKKwlpZiAoIXN0cmluZykgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB3cml0ZV9wcm9jOiBjYW4gbm90IGFsbG9jYXRlIG1lbW9yeVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcihzdHJpbmcsIGJ1ZmZlciwgY291bnQpKSB7CisJCXZmcmVlIChzdHJpbmcpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJc3RyaW5nW2NvdW50XSA9IDA7CisJZHByaW50ayg0LCBLRVJOX0lORk8gIiVzOiB3cml0ZV9wcm9jOiBuYW1lPSVzIGNvdW50PSV6dSB6cj0lcFxuIiwKKwkJWlJfREVWTkFNRSh6ciksIGZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSwgY291bnQsIHpyKTsKKwlsZGVsaW0gPSAiIFx0XG4iOworCXRkZWxpbSA9ICI9IjsKKwlsaW5lID0gc3RycGJyayhzcCwgbGRlbGltKTsKKwl3aGlsZSAobGluZSkgeworCQkqbGluZSA9IDA7CisJCXN2YXIgPSBzdHJwYnJrKHNwLCB0ZGVsaW0pOworCQlpZiAoc3ZhcikgeworCQkJKnN2YXIgPSAwOworCQkJdmFybmFtZSA9IHNwOworCQkJc3ZhcisrOworCQkJc2V0cGFyYW0oenIsIHZhcm5hbWUsIHN2YXIpOworCQl9CisJCXNwID0gbGluZSArIDE7CisJCWxpbmUgPSBzdHJwYnJrKHNwLCBsZGVsaW0pOworCX0KKwl2ZnJlZShzdHJpbmcpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6b3Jhbl9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHpvcmFuX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHpvcmFuX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworI2VuZGlmCisKK2ludAorem9yYW5fcHJvY19pbml0IChzdHJ1Y3Qgem9yYW4gKnpyKQoreworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJY2hhciBuYW1lWzhdOworCisJc25wcmludGYobmFtZSwgNywgInpvcmFuJWQiLCB6ci0+aWQpOworCWlmICgoenItPnpvcmFuX3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCAwLCBOVUxMKSkpIHsKKwkJenItPnpvcmFuX3Byb2MtPmRhdGEgPSB6cjsKKwkJenItPnpvcmFuX3Byb2MtPm93bmVyID0gVEhJU19NT0RVTEU7CisJCXpyLT56b3Jhbl9wcm9jLT5wcm9jX2ZvcHMgPSAmem9yYW5fb3BlcmF0aW9uczsKKwkJZHByaW50aygyLAorCQkJS0VSTl9JTkZPCisJCQkiJXM6IHByb2NmcyBlbnRyeSAvcHJvYy8lcyBhbGxvY2F0ZWQuIGRhdGE9JXBcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgbmFtZSwgenItPnpvcmFuX3Byb2MtPmRhdGEpOworCX0gZWxzZSB7CisJCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gaW5pdGlhbGlzZSAvcHJvYy8lc1xuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3pvcmFuX3Byb2NfY2xlYW51cCAoc3RydWN0IHpvcmFuICp6cikKK3sKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWNoYXIgbmFtZVs4XTsKKworCXNucHJpbnRmKG5hbWUsIDcsICJ6b3JhbiVkIiwgenItPmlkKTsKKwlpZiAoenItPnpvcmFuX3Byb2MpCisJCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsIE5VTEwpOworCXpyLT56b3Jhbl9wcm9jID0gTlVMTDsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9wcm9jZnMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fcHJvY2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwNGZjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fcHJvY2ZzLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFpvcmFuIHpyMzYwNTcvenIzNjA2NyBQQ0kgY29udHJvbGxlciBkcml2ZXIsIGZvciB0aGUKKyAqIFBpbm5hY2xlL01pcm8gREMxMC9EQzEwKy9EQzMwL0RDMzArLCBJb21lZ2EgQnV6LCBMaW51eAorICogTWVkaWEgTGFicyBMTUwzMy9MTUwzM1IxMC4KKyAqCisgKiBUaGlzIHBhcnQgaGFuZGxlcyBjYXJkLXNwZWNpZmljIGRhdGEgYW5kIGRldGVjdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgU2VyZ3VlaSBNaXJpZG9ub3YgPG1pcnNldkBjaWNlc2UubXg+CisgKgorICogQ3VycmVudGx5IG1haW50YWluZWQgYnk6CisgKiAgIFJvbmFsZCBCdWx0amUgICAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBza3luZXQuYmU+CisgKiAgIE1haWxpbmdsaXN0ICAgICAgPG1qcGVnLXVzZXJzQGxpc3RzLnNmLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fWk9SQU5fUFJPQ0ZTX0hfXworI2RlZmluZSBfX1pPUkFOX1BST0NGU19IX18KKworZXh0ZXJuIGludCB6b3Jhbl9wcm9jX2luaXQoc3RydWN0IHpvcmFuICp6cik7CitleHRlcm4gdm9pZCB6b3Jhbl9wcm9jX2NsZWFudXAoc3RydWN0IHpvcmFuICp6cik7CisKKyNlbmRpZgkJCQkvKiBfX1pPUkFOX1BST0NGU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjAxNi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3NDBhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjAxNi5jCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogWm9yYW4gWlIzNjAxNiBiYXNpYyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXb2xmZ2FuZyBTY2hlcnIgPHNjaGVyckBuZXQ0eW91LmF0PgorICoKKyAqICRJZDogenIzNjAxNi5jLHYgMS4xLjIuMTQgMjAwMy8wOC8yMCAxOTo0Njo1NSByYnVsdGplIEV4cCAkCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBaUjAxNl9WRVJTSU9OICJ2MC43IgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisvKiBpbmNsdWRlcyBmb3Igc3RydWN0dXJlcyBhbmQgZGVmaW5lcyByZWdhcmRpbmcgdmlkZW8gCisgICAjaW5jbHVkZTxsaW51eC92aWRlb2Rldi5oPiAqLworCisvKiBJL08gY29tbWFuZHMsIGVycm9yIGNvZGVzICovCisjaW5jbHVkZTxhc20vaW8uaD4KKy8vI2luY2x1ZGU8ZXJybm8uaD4KKworLyogdjRsICBBUEkgKi8KKyNpbmNsdWRlPGxpbnV4L3ZpZGVvZGV2Lmg+CisKKy8qIGhlYWRlcmZpbGUgb2YgdGhpcyBtb2R1bGUgKi8KKyNpbmNsdWRlInpyMzYwMTYuaCIKKworLyogY29kZWMgaW8gQVBJICovCisjaW5jbHVkZSJ2aWRlb2NvZGVjLmgiCisKKy8qIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIG1vcmUgdGhhbiAyMCBvciBzbywKKyAganVzdCB0byBwcmV2ZW50IHNvbWUgdW53YW50ZWQgbG9vcHMgKi8KKyNkZWZpbmUgTUFYX0NPREVDUyAyMAorCisvKiBhbW91bnQgb2YgY2hpcHMgYXR0YWNoZWQgdmlhIHRoaXMgZHJpdmVyICovCitzdGF0aWMgaW50IHpyMzYwMTZfY29kZWNzID0gMDsKKworLyogZGVidWdnaW5nIGlzIGF2YWlsYWJsZSB2aWEgbW9kdWxlIHBhcmFtZXRlciAqLworCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC00KSIpOworCisjZGVmaW5lIGRwcmludGsobnVtLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGRlYnVnID49IG51bSkgXAorCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIExvY2FsIGhhcmR3YXJlIEkvTyBmdW5jdGlvbnM6CisKKyAgIHJlYWQvd3JpdGUgdmlhIGNvZGVjIGxheWVyIChyZWdpc3RlcnMgYXJlIGxvY2F0ZWQgaW4gdGhlIG1hc3RlciBkZXZpY2UpCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIHJlYWQgYW5kIHdyaXRlIGZ1bmN0aW9ucyAqLworc3RhdGljIHU4Cit6cjM2MDE2X3JlYWQgKHN0cnVjdCB6cjM2MDE2ICpwdHIsCisJICAgICAgdTE2ICAgICAgICAgICAgIHJlZykKK3sKKwl1OCB2YWx1ZSA9IDA7CisKKwkvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGlzIHdyb25nLi4uCisJaWYgKHB0ci0+Y29kZWMtPm1hc3Rlcl9kYXRhLT5yZWFkcmVnKQorCQl2YWx1ZSA9CisJCSAgICAocHRyLT5jb2RlYy0+bWFzdGVyX2RhdGEtPgorCQkgICAgIHJlYWRyZWcocHRyLT5jb2RlYywgcmVnKSkgJiAweEZGOworCWVsc2UKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIgIiVzOiBpbnZhbGlkIEkvTyBzZXR1cCwgbm90aGluZyByZWFkIVxuIiwKKwkJCXB0ci0+bmFtZSk7CisKKwlkcHJpbnRrKDQsICIlczogcmVhZGluZyBmcm9tIDB4JTA0eDogJTAyeFxuIiwgcHRyLT5uYW1lLCByZWcsCisJCXZhbHVlKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQKK3pyMzYwMTZfd3JpdGUgKHN0cnVjdCB6cjM2MDE2ICpwdHIsCisJICAgICAgIHUxNiAgICAgICAgICAgICByZWcsCisJICAgICAgIHU4ICAgICAgICAgICAgICB2YWx1ZSkKK3sKKwlkcHJpbnRrKDQsICIlczogd3JpdGluZyAweCUwMnggdG8gMHglMDR4XG4iLCBwdHItPm5hbWUsIHZhbHVlLAorCQlyZWcpOworCisJLy8ganVzdCBpbiBjYXNlIHNvbWV0aGluZyBpcyB3cm9uZy4uLgorCWlmIChwdHItPmNvZGVjLT5tYXN0ZXJfZGF0YS0+d3JpdGVyZWcpIHsKKwkJcHRyLT5jb2RlYy0+bWFzdGVyX2RhdGEtPndyaXRlcmVnKHB0ci0+Y29kZWMsIHJlZywgdmFsdWUpOworCX0gZWxzZQorCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBpbnZhbGlkIEkvTyBzZXR1cCwgbm90aGluZyB3cml0dGVuIVxuIiwKKwkJCXB0ci0+bmFtZSk7Cit9CisKKy8qIGluZGlyZWN0IHJlYWQgYW5kIHdyaXRlIGZ1bmN0aW9ucyAqLworLyogdGhlIDAxNiBzdXBwb3J0cyBhdXRvLWFkZHItaW5jcmVtZW50LCBidXQKKyAqIHdyaXRpbmcgaXQgYWxsIHRpbWUgY29zdCBub3QgbXVjaCBhbmQgaXMgc2FmZXIuLi4gKi8KK3N0YXRpYyB1OAorenIzNjAxNl9yZWFkaSAoc3RydWN0IHpyMzYwMTYgKnB0ciwKKwkgICAgICAgdTE2ICAgICAgICAgICAgIHJlZykKK3sKKwl1OCB2YWx1ZSA9IDA7CisKKwkvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGlzIHdyb25nLi4uCisJaWYgKChwdHItPmNvZGVjLT5tYXN0ZXJfZGF0YS0+d3JpdGVyZWcpICYmCisJICAgIChwdHItPmNvZGVjLT5tYXN0ZXJfZGF0YS0+cmVhZHJlZykpIHsKKwkJcHRyLT5jb2RlYy0+bWFzdGVyX2RhdGEtPndyaXRlcmVnKHB0ci0+Y29kZWMsIFpSMDE2X0lBRERSLCByZWcgJiAweDBGKTsJLy8gQUREUgorCQl2YWx1ZSA9IChwdHItPmNvZGVjLT5tYXN0ZXJfZGF0YS0+cmVhZHJlZyhwdHItPmNvZGVjLCBaUjAxNl9JREFUQSkpICYgMHhGRjsJLy8gREFUQQorCX0gZWxzZQorCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBpbnZhbGlkIEkvTyBzZXR1cCwgbm90aGluZyByZWFkIChpKSFcbiIsCisJCQlwdHItPm5hbWUpOworCisJZHByaW50ayg0LCAiJXM6IHJlYWRpbmcgaW5kaXJlY3QgZnJvbSAweCUwNHg6ICUwMnhcbiIsIHB0ci0+bmFtZSwKKwkJcmVnLCB2YWx1ZSk7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorenIzNjAxNl93cml0ZWkgKHN0cnVjdCB6cjM2MDE2ICpwdHIsCisJICAgICAgICB1MTYgICAgICAgICAgICAgcmVnLAorCSAgICAgICAgdTggICAgICAgICAgICAgIHZhbHVlKQoreworCWRwcmludGsoNCwgIiVzOiB3cml0aW5nIGluZGlyZWN0IDB4JTAyeCB0byAweCUwNHhcbiIsIHB0ci0+bmFtZSwKKwkJdmFsdWUsIHJlZyk7CisKKwkvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGlzIHdyb25nLi4uCisJaWYgKHB0ci0+Y29kZWMtPm1hc3Rlcl9kYXRhLT53cml0ZXJlZykgeworCQlwdHItPmNvZGVjLT5tYXN0ZXJfZGF0YS0+d3JpdGVyZWcocHRyLT5jb2RlYywgWlIwMTZfSUFERFIsIHJlZyAmIDB4MEYpOwkvLyBBRERSCisJCXB0ci0+Y29kZWMtPm1hc3Rlcl9kYXRhLT53cml0ZXJlZyhwdHItPmNvZGVjLCBaUjAxNl9JREFUQSwgdmFsdWUgJiAweDBGRik7CS8vIERBVEEKKwl9IGVsc2UKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogaW52YWxpZCBJL08gc2V0dXAsIG5vdGhpbmcgd3JpdHRlbiAoaSkhXG4iLAorCQkJcHRyLT5uYW1lKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgTG9jYWwgaGVscGVyIGZ1bmN0aW9uOgorCisgICB2ZXJzaW9uIHJlYWQKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogdmVyc2lvbiBrZXB0IGluIGRhdGFzdHJ1Y3R1cmUgKi8KK3N0YXRpYyB1OAorenIzNjAxNl9yZWFkX3ZlcnNpb24gKHN0cnVjdCB6cjM2MDE2ICpwdHIpCit7CisJcHRyLT52ZXJzaW9uID0genIzNjAxNl9yZWFkKHB0ciwgMCkgPj4gNDsKKwlyZXR1cm4gcHRyLT52ZXJzaW9uOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBMb2NhbCBoZWxwZXIgZnVuY3Rpb246CisKKyAgIGJhc2ljIHRlc3Qgb2YgImNvbm5lY3Rpdml0eSIsIHdyaXRlcy9yZWFkcyB0by9mcm9tIFBBWC1MbyByZWdpc3RlcgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgaW50Cit6cjM2MDE2X2Jhc2ljX3Rlc3QgKHN0cnVjdCB6cjM2MDE2ICpwdHIpCit7CisJaWYgKGRlYnVnKSB7CisJCWludCBpOworCQl6cjM2MDE2X3dyaXRlaShwdHIsIFpSMDE2SV9QQVhfTE8sIDB4NTUpOworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHJlZ2lzdGVyczogIiwgcHRyLT5uYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8PSAweDBiOyBpKyspCisJCQlkcHJpbnRrKDEsICIlMDJ4ICIsIHpyMzYwMTZfcmVhZGkocHRyLCBpKSk7CisJCWRwcmludGsoMSwgIlxuIik7CisJfQorCS8vIGZvciB0ZXN0aW5nIGp1c3Qgd3JpdGUgMCwgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZSB0byBhIHJlZ2lzdGVyIGFuZCByZWFkCisJLy8gaXQgYmFjayBpbiBib3RoIGNhc2VzIAorCXpyMzYwMTZfd3JpdGVpKHB0ciwgWlIwMTZJX1BBWF9MTywgMHgwMCk7CisJaWYgKHpyMzYwMTZfcmVhZGkocHRyLCBaUjAxNklfUEFYX0xPKSAhPSAweDApIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogYXR0YWNoIGZhaWxlZCwgY2FuJ3QgY29ubmVjdCB0byB2ZmUgcHJvY2Vzc29yIVxuIiwKKwkJCXB0ci0+bmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCXpyMzYwMTZfd3JpdGVpKHB0ciwgWlIwMTZJX1BBWF9MTywgMHgwZDApOworCWlmICh6cjM2MDE2X3JlYWRpKHB0ciwgWlIwMTZJX1BBWF9MTykgIT0gMHgwZDApIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogYXR0YWNoIGZhaWxlZCwgY2FuJ3QgY29ubmVjdCB0byB2ZmUgcHJvY2Vzc29yIVxuIiwKKwkJCXB0ci0+bmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCS8vIHdlIGFsbG93IHZlcnNpb24gbnVtYmVycyBmcm9tIDAtMywgc2hvdWxkIGJlIGVub3VnaCwgdGhvdWdoCisJenIzNjAxNl9yZWFkX3ZlcnNpb24ocHRyKTsKKwlpZiAocHRyLT52ZXJzaW9uICYgMHgwYykgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBhdHRhY2ggZmFpbGVkLCBzdXNwaWNpb3VzIHZlcnNpb24gJWQgZm91bmQuLi5cbiIsCisJCQlwdHItPm5hbWUsIHB0ci0+dmVyc2lvbik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmV0dXJuIDA7CQkvKiBsb29rcyBnb29kISAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBMb2NhbCBoZWxwZXIgZnVuY3Rpb246CisKKyAgIHNpbXBsZSBsb29wIGZvciBwdXNoaW5nIHRoZSBpbml0IGRhdGFzZXRzIC0gTk8gVVNFIC0tCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZiAwCitzdGF0aWMgaW50IHpyMzYwMTZfcHVzaGl0IChzdHJ1Y3QgenIzNjAxNiAqcHRyLAorCQkJICAgdTE2ICAgICAgICAgICAgIHN0YXJ0cmVnLAorCQkJICAgdTE2ICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpkYXRhKQoreworICAgICAgICBpbnQgaT0wOworCisgICAgICAgIGRwcmludGsoNCwgIiVzOiB3cml0ZSBkYXRhIGJsb2NrIHRvIDB4JTA0eCAobGVuPSVkKVxuIiwKKwkJcHRyLT5uYW1lLCBzdGFydHJlZyxsZW4pOworICAgICAgICB3aGlsZSAoaTxsZW4pIHsKKyAgICAgICAgICAgICAgICB6cjM2MDE2X3dyaXRlaShwdHIsIHN0YXJ0cmVnKyssICBkYXRhW2krK10pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGk7Cit9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgQmFzaWMgZGF0YXNldHMgJiBpbml0OgorCisgICAvL1RPRE8vLworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvLyBuZWVkZWQgb2Zmc2V0IHZhbHVlcyAgICAgICAgICBQQUwgTlRTQyBTRUNBTQorc3RhdGljIGNvbnN0IGludCB6cjAxNl94b2ZmW10gPSB7IDIwLCAyMCwgMjAgfTsKK3N0YXRpYyBjb25zdCBpbnQgenIwMTZfeW9mZltdID0geyA4LCA5LCA3IH07CisKK3N0YXRpYyB2b2lkCit6cjM2MDE2X2luaXQgKHN0cnVjdCB6cjM2MDE2ICpwdHIpCit7CisJLy8gc3RvcCBhbnkgcHJvY2Vzc2luZworCXpyMzYwMTZfd3JpdGUocHRyLCBaUjAxNl9HT1NUT1AsIDApOworCisJLy8gbW9kZSBzZXR1cCAoeXV2NDIyIGluIGFuZCBvdXQsIGNvbXByZXNzaW9uL2V4cGFuc3VvbiBkdWUgdG8gbW9kZSkKKwl6cjM2MDE2X3dyaXRlKHB0ciwgWlIwMTZfTU9ERSwKKwkJICAgICAgWlIwMTZfWVVWNDIyIHwgWlIwMTZfWVVWNDIyX1lVVjQyMiB8CisJCSAgICAgIChwdHItPm1vZGUgPT0gQ09ERUNfRE9fQ09NUFJFU1NJT04gPworCQkgICAgICAgWlIwMTZfQ09NUFJFU1NJT04gOiBaUjAxNl9FWFBBTlNJT04pKTsKKworCS8vIG1pc2Mgc2V0dXAKKwl6cjM2MDE2X3dyaXRlaShwdHIsIFpSMDE2SV9TRVRVUDEsCisJCSAgICAgICAocHRyLT54ZGVjID8gKFpSMDE2X0hSRkwgfCBaUjAxNl9IT1JaKSA6IDApIHwKKwkJICAgICAgIChwdHItPnlkZWMgPyBaUjAxNl9WRVJUIDogMCkgfCBaUjAxNl9DTlRJKTsKKwl6cjM2MDE2X3dyaXRlaShwdHIsIFpSMDE2SV9TRVRVUDIsIFpSMDE2X0NDSVIpOworCisJLy8gV2luZG93IHNldHVwCisJLy8gKG5vIGV4dHJhIG9mZnNldCBmb3Igbm93LCBub3JtIGRlZmluZXMgb2Zmc2V0LCBkZWZhdWx0IHdpZHRoIGhlaWdodCkKKwl6cjM2MDE2X3dyaXRlaShwdHIsIFpSMDE2SV9QQVhfSEksIHB0ci0+d2lkdGggPj4gOCk7CisJenIzNjAxNl93cml0ZWkocHRyLCBaUjAxNklfUEFYX0xPLCBwdHItPndpZHRoICYgMHhGRik7CisJenIzNjAxNl93cml0ZWkocHRyLCBaUjAxNklfUEFZX0hJLCBwdHItPmhlaWdodCA+PiA4KTsKKwl6cjM2MDE2X3dyaXRlaShwdHIsIFpSMDE2SV9QQVlfTE8sIHB0ci0+aGVpZ2h0ICYgMHhGRik7CisJenIzNjAxNl93cml0ZWkocHRyLCBaUjAxNklfTkFYX0hJLCBwdHItPnhvZmYgPj4gOCk7CisJenIzNjAxNl93cml0ZWkocHRyLCBaUjAxNklfTkFYX0xPLCBwdHItPnhvZmYgJiAweEZGKTsKKwl6cjM2MDE2X3dyaXRlaShwdHIsIFpSMDE2SV9OQVlfSEksIHB0ci0+eW9mZiA+PiA4KTsKKwl6cjM2MDE2X3dyaXRlaShwdHIsIFpSMDE2SV9OQVlfTE8sIHB0ci0+eW9mZiAmIDB4RkYpOworCisJLyogc2hhbGwgd2UgY29udGludWUgbm93LCBwbGVhc2U/ICovCisJenIzNjAxNl93cml0ZShwdHIsIFpSMDE2X0dPU1RPUCwgMSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIENPREVDIEFQSSBGVU5DVElPTlMKKworICAgdGhpcyBmdW5jdGlvbnMgYXJlIGFjY2Vzc2VkIGJ5IHRoZSBtYXN0ZXIgdmlhIHRoZSBBUEkgc3RydWN0dXJlCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIHNldCBjb21wcmVzc2lvbi9leHBhbnNpb24gbW9kZSBhbmQgbGF1bmNoZXMgY29kZWMgLQorICAgdGhpcyBzaG91bGQgYmUgdGhlIGxhc3QgY2FsbCBmcm9tIHRoZSBtYXN0ZXIgYmVmb3JlIHN0YXJ0aW5nIHByb2Nlc3NpbmcgKi8KK3N0YXRpYyBpbnQKK3pyMzYwMTZfc2V0X21vZGUgKHN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYywKKwkJICBpbnQgICAgICAgICAgICAgICAgbW9kZSkKK3sKKwlzdHJ1Y3QgenIzNjAxNiAqcHRyID0gKHN0cnVjdCB6cjM2MDE2ICopIGNvZGVjLT5kYXRhOworCisJZHByaW50aygyLCAiJXM6IHNldF9tb2RlICVkIGNhbGxcbiIsIHB0ci0+bmFtZSwgbW9kZSk7CisKKwlpZiAoKG1vZGUgIT0gQ09ERUNfRE9fRVhQQU5TSU9OKSAmJiAobW9kZSAhPSBDT0RFQ19ET19DT01QUkVTU0lPTikpCisJCXJldHVybiAtRUlOVkFMOworCisJcHRyLT5tb2RlID0gbW9kZTsKKwl6cjM2MDE2X2luaXQocHRyKTsKKworCXJldHVybiAwOworfQorCisvKiBzZXQgcGljdHVyZSBzaXplICovCitzdGF0aWMgaW50Cit6cjM2MDE2X3NldF92aWRlbyAoc3RydWN0IHZpZGVvY29kZWMgICAqY29kZWMsCisJCSAgIHN0cnVjdCB0dm5vcm0gICAgICAgKm5vcm0sCisJCSAgIHN0cnVjdCB2ZmVfc2V0dGluZ3MgKmNhcCwKKwkJICAgc3RydWN0IHZmZV9wb2xhcml0eSAqcG9sKQoreworCXN0cnVjdCB6cjM2MDE2ICpwdHIgPSAoc3RydWN0IHpyMzYwMTYgKikgY29kZWMtPmRhdGE7CisKKwlkcHJpbnRrKDIsICIlczogc2V0X3ZpZGVvICVkLiVkLCAlZC8lZC0lZHglZCAoMHgleCkgY2FsbFxuIiwKKwkJcHRyLT5uYW1lLCBub3JtLT5IU3RhcnQsIG5vcm0tPlZTdGFydCwKKwkJY2FwLT54LCBjYXAtPnksIGNhcC0+d2lkdGgsIGNhcC0+aGVpZ2h0LAorCQljYXAtPmRlY2ltYXRpb24pOworCisJLyogaWYgKCkgcmV0dXJuIC1FSU5WQUw7CisJICogdHJ1c3QgdGhlIG1hc3RlciBkcml2ZXIgdGhhdCBpdCBrbm93cyB3aGF0IGl0IGRvZXMgLSBzbworCSAqIHdlIGFsbG93IGludmFsaWQgc3RhcnR4L3kgZm9yIG5vdyAuLi4gKi8KKwlwdHItPndpZHRoID0gY2FwLT53aWR0aDsKKwlwdHItPmhlaWdodCA9IGNhcC0+aGVpZ2h0OworCS8qIChSb25hbGQpIFRoaXMgaXMgdWdseS4gem9yYW5fZGV2aWNlLmMsIGxpbmUgMzg3CisJICogYWxyZWFkeSBtZW50aW9ucyB3aGF0IGhhcHBlbnMgaWYgSFN0YXJ0IGlzIGV2ZW4KKwkgKiAoYmx1ZSBmYWNlcywgZXRjLiwgY3IvY2IgaW52ZXJzZWQpLiBUaGVyZSdzIHByb2JhYmx5CisJICogc29tZSBnb29kIHJlYXNvbiB3aHkgSFN0YXJ0IGlzIDAgaW5zdGVhZCBvZiAxLCBzbyBJJ20KKwkgKiBsZWF2aW5nIGl0IHRvIHRoaXMgZm9yIG5vdywgYnV0IHJlYWxseS4uLiBUaGlzIGNhbiBiZQorCSAqIGRvbmUgYSBsb3Qgc2ltcGxlciAqLworCXB0ci0+eG9mZiA9IChub3JtLT5IU3RhcnQgPyBub3JtLT5IU3RhcnQgOiAxKSArIGNhcC0+eDsKKwkvKiBTb21ldGhpbmcgdG8gbm90ZSBoZXJlIChJIGRvbid0IHVuZGVyc3RhbmQgaXQpLCBzZXR0aW5nCisJICogVlN0YXJ0IHRvbyBoaWdoIHdpbGwgY2F1c2UgdGhlIGNvZGVjIHRvICdub3Qgd29yaycuIEkKKwkgKiByZWFsbHkgZG9uJ3QgZ2V0IGl0LiB2YWx1ZXMgb2YgMTYgKFZTdGFydCkgYWxyZWFkeSBicmVhaworCSAqIGl0IGhlcmUuIEp1c3QgJzAnIHNlZW1zIHRvIHdvcmsuIE1vcmUgdGVzdGluZyBuZWVkZWQhICovCisJcHRyLT55b2ZmID0gbm9ybS0+VlN0YXJ0ICsgY2FwLT55OworCS8qIChSb25hbGQpIGR6amVlaCwgY2FuJ3QgdGhpcyB0aGluZyBkbyBob3JfZGVjaW1hdGlvbiA9IDQ/ICovCisJcHRyLT54ZGVjID0gKChjYXAtPmRlY2ltYXRpb24gJiAweGZmKSA9PSAxKSA/IDAgOiAxOworCXB0ci0+eWRlYyA9ICgoKGNhcC0+ZGVjaW1hdGlvbiA+PiA4KSAmIDB4ZmYpID09IDEpID8gMCA6IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogYWRkaXRpb25hbCBjb250cm9sIGZ1bmN0aW9ucyAqLworc3RhdGljIGludAorenIzNjAxNl9jb250cm9sIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMsCisJCSBpbnQgICAgICAgICAgICAgICAgdHlwZSwKKwkJIGludCAgICAgICAgICAgICAgICBzaXplLAorCQkgdm9pZCAgICAgICAgICAgICAgKmRhdGEpCit7CisJc3RydWN0IHpyMzYwMTYgKnB0ciA9IChzdHJ1Y3QgenIzNjAxNiAqKSBjb2RlYy0+ZGF0YTsKKwlpbnQgKml2YWwgPSAoaW50ICopIGRhdGE7CisKKwlkcHJpbnRrKDIsICIlczogY29udHJvbCAlZCBjYWxsIHdpdGggJWQgYnl0ZVxuIiwgcHRyLT5uYW1lLCB0eXBlLAorCQlzaXplKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQ09ERUNfR19TVEFUVVM6CS8qIGdldCBsYXN0IHN0YXR1cyAtIHdlIGRvbid0IGtub3cgaXQgLi4uICovCisJCWlmIChzaXplICE9IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCSppdmFsID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIENPREVDX0dfQ09ERUNfTU9ERToKKwkJaWYgKHNpemUgIT0gc2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJKml2YWwgPSAwOworCQlicmVhazsKKworCWNhc2UgQ09ERUNfU19DT0RFQ19NT0RFOgorCQlpZiAoc2l6ZSAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKml2YWwgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKiBub3QgbmVlZGVkLCBkbyBub3RoaW5nICovCisJCXJldHVybiAwOworCisJY2FzZSBDT0RFQ19HX1ZGRToKKwljYXNlIENPREVDX1NfVkZFOgorCQlyZXR1cm4gMDsKKworCWNhc2UgQ09ERUNfU19NTUFQOgorCQkvKiBub3QgYXZhaWxhYmxlLCBnaXZlIGFuIGVycm9yICovCisJCXJldHVybiAtRU5YSU87CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRXhpdCBhbmQgdW5yZWdpc3RlciBmdW5jdGlvbjoKKworICAgRGVpbml0aWFsaXplcyBab3JhbidzIEpQRUcgcHJvY2Vzc29yCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBpbnQKK3pyMzYwMTZfdW5zZXQgKHN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgenIzNjAxNiAqcHRyID0gY29kZWMtPmRhdGE7CisKKwlpZiAocHRyKSB7CisJCS8qIGRvIHdlZSBuZWVkIHNvbWUgY29kZWMgZGVpbml0IGhlcmUsIHRvbyA/Pz8/ICovCisKKwkJZHByaW50aygxLCAiJXM6IGZpbmlzaGVkIGNvZGVjICMlZFxuIiwgcHRyLT5uYW1lLAorCQkJcHRyLT5udW0pOworCQlrZnJlZShwdHIpOworCQljb2RlYy0+ZGF0YSA9IE5VTEw7CisKKwkJenIzNjAxNl9jb2RlY3MtLTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFNldHVwIGFuZCByZWdpc3RyeSBmdW5jdGlvbjoKKworICAgSW5pdGlhbGl6ZXMgWm9yYW4ncyBKUEVHIHByb2Nlc3NvcgorCisgICBBbHNvIHNldHMgcGl4ZWwgc2l6ZSwgYXZlcmFnZSBjb2RlIHNpemUsIG1vZGUgKGNvbXByLi9kZWNvbXByLikKKyAgICh0aGUgZ2l2ZW4gc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBwcm9jZXNzb3Igd2l0aCB0aGUgdmlkZW8gaW50ZXJmYWNlKQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgaW50Cit6cjM2MDE2X3NldHVwIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHpyMzYwMTYgKnB0cjsKKwlpbnQgcmVzOworCisJZHByaW50aygyLCAienIzNjAxNjogaW5pdGlhbGl6aW5nIFZGRSBzdWJzeXN0ZW0gIyVkLlxuIiwKKwkJenIzNjAxNl9jb2RlY3MpOworCisJaWYgKHpyMzYwMTZfY29kZWNzID09IE1BWF9DT0RFQ1MpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIgInpyMzYwMTY6IENhbid0IGF0dGFjaCBtb3JlIGNvZGVjcyFcbiIpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJLy9tZW0gc3RydWN0dXJlIGluaXQKKwljb2RlYy0+ZGF0YSA9IHB0ciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB6cjM2MDE2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gcHRyKSB7CisJCWRwcmludGsoMSwgS0VSTl9FUlIgInpyMzYwMTY6IENhbid0IGdldCBlbm91Z2ggbWVtb3J5IVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocHRyLCAwLCBzaXplb2Yoc3RydWN0IHpyMzYwMTYpKTsKKworCXNucHJpbnRmKHB0ci0+bmFtZSwgc2l6ZW9mKHB0ci0+bmFtZSksICJ6cjM2MDE2WyVkXSIsCisJCSB6cjM2MDE2X2NvZGVjcyk7CisJcHRyLT5udW0gPSB6cjM2MDE2X2NvZGVjcysrOworCXB0ci0+Y29kZWMgPSBjb2RlYzsKKworCS8vdGVzdGluZworCXJlcyA9IHpyMzYwMTZfYmFzaWNfdGVzdChwdHIpOworCWlmIChyZXMgPCAwKSB7CisJCXpyMzYwMTZfdW5zZXQoY29kZWMpOworCQlyZXR1cm4gcmVzOworCX0KKwkvL2ZpbmFsIHNldHVwCisJcHRyLT5tb2RlID0gQ09ERUNfRE9fQ09NUFJFU1NJT047CisJcHRyLT53aWR0aCA9IDc2ODsKKwlwdHItPmhlaWdodCA9IDI4ODsKKwlwdHItPnhkZWMgPSAxOworCXB0ci0+eWRlYyA9IDA7CisJenIzNjAxNl9pbml0KHB0cik7CisKKwlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IGNvZGVjIHYlZCBhdHRhY2hlZCBhbmQgcnVubmluZ1xuIiwKKwkJcHRyLT5uYW1lLCBwdHItPnZlcnNpb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlkZW9jb2RlYyB6cjM2MDE2X2NvZGVjID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gInpyMzYwMTYiLAorCS5tYWdpYyA9IDBMLAkJLy8gbWFnaWMgbm90IHVzZWQKKwkuZmxhZ3MgPQorCSAgICBDT0RFQ19GTEFHX0hBUkRXQVJFIHwgQ09ERUNfRkxBR19WRkUgfCBDT0RFQ19GTEFHX0VOQ09ERVIgfAorCSAgICBDT0RFQ19GTEFHX0RFQ09ERVIsCisJLnR5cGUgPSBDT0RFQ19UWVBFX1pSMzYwMTYsCisJLnNldHVwID0genIzNjAxNl9zZXR1cCwJLy8gZnVuY3Rpb25hbGl0eQorCS51bnNldCA9IHpyMzYwMTZfdW5zZXQsCisJLnNldF9tb2RlID0genIzNjAxNl9zZXRfbW9kZSwKKwkuc2V0X3ZpZGVvID0genIzNjAxNl9zZXRfdmlkZW8sCisJLmNvbnRyb2wgPSB6cjM2MDE2X2NvbnRyb2wsCisJLy8gb3RoZXJzIGFyZSBub3QgdXNlZAorfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgSE9PSyBJTiBEUklWRVIgQVMgS0VSTkVMIE1PRFVMRQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgaW50IF9faW5pdAorenIzNjAxNl9pbml0X21vZHVsZSAodm9pZCkKK3sKKwkvL2RwcmludGsoMSwgIlpSMzYwMTYgZHJpdmVyICVzXG4iLFpSMDE2X1ZFUlNJT04pOworCXpyMzYwMTZfY29kZWNzID0gMDsKKwlyZXR1cm4gdmlkZW9jb2RlY19yZWdpc3RlcigmenIzNjAxNl9jb2RlYyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorenIzNjAxNl9jbGVhbnVwX21vZHVsZSAodm9pZCkKK3sKKwlpZiAoenIzNjAxNl9jb2RlY3MpIHsKKwkJZHByaW50aygxLAorCQkJInpyMzYwMTY6IHNvbWV0aGluZydzIHdyb25nIC0gJWQgY29kZWNzIGxlZnQgc29tZWhvdy5cbiIsCisJCQl6cjM2MDE2X2NvZGVjcyk7CisJfQorCXZpZGVvY29kZWNfdW5yZWdpc3RlcigmenIzNjAxNl9jb2RlYyk7Cit9CisKK21vZHVsZV9pbml0KHpyMzYwMTZfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoenIzNjAxNl9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIldvbGZnYW5nIFNjaGVyciA8c2NoZXJyQG5ldDR5b3UuYXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBtb2R1bGUgZm9yIFpSMzYwMTYgdmlkZW8gZnJvbnRlbmRzICIKKwkJICAgWlIwMTZfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwMTYuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjAxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzkyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwMTYuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIFpvcmFuIFpSMzYwMTYgYmFzaWMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgLSBoZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXb2xmZ2FuZyBTY2hlcnIgPHNjaGVyckBuZXQ0eW91LmF0PgorICoKKyAqICRJZDogenIzNjAxNi5oLHYgMS4xLjIuMyAyMDAzLzAxLzE0IDIxOjE4OjA3IHJidWx0amUgRXhwICQKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIFpSMzYwMTZfSAorI2RlZmluZSBaUjM2MDE2X0gKKworLyogZGF0YSBzdG9yZWQgZm9yIGVhY2ggem9yYW4ganBlZyBjb2RlYyBjaGlwICovCitzdHJ1Y3QgenIzNjAxNiB7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgbnVtOworCS8qIGlvIGRhdGFzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWM7CisJLy8gY29kZXIgc3RhdHVzCisJX191OCB2ZXJzaW9uOworCS8vIGFjdHVhbCBjb2RlciBzZXR1cAorCWludCBtb2RlOworCisJX191MTYgeG9mZjsKKwlfX3UxNiB5b2ZmOworCV9fdTE2IHdpZHRoOworCV9fdTE2IGhlaWdodDsKKwlfX3UxNiB4ZGVjOworCV9fdTE2IHlkZWM7Cit9OworCisvKiBkaXJlY3QgIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBaUjAxNl9HT1NUT1AgICAgICAweDAwCisjZGVmaW5lIFpSMDE2X01PREUgICAgICAgIDB4MDEKKyNkZWZpbmUgWlIwMTZfSUFERFIgICAgICAgMHgwMgorI2RlZmluZSBaUjAxNl9JREFUQSAgICAgICAweDAzCisKKy8qIGluZGlyZWN0ICByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgWlIwMTZJX1NFVFVQMSAgICAgMHgwMAorI2RlZmluZSBaUjAxNklfU0VUVVAyICAgICAweDAxCisjZGVmaW5lIFpSMDE2SV9OQVhfTE8gICAgIDB4MDIKKyNkZWZpbmUgWlIwMTZJX05BWF9ISSAgICAgMHgwMworI2RlZmluZSBaUjAxNklfUEFYX0xPICAgICAweDA0CisjZGVmaW5lIFpSMDE2SV9QQVhfSEkgICAgIDB4MDUKKyNkZWZpbmUgWlIwMTZJX05BWV9MTyAgICAgMHgwNgorI2RlZmluZSBaUjAxNklfTkFZX0hJICAgICAweDA3CisjZGVmaW5lIFpSMDE2SV9QQVlfTE8gICAgIDB4MDgKKyNkZWZpbmUgWlIwMTZJX1BBWV9ISSAgICAgMHgwOQorI2RlZmluZSBaUjAxNklfTk9MX0xPICAgICAweDBhCisjZGVmaW5lIFpSMDE2SV9OT0xfSEkgICAgIDB4MGIKKworLyogcG9zc2libGUgdmFsdWVzIGZvciBtb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIFpSMDE2X1JHQjQ0NF9ZVVY0NDQgIDB4MDAKKyNkZWZpbmUgWlIwMTZfUkdCNDQ0X1lVVjQyMiAgMHgwMQorI2RlZmluZSBaUjAxNl9SR0I0NDRfWVVWNDExICAweDAyCisjZGVmaW5lIFpSMDE2X1JHQjQ0NF9ZNDAwICAgIDB4MDMKKyNkZWZpbmUgWlIwMTZfUkdCNDQ0X1JHQjQ0NCAgMHgwNAorI2RlZmluZSBaUjAxNl9ZVVY0NDRfWVVWNDQ0ICAweDA4CisjZGVmaW5lIFpSMDE2X1lVVjQ0NF9ZVVY0MjIgIDB4MDkKKyNkZWZpbmUgWlIwMTZfWVVWNDQ0X1lVVjQxMSAgMHgwYQorI2RlZmluZSBaUjAxNl9ZVVY0NDRfWTQwMCAgICAweDBiCisjZGVmaW5lIFpSMDE2X1lVVjQ0NF9SR0I0NDQgIDB4MGMKKyNkZWZpbmUgWlIwMTZfWVVWNDIyX1lVVjQyMiAgMHgxMQorI2RlZmluZSBaUjAxNl9ZVVY0MjJfWVVWNDExICAweDEyCisjZGVmaW5lIFpSMDE2X1lVVjQyMl9ZNDAwICAgIDB4MTMKKyNkZWZpbmUgWlIwMTZfWVVWNDExX1lVVjQxMSAgMHgxNgorI2RlZmluZSBaUjAxNl9ZVVY0MTFfWTQwMCAgICAweDE3CisjZGVmaW5lIFpSMDE2XzQ0NDRfNDQ0NCAgICAgIDB4MTkKKyNkZWZpbmUgWlIwMTZfMTAwXzEwMCAgICAgICAgMHgxYgorCisjZGVmaW5lIFpSMDE2X1JHQjQ0NCAgICAgICAgIDB4MDAKKyNkZWZpbmUgWlIwMTZfWVVWNDQ0ICAgICAgICAgMHgyMAorI2RlZmluZSBaUjAxNl9ZVVY0MjIgICAgICAgICAweDQwCisKKyNkZWZpbmUgWlIwMTZfQ09NUFJFU1NJT04gICAgMHg4MAorI2RlZmluZSBaUjAxNl9FWFBBTlNJT04gICAgICAweDgwCisKKy8qIHBvc3NpYmxlIHZhbHVlcyBmb3Igc2V0dXAgMSByZWdpc3RlciAqLworI2RlZmluZSBaUjAxNl9DS1JUICAgICAgICAgICAweDgwCisjZGVmaW5lIFpSMDE2X1ZFUlQgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgWlIwMTZfSE9SWiAgICAgICAgICAgMHgyMAorI2RlZmluZSBaUjAxNl9IUkZMICAgICAgICAgICAweDEwCisjZGVmaW5lIFpSMDE2X0RTRkwgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgWlIwMTZfU0JGTCAgICAgICAgICAgMHgwNAorI2RlZmluZSBaUjAxNl9SU1RSICAgICAgICAgICAweDAyCisjZGVmaW5lIFpSMDE2X0NOVEkgICAgICAgICAgIDB4MDEKKworLyogcG9zc2libGUgdmFsdWVzIGZvciBzZXR1cCAyIHJlZ2lzdGVyICovCisjZGVmaW5lIFpSMDE2X1NZRU4gICAgICAgICAgIDB4NDAKKyNkZWZpbmUgWlIwMTZfQ0NJUiAgICAgICAgICAgMHgwNAorI2RlZmluZSBaUjAxNl9TSUdOICAgICAgICAgICAweDAyCisjZGVmaW5lIFpSMDE2X1lNQ1MgICAgICAgICAgIDB4MDEKKworI2VuZGlmCQkJCS8qZm5kZWYgWlIzNjAxNl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjFlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNTAuYwpAQCAtMCwwICsxLDkwNyBAQAorLyoKKyAqIFpvcmFuIFpSMzYwNTAgYmFzaWMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgV29sZmdhbmcgU2NoZXJyIDxzY2hlcnJAbmV0NHlvdS5hdD4KKyAqCisgKiAkSWQ6IHpyMzYwNTAuYyx2IDEuMS4yLjExIDIwMDMvMDgvMDMgMTQ6NTQ6NTMgcmJ1bHRqZSBFeHAgJAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgWlIwNTBfVkVSU0lPTiAidjAuNy4xIgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisvKiBpbmNsdWRlcyBmb3Igc3RydWN0dXJlcyBhbmQgZGVmaW5lcyByZWdhcmRpbmcgdmlkZW8gCisgICAjaW5jbHVkZTxsaW51eC92aWRlb2Rldi5oPiAqLworCisvKiBJL08gY29tbWFuZHMsIGVycm9yIGNvZGVzICovCisjaW5jbHVkZTxhc20vaW8uaD4KKy8vI2luY2x1ZGU8ZXJybm8uaD4KKworLyogaGVhZGVyZmlsZSBvZiB0aGlzIG1vZHVsZSAqLworI2luY2x1ZGUienIzNjA1MC5oIgorCisvKiBjb2RlYyBpbyBBUEkgKi8KKyNpbmNsdWRlInZpZGVvY29kZWMuaCIKKworLyogaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGhhdmUgbW9yZSB0aGFuIDIwIG9yIHNvLAorICBqdXN0IHRvIHByZXZlbnQgc29tZSB1bndhbnRlZCBsb29wcyAqLworI2RlZmluZSBNQVhfQ09ERUNTIDIwCisKKy8qIGFtb3VudCBvZiBjaGlwcyBhdHRhY2hlZCB2aWEgdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgenIzNjA1MF9jb2RlY3MgPSAwOworCisvKiBkZWJ1Z2dpbmcgaXMgYXZhaWxhYmxlIHZpYSBtb2R1bGUgcGFyYW1ldGVyICovCisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTQpIik7CisKKyNkZWZpbmUgZHByaW50ayhudW0sIGZvcm1hdCwgYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoZGVidWcgPj0gbnVtKSBcCisJCQlwcmludGsoZm9ybWF0LCAjI2FyZ3MpOyBcCisJfSB3aGlsZSAoMCkKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgTG9jYWwgaGFyZHdhcmUgSS9PIGZ1bmN0aW9uczoKKworICAgcmVhZC93cml0ZSB2aWEgY29kZWMgbGF5ZXIgKHJlZ2lzdGVycyBhcmUgbG9jYXRlZCBpbiB0aGUgbWFzdGVyIGRldmljZSkKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogcmVhZCBhbmQgd3JpdGUgZnVuY3Rpb25zICovCitzdGF0aWMgdTgKK3pyMzYwNTBfcmVhZCAoc3RydWN0IHpyMzYwNTAgKnB0ciwKKwkgICAgICB1MTYgICAgICAgICAgICAgcmVnKQoreworCXU4IHZhbHVlID0gMDsKKworCS8vIGp1c3QgaW4gY2FzZSBzb21ldGhpbmcgaXMgd3JvbmcuLi4KKwlpZiAocHRyLT5jb2RlYy0+bWFzdGVyX2RhdGEtPnJlYWRyZWcpCisJCXZhbHVlID0gKHB0ci0+Y29kZWMtPm1hc3Rlcl9kYXRhLT5yZWFkcmVnKHB0ci0+Y29kZWMsCisJCQkJCQkJICByZWcpKSAmIDB4RkY7CisJZWxzZQorCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUiAiJXM6IGludmFsaWQgSS9PIHNldHVwLCBub3RoaW5nIHJlYWQhXG4iLAorCQkJcHRyLT5uYW1lKTsKKworCWRwcmludGsoNCwgIiVzOiByZWFkaW5nIGZyb20gMHglMDR4OiAlMDJ4XG4iLCBwdHItPm5hbWUsIHJlZywKKwkJdmFsdWUpOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorenIzNjA1MF93cml0ZSAoc3RydWN0IHpyMzYwNTAgKnB0ciwKKwkgICAgICAgdTE2ICAgICAgICAgICAgIHJlZywKKwkgICAgICAgdTggICAgICAgICAgICAgIHZhbHVlKQoreworCWRwcmludGsoNCwgIiVzOiB3cml0aW5nIDB4JTAyeCB0byAweCUwNHhcbiIsIHB0ci0+bmFtZSwgdmFsdWUsCisJCXJlZyk7CisKKwkvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGlzIHdyb25nLi4uCisJaWYgKHB0ci0+Y29kZWMtPm1hc3Rlcl9kYXRhLT53cml0ZXJlZykKKwkJcHRyLT5jb2RlYy0+bWFzdGVyX2RhdGEtPndyaXRlcmVnKHB0ci0+Y29kZWMsIHJlZywgdmFsdWUpOworCWVsc2UKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogaW52YWxpZCBJL08gc2V0dXAsIG5vdGhpbmcgd3JpdHRlbiFcbiIsCisJCQlwdHItPm5hbWUpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBMb2NhbCBoZWxwZXIgZnVuY3Rpb246CisKKyAgIHN0YXR1cyByZWFkCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIHN0YXR1cyBpcyBrZXB0IGluIGRhdGFzdHJ1Y3R1cmUgKi8KK3N0YXRpYyB1OAorenIzNjA1MF9yZWFkX3N0YXR1czEgKHN0cnVjdCB6cjM2MDUwICpwdHIpCit7CisJcHRyLT5zdGF0dXMxID0genIzNjA1MF9yZWFkKHB0ciwgWlIwNTBfU1RBVFVTXzEpOworCisJenIzNjA1MF9yZWFkKHB0ciwgMCk7CisJcmV0dXJuIHB0ci0+c3RhdHVzMTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgTG9jYWwgaGVscGVyIGZ1bmN0aW9uOgorCisgICBzY2FsZSBmYWN0b3IgcmVhZAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBzY2FsZSBmYWN0b3IgaXMga2VwdCBpbiBkYXRhc3RydWN0dXJlICovCitzdGF0aWMgdTE2Cit6cjM2MDUwX3JlYWRfc2NhbGVmYWN0b3IgKHN0cnVjdCB6cjM2MDUwICpwdHIpCit7CisJcHRyLT5zY2FsZWZhY3QgPSAoenIzNjA1MF9yZWFkKHB0ciwgWlIwNTBfU0ZfSEkpIDw8IDgpIHwKKwkJCSAoenIzNjA1MF9yZWFkKHB0ciwgWlIwNTBfU0ZfTE8pICYgMHhGRik7CisKKwkvKiBsZWF2ZSAwIHNlbGVjdGVkIGZvciBhbiBldmVudHVhbGx5IEdPIGZyb20gbWFzdGVyICovCisJenIzNjA1MF9yZWFkKHB0ciwgMCk7CisJcmV0dXJuIHB0ci0+c2NhbGVmYWN0OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBMb2NhbCBoZWxwZXIgZnVuY3Rpb246CisKKyAgIHdhaXQgaWYgY29kZWMgaXMgcmVhZHkgdG8gcHJvY2VlZCAoZW5kIG9mIHByb2Nlc3NpbmcpIG9yIHRpbWUgaXMgb3ZlcgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgdm9pZAorenIzNjA1MF93YWl0X2VuZCAoc3RydWN0IHpyMzYwNTAgKnB0cikKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoISh6cjM2MDUwX3JlYWRfc3RhdHVzMShwdHIpICYgMHg0KSkgeworCQl1ZGVsYXkoMSk7CisJCWlmIChpKysgPiAyMDAwMDApIHsJLy8gMjAwbXMsIHRoZXJlIGlzIGZvciBzaHVyZSBzb21ldGhpbmcgd3JvbmchISEKKwkJCWRwcmludGsoMSwKKwkJCQkiJXM6IHRpbW91dCBhdCB3YWl0X2VuZCAobGFzdCBzdGF0dXM6IDB4JTAyeClcbiIsCisJCQkJcHRyLT5uYW1lLCBwdHItPnN0YXR1czEpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIExvY2FsIGhlbHBlciBmdW5jdGlvbjoKKworICAgYmFzaWMgdGVzdCBvZiAiY29ubmVjdGl2aXR5Iiwgd3JpdGVzL3JlYWRzIHRvL2Zyb20gbWVtb3J5IHRoZSBTT0YgbWFya2VyIAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgaW50Cit6cjM2MDUwX2Jhc2ljX3Rlc3QgKHN0cnVjdCB6cjM2MDUwICpwdHIpCit7CisJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX1NPRl9JRFgsIDB4MDApOworCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9TT0ZfSURYICsgMSwgMHgwMCk7CisJaWYgKCh6cjM2MDUwX3JlYWQocHRyLCBaUjA1MF9TT0ZfSURYKSB8CisJICAgICB6cjM2MDUwX3JlYWQocHRyLCBaUjA1MF9TT0ZfSURYICsgMSkpICE9IDB4MDAwMCkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBhdHRhY2ggZmFpbGVkLCBjYW4ndCBjb25uZWN0IHRvIGpwZWcgcHJvY2Vzc29yIVxuIiwKKwkJCXB0ci0+bmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9TT0ZfSURYLCAweGZmKTsKKwl6cjM2MDUwX3dyaXRlKHB0ciwgWlIwNTBfU09GX0lEWCArIDEsIDB4YzApOworCWlmICgoKHpyMzYwNTBfcmVhZChwdHIsIFpSMDUwX1NPRl9JRFgpIDw8IDgpIHwKKwkgICAgIHpyMzYwNTBfcmVhZChwdHIsIFpSMDUwX1NPRl9JRFggKyAxKSkgIT0gMHhmZmMwKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IGF0dGFjaCBmYWlsZWQsIGNhbid0IGNvbm5lY3QgdG8ganBlZyBwcm9jZXNzb3IhXG4iLAorCQkJcHRyLT5uYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwl6cjM2MDUwX3dhaXRfZW5kKHB0cik7CisJaWYgKChwdHItPnN0YXR1czEgJiAweDQpID09IDApIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogYXR0YWNoIGZhaWxlZCwganBlZyBwcm9jZXNzb3IgZmFpbGVkIChlbmQgZmxhZykhXG4iLAorCQkJcHRyLT5uYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsJCS8qIGxvb2tzIGdvb2QhICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIExvY2FsIGhlbHBlciBmdW5jdGlvbjoKKworICAgc2ltcGxlIGxvb3AgZm9yIHB1c2hpbmcgdGhlIGluaXQgZGF0YXNldHMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGludAorenIzNjA1MF9wdXNoaXQgKHN0cnVjdCB6cjM2MDUwICpwdHIsCisJICAgICAgICB1MTYgICAgICAgICAgICAgc3RhcnRyZWcsCisJICAgICAgICB1MTYgICAgICAgICAgICAgbGVuLAorCSAgICAgICAgY29uc3QgY2hhciAgICAgKmRhdGEpCit7CisJaW50IGkgPSAwOworCisJZHByaW50ayg0LCAiJXM6IHdyaXRlIGRhdGEgYmxvY2sgdG8gMHglMDR4IChsZW49JWQpXG4iLCBwdHItPm5hbWUsCisJCXN0YXJ0cmVnLCBsZW4pOworCXdoaWxlIChpIDwgbGVuKSB7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBzdGFydHJlZysrLCBkYXRhW2krK10pOworCX0KKworCXJldHVybiBpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBCYXNpYyBkYXRhc2V0czoKKworICAganBlZyBiYXNlbGluZSBzZXR1cCBkYXRhICh5b3UgZmluZCBpdCBvbiBsb3RzIHBsYWNlcyBpbiBpbnRlcm5ldCwgb3IganVzdAorICAgZXh0cmFjdCBpdCBmcm9tIGFueSByZWd1bGFyIC5qcGcgaW1hZ2UuLi4pCisKKyAgIENvdWxkIGJlIHZhcmlhYmxlLCBidXQgdW50aWwgaXQncyBub3QgbmVlZGVkIGl0IHRoZXkgYXJlIGp1c3QgZml4ZWQgdG8gc2F2ZQorICAgbWVtb3J5LiBPdGhlcndpc2UgZXhwYW5kIHpyMzYwNTAgc3RydWN0dXJlIHdpdGggYXJyYXlzLCBwdXNoIHRoZSB2YWx1ZXMgdG8KKyAgIGl0IGFuZCBpbml0YWxpemUgZnJvbSB0aGVyZSwgYXMgZS5nLiB0aGUgbGludXggenIzNjA1Ny82MCBkcml2ZXIgZG9lcyBpdC4KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgenIzNjA1MF9kcXRbMHg4Nl0gPSB7CisJMHhmZiwgMHhkYiwJCS8vTWFya2VyOiBEUVQKKwkweDAwLCAweDg0LAkJLy9MZW5ndGg6IDIqNjUrMgorCTB4MDAsCQkJLy9QcSxUcSBmaXJzdCB0YWJsZQorCTB4MTAsIDB4MGIsIDB4MGMsIDB4MGUsIDB4MGMsIDB4MGEsIDB4MTAsIDB4MGUsCisJMHgwZCwgMHgwZSwgMHgxMiwgMHgxMSwgMHgxMCwgMHgxMywgMHgxOCwgMHgyOCwKKwkweDFhLCAweDE4LCAweDE2LCAweDE2LCAweDE4LCAweDMxLCAweDIzLCAweDI1LAorCTB4MWQsIDB4MjgsIDB4M2EsIDB4MzMsIDB4M2QsIDB4M2MsIDB4MzksIDB4MzMsCisJMHgzOCwgMHgzNywgMHg0MCwgMHg0OCwgMHg1YywgMHg0ZSwgMHg0MCwgMHg0NCwKKwkweDU3LCAweDQ1LCAweDM3LCAweDM4LCAweDUwLCAweDZkLCAweDUxLCAweDU3LAorCTB4NWYsIDB4NjIsIDB4NjcsIDB4NjgsIDB4NjcsIDB4M2UsIDB4NGQsIDB4NzEsCisJMHg3OSwgMHg3MCwgMHg2NCwgMHg3OCwgMHg1YywgMHg2NSwgMHg2NywgMHg2MywKKwkweDAxLAkJCS8vUHEsVHEgc2Vjb25kIHRhYmxlCisJMHgxMSwgMHgxMiwgMHgxMiwgMHgxOCwgMHgxNSwgMHgxOCwgMHgyZiwgMHgxYSwKKwkweDFhLCAweDJmLCAweDYzLCAweDQyLCAweDM4LCAweDQyLCAweDYzLCAweDYzLAorCTB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywKKwkweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCTB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywKKwkweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzCit9OworCitzdGF0aWMgY29uc3QgY2hhciB6cjM2MDUwX2RodFsweDFhNF0gPSB7CisJMHhmZiwgMHhjNCwJCS8vTWFya2VyOiBESFQKKwkweDAxLCAweGEyLAkJLy9MZW5ndGg6IDIqQUMsIDIqREMKKwkweDAwLAkJCS8vREMgZmlyc3QgdGFibGUKKwkweDAwLCAweDAxLCAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorCTB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCisJMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwKKwkweDAxLAkJCS8vREMgc2Vjb25kIHRhYmxlCisJMHgwMCwgMHgwMywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAorCTB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsCisJMHgxMCwJCQkvL0FDIGZpcnN0IHRhYmxlCisJMHgwMCwgMHgwMiwgMHgwMSwgMHgwMywgMHgwMywgMHgwMiwgMHgwNCwgMHgwMywKKwkweDA1LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAwLAorCTB4MDEsIDB4N0QsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MTEsCisJMHgwNSwgMHgxMiwgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwKKwkweDA3LCAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLCAweDkxLCAweEExLAorCTB4MDgsIDB4MjMsIDB4NDIsIDB4QjEsIDB4QzEsIDB4MTUsIDB4NTIsIDB4RDEsIDB4RjAsIDB4MjQsCisJMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwQSwgMHgxNiwgMHgxNywKKwkweDE4LCAweDE5LCAweDFBLCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDM0LAorCTB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4NDMsIDB4NDQsCisJMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0QSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwKKwkweDU3LCAweDU4LCAweDU5LCAweDVBLCAweDYzLCAweDY0LCAweDY1LCAweDY2LAorCTB4NjcsIDB4NjgsIDB4NjksIDB4NkEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCisJMHg3OSwgMHg3QSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwKKwkweDg5LCAweDhBLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LAorCTB4OUEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsIDB4QTYsIDB4QTcsIDB4QTgsCisJMHhBOSwgMHhBQSwgMHhCMiwgMHhCMywgMHhCNCwgMHhCNSwgMHhCNiwgMHhCNywgMHhCOCwgMHhCOSwKKwkweEJBLCAweEMyLCAweEMzLCAweEM0LCAweEM1LCAweEM2LCAweEM3LCAweEM4LAorCTB4QzksIDB4Q0EsIDB4RDIsIDB4RDMsIDB4RDQsIDB4RDUsIDB4RDYsIDB4RDcsIDB4RDgsIDB4RDksCisJMHhEQSwgMHhFMSwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNSwgMHhFNiwgMHhFNywKKwkweEU4LCAweEU5LCAweEVBLCAweEYxLCAweEYyLCAweEYzLCAweEY0LCAweEY1LCAweEY2LCAweEY3LAorCTB4RjgsIDB4RjksIDB4RkEsCisJMHgxMSwJCQkvL0FDIHNlY29uZCB0YWJsZQorCTB4MDAsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDQsIDB4MDMsIDB4MDQsCisJMHgwNywgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMSwKKwkweDAyLCAweDc3LCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LAorCTB4MDUsIDB4MjEsIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCisJMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwgMHg0MiwgMHg5MSwKKwkweEExLCAweEIxLCAweEMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweEYwLCAweDE1LCAweDYyLAorCTB4NzIsIDB4RDEsIDB4MEEsIDB4MTYsIDB4MjQsIDB4MzQsIDB4RTEsIDB4MjUsCisJMHhGMSwgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwKKwkweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLCAweDQzLCAweDQ0LAorCTB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NEEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsCisJMHg1NywgMHg1OCwgMHg1OSwgMHg1QSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwKKwkweDY3LCAweDY4LCAweDY5LCAweDZBLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAorCTB4NzksIDB4N0EsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisJMHg4OCwgMHg4OSwgMHg4QSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwKKwkweDk5LCAweDlBLCAweEEyLCAweEEzLCAweEE0LCAweEE1LCAweEE2LCAweEE3LAorCTB4QTgsIDB4QTksIDB4QUEsIDB4QjIsIDB4QjMsIDB4QjQsIDB4QjUsIDB4QjYsIDB4QjcsIDB4QjgsCisJMHhCOSwgMHhCQSwgMHhDMiwgMHhDMywgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNywKKwkweEM4LCAweEM5LCAweENBLCAweEQyLCAweEQzLCAweEQ0LCAweEQ1LCAweEQ2LCAweEQ3LCAweEQ4LAorCTB4RDksIDB4REEsIDB4RTIsIDB4RTMsIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsCisJMHhFOCwgMHhFOSwgMHhFQSwgMHhGMiwgMHhGMywgMHhGNCwgMHhGNSwgMHhGNiwgMHhGNywgMHhGOCwKKwkweEY5LCAweEZBCit9OworCisvKiBqcGVnIGJhc2VsaW5lIHNldHVwLCB0aGlzIGlzIGp1c3QgZml4ZWQgaW4gdGhpcyBkcml2ZXIgKFlVViBwaWN0dXJlcykgKi8KKyNkZWZpbmUgTk9fT0ZfQ09NUE9ORU5UUyAgICAgICAgICAweDMJLy9ZLFUsVgorI2RlZmluZSBCQVNFTElORV9QUkVDSVNJT04gICAgICAgIDB4OAkvL01DVSBzaXplICg/KQorc3RhdGljIGNvbnN0IGNoYXIgenIzNjA1MF90cVs4XSA9IHsgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCB9OwkvL3RhYmxlIGlkeCdzIFFUCitzdGF0aWMgY29uc3QgY2hhciB6cjM2MDUwX3RkWzhdID0geyAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07CS8vdGFibGUgaWR4J3MgREMKK3N0YXRpYyBjb25zdCBjaGFyIHpyMzYwNTBfdGFbOF0gPSB7IDAsIDEsIDEsIDAsIDAsIDAsIDAsIDAgfTsJLy90YWJsZSBpZHgncyBBQworCisvKiBob3Jpem9udGFsIDQyMiBkZWNpbWF0aW9uIHNldHVwIChtYXliZSB3ZSBzdXBwb3J0IDQxMSBvciBzbyBsYXRlciwgdG9vKSAqLworc3RhdGljIGNvbnN0IGNoYXIgenIzNjA1MF9kZWNpbWF0aW9uX2hbOF0gPSB7IDIsIDEsIDEsIDAsIDAsIDAsIDAsIDAgfTsKK3N0YXRpYyBjb25zdCBjaGFyIHpyMzYwNTBfZGVjaW1hdGlvbl92WzhdID0geyAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIExvY2FsIGhlbHBlciBmdW5jdGlvbnM6CisKKyAgIGNhbGN1bGF0aW9uIGFuZCBzZXR1cCBvZiBwYXJhbWV0ZXItZGVwZW5kZW50IEpQRUcgYmFzZWxpbmUgc2VnbWVudHMKKyAgIChuZWVkZWQgZm9yIGNvbXByZXNzaW9uIG9ubHkpCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogU09GIChzdGFydCBvZiBmcmFtZSkgc2VnbWVudCBkZXBlbmRzIG9uIHdpZHRoLCBoZWlnaHQgYW5kIHNhbXBsaW5nIHJhdGlvCisgICAgICAgICAgICAgICAgICAgICAgICAgb2YgZWFjaCBjb2xvciBjb21wb25lbnQgKi8KKworc3RhdGljIGludAorenIzNjA1MF9zZXRfc29mIChzdHJ1Y3QgenIzNjA1MCAqcHRyKQoreworCWNoYXIgc29mX2RhdGFbMzRdOwkvLyBtYXguIHNpemUgb2YgcmVnaXN0ZXIgc2V0CisJaW50IGk7CisKKwlkcHJpbnRrKDMsICIlczogd3JpdGUgU09GICglZHglZCwgJWQgY29tcG9uZW50cylcbiIsIHB0ci0+bmFtZSwKKwkJcHRyLT53aWR0aCwgcHRyLT5oZWlnaHQsIE5PX09GX0NPTVBPTkVOVFMpOworCXNvZl9kYXRhWzBdID0gMHhmZjsKKwlzb2ZfZGF0YVsxXSA9IDB4YzA7CisJc29mX2RhdGFbMl0gPSAweDAwOworCXNvZl9kYXRhWzNdID0gKDMgKiBOT19PRl9DT01QT05FTlRTKSArIDg7CisJc29mX2RhdGFbNF0gPSBCQVNFTElORV9QUkVDSVNJT047CS8vIG9ubHkgJzgnIHBvc3NpYmxlIHdpdGggenIzNjA1MAorCXNvZl9kYXRhWzVdID0gKHB0ci0+aGVpZ2h0KSA+PiA4OworCXNvZl9kYXRhWzZdID0gKHB0ci0+aGVpZ2h0KSAmIDB4ZmY7CisJc29mX2RhdGFbN10gPSAocHRyLT53aWR0aCkgPj4gODsKKwlzb2ZfZGF0YVs4XSA9IChwdHItPndpZHRoKSAmIDB4ZmY7CisJc29mX2RhdGFbOV0gPSBOT19PRl9DT01QT05FTlRTOworCWZvciAoaSA9IDA7IGkgPCBOT19PRl9DT01QT05FTlRTOyBpKyspIHsKKwkJc29mX2RhdGFbMTAgKyAoaSAqIDMpXSA9IGk7CS8vIGluZGV4IGlkZW50aWZpZXIKKwkJc29mX2RhdGFbMTEgKyAoaSAqIDMpXSA9IChwdHItPmhfc2FtcF9yYXRpb1tpXSA8PCA0KSB8IChwdHItPnZfc2FtcF9yYXRpb1tpXSk7CS8vIHNhbXBsaW5nIHJhdGlvcworCQlzb2ZfZGF0YVsxMiArIChpICogMyldID0genIzNjA1MF90cVtpXTsJLy8gUSB0YWJsZSBzZWxlY3Rpb24KKwl9CisJcmV0dXJuIHpyMzYwNTBfcHVzaGl0KHB0ciwgWlIwNTBfU09GX0lEWCwKKwkJCSAgICAgICgzICogTk9fT0ZfQ09NUE9ORU5UUykgKyAxMCwgc29mX2RhdGEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFNPUyAoc3RhcnQgb2Ygc2Nhbikgc2VnbWVudCBkZXBlbmRzIG9uIHRoZSB1c2VkIHNjYW4gY29tcG9uZW50cyAKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mIGVhY2ggY29sb3IgY29tcG9uZW50ICovCisKK3N0YXRpYyBpbnQKK3pyMzYwNTBfc2V0X3NvcyAoc3RydWN0IHpyMzYwNTAgKnB0cikKK3sKKwljaGFyIHNvc19kYXRhWzE2XTsJLy8gbWF4LiBzaXplIG9mIHJlZ2lzdGVyIHNldAorCWludCBpOworCisJZHByaW50aygzLCAiJXM6IHdyaXRlIFNPU1xuIiwgcHRyLT5uYW1lKTsKKwlzb3NfZGF0YVswXSA9IDB4ZmY7CisJc29zX2RhdGFbMV0gPSAweGRhOworCXNvc19kYXRhWzJdID0gMHgwMDsKKwlzb3NfZGF0YVszXSA9IDIgKyAxICsgKDIgKiBOT19PRl9DT01QT05FTlRTKSArIDM7CisJc29zX2RhdGFbNF0gPSBOT19PRl9DT01QT05FTlRTOworCWZvciAoaSA9IDA7IGkgPCBOT19PRl9DT01QT05FTlRTOyBpKyspIHsKKwkJc29zX2RhdGFbNSArIChpICogMildID0gaTsJLy8gaW5kZXgKKwkJc29zX2RhdGFbNiArIChpICogMildID0gKHpyMzYwNTBfdGRbaV0gPDwgNCkgfCB6cjM2MDUwX3RhW2ldOwkvLyBBQy9EQyB0Ymwuc2VsLgorCX0KKwlzb3NfZGF0YVsyICsgMSArICgyICogTk9fT0ZfQ09NUE9ORU5UUykgKyAyXSA9IDAwOwkvLyBzY2FuIHN0YXJ0CisJc29zX2RhdGFbMiArIDEgKyAoMiAqIE5PX09GX0NPTVBPTkVOVFMpICsgM10gPSAweDNGOworCXNvc19kYXRhWzIgKyAxICsgKDIgKiBOT19PRl9DT01QT05FTlRTKSArIDRdID0gMDA7CisJcmV0dXJuIHpyMzYwNTBfcHVzaGl0KHB0ciwgWlIwNTBfU09TMV9JRFgsCisJCQkgICAgICA0ICsgMSArICgyICogTk9fT0ZfQ09NUE9ORU5UUykgKyAzLAorCQkJICAgICAgc29zX2RhdGEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIERSSSAoZGVmaW5lIHJlc3RhcnQgaW50ZXJ2YWwpICovCisKK3N0YXRpYyBpbnQKK3pyMzYwNTBfc2V0X2RyaSAoc3RydWN0IHpyMzYwNTAgKnB0cikKK3sKKwljaGFyIGRyaV9kYXRhWzZdOwkvLyBtYXguIHNpemUgb2YgcmVnaXN0ZXIgc2V0CisKKwlkcHJpbnRrKDMsICIlczogd3JpdGUgRFJJXG4iLCBwdHItPm5hbWUpOworCWRyaV9kYXRhWzBdID0gMHhmZjsKKwlkcmlfZGF0YVsxXSA9IDB4ZGQ7CisJZHJpX2RhdGFbMl0gPSAweDAwOworCWRyaV9kYXRhWzNdID0gMHgwNDsKKwlkcmlfZGF0YVs0XSA9IHB0ci0+ZHJpID4+IDg7CisJZHJpX2RhdGFbNV0gPSBwdHItPmRyaSAmIDB4ZmY7CisJcmV0dXJuIHpyMzYwNTBfcHVzaGl0KHB0ciwgWlIwNTBfRFJJX0lEWCwgNiwgZHJpX2RhdGEpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBTZXR1cCBmdW5jdGlvbjoKKworICAgU2V0dXAgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBvZiBab3JhbidzIEpQRUcgcHJvY2Vzc29yCisgICAoIHNlZSBhbHNvIHpvcmFuIDM2MDUwIG1hbnVhbCApCisKKyAgIC4uLiBzb3JyeSBmb3IgdGhlIHNwYWdoZXR0aSBjb2RlIC4uLgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIHZvaWQKK3pyMzYwNTBfaW5pdCAoc3RydWN0IHpyMzYwNTAgKnB0cikKK3sKKwlpbnQgc3VtID0gMDsKKwlsb25nIGJpdGNudCwgdG1wOworCisJaWYgKHB0ci0+bW9kZSA9PSBDT0RFQ19ET19DT01QUkVTU0lPTikgeworCQlkcHJpbnRrKDIsICIlczogQ09NUFJFU1NJT04gU0VUVVBcbiIsIHB0ci0+bmFtZSk7CisKKwkJLyogMDUwIGNvbW11bmljYXRlcyB3aXRoIDA1NyBpbiBtYXN0ZXIgbW9kZSAqLworCQl6cjM2MDUwX3dyaXRlKHB0ciwgWlIwNTBfSEFSRFdBUkUsIFpSMDUwX0hXX01TVFIpOworCisJCS8qIGVuY29kaW5nIHRhYmxlIHByZWxvYWQgZm9yIGNvbXByZXNzaW9uICovCisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9NT0RFLAorCQkJICAgICAgWlIwNTBfTU9fQ09NUCB8IFpSMDUwX01PX1RMTSk7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9PUFRJT05TLCAwKTsKKworCQkvKiBkaXNhYmxlIGFsbCBJUlFzICovCisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9JTlRfUkVRXzAsIDApOworCQl6cjM2MDUwX3dyaXRlKHB0ciwgWlIwNTBfSU5UX1JFUV8xLCAzKTsJLy8gbG93IDIgYml0cyBhbHdheXMgMQorCisJCS8qIHZvbHVtZSBjb250cm9sIHNldHRpbmdzICovCisJCS8qenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX01CQ1YsIHB0ci0+bWF4X2Jsb2NrX3ZvbCk7Ki8KKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX1NGX0hJLCBwdHItPnNjYWxlZmFjdCA+PiA4KTsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX1NGX0xPLCBwdHItPnNjYWxlZmFjdCAmIDB4ZmYpOworCisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9BRl9ISSwgMHhmZik7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9BRl9NLCAweGZmKTsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX0FGX0xPLCAweGZmKTsKKworCQkvKiBzZXR1cCB0aGUgdmFyaWFibGUganBlZyB0YWJsZXMgKi8KKwkJc3VtICs9IHpyMzYwNTBfc2V0X3NvZihwdHIpOworCQlzdW0gKz0genIzNjA1MF9zZXRfc29zKHB0cik7CisJCXN1bSArPSB6cjM2MDUwX3NldF9kcmkocHRyKTsKKworCQkvKiBzZXR1cCB0aGUgZml4ZWQganBlZyB0YWJsZXMgLSBtYXliZSB2YXJpYWJsZSwgdGhvdWdoIC0KKwkJICogKHNlZSB0YWJsZSBpbml0IHNlY3Rpb24gYWJvdmUpICovCisJCWRwcmludGsoMywgIiVzOiB3cml0ZSBEUVQsIERIVCwgQVBQXG4iLCBwdHItPm5hbWUpOworCQlzdW0gKz0genIzNjA1MF9wdXNoaXQocHRyLCBaUjA1MF9EUVRfSURYLAorCQkJCSAgICAgIHNpemVvZih6cjM2MDUwX2RxdCksIHpyMzYwNTBfZHF0KTsKKwkJc3VtICs9IHpyMzYwNTBfcHVzaGl0KHB0ciwgWlIwNTBfREhUX0lEWCwKKwkJCQkgICAgICBzaXplb2YoenIzNjA1MF9kaHQpLCB6cjM2MDUwX2RodCk7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9BUFBfSURYLCAweGZmKTsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX0FQUF9JRFggKyAxLCAweGUwICsgcHRyLT5hcHAuYXBwbik7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9BUFBfSURYICsgMiwgMHgwMCk7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9BUFBfSURYICsgMywgcHRyLT5hcHAubGVuICsgMik7CisJCXN1bSArPSB6cjM2MDUwX3B1c2hpdChwdHIsIFpSMDUwX0FQUF9JRFggKyA0LCA2MCwKKwkJCQkgICAgICBwdHItPmFwcC5kYXRhKSArIDQ7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9DT01fSURYLCAweGZmKTsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX0NPTV9JRFggKyAxLCAweGZlKTsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX0NPTV9JRFggKyAyLCAweDAwKTsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX0NPTV9JRFggKyAzLCBwdHItPmNvbS5sZW4gKyAyKTsKKwkJc3VtICs9IHpyMzYwNTBfcHVzaGl0KHB0ciwgWlIwNTBfQ09NX0lEWCArIDQsIDYwLAorCQkJCSAgICAgIHB0ci0+Y29tLmRhdGEpICsgNDsKKworCQkvKiBkbyB0aGUgaW50ZXJuYWwgaHVmZm1hbiB0YWJsZSBwcmVsb2FkICovCisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9NQVJLRVJTX0VOLCBaUjA1MF9NRV9ESFRJKTsKKworCQl6cjM2MDUwX3dyaXRlKHB0ciwgWlIwNTBfR08sIDEpOwkvLyBsYXVuY2ggY29kZWMKKwkJenIzNjA1MF93YWl0X2VuZChwdHIpOworCQlkcHJpbnRrKDIsICIlczogU3RhdHVzIGFmdGVyIHRhYmxlIHByZWxvYWQ6IDB4JTAyeFxuIiwKKwkJCXB0ci0+bmFtZSwgcHRyLT5zdGF0dXMxKTsKKworCQlpZiAoKHB0ci0+c3RhdHVzMSAmIDB4NCkgPT0gMCkgeworCQkJZHByaW50aygxLCBLRVJOX0VSUiAiJXM6IGluaXQgYWJvcnRlZCFcbiIsCisJCQkJcHRyLT5uYW1lKTsKKwkJCXJldHVybjsJLy8gc29tZXRoaW5nIGlzIHdyb25nLCBpdHMgdGltZWQgb3V0ISEhIQorCQl9CisKKwkJLyogc2V0dXAgbWlzYy4gZGF0YSBmb3IgY29tcHJlc3Npb24gKHRhcmdldCBjb2RlIHNpemVzKSAqLworCisJCS8qIHNpemUgb2YgY29tcHJlc3NlZCBjb2RlIHRvIHJlYWNoIHdpdGhvdXQgaGVhZGVyIGRhdGEgKi8KKwkJc3VtID0gcHRyLT5yZWFsX2NvZGVfdm9sIC0gc3VtOworCQliaXRjbnQgPSBzdW0gPDwgMzsJLyogbmVlZCB0aGUgc2l6ZSBpbiBiaXRzICovCisKKwkJdG1wID0gYml0Y250ID4+IDE2OworCQlkcHJpbnRrKDMsCisJCQkiJXM6IGNvZGU6IGNzaXplPSVkLCB0b3Q9JWQsIGJpdD0lbGQsIGhpZ2hiaXRzPSVsZFxuIiwKKwkJCXB0ci0+bmFtZSwgc3VtLCBwdHItPnJlYWxfY29kZV92b2wsIGJpdGNudCwgdG1wKTsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX1RDVl9ORVRfSEksIHRtcCA+PiA4KTsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX1RDVl9ORVRfTUgsIHRtcCAmIDB4ZmYpOworCQl0bXAgPSBiaXRjbnQgJiAweGZmZmY7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9UQ1ZfTkVUX01MLCB0bXAgPj4gOCk7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9UQ1ZfTkVUX0xPLCB0bXAgJiAweGZmKTsKKworCQliaXRjbnQgLT0gYml0Y250ID4+IDc7CS8vIGJpdHMgd2l0aG91dCBzdHVmZmluZworCQliaXRjbnQgLT0gKChiaXRjbnQgKiA1KSA+PiA2KTsJLy8gYml0cyB3aXRob3V0IGVvYgorCisJCXRtcCA9IGJpdGNudCA+PiAxNjsKKwkJZHByaW50aygzLCAiJXM6IGNvZGU6IG5ldHRvYml0PSVsZCwgaGlnaG5ldHRvYml0cz0lbGRcbiIsCisJCQlwdHItPm5hbWUsIGJpdGNudCwgdG1wKTsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX1RDVl9EQVRBX0hJLCB0bXAgPj4gOCk7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9UQ1ZfREFUQV9NSCwgdG1wICYgMHhmZik7CisJCXRtcCA9IGJpdGNudCAmIDB4ZmZmZjsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX1RDVl9EQVRBX01MLCB0bXAgPj4gOCk7CisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9UQ1ZfREFUQV9MTywgdG1wICYgMHhmZik7CisKKwkJLyogY29tcHJlc3Npb24gc2V0dXAgd2l0aCBvciB3aXRob3V0IGJpdHJhdGUgY29udHJvbCAqLworCQl6cjM2MDUwX3dyaXRlKHB0ciwgWlIwNTBfTU9ERSwKKwkJCSAgICAgIFpSMDUwX01PX0NPTVAgfCBaUjA1MF9NT19QQVNTMiB8CisJCQkgICAgICAocHRyLT5iaXRyYXRlX2N0cmwgPyBaUjA1MF9NT19CUkMgOiAwKSk7CisKKwkJLyogdGhpcyBoZWFkZXJzIHNlZW0gdG8gZGVsaXZlciAidmFsaWQgQVZJIiBqcGVnIGZyYW1lcyAqLworCQl6cjM2MDUwX3dyaXRlKHB0ciwgWlIwNTBfTUFSS0VSU19FTiwKKwkJCSAgICAgIFpSMDUwX01FX0RRVCB8IFpSMDUwX01FX0RIVCB8CisJCQkgICAgICAoKHB0ci0+YXBwLmxlbiA+IDApID8gWlIwNTBfTUVfQVBQIDogMCkgfAorCQkJICAgICAgKChwdHItPmNvbS5sZW4gPiAwKSA/IFpSMDUwX01FX0NPTSA6IDApKTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKDIsICIlczogRVhQQU5TSU9OIFNFVFVQXG4iLCBwdHItPm5hbWUpOworCisJCS8qIDA1MCBjb21tdW5pY2F0ZXMgd2l0aCAwNTUgaW4gbWFzdGVyIG1vZGUgKi8KKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX0hBUkRXQVJFLAorCQkJICAgICAgWlIwNTBfSFdfTVNUUiB8IFpSMDUwX0hXX0NGSVNfMl9DTEspOworCisJCS8qIGVuY29kaW5nIHRhYmxlIHByZWxvYWQgKi8KKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX01PREUsIFpSMDUwX01PX1RMTSk7CisKKwkJLyogZGlzYWJsZSBhbGwgSVJRcyAqLworCQl6cjM2MDUwX3dyaXRlKHB0ciwgWlIwNTBfSU5UX1JFUV8wLCAwKTsKKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX0lOVF9SRVFfMSwgMyk7CS8vIGxvdyAyIGJpdHMgYWx3YXlzIDEKKworCQlkcHJpbnRrKDMsICIlczogd3JpdGUgREhUXG4iLCBwdHItPm5hbWUpOworCQl6cjM2MDUwX3B1c2hpdChwdHIsIFpSMDUwX0RIVF9JRFgsIHNpemVvZih6cjM2MDUwX2RodCksCisJCQkgICAgICAgenIzNjA1MF9kaHQpOworCisJCS8qIGRvIHRoZSBpbnRlcm5hbCBodWZmbWFuIHRhYmxlIHByZWxvYWQgKi8KKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX01BUktFUlNfRU4sIFpSMDUwX01FX0RIVEkpOworCisJCXpyMzYwNTBfd3JpdGUocHRyLCBaUjA1MF9HTywgMSk7CS8vIGxhdW5jaCBjb2RlYworCQl6cjM2MDUwX3dhaXRfZW5kKHB0cik7CisJCWRwcmludGsoMiwgIiVzOiBTdGF0dXMgYWZ0ZXIgdGFibGUgcHJlbG9hZDogMHglMDJ4XG4iLAorCQkJcHRyLT5uYW1lLCBwdHItPnN0YXR1czEpOworCisJCWlmICgocHRyLT5zdGF0dXMxICYgMHg0KSA9PSAwKSB7CisJCQlkcHJpbnRrKDEsIEtFUk5fRVJSICIlczogaW5pdCBhYm9ydGVkIVxuIiwKKwkJCQlwdHItPm5hbWUpOworCQkJcmV0dXJuOwkvLyBzb21ldGhpbmcgaXMgd3JvbmcsIGl0cyB0aW1lZCBvdXQhISEhCisJCX0KKworCQkvKiBzZXR1cCBtaXNjLiBkYXRhIGZvciBleHBhbnNpb24gKi8KKwkJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX01PREUsIDApOworCQl6cjM2MDUwX3dyaXRlKHB0ciwgWlIwNTBfTUFSS0VSU19FTiwgMCk7CisJfQorCisJLyogYWRyIG9uIHNlbGVjdGVkLCB0byBhbGxvdyBHTyBmcm9tIG1hc3RlciAqLworCXpyMzYwNTBfcmVhZChwdHIsIDApOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBDT0RFQyBBUEkgRlVOQ1RJT05TCisKKyAgIHRoaXMgZnVuY3Rpb25zIGFyZSBhY2Nlc3NlZCBieSB0aGUgbWFzdGVyIHZpYSB0aGUgQVBJIHN0cnVjdHVyZQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBzZXQgY29tcHJlc3Npb24vZXhwYW5zaW9uIG1vZGUgYW5kIGxhdW5jaGVzIGNvZGVjIC0KKyAgIHRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0IGNhbGwgZnJvbSB0aGUgbWFzdGVyIGJlZm9yZSBzdGFydGluZyBwcm9jZXNzaW5nICovCitzdGF0aWMgaW50Cit6cjM2MDUwX3NldF9tb2RlIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMsCisJCSAgaW50ICAgICAgICAgICAgICAgIG1vZGUpCit7CisJc3RydWN0IHpyMzYwNTAgKnB0ciA9IChzdHJ1Y3QgenIzNjA1MCAqKSBjb2RlYy0+ZGF0YTsKKworCWRwcmludGsoMiwgIiVzOiBzZXRfbW9kZSAlZCBjYWxsXG4iLCBwdHItPm5hbWUsIG1vZGUpOworCisJaWYgKChtb2RlICE9IENPREVDX0RPX0VYUEFOU0lPTikgJiYgKG1vZGUgIT0gQ09ERUNfRE9fQ09NUFJFU1NJT04pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB0ci0+bW9kZSA9IG1vZGU7CisJenIzNjA1MF9pbml0KHB0cik7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHBpY3R1cmUgc2l6ZSAobm9ybSBpcyBpZ25vcmVkIGFzIHRoZSBjb2RlYyBkb2Vzbid0IGtub3cgYWJvdXQgaXQpICovCitzdGF0aWMgaW50Cit6cjM2MDUwX3NldF92aWRlbyAoc3RydWN0IHZpZGVvY29kZWMgICAqY29kZWMsCisJCSAgIHN0cnVjdCB0dm5vcm0gICAgICAgKm5vcm0sCisJCSAgIHN0cnVjdCB2ZmVfc2V0dGluZ3MgKmNhcCwKKwkJICAgc3RydWN0IHZmZV9wb2xhcml0eSAqcG9sKQoreworCXN0cnVjdCB6cjM2MDUwICpwdHIgPSAoc3RydWN0IHpyMzYwNTAgKikgY29kZWMtPmRhdGE7CisJaW50IHNpemU7CisKKwlkcHJpbnRrKDIsICIlczogc2V0X3ZpZGVvICVkLiVkLCAlZC8lZC0lZHglZCAoMHgleCkgcSVkIGNhbGxcbiIsCisJCXB0ci0+bmFtZSwgbm9ybS0+SFN0YXJ0LCBub3JtLT5WU3RhcnQsCisJCWNhcC0+eCwgY2FwLT55LCBjYXAtPndpZHRoLCBjYXAtPmhlaWdodCwKKwkJY2FwLT5kZWNpbWF0aW9uLCBjYXAtPnF1YWxpdHkpOworCS8qIGlmICgpIHJldHVybiAtRUlOVkFMOworCSAqIHRydXN0IHRoZSBtYXN0ZXIgZHJpdmVyIHRoYXQgaXQga25vd3Mgd2hhdCBpdCBkb2VzIC0gc28KKwkgKiB3ZSBhbGxvdyBpbnZhbGlkIHN0YXJ0eC95IGFuZCBub3JtIGZvciBub3cgLi4uICovCisJcHRyLT53aWR0aCA9IGNhcC0+d2lkdGggLyAoY2FwLT5kZWNpbWF0aW9uICYgMHhmZik7CisJcHRyLT5oZWlnaHQgPSBjYXAtPmhlaWdodCAvICgoY2FwLT5kZWNpbWF0aW9uID4+IDgpICYgMHhmZik7CisKKwkvKiAoS00pIEpQRUcgcXVhbGl0eSAqLworCXNpemUgPSBwdHItPndpZHRoICogcHRyLT5oZWlnaHQ7CisJc2l6ZSAqPSAxNjsgLyogc2l6ZSBpbiBiaXRzICovCisJLyogYXBwbHkgcXVhbGl0eSBzZXR0aW5nICovCisJc2l6ZSA9IHNpemUgKiBjYXAtPnF1YWxpdHkgLyAyMDA7CisKKwkvKiBNaW5pbXVtOiAxa2IgKi8KKwlpZiAoc2l6ZSA8IDgxOTIpCisJCXNpemUgPSA4MTkyOworCS8qIE1heGltdW06IDcvOCBvZiBjb2RlIGJ1ZmZlciAqLworCWlmIChzaXplID4gcHRyLT50b3RhbF9jb2RlX3ZvbCAqIDcpCisJCXNpemUgPSBwdHItPnRvdGFsX2NvZGVfdm9sICogNzsKKworCXB0ci0+cmVhbF9jb2RlX3ZvbCA9IHNpemUgPj4gMzsgLyogaW4gYnl0ZXMgKi8KKworCS8qIFNldCBtYXhfYmxvY2tfdm9sIGhlcmUgKHByZXZpb3VzbHkgaW4genIzNjA1MF9pbml0LCBtb3ZlZAorCSAqIGhlcmUgZm9yIGNvbnNpc3RlbmN5IHdpdGggenIzNjA2MCBjb2RlICovCisJenIzNjA1MF93cml0ZShwdHIsIFpSMDUwX01CQ1YsIHB0ci0+bWF4X2Jsb2NrX3ZvbCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogYWRkaXRpb25hbCBjb250cm9sIGZ1bmN0aW9ucyAqLworc3RhdGljIGludAorenIzNjA1MF9jb250cm9sIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMsCisJCSBpbnQgICAgICAgICAgICAgICAgdHlwZSwKKwkJIGludCAgICAgICAgICAgICAgICBzaXplLAorCQkgdm9pZCAgICAgICAgICAgICAgKmRhdGEpCit7CisJc3RydWN0IHpyMzYwNTAgKnB0ciA9IChzdHJ1Y3QgenIzNjA1MCAqKSBjb2RlYy0+ZGF0YTsKKwlpbnQgKml2YWwgPSAoaW50ICopIGRhdGE7CisKKwlkcHJpbnRrKDIsICIlczogY29udHJvbCAlZCBjYWxsIHdpdGggJWQgYnl0ZVxuIiwgcHRyLT5uYW1lLCB0eXBlLAorCQlzaXplKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQ09ERUNfR19TVEFUVVM6CS8qIGdldCBsYXN0IHN0YXR1cyAqLworCQlpZiAoc2l6ZSAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl6cjM2MDUwX3JlYWRfc3RhdHVzMShwdHIpOworCQkqaXZhbCA9IHB0ci0+c3RhdHVzMTsKKwkJYnJlYWs7CisKKwljYXNlIENPREVDX0dfQ09ERUNfTU9ERToKKwkJaWYgKHNpemUgIT0gc2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJKml2YWwgPSBDT0RFQ19NT0RFX0JKUEc7CisJCWJyZWFrOworCisJY2FzZSBDT0RFQ19TX0NPREVDX01PREU6CisJCWlmIChzaXplICE9IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICgqaXZhbCAhPSBDT0RFQ19NT0RFX0JKUEcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogbm90IG5lZWRlZCwgZG8gbm90aGluZyAqLworCQlyZXR1cm4gMDsKKworCWNhc2UgQ09ERUNfR19WRkU6CisJY2FzZSBDT0RFQ19TX1ZGRToKKwkJLyogbm90IG5lZWRlZCwgZG8gbm90aGluZyAqLworCQlyZXR1cm4gMDsKKworCWNhc2UgQ09ERUNfU19NTUFQOgorCQkvKiBub3QgYXZhaWxhYmxlLCBnaXZlIGFuIGVycm9yICovCisJCXJldHVybiAtRU5YSU87CisKKwljYXNlIENPREVDX0dfSlBFR19URFNfQllURToJLyogZ2V0IHRhcmdldCB2b2x1bWUgaW4gYnl0ZSAqLworCQlpZiAoc2l6ZSAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQkqaXZhbCA9IHB0ci0+dG90YWxfY29kZV92b2w7CisJCWJyZWFrOworCisJY2FzZSBDT0RFQ19TX0pQRUdfVERTX0JZVEU6CS8qIGdldCB0YXJnZXQgdm9sdW1lIGluIGJ5dGUgKi8KKwkJaWYgKHNpemUgIT0gc2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHRyLT50b3RhbF9jb2RlX3ZvbCA9ICppdmFsOworCQkvKiAoS2llcmFuIE1vcnJpc3NleSkKKwkJICogY29kZSBjb3BpZWQgZnJvbSB6cjM2MDYwLmMgdG8gZW5zdXJlIHByb3BlciBiaXRyYXRlICovCisJCXB0ci0+cmVhbF9jb2RlX3ZvbCA9IChwdHItPnRvdGFsX2NvZGVfdm9sICogNikgPj4gMzsKKwkJYnJlYWs7CisKKwljYXNlIENPREVDX0dfSlBFR19TQ0FMRToJLyogZ2V0IHNjYWxpbmcgZmFjdG9yICovCisJCWlmIChzaXplICE9IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCSppdmFsID0genIzNjA1MF9yZWFkX3NjYWxlZmFjdG9yKHB0cik7CisJCWJyZWFrOworCisJY2FzZSBDT0RFQ19TX0pQRUdfU0NBTEU6CS8qIHNldCBzY2FsaW5nIGZhY3RvciAqLworCQlpZiAoc2l6ZSAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwdHItPnNjYWxlZmFjdCA9ICppdmFsOworCQlicmVhazsKKworCWNhc2UgQ09ERUNfR19KUEVHX0FQUF9EQVRBOiB7CS8qIGdldCBhcHBuIG1hcmtlciBkYXRhICovCisJCXN0cnVjdCBqcGVnX2FwcF9tYXJrZXIgKmFwcCA9IGRhdGE7CisKKwkJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCBqcGVnX2FwcF9tYXJrZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJKmFwcCA9IHB0ci0+YXBwOworCQlicmVhazsKKwl9CisKKwljYXNlIENPREVDX1NfSlBFR19BUFBfREFUQTogewkgLyogc2V0IGFwcG4gbWFya2VyIGRhdGEgKi8KKwkJc3RydWN0IGpwZWdfYXBwX21hcmtlciAqYXBwID0gZGF0YTsKKworCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGpwZWdfYXBwX21hcmtlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlwdHItPmFwcCA9ICphcHA7CisJCWJyZWFrOworCX0KKworCWNhc2UgQ09ERUNfR19KUEVHX0NPTV9EQVRBOiB7CS8qIGdldCBjb21tZW50IG1hcmtlciBkYXRhICovCisJCXN0cnVjdCBqcGVnX2NvbV9tYXJrZXIgKmNvbSA9IGRhdGE7CisKKwkJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCBqcGVnX2NvbV9tYXJrZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJKmNvbSA9IHB0ci0+Y29tOworCQlicmVhazsKKwl9CisKKwljYXNlIENPREVDX1NfSlBFR19DT01fREFUQTogewkvKiBzZXQgY29tbWVudCBtYXJrZXIgZGF0YSAqLworCQlzdHJ1Y3QganBlZ19jb21fbWFya2VyICpjb20gPSBkYXRhOworCisJCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QganBlZ19jb21fbWFya2VyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXB0ci0+Y29tID0gKmNvbTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEV4aXQgYW5kIHVucmVnaXN0ZXIgZnVuY3Rpb246CisKKyAgIERlaW5pdGlhbGl6ZXMgWm9yYW4ncyBKUEVHIHByb2Nlc3NvcgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgaW50Cit6cjM2MDUwX3Vuc2V0IChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHpyMzYwNTAgKnB0ciA9IGNvZGVjLT5kYXRhOworCisJaWYgKHB0cikgeworCQkvKiBkbyB3ZWUgbmVlZCBzb21lIGNvZGVjIGRlaW5pdCBoZXJlLCB0b28gPz8/PyAqLworCisJCWRwcmludGsoMSwgIiVzOiBmaW5pc2hlZCBjb2RlYyAjJWRcbiIsIHB0ci0+bmFtZSwKKwkJCXB0ci0+bnVtKTsKKwkJa2ZyZWUocHRyKTsKKwkJY29kZWMtPmRhdGEgPSBOVUxMOworCisJCXpyMzYwNTBfY29kZWNzLS07CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUZBVUxUOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBTZXR1cCBhbmQgcmVnaXN0cnkgZnVuY3Rpb246CisKKyAgIEluaXRpYWxpemVzIFpvcmFuJ3MgSlBFRyBwcm9jZXNzb3IKKworICAgQWxzbyBzZXRzIHBpeGVsIHNpemUsIGF2ZXJhZ2UgY29kZSBzaXplLCBtb2RlIChjb21wci4vZGVjb21wci4pCisgICAodGhlIGdpdmVuIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcHJvY2Vzc29yIHdpdGggdGhlIHZpZGVvIGludGVyZmFjZSkKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGludAorenIzNjA1MF9zZXR1cCAoc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB6cjM2MDUwICpwdHI7CisJaW50IHJlczsKKworCWRwcmludGsoMiwgInpyMzYwNTA6IGluaXRpYWxpemluZyBNSlBFRyBzdWJzeXN0ZW0gIyVkLlxuIiwKKwkJenIzNjA1MF9jb2RlY3MpOworCisJaWYgKHpyMzYwNTBfY29kZWNzID09IE1BWF9DT0RFQ1MpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIgInpyMzYwNTA6IENhbid0IGF0dGFjaCBtb3JlIGNvZGVjcyFcbiIpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJLy9tZW0gc3RydWN0dXJlIGluaXQKKwljb2RlYy0+ZGF0YSA9IHB0ciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB6cjM2MDUwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gcHRyKSB7CisJCWRwcmludGsoMSwgS0VSTl9FUlIgInpyMzYwNTA6IENhbid0IGdldCBlbm91Z2ggbWVtb3J5IVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocHRyLCAwLCBzaXplb2Yoc3RydWN0IHpyMzYwNTApKTsKKworCXNucHJpbnRmKHB0ci0+bmFtZSwgc2l6ZW9mKHB0ci0+bmFtZSksICJ6cjM2MDUwWyVkXSIsCisJCSB6cjM2MDUwX2NvZGVjcyk7CisJcHRyLT5udW0gPSB6cjM2MDUwX2NvZGVjcysrOworCXB0ci0+Y29kZWMgPSBjb2RlYzsKKworCS8vdGVzdGluZworCXJlcyA9IHpyMzYwNTBfYmFzaWNfdGVzdChwdHIpOworCWlmIChyZXMgPCAwKSB7CisJCXpyMzYwNTBfdW5zZXQoY29kZWMpOworCQlyZXR1cm4gcmVzOworCX0KKwkvL2ZpbmFsIHNldHVwCisJbWVtY3B5KHB0ci0+aF9zYW1wX3JhdGlvLCB6cjM2MDUwX2RlY2ltYXRpb25faCwgOCk7CisJbWVtY3B5KHB0ci0+dl9zYW1wX3JhdGlvLCB6cjM2MDUwX2RlY2ltYXRpb25fdiwgOCk7CisKKwlwdHItPmJpdHJhdGVfY3RybCA9IDA7CS8qIDAgb3IgMSAtIGZpeGVkIGZpbGUgc2l6ZSBmbGFnCisJCQkJICogKHdoYXQgaXMgdGhlIGRpZmZlcmVuY2U/KSAqLworCXB0ci0+bW9kZSA9IENPREVDX0RPX0NPTVBSRVNTSU9OOworCXB0ci0+d2lkdGggPSAzODQ7CisJcHRyLT5oZWlnaHQgPSAyODg7CisJcHRyLT50b3RhbF9jb2RlX3ZvbCA9IDE2MDAwOworCXB0ci0+bWF4X2Jsb2NrX3ZvbCA9IDI0MDsKKwlwdHItPnNjYWxlZmFjdCA9IDB4MTAwOworCXB0ci0+ZHJpID0gMTsKKworCS8qIG5vIGFwcC9jb20gbWFya2VyIGJ5IGRlZmF1bHQgKi8KKwlwdHItPmFwcC5hcHBuID0gMDsKKwlwdHItPmFwcC5sZW4gPSAwOworCXB0ci0+Y29tLmxlbiA9IDA7CisKKwl6cjM2MDUwX2luaXQocHRyKTsKKworCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogY29kZWMgYXR0YWNoZWQgYW5kIHJ1bm5pbmdcbiIsCisJCXB0ci0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2aWRlb2NvZGVjIHpyMzYwNTBfY29kZWMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAienIzNjA1MCIsCisJLm1hZ2ljID0gMEwsCQkvLyBtYWdpYyBub3QgdXNlZAorCS5mbGFncyA9CisJICAgIENPREVDX0ZMQUdfSlBFRyB8IENPREVDX0ZMQUdfSEFSRFdBUkUgfCBDT0RFQ19GTEFHX0VOQ09ERVIgfAorCSAgICBDT0RFQ19GTEFHX0RFQ09ERVIsCisJLnR5cGUgPSBDT0RFQ19UWVBFX1pSMzYwNTAsCisJLnNldHVwID0genIzNjA1MF9zZXR1cCwJLy8gZnVuY3Rpb25hbGl0eQorCS51bnNldCA9IHpyMzYwNTBfdW5zZXQsCisJLnNldF9tb2RlID0genIzNjA1MF9zZXRfbW9kZSwKKwkuc2V0X3ZpZGVvID0genIzNjA1MF9zZXRfdmlkZW8sCisJLmNvbnRyb2wgPSB6cjM2MDUwX2NvbnRyb2wsCisJLy8gb3RoZXJzIGFyZSBub3QgdXNlZAorfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgSE9PSyBJTiBEUklWRVIgQVMgS0VSTkVMIE1PRFVMRQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgaW50IF9faW5pdAorenIzNjA1MF9pbml0X21vZHVsZSAodm9pZCkKK3sKKwkvL2RwcmludGsoMSwgIlpSMzYwNTAgZHJpdmVyICVzXG4iLFpSMDUwX1ZFUlNJT04pOworCXpyMzYwNTBfY29kZWNzID0gMDsKKwlyZXR1cm4gdmlkZW9jb2RlY19yZWdpc3RlcigmenIzNjA1MF9jb2RlYyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorenIzNjA1MF9jbGVhbnVwX21vZHVsZSAodm9pZCkKK3sKKwlpZiAoenIzNjA1MF9jb2RlY3MpIHsKKwkJZHByaW50aygxLAorCQkJInpyMzYwNTA6IHNvbWV0aGluZydzIHdyb25nIC0gJWQgY29kZWNzIGxlZnQgc29tZWhvdy5cbiIsCisJCQl6cjM2MDUwX2NvZGVjcyk7CisJfQorCXZpZGVvY29kZWNfdW5yZWdpc3RlcigmenIzNjA1MF9jb2RlYyk7Cit9CisKK21vZHVsZV9pbml0KHpyMzYwNTBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoenIzNjA1MF9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIldvbGZnYW5nIFNjaGVyciA8c2NoZXJyQG5ldDR5b3UuYXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBtb2R1bGUgZm9yIFpSMzYwNTAganBlZyBwcm9jZXNzb3JzICIKKwkJICAgWlIwNTBfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNTAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTJmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNTAuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIFpvcmFuIFpSMzYwNTAgYmFzaWMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgLSBoZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXb2xmZ2FuZyBTY2hlcnIgPHNjaGVyckBuZXQ0eW91LmF0PgorICoKKyAqICRJZDogenIzNjA1MC5oLHYgMS4xLjIuMiAyMDAzLzAxLzE0IDIxOjE4OjIyIHJidWx0amUgRXhwICQKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIFpSMzYwNTBfSAorI2RlZmluZSBaUjM2MDUwX0gKKworI2luY2x1ZGUgInZpZGVvY29kZWMuaCIKKworLyogZGF0YSBzdG9yZWQgZm9yIGVhY2ggem9yYW4ganBlZyBjb2RlYyBjaGlwICovCitzdHJ1Y3QgenIzNjA1MCB7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgbnVtOworCS8qIGlvIGRhdGFzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWM7CisJLy8gbGFzdCBjb2RlciBzdGF0dXMKKwlfX3U4IHN0YXR1czE7CisJLy8gYWN0dWFsIGNvZGVyIHNldHVwCisJaW50IG1vZGU7CisKKwlfX3UxNiB3aWR0aDsKKwlfX3UxNiBoZWlnaHQ7CisKKwlfX3UxNiBiaXRyYXRlX2N0cmw7CisKKwlfX3UzMiB0b3RhbF9jb2RlX3ZvbDsKKwlfX3UzMiByZWFsX2NvZGVfdm9sOworCV9fdTE2IG1heF9ibG9ja192b2w7CisKKwlfX3U4IGhfc2FtcF9yYXRpb1s4XTsKKwlfX3U4IHZfc2FtcF9yYXRpb1s4XTsKKwlfX3UxNiBzY2FsZWZhY3Q7CisJX191MTYgZHJpOworCisJLyogY29tL2FwcCBtYXJrZXIgKi8KKwlzdHJ1Y3QganBlZ19jb21fbWFya2VyIGNvbTsKKwlzdHJ1Y3QganBlZ19hcHBfbWFya2VyIGFwcDsKK307CisKKy8qIHpyMzYwNTAgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisjZGVmaW5lIFpSMDUwX0dPICAgICAgICAgICAgICAgICAgMHgwMDAKKyNkZWZpbmUgWlIwNTBfSEFSRFdBUkUgICAgICAgICAgICAweDAwMgorI2RlZmluZSBaUjA1MF9NT0RFICAgICAgICAgICAgICAgIDB4MDAzCisjZGVmaW5lIFpSMDUwX09QVElPTlMgICAgICAgICAgICAgMHgwMDQKKyNkZWZpbmUgWlIwNTBfTUJDViAgICAgICAgICAgICAgICAweDAwNQorI2RlZmluZSBaUjA1MF9NQVJLRVJTX0VOICAgICAgICAgIDB4MDA2CisjZGVmaW5lIFpSMDUwX0lOVF9SRVFfMCAgICAgICAgICAgMHgwMDcKKyNkZWZpbmUgWlIwNTBfSU5UX1JFUV8xICAgICAgICAgICAweDAwOAorI2RlZmluZSBaUjA1MF9UQ1ZfTkVUX0hJICAgICAgICAgIDB4MDA5CisjZGVmaW5lIFpSMDUwX1RDVl9ORVRfTUggICAgICAgICAgMHgwMGEKKyNkZWZpbmUgWlIwNTBfVENWX05FVF9NTCAgICAgICAgICAweDAwYgorI2RlZmluZSBaUjA1MF9UQ1ZfTkVUX0xPICAgICAgICAgIDB4MDBjCisjZGVmaW5lIFpSMDUwX1RDVl9EQVRBX0hJICAgICAgICAgMHgwMGQKKyNkZWZpbmUgWlIwNTBfVENWX0RBVEFfTUggICAgICAgICAweDAwZQorI2RlZmluZSBaUjA1MF9UQ1ZfREFUQV9NTCAgICAgICAgIDB4MDBmCisjZGVmaW5lIFpSMDUwX1RDVl9EQVRBX0xPICAgICAgICAgMHgwMTAKKyNkZWZpbmUgWlIwNTBfU0ZfSEkgICAgICAgICAgICAgICAweDAxMQorI2RlZmluZSBaUjA1MF9TRl9MTyAgICAgICAgICAgICAgIDB4MDEyCisjZGVmaW5lIFpSMDUwX0FGX0hJICAgICAgICAgICAgICAgMHgwMTMKKyNkZWZpbmUgWlIwNTBfQUZfTSAgICAgICAgICAgICAgICAweDAxNAorI2RlZmluZSBaUjA1MF9BRl9MTyAgICAgICAgICAgICAgIDB4MDE1CisjZGVmaW5lIFpSMDUwX0FDVl9ISSAgICAgICAgICAgICAgMHgwMTYKKyNkZWZpbmUgWlIwNTBfQUNWX01IICAgICAgICAgICAgICAweDAxNworI2RlZmluZSBaUjA1MF9BQ1ZfTUwgICAgICAgICAgICAgIDB4MDE4CisjZGVmaW5lIFpSMDUwX0FDVl9MTyAgICAgICAgICAgICAgMHgwMTkKKyNkZWZpbmUgWlIwNTBfQUNUX0hJICAgICAgICAgICAgICAweDAxYQorI2RlZmluZSBaUjA1MF9BQ1RfTUggICAgICAgICAgICAgIDB4MDFiCisjZGVmaW5lIFpSMDUwX0FDVF9NTCAgICAgICAgICAgICAgMHgwMWMKKyNkZWZpbmUgWlIwNTBfQUNUX0xPICAgICAgICAgICAgICAweDAxZAorI2RlZmluZSBaUjA1MF9BQ1ZfVFJVTl9ISSAgICAgICAgIDB4MDFlCisjZGVmaW5lIFpSMDUwX0FDVl9UUlVOX01IICAgICAgICAgMHgwMWYKKyNkZWZpbmUgWlIwNTBfQUNWX1RSVU5fTUwgICAgICAgICAweDAyMAorI2RlZmluZSBaUjA1MF9BQ1ZfVFJVTl9MTyAgICAgICAgIDB4MDIxCisjZGVmaW5lIFpSMDUwX1NUQVRVU18wICAgICAgICAgICAgMHgwMmUKKyNkZWZpbmUgWlIwNTBfU1RBVFVTXzEgICAgICAgICAgICAweDAyZgorCisjZGVmaW5lIFpSMDUwX1NPRl9JRFggICAgICAgICAgICAgMHgwNDAKKyNkZWZpbmUgWlIwNTBfU09TMV9JRFggICAgICAgICAgICAweDA3YQorI2RlZmluZSBaUjA1MF9TT1MyX0lEWCAgICAgICAgICAgIDB4MDhhCisjZGVmaW5lIFpSMDUwX1NPUzNfSURYICAgICAgICAgICAgMHgwOWEKKyNkZWZpbmUgWlIwNTBfU09TNF9JRFggICAgICAgICAgICAweDBhYQorI2RlZmluZSBaUjA1MF9EUklfSURYICAgICAgICAgICAgIDB4MGMwCisjZGVmaW5lIFpSMDUwX0ROTF9JRFggICAgICAgICAgICAgMHgwYzYKKyNkZWZpbmUgWlIwNTBfRFFUX0lEWCAgICAgICAgICAgICAweDBjYworI2RlZmluZSBaUjA1MF9ESFRfSURYICAgICAgICAgICAgIDB4MWQ0CisjZGVmaW5lIFpSMDUwX0FQUF9JRFggICAgICAgICAgICAgMHgzODAKKyNkZWZpbmUgWlIwNTBfQ09NX0lEWCAgICAgICAgICAgICAweDNjMAorCisvKiB6cjM2MDUwIGhhcmR3YXJlIHJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBaUjA1MF9IV19CU1dEICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgWlIwNTBfSFdfTVNUUiAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFpSMDUwX0hXX0RNQSAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBaUjA1MF9IV19DRklTXzFfQ0xLICAgICAgICAgIDB4MDAKKyNkZWZpbmUgWlIwNTBfSFdfQ0ZJU18yX0NMSyAgICAgICAgICAweDA0CisjZGVmaW5lIFpSMDUwX0hXX0NGSVNfM19DTEsgICAgICAgICAgMHgwOAorI2RlZmluZSBaUjA1MF9IV19DRklTXzRfQ0xLICAgICAgICAgIDB4MEMKKyNkZWZpbmUgWlIwNTBfSFdfQ0ZJU181X0NMSyAgICAgICAgICAweDEwCisjZGVmaW5lIFpSMDUwX0hXX0NGSVNfNl9DTEsgICAgICAgICAgMHgxNAorI2RlZmluZSBaUjA1MF9IV19DRklTXzdfQ0xLICAgICAgICAgIDB4MTgKKyNkZWZpbmUgWlIwNTBfSFdfQ0ZJU184X0NMSyAgICAgICAgICAweDFDCisjZGVmaW5lIFpSMDUwX0hXX0JFTEUgICAgICAgICAgICAgICAgMHgwMQorCisvKiB6cjM2MDUwIG1vZGUgcmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIFpSMDUwX01PX0NPTVAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBaUjA1MF9NT19DT01QICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgWlIwNTBfTU9fQVRQICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFpSMDUwX01PX1BBU1MyICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBaUjA1MF9NT19UTE0gICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgWlIwNTBfTU9fRENPTkxZICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFpSMDUwX01PX0JSQyAgICAgICAgICAgICAgICAgMHgwNAorCisjZGVmaW5lIFpSMDUwX01PX0FUUCAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBaUjA1MF9NT19QQVNTMiAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgWlIwNTBfTU9fVExNICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFpSMDUwX01PX0RDT05MWSAgICAgICAgICAgICAgMHgwOAorCisvKiB6cjM2MDUwIG9wdGlvbiByZWdpc3RlciBiaXRzICovCisKKyNkZWZpbmUgWlIwNTBfT1BfTlNDTl8xICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFpSMDUwX09QX05TQ05fMiAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBaUjA1MF9PUF9OU0NOXzMgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgWlIwNTBfT1BfTlNDTl80ICAgICAgICAgICAgICAweDYwCisjZGVmaW5lIFpSMDUwX09QX05TQ05fNSAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBaUjA1MF9PUF9OU0NOXzYgICAgICAgICAgICAgIDB4QTAKKyNkZWZpbmUgWlIwNTBfT1BfTlNDTl83ICAgICAgICAgICAgICAweEMwCisjZGVmaW5lIFpSMDUwX09QX05TQ05fOCAgICAgICAgICAgICAgMHhFMAorI2RlZmluZSBaUjA1MF9PUF9PVkYgICAgICAgICAgICAgICAgIDB4MTAKKworCisvKiB6cjM2MDUwIG1hcmtlcnMtZW5hYmxlIHJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBaUjA1MF9NRV9BUFAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgWlIwNTBfTUVfQ09NICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFpSMDUwX01FX0RSSSAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBaUjA1MF9NRV9EUVQgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgWlIwNTBfTUVfREhUICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFpSMDUwX01FX0ROTCAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBaUjA1MF9NRV9EUVRJICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgWlIwNTBfTUVfREhUSSAgICAgICAgICAgICAgICAweDAxCisKKy8qIHpyMzYwNTAgc3RhdHVzMC8xIHJlZ2lzdGVyIGJpdCBtYXNrcyAqLworCisjZGVmaW5lIFpSMDUwX1NUX1JTVF9NQVNLICAgICAgICAgICAgMHgyMAorI2RlZmluZSBaUjA1MF9TVF9TT0ZfTUFTSyAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgWlIwNTBfU1RfU09TX01BU0sgICAgICAgICAgICAweDAyCisjZGVmaW5lIFpSMDUwX1NUX0RBVFJEWV9NQVNLICAgICAgICAgMHg4MAorI2RlZmluZSBaUjA1MF9TVF9NUktERVRfTUFTSyAgICAgICAgIDB4NDAKKyNkZWZpbmUgWlIwNTBfU1RfUkZNX01BU0sgICAgICAgICAgICAweDEwCisjZGVmaW5lIFpSMDUwX1NUX1JGRF9NQVNLICAgICAgICAgICAgMHgwOAorI2RlZmluZSBaUjA1MF9TVF9FTkRfTUFTSyAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgWlIwNTBfU1RfVENWT1ZGX01BU0sgICAgICAgICAweDAyCisjZGVmaW5lIFpSMDUwX1NUX0RBVE9WRl9NQVNLICAgICAgICAgMHgwMQorCisvKiBwaXhlbCBjb21wb25lbnQgaWR4ICovCisKKyNkZWZpbmUgWlIwNTBfWV9DT01QT05FTlQgICAgICAgICAwCisjZGVmaW5lIFpSMDUwX1VfQ09NUE9ORU5UICAgICAgICAgMQorI2RlZmluZSBaUjA1MF9WX0NPTVBPTkVOVCAgICAgICAgIDIKKworI2VuZGlmCQkJCS8qZm5kZWYgWlIzNjA1MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNTcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA1Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OWFiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNTcuaApAQCAtMCwwICsxLDE2OCBAQAorLyogCisgKiB6cjM2MDU3LmggLSB6cjM2MDU3IHJlZ2lzdGVyIG9mZnNldHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggRGF2ZSBQZXJrcyA8ZHBlcmtzQGlibS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWlIzNjA1N19IXworI2RlZmluZSBfWlIzNjA1N19IXworCisKKy8qIFpvcmFuIFpSMzYwNTcgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgWlIzNjA1N19WRkVIQ1IgICAgICAgICAgMHgwMDAJLyogVmlkZW8gRnJvbnQgRW5kLCBIb3Jpem9udGFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWlIzNjA1N19WRkVIQ1JfSFNQb2wgICAgICAgICAgICAoMTw8MzApCisjZGVmaW5lIFpSMzYwNTdfVkZFSENSX0hTdGFydCAgICAgICAgICAgMTAKKyNkZWZpbmUgWlIzNjA1N19WRkVIQ1JfSEVuZAkgICAgICAgIDAKKyNkZWZpbmUgWlIzNjA1N19WRkVIQ1JfSG1hc2sJICAgICAgICAweDNmZgorCisjZGVmaW5lIFpSMzYwNTdfVkZFVkNSICAgICAgICAgIDB4MDA0CS8qIFZpZGVvIEZyb250IEVuZCwgVmVydGljYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBaUjM2MDU3X1ZGRVZDUl9WU1BvbCAgICAgICAgICAgICgxPDwzMCkKKyNkZWZpbmUgWlIzNjA1N19WRkVWQ1JfVlN0YXJ0ICAgICAgICAgICAxMAorI2RlZmluZSBaUjM2MDU3X1ZGRVZDUl9WRW5kCSAgICAgICAgMAorI2RlZmluZSBaUjM2MDU3X1ZGRVZDUl9WbWFzawkgICAgICAgIDB4M2ZmCisKKyNkZWZpbmUgWlIzNjA1N19WRkVTUEZSICAgICAgICAgMHgwMDgJLyogVmlkZW8gRnJvbnQgRW5kLCBTY2FsZXIgYW5kIFBpeGVsIEZvcm1hdCBSZWdpc3RlciAqLworI2RlZmluZSBaUjM2MDU3X1ZGRVNQRlJfRXh0RmwgICAgICAgICAgICgxPDwyNikKKyNkZWZpbmUgWlIzNjA1N19WRkVTUEZSX1RvcEZpZWxkICAgICAgICAoMTw8MjUpCisjZGVmaW5lIFpSMzYwNTdfVkZFU1BGUl9WQ0xLUG9sICAgICAgICAgKDE8PDI0KQorI2RlZmluZSBaUjM2MDU3X1ZGRVNQRlJfSEZpbHRlciAgICAgICAgIDIxCisjZGVmaW5lIFpSMzYwNTdfVkZFU1BGUl9Ib3JEY20gICAgICAgICAgMTQKKyNkZWZpbmUgWlIzNjA1N19WRkVTUEZSX1ZlckRjbSAgICAgICAgICA4CisjZGVmaW5lIFpSMzYwNTdfVkZFU1BGUl9EaXNwTW9kZSAgICAgICAgNgorI2RlZmluZSBaUjM2MDU3X1ZGRVNQRlJfWVVWNDIyICAgICAgICAgICgwPDwzKQorI2RlZmluZSBaUjM2MDU3X1ZGRVNQRlJfUkdCODg4ICAgICAgICAgICgxPDwzKQorI2RlZmluZSBaUjM2MDU3X1ZGRVNQRlJfUkdCNTY1ICAgICAgICAgICgyPDwzKQorI2RlZmluZSBaUjM2MDU3X1ZGRVNQRlJfUkdCNTU1ICAgICAgICAgICgzPDwzKQorI2RlZmluZSBaUjM2MDU3X1ZGRVNQRlJfRXJyRGlmICAgICAgICAgICgxPDwyKQorI2RlZmluZSBaUjM2MDU3X1ZGRVNQRlJfUGFjazI0ICAgICAgICAgICgxPDwxKQorI2RlZmluZSBaUjM2MDU3X1ZGRVNQRlJfTGl0dGxlRW5kaWFuICAgICgxPDwwKQorCisjZGVmaW5lIFpSMzYwNTdfVkRUUiAgICAgICAgICAgIDB4MDBjCS8qIFZpZGVvIERpc3BsYXkgIlRvcCIgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBaUjM2MDU3X1ZEQlIgICAgICAgICAgICAweDAxMAkvKiBWaWRlbyBEaXNwbGF5ICJCb3R0b20iIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgWlIzNjA1N19WU1NGR1IgICAgICAgICAgMHgwMTQJLyogVmlkZW8gU3RyaWRlLCBTdGF0dXMsIGFuZCBGcmFtZSBHcmFiIFJlZ2lzdGVyICovCisjZGVmaW5lIFpSMzYwNTdfVlNTRkdSX0Rpc3BTdHJpZGUgICAgICAgMTYKKyNkZWZpbmUgWlIzNjA1N19WU1NGR1JfVmlkT3ZmICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgWlIzNjA1N19WU1NGR1JfU25hcFNob3QgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgWlIzNjA1N19WU1NGR1JfRnJhbWVHcmFiICAgICAgICAoMTw8MCkKKworI2RlZmluZSBaUjM2MDU3X1ZEQ1IgICAgICAgICAgICAweDAxOAkvKiBWaWRlbyBEaXNwbGF5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWlIzNjA1N19WRENSX1ZpZEVuICAgICAgICAgICAgICAoMTw8MzEpCisjZGVmaW5lIFpSMzYwNTdfVkRDUl9NaW5QaXggICAgICAgICAgICAgMjQKKyNkZWZpbmUgWlIzNjA1N19WRENSX1RyaXRvbiAgICAgICAgICAgICAoMTw8MjQpCisjZGVmaW5lIFpSMzYwNTdfVkRDUl9WaWRXaW5IdCAgICAgICAgICAgMTIKKyNkZWZpbmUgWlIzNjA1N19WRENSX1ZpZFdpbldpZCAgICAgICAgICAwCisKKyNkZWZpbmUgWlIzNjA1N19NTVRSICAgICAgICAgICAgMHgwMWMJLyogTWFza2luZyBNYXAgIlRvcCIgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBaUjM2MDU3X01NQlIgICAgICAgICAgICAweDAyMAkvKiBNYXNraW5nIE1hcCAiQm90dG9tIiBSZWdpc3RlciAqLworCisjZGVmaW5lIFpSMzYwNTdfT0NSICAgICAgICAgICAgIDB4MDI0CS8qIE92ZXJsYXkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBaUjM2MDU3X09DUl9PdmxFbmFibGUgICAgICAgICAgICgxIDw8IDE1KQorI2RlZmluZSBaUjM2MDU3X09DUl9NYXNrU3RyaWRlICAgICAgICAgIDAKKworI2RlZmluZSBaUjM2MDU3X1NQR1BQQ1IgICAgICAgICAweDAyOAkvKiBTeXN0ZW0sIFBDSSwgYW5kIEdlbmVyYWwgUHVycG9zZSBQaW5zIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWlIzNjA1N19TUEdQUENSX1NvZnRSZXNldAkoMTw8MjQpCisKKyNkZWZpbmUgWlIzNjA1N19HUFBHQ1IxICAgICAgICAgMHgwMmMJLyogR2VuZXJhbCBQdXJwb3NlIFBpbnMgYW5kIEd1ZXN0QnVzIENvbnRyb2wgUmVnaXN0ZXIgKDEpICovCisKKyNkZWZpbmUgWlIzNjA1N19NQ1NBUiAgICAgICAgICAgMHgwMzAJLyogTVBFRyBDb2RlIFNvdXJjZSBBZGRyZXNzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgWlIzNjA1N19NQ1RDUiAgICAgICAgICAgMHgwMzQJLyogTVBFRyBDb2RlIFRyYW5zZmVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWlIzNjA1N19NQ1RDUl9Db2RUaW1lICAgICAgICAgICAoMSA8PCAzMCkKKyNkZWZpbmUgWlIzNjA1N19NQ1RDUl9DRW1wdHkgICAgICAgICAgICAoMSA8PCAyOSkKKyNkZWZpbmUgWlIzNjA1N19NQ1RDUl9DRmx1c2ggICAgICAgICAgICAoMSA8PCAyOCkKKyNkZWZpbmUgWlIzNjA1N19NQ1RDUl9Db2RHdWVzdElECTIwCisjZGVmaW5lIFpSMzYwNTdfTUNUQ1JfQ29kR3Vlc3RSZWcJMTYKKworI2RlZmluZSBaUjM2MDU3X01DTVBSICAgICAgICAgICAweDAzOAkvKiBNUEVHIENvZGUgTWVtb3J5IFBvaW50ZXIgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBaUjM2MDU3X0lTUiAgICAgICAgICAgICAweDAzYwkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFpSMzYwNTdfSVNSX0dJUlExICAgICAgICAgICAgICAgKDE8PDMwKQorI2RlZmluZSBaUjM2MDU3X0lTUl9HSVJRMCAgICAgICAgICAgICAgICgxPDwyOSkKKyNkZWZpbmUgWlIzNjA1N19JU1JfQ29kUmVwSVJRICAgICAgICAgICAoMTw8MjgpCisjZGVmaW5lIFpSMzYwNTdfSVNSX0pQRUdSZXBJUlEgICAgICAgICAgKDE8PDI3KQorCisjZGVmaW5lIFpSMzYwNTdfSUNSICAgICAgICAgICAgIDB4MDQwCS8qIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFpSMzYwNTdfSUNSX0dJUlExICAgICAgICAgICAgICAgKDE8PDMwKQorI2RlZmluZSBaUjM2MDU3X0lDUl9HSVJRMCAgICAgICAgICAgICAgICgxPDwyOSkKKyNkZWZpbmUgWlIzNjA1N19JQ1JfQ29kUmVwSVJRICAgICAgICAgICAoMTw8MjgpCisjZGVmaW5lIFpSMzYwNTdfSUNSX0pQRUdSZXBJUlEgICAgICAgICAgKDE8PDI3KQorI2RlZmluZSBaUjM2MDU3X0lDUl9JbnRQaW5FbiAgICAgICAgICAgICgxPDwyNCkKKworI2RlZmluZSBaUjM2MDU3X0kyQ0JSICAgICAgICAgICAweDA0NAkvKiBJMkMgQnVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFpSMzYwNTdfSTJDQlJfU0RBICAgICAgIAkoMTw8MSkKKyNkZWZpbmUgWlIzNjA1N19JMkNCUl9TQ0wgICAgICAgCSgxPDwwKQorCisjZGVmaW5lIFpSMzYwNTdfSk1DICAgICAgICAgICAgIDB4MTAwCS8qIEpQRUcgTW9kZSBhbmQgQ29udHJvbCAqLworI2RlZmluZSBaUjM2MDU3X0pNQ19KUEcgICAgICAgICAgICAgICAgICgxIDw8IDMxKQorI2RlZmluZSBaUjM2MDU3X0pNQ19KUEdFeHBNb2RlICAgICAgICAgICgwIDw8IDI5KQorI2RlZmluZSBaUjM2MDU3X0pNQ19KUEdDbXBNb2RlICAgICAgICAgICgxIDw8IDI5KQorI2RlZmluZSBaUjM2MDU3X0pNQ19NSlBHRXhwTW9kZSAgICAgICAgICgyIDw8IDI5KQorI2RlZmluZSBaUjM2MDU3X0pNQ19NSlBHQ21wTW9kZSAgICAgICAgICgzIDw8IDI5KQorI2RlZmluZSBaUjM2MDU3X0pNQ19SVEJVU1lfRkIgICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIFpSMzYwNTdfSk1DX0dvX2VuICAgICAgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgWlIzNjA1N19KTUNfU3luY01zdHIgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBaUjM2MDU3X0pNQ19GbGRfcGVyX2J1ZmYgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIFpSMzYwNTdfSk1DX1ZGSUZPX0ZCICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgWlIzNjA1N19KTUNfQ0ZJRk9fRkIgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBaUjM2MDU3X0pNQ19TdGxsX0xpdEVuZGlhbiAgICAgICgxIDw8IDApCisKKyNkZWZpbmUgWlIzNjA1N19KUEMgICAgICAgICAgICAgMHgxMDQJLyogSlBFRyBQcm9jZXNzIENvbnRyb2wgKi8KKyNkZWZpbmUgWlIzNjA1N19KUENfUF9SZXNldCAgICAgICAgICAgICAoMSA8PCA3KQorI2RlZmluZSBaUjM2MDU3X0pQQ19Db2RUcm5zRW4gICAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIFpSMzYwNTdfSlBDX0FjdGl2ZSAgICAgICAgICAgICAgKDEgPDwgMCkKKworI2RlZmluZSBaUjM2MDU3X1ZTUCAgICAgICAgICAgICAweDEwOAkvKiBWZXJ0aWNhbCBTeW5jIFBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgWlIzNjA1N19WU1BfVnN5bmNTaXplICAgICAgICAgICAxNgorI2RlZmluZSBaUjM2MDU3X1ZTUF9Gcm1Ub3QgICAgICAgICAgICAgIDAKKworI2RlZmluZSBaUjM2MDU3X0hTUCAgICAgICAgICAgICAweDEwYwkvKiBIb3Jpem9udGFsIFN5bmMgUGFyYW1ldGVycyAqLworI2RlZmluZSBaUjM2MDU3X0hTUF9Ic3luY1N0YXJ0ICAgICAgICAgIDE2CisjZGVmaW5lIFpSMzYwNTdfSFNQX0xpbmVUb3QgICAgICAgICAgICAgMAorCisjZGVmaW5lIFpSMzYwNTdfRkhBUCAgICAgICAgICAgIDB4MTEwCS8qIEZpZWxkIEhvcml6b250YWwgQWN0aXZlIFBvcnRpb24gKi8KKyNkZWZpbmUgWlIzNjA1N19GSEFQX05BWCAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBaUjM2MDU3X0ZIQVBfUEFYICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBaUjM2MDU3X0ZWQVAgICAgICAgICAgICAweDExNAkvKiBGaWVsZCBWZXJ0aWNhbCBBY3RpdmUgUG9ydGlvbiAqLworI2RlZmluZSBaUjM2MDU3X0ZWQVBfTkFZICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFpSMzYwNTdfRlZBUF9QQVkgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIFpSMzYwNTdfRlBQICAgICAgICAgICAgIDB4MTE4CS8qIEZpZWxkIFByb2Nlc3MgUGFyYW1ldGVycyAqLworI2RlZmluZSBaUjM2MDU3X0ZQUF9PZGRfRXZlbiAgICAgICAgICAgICgxIDw8IDApCisKKyNkZWZpbmUgWlIzNjA1N19KQ0JBICAgICAgICAgICAgMHgxMWMJLyogSlBFRyBDb2RlIEJhc2UgQWRkcmVzcyAqLworCisjZGVmaW5lIFpSMzYwNTdfSkNGVCAgICAgICAgICAgIDB4MTIwCS8qIEpQRUcgQ29kZSBGSUZPIFRocmVzaG9sZCAqLworCisjZGVmaW5lIFpSMzYwNTdfSkNHSSAgICAgICAgICAgIDB4MTI0CS8qIEpQRUcgQ29kZWMgR3Vlc3QgSUQgKi8KKyNkZWZpbmUgWlIzNjA1N19KQ0dJX0pQRUd1ZXN0SUQgICAgICAgICA0CisjZGVmaW5lIFpSMzYwNTdfSkNHSV9KUEVHdWVzdFJlZyAgICAgICAgMAorCisjZGVmaW5lIFpSMzYwNTdfR0NSMiAgICAgICAgICAgIDB4MTJjCS8qIEd1ZXN0QnVzIENvbnRyb2wgUmVnaXN0ZXIgKDIpICovCisKKyNkZWZpbmUgWlIzNjA1N19QT1IgICAgICAgICAgICAgMHgyMDAJLyogUG9zdCBPZmZpY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWlIzNjA1N19QT1JfUE9QZW4gICAgICAgICAgICAgICAoMTw8MjUpCisjZGVmaW5lIFpSMzYwNTdfUE9SX1BPVGltZSAgICAgICAgICAgICAgKDE8PDI0KQorI2RlZmluZSBaUjM2MDU3X1BPUl9QT0RpciAgICAgICAgICAgICAgICgxPDwyMykKKworI2RlZmluZSBaUjM2MDU3X1NUUiAgICAgICAgICAgICAweDMwMAkvKiAiU3RpbGwiIFRyYW5zZmVyIFJlZ2lzdGVyICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDYwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBkYzQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDYwLmMKQEAgLTAsMCArMSwxMDE2IEBACisvKgorICogWm9yYW4gWlIzNjA2MCBiYXNpYyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZT4KKyAqCisgKiAkSWQ6IHpyMzYwNjAuYyx2IDEuMS4yLjIyIDIwMDMvMDUvMDYgMDk6MzU6MzYgcmJ1bHRqZSBFeHAgJAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgWlIwNjBfVkVSU0lPTiAidjAuNyIKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworLyogaW5jbHVkZXMgZm9yIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMgcmVnYXJkaW5nIHZpZGVvIAorICAgI2luY2x1ZGU8bGludXgvdmlkZW9kZXYuaD4gKi8KKworLyogSS9PIGNvbW1hbmRzLCBlcnJvciBjb2RlcyAqLworI2luY2x1ZGU8YXNtL2lvLmg+CisvLyNpbmNsdWRlPGVycm5vLmg+CisKKy8qIGhlYWRlcmZpbGUgb2YgdGhpcyBtb2R1bGUgKi8KKyNpbmNsdWRlInpyMzYwNjAuaCIKKworLyogY29kZWMgaW8gQVBJICovCisjaW5jbHVkZSJ2aWRlb2NvZGVjLmgiCisKKy8qIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIG1vcmUgdGhhbiAyMCBvciBzbywKKyAganVzdCB0byBwcmV2ZW50IHNvbWUgdW53YW50ZWQgbG9vcHMgKi8KKyNkZWZpbmUgTUFYX0NPREVDUyAyMAorCisvKiBhbW91bnQgb2YgY2hpcHMgYXR0YWNoZWQgdmlhIHRoaXMgZHJpdmVyICovCitzdGF0aWMgaW50IHpyMzYwNjBfY29kZWNzID0gMDsKKworc3RhdGljIGludCBsb3dfYml0cmF0ZSA9IDA7Cittb2R1bGVfcGFyYW0obG93X2JpdHJhdGUsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhsb3dfYml0cmF0ZSwgIkJ1eiBjb21wYXRpYmlsaXR5IG9wdGlvbiwgaGFsdmVzIGJpdHJhdGUiKTsKKworLyogZGVidWdnaW5nIGlzIGF2YWlsYWJsZSB2aWEgbW9kdWxlIHBhcmFtZXRlciAqLworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtNCkiKTsKKworI2RlZmluZSBkcHJpbnRrKG51bSwgZm9ybWF0LCBhcmdzLi4uKSBcCisJZG8geyBcCisJCWlmIChkZWJ1ZyA+PSBudW0pIFwKKwkJCXByaW50ayhmb3JtYXQsICMjYXJncyk7IFwKKwl9IHdoaWxlICgwKQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBMb2NhbCBoYXJkd2FyZSBJL08gZnVuY3Rpb25zOgorCisgICByZWFkL3dyaXRlIHZpYSBjb2RlYyBsYXllciAocmVnaXN0ZXJzIGFyZSBsb2NhdGVkIGluIHRoZSBtYXN0ZXIgZGV2aWNlKQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiByZWFkIGFuZCB3cml0ZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyB1OAorenIzNjA2MF9yZWFkIChzdHJ1Y3QgenIzNjA2MCAqcHRyLAorCSAgICAgIHUxNiAgICAgICAgICAgICByZWcpCit7CisJdTggdmFsdWUgPSAwOworCisJLy8ganVzdCBpbiBjYXNlIHNvbWV0aGluZyBpcyB3cm9uZy4uLgorCWlmIChwdHItPmNvZGVjLT5tYXN0ZXJfZGF0YS0+cmVhZHJlZykKKwkJdmFsdWUgPSAocHRyLT5jb2RlYy0+bWFzdGVyX2RhdGEtPnJlYWRyZWcocHRyLT5jb2RlYywKKwkJCQkJCQkgIHJlZykpICYgMHhmZjsKKwllbHNlCisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSICIlczogaW52YWxpZCBJL08gc2V0dXAsIG5vdGhpbmcgcmVhZCFcbiIsCisJCQlwdHItPm5hbWUpOworCisJLy9kcHJpbnRrKDQsICIlczogcmVhZGluZyBmcm9tIDB4JTA0eDogJTAyeFxuIixwdHItPm5hbWUscmVnLHZhbHVlKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQKK3pyMzYwNjBfd3JpdGUoc3RydWN0IHpyMzYwNjAgKnB0ciwKKwkgICAgICB1MTYgICAgICAgICAgICAgcmVnLAorCSAgICAgIHU4ICAgICAgICAgICAgICB2YWx1ZSkKK3sKKwkvL2RwcmludGsoNCwgIiVzOiB3cml0aW5nIDB4JTAyeCB0byAweCUwNHhcbiIscHRyLT5uYW1lLHZhbHVlLHJlZyk7CisJZHByaW50ayg0LCAiMHglMDJ4IEAweCUwNHhcbiIsIHZhbHVlLCByZWcpOworCisJLy8ganVzdCBpbiBjYXNlIHNvbWV0aGluZyBpcyB3cm9uZy4uLgorCWlmIChwdHItPmNvZGVjLT5tYXN0ZXJfZGF0YS0+d3JpdGVyZWcpCisJCXB0ci0+Y29kZWMtPm1hc3Rlcl9kYXRhLT53cml0ZXJlZyhwdHItPmNvZGVjLCByZWcsIHZhbHVlKTsKKwllbHNlCisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IGludmFsaWQgSS9PIHNldHVwLCBub3RoaW5nIHdyaXR0ZW4hXG4iLAorCQkJcHRyLT5uYW1lKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgTG9jYWwgaGVscGVyIGZ1bmN0aW9uOgorCisgICBzdGF0dXMgcmVhZAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBzdGF0dXMgaXMga2VwdCBpbiBkYXRhc3RydWN0dXJlICovCitzdGF0aWMgdTgKK3pyMzYwNjBfcmVhZF9zdGF0dXMgKHN0cnVjdCB6cjM2MDYwICpwdHIpCit7CisJcHRyLT5zdGF0dXMgPSB6cjM2MDYwX3JlYWQocHRyLCBaUjA2MF9DRlNSKTsKKworCXpyMzYwNjBfcmVhZChwdHIsIDApOworCXJldHVybiBwdHItPnN0YXR1czsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgTG9jYWwgaGVscGVyIGZ1bmN0aW9uOgorCisgICBzY2FsZSBmYWN0b3IgcmVhZAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBzY2FsZSBmYWN0b3IgaXMga2VwdCBpbiBkYXRhc3RydWN0dXJlICovCitzdGF0aWMgdTE2Cit6cjM2MDYwX3JlYWRfc2NhbGVmYWN0b3IgKHN0cnVjdCB6cjM2MDYwICpwdHIpCit7CisJcHRyLT5zY2FsZWZhY3QgPSAoenIzNjA2MF9yZWFkKHB0ciwgWlIwNjBfU0ZfSEkpIDw8IDgpIHwKKwkJCSAoenIzNjA2MF9yZWFkKHB0ciwgWlIwNjBfU0ZfTE8pICYgMHhGRik7CisKKwkvKiBsZWF2ZSAwIHNlbGVjdGVkIGZvciBhbiBldmVudHVhbGx5IEdPIGZyb20gbWFzdGVyICovCisJenIzNjA2MF9yZWFkKHB0ciwgMCk7CisJcmV0dXJuIHB0ci0+c2NhbGVmYWN0OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBMb2NhbCBoZWxwZXIgZnVuY3Rpb246CisKKyAgIHdhaXQgaWYgY29kZWMgaXMgcmVhZHkgdG8gcHJvY2VlZCAoZW5kIG9mIHByb2Nlc3NpbmcpIG9yIHRpbWUgaXMgb3ZlcgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgdm9pZAorenIzNjA2MF93YWl0X2VuZCAoc3RydWN0IHpyMzYwNjAgKnB0cikKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoenIzNjA2MF9yZWFkX3N0YXR1cyhwdHIpICYgWlIwNjBfQ0ZTUl9CdXN5KSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKGkrKyA+IDIwMDAwMCkgewkvLyAyMDBtcywgdGhlcmUgaXMgZm9yIHNodXJlIHNvbWV0aGluZyB3cm9uZyEhIQorCQkJZHByaW50aygxLAorCQkJCSIlczogdGltb3V0IGF0IHdhaXRfZW5kIChsYXN0IHN0YXR1czogMHglMDJ4KVxuIiwKKwkJCQlwdHItPm5hbWUsIHB0ci0+c3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBMb2NhbCBoZWxwZXIgZnVuY3Rpb246CisKKyAgIGJhc2ljIHRlc3Qgb2YgImNvbm5lY3Rpdml0eSIsIHdyaXRlcy9yZWFkcyB0by9mcm9tIG1lbW9yeSB0aGUgU09GIG1hcmtlciAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGludAorenIzNjA2MF9iYXNpY190ZXN0IChzdHJ1Y3QgenIzNjA2MCAqcHRyKQoreworCWlmICgoenIzNjA2MF9yZWFkKHB0ciwgWlIwNjBfSURSX0RFVikgIT0gMHgzMykgJiYKKwkgICAgKHpyMzYwNjBfcmVhZChwdHIsIFpSMDYwX0lEUl9SRVYpICE9IDB4MDEpKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IGF0dGFjaCBmYWlsZWQsIGNhbid0IGNvbm5lY3QgdG8ganBlZyBwcm9jZXNzb3IhXG4iLAorCQkJcHRyLT5uYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwl6cjM2MDYwX3dhaXRfZW5kKHB0cik7CisJaWYgKHB0ci0+c3RhdHVzICYgWlIwNjBfQ0ZTUl9CdXN5KSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IGF0dGFjaCBmYWlsZWQsIGpwZWcgcHJvY2Vzc29yIGZhaWxlZCAoZW5kIGZsYWcpIVxuIiwKKwkJCXB0ci0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7CQkvKiBsb29rcyBnb29kISAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBMb2NhbCBoZWxwZXIgZnVuY3Rpb246CisKKyAgIHNpbXBsZSBsb29wIGZvciBwdXNoaW5nIHRoZSBpbml0IGRhdGFzZXRzCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBpbnQKK3pyMzYwNjBfcHVzaGl0IChzdHJ1Y3QgenIzNjA2MCAqcHRyLAorCSAgICAgICAgdTE2ICAgICAgICAgICAgIHN0YXJ0cmVnLAorCSAgICAgICAgdTE2ICAgICAgICAgICAgIGxlbiwKKwkgICAgICAgIGNvbnN0IGNoYXIgICAgICpkYXRhKQoreworCWludCBpID0gMDsKKworCWRwcmludGsoNCwgIiVzOiB3cml0ZSBkYXRhIGJsb2NrIHRvIDB4JTA0eCAobGVuPSVkKVxuIiwgcHRyLT5uYW1lLAorCQlzdGFydHJlZywgbGVuKTsKKwl3aGlsZSAoaSA8IGxlbikgeworCQl6cjM2MDYwX3dyaXRlKHB0ciwgc3RhcnRyZWcrKywgZGF0YVtpKytdKTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgQmFzaWMgZGF0YXNldHM6CisKKyAgIGpwZWcgYmFzZWxpbmUgc2V0dXAgZGF0YSAoeW91IGZpbmQgaXQgb24gbG90cyBwbGFjZXMgaW4gaW50ZXJuZXQsIG9yIGp1c3QKKyAgIGV4dHJhY3QgaXQgZnJvbSBhbnkgcmVndWxhciAuanBnIGltYWdlLi4uKQorCisgICBDb3VsZCBiZSB2YXJpYWJsZSwgYnV0IHVudGlsIGl0J3Mgbm90IG5lZWRlZCBpdCB0aGV5IGFyZSBqdXN0IGZpeGVkIHRvIHNhdmUKKyAgIG1lbW9yeS4gT3RoZXJ3aXNlIGV4cGFuZCB6cjM2MDYwIHN0cnVjdHVyZSB3aXRoIGFycmF5cywgcHVzaCB0aGUgdmFsdWVzIHRvCisgICBpdCBhbmQgaW5pdGFsaXplIGZyb20gdGhlcmUsIGFzIGUuZy4gdGhlIGxpbnV4IHpyMzYwNTcvNjAgZHJpdmVyIGRvZXMgaXQuCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHpyMzYwNjBfZHF0WzB4ODZdID0geworCTB4ZmYsIDB4ZGIsCQkvL01hcmtlcjogRFFUCisJMHgwMCwgMHg4NCwJCS8vTGVuZ3RoOiAyKjY1KzIKKwkweDAwLAkJCS8vUHEsVHEgZmlyc3QgdGFibGUKKwkweDEwLCAweDBiLCAweDBjLCAweDBlLCAweDBjLCAweDBhLCAweDEwLCAweDBlLAorCTB4MGQsIDB4MGUsIDB4MTIsIDB4MTEsIDB4MTAsIDB4MTMsIDB4MTgsIDB4MjgsCisJMHgxYSwgMHgxOCwgMHgxNiwgMHgxNiwgMHgxOCwgMHgzMSwgMHgyMywgMHgyNSwKKwkweDFkLCAweDI4LCAweDNhLCAweDMzLCAweDNkLCAweDNjLCAweDM5LCAweDMzLAorCTB4MzgsIDB4MzcsIDB4NDAsIDB4NDgsIDB4NWMsIDB4NGUsIDB4NDAsIDB4NDQsCisJMHg1NywgMHg0NSwgMHgzNywgMHgzOCwgMHg1MCwgMHg2ZCwgMHg1MSwgMHg1NywKKwkweDVmLCAweDYyLCAweDY3LCAweDY4LCAweDY3LCAweDNlLCAweDRkLCAweDcxLAorCTB4NzksIDB4NzAsIDB4NjQsIDB4NzgsIDB4NWMsIDB4NjUsIDB4NjcsIDB4NjMsCisJMHgwMSwJCQkvL1BxLFRxIHNlY29uZCB0YWJsZQorCTB4MTEsIDB4MTIsIDB4MTIsIDB4MTgsIDB4MTUsIDB4MTgsIDB4MmYsIDB4MWEsCisJMHgxYSwgMHgyZiwgMHg2MywgMHg0MiwgMHgzOCwgMHg0MiwgMHg2MywgMHg2MywKKwkweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCTB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywKKwkweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCTB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgenIzNjA2MF9kaHRbMHgxYTRdID0geworCTB4ZmYsIDB4YzQsCQkvL01hcmtlcjogREhUCisJMHgwMSwgMHhhMiwJCS8vTGVuZ3RoOiAyKkFDLCAyKkRDCisJMHgwMCwJCQkvL0RDIGZpcnN0IHRhYmxlCisJMHgwMCwgMHgwMSwgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAorCTB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsCisJMHgwMSwJCQkvL0RDIHNlY29uZCB0YWJsZQorCTB4MDAsIDB4MDMsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKKwkweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLAorCTB4MTAsCQkJLy9BQyBmaXJzdCB0YWJsZQorCTB4MDAsIDB4MDIsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDQsIDB4MDMsCisJMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwKKwkweDAxLCAweDdELCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLAorCTB4MDUsIDB4MTIsIDB4MjEsIDB4MzEsIDB4NDEsIDB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsCisJMHgwNywgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhBMSwKKwkweDA4LCAweDIzLCAweDQyLCAweEIxLCAweEMxLCAweDE1LCAweDUyLCAweEQxLCAweEYwLCAweDI0LAorCTB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MEEsIDB4MTYsIDB4MTcsCisJMHgxOCwgMHgxOSwgMHgxQSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgzNCwKKwkweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLCAweDQzLCAweDQ0LAorCTB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NEEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsCisJMHg1NywgMHg1OCwgMHg1OSwgMHg1QSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwKKwkweDY3LCAweDY4LCAweDY5LCAweDZBLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAorCTB4NzksIDB4N0EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsCisJMHg4OSwgMHg4QSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwKKwkweDlBLCAweEEyLCAweEEzLCAweEE0LCAweEE1LCAweEE2LCAweEE3LCAweEE4LAorCTB4QTksIDB4QUEsIDB4QjIsIDB4QjMsIDB4QjQsIDB4QjUsIDB4QjYsIDB4QjcsIDB4QjgsIDB4QjksCisJMHhCQSwgMHhDMiwgMHhDMywgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNywgMHhDOCwKKwkweEM5LCAweENBLCAweEQyLCAweEQzLCAweEQ0LCAweEQ1LCAweEQ2LCAweEQ3LCAweEQ4LCAweEQ5LAorCTB4REEsIDB4RTEsIDB4RTIsIDB4RTMsIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsCisJMHhFOCwgMHhFOSwgMHhFQSwgMHhGMSwgMHhGMiwgMHhGMywgMHhGNCwgMHhGNSwgMHhGNiwgMHhGNywKKwkweEY4LCAweEY5LCAweEZBLAorCTB4MTEsCQkJLy9BQyBzZWNvbmQgdGFibGUKKwkweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LCAweDA0LCAweDAzLCAweDA0LAorCTB4MDcsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDEsCisJMHgwMiwgMHg3NywgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwKKwkweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLAorCTB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsCisJMHhBMSwgMHhCMSwgMHhDMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhGMCwgMHgxNSwgMHg2MiwKKwkweDcyLCAweEQxLCAweDBBLCAweDE2LCAweDI0LCAweDM0LCAweEUxLCAweDI1LAorCTB4RjEsIDB4MTcsIDB4MTgsIDB4MTksIDB4MUEsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MkEsCisJMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwgMHg0MywgMHg0NCwKKwkweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRBLCAweDUzLCAweDU0LCAweDU1LCAweDU2LAorCTB4NTcsIDB4NTgsIDB4NTksIDB4NUEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsCisJMHg2NywgMHg2OCwgMHg2OSwgMHg2QSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKKwkweDc5LCAweDdBLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorCTB4ODgsIDB4ODksIDB4OEEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsCisJMHg5OSwgMHg5QSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNSwgMHhBNiwgMHhBNywKKwkweEE4LCAweEE5LCAweEFBLCAweEIyLCAweEIzLCAweEI0LCAweEI1LCAweEI2LCAweEI3LCAweEI4LAorCTB4QjksIDB4QkEsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsCisJMHhDOCwgMHhDOSwgMHhDQSwgMHhEMiwgMHhEMywgMHhENCwgMHhENSwgMHhENiwgMHhENywgMHhEOCwKKwkweEQ5LCAweERBLCAweEUyLCAweEUzLCAweEU0LCAweEU1LCAweEU2LCAweEU3LAorCTB4RTgsIDB4RTksIDB4RUEsIDB4RjIsIDB4RjMsIDB4RjQsIDB4RjUsIDB4RjYsIDB4RjcsIDB4RjgsCisJMHhGOSwgMHhGQQorfTsKKworLyoganBlZyBiYXNlbGluZSBzZXR1cCwgdGhpcyBpcyBqdXN0IGZpeGVkIGluIHRoaXMgZHJpdmVyIChZVVYgcGljdHVyZXMpICovCisjZGVmaW5lIE5PX09GX0NPTVBPTkVOVFMgICAgICAgICAgMHgzCS8vWSxVLFYKKyNkZWZpbmUgQkFTRUxJTkVfUFJFQ0lTSU9OICAgICAgICAweDgJLy9NQ1Ugc2l6ZSAoPykKK3N0YXRpYyBjb25zdCBjaGFyIHpyMzYwNjBfdHFbOF0gPSB7IDAsIDEsIDEsIDAsIDAsIDAsIDAsIDAgfTsJLy90YWJsZSBpZHgncyBRVAorc3RhdGljIGNvbnN0IGNoYXIgenIzNjA2MF90ZFs4XSA9IHsgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCB9OwkvL3RhYmxlIGlkeCdzIERDCitzdGF0aWMgY29uc3QgY2hhciB6cjM2MDYwX3RhWzhdID0geyAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07CS8vdGFibGUgaWR4J3MgQUMKKworLyogaG9yaXpvbnRhbCA0MjIgZGVjaW1hdGlvbiBzZXR1cCAobWF5YmUgd2Ugc3VwcG9ydCA0MTEgb3Igc28gbGF0ZXIsIHRvbykgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHpyMzYwNjBfZGVjaW1hdGlvbl9oWzhdID0geyAyLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07CitzdGF0aWMgY29uc3QgY2hhciB6cjM2MDYwX2RlY2ltYXRpb25fdls4XSA9IHsgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCB9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBMb2NhbCBoZWxwZXIgZnVuY3Rpb25zOgorCisgICBjYWxjdWxhdGlvbiBhbmQgc2V0dXAgb2YgcGFyYW1ldGVyLWRlcGVuZGVudCBKUEVHIGJhc2VsaW5lIHNlZ21lbnRzCisgICAobmVlZGVkIGZvciBjb21wcmVzc2lvbiBvbmx5KQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFNPRiAoc3RhcnQgb2YgZnJhbWUpIHNlZ21lbnQgZGVwZW5kcyBvbiB3aWR0aCwgaGVpZ2h0IGFuZCBzYW1wbGluZyByYXRpbworICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGVhY2ggY29sb3IgY29tcG9uZW50ICovCisKK3N0YXRpYyBpbnQKK3pyMzYwNjBfc2V0X3NvZiAoc3RydWN0IHpyMzYwNjAgKnB0cikKK3sKKwljaGFyIHNvZl9kYXRhWzM0XTsJLy8gbWF4LiBzaXplIG9mIHJlZ2lzdGVyIHNldAorCWludCBpOworCisJZHByaW50aygzLCAiJXM6IHdyaXRlIFNPRiAoJWR4JWQsICVkIGNvbXBvbmVudHMpXG4iLCBwdHItPm5hbWUsCisJCXB0ci0+d2lkdGgsIHB0ci0+aGVpZ2h0LCBOT19PRl9DT01QT05FTlRTKTsKKwlzb2ZfZGF0YVswXSA9IDB4ZmY7CisJc29mX2RhdGFbMV0gPSAweGMwOworCXNvZl9kYXRhWzJdID0gMHgwMDsKKwlzb2ZfZGF0YVszXSA9ICgzICogTk9fT0ZfQ09NUE9ORU5UUykgKyA4OworCXNvZl9kYXRhWzRdID0gQkFTRUxJTkVfUFJFQ0lTSU9OOwkvLyBvbmx5ICc4JyBwb3NzaWJsZSB3aXRoIHpyMzYwNjAKKwlzb2ZfZGF0YVs1XSA9IChwdHItPmhlaWdodCkgPj4gODsKKwlzb2ZfZGF0YVs2XSA9IChwdHItPmhlaWdodCkgJiAweGZmOworCXNvZl9kYXRhWzddID0gKHB0ci0+d2lkdGgpID4+IDg7CisJc29mX2RhdGFbOF0gPSAocHRyLT53aWR0aCkgJiAweGZmOworCXNvZl9kYXRhWzldID0gTk9fT0ZfQ09NUE9ORU5UUzsKKwlmb3IgKGkgPSAwOyBpIDwgTk9fT0ZfQ09NUE9ORU5UUzsgaSsrKSB7CisJCXNvZl9kYXRhWzEwICsgKGkgKiAzKV0gPSBpOwkvLyBpbmRleCBpZGVudGlmaWVyCisJCXNvZl9kYXRhWzExICsgKGkgKiAzKV0gPSAocHRyLT5oX3NhbXBfcmF0aW9baV0gPDwgNCkgfAorCQkJCQkgKHB0ci0+dl9zYW1wX3JhdGlvW2ldKTsgLy8gc2FtcGxpbmcgcmF0aW9zCisJCXNvZl9kYXRhWzEyICsgKGkgKiAzKV0gPSB6cjM2MDYwX3RxW2ldOwkvLyBRIHRhYmxlIHNlbGVjdGlvbgorCX0KKwlyZXR1cm4genIzNjA2MF9wdXNoaXQocHRyLCBaUjA2MF9TT0ZfSURYLAorCQkJICAgICAgKDMgKiBOT19PRl9DT01QT05FTlRTKSArIDEwLCBzb2ZfZGF0YSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogU09TIChzdGFydCBvZiBzY2FuKSBzZWdtZW50IGRlcGVuZHMgb24gdGhlIHVzZWQgc2NhbiBjb21wb25lbnRzIAorICAgICAgICAgICAgICAgICAgICAgICAgb2YgZWFjaCBjb2xvciBjb21wb25lbnQgKi8KKworc3RhdGljIGludAorenIzNjA2MF9zZXRfc29zIChzdHJ1Y3QgenIzNjA2MCAqcHRyKQoreworCWNoYXIgc29zX2RhdGFbMTZdOwkvLyBtYXguIHNpemUgb2YgcmVnaXN0ZXIgc2V0CisJaW50IGk7CisKKwlkcHJpbnRrKDMsICIlczogd3JpdGUgU09TXG4iLCBwdHItPm5hbWUpOworCXNvc19kYXRhWzBdID0gMHhmZjsKKwlzb3NfZGF0YVsxXSA9IDB4ZGE7CisJc29zX2RhdGFbMl0gPSAweDAwOworCXNvc19kYXRhWzNdID0gMiArIDEgKyAoMiAqIE5PX09GX0NPTVBPTkVOVFMpICsgMzsKKwlzb3NfZGF0YVs0XSA9IE5PX09GX0NPTVBPTkVOVFM7CisJZm9yIChpID0gMDsgaSA8IE5PX09GX0NPTVBPTkVOVFM7IGkrKykgeworCQlzb3NfZGF0YVs1ICsgKGkgKiAyKV0gPSBpOwkvLyBpbmRleAorCQlzb3NfZGF0YVs2ICsgKGkgKiAyKV0gPSAoenIzNjA2MF90ZFtpXSA8PCA0KSB8CisJCQkJICAgICAgICB6cjM2MDYwX3RhW2ldOyAvLyBBQy9EQyB0Ymwuc2VsLgorCX0KKwlzb3NfZGF0YVsyICsgMSArICgyICogTk9fT0ZfQ09NUE9ORU5UUykgKyAyXSA9IDAwOwkvLyBzY2FuIHN0YXJ0CisJc29zX2RhdGFbMiArIDEgKyAoMiAqIE5PX09GX0NPTVBPTkVOVFMpICsgM10gPSAweDNmOworCXNvc19kYXRhWzIgKyAxICsgKDIgKiBOT19PRl9DT01QT05FTlRTKSArIDRdID0gMDA7CisJcmV0dXJuIHpyMzYwNjBfcHVzaGl0KHB0ciwgWlIwNjBfU09TX0lEWCwKKwkJCSAgICAgIDQgKyAxICsgKDIgKiBOT19PRl9DT01QT05FTlRTKSArIDMsCisJCQkgICAgICBzb3NfZGF0YSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRFJJIChkZWZpbmUgcmVzdGFydCBpbnRlcnZhbCkgKi8KKworc3RhdGljIGludAorenIzNjA2MF9zZXRfZHJpIChzdHJ1Y3QgenIzNjA2MCAqcHRyKQoreworCWNoYXIgZHJpX2RhdGFbNl07CS8vIG1heC4gc2l6ZSBvZiByZWdpc3RlciBzZXQKKworCWRwcmludGsoMywgIiVzOiB3cml0ZSBEUklcbiIsIHB0ci0+bmFtZSk7CisJZHJpX2RhdGFbMF0gPSAweGZmOworCWRyaV9kYXRhWzFdID0gMHhkZDsKKwlkcmlfZGF0YVsyXSA9IDB4MDA7CisJZHJpX2RhdGFbM10gPSAweDA0OworCWRyaV9kYXRhWzRdID0gKHB0ci0+ZHJpKSA+PiA4OworCWRyaV9kYXRhWzVdID0gKHB0ci0+ZHJpKSAmIDB4ZmY7CisJcmV0dXJuIHpyMzYwNjBfcHVzaGl0KHB0ciwgWlIwNjBfRFJJX0lEWCwgNiwgZHJpX2RhdGEpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBTZXR1cCBmdW5jdGlvbjoKKworICAgU2V0dXAgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBvZiBab3JhbidzIEpQRUcgcHJvY2Vzc29yCisgICAoIHNlZSBhbHNvIHpvcmFuIDM2MDYwIG1hbnVhbCApCisKKyAgIC4uLiBzb3JyeSBmb3IgdGhlIHNwYWdoZXR0aSBjb2RlIC4uLgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIHZvaWQKK3pyMzYwNjBfaW5pdCAoc3RydWN0IHpyMzYwNjAgKnB0cikKK3sKKwlpbnQgc3VtID0gMDsKKwlsb25nIGJpdGNudCwgdG1wOworCisJaWYgKHB0ci0+bW9kZSA9PSBDT0RFQ19ET19DT01QUkVTU0lPTikgeworCQlkcHJpbnRrKDIsICIlczogQ09NUFJFU1NJT04gU0VUVVBcbiIsIHB0ci0+bmFtZSk7CisKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0xPQUQsIFpSMDYwX0xPQURfU3luY1JzdCk7CisKKwkJLyogMDYwIGNvbW11bmljYXRlcyB3aXRoIDA2NyBpbiBtYXN0ZXIgbW9kZSAqLworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfQ0lSLCBaUjA2MF9DSVJfQ29kZU1zdHIpOworCisJCS8qIENvbXByZXNzaW9uIHdpdGggb3Igd2l0aG91dCB2YXJpYWJsZSBzY2FsZSBmYWN0b3IgKi8KKwkJLypGSVhNRTogV2hhdCBhYm91dCBwdHItPmJpdHJhdGVfY3RybD8gKi8KKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0NNUiwKKwkJCSAgICAgIFpSMDYwX0NNUl9Db21wIHwgWlIwNjBfQ01SX1Bhc3MyIHwKKwkJCSAgICAgIFpSMDYwX0NNUl9CUkIpOworCisJCS8qIE11c3QgYmUgemVybyAqLworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfTUJaLCAweDAwKTsKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1RDUl9ISSwgMHgwMCk7CisJCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9UQ1JfTE8sIDB4MDApOworCisJCS8qIERpc2FibGUgYWxsIElSUXMgLSBubyBEYXRhRXJyIG1lYW5zIGF1dG9yZXNldCAqLworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfSU1SLCAwKTsKKworCQkvKiB2b2x1bWUgY29udHJvbCBzZXR0aW5ncyAqLworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfU0ZfSEksIHB0ci0+c2NhbGVmYWN0ID4+IDgpOworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfU0ZfTE8sIHB0ci0+c2NhbGVmYWN0ICYgMHhmZik7CisKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0FGX0hJLCAweGZmKTsKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0FGX00sIDB4ZmYpOworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfQUZfTE8sIDB4ZmYpOworCisJCS8qIHNldHVwIHRoZSB2YXJpYWJsZSBqcGVnIHRhYmxlcyAqLworCQlzdW0gKz0genIzNjA2MF9zZXRfc29mKHB0cik7CisJCXN1bSArPSB6cjM2MDYwX3NldF9zb3MocHRyKTsKKwkJc3VtICs9IHpyMzYwNjBfc2V0X2RyaShwdHIpOworCisJCS8qIHNldHVwIHRoZSBmaXhlZCBqcGVnIHRhYmxlcyAtIG1heWJlIHZhcmlhYmxlLCB0aG91Z2ggLQorCQkgKiAoc2VlIHRhYmxlIGluaXQgc2VjdGlvbiBhYm92ZSkgKi8KKwkJc3VtICs9CisJCSAgICB6cjM2MDYwX3B1c2hpdChwdHIsIFpSMDYwX0RRVF9JRFgsIHNpemVvZih6cjM2MDYwX2RxdCksCisJCQkJICAgenIzNjA2MF9kcXQpOworCQlzdW0gKz0KKwkJICAgIHpyMzYwNjBfcHVzaGl0KHB0ciwgWlIwNjBfREhUX0lEWCwgc2l6ZW9mKHpyMzYwNjBfZGh0KSwKKwkJCQkgICB6cjM2MDYwX2RodCk7CisJCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9BUFBfSURYLCAweGZmKTsKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0FQUF9JRFggKyAxLCAweGUwICsgcHRyLT5hcHAuYXBwbik7CisJCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9BUFBfSURYICsgMiwgMHgwMCk7CisJCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9BUFBfSURYICsgMywgcHRyLT5hcHAubGVuICsgMik7CisJCXN1bSArPSB6cjM2MDYwX3B1c2hpdChwdHIsIFpSMDYwX0FQUF9JRFggKyA0LCA2MCwKKwkJCQkgICAgICBwdHItPmFwcC5kYXRhKSArIDQ7CisJCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9DT01fSURYLCAweGZmKTsKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0NPTV9JRFggKyAxLCAweGZlKTsKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0NPTV9JRFggKyAyLCAweDAwKTsKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0NPTV9JRFggKyAzLCBwdHItPmNvbS5sZW4gKyAyKTsKKwkJc3VtICs9IHpyMzYwNjBfcHVzaGl0KHB0ciwgWlIwNjBfQ09NX0lEWCArIDQsIDYwLAorCQkJCSAgICAgIHB0ci0+Y29tLmRhdGEpICsgNDsKKworCQkvKiBzZXR1cCBtaXNjLiBkYXRhIGZvciBjb21wcmVzc2lvbiAodGFyZ2V0IGNvZGUgc2l6ZXMpICovCisKKwkJLyogc2l6ZSBvZiBjb21wcmVzc2VkIGNvZGUgdG8gcmVhY2ggd2l0aG91dCBoZWFkZXIgZGF0YSAqLworCQlzdW0gPSBwdHItPnJlYWxfY29kZV92b2wgLSBzdW07CisJCWJpdGNudCA9IHN1bSA8PCAzOwkvKiBuZWVkIHRoZSBzaXplIGluIGJpdHMgKi8KKworCQl0bXAgPSBiaXRjbnQgPj4gMTY7CisJCWRwcmludGsoMywKKwkJCSIlczogY29kZTogY3NpemU9JWQsIHRvdD0lZCwgYml0PSVsZCwgaGlnaGJpdHM9JWxkXG4iLAorCQkJcHRyLT5uYW1lLCBzdW0sIHB0ci0+cmVhbF9jb2RlX3ZvbCwgYml0Y250LCB0bXApOworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfVENWX05FVF9ISSwgdG1wID4+IDgpOworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfVENWX05FVF9NSCwgdG1wICYgMHhmZik7CisJCXRtcCA9IGJpdGNudCAmIDB4ZmZmZjsKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1RDVl9ORVRfTUwsIHRtcCA+PiA4KTsKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1RDVl9ORVRfTE8sIHRtcCAmIDB4ZmYpOworCisJCWJpdGNudCAtPSBiaXRjbnQgPj4gNzsJLy8gYml0cyB3aXRob3V0IHN0dWZmaW5nCisJCWJpdGNudCAtPSAoKGJpdGNudCAqIDUpID4+IDYpOwkvLyBiaXRzIHdpdGhvdXQgZW9iCisKKwkJdG1wID0gYml0Y250ID4+IDE2OworCQlkcHJpbnRrKDMsICIlczogY29kZTogbmV0dG9iaXQ9JWxkLCBoaWdobmV0dG9iaXRzPSVsZFxuIiwKKwkJCXB0ci0+bmFtZSwgYml0Y250LCB0bXApOworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfVENWX0RBVEFfSEksIHRtcCA+PiA4KTsKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1RDVl9EQVRBX01ILCB0bXAgJiAweGZmKTsKKwkJdG1wID0gYml0Y250ICYgMHhmZmZmOworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfVENWX0RBVEFfTUwsIHRtcCA+PiA4KTsKKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1RDVl9EQVRBX0xPLCB0bXAgJiAweGZmKTsKKworCQkvKiBKUEVHIG1hcmtlcnMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbXByZXNzZWQgc3RyZWFtICovCisJCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9NRVIsCisJCQkgICAgICBaUjA2MF9NRVJfRFFUIHwgWlIwNjBfTUVSX0RIVCB8CisJCQkgICAgICAoKHB0ci0+Y29tLmxlbiA+IDApID8gWlIwNjBfTUVSX0NvbSA6IDApIHwKKwkJCSAgICAgICgocHRyLT5hcHAubGVuID4gMCkgPyBaUjA2MF9NRVJfQXBwIDogMCkpOworCisJCS8qIFNldHVwIHRoZSBWaWRlbyBGcm9udGVuZCAqLworCQkvKiBMaW1pdCBwaXhlbCByYW5nZSB0byAxNi4uMjM1IGFzIHBlciBDQ0lSLTYwMSAqLworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfVkNSLCBaUjA2MF9WQ1JfUmFuZ2UpOworCisJfSBlbHNlIHsKKwkJZHByaW50aygyLCAiJXM6IEVYUEFOU0lPTiBTRVRVUFxuIiwgcHRyLT5uYW1lKTsKKworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfTE9BRCwgWlIwNjBfTE9BRF9TeW5jUnN0KTsKKworCQkvKiAwNjAgY29tbXVuaWNhdGVzIHdpdGggMDY3IGluIG1hc3RlciBtb2RlICovCisJCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9DSVIsIFpSMDYwX0NJUl9Db2RlTXN0cik7CisKKwkJLyogRGVjb21wcmVzc2lvbiAqLworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfQ01SLCAwKTsKKworCQkvKiBNdXN0IGJlIHplcm8gKi8KKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX01CWiwgMHgwMCk7CisJCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9UQ1JfSEksIDB4MDApOworCQl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfVENSX0xPLCAweDAwKTsKKworCQkvKiBEaXNhYmxlIGFsbCBJUlFzIC0gbm8gRGF0YUVyciBtZWFucyBhdXRvcmVzZXQgKi8KKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0lNUiwgMCk7CisKKwkJLyogc2V0dXAgbWlzYy4gZGF0YSBmb3IgZXhwYW5zaW9uICovCisJCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9NRVIsIDApOworCisJCS8qIHNldHVwIHRoZSBmaXhlZCBqcGVnIHRhYmxlcyAtIG1heWJlIHZhcmlhYmxlLCB0aG91Z2ggLQorCQkgKiAoc2VlIHRhYmxlIGluaXQgc2VjdGlvbiBhYm92ZSkgKi8KKwkJenIzNjA2MF9wdXNoaXQocHRyLCBaUjA2MF9ESFRfSURYLCBzaXplb2YoenIzNjA2MF9kaHQpLAorCQkJICAgICAgIHpyMzYwNjBfZGh0KTsKKworCQkvKiBTZXR1cCB0aGUgVmlkZW8gRnJvbnRlbmQgKi8KKwkJLy96cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfVkNSLCBaUjA2MF9WQ1JfRklFeHQpOworCQkvL3RoaXMgZG9lc24ndCBzZWVtIHJpZ2h0IGFuZCBkb2Vzbid0IHdvcmsuLi4KKwkJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1ZDUiwgWlIwNjBfVkNSX1JhbmdlKTsKKwl9CisKKwkvKiBMb2FkIHRoZSB0YWJsZXMgKi8KKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfTE9BRCwKKwkJICAgICAgWlIwNjBfTE9BRF9TeW5jUnN0IHwgWlIwNjBfTE9BRF9Mb2FkKTsKKwl6cjM2MDYwX3dhaXRfZW5kKHB0cik7CisJZHByaW50aygyLCAiJXM6IFN0YXR1cyBhZnRlciB0YWJsZSBwcmVsb2FkOiAweCUwMnhcbiIsIHB0ci0+bmFtZSwKKwkJcHRyLT5zdGF0dXMpOworCisJaWYgKHB0ci0+c3RhdHVzICYgWlIwNjBfQ0ZTUl9CdXN5KSB7CisJCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzOiBpbml0IGFib3J0ZWQhXG4iLCBwdHItPm5hbWUpOworCQlyZXR1cm47CQkvLyBzb21ldGhpbmcgaXMgd3JvbmcsIGl0cyB0aW1lZCBvdXQhISEhCisJfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBDT0RFQyBBUEkgRlVOQ1RJT05TCisKKyAgIHRoaXMgZnVuY3Rpb25zIGFyZSBhY2Nlc3NlZCBieSB0aGUgbWFzdGVyIHZpYSB0aGUgQVBJIHN0cnVjdHVyZQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBzZXQgY29tcHJlc3Npb24vZXhwYW5zaW9uIG1vZGUgYW5kIGxhdW5jaGVzIGNvZGVjIC0KKyAgIHRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0IGNhbGwgZnJvbSB0aGUgbWFzdGVyIGJlZm9yZSBzdGFydGluZyBwcm9jZXNzaW5nICovCitzdGF0aWMgaW50Cit6cjM2MDYwX3NldF9tb2RlIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMsCisJCSAgaW50ICAgICAgICAgICAgICAgIG1vZGUpCit7CisJc3RydWN0IHpyMzYwNjAgKnB0ciA9IChzdHJ1Y3QgenIzNjA2MCAqKSBjb2RlYy0+ZGF0YTsKKworCWRwcmludGsoMiwgIiVzOiBzZXRfbW9kZSAlZCBjYWxsXG4iLCBwdHItPm5hbWUsIG1vZGUpOworCisJaWYgKChtb2RlICE9IENPREVDX0RPX0VYUEFOU0lPTikgJiYgKG1vZGUgIT0gQ09ERUNfRE9fQ09NUFJFU1NJT04pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB0ci0+bW9kZSA9IG1vZGU7CisJenIzNjA2MF9pbml0KHB0cik7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHBpY3R1cmUgc2l6ZSAobm9ybSBpcyBpZ25vcmVkIGFzIHRoZSBjb2RlYyBkb2Vzbid0IGtub3cgYWJvdXQgaXQpICovCitzdGF0aWMgaW50Cit6cjM2MDYwX3NldF92aWRlbyAoc3RydWN0IHZpZGVvY29kZWMgICAqY29kZWMsCisJCSAgIHN0cnVjdCB0dm5vcm0gICAgICAgKm5vcm0sCisJCSAgIHN0cnVjdCB2ZmVfc2V0dGluZ3MgKmNhcCwKKwkJICAgc3RydWN0IHZmZV9wb2xhcml0eSAqcG9sKQoreworCXN0cnVjdCB6cjM2MDYwICpwdHIgPSAoc3RydWN0IHpyMzYwNjAgKikgY29kZWMtPmRhdGE7CisJdTMyIHJlZzsKKwlpbnQgc2l6ZTsKKworCWRwcmludGsoMiwgIiVzOiBzZXRfdmlkZW8gJWQvJWQtJWR4JWQgKCUlJWQpIGNhbGxcbiIsIHB0ci0+bmFtZSwKKwkJY2FwLT54LCBjYXAtPnksIGNhcC0+d2lkdGgsIGNhcC0+aGVpZ2h0LCBjYXAtPmRlY2ltYXRpb24pOworCisJLyogaWYgKCkgcmV0dXJuIC1FSU5WQUw7CisJICogdHJ1c3QgdGhlIG1hc3RlciBkcml2ZXIgdGhhdCBpdCBrbm93cyB3aGF0IGl0IGRvZXMgLSBzbworCSAqIHdlIGFsbG93IGludmFsaWQgc3RhcnR4L3kgYW5kIG5vcm0gZm9yIG5vdyAuLi4gKi8KKwlwdHItPndpZHRoID0gY2FwLT53aWR0aCAvIChjYXAtPmRlY2ltYXRpb24gJiAweGZmKTsKKwlwdHItPmhlaWdodCA9IGNhcC0+aGVpZ2h0IC8gKGNhcC0+ZGVjaW1hdGlvbiA+PiA4KTsKKworCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9MT0FELCBaUjA2MF9MT0FEX1N5bmNSc3QpOworCisJLyogTm90ZSB0aGF0IFZTUG9sL0hTUG9sIGJpdHMgaW4genIzNjA2MCBoYXZlIHRoZSBvcHBvc2l0ZQorCSAqIG1lYW5pbmcgb2YgdGhlaXIgenIzNjB4NyBjb3VudGVycGFydHMgd2l0aCB0aGUgc2FtZSBuYW1lcworCSAqIE4uYi4gZm9yIFZTUG9sIHRoaXMgaXMgb25seSB0cnVlIGlmIEZJVkVkZ2UgPSAwIChkZWZhdWx0LAorCSAqIGxlZnQgdW5jaGFuZ2VkIGhlcmUgLSBpbiBhY2NvcmRhbmNlIHdpdGggZGF0YXNoZWV0KS4KKwkqLworCXJlZyA9ICghcG9sLT52c3luY19wb2wgPyBaUjA2MF9WUFJfVlNQb2wgOiAwKQorCSAgICB8ICghcG9sLT5oc3luY19wb2wgPyBaUjA2MF9WUFJfSFNQb2wgOiAwKQorCSAgICB8IChwb2wtPmZpZWxkX3BvbCA/IFpSMDYwX1ZQUl9GSVBvbCA6IDApCisJICAgIHwgKHBvbC0+YmxhbmtfcG9sID8gWlIwNjBfVlBSX0JMUG9sIDogMCkKKwkgICAgfCAocG9sLT5zdWJpbWdfcG9sID8gWlIwNjBfVlBSX1NJbWdQb2wgOiAwKQorCSAgICB8IChwb2wtPnBvZV9wb2wgPyBaUjA2MF9WUFJfUG9lUG9sIDogMCkKKwkgICAgfCAocG9sLT5wdmFsaWRfcG9sID8gWlIwNjBfVlBSX1BWYWxQb2wgOiAwKQorCSAgICB8IChwb2wtPnZjbGtfcG9sID8gWlIwNjBfVlBSX1ZDTEtQb2wgOiAwKTsKKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfVlBSLCByZWcpOworCisJcmVnID0gMDsKKwlzd2l0Y2ggKGNhcC0+ZGVjaW1hdGlvbiAmIDB4ZmYpIHsKKwlkZWZhdWx0OgorCWNhc2UgMToKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXJlZyB8PSBaUjA2MF9TUl9IU2NhbGUyOworCQlicmVhazsKKworCWNhc2UgNDoKKwkJcmVnIHw9IFpSMDYwX1NSX0hTY2FsZTQ7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoY2FwLT5kZWNpbWF0aW9uID4+IDgpIHsKKwlkZWZhdWx0OgorCWNhc2UgMToKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXJlZyB8PSBaUjA2MF9TUl9WU2NhbGU7CisJCWJyZWFrOworCX0KKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfU1IsIHJlZyk7CisKKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfQkNSX1ksIDB4MDApOworCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9CQ1JfVSwgMHg4MCk7CisJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0JDUl9WLCAweDgwKTsKKworCS8qIHN5bmMgZ2VuZXJhdG9yICovCisKKwlyZWcgPSBub3JtLT5IdCAtIDE7CS8qIFZ0b3RhbCAqLworCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9TR1JfVlRPVEFMX0hJLCAocmVnID4+IDgpICYgMHhmZik7CisJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1NHUl9WVE9UQUxfTE8sIChyZWcgPj4gMCkgJiAweGZmKTsKKworCXJlZyA9IG5vcm0tPld0IC0gMTsJLyogSHRvdGFsICovCisJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1NHUl9IVE9UQUxfSEksIChyZWcgPj4gOCkgJiAweGZmKTsKKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfU0dSX0hUT1RBTF9MTywgKHJlZyA+PiAwKSAmIDB4ZmYpOworCisJcmVnID0gNiAtIDE7CQkvKiBWc3luY1NpemUgKi8KKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfU0dSX1ZTWU5DLCByZWcpOworCisJLy9yZWcgICA9IDMwIC0gMTsgICAgICAgICAgICAgICAvKiBIc3luY1NpemUgKi8KKy8vLypDUCovICAgICAgICByZWcgPSAoenItPnBhcmFtcy5ub3JtID09IDEgPyA1NyA6IDY4KTsKKwlyZWcgPSA2ODsKKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfU0dSX0hTWU5DLCByZWcpOworCisJcmVnID0gbm9ybS0+VlN0YXJ0IC0gMTsJLyogQlZzdGFydCAqLworCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9TR1JfQlZTVEFSVCwgcmVnKTsKKworCXJlZyArPSBub3JtLT5IYSAvIDI7CS8qIEJWZW5kICovCisJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1NHUl9CVkVORF9ISSwgKHJlZyA+PiA4KSAmIDB4ZmYpOworCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9TR1JfQlZFTkRfTE8sIChyZWcgPj4gMCkgJiAweGZmKTsKKworCXJlZyA9IG5vcm0tPkhTdGFydCAtIDE7CS8qIEJIc3RhcnQgKi8KKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfU0dSX0JIU1RBUlQsIHJlZyk7CisKKwlyZWcgKz0gbm9ybS0+V2E7CS8qIEJIZW5kICovCisJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1NHUl9CSEVORF9ISSwgKHJlZyA+PiA4KSAmIDB4ZmYpOworCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9TR1JfQkhFTkRfTE8sIChyZWcgPj4gMCkgJiAweGZmKTsKKworCS8qIGFjdGl2ZSBhcmVhICovCisJcmVnID0gY2FwLT55ICsgbm9ybS0+VlN0YXJ0OwkvKiBWc3RhcnQgKi8KKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfQUFSX1ZTVEFSVF9ISSwgKHJlZyA+PiA4KSAmIDB4ZmYpOworCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9BQVJfVlNUQVJUX0xPLCAocmVnID4+IDApICYgMHhmZik7CisKKwlyZWcgKz0gY2FwLT5oZWlnaHQ7CS8qIFZlbmQgKi8KKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfQUFSX1ZFTkRfSEksIChyZWcgPj4gOCkgJiAweGZmKTsKKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfQUFSX1ZFTkRfTE8sIChyZWcgPj4gMCkgJiAweGZmKTsKKworCXJlZyA9IGNhcC0+eCArIG5vcm0tPkhTdGFydDsJLyogSHN0YXJ0ICovCisJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX0FBUl9IU1RBUlRfSEksIChyZWcgPj4gOCkgJiAweGZmKTsKKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfQUFSX0hTVEFSVF9MTywgKHJlZyA+PiAwKSAmIDB4ZmYpOworCisJcmVnICs9IGNhcC0+d2lkdGg7CS8qIEhlbmQgKi8KKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfQUFSX0hFTkRfSEksIChyZWcgPj4gOCkgJiAweGZmKTsKKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfQUFSX0hFTkRfTE8sIChyZWcgPj4gMCkgJiAweGZmKTsKKworCS8qIHN1YmltYWdlIGFyZWEgKi8KKwlyZWcgPSBub3JtLT5WU3RhcnQgLSA0OwkvKiBTVnN0YXJ0ICovCisJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1NXUl9WU1RBUlRfSEksIChyZWcgPj4gOCkgJiAweGZmKTsKKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfU1dSX1ZTVEFSVF9MTywgKHJlZyA+PiAwKSAmIDB4ZmYpOworCisJcmVnICs9IG5vcm0tPkhhIC8gMiArIDg7CS8qIFNWZW5kICovCisJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1NXUl9WRU5EX0hJLCAocmVnID4+IDgpICYgMHhmZik7CisJenIzNjA2MF93cml0ZShwdHIsIFpSMDYwX1NXUl9WRU5EX0xPLCAocmVnID4+IDApICYgMHhmZik7CisKKwlyZWcgPSBub3JtLT5IU3RhcnQgLyorIDY0ICovICAtIDQ7CS8qIFNIc3RhcnQgKi8KKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfU1dSX0hTVEFSVF9ISSwgKHJlZyA+PiA4KSAmIDB4ZmYpOworCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9TV1JfSFNUQVJUX0xPLCAocmVnID4+IDApICYgMHhmZik7CisKKwlyZWcgKz0gbm9ybS0+V2EgKyA4OwkvKiBTSGVuZCAqLworCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9TV1JfSEVORF9ISSwgKHJlZyA+PiA4KSAmIDB4ZmYpOworCXpyMzYwNjBfd3JpdGUocHRyLCBaUjA2MF9TV1JfSEVORF9MTywgKHJlZyA+PiAwKSAmIDB4ZmYpOworCisJc2l6ZSA9IHB0ci0+d2lkdGggKiBwdHItPmhlaWdodDsKKwkvKiBUYXJnZXQgY29tcHJlc3NlZCBmaWVsZCBzaXplIGluIGJpdHM6ICovCisJc2l6ZSA9IHNpemUgKiAxNjsJLyogdW5jb21wcmVzc2VkIHNpemUgaW4gYml0cyAqLworCS8qIChSb25hbGQpIGJ5IGRlZmF1bHQsIHF1YWxpdHkgPSAxMDAgaXMgYSBjb21wcmVzc2lvbgorCSAqIHJhdGlvIDE6Mi4gU2V0dGluZyBsb3dfYml0cmF0ZSAoaW5zbW9kIG9wdGlvbikgc2V0cworCSAqIGl0IHRvIDE6NCAoaW5zdGVhZCBvZiAxOjIsIHpyMzYwNjAgbWF4KSBhcyBsaW1pdCBiZWNhdXNlIHRoZQorCSAqIGJ1eiBjYW4ndCBoYW5kbGUgbW9yZSBhdCBkZWNpbWF0aW9uPTEuLi4gVXNlIGxvd19iaXRyYXRlIGlmCisJICogeW91IGhhdmUgYSBCdXosIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZyAqLworCXNpemUgPSBzaXplICogY2FwLT5xdWFsaXR5IC8gKGxvd19iaXRyYXRlID8gNDAwIDogMjAwKTsKKwkvKiBMb3dlciBsaW1pdCAoYXJiaXRyYXJ5LCAxIEtCKSAqLworCWlmIChzaXplIDwgODE5MikKKwkJc2l6ZSA9IDgxOTI7CisJLyogVXBwZXIgbGltaXQ6IDcvOCBvZiB0aGUgY29kZSBidWZmZXJzICovCisJaWYgKHNpemUgPiBwdHItPnRvdGFsX2NvZGVfdm9sICogNykKKwkJc2l6ZSA9IHB0ci0+dG90YWxfY29kZV92b2wgKiA3OworCisJcHRyLT5yZWFsX2NvZGVfdm9sID0gc2l6ZSA+PiAzOwkvKiBpbiBieXRlcyAqLworCisJLyogdGhlIE1CQ1ZSIGlzIHRoZSAqbWF4aW11bSogYmxvY2sgdm9sdW1lLCBhY2NvcmRpbmcgdG8gdGhlCisJICogSlBFRyBJU08gc3BlY3MsIHRoaXMgc2hvdWxkbid0IGJlIHVzZWQsIHNpbmNlIHRoYXQgYWxsb3dzCisJICogZm9yIHRoZSBiZXN0IGVuY29kaW5nIHF1YWxpdHkuIFNvIHNldCBpdCB0byBpdCdzIG1heCB2YWx1ZSAqLworCXJlZyA9IHB0ci0+bWF4X2Jsb2NrX3ZvbDsKKwl6cjM2MDYwX3dyaXRlKHB0ciwgWlIwNjBfTUJDVlIsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogYWRkaXRpb25hbCBjb250cm9sIGZ1bmN0aW9ucyAqLworc3RhdGljIGludAorenIzNjA2MF9jb250cm9sIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMsCisJCSBpbnQgICAgICAgICAgICAgICAgdHlwZSwKKwkJIGludCAgICAgICAgICAgICAgICBzaXplLAorCQkgdm9pZCAgICAgICAgICAgICAgKmRhdGEpCit7CisJc3RydWN0IHpyMzYwNjAgKnB0ciA9IChzdHJ1Y3QgenIzNjA2MCAqKSBjb2RlYy0+ZGF0YTsKKwlpbnQgKml2YWwgPSAoaW50ICopIGRhdGE7CisKKwlkcHJpbnRrKDIsICIlczogY29udHJvbCAlZCBjYWxsIHdpdGggJWQgYnl0ZVxuIiwgcHRyLT5uYW1lLCB0eXBlLAorCQlzaXplKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQ09ERUNfR19TVEFUVVM6CS8qIGdldCBsYXN0IHN0YXR1cyAqLworCQlpZiAoc2l6ZSAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl6cjM2MDYwX3JlYWRfc3RhdHVzKHB0cik7CisJCSppdmFsID0gcHRyLT5zdGF0dXM7CisJCWJyZWFrOworCisJY2FzZSBDT0RFQ19HX0NPREVDX01PREU6CisJCWlmIChzaXplICE9IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCSppdmFsID0gQ09ERUNfTU9ERV9CSlBHOworCQlicmVhazsKKworCWNhc2UgQ09ERUNfU19DT0RFQ19NT0RFOgorCQlpZiAoc2l6ZSAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKml2YWwgIT0gQ09ERUNfTU9ERV9CSlBHKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIG5vdCBuZWVkZWQsIGRvIG5vdGhpbmcgKi8KKwkJcmV0dXJuIDA7CisKKwljYXNlIENPREVDX0dfVkZFOgorCWNhc2UgQ09ERUNfU19WRkU6CisJCS8qIG5vdCBuZWVkZWQsIGRvIG5vdGhpbmcgKi8KKwkJcmV0dXJuIDA7CisKKwljYXNlIENPREVDX1NfTU1BUDoKKwkJLyogbm90IGF2YWlsYWJsZSwgZ2l2ZSBhbiBlcnJvciAqLworCQlyZXR1cm4gLUVOWElPOworCisJY2FzZSBDT0RFQ19HX0pQRUdfVERTX0JZVEU6CS8qIGdldCB0YXJnZXQgdm9sdW1lIGluIGJ5dGUgKi8KKwkJaWYgKHNpemUgIT0gc2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJKml2YWwgPSBwdHItPnRvdGFsX2NvZGVfdm9sOworCQlicmVhazsKKworCWNhc2UgQ09ERUNfU19KUEVHX1REU19CWVRFOgkvKiBnZXQgdGFyZ2V0IHZvbHVtZSBpbiBieXRlICovCisJCWlmIChzaXplICE9IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ci0+dG90YWxfY29kZV92b2wgPSAqaXZhbDsKKwkJcHRyLT5yZWFsX2NvZGVfdm9sID0gKHB0ci0+dG90YWxfY29kZV92b2wgKiA2KSA+PiAzOworCQlicmVhazsKKworCWNhc2UgQ09ERUNfR19KUEVHX1NDQUxFOgkvKiBnZXQgc2NhbGluZyBmYWN0b3IgKi8KKwkJaWYgKHNpemUgIT0gc2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJKml2YWwgPSB6cjM2MDYwX3JlYWRfc2NhbGVmYWN0b3IocHRyKTsKKwkJYnJlYWs7CisKKwljYXNlIENPREVDX1NfSlBFR19TQ0FMRToJLyogc2V0IHNjYWxpbmcgZmFjdG9yICovCisJCWlmIChzaXplICE9IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ci0+c2NhbGVmYWN0ID0gKml2YWw7CisJCWJyZWFrOworCisJY2FzZSBDT0RFQ19HX0pQRUdfQVBQX0RBVEE6IHsJLyogZ2V0IGFwcG4gbWFya2VyIGRhdGEgKi8KKwkJc3RydWN0IGpwZWdfYXBwX21hcmtlciAqYXBwID0gZGF0YTsKKworCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGpwZWdfYXBwX21hcmtlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkqYXBwID0gcHRyLT5hcHA7CisJCWJyZWFrOworCX0KKworCWNhc2UgQ09ERUNfU19KUEVHX0FQUF9EQVRBOiB7CS8qIHNldCBhcHBuIG1hcmtlciBkYXRhICovCisJCXN0cnVjdCBqcGVnX2FwcF9tYXJrZXIgKmFwcCA9IGRhdGE7CisKKwkJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCBqcGVnX2FwcF9tYXJrZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcHRyLT5hcHAgPSAqYXBwOworCQlicmVhazsKKwl9CisKKwljYXNlIENPREVDX0dfSlBFR19DT01fREFUQTogewkvKiBnZXQgY29tbWVudCBtYXJrZXIgZGF0YSAqLworCQlzdHJ1Y3QganBlZ19jb21fbWFya2VyICpjb20gPSBkYXRhOworCisJCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QganBlZ19jb21fbWFya2VyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCSpjb20gPSBwdHItPmNvbTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBDT0RFQ19TX0pQRUdfQ09NX0RBVEE6IHsJLyogc2V0IGNvbW1lbnQgbWFya2VyIGRhdGEgKi8KKwkJc3RydWN0IGpwZWdfY29tX21hcmtlciAqY29tID0gZGF0YTsKKworCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGpwZWdfY29tX21hcmtlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlwdHItPmNvbSA9ICpjb207CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBzaXplOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBFeGl0IGFuZCB1bnJlZ2lzdGVyIGZ1bmN0aW9uOgorCisgICBEZWluaXRpYWxpemVzIFpvcmFuJ3MgSlBFRyBwcm9jZXNzb3IKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGludAorenIzNjA2MF91bnNldCAoc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB6cjM2MDYwICpwdHIgPSBjb2RlYy0+ZGF0YTsKKworCWlmIChwdHIpIHsKKwkJLyogZG8gd2VlIG5lZWQgc29tZSBjb2RlYyBkZWluaXQgaGVyZSwgdG9vID8/Pz8gKi8KKworCQlkcHJpbnRrKDEsICIlczogZmluaXNoZWQgY29kZWMgIyVkXG4iLCBwdHItPm5hbWUsCisJCQlwdHItPm51bSk7CisJCWtmcmVlKHB0cik7CisJCWNvZGVjLT5kYXRhID0gTlVMTDsKKworCQl6cjM2MDYwX2NvZGVjcy0tOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgU2V0dXAgYW5kIHJlZ2lzdHJ5IGZ1bmN0aW9uOgorCisgICBJbml0aWFsaXplcyBab3JhbidzIEpQRUcgcHJvY2Vzc29yCisKKyAgIEFsc28gc2V0cyBwaXhlbCBzaXplLCBhdmVyYWdlIGNvZGUgc2l6ZSwgbW9kZSAoY29tcHIuL2RlY29tcHIuKQorICAgKHRoZSBnaXZlbiBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIHByb2Nlc3NvciB3aXRoIHRoZSB2aWRlbyBpbnRlcmZhY2UpCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBpbnQKK3pyMzYwNjBfc2V0dXAgKHN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgenIzNjA2MCAqcHRyOworCWludCByZXM7CisKKwlkcHJpbnRrKDIsICJ6cjM2MDYwOiBpbml0aWFsaXppbmcgTUpQRUcgc3Vic3lzdGVtICMlZC5cbiIsCisJCXpyMzYwNjBfY29kZWNzKTsKKworCWlmICh6cjM2MDYwX2NvZGVjcyA9PSBNQVhfQ09ERUNTKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSICJ6cjM2MDYwOiBDYW4ndCBhdHRhY2ggbW9yZSBjb2RlY3MhXG4iKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCS8vbWVtIHN0cnVjdHVyZSBpbml0CisJY29kZWMtPmRhdGEgPSBwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgenIzNjA2MCksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IHB0cikgeworCQlkcHJpbnRrKDEsIEtFUk5fRVJSICJ6cjM2MDYwOiBDYW4ndCBnZXQgZW5vdWdoIG1lbW9yeSFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHB0ciwgMCwgc2l6ZW9mKHN0cnVjdCB6cjM2MDYwKSk7CisKKwlzbnByaW50ZihwdHItPm5hbWUsIHNpemVvZihwdHItPm5hbWUpLCAienIzNjA2MFslZF0iLAorCQkgenIzNjA2MF9jb2RlY3MpOworCXB0ci0+bnVtID0genIzNjA2MF9jb2RlY3MrKzsKKwlwdHItPmNvZGVjID0gY29kZWM7CisKKwkvL3Rlc3RpbmcKKwlyZXMgPSB6cjM2MDYwX2Jhc2ljX3Rlc3QocHRyKTsKKwlpZiAocmVzIDwgMCkgeworCQl6cjM2MDYwX3Vuc2V0KGNvZGVjKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJLy9maW5hbCBzZXR1cAorCW1lbWNweShwdHItPmhfc2FtcF9yYXRpbywgenIzNjA2MF9kZWNpbWF0aW9uX2gsIDgpOworCW1lbWNweShwdHItPnZfc2FtcF9yYXRpbywgenIzNjA2MF9kZWNpbWF0aW9uX3YsIDgpOworCisJcHRyLT5iaXRyYXRlX2N0cmwgPSAwOwkvKiAwIG9yIDEgLSBmaXhlZCBmaWxlIHNpemUgZmxhZworCQkJCSAqICh3aGF0IGlzIHRoZSBkaWZmZXJlbmNlPykgKi8KKwlwdHItPm1vZGUgPSBDT0RFQ19ET19DT01QUkVTU0lPTjsKKwlwdHItPndpZHRoID0gMzg0OworCXB0ci0+aGVpZ2h0ID0gMjg4OworCXB0ci0+dG90YWxfY29kZV92b2wgPSAxNjAwMDsJLyogQ0hFQ0tNRSAqLworCXB0ci0+cmVhbF9jb2RlX3ZvbCA9IChwdHItPnRvdGFsX2NvZGVfdm9sICogNikgPj4gMzsKKwlwdHItPm1heF9ibG9ja192b2wgPSAyNDA7CS8qIENIRUNLTUUsIHdhcyAxMjAgaXMgMjQwICovCisJcHRyLT5zY2FsZWZhY3QgPSAweDEwMDsKKwlwdHItPmRyaSA9IDE7CQkvKiBDSEVDS01FLCB3YXMgOCBpcyAxICovCisKKwkvKiBieSBkZWZhdWx0LCBubyBDT00gb3IgQVBQIG1hcmtlcnMgLSBhcHAgc2hvdWxkIHNldCB0aG9zZSAqLworCXB0ci0+Y29tLmxlbiA9IDA7CisJcHRyLT5hcHAuYXBwbiA9IDA7CisJcHRyLT5hcHAubGVuID0gMDsKKworCXpyMzYwNjBfaW5pdChwdHIpOworCisJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiBjb2RlYyBhdHRhY2hlZCBhbmQgcnVubmluZ1xuIiwKKwkJcHRyLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZpZGVvY29kZWMgenIzNjA2MF9jb2RlYyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJ6cjM2MDYwIiwKKwkubWFnaWMgPSAwTCwJCS8vIG1hZ2ljIG5vdCB1c2VkCisJLmZsYWdzID0KKwkgICAgQ09ERUNfRkxBR19KUEVHIHwgQ09ERUNfRkxBR19IQVJEV0FSRSB8IENPREVDX0ZMQUdfRU5DT0RFUiB8CisJICAgIENPREVDX0ZMQUdfREVDT0RFUiB8IENPREVDX0ZMQUdfVkZFLAorCS50eXBlID0gQ09ERUNfVFlQRV9aUjM2MDYwLAorCS5zZXR1cCA9IHpyMzYwNjBfc2V0dXAsCS8vIGZ1bmN0aW9uYWxpdHkKKwkudW5zZXQgPSB6cjM2MDYwX3Vuc2V0LAorCS5zZXRfbW9kZSA9IHpyMzYwNjBfc2V0X21vZGUsCisJLnNldF92aWRlbyA9IHpyMzYwNjBfc2V0X3ZpZGVvLAorCS5jb250cm9sID0genIzNjA2MF9jb250cm9sLAorCS8vIG90aGVycyBhcmUgbm90IHVzZWQKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEhPT0sgSU4gRFJJVkVSIEFTIEtFUk5FTCBNT0RVTEUKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGludCBfX2luaXQKK3pyMzYwNjBfaW5pdF9tb2R1bGUgKHZvaWQpCit7CisJLy9kcHJpbnRrKDEsICJ6cjM2MDYwIGRyaXZlciAlc1xuIixaUjA2MF9WRVJTSU9OKTsKKwl6cjM2MDYwX2NvZGVjcyA9IDA7CisJcmV0dXJuIHZpZGVvY29kZWNfcmVnaXN0ZXIoJnpyMzYwNjBfY29kZWMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3pyMzYwNjBfY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisJaWYgKHpyMzYwNjBfY29kZWNzKSB7CisJCWRwcmludGsoMSwKKwkJCSJ6cjM2MDYwOiBzb21ldGhpbmcncyB3cm9uZyAtICVkIGNvZGVjcyBsZWZ0IHNvbWVob3cuXG4iLAorCQkJenIzNjA2MF9jb2RlY3MpOworCX0gCisKKwkvKiBob3dldmVyLCB3ZSBjYW4ndCBqdXN0IHN0YXkgYWxpdmUgKi8KKwl2aWRlb2NvZGVjX3VucmVnaXN0ZXIoJnpyMzYwNjBfY29kZWMpOworfQorCittb2R1bGVfaW5pdCh6cjM2MDYwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHpyMzYwNjBfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIG1vZHVsZSBmb3IgWlIzNjA2MCBqcGVnIHByb2Nlc3NvcnMgIgorCQkgICBaUjA2MF9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA2MC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDYwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0ZmZhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA2MC5oCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogWm9yYW4gWlIzNjA2MCBiYXNpYyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAtIGhlYWRlciBmaWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAc2t5bmV0LmJlPgorICoKKyAqICRJZDogenIzNjA2MC5oLHYgMS4xLjEuMS4yLjMgMjAwMy8wMS8xNCAyMToxODo0NyByYnVsdGplIEV4cCAkCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBaUjM2MDYwX0gKKyNkZWZpbmUgWlIzNjA2MF9ICisKKyNpbmNsdWRlICJ2aWRlb2NvZGVjLmgiCisKKy8qIGRhdGEgc3RvcmVkIGZvciBlYWNoIHpvcmFuIGpwZWcgY29kZWMgY2hpcCAqLworc3RydWN0IHpyMzYwNjAgeworCWNoYXIgbmFtZVszMl07CisJaW50IG51bTsKKwkvKiBpbyBkYXRhc3RydWN0dXJlICovCisJc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjOworCS8vIGxhc3QgY29kZXIgc3RhdHVzCisJX191OCBzdGF0dXM7CisJLy8gYWN0dWFsIGNvZGVyIHNldHVwCisJaW50IG1vZGU7CisKKwlfX3UxNiB3aWR0aDsKKwlfX3UxNiBoZWlnaHQ7CisKKwlfX3UxNiBiaXRyYXRlX2N0cmw7CisKKwlfX3UzMiB0b3RhbF9jb2RlX3ZvbDsKKwlfX3UzMiByZWFsX2NvZGVfdm9sOworCV9fdTE2IG1heF9ibG9ja192b2w7CisKKwlfX3U4IGhfc2FtcF9yYXRpb1s4XTsKKwlfX3U4IHZfc2FtcF9yYXRpb1s4XTsKKwlfX3UxNiBzY2FsZWZhY3Q7CisJX191MTYgZHJpOworCisJLyogYXBwL2NvbSBtYXJrZXIgZGF0YSAqLworCXN0cnVjdCBqcGVnX2FwcF9tYXJrZXIgYXBwOworCXN0cnVjdCBqcGVnX2NvbV9tYXJrZXIgY29tOworfTsKKworLyogWlIzNjA2MCByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgWlIwNjBfTE9BRAkJCTB4MDAwCisjZGVmaW5lIFpSMDYwX0NGU1IJCQkweDAwMQorI2RlZmluZSBaUjA2MF9DSVIJCQkweDAwMgorI2RlZmluZSBaUjA2MF9DTVIJCQkweDAwMworI2RlZmluZSBaUjA2MF9NQloJCQkweDAwNAorI2RlZmluZSBaUjA2MF9NQkNWUgkJCTB4MDA1CisjZGVmaW5lIFpSMDYwX01FUgkJCTB4MDA2CisjZGVmaW5lIFpSMDYwX0lNUgkJCTB4MDA3CisjZGVmaW5lIFpSMDYwX0lTUgkJCTB4MDA4CisjZGVmaW5lIFpSMDYwX1RDVl9ORVRfSEkJCTB4MDA5CisjZGVmaW5lIFpSMDYwX1RDVl9ORVRfTUgJCTB4MDBhCisjZGVmaW5lIFpSMDYwX1RDVl9ORVRfTUwJCTB4MDBiCisjZGVmaW5lIFpSMDYwX1RDVl9ORVRfTE8JCTB4MDBjCisjZGVmaW5lIFpSMDYwX1RDVl9EQVRBX0hJCQkweDAwZAorI2RlZmluZSBaUjA2MF9UQ1ZfREFUQV9NSAkJMHgwMGUKKyNkZWZpbmUgWlIwNjBfVENWX0RBVEFfTUwJCTB4MDBmCisjZGVmaW5lIFpSMDYwX1RDVl9EQVRBX0xPCQkweDAxMAorI2RlZmluZSBaUjA2MF9TRl9ISQkJCTB4MDExCisjZGVmaW5lIFpSMDYwX1NGX0xPCQkJMHgwMTIKKyNkZWZpbmUgWlIwNjBfQUZfSEkJCQkweDAxMworI2RlZmluZSBaUjA2MF9BRl9NCQkJMHgwMTQKKyNkZWZpbmUgWlIwNjBfQUZfTE8JCQkweDAxNQorI2RlZmluZSBaUjA2MF9BQ1ZfSEkJCQkweDAxNgorI2RlZmluZSBaUjA2MF9BQ1ZfTUgJCQkweDAxNworI2RlZmluZSBaUjA2MF9BQ1ZfTUwJCQkweDAxOAorI2RlZmluZSBaUjA2MF9BQ1ZfTE8JCQkweDAxOQorI2RlZmluZSBaUjA2MF9BQ1RfSEkJCQkweDAxYQorI2RlZmluZSBaUjA2MF9BQ1RfTUgJCQkweDAxYgorI2RlZmluZSBaUjA2MF9BQ1RfTUwJCQkweDAxYworI2RlZmluZSBaUjA2MF9BQ1RfTE8JCQkweDAxZAorI2RlZmluZSBaUjA2MF9BQ1ZfVFJVTl9ISQkJMHgwMWUKKyNkZWZpbmUgWlIwNjBfQUNWX1RSVU5fTUgJCTB4MDFmCisjZGVmaW5lIFpSMDYwX0FDVl9UUlVOX01MCQkweDAyMAorI2RlZmluZSBaUjA2MF9BQ1ZfVFJVTl9MTwkJMHgwMjEKKyNkZWZpbmUgWlIwNjBfSURSX0RFVgkJCTB4MDIyCisjZGVmaW5lIFpSMDYwX0lEUl9SRVYJCQkweDAyMworI2RlZmluZSBaUjA2MF9UQ1JfSEkJCQkweDAyNAorI2RlZmluZSBaUjA2MF9UQ1JfTE8JCQkweDAyNQorI2RlZmluZSBaUjA2MF9WQ1IJCQkweDAzMAorI2RlZmluZSBaUjA2MF9WUFIJCQkweDAzMQorI2RlZmluZSBaUjA2MF9TUgkJCTB4MDMyCisjZGVmaW5lIFpSMDYwX0JDUl9ZCQkJMHgwMzMKKyNkZWZpbmUgWlIwNjBfQkNSX1UJCQkweDAzNAorI2RlZmluZSBaUjA2MF9CQ1JfVgkJCTB4MDM1CisjZGVmaW5lIFpSMDYwX1NHUl9WVE9UQUxfSEkJCTB4MDM2CisjZGVmaW5lIFpSMDYwX1NHUl9WVE9UQUxfTE8JCTB4MDM3CisjZGVmaW5lIFpSMDYwX1NHUl9IVE9UQUxfSEkJCTB4MDM4CisjZGVmaW5lIFpSMDYwX1NHUl9IVE9UQUxfTE8JCTB4MDM5CisjZGVmaW5lIFpSMDYwX1NHUl9WU1lOQwkJCTB4MDNhCisjZGVmaW5lIFpSMDYwX1NHUl9IU1lOQwkJCTB4MDNiCisjZGVmaW5lIFpSMDYwX1NHUl9CVlNUQVJUCQkweDAzYworI2RlZmluZSBaUjA2MF9TR1JfQkhTVEFSVAkJMHgwM2QKKyNkZWZpbmUgWlIwNjBfU0dSX0JWRU5EX0hJCQkweDAzZQorI2RlZmluZSBaUjA2MF9TR1JfQlZFTkRfTE8JCTB4MDNmCisjZGVmaW5lIFpSMDYwX1NHUl9CSEVORF9ISQkJMHgwNDAKKyNkZWZpbmUgWlIwNjBfU0dSX0JIRU5EX0xPCQkweDA0MQorI2RlZmluZSBaUjA2MF9BQVJfVlNUQVJUX0hJCQkweDA0MgorI2RlZmluZSBaUjA2MF9BQVJfVlNUQVJUX0xPCQkweDA0MworI2RlZmluZSBaUjA2MF9BQVJfVkVORF9ISQkJMHgwNDQKKyNkZWZpbmUgWlIwNjBfQUFSX1ZFTkRfTE8JCTB4MDQ1CisjZGVmaW5lIFpSMDYwX0FBUl9IU1RBUlRfSEkJCTB4MDQ2CisjZGVmaW5lIFpSMDYwX0FBUl9IU1RBUlRfTE8JCTB4MDQ3CisjZGVmaW5lIFpSMDYwX0FBUl9IRU5EX0hJCQkweDA0OAorI2RlZmluZSBaUjA2MF9BQVJfSEVORF9MTwkJMHgwNDkKKyNkZWZpbmUgWlIwNjBfU1dSX1ZTVEFSVF9ISQkJMHgwNGEKKyNkZWZpbmUgWlIwNjBfU1dSX1ZTVEFSVF9MTwkJMHgwNGIKKyNkZWZpbmUgWlIwNjBfU1dSX1ZFTkRfSEkJCTB4MDRjCisjZGVmaW5lIFpSMDYwX1NXUl9WRU5EX0xPCQkweDA0ZAorI2RlZmluZSBaUjA2MF9TV1JfSFNUQVJUX0hJCQkweDA0ZQorI2RlZmluZSBaUjA2MF9TV1JfSFNUQVJUX0xPCQkweDA0ZgorI2RlZmluZSBaUjA2MF9TV1JfSEVORF9ISQkJMHgwNTAKKyNkZWZpbmUgWlIwNjBfU1dSX0hFTkRfTE8JCTB4MDUxCisKKyNkZWZpbmUgWlIwNjBfU09GX0lEWAkJCTB4MDYwCisjZGVmaW5lIFpSMDYwX1NPU19JRFgJCQkweDA3YQorI2RlZmluZSBaUjA2MF9EUklfSURYCQkJMHgwYzAKKyNkZWZpbmUgWlIwNjBfRFFUX0lEWAkJCTB4MGNjCisjZGVmaW5lIFpSMDYwX0RIVF9JRFgJCQkweDFkNAorI2RlZmluZSBaUjA2MF9BUFBfSURYCQkJMHgzODAKKyNkZWZpbmUgWlIwNjBfQ09NX0lEWAkJCTB4M2MwCisKKy8qIFpSMzYwNjAgTE9BRCByZWdpc3RlciBiaXRzICovCisKKyNkZWZpbmUgWlIwNjBfTE9BRF9Mb2FkCQkJKDEgPDwgNykKKyNkZWZpbmUgWlIwNjBfTE9BRF9TeW5jUnN0CQkoMSA8PCAwKQorCisvKiBaUjM2MDYwIENvZGUgRklGTyBTdGF0dXMgcmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIFpSMDYwX0NGU1JfQnVzeQkJCSgxIDw8IDcpCisjZGVmaW5lIFpSMDYwX0NGU1JfQ0J1c3kJCSgxIDw8IDIpCisjZGVmaW5lIFpSMDYwX0NGU1JfQ0ZJRk8JCSgzIDw8IDApCisKKy8qIFpSMzYwNjAgQ29kZSBJbnRlcmZhY2UgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBaUjA2MF9DSVJfQ29kZTE2CQkoMSA8PCA3KQorI2RlZmluZSBaUjA2MF9DSVJfRW5kaWFuCQkoMSA8PCA2KQorI2RlZmluZSBaUjA2MF9DSVJfQ0ZJUwkJCSgxIDw8IDIpCisjZGVmaW5lIFpSMDYwX0NJUl9Db2RlTXN0cgkJKDEgPDwgMCkKKworLyogWlIzNjA2MCBDb2RlYyBNb2RlIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgWlIwNjBfQ01SX0NvbXAJCQkoMSA8PCA3KQorI2RlZmluZSBaUjA2MF9DTVJfQVRQCQkJKDEgPDwgNikKKyNkZWZpbmUgWlIwNjBfQ01SX1Bhc3MyCQkJKDEgPDwgNSkKKyNkZWZpbmUgWlIwNjBfQ01SX1RMTQkJCSgxIDw8IDQpCisjZGVmaW5lIFpSMDYwX0NNUl9CUkIJCQkoMSA8PCAyKQorI2RlZmluZSBaUjA2MF9DTVJfRlNGCQkJKDEgPDwgMSkKKworLyogWlIzNjA2MCBNYXJrZXJzIEVuYWJsZSByZWdpc3RlciAqLworCisjZGVmaW5lIFpSMDYwX01FUl9BcHAJCQkoMSA8PCA3KQorI2RlZmluZSBaUjA2MF9NRVJfQ29tCQkJKDEgPDwgNikKKyNkZWZpbmUgWlIwNjBfTUVSX0RSSQkJCSgxIDw8IDUpCisjZGVmaW5lIFpSMDYwX01FUl9EUVQJCQkoMSA8PCA0KQorI2RlZmluZSBaUjA2MF9NRVJfREhUCQkJKDEgPDwgMykKKworLyogWlIzNjA2MCBJbnRlcnJ1cHQgTWFzayByZWdpc3RlciAqLworCisjZGVmaW5lIFpSMDYwX0lNUl9FT0FWCQkJKDEgPDwgMykKKyNkZWZpbmUgWlIwNjBfSU1SX0VPSQkJCSgxIDw8IDIpCisjZGVmaW5lIFpSMDYwX0lNUl9FbmQJCQkoMSA8PCAxKQorI2RlZmluZSBaUjA2MF9JTVJfRGF0YUVycgkJKDEgPDwgMCkKKworLyogWlIzNjA2MCBJbnRlcnJ1cHQgU3RhdHVzIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgWlIwNjBfSVNSX1Byb0NudAkJKDMgPDwgNikKKyNkZWZpbmUgWlIwNjBfSVNSX0VPQVYJCQkoMSA8PCAzKQorI2RlZmluZSBaUjA2MF9JU1JfRU9JCQkJKDEgPDwgMikKKyNkZWZpbmUgWlIwNjBfSVNSX0VuZAkJCSgxIDw8IDEpCisjZGVmaW5lIFpSMDYwX0lTUl9EYXRhRXJyCQkoMSA8PCAwKQorCisvKiBaUjM2MDYwIFZpZGVvIENvbnRyb2wgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBaUjA2MF9WQ1JfVmlkZW84CQkoMSA8PCA3KQorI2RlZmluZSBaUjA2MF9WQ1JfUmFuZ2UJCQkoMSA8PCA2KQorI2RlZmluZSBaUjA2MF9WQ1JfRklEZXQJCQkoMSA8PCAzKQorI2RlZmluZSBaUjA2MF9WQ1JfRklWZWRnZQkJKDEgPDwgMikKKyNkZWZpbmUgWlIwNjBfVkNSX0ZJRXh0CQkJKDEgPDwgMSkKKyNkZWZpbmUgWlIwNjBfVkNSX1N5bmNNc3RyCQkoMSA8PCAwKQorCisvKiBaUjM2MDYwIFZpZGVvIFBvbGFyaXR5IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgWlIwNjBfVlBSX1ZDTEtQb2wJCSgxIDw8IDcpCisjZGVmaW5lIFpSMDYwX1ZQUl9QVmFsUG9sCQkoMSA8PCA2KQorI2RlZmluZSBaUjA2MF9WUFJfUG9lUG9sCQkoMSA8PCA1KQorI2RlZmluZSBaUjA2MF9WUFJfU0ltZ1BvbAkJKDEgPDwgNCkKKyNkZWZpbmUgWlIwNjBfVlBSX0JMUG9sCQkJKDEgPDwgMykKKyNkZWZpbmUgWlIwNjBfVlBSX0ZJUG9sCQkJKDEgPDwgMikKKyNkZWZpbmUgWlIwNjBfVlBSX0hTUG9sCQkJKDEgPDwgMSkKKyNkZWZpbmUgWlIwNjBfVlBSX1ZTUG9sCQkJKDEgPDwgMCkKKworLyogWlIzNjA2MCBTY2FsaW5nIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgWlIwNjBfU1JfVlNjYWxlCQkJKDEgPDwgMikKKyNkZWZpbmUgWlIwNjBfU1JfSFNjYWxlMgkJKDEgPDwgMCkKKyNkZWZpbmUgWlIwNjBfU1JfSFNjYWxlNAkJKDIgPDwgMCkKKworI2VuZGlmCQkJCS8qZm5kZWYgWlIzNjA2MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjEyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzUzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYwpAQCAtMCwwICsxLDIwNzMgQEAKKy8qCisgICAgenIzNjEyMC5jIC0gWm9yYW4gMzYxMjAvMzYxMjUgYmFzZWQgZnJhbWVncmFiYmVycworCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgUGF1bGluZSBNaWRkZWxpbmsgPG1pZGRlbGluQHBvbHl3YXJlLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAidHVuZXIuaCIKKyNpbmNsdWRlICJ6cjM2MTIwLmgiCisjaW5jbHVkZSAienIzNjEyMF9tZW0uaCIKKworLyogbWFyayBhbiByZXF1aXJlZCBmdW5jdGlvbiBhcmd1bWVudCB1bnVzZWQgLSBsaW50aXNtICovCisjZGVmaW5lCVVOVVNFRCh4KQkodm9pZCkoeCkKKworLyogc2Vuc2libGUgZGVmYXVsdCAqLworI2lmbmRlZiBDQVJEVFlQRQorI2RlZmluZSBDQVJEVFlQRSAwCisjZW5kaWYKKworLyogQW55Ym9keSB3aG8gdXNlcyBtb3JlIHRoYW4gZm91cj8gKi8KKyNkZWZpbmUgWk9SQU5fTUFYIDQKKworc3RhdGljIHVuc2lnbmVkIGludCB0cml0b24xPTA7CQkJLyogdHJpdG9uMSBjaGlwc2V0PyAqLworc3RhdGljIHVuc2lnbmVkIGludCBjYXJkdHlwZVtaT1JBTl9NQVhdPXsgWyAwIC4uLiBaT1JBTl9NQVgtMSBdID0gQ0FSRFRZUEUgfTsKK3N0YXRpYyBpbnQgdmlkZW9fbnIgPSAtMTsKK3N0YXRpYyBpbnQgdmJpX25yID0gLTE7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB6cjM2MTIwX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfWk9SQU4sUENJX0RFVklDRV9JRF9aT1JBTl8zNjEyMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB6cjM2MTIwX3BjaV90YmwpOworCitNT0RVTEVfQVVUSE9SKCJQYXVsaW5lIE1pZGRlbGluayA8bWlkZGVsaW5AcG9seXdhcmUubmw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlpvcmFuIFpSMzYxMjAgYmFzZWQgZnJhbWVncmFiYmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK01PRFVMRV9QQVJNKHRyaXRvbjEsImkiKTsKK01PRFVMRV9QQVJNKGNhcmR0eXBlLCIxLSIgX19NT0RVTEVfU1RSSU5HKFpPUkFOX01BWCkgImkiKTsKK01PRFVMRV9QQVJNKHZpZGVvX25yLCJpIik7CitNT0RVTEVfUEFSTSh2YmlfbnIsImkiKTsKKworc3RhdGljIGludCB6b3Jhbl9jYXJkczsKK3N0YXRpYyBzdHJ1Y3Qgem9yYW4gem9yYW5zW1pPUkFOX01BWF07CisKKy8qCisgKiB0aGUgbWVhbmluZyBvZiBlYWNoIGVsZW1lbnQgY2FuIGJlIGZvdW5kIGluIHpyMzYxMjAuaAorICogRGV0ZXJtaW5pbmcgdGhlIHZhbHVlIG9mIGdwZGlyL2dwdmFsIGNhbiBiZSB0cmlja3kuIFRoZQorICogYmVzdCB3YXkgaXMgdG8gcnVuIHRoZSBjYXJkIHVuZGVyIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZQorICogYW5kIHJlYWQgdGhlIHZhbHVlcyBmcm9tIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzCisgKiAweDI4IGFuZCAweDJDLiBIb3cgeW91IGRvIHRoYXQgaXMgbGVmdCBhcyBhbiBleGVyY2lzZQorICogdG8gdGhlIGltcGF0aWVudCByZWFkZXIgOikKKyAqLworI2RlZmluZSBUIDEJLyogdG8gc2VwYXJhdGUgdGhlIGJvb2xzIGZyb20gdGhlIGludHMgKi8KKyNkZWZpbmUgRiAwCitzdGF0aWMgc3RydWN0IHR2Y2FyZCB0dmNhcmRzW10gPSB7CisJLyogcmVwb3J0ZWQgd29ya2luZyBieSA8bWlkZGVsaW5AcG9seXdhcmUubmw+ICovCisvKjAqLwl7ICJUcnVzdCBWaWN0b3IgSUkiLAorCSAgMiwgMCwgVCwgVCwgVCwgVCwgMHg3RiwgMHg4MCwgeyAxLCBTVkhTKDYpIH0sIHsgMCB9IH0sCisJLyogcmVwb3J0ZWQgd29ya2luZyBieSA8TWljaGFlbC5QYXh0b25AYWlody5nb3YuYXU+ICAqLworLyoxKi8gICB7ICJBaXRlY2ggV2F2ZVdhdGNoZXIgVFYtUENJIiwKKwkgIDMsIDAsIFQsIEYsIFQsIFQsIDB4N0YsIDB4ODAsIHsgMSwgVFVORVIoMyksIFNWSFMoNikgfSwgeyAwIH0gfSwKKwkvKiByZXBvcnRlZCB3b3JraW5nIGJ5ID8gKi8KKy8qMiovCXsgIkdlbml1cyBWaWRlbyBXb25kZXIgUENJIFZpZGVvIENhcHR1cmUgQ2FyZCIsCisJICAyLCAwLCBULCBULCBULCBULCAweDdGLCAweDgwLCB7IDEsIFNWSFMoNikgfSwgeyAwIH0gfSwKKwkvKiByZXBvcnRlZCB3b3JraW5nIGJ5IDxQYXNjYWwuR2FicmllbEB3YW5hZG9vLmZyPiAqLworLyozKi8JeyAiR3VpbGxlbW90IE1heGktVFYgUENJIiwKKwkgIDIsIDAsIFQsIFQsIFQsIFQsIDB4N0YsIDB4ODAsIHsgMSwgU1ZIUyg2KSB9LCB7IDAgfSB9LAorCS8qIHJlcG9ydGVkIHdvcmtpbmcgYnkgIkNyYWlnIFdoaXRtb3JlIDxsZW5ub25AaWdyaW4uY28ubno+ICovCisvKjQqLwl7ICJRdWFkcmFudCBCdXN0ZXIiLAorCSAgMywgMywgVCwgRiwgVCwgVCwgMHg3RiwgMHg4MCwgeyBTVkhTKDEpLCBUVU5FUigyKSwgMyB9LCB7IDEsIDIsIDMgfSB9LAorCS8qIGEgZGVidWcgZW50cnkgd2hpY2ggaGFzIGFsbCBpbnB1dHMgbWFwcGVkICovCisvKjUqLwl7ICJaUjM2MTIwIGJhc2VkIGZyYW1lZ3JhYmJlciAoYWxsIGlucHV0cyBlbmFibGVkKSIsCisJICA2LCAwLCBULCBULCBULCBULCAweDdGLCAweDgwLCB7IDEsIDIsIDMsIDQsIDUsIDYgfSwgeyAwIH0gfQorfTsKKyN1bmRlZiBUCisjdW5kZWYgRgorI2RlZmluZSBOUlRWQ0FSRFMgKHNpemVvZih0dmNhcmRzKS9zaXplb2YodHZjYXJkc1swXSkpCisKKyNpZmRlZiBfX3NwYXJjX18KKyNkZWZpbmUJRU5ESUFORVNTCTAKKyNlbHNlCisjZGVmaW5lCUVORElBTkVTUwlaT1JBTl9WRkVDX0xFCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB7IGNvbnN0IGNoYXIgbmFtZVs4XTsgdWludCBtb2RlOyB1aW50IGJwcDsgfSBwYWxldHRlMmZtdFtdID0geworLyogbi9hICAgICAqLwl7ICJuL2EiLCAgICAgMCwgMCB9LAorLyogR1JFWSAgICAqLwl7ICJHUkFZIiwgICAgMCwgMCB9LAorLyogSEkyNDAgICAqLwl7ICJISTI0MCIsICAgMCwgMCB9LAorLyogUkdCNTY1ICAqLwl7ICJSR0I1NjUiLCAgWk9SQU5fVkZFQ19SR0JfUkdCNTY1fEVORElBTkVTUywgMiB9LAorLyogUkdCMjQgICAqLwl7ICJSR0IyNCIsICAgWk9SQU5fVkZFQ19SR0JfUkdCODg4fEVORElBTkVTU3xaT1JBTl9WRkVDX1BBQ0syNCwgMyB9LAorLyogUkdCMzIgICAqLwl7ICJSR0IzMiIsICAgWk9SQU5fVkZFQ19SR0JfUkdCODg4fEVORElBTkVTUywgNCB9LAorLyogUkdCNTU1ICAqLwl7ICJSR0I1NTUiLCAgWk9SQU5fVkZFQ19SR0JfUkdCNTU1fEVORElBTkVTUywgMiB9LAorLyogWVVWNDIyICAqLwl7ICJZVVY0MjIiLCAgWk9SQU5fVkZFQ19SR0JfWVVWNDIyfEVORElBTkVTUywgMiB9LAorLyogWVVZViAgICAqLwl7ICJZVVlWIiwgICAgMCwgMCB9LAorLyogVVlWWSAgICAqLwl7ICJVWVZZIiwgICAgMCwgMCB9LAorLyogWVVWNDIwICAqLwl7ICJZVVY0MjAiLCAgMCwgMCB9LAorLyogWVVWNDExICAqLwl7ICJZVVY0MTEiLCAgMCwgMCB9LAorLyogUkFXICAgICAqLwl7ICJSQVciLCAgICAgMCwgMCB9LAorLyogWVVWNDIyUCAqLwl7ICJZVVY0MjJQIiwgMCwgMCB9LAorLyogWVVWNDExUCAqLwl7ICJZVVY0MTFQIiwgMCwgMCB9fTsKKyNkZWZpbmUgTlJQQUxFVFRFUyAoc2l6ZW9mKHBhbGV0dGUyZm10KS9zaXplb2YocGFsZXR0ZTJmbXRbMF0pKQorI3VuZGVmIEVORElBTkVTUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogWk9SQU4gY2hpcHNldCBkZXRlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gYnR0di5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmVhc29uIGZvciBiZWVpbmcgaGVyZTogd2UgbmVlZCB0byBkZXRlY3QgaWYgd2UgYXJlIHJ1bm5pbmcgb24gYSAgICAgICAgKi8KKy8qIFRyaXRvbiBiYXNlZCBjaGlwc2V0LCBhbmQgaWYgc28sIGVuYWJsZSBhIGNlcnRhaW4gYml0ICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljCit2b2lkIF9faW5pdCBoYW5kbGVfY2hpcHNldCh2b2lkKQoreworCS8qIEp1c3QgaW4gY2FzZSBzb21lIG51dCBzZXQgdGhpcyB0byBzb21ldGhpbmcgZGFuZ2Vyb3VzICovCisJaWYgKHRyaXRvbjEpCisJCXRyaXRvbjEgPSBaT1JBTl9WRENfVFJJQ09NOworCisJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfVFJJVE9OKSB7CisJCXByaW50ayhLRVJOX0lORk8gInpvcmFuOiBIb3N0IGJyaWRnZSA4MjQzN0ZYIFRyaXRvbiBQSUlYXG4iKTsKKwkJdHJpdG9uMSA9IFpPUkFOX1ZEQ19UUklDT007CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogWk9SQU4gZnVuY3Rpb25zCQkJCQkJCSAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCB6b3Jhbl9zZXRfZ2VvKHN0cnVjdCB6b3JhbiogenR2LCBzdHJ1Y3QgdmlkaW5mbyogaSk7CisKKyNpZiAwIC8qIHVudXNlZCAqLworc3RhdGljCit2b2lkIHpvcmFuX2R1bXAoc3RydWN0IHpvcmFuICp6dHYpCit7CisJY2hhcglzdHJbMjU2XTsKKwljaGFyCSpwPXN0cjsgLyogc2h1dCB1cCwgZ2NjISAqLworCWludAlpOworCisJZm9yIChpPTA7IGk8MHg2MDsgaSs9NCkgeworCQlpZiAoKGkgJSAxNikgPT0gMCkgeworCQkJaWYgKGkpIHByaW50aygiJXNcbiIsc3RyKTsKKwkJCXAgPSBzdHI7CisJCQlwKz0gc3ByaW50ZihzdHIsIEtFUk5fREVCVUcgIiAgICAgICAlMDR4OiAiLGkpOworCQl9CisJCXAgKz0gc3ByaW50ZihwLCAiJTA4eCAiLHpycmVhZChpKSk7CisJfQorfQorI2VuZGlmIC8qIHVudXNlZCAqLworCitzdGF0aWMKK3ZvaWQgcmVhcF9zdGF0ZXMoc3RydWN0IHpvcmFuKiB6dHYpCit7CisJLyogY291bnQgZnJhbWVzICovCisJenR2LT5maWVsZG5yKys7CisKKwkvKgorCSAqIEFyZSB3ZSBidXN5IGF0IGFsbD8KKwkgKiBUaGlzIGRlcGVuZHMgb24gaWYgdGhlcmUgaXMgYSB3b3JrcXVldWUgQU5EIHRoZQorCSAqIHZpZGVvdHJhbnNmZXIgaXMgZW5hYmxlZCBvbiB0aGUgY2hpcC4uLgorCSAqLworCWlmICh6dHYtPndvcmtxdWV1ZSAmJiAoenJyZWFkKFpPUkFOX1ZEQykgJiBaT1JBTl9WRENfVklERU4pKQorCXsKKwkJc3RydWN0IHZpZGluZm8qIG5ld2l0ZW07CisKKwkJLyogZGlkIHdlIGdldCBhIGNvbXBsZXRlIGZyYW1lPyAqLworCQlpZiAoenJyZWFkKFpPUkFOX1ZTVFIpICYgWk9SQU5fVlNUUl9HUkFCKQorCQkJcmV0dXJuOworCitERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiY29tcGxldGVkICVzIGF0ICVwXG4iLENBUkQsenR2LT53b3JrcXVldWUtPmtpbmRvZj09RkJVRkZFUl9HUkFCPyJncmFiIjoicmVhZCIsenR2LT53b3JrcXVldWUpKTsKKworCQkvKiB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgYnVmZmVyLCB0ZWxsIGV2ZXJ5b25lICovCisJCXp0di0+d29ya3F1ZXVlLT5zdGF0dXMgPSBGQlVGRkVSX0RPTkU7CisJCXp0di0+d29ya3F1ZXVlLT5maWVsZG5yID0genR2LT5maWVsZG5yOworCQkvKiBub3QgZ29vZCwgaGVyZSBmb3IgQlRUVl9GSUVMRE5SIHJlYXNvbnMgKi8KKwkJenR2LT5sYXN0ZmllbGRuciA9IHp0di0+ZmllbGRucjsKKworCQlzd2l0Y2ggKHp0di0+d29ya3F1ZXVlLT5raW5kb2YpIHsKKwkJIGNhc2UgRkJVRkZFUl9HUkFCOgorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ6dHYtPmdyYWJxKTsKKwkJCWJyZWFrOworCQkgY2FzZSBGQlVGRkVSX1ZCSToKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenR2LT52YmlxKTsKKwkJCWJyZWFrOworCQkgZGVmYXVsdDoKKwkJCXByaW50ayhDQVJEX0lORk8gInNvbWVib2R5IGtpbGxlZCB0aGUgd29ya3F1ZXVlIChraW5kb2Y9JWQpIVxuIixDQVJELHp0di0+d29ya3F1ZXVlLT5raW5kb2YpOworCQl9CisKKwkJLyogaXRlbSBjb21wbGV0ZWQsIHNraXAgdG8gbmV4dCBpdGVtIGluIHF1ZXVlICovCisJCXdyaXRlX2xvY2soJnp0di0+bG9jayk7CisJCW5ld2l0ZW0gPSB6dHYtPndvcmtxdWV1ZS0+bmV4dDsKKwkJenR2LT53b3JrcXVldWUtPm5leHQgPSAwOwkvKiBtYXJrIGNvbXBsZXRlZCAqLworCQl6dHYtPndvcmtxdWV1ZSA9IG5ld2l0ZW07CisJCXdyaXRlX3VubG9jaygmenR2LT5sb2NrKTsKKwl9CisKKwkvKgorCSAqIG9rLCBzbyBpdCBzZWVtcyB3ZSBoYXZlIG5vdGhpbmcgaW4gcHJvZ3Jlc3MgcmlnaHQgbm93LgorCSAqIExldHMgc2VlIGlmIHdlIGNhbiBmaW5kIHNvbWUgd29yay4KKwkgKi8KKwlpZiAoenR2LT53b3JrcXVldWUpCisJeworCQlzdHJ1Y3QgdmlkaW5mbyogbmV3aXRlbTsKK2FnYWluOgorCitERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAic3RhcnRpbmcgJXMgYXQgJXBcbiIsQ0FSRCx6dHYtPndvcmtxdWV1ZS0+a2luZG9mPT1GQlVGRkVSX0dSQUI/ImdyYWIiOiJyZWFkIix6dHYtPndvcmtxdWV1ZSkpOworCisJCS8qIGxvYWR1cCB0aGUgZnJhbWUgc2V0dGluZ3MgKi8KKwkJcmVhZF9sb2NrKCZ6dHYtPmxvY2spOworCQl6b3Jhbl9zZXRfZ2VvKHp0dix6dHYtPndvcmtxdWV1ZSk7CisJCXJlYWRfdW5sb2NrKCZ6dHYtPmxvY2spOworCisJCXN3aXRjaCAoenR2LT53b3JrcXVldWUtPmtpbmRvZikgeworCQkgY2FzZSBGQlVGRkVSX0dSQUI6CisJCSBjYXNlIEZCVUZGRVJfVkJJOgorCQkJenJhbmQoflpPUkFOX09DUl9PVkxFTiwgWk9SQU5fT0NSKTsKKwkJCXpyb3IoWk9SQU5fVlNUUl9TTkFQU0hPVCxaT1JBTl9WU1RSKTsKKwkJCXpyb3IoWk9SQU5fVkRDX1ZJREVOLFpPUkFOX1ZEQyk7CisKKwkJCS8qIHN0YXJ0IHNpbmdsZS1zaG90IGdyYWIgKi8KKwkJCXpyb3IoWk9SQU5fVlNUUl9HUkFCLCBaT1JBTl9WU1RSKTsKKwkJCWJyZWFrOworCQkgZGVmYXVsdDoKKwkJCXByaW50ayhDQVJEX0lORk8gIndoYXQgaXMgdGhpcyBkb2luZyBvbiB0aGUgcXVldWU/IChraW5kb2Y9JWQpXG4iLENBUkQsenR2LT53b3JrcXVldWUtPmtpbmRvZik7CisJCQl3cml0ZV9sb2NrKCZ6dHYtPmxvY2spOworCQkJbmV3aXRlbSA9IHp0di0+d29ya3F1ZXVlLT5uZXh0OworCQkJenR2LT53b3JrcXVldWUtPm5leHQgPSAwOworCQkJenR2LT53b3JrcXVldWUgPSBuZXdpdGVtOworCQkJd3JpdGVfdW5sb2NrKCZ6dHYtPmxvY2spOworCQkJaWYgKG5ld2l0ZW0pCisJCQkJZ290byBhZ2FpbjsJLyogeWVhaCwgc3VyZS4uICovCisJCX0KKwkJLyogYnllIGZvciBub3cgKi8KKwkJcmV0dXJuOworCX0KK0RFQlVHKHByaW50ayhDQVJEX0RFQlVHICJub3RoaW5nIGluIHF1ZXVlXG4iLENBUkQpKTsKKworCS8qCisJICogV2hhdD8gRXZlbiB0aGUgd29ya3F1ZXVlIGlzIGVtcHR5PyBBbSBpIHJlYWxseSBoZXJlCisJICogZm9yIG5vdGhpbmc/IERpZCBpIGNvbWUgYWxsIHRoYXQgd2F5IHRvLi4uIGRvIG5vdGhpbmc/CisJICovCisKKwkvKiBkbyB3ZSBuZWVkIHRvIG92ZXJsYXk/ICovCisJaWYgKHRlc3RfYml0KFNUQVRFX09WRVJMQVksICZ6dHYtPnN0YXRlKSkKKwl7CisJCS8qIGFyZSB3ZSBhbHJlYWR5IG92ZXJsYXlpbmc/ICovCisJCWlmICghKHpycmVhZChaT1JBTl9PQ1IpICYgWk9SQU5fT0NSX09WTEVOKSB8fAorCQkgICAgISh6cnJlYWQoWk9SQU5fVkRDKSAmIFpPUkFOX1ZEQ19WSURFTikpCisJCXsKK0RFQlVHKHByaW50ayhDQVJEX0RFQlVHICJzdGFydGluZyBvdmVybGF5XG4iLENBUkQpKTsKKworCQkJcmVhZF9sb2NrKCZ6dHYtPmxvY2spOworCQkJem9yYW5fc2V0X2dlbyh6dHYsJnp0di0+b3ZlcmluZm8pOworCQkJcmVhZF91bmxvY2soJnp0di0+bG9jayk7CisKKwkJCXpyb3IoWk9SQU5fT0NSX09WTEVOLCBaT1JBTl9PQ1IpOworCQkJenJhbmQoflpPUkFOX1ZTVFJfU05BUFNIT1QsWk9SQU5fVlNUUik7CisJCQl6cm9yKFpPUkFOX1ZEQ19WSURFTixaT1JBTl9WREMpOworCQl9CisKKwkJLyoKKwkJICogbGVhdmUgb3ZlcmxheWluZyBvbiwgYnV0IHR1cm4gaW50ZXJydXB0cyBvZmYuCisJCSAqLworCQl6cmFuZCh+Wk9SQU5fSUNSX0VOLFpPUkFOX0lDUik7CisJCXJldHVybjsKKwl9CisKKwkvKiBkbyB3ZSBoYXZlIGFueSBWQkkgaWRsZSB0aW1lIHByb2Nlc3Npbmc/ICovCisJaWYgKHRlc3RfYml0KFNUQVRFX1ZCSSwgJnp0di0+c3RhdGUpKQorCXsKKwkJc3RydWN0IHZpZGluZm8qIGl0ZW07CisJCXN0cnVjdCB2aWRpbmZvKiBsYXN0aXRlbTsKKworCQkvKiBwcm90ZWN0IHRoZSB3b3JrcXVldWUgKi8KKwkJd3JpdGVfbG9jaygmenR2LT5sb2NrKTsKKwkJbGFzdGl0ZW0gPSB6dHYtPndvcmtxdWV1ZTsKKwkJaWYgKGxhc3RpdGVtKQorCQkJd2hpbGUgKGxhc3RpdGVtLT5uZXh0KSBsYXN0aXRlbSA9IGxhc3RpdGVtLT5uZXh0OworCQlmb3IgKGl0ZW09enR2LT5yZWFkaW5mbzsgaXRlbSE9enR2LT5yZWFkaW5mbytaT1JBTl9WQklfQlVGRkVSUzsgaXRlbSsrKQorCQkJaWYgKGl0ZW0tPm5leHQgPT0gMCAmJiBpdGVtLT5zdGF0dXMgPT0gRkJVRkZFUl9GUkVFKQorCQkJeworREVCVUcocHJpbnRrKENBUkRfREVCVUcgIiVwIGFkZGVkIHRvIHF1ZXVlXG4iLENBUkQsaXRlbSkpOworCQkJCWl0ZW0tPnN0YXR1cyA9IEZCVUZGRVJfQlVTWTsKKwkJCQlpZiAoIWxhc3RpdGVtKQorCQkJCQl6dHYtPndvcmtxdWV1ZSA9IGl0ZW07CisJCQkJZWxzZSAKKwkJCQkJbGFzdGl0ZW0tPm5leHQgPSBpdGVtOworCQkJCWxhc3RpdGVtID0gaXRlbTsKKwkJCX0KKwkJd3JpdGVfdW5sb2NrKCZ6dHYtPmxvY2spOworCQlpZiAoenR2LT53b3JrcXVldWUpCisJCQlnb3RvIGFnYWluOwkvKiBoZXksIF9pXyBncmFkdWF0ZWQgOikgKi8KKwl9CisKKwkvKgorCSAqIFRoZW4gd2UgbXVzdCBiZSByZWFseSBJRExFCisJICovCitERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAidHVybmluZyBvZmZcbiIsQ0FSRCkpOworCS8qIG5vdGhpbmcgZnVydGhlciB0byBkbywgZGlzYWJsZSBETUEgYW5kIGZ1cnRoZXIgSVJRcyAqLworCXpyYW5kKH5aT1JBTl9WRENfVklERU4sWk9SQU5fVkRDKTsKKwl6cmFuZCh+Wk9SQU5fSUNSX0VOLFpPUkFOX0lDUik7Cit9CisKK3N0YXRpYwordm9pZCB6b3Jhbl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdTMyIHN0YXQsZXN0YXQ7CisJaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3Qgem9yYW4gKnp0diA9IGRldl9pZDsKKworCVVOVVNFRChpcnEpOyBVTlVTRUQocmVncyk7CisJZm9yICg7OykgeworCQkvKiBnZXQvY2xlYXIgaW50ZXJydXB0IHN0YXR1cyBiaXRzICovCisJCXN0YXQ9enJyZWFkKFpPUkFOX0lTUik7CisJCWVzdGF0PXN0YXQgJiB6cnJlYWQoWk9SQU5fSUNSKTsKKwkJaWYgKCFlc3RhdCkKKwkJCXJldHVybjsKKwkJenJ3cml0ZShlc3RhdCxaT1JBTl9JU1IpOworCQlJREVCVUcocHJpbnRrKENBUkRfREVCVUcgImVzdGF0ICUwOHhcbiIsQ0FSRCxlc3RhdCkpOworCQlJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIiBzdGF0ICUwOHhcbiIsQ0FSRCxzdGF0KSk7CisKKwkJaWYgKGVzdGF0ICYgWk9SQU5fSVNSX0NPREUpCisJCXsKKwkJCUlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiQ29kUmVwbElSUVxuIixDQVJEKSk7CisJCX0KKwkJaWYgKGVzdGF0ICYgWk9SQU5fSVNSX0dJUlEwKQorCQl7CisJCQlJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIkdJUlEwXG4iLENBUkQpKTsKKwkJCWlmICghenR2LT5jYXJkLT51c2VnaXJxMSkKKwkJCQlyZWFwX3N0YXRlcyh6dHYpOworCQl9CisJCWlmIChlc3RhdCAmIFpPUkFOX0lTUl9HSVJRMSkKKwkJeworCQkJSURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJHSVJRMVxuIixDQVJEKSk7CisJCQlpZiAoenR2LT5jYXJkLT51c2VnaXJxMSkKKwkJCQlyZWFwX3N0YXRlcyh6dHYpOworCQl9CisKKwkJY291bnQrKzsKKwkJaWYgKGNvdW50ID4gMTApCisJCQlwcmludGsoQ0FSRF9FUlIgImlycSBsb29wICVkICgleClcbiIsQ0FSRCxjb3VudCxlc3RhdCk7CisJCWlmIChjb3VudCA+IDIwKQorCQl7CisJCQl6cndyaXRlKDAsIFpPUkFOX0lDUik7CisJCQlwcmludGsoQ0FSRF9FUlIgIklSUSBsb2NrdXAsIGNsZWFyZWQgaW50IG1hc2tcbiIsQ0FSRCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYworaW50IHpvcmFuX211eHNlbChzdHJ1Y3Qgem9yYW4qIHp0diwgaW50IGNoYW5uZWwsIGludCBub3JtKQoreworCWludAlydjsKKworCS8qIHNldCB0aGUgbmV3IHZpZGVvIG5vcm0gKi8KKwlydiA9IGkyY19jb250cm9sX2RldmljZSgmKHp0di0+aTJjKSwgSTJDX0RSSVZFUklEX1ZJREVPREVDT0RFUiwgREVDT0RFUl9TRVRfTk9STSwgJm5vcm0pOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCXp0di0+bm9ybSA9IG5vcm07CisKKwkvKiBtYXAgdGhlIGdpdmVuIGNoYW5uZWwgdG8gdGhlIGNhcmRzIGRlY29kZXIncyBjaGFubmVsICovCisJY2hhbm5lbCA9IHp0di0+Y2FyZC0+dmlkZW9fbXV4W2NoYW5uZWxdICYgQ0hBTk5FTF9NQVNLOworCisJLyogc2V0IHRoZSBuZXcgY2hhbm5lbCAqLworCXJ2ID0gaTJjX2NvbnRyb2xfZGV2aWNlKCYoenR2LT5pMmMpLCBJMkNfRFJJVkVSSURfVklERU9ERUNPREVSLCBERUNPREVSX1NFVF9JTlBVVCwgJmNoYW5uZWwpOworCXJldHVybiBydjsKK30KKworLyogVGVsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2hhdCB0byB0by4gICovCitzdGF0aWMKK3ZvaWQgem9yYW5fY2FwKHN0cnVjdCB6b3JhbiogenR2LCBpbnQgb24pCit7CitERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiem9yYW5fY2FwKCVkKSBzdGF0ZT0leFxuIixDQVJELG9uLHp0di0+c3RhdGUpKTsKKworCWlmIChvbikgeworCQl6dHYtPnJ1bm5pbmcgPSAxOworCisJCS8qCisJCSAqIHR1cm4gaW50ZXJydXB0cyAoYmFjaykgb24uIFRoZSBETUEgd2lsbCBiZSBlbmFibGVkCisJCSAqIGluc2lkZSB0aGUgaXJxIGhhbmRsZXIgd2hlbiBpdCBkZXRlY3RzIGEgcmVzdGFydC4KKwkJICovCisJCXpyb3IoWk9SQU5fSUNSX0VOLFpPUkFOX0lDUik7CisJfQorCWVsc2UgeworCQkvKgorCQkgKiB0dXJuIGJvdGggaW50ZXJydXB0cyBhbmQgRE1BIG9mZgorCQkgKi8KKwkJenJhbmQoflpPUkFOX1ZEQ19WSURFTixaT1JBTl9WREMpOworCQl6cmFuZCh+Wk9SQU5fSUNSX0VOLFpPUkFOX0lDUik7CisKKwkJenR2LT5ydW5uaW5nID0gMDsKKwl9Cit9CisKK3N0YXRpYyB1bG9uZyBkbWFza1tdID0geworCTB4RkZGRkZGRkYsIDB4RkZGRkZGRkUsIDB4RkZGRkZGRkMsIDB4RkZGRkZGRjgsCisJMHhGRkZGRkZGMCwgMHhGRkZGRkZFMCwgMHhGRkZGRkZDMCwgMHhGRkZGRkY4MCwKKwkweEZGRkZGRjAwLCAweEZGRkZGRTAwLCAweEZGRkZGQzAwLCAweEZGRkZGODAwLAorCTB4RkZGRkYwMDAsIDB4RkZGRkUwMDAsIDB4RkZGRkMwMDAsIDB4RkZGRjgwMDAsCisJMHhGRkZGMDAwMCwgMHhGRkZFMDAwMCwgMHhGRkZDMDAwMCwgMHhGRkY4MDAwMCwKKwkweEZGRjAwMDAwLCAweEZGRTAwMDAwLCAweEZGQzAwMDAwLCAweEZGODAwMDAwLAorCTB4RkYwMDAwMDAsIDB4RkUwMDAwMDAsIDB4RkMwMDAwMDAsIDB4RjgwMDAwMDAsCisJMHhGMDAwMDAwMCwgMHhFMDAwMDAwMCwgMHhDMDAwMDAwMCwgMHg4MDAwMDAwMAorfTsKKworc3RhdGljCit2b2lkIHpvcmFuX2J1aWx0X292ZXJsYXkoc3RydWN0IHpvcmFuKiB6dHYsIGludCBjb3VudCwgc3RydWN0IHZpZGVvX2NsaXAgKnZjcCkKK3sKKwl1bG9uZyoJbXRvcDsKKwlpbnQJeXN0ZXAgPSAoenR2LT52aWRYc2hpZnQgKyB6dHYtPnZpZFdpZHRoKzMxKS8zMjsJLyogbmV4dCBEV09SRCAqLworCWludAlpOworCitERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiICAgICAgIG92ZXJsYXkgYXQgJXAsIHlzdGVwPSVkLCBjbGlwcz0lZFxuIix6dHYtPm92ZXJpbmZvLm92ZXJsYXkseXN0ZXAsY291bnQpKTsKKworCWZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKKwkJc3RydWN0IHZpZGVvX2NsaXAgKnZwID0gdmNwK2k7CisJCVVOVVNFRCh2cCk7CitERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiICAgICAgICVkOiBjbGlwKCVkLCVkLCVkLCVkKVxuIiwgaSx2cC0+eCx2cC0+eSx2cC0+d2lkdGgsdnAtPmhlaWdodCkpOworCX0KKworCS8qCisJICogYWN0aXZhdGUgdGhlIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc2NyZWVuCisJICogTm90ZSB3ZSB0YWtlIHNvbWUgc2hvcnRjdXRzIGhlcmUsIGJlY2F1c2Ugd2UKKwkgKiBrbm93IHRoZSB3aWR0aCBjYW4gbmV2ZXIgYmUgPCAzMi4gKEkuZS4gYSBEV09SRCkKKwkgKiBXZSBhbHNvIGFzc3VtZSB0aGUgb3ZlcmxheSBzdGFydHMgc29tZXdoZXJlIGluCisJICogdGhlIEZJUlNUIGR3b3JkLgorCSAqLworCXsKKwkJaW50IHN0YXJ0ID0genR2LT52aWRYc2hpZnQ7CisJCXVsb25nIGZpcnN0ZCA9IGRtYXNrW3N0YXJ0XTsKKwkJdWxvbmcgbGFzdGQgPSB+ZG1hc2tbKHN0YXJ0ICsgenR2LT5vdmVyaW5mby53KSAmIDMxXTsKKwkJbXRvcCA9IHp0di0+b3ZlcmluZm8ub3ZlcmxheTsKKwkJZm9yIChpPTA7IGk8enR2LT5vdmVyaW5mby5oOyBpKyspIHsKKwkJCWludCB3ID0genR2LT52aWRXaWR0aDsKKwkJCXVsb25nKiBsaW5lID0gbXRvcDsKKwkJCWlmIChzdGFydCAmIDMxKSB7CisJCQkJKmxpbmUrKyA9IGZpcnN0ZDsKKwkJCQl3IC09IDMyLShzdGFydCYzMSk7CisJCQl9CisJCQltZW1zZXQobGluZSwgfjAsIHcvOCk7CisJCQlpZiAodyAmIDMxKQorCQkJCWxpbmVbdy8zMl0gPSBsYXN0ZDsKKwkJCW10b3AgKz0geXN0ZXA7CisJCX0KKwl9CisKKwkvKiBwcm9jZXNzIGNsaXBwaW5nIHJlZ2lvbnMgKi8KKwlmb3IgKGk9MDsgaTxjb3VudDsgaSsrKSB7CisJCWludCBoOworCQlpZiAodmNwLT54IDwgMCB8fCAodWludCl2Y3AtPnggPiB6dHYtPm92ZXJpbmZvLncgfHwKKwkJICAgIHZjcC0+eSA8IDAgfHwgdmNwLT55ID4genR2LT5vdmVyaW5mby5oIHx8CisJCSAgICB2Y3AtPndpZHRoIDwgMCB8fCAodWludCkodmNwLT54K3ZjcC0+d2lkdGgpID4genR2LT5vdmVyaW5mby53IHx8CisJCSAgICB2Y3AtPmhlaWdodCA8IDAgfHwgKHZjcC0+eSt2Y3AtPmhlaWdodCkgPiB6dHYtPm92ZXJpbmZvLmgpCisJCXsKKwkJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJpbnZhbGlkIGNsaXB6b25lICglZCwlZCwlZCwlZCkgbm90IGluICgwLDAsJWQsJWQpLCBhZGFwdGluZ1xuIixDQVJELHZjcC0+eCx2Y3AtPnksdmNwLT53aWR0aCx2Y3AtPmhlaWdodCx6dHYtPm92ZXJpbmZvLncsenR2LT5vdmVyaW5mby5oKSk7CisJCQlpZiAodmNwLT54IDwgMCkgdmNwLT54ID0gMDsKKwkJCWlmICgodWludCl2Y3AtPnggPiB6dHYtPm92ZXJpbmZvLncpIHZjcC0+eCA9IHp0di0+b3ZlcmluZm8udzsKKwkJCWlmICh2Y3AtPnkgPCAwKSB2Y3AtPnkgPSAwOworCQkJaWYgKHZjcC0+eSA+IHp0di0+b3ZlcmluZm8uaCkgdmNwLT55ID0genR2LT5vdmVyaW5mby5oOworCQkJaWYgKHZjcC0+d2lkdGggPCAwKSB2Y3AtPndpZHRoID0gMDsKKwkJCWlmICgodWludCkodmNwLT54K3ZjcC0+d2lkdGgpID4genR2LT5vdmVyaW5mby53KSB2Y3AtPndpZHRoID0genR2LT5vdmVyaW5mby53IC0gdmNwLT54OworCQkJaWYgKHZjcC0+aGVpZ2h0IDwgMCkgdmNwLT5oZWlnaHQgPSAwOworCQkJaWYgKHZjcC0+eSt2Y3AtPmhlaWdodCA+IHp0di0+b3ZlcmluZm8uaCkgdmNwLT5oZWlnaHQgPSB6dHYtPm92ZXJpbmZvLmggLSB2Y3AtPnk7CisvLwkJCWNvbnRpbnVlOworCQl9CisKKwkJbXRvcCA9ICZ6dHYtPm92ZXJpbmZvLm92ZXJsYXlbdmNwLT55KnlzdGVwXTsKKwkJZm9yIChoPTA7IGg8PXZjcC0+aGVpZ2h0OyBoKyspIHsKKwkJCWludCB3OworCQkJaW50IHggPSB6dHYtPnZpZFhzaGlmdCArIHZjcC0+eDsKKwkJCWZvciAodz0wOyB3PD12Y3AtPndpZHRoOyB3KyspIHsKKwkJCQljbGVhcl9iaXQoeCYzMSwgJm10b3BbeC8zMl0pOworCQkJCXgrKzsKKwkJCX0KKwkJCW10b3AgKz0geXN0ZXA7CisJCX0KKwkJKyt2Y3A7CisJfQorCisJbXRvcCA9IHp0di0+b3ZlcmluZm8ub3ZlcmxheTsKKwl6cndyaXRlKHZpcnRfdG9fYnVzKG10b3ApLCBaT1JBTl9NVE9QKTsKKwl6cndyaXRlKHZpcnRfdG9fYnVzKG10b3AreXN0ZXApLCBaT1JBTl9NQk9UKTsKKwl6cmFvcigoenR2LT52aWRJbnRlcmxhY2UqeXN0ZXApPDwwLH5aT1JBTl9PQ1JfTUFTS1NUUklERSxaT1JBTl9PQ1IpOworfQorCitzdHJ1Y3QgdHZub3JtIAoreworCXUxNiBXdCwgV2EsIEh0LCBIYSwgSFN0YXJ0LCBWU3RhcnQ7Cit9OworCitzdGF0aWMgc3RydWN0IHR2bm9ybSB0dm5vcm1zW10gPSB7CisJLyogUEFMLUJER0hJICovCisvKgl7IDg2NCwgNzIwLCA2MjUsIDU3NiwgMTMxLCAyMSB9LCovCisvKjAwKi8JeyA4NjQsIDc2OCwgNjI1LCA1NzYsIDgxLCAxNyB9LAorCS8qIE5UU0MgKi8KKy8qMDEqLwl7IDg1OCwgNzIwLCA1MjUsIDQ4MCwgMTIxLCAxMCB9LAorCS8qIFNFQ0FNICovCisvKjAyKi8JeyA4NjQsIDcyMCwgNjI1LCA1NzYsIDEzMSwgMjEgfSwKKwkvKiBCVzUwICovCisvKjAzKi8JeyA4NjQsIDcyMCwgNjI1LCA1NzYsIDEzMSwgMjEgfSwKKwkvKiBCVzYwICovCisvKjA0Ki8JeyA4NTgsIDcyMCwgNTI1LCA0ODAsIDEyMSwgMTAgfQorfTsKKyNkZWZpbmUgVFZOT1JNUyAoc2l6ZW9mKHR2bm9ybXMpL3NpemVvZih0dm5vcm0pKQorCisvKgorICogUHJvZ3JhbSB0aGUgY2hpcCBmb3IgYSBzZXR1cCBhcyBkZXNjcmliZWQgaW4gdGhlIHZpZGluZm8gc3RydWN0LgorICoKKyAqIFNpZGUtZWZmZWN0czogY2FsY3VsYXRlcyB2aWRYc2hpZnQsIHZpZEludGVybGFjZSwKKyAqIHZpZEhlaWdodCwgdmlkV2lkdGggd2hpY2ggYXJlIHVzZWQgaW4gYSBsYXRlciBzdGFnZQorICogdG8gY2FsY3VsYXRlIHRoZSBvdmVybGF5IG1hc2sKKyAqCisgKiBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uLCBhcyBzdWNoIGl0IGRvZXMgbm90IGNoZWNrIHRoZQorICogdmFsaWRpdHkgb2YgdGhlIHN0cnVjdCBtZW1iZXJzLi4uIFNwZWN0YWN1bGFpciBjcmFzaGVzIHdpbGwKKyAqIGZvbGxvdyAvdmVyeS8gcXVpY2sgd2hlbiB5b3UncmUgd3JvbmcgYW5kIHRoZSBjaGlwIHJpZ2h0IDopCisgKi8KK3N0YXRpYwordm9pZCB6b3Jhbl9zZXRfZ2VvKHN0cnVjdCB6b3JhbiogenR2LCBzdHJ1Y3QgdmlkaW5mbyogaSkKK3sKKwl1bG9uZwl0b3AsIGJvdDsKKwlpbnQJc3RyaWRlOworCWludAl3aW5XaWR0aCwgd2luSGVpZ2h0OworCWludAltYXhXaWR0aCwgbWF4SGVpZ2h0LCBtYXhYT2Zmc2V0LCBtYXhZT2Zmc2V0OworCWxvbmcJdmZlYzsKKworREVCVUcocHJpbnRrKENBUkRfREVCVUcgInNldF9nZW8ocmVjdD0oJWQsJWQsJWQsJWQpLCBub3JtPSVkLCBmb3JtYXQ9JWQsIGJwcD0lZCwgYnBsPSVkLCBidXNhZHI9JWx4LCBvdmVybGF5PSVwKVxuIixDQVJELGktPngsaS0+eSxpLT53LGktPmgsenR2LT5ub3JtLGktPmZvcm1hdCxpLT5icHAsaS0+YnBsLGktPmJ1c2FkcixpLT5vdmVybGF5KSk7CisKKwkvKgorCSAqIG1ha2Ugc3VyZSB0aGUgRE1BIHRyYW5zZmVycyBhcmUgaW5oaWJpdGVkIGR1cmluZyBvdXIKKwkgKiByZXByb2dyYW1taW5nIG9mIHRoZSBjaGlwCisJICovCisJenJhbmQoflpPUkFOX1ZEQ19WSURFTixaT1JBTl9WREMpOworCisJbWF4V2lkdGggPSB0dm5vcm1zW3p0di0+bm9ybV0uV2E7CisJbWF4SGVpZ2h0ID0gdHZub3Jtc1t6dHYtPm5vcm1dLkhhLzI7CisJbWF4WE9mZnNldCA9IHR2bm9ybXNbenR2LT5ub3JtXS5IU3RhcnQ7CisJbWF4WU9mZnNldCA9IHR2bm9ybXNbenR2LT5ub3JtXS5WU3RhcnQ7CisKKwkvKiBzZXR1cCB2ZmVjIHJlZ2lzdGVyIChrZWVwIEV4dEZsLFRvcEZpZWxkIGFuZCBWQ0xLUG9sIHNldHRpbmdzKSAqLworCXZmZWMgPSAoenJyZWFkKFpPUkFOX1ZGRUMpICYgKFpPUkFOX1ZGRUNfRVhURkx8Wk9SQU5fVkZFQ19UT1BGSUVMRHxaT1JBTl9WRkVDX1ZDTEtQT0wpKSB8CisJICAgICAgIChwYWxldHRlMmZtdFtpLT5mb3JtYXRdLm1vZGUgJiAoWk9SQU5fVkZFQ19SR0J8Wk9SQU5fVkZFQ19FUlJESUZ8Wk9SQU5fVkZFQ19MRXxaT1JBTl9WRkVDX1BBQ0syNCkpOworCisJLyoKKwkgKiBTZXQgdG9wLCBib3R0b20gcHRycy4gU2luY2UgdGhlc2UgbXVzdCBiZSBEV09SRCBhbGlnbmVkLAorCSAqIHBvc3NpYmxlIGFkanVzdCB0aGUgeCBhbmQgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuCisJICogc28gdGhlIGVuZHBvc2l0aW9uIHN0YXkgdGhlIHNhbWUuIFRoZSB2aWRYc2hpZnQgd2lsbCBtYWtlCisJICogc3VyZSB3ZSBhcmUgbm90IHdyaXRpbmcgcGl4ZWxzIGJlZm9yZSB0aGUgcmVxdWVzdGVkIHguCisJICovCisJenR2LT52aWRYc2hpZnQgPSAwOworCXdpbldpZHRoID0gaS0+dzsKKwlpZiAod2luV2lkdGggPCAwKQorCQl3aW5XaWR0aCA9IC13aW5XaWR0aDsKKwl0b3AgPSBpLT5idXNhZHIgKyBpLT54KmktPmJwcCArIGktPnkqaS0+YnBsOworCWlmICh0b3AgJiAzKSB7CisJCXp0di0+dmlkWHNoaWZ0ID0gKHRvcCAmIDMpIC8gaS0+YnBwOworCQl3aW5XaWR0aCArPSB6dHYtPnZpZFhzaGlmdDsKKwkJREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICB3aW5kb3cteCBzaGlmdGVkICVkIHBpeGVscyBsZWZ0XG4iLHp0di0+dmlkWHNoaWZ0KSk7CisJCXRvcCAmPSB+MzsKKwl9CisKKwkvKgorCSAqIGJvdHRvbSBwb2ludHMgdG8gbmV4dCBmcmFtZSBidXQgaW4gaW50ZXJsZWF2ZWQgbW9kZSB3ZSB3YW50CisJICogdG8gJ21peCcgdGhlIDIgZnJhbWVzIHRvIG9uZSBjYXB0dXJlLCBzbyAnYm90JyBwb2ludHMgdG8gb25lCisJICogKHBoeXNpY2FsKSBsaW5lIGJlbG93IHRoZSB0b3AgbGluZS4KKwkgKi8KKwlib3QgPSB0b3AgKyBpLT5icGw7CisJenJ3cml0ZSh0b3AsWk9SQU5fVlRPUCk7CisJenJ3cml0ZShib3QsWk9SQU5fVkJPVCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgd2luV2lkdGggaXMgRFdPUkQgYWxpZ25lZCB0b28sCisJICogdGhlcmVieSBhdXRvbWF0aWNseSBtYWtpbmcgc3VyZSB0aGUgc3RyaWRlIHRvIHRoZQorCSAqIG5leHQgbGluZSBpcyBEV09SRCBhbGlnbmVkIHRvbyAoYXMgcmVxdWlyZWQgYnkgc3BlYykuCisJICovCisJaWYgKCh3aW5XaWR0aCppLT5icHApICYgMykgeworREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICB3aW5kb3ctd2lkdGggZW5sYXJnZWQgYnkgJWQgcGl4ZWxzXG4iLCh3aW5XaWR0aCppLT5icHApICYgMykpOworCQl3aW5XaWR0aCArPSAod2luV2lkdGgqaS0+YnBwKSAmIDM7CisJfQorCisJLyogZGV0ZXJtaW5lIHRoZSBEaXNwTW9kZSBhbmQgc3RyaWRlICovCisJaWYgKGktPmggPj0gMCAmJiBpLT5oIDw9IG1heEhlaWdodCkgeworCQkvKiBzaW5nbGUgZnJhbWUgZ3JhYiBzdWZmaWNlcyBmb3IgdGhpcyBoZWlnaHQuICovCisJCXZmZWMgfD0gWk9SQU5fVkZFQ19ESVNQTU9EOworCQl6dHYtPnZpZEludGVybGFjZSA9IDA7CisJCXN0cmlkZSA9IGktPmJwbCAtICh3aW5XaWR0aCppLT5icHApOworCQl3aW5IZWlnaHQgPSBpLT5oOworCX0KKwllbHNlIHsKKwkJLyogaW50ZXJsZWF2aW5nIG5lZWRlZCBmb3IgdGhpcyBoZWlnaHQgKi8KKwkJenR2LT52aWRJbnRlcmxhY2UgPSAxOworCQlzdHJpZGUgPSBpLT5icGwqMiAtICh3aW5XaWR0aCppLT5icHApOworCQl3aW5IZWlnaHQgPSBpLT5oLzI7CisJfQorCWlmICh3aW5IZWlnaHQgPCAwKQkvKiBjYW4gaGFwcGVuIGZvciBWQkkhICovCisJCXdpbkhlaWdodCA9IC13aW5IZWlnaHQ7CisKKwkvKiBzYWZldHkgbmV0LCBzb21ldGltZXMgYnBsIGlzIHRvbyBzaG9ydD8/PyAqLworCWlmIChzdHJpZGU8MCkgeworREVCVUcocHJpbnRrKENBUkRfREVCVUcgIldBUk5JTkcgc3RyaWRlID0gJWRcbiIsQ0FSRCxzdHJpZGUpKTsKKwkJc3RyaWRlID0gMDsKKwl9CisKKwl6cmFvcigod2luSGVpZ2h0PDwxMil8KHdpbldpZHRoPDwwKSx+KFpPUkFOX1ZEQ19WSURXSU5IVHxaT1JBTl9WRENfVklEV0lOV0lEKSwgWk9SQU5fVkRDKTsKKwl6cmFvcihzdHJpZGU8PDE2LH5aT1JBTl9WU1RSX0RJU1BTVFJJREUsWk9SQU5fVlNUUik7CisKKwkvKiByZW1lbWJlciB2aWRXaWR0aCwgdmlkSGVpZ2h0IGZvciBvdmVybGF5IGNhbGN1bGF0aW9ucyAqLworCXp0di0+dmlkV2lkdGggPSB3aW5XaWR0aDsKKwl6dHYtPnZpZEhlaWdodCA9IHdpbkhlaWdodDsKK0RFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgdG9wPSUwOGx4LCBib3R0b209JTA4bHhcbiIsdG9wLGJvdCkpOworREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICB3aW5XaWR0aD0lZCwgd2luSGVpZ2h0PSVkXG4iLHdpbldpZHRoLHdpbkhlaWdodCkpOworREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICBtYXhXaWR0aD0lZCwgbWF4SGVpZ2h0PSVkXG4iLG1heFdpZHRoLG1heEhlaWdodCkpOworREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICBzdHJpZGU9JWRcbiIsc3RyaWRlKSk7CisKKwkvKgorCSAqIGRldGVybWluZSBob3Jpem9udGFsIHNjYWxlcyBhbmQgY3JvcHMKKwkgKi8KKwlpZiAoaS0+dyA8IDApIHsKKwkJaW50IEhzdGFydCA9IDE7CisJCWludCBIZW5kID0gSHN0YXJ0ICsgd2luV2lkdGg7CitERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiICAgICAgIFk6IHNjYWxlPTAsIHN0YXJ0PSVkLCBlbmQ9JWRcbiIsIEhzdGFydCwgSGVuZCkpOworCQl6cmFvcigoSHN0YXJ0PDwxMCl8KEhlbmQ8PDApLH4oWk9SQU5fVkZFSF9IU1RBUlR8Wk9SQU5fVkZFSF9IRU5EKSxaT1JBTl9WRkVIKTsKKwl9CisJZWxzZSB7CisJCWludCBXYSA9IG1heFdpZHRoOworCQlpbnQgWCA9ICh3aW5XaWR0aCo2NCtXYS0xKS9XYTsKKwkJaW50IFdlID0gd2luV2lkdGgqNjQvWDsKKwkJaW50IEhvckRjbSA9IDY0LVg7CisJCWludCBoY3JvcDEgPSAyKihXYS1XZSkvNDsKKwkJLyoKKwkJICogQlVHRklYOiBKdWhhIE51cm1lbGEgPGp1bmtpQHFuLWxwcjItMTY1LnF1aWNrbmV0LmluZXQuZmk+IAorCQkgKiBmb3VuZCB0aGUgc29sdXRpb24gdG8gdGhlIGNvbG9yIHBoYXNlIHNoaWZ0LgorCQkgKiBTZWUgQ2hhbmdlTG9nIGZvciB0aGUgZnVsbCBleHBsYW5hdGlvbikKKwkJICovCisJCWludCBIc3RhcnQgPSAobWF4WE9mZnNldCArIGhjcm9wMSkgfCAxOworCQlpbnQgSGVuZCA9IEhzdGFydCArIFdlIC0gMTsKKworREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICBYOiBzY2FsZT0lZCwgc3RhcnQ9JWQsIGVuZD0lZFxuIiwgSG9yRGNtLCBIc3RhcnQsIEhlbmQpKTsKKworCQl6cmFvcigoSHN0YXJ0PDwxMCl8KEhlbmQ8PDApLH4oWk9SQU5fVkZFSF9IU1RBUlR8Wk9SQU5fVkZFSF9IRU5EKSxaT1JBTl9WRkVIKTsKKwkJdmZlYyB8PSBIb3JEY208PDE0OworCisJCWlmIChIb3JEY208MTYpCisJCQl2ZmVjIHw9IFpPUkFOX1ZGRUNfSEZJTFRFUl8xOyAvKiBubyBmaWx0ZXIgKi8KKwkJZWxzZSBpZiAoSG9yRGNtPDMyKQorCQkJdmZlYyB8PSBaT1JBTl9WRkVDX0hGSUxURVJfMzsgLyogMyB0YXAgZmlsdGVyICovCisJCWVsc2UgaWYgKEhvckRjbTw0OCkKKwkJCXZmZWMgfD0gWk9SQU5fVkZFQ19IRklMVEVSXzQ7IC8qIDQgdGFwIGZpbHRlciAqLworCQllbHNlCXZmZWMgfD0gWk9SQU5fVkZFQ19IRklMVEVSXzU7IC8qIDUgdGFwIGZpbHRlciAqLworCX0KKworCS8qCisJICogRGV0ZXJtaW5lIHZlcnRpY2FsIHNjYWxlcyBhbmQgY3JvcHMKKwkgKgorCSAqIHdoZW4gaGVpZ2h0IGlzIG5lZ2F0aXZlLCB3ZSB3YW50IHRvIHJlYWQgc3RhcnRpbmcgYXQgbGluZSAwCisJICogT25lIGRheSBzb21lb25lIG1pZ2h0IG5lZWQgYWNjZXNzIHRvIHRoZXNlIGxpbmVzLi4uCisJICovCisJaWYgKGktPmggPCAwKSB7CisJCWludCBWc3RhcnQgPSAwOworCQlpbnQgVmVuZCA9IFZzdGFydCArIHdpbkhlaWdodDsKK0RFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgWTogc2NhbGU9MCwgc3RhcnQ9JWQsIGVuZD0lZFxuIiwgVnN0YXJ0LCBWZW5kKSk7CisJCXpyYW9yKChWc3RhcnQ8PDEwKXwoVmVuZDw8MCksfihaT1JBTl9WRkVWX1ZTVEFSVHxaT1JBTl9WRkVWX1ZFTkQpLFpPUkFOX1ZGRVYpOworCX0KKwllbHNlIHsKKwkJaW50IEhhID0gbWF4SGVpZ2h0OworCQlpbnQgWSA9ICh3aW5IZWlnaHQqNjQrSGEtMSkvSGE7CisJCWludCBIZSA9IHdpbkhlaWdodCo2NC9ZOworCQlpbnQgVmVyRGNtID0gNjQtWTsKKwkJaW50IHZjcm9wMSA9IDIqKEhhLUhlKS80OworCQlpbnQgVnN0YXJ0ID0gbWF4WU9mZnNldCArIHZjcm9wMTsKKwkJaW50IFZlbmQgPSBWc3RhcnQgKyBIZSAtIDE7CisKK0RFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgWTogc2NhbGU9JWQsIHN0YXJ0PSVkLCBlbmQ9JWRcbiIsIFZlckRjbSwgVnN0YXJ0LCBWZW5kKSk7CisJCXpyYW9yKChWc3RhcnQ8PDEwKXwoVmVuZDw8MCksfihaT1JBTl9WRkVWX1ZTVEFSVHxaT1JBTl9WRkVWX1ZFTkQpLFpPUkFOX1ZGRVYpOworCQl2ZmVjIHw9IFZlckRjbTw8ODsKKwl9CisKK0RFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgRjogZm9ybWF0PSVkKD0lcylcbiIsaS0+Zm9ybWF0LHBhbGV0dGUyZm10W2ktPmZvcm1hdF0ubmFtZSkpOworCisJLyogc2V0dXAgdGhlIHJlcXVlc3RlZCBmb3JtYXQgKi8KKwl6cndyaXRlKHZmZWMsIFpPUkFOX1ZGRUMpOworfQorCitzdGF0aWMKK3ZvaWQgem9yYW5fY29tbW9uX29wZW4oc3RydWN0IHpvcmFuKiB6dHYsIGludCBmbGFncykKK3sKKwlVTlVTRUQoZmxhZ3MpOworCisJLyogYWxyZWFkeSBvcGVuZWQ/ICovCisJaWYgKHp0di0+dXNlcnMrKyAhPSAwKQorCQlyZXR1cm47CisKKwkvKiB1bm11dGUgYXVkaW8gKi8KKwkvKiAvd2hhdC8gYXVkaW8/ICovCisKKwl6dHYtPnN0YXRlID0gMDsKKworCS8qIHNldHVwIHRoZSBlbmNvZGVyIHRvIHRoZSBpbml0aWFsIHZhbHVlcyAqLworCXp0di0+cGljdHVyZS5jb2xvdXI9MjU0PDw3OworCXp0di0+cGljdHVyZS5icmlnaHRuZXNzPTEyODw8ODsKKwl6dHYtPnBpY3R1cmUuaHVlPTEyODw8ODsKKwl6dHYtPnBpY3R1cmUuY29udHJhc3Q9MjE2PDw3OworCWkyY19jb250cm9sX2RldmljZSgmenR2LT5pMmMsIEkyQ19EUklWRVJJRF9WSURFT0RFQ09ERVIsIERFQ09ERVJfU0VUX1BJQ1RVUkUsICZ6dHYtPnBpY3R1cmUpOworCisJLyogZGVmYXVsdCB0byB0aGUgY29tcG9zaXRlIGlucHV0IHNpbmNlIG15IGNhbWVyYSBpcyB0aGVyZSAqLworCXpvcmFuX211eHNlbCh6dHYsIDAsIFZJREVPX01PREVfUEFMKTsKK30KKworc3RhdGljCit2b2lkIHpvcmFuX2NvbW1vbl9jbG9zZShzdHJ1Y3Qgem9yYW4qIHp0dikKK3sKKwlpZiAoLS16dHYtPnVzZXJzICE9IDApCisJCXJldHVybjsKKworCS8qIG11dGUgYXVkaW8gKi8KKwkvKiAvd2hhdC8gYXVkaW8/ICovCisKKwkvKiBzdG9wIHRoZSBjaGlwICovCisJem9yYW5fY2FwKHp0diwgMCk7Cit9CisKKy8qCisgKiBPcGVuIGEgem9yYW4gY2FyZC4gUmlnaHQgbm93IHRoZSBmbGFncyBhcmUganVzdCBhIGhhY2sKKyAqLworc3RhdGljIGludCB6b3Jhbl9vcGVuKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgaW50IGZsYWdzKQoreworCXN0cnVjdCB6b3JhbiAqenR2ID0gKHN0cnVjdCB6b3JhbiopZGV2OworCXN0cnVjdCB2aWRpbmZvKiBpdGVtOworCWNoYXIqIHBvczsKKworCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJvcGVuKGRldiwlZClcbiIsQ0FSRCxmbGFncykpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFdlIHJlYWxseSBzaG91bGQgYmUgZG9pbmcgbGF6eSBhbGxvY2luZy4uLgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogYWxsb2NhdGUgYSBmcmFtZSBidWZmZXIgKi8KKwlpZiAoIXp0di0+ZmJ1ZmZlcikKKwkJenR2LT5mYnVmZmVyID0gYm1hbGxvYyhaT1JBTl9NQVhfRkJVRlNJWkUpOworCWlmICghenR2LT5mYnVmZmVyKSB7CisJCS8qIGNvdWxkIG5vdCBnZXQgYSBidWZmZXIsIGJhaWwgb3V0ICovCisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJLyogYXQgdGhpcyB0aW1lIHdlIF9hbHdheXNfIGhhdmUgYSBmcmFtZWJ1ZmZlciAqLworCW1lbXNldCh6dHYtPmZidWZmZXIsMCxaT1JBTl9NQVhfRkJVRlNJWkUpOworCisJaWYgKCF6dHYtPm92ZXJpbmZvLm92ZXJsYXkpCisJCXp0di0+b3ZlcmluZm8ub3ZlcmxheSA9IGttYWxsb2MoMTAyNCoxMDI0LzgsIEdGUF9LRVJORUwpOworCWlmICghenR2LT5vdmVyaW5mby5vdmVybGF5KSB7CisJCS8qIGNvdWxkIG5vdCBnZXQgYW4gb3ZlcmxheSBidWZmZXIsIGJhaWwgb3V0ICovCisJCWJmcmVlKHp0di0+ZmJ1ZmZlciwgWk9SQU5fTUFYX0ZCVUZTSVpFKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwkvKiBhdCB0aGlzIHRpbWUgd2UgX2Fsd2F5c18gaGF2ZSBhIG92ZXJsYXkgKi8KKworCS8qIGNsZWFyIGJ1ZmZlciBzdGF0dXMsIGFuZCBnaXZlIHRoZW0gYSBETUFhYmxlIGFkZHJlc3MgKi8KKwlwb3MgPSB6dHYtPmZidWZmZXI7CisJZm9yIChpdGVtPXp0di0+Z3JhYmluZm87IGl0ZW0hPXp0di0+Z3JhYmluZm8rWk9SQU5fTUFYX0ZCVUZGRVJTOyBpdGVtKyspCisJeworCQlpdGVtLT5zdGF0dXMgPSBGQlVGRkVSX0ZSRUU7CisJCWl0ZW0tPm1lbWFkciA9IHBvczsKKwkJaXRlbS0+YnVzYWRyID0gdmlydF90b19idXMocG9zKTsKKwkJcG9zICs9IFpPUkFOX01BWF9GQlVGRkVSOworCX0KKworCS8qIGRvIHRoZSBjb21tb24gcGFydCBvZiBhbGwgb3BlbidzICovCisJem9yYW5fY29tbW9uX29wZW4oenR2LCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljCit2b2lkIHpvcmFuX2Nsb3NlKHN0cnVjdCB2aWRlb19kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3Qgem9yYW4gKnp0diA9IChzdHJ1Y3Qgem9yYW4qKWRldjsKKworCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJjbG9zZShkZXYpXG4iLENBUkQpKTsKKworCS8qIGRyaXZlciBzcGVjaWZpYyBjbG9zdXJlICovCisJY2xlYXJfYml0KFNUQVRFX09WRVJMQVksICZ6dHYtPnN0YXRlKTsKKworCXpvcmFuX2NvbW1vbl9jbG9zZSh6dHYpOworCisgICAgICAgIC8qCisgICAgICAgICAqICAgICAgVGhpcyBpcyBzdWNreSBidXQgcmlnaHQgbm93IEkgY2FuJ3QgZmluZCBhIGdvb2Qgd2F5IHRvCisgICAgICAgICAqICAgICAgYmUgc3VyZSBpdHMgc2FmZSB0byBmcmVlIHRoZSBidWZmZXIuIFdlIHdhaXQgNS02IGZpZWxkcworICAgICAgICAgKiAgICAgIHdoaWNoIGlzIG1vcmUgdGhhbiBzdWZmaWNpZW50IHRvIGJlIHN1cmUuCisgICAgICAgICAqLworICAgICAgICBtc2xlZXAoMTAwKTsJCQkvKiBXYWl0IDEvMTB0aCBvZiBhIHNlY29uZCAqLworCisJLyogZnJlZSB0aGUgYWxsb2NhdGVkIGZyYW1lYnVmZmVyICovCisJaWYgKHp0di0+ZmJ1ZmZlcikKKwkJYmZyZWUoIHp0di0+ZmJ1ZmZlciwgWk9SQU5fTUFYX0ZCVUZTSVpFICk7CisJenR2LT5mYnVmZmVyID0gMDsKKwlpZiAoenR2LT5vdmVyaW5mby5vdmVybGF5KQorCQlrZnJlZSggenR2LT5vdmVyaW5mby5vdmVybGF5ICk7CisJenR2LT5vdmVyaW5mby5vdmVybGF5ID0gMDsKKworfQorCisvKgorICogVGhpcyByZWFkIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgcmVlbnRyYW50IGluIGEgU01QIHNpdHVhdGlvbi4KKyAqCisgKiBUaGlzIGlzIG1hZGUgcG9zc2libGUgYnkgdGhlIHNwaW5sb2NrIHdoaWNoIGlzIGtlcHQgdGlsbCB3ZQorICogZm91bmQgYW5kIG1hcmtlZCBhIGJ1ZmZlciBmb3Igb3VyIG93biB1c2UuIFRoZSBsb2NrIG11c3QKKyAqIGJlIHJlbGVhc2VkIGFzIHNvb24gYXMgcG9zc2libGUgdG8gcHJldmVudCBsb2NrIGNvbnRlbnRpb24uCisgKi8KK3N0YXRpYworbG9uZyB6b3Jhbl9yZWFkKHN0cnVjdCB2aWRlb19kZXZpY2UqIGRldiwgY2hhciogYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgbm9uYmxvY2spCit7CisJc3RydWN0IHpvcmFuICp6dHYgPSAoc3RydWN0IHpvcmFuKilkZXY7CisJdW5zaWduZWQgbG9uZyBtYXg7CisJc3RydWN0IHZpZGluZm8qIHVudXNlZCA9IDA7CisJc3RydWN0IHZpZGluZm8qIGRvbmUgPSAwOworCisJREVCVUcocHJpbnRrKENBUkRfREVCVUcgInpvcmFuX3JlYWQoJXAsJWxkLCVkKVxuIixDQVJELGJ1Zixjb3VudCxub25ibG9jaykpOworCisJLyogZmluZCBvdXJzZWxmIGEgZnJlZSBvciBjb21wbGV0ZWQgYnVmZmVyICovCisJZm9yICg7OykgeworCQlzdHJ1Y3QgdmlkaW5mbyogaXRlbTsKKworCQl3cml0ZV9sb2NrX2lycSgmenR2LT5sb2NrKTsKKwkJZm9yIChpdGVtPXp0di0+Z3JhYmluZm87IGl0ZW0hPXp0di0+Z3JhYmluZm8rWk9SQU5fTUFYX0ZCVUZGRVJTOyBpdGVtKyspCisJCXsKKwkJCWlmICghdW51c2VkICYmIGl0ZW0tPnN0YXR1cyA9PSBGQlVGRkVSX0ZSRUUpCisJCQkJdW51c2VkID0gaXRlbTsKKwkJCWlmICghZG9uZSAmJiBpdGVtLT5zdGF0dXMgPT0gRkJVRkZFUl9ET05FKQorCQkJCWRvbmUgPSBpdGVtOworCQl9CisJCWlmIChkb25lIHx8IHVudXNlZCkKKwkJCWJyZWFrOworCisJCS8qIG5vIG1vcmUgZnJlZSBidWZmZXJzLCB3YWl0IGZvciB0aGVtLiAqLworCQl3cml0ZV91bmxvY2tfaXJxKCZ6dHYtPmxvY2spOworCQlpZiAobm9uYmxvY2spCisJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ6dHYtPmdyYWJxKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKwl9CisKKwkvKiBEbyB3ZSBoYXZlICdyZWFkeScgZGF0YT8gKi8KKwlpZiAoIWRvbmUpIHsKKwkJLyogbm8/IHRoYW4gdGhpcyB3aWxsIHRha2UgYSB3aGlsZS4uLiAqLworCQlpZiAobm9uYmxvY2spIHsKKwkJCXdyaXRlX3VubG9ja19pcnEoJnp0di0+bG9jayk7CisJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQl9CisKKwkJLyogbWFyayB0aGUgdW51c2VkIGJ1ZmZlciBhcyB3YW50ZWQgKi8KKwkJdW51c2VkLT5zdGF0dXMgPSBGQlVGRkVSX0JVU1k7CisJCXVudXNlZC0+dyA9IDMyMDsKKwkJdW51c2VkLT5oID0gMjQwOworCQl1bnVzZWQtPmZvcm1hdCA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7CisJCXVudXNlZC0+YnBwID0gcGFsZXR0ZTJmbXRbdW51c2VkLT5mb3JtYXRdLmJwcDsKKwkJdW51c2VkLT5icGwgPSB1bnVzZWQtPncgKiB1bnVzZWQtPmJwcDsKKwkJdW51c2VkLT5uZXh0ID0gMDsKKwkJeyAvKiBhZGQgdG8gdGFpbCBvZiBxdWV1ZSAqLworCQkgIHN0cnVjdCB2aWRpbmZvKiBvbGRmcmFtZSA9IHp0di0+d29ya3F1ZXVlOworCQkgIGlmICghb2xkZnJhbWUpIHp0di0+d29ya3F1ZXVlID0gdW51c2VkOworCQkgIGVsc2UgeworCQkgICAgd2hpbGUgKG9sZGZyYW1lLT5uZXh0KSBvbGRmcmFtZSA9IG9sZGZyYW1lLT5uZXh0OworCQkgICAgb2xkZnJhbWUtPm5leHQgPSB1bnVzZWQ7CisJCSAgfQorCQl9CisJCXdyaXRlX3VubG9ja19pcnEoJnp0di0+bG9jayk7CisKKwkJLyogdGVsbCB0aGUgc3RhdGUgbWFjaGluZSB3ZSB3YW50IGl0IGZpbGxlZCAvTk9XLyAqLworCQl6b3Jhbl9jYXAoenR2LCAxKTsKKworCQkvKiB3YWl0IHRpbGwgdGhpcyBidWZmZXIgZ2V0cyBncmFiYmVkICovCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh6dHYtPmdyYWJxLAorCQkJCSh1bnVzZWQtPnN0YXR1cyAhPSBGQlVGRkVSX0JVU1kpKTsKKwkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVJTlRSOworCQlkb25lID0gdW51c2VkOworCX0KKwllbHNlCisJCXdyaXRlX3VubG9ja19pcnEoJnp0di0+bG9jayk7CisKKwkvKiBZZXMhIHdlIGdvdCBkYXRhISAqLworCW1heCA9IGRvbmUtPmJwbCAqIGRvbmUtPmg7CisJaWYgKGNvdW50ID4gbWF4KQorCQljb3VudCA9IG1heDsKKwlpZiAoY29weV90b191c2VyKCh2b2lkKilidWYsIGRvbmUtPm1lbWFkciwgY291bnQpKQorCQljb3VudCA9IC1FRkFVTFQ7CisKKwkvKiBrZWVwIHRoZSBlbmdpbmUgcnVubmluZyAqLworCWRvbmUtPnN0YXR1cyA9IEZCVUZGRVJfRlJFRTsKKy8vCXpvcmFuX2NhcCh6dHYsMSk7CisKKwkvKiB0ZWxsIGxpc3RlbmVycyB0aGlzIGJ1ZmZlciBiZWNhbWUgZnJlZSAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenR2LT5ncmFicSk7CisKKwkvKiBnb29kYnllICovCisJREVCVUcocHJpbnRrKENBUkRfREVCVUcgInpvcmFuX3JlYWQoKSByZXR1cm5zICVsdVxuIixDQVJELGNvdW50KSk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMKK2xvbmcgem9yYW5fd3JpdGUoc3RydWN0IHZpZGVvX2RldmljZSogZGV2LCBjb25zdCBjaGFyKiBidWYsIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCBub25ibG9jaykKK3sKKwlzdHJ1Y3Qgem9yYW4gKnp0diA9IChzdHJ1Y3Qgem9yYW4gKilkZXY7CisJVU5VU0VEKHp0dik7IFVOVVNFRChkZXYpOyBVTlVTRUQoYnVmKTsgVU5VU0VEKGNvdW50KTsgVU5VU0VEKG5vbmJsb2NrKTsKKwlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiem9yYW5fd3JpdGVcbiIsQ0FSRCkpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMKK3Vuc2lnbmVkIGludCB6b3Jhbl9wb2xsKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHpvcmFuICp6dHYgPSAoc3RydWN0IHpvcmFuICopZGV2OworCXN0cnVjdCB2aWRpbmZvKiBpdGVtOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCXBvbGxfd2FpdChmaWxlLCAmenR2LT5ncmFicSwgd2FpdCk7CisKKwlmb3IgKGl0ZW09enR2LT5ncmFiaW5mbzsgaXRlbSE9enR2LT5ncmFiaW5mbytaT1JBTl9NQVhfRkJVRkZFUlM7IGl0ZW0rKykKKwkJaWYgKGl0ZW0tPnN0YXR1cyA9PSBGQlVGRkVSX0RPTkUpCisJCXsKKwkJCW1hc2sgfD0gKFBPTExJTiB8IFBPTExSRE5PUk0pOworCQkJYnJlYWs7CisJCX0KKworCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJ6b3Jhbl9wb2xsKCk9JXhcbiIsQ0FSRCxtYXNrKSk7CisKKwlyZXR1cm4gbWFzazsKK30KKworLyogYXBwZW5kIGEgbmV3IGNsaXByZWdpb24gdG8gdGhlIHZlY3RvciBvZiB2aWRlb19jbGlwcyAqLworc3RhdGljCit2b2lkIG5ld19jbGlwKHN0cnVjdCB2aWRlb193aW5kb3cqIHZ3LCBzdHJ1Y3QgdmlkZW9fY2xpcCogdmNwLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKwl2Y3BbdnctPmNsaXBjb3VudF0ueCA9IHg7CisJdmNwW3Z3LT5jbGlwY291bnRdLnkgPSB5OworCXZjcFt2dy0+Y2xpcGNvdW50XS53aWR0aCA9IHc7CisJdmNwW3Z3LT5jbGlwY291bnRdLmhlaWdodCA9IGg7CisJdnctPmNsaXBjb3VudCsrOworfQorCitzdGF0aWMKK2ludCB6b3Jhbl9pb2N0bChzdHJ1Y3QgdmlkZW9fZGV2aWNlKiBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgem9yYW4qIHp0diA9IChzdHJ1Y3Qgem9yYW4qKWRldjsKKworCXN3aXRjaCAoY21kKSB7CisJIGNhc2UgVklESU9DR0NBUDoKKwkgeworCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSBjOworCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiVklESU9DR0NBUFxuIixDQVJEKSk7CisKKwkJc3RyY3B5KGMubmFtZSx6dHYtPnZpZGVvX2Rldi5uYW1lKTsKKwkJYy50eXBlID0gVklEX1RZUEVfQ0FQVFVSRXwKKwkJCSBWSURfVFlQRV9PVkVSTEFZfAorCQkJIFZJRF9UWVBFX0NMSVBQSU5HfAorCQkJIFZJRF9UWVBFX0ZSQU1FUkFNfAorCQkJIFZJRF9UWVBFX1NDQUxFUzsKKwkJaWYgKHp0di0+aGF2ZV90dW5lcikKKwkJCWMudHlwZSB8PSBWSURfVFlQRV9UVU5FUjsKKwkJaWYgKHp0di0+aGF2ZV9kZWNvZGVyKSB7CisJCQljLmNoYW5uZWxzID0genR2LT5jYXJkLT52aWRlb19pbnB1dHM7CisJCQljLmF1ZGlvcyA9IHp0di0+Y2FyZC0+YXVkaW9faW5wdXRzOworCQl9IGVsc2UKKwkJCS8qIG5vIGRlY29kZXIgLT4gbm8gY2hhbm5lbHMgKi8KKwkJCWMuY2hhbm5lbHMgPSBjLmF1ZGlvcyA9IDA7CisJCWMubWF4d2lkdGggPSA3Njg7CisJCWMubWF4aGVpZ2h0ID0gNTc2OworCQljLm1pbndpZHRoID0gMzI7CisJCWMubWluaGVpZ2h0ID0gMzI7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCZjLHNpemVvZihjKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJIH0KKworCSBjYXNlIFZJRElPQ0dDSEFOOgorCSB7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsIHY7CisJCWludCBtdXg7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJnLHNpemVvZih2KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJRElPQ0dDSEFOKCVkKVxuIixDQVJELHYuY2hhbm5lbCkpOworCQl2LmZsYWdzPVZJREVPX1ZDX0FVRElPCisjaWZkZWYgVklERU9fVkNfTk9STQorCQkJfFZJREVPX1ZDX05PUk0KKyNlbmRpZgorCQkJOworCQl2LnR1bmVycz0wOworCQl2LnR5cGU9VklERU9fVFlQRV9DQU1FUkE7CisjaWZkZWYgSV9FWFBFQ1RfUE9TU0lCTEVfTk9STVNfSU5fVEhFX0FQSQorCQl2Lm5vcm09VklERU9fTU9ERV9QQUx8CisJCSAgICAgICBWSURFT19NT0RFX05UU0N8CisJCSAgICAgICBWSURFT19NT0RFX1NFQ0FNOworI2Vsc2UKKwkJdi5ub3JtPVZJREVPX01PREVfUEFMOworI2VuZGlmCisJCS8qIHRvbyBtYW55IGlucHV0cz8gbm8gZGVjb2RlciAtPiBubyBjaGFubmVscyAqLworCQlpZiAoIXp0di0+aGF2ZV9kZWNvZGVyIHx8IHYuY2hhbm5lbCA8IDAgfHwgIHYuY2hhbm5lbCA+PSB6dHYtPmNhcmQtPnZpZGVvX2lucHV0cykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIG5vdyBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgKi8KKwkJbXV4ID0genR2LT5jYXJkLT52aWRlb19tdXhbdi5jaGFubmVsXTsKKwkJaWYgKG11eCAmIElTX1RVTkVSKSB7CisJCQkvKiBsZXRzIGFzc3VtZSBvbmx5IG9uZSB0dW5lciwgeWVzPyAqLworCQkJc3RyY3B5KHYubmFtZSwiVGVsZXZpc2lvbiIpOworCQkJdi50eXBlID0gVklERU9fVFlQRV9UVjsKKwkJCWlmICh6dHYtPmhhdmVfdHVuZXIpIHsKKwkJCQl2LmZsYWdzIHw9IFZJREVPX1ZDX1RVTkVSOworCQkJCXYudHVuZXJzID0gMTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChtdXggJiBJU19TVkhTKQorCQkJc3ByaW50Zih2Lm5hbWUsIlMtVmlkZW8tJWQiLHYuY2hhbm5lbCk7CisJCWVsc2UKKwkJCXNwcmludGYodi5uYW1lLCJDVkJTLSVkIix2LmNoYW5uZWwpOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCZ2LHNpemVvZih2KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJIH0KKwkgY2FzZSBWSURJT0NTQ0hBTjoKKwkgewkvKiBzZXQgdmlkZW8gY2hhbm5lbCAqLworCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCB2OworCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZyxzaXplb2YodikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NTQ0hBTiglZCwlZClcbiIsQ0FSRCx2LmNoYW5uZWwsdi5ub3JtKSk7CisKKwkJLyogdG9vIG1hbnkgaW5wdXRzPyBubyBkZWNvZGVyIC0+IG5vIGNoYW5uZWxzICovCisJCWlmICghenR2LT5oYXZlX2RlY29kZXIgfHwgdi5jaGFubmVsID49IHp0di0+Y2FyZC0+dmlkZW9faW5wdXRzIHx8IHYuY2hhbm5lbCA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAodi5ub3JtICE9IFZJREVPX01PREVfUEFMICYmCisJCSAgICB2Lm5vcm0gIT0gVklERU9fTU9ERV9OVFNDICYmCisJCSAgICB2Lm5vcm0gIT0gVklERU9fTU9ERV9TRUNBTSAmJgorCQkgICAgdi5ub3JtICE9IFZJREVPX01PREVfQVVUTykKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCQkvKiBtYWtlIGl0IGhhcHBlbiwgbnIxISAqLworCQlyZXR1cm4gem9yYW5fbXV4c2VsKHp0dix2LmNoYW5uZWwsdi5ub3JtKTsKKwkgfQorCisJIGNhc2UgVklESU9DR1RVTkVSOgorCSB7CisJCXN0cnVjdCB2aWRlb190dW5lciB2OworCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZyxzaXplb2YodikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHVFVORVIoJWQpXG4iLENBUkQsdi50dW5lcikpOworCisJCS8qIE9ubHkgbm8gb3Igb25lIHR1bmVyIGZvciBub3cgKi8KKwkJaWYgKCF6dHYtPmhhdmVfdHVuZXIgfHwgdi50dW5lcikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN0cmNweSh2Lm5hbWUsIlRlbGV2aXNpb24iKTsKKwkJdi5yYW5nZWxvdyAgPSAwOworCQl2LnJhbmdlaGlnaCA9IH4wOworCQl2LmZsYWdzICAgICA9IFZJREVPX1RVTkVSX1BBTHxWSURFT19UVU5FUl9OVFNDfFZJREVPX1RVTkVSX1NFQ0FNOworCQl2Lm1vZGUgICAgICA9IHp0di0+bm9ybTsKKwkJdi5zaWduYWwgICAgPSAweEZGRkY7IC8qIHVua25vd24gKi8KKworCQlpZiAoY29weV90b191c2VyKGFyZywmdixzaXplb2YodikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCSB9CisJIGNhc2UgVklESU9DU1RVTkVSOgorCSB7CisJCXN0cnVjdCB2aWRlb190dW5lciB2OworCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZywgc2l6ZW9mKHYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiVklESU9DU1RVTkVSKCVkLCVkKVxuIixDQVJELHYudHVuZXIsdi5tb2RlKSk7CisKKwkJLyogT25seSBubyBvciBvbmUgdHVuZXIgZm9yIG5vdyAqLworCQlpZiAoIXp0di0+aGF2ZV90dW5lciB8fCB2LnR1bmVyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogYW5kIGl0IG9ubHkgaGFzIGNlcnRhaW4gdmFsaWQgbW9kZXMgKi8KKwkJaWYoIHYubW9kZSAhPSBWSURFT19NT0RFX1BBTCAmJgorCQkgICAgdi5tb2RlICE9IFZJREVPX01PREVfTlRTQyAmJgorCQkgICAgdi5tb2RlICE9IFZJREVPX01PREVfU0VDQU0pCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkJLyogZW5nYWdlISAqLworCQlyZXR1cm4gem9yYW5fbXV4c2VsKHp0dix2LnR1bmVyLHYubW9kZSk7CisJIH0KKworCSBjYXNlIFZJRElPQ0dQSUNUOgorCSB7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlIHAgPSB6dHYtPnBpY3R1cmU7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHUElDVFxuIixDQVJEKSk7CisJCXAuZGVwdGggPSB6dHYtPmRlcHRoOworCQlzd2l0Y2ggKHAuZGVwdGgpIHsKKwkJIGNhc2UgIDg6IHAucGFsZXR0ZT1WSURFT19QQUxFVFRFX1lVVjQyMjsKKwkJCSAgYnJlYWs7CisJCSBjYXNlIDE1OiBwLnBhbGV0dGU9VklERU9fUEFMRVRURV9SR0I1NTU7CisJCQkgIGJyZWFrOworCQkgY2FzZSAxNjogcC5wYWxldHRlPVZJREVPX1BBTEVUVEVfUkdCNTY1OworCQkJICBicmVhazsKKwkJIGNhc2UgMjQ6IHAucGFsZXR0ZT1WSURFT19QQUxFVFRFX1JHQjI0OworCQkJICBicmVhazsKKwkJIGNhc2UgMzI6IHAucGFsZXR0ZT1WSURFT19QQUxFVFRFX1JHQjMyOworCQkJICBicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGFyZywgJnAsIHNpemVvZihwKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJIH0KKwkgY2FzZSBWSURJT0NTUElDVDoKKwkgeworCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGFyZyxzaXplb2YocCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NTUElDVCglZCwlZCwlZCwlZCwlZCwlZCwlZClcbiIsQ0FSRCxwLmJyaWdodG5lc3MscC5odWUscC5jb2xvdXIscC5jb250cmFzdCxwLndoaXRlbmVzcyxwLmRlcHRoLHAucGFsZXR0ZSkpOworCisJCS8qIGRlcHRoIG11c3QgbWF0Y2ggd2l0aCBmcmFtZWJ1ZmZlciAqLworCQlpZiAocC5kZXB0aCAhPSB6dHYtPmRlcHRoKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogY2hlY2sgaWYgcGFsZXR0ZSBtYXRjaGVzIHRoaXMgYnBwICovCisJCWlmIChwLnBhbGV0dGU+TlJQQUxFVFRFUyB8fAorCQkgICAgcGFsZXR0ZTJmbXRbcC5wYWxldHRlXS5icHAgIT0genR2LT5vdmVyaW5mby5icHApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl3cml0ZV9sb2NrX2lycSgmenR2LT5sb2NrKTsKKwkJenR2LT5vdmVyaW5mby5mb3JtYXQgPSBwLnBhbGV0dGU7CisJCXp0di0+cGljdHVyZSA9IHA7CisJCXdyaXRlX3VubG9ja19pcnEoJnp0di0+bG9jayk7CisKKwkJLyogdGVsbCB0aGUgZGVjb2RlciAqLworCQlpMmNfY29udHJvbF9kZXZpY2UoJnp0di0+aTJjLCBJMkNfRFJJVkVSSURfVklERU9ERUNPREVSLCBERUNPREVSX1NFVF9QSUNUVVJFLCAmcCk7CisJCWJyZWFrOworCSB9CisKKwkgY2FzZSBWSURJT0NHV0lOOgorCSB7CisJCXN0cnVjdCB2aWRlb193aW5kb3cgdnc7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHV0lOXG4iLENBUkQpKTsKKwkJcmVhZF9sb2NrKCZ6dHYtPmxvY2spOworCQl2dy54ICAgICAgPSB6dHYtPm92ZXJpbmZvLng7CisJCXZ3LnkgICAgICA9IHp0di0+b3ZlcmluZm8ueTsKKwkJdncud2lkdGggID0genR2LT5vdmVyaW5mby53OworCQl2dy5oZWlnaHQgPSB6dHYtPm92ZXJpbmZvLmg7CisJCXZ3LmNocm9tYWtleT0gMDsKKwkJdncuZmxhZ3MgID0gMDsKKwkJaWYgKHp0di0+dmlkSW50ZXJsYWNlKQorCQkJdncuZmxhZ3N8PVZJREVPX1dJTkRPV19JTlRFUkxBQ0U7CisJCXJlYWRfdW5sb2NrKCZ6dHYtPmxvY2spOworCQlpZiAoY29weV90b191c2VyKGFyZywmdncsc2l6ZW9mKHZ3KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJIH0KKwkgY2FzZSBWSURJT0NTV0lOOgorCSB7CisJCXN0cnVjdCB2aWRlb193aW5kb3cgdnc7CisJCXN0cnVjdCB2aWRlb19jbGlwICp2Y3A7CisJCWludCBvbjsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2dyxhcmcsc2l6ZW9mKHZ3KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJRElPQ1NXSU4oJWQsJWQsJWQsJWQsJXgsJWQpXG4iLENBUkQsdncueCx2dy55LHZ3LndpZHRoLHZ3LmhlaWdodCx2dy5mbGFncyx2dy5jbGlwY291bnQpKTsKKworCQlpZiAodncuZmxhZ3MpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAodncuY2xpcGNvdW50IDwwIHx8IHZ3LmNsaXBjb3VudD4yNTYpCisJCQlyZXR1cm4gLUVET007ICAgLyogVG9vIG1hbnkhICovCisKKwkJLyoKKwkJICogICAgICBEbyBhbnkgY2xpcHMuCisJCSAqLworCQl2Y3AgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9fY2xpcCkqKHZ3LmNsaXBjb3VudCs0KSk7CisJCWlmICh2Y3A9PU5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKHZ3LmNsaXBjb3VudCAmJiBjb3B5X2Zyb21fdXNlcih2Y3AsdncuY2xpcHMsc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwKSp2dy5jbGlwY291bnQpKSB7CisJCQl2ZnJlZSh2Y3ApOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlvbiA9IHp0di0+cnVubmluZzsKKwkJaWYgKG9uKQorCQkJem9yYW5fY2FwKHp0diwgMCk7CisKKwkJLyoKKwkJICogc3RyYW5nZSwgaXQgc2VlbXMgeGF3dHYgc29tZXRpbWVzIGNhbGxzIHVzIHdpdGggMAorCQkgKiB3aWR0aCBhbmQvb3IgaGVpZ2h0LiBJZ25vcmUgdGhlc2UgdmFsdWVzCisJCSAqLworCQlpZiAodncueCA9PSAwKQorCQkJdncueCA9IHp0di0+b3ZlcmluZm8ueDsKKwkJaWYgKHZ3LnkgPT0gMCkKKwkJCXZ3LnkgPSB6dHYtPm92ZXJpbmZvLnk7CisKKwkJLyogYnkgbm93IHdlIGFyZSBjb21taXR0ZWQgdG8gdGhlIG5ldyBkYXRhLi4uICovCisJCXdyaXRlX2xvY2tfaXJxKCZ6dHYtPmxvY2spOworCQl6dHYtPm92ZXJpbmZvLnggPSB2dy54OworCQl6dHYtPm92ZXJpbmZvLnkgPSB2dy55OworCQl6dHYtPm92ZXJpbmZvLncgPSB2dy53aWR0aDsKKwkJenR2LT5vdmVyaW5mby5oID0gdncuaGVpZ2h0OworCQl3cml0ZV91bmxvY2tfaXJxKCZ6dHYtPmxvY2spOworCisJCS8qCisJCSAqICAgICAgSW1wb3NlIGRpc3BsYXkgY2xpcHMKKwkJICovCisJCWlmICh2dy54K3Z3LndpZHRoID4genR2LT5zd2lkdGgpCisJCQluZXdfY2xpcCgmdncsIHZjcCwgenR2LT5zd2lkdGgtdncueCwgMCwgdncud2lkdGgtMSwgdncuaGVpZ2h0LTEpOworCQlpZiAodncueSt2dy5oZWlnaHQgPiB6dHYtPnNoZWlnaHQpCisJCQluZXdfY2xpcCgmdncsIHZjcCwgMCwgenR2LT5zaGVpZ2h0LXZ3LnksIHZ3LndpZHRoLTEsIHZ3LmhlaWdodC0xKTsKKworCQkvKiBidWlsdCB0aGUgcmVxdWVzdGVkIGNsaXBwaW5nIHpvbmVzICovCisJCXpvcmFuX3NldF9nZW8oenR2LCAmenR2LT5vdmVyaW5mbyk7CisJCXpvcmFuX2J1aWx0X292ZXJsYXkoenR2LCB2dy5jbGlwY291bnQsIHZjcCk7CisJCXZmcmVlKHZjcCk7CisKKwkJLyogaWYgd2Ugd2VyZSBvbiwgcmVzdGFydCB0aGUgdmlkZW8gZW5naW5lICovCisJCWlmIChvbikKKwkJCXpvcmFuX2NhcCh6dHYsIDEpOworCQlicmVhazsKKwkgfQorCisJIGNhc2UgVklESU9DQ0FQVFVSRToKKwkgeworCQlpbnQgdjsKKwkJaWYgKGdldF91c2VyKHYsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NDQVBUVVJFKCVkKVxuIixDQVJELHYpKTsKKworCQlpZiAodj09MCkgeworCQkJY2xlYXJfYml0KFNUQVRFX09WRVJMQVksICZ6dHYtPnN0YXRlKTsKKwkJCXpvcmFuX2NhcCh6dHYsIDEpOworCQl9CisJCWVsc2UgeworCQkJLyogaXMgVklESU9DU0ZCVUYsIFZJRElPQ1NXSU4gZG9uZT8gKi8KKwkJCWlmICh6dHYtPm92ZXJpbmZvLmJ1c2Fkcj09MCB8fCB6dHYtPm92ZXJpbmZvLnc9PTAgfHwgenR2LT5vdmVyaW5mby5oPT0wKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlzZXRfYml0KFNUQVRFX09WRVJMQVksICZ6dHYtPnN0YXRlKTsKKwkJCXpvcmFuX2NhcCh6dHYsIDEpOworCQl9CisJCWJyZWFrOworCSB9CisKKwkgY2FzZSBWSURJT0NHRkJVRjoKKwkgeworCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyIHY7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHRkJVRlxuIixDQVJEKSk7CisJCXJlYWRfbG9jaygmenR2LT5sb2NrKTsKKwkJdi5iYXNlICAgPSAodm9pZCAqKXp0di0+b3ZlcmluZm8uYnVzYWRyOworCQl2LmhlaWdodCA9IHp0di0+c2hlaWdodDsKKwkJdi53aWR0aCAgPSB6dHYtPnN3aWR0aDsKKwkJdi5kZXB0aCAgPSB6dHYtPmRlcHRoOworCQl2LmJ5dGVzcGVybGluZSA9IHp0di0+b3ZlcmluZm8uYnBsOworCQlyZWFkX3VubG9jaygmenR2LT5sb2NrKTsKKwkJaWYoY29weV90b191c2VyKGFyZywgJnYsc2l6ZW9mKHYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwkgfQorCSBjYXNlIFZJRElPQ1NGQlVGOgorCSB7CisJCXN0cnVjdCB2aWRlb19idWZmZXIgdjsKKwkJaWYoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZyxzaXplb2YodikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NTRkJVRiglcCwlZCwlZCwlZCwlZClcbiIsQ0FSRCx2LmJhc2UsIHYud2lkdGgsdi5oZWlnaHQsdi5kZXB0aCx2LmJ5dGVzcGVybGluZSkpOworCisJCWlmICh2LmRlcHRoIT0xNSAmJiB2LmRlcHRoIT0xNiAmJiB2LmRlcHRoIT0yNCAmJiB2LmRlcHRoIT0zMikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAodi5ieXRlc3BlcmxpbmU8MSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoenR2LT5ydW5uaW5nKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJd3JpdGVfbG9ja19pcnEoJnp0di0+bG9jayk7CisJCXp0di0+b3ZlcmluZm8uYnVzYWRyICA9ICh1bG9uZyl2LmJhc2U7CisJCXp0di0+c2hlaWdodCAgICAgID0gdi5oZWlnaHQ7CisJCXp0di0+c3dpZHRoICAgICAgID0gdi53aWR0aDsKKwkJenR2LT5kZXB0aCAgICAgICAgPSB2LmRlcHRoOwkJLyogYml0cyBwZXIgcGl4ZWwgKi8KKwkJenR2LT5vdmVyaW5mby5icHAgPSAoKHYuZGVwdGgrMSkmMHgzOCkvODsvKiBieXRlcyBwZXIgcGl4ZWwgKi8KKwkJenR2LT5vdmVyaW5mby5icGwgPSB2LmJ5dGVzcGVybGluZTsJLyogYnl0ZXMgcGVyIGxpbmUgKi8KKwkJd3JpdGVfdW5sb2NrX2lycSgmenR2LT5sb2NrKTsKKwkJYnJlYWs7CisJIH0KKworCSBjYXNlIFZJRElPQ0tFWToKKwkgeworCQkvKiBXaWxsIGJlIGhhbmRsZWQgaGlnaGVyIHVwIC4uICovCisJCWJyZWFrOworCSB9CisKKwkgY2FzZSBWSURJT0NTWU5DOgorCSB7CisJCWludCBpOworCQlpZiAoZ2V0X3VzZXIoaSwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURFT0NTWU5DKCVkKVxuIixDQVJELGkpKTsKKwkJaWYgKGk8MCB8fCBpPlpPUkFOX01BWF9GQlVGRkVSUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlzd2l0Y2ggKHp0di0+Z3JhYmluZm9baV0uc3RhdHVzKSB7CisJCSBjYXNlIEZCVUZGRVJfRlJFRToKKwkJCXJldHVybiAtRUlOVkFMOworCQkgY2FzZSBGQlVGRkVSX0JVU1k6CisJCQkvKiB3YWl0IHRpbGwgdGhpcyBidWZmZXIgZ2V0cyBncmFiYmVkICovCisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoenR2LT5ncmFicSwKKwkJCQkJKHp0di0+Z3JhYmluZm9baV0uc3RhdHVzICE9IEZCVUZGRVJfQlVTWSkpOworCQkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRUlOVFI7CisJCQkvKiBkb24ndCBmYWxsIHRocm91Z2g7IGEgRE9ORSBidWZmZXIgaXMgbm90IFVOVVNFRCAqLworCQkJYnJlYWs7CisJCSBjYXNlIEZCVUZGRVJfRE9ORToKKwkJCXp0di0+Z3JhYmluZm9baV0uc3RhdHVzID0gRkJVRkZFUl9GUkVFOworCQkJLyogdGVsbCBwcGwgd2UgaGF2ZSBhIHNwYXJlIGJ1ZmZlciAqLworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ6dHYtPmdyYWJxKTsKKwkJCWJyZWFrOworCQl9CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURFT0NTWU5DKCVkKSByZXR1cm5zXG4iLENBUkQsaSkpOworCQlicmVhazsKKwkgfQorCisJIGNhc2UgVklESU9DTUNBUFRVUkU6CisJIHsKKwkJc3RydWN0IHZpZGVvX21tYXAgdm07CisJCXN0cnVjdCB2aWRpbmZvKiBmcmFtZTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2bSxhcmcsc2l6ZW9mKHZtKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJRElPQ01DQVBUVVJFKCVkLCglZCwlZCksJWQpXG4iLENBUkQsdm0uZnJhbWUsdm0ud2lkdGgsdm0uaGVpZ2h0LHZtLmZvcm1hdCkpOworCQlpZiAodm0uZnJhbWU8MCB8fCB2bS5mcmFtZT5aT1JBTl9NQVhfRkJVRkZFUlMgfHwKKwkJICAgIHZtLndpZHRoPDMyIHx8IHZtLndpZHRoPjc2OCB8fAorCQkgICAgdm0uaGVpZ2h0PDMyIHx8IHZtLmhlaWdodD41NzYgfHwKKwkJICAgIHZtLmZvcm1hdD5OUlBBTEVUVEVTIHx8CisJCSAgICBwYWxldHRlMmZtdFt2bS5mb3JtYXRdLm1vZGUgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIHdlIGFyZSBhbGxvd2VkIHRvIHRha2Ugb3ZlciBVTlVTRUQgYW5kIERPTkUgYnVmZmVycyAqLworCQlmcmFtZSA9ICZ6dHYtPmdyYWJpbmZvW3ZtLmZyYW1lXTsKKwkJaWYgKGZyYW1lLT5zdGF0dXMgPT0gRkJVRkZFUl9CVVNZKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQkvKiBzZXR1cCB0aGUgb3RoZXIgcGFyYW1ldGVycyBpZiB0aGV5IGFyZSBnaXZlbiAqLworCQl3cml0ZV9sb2NrX2lycSgmenR2LT5sb2NrKTsKKwkJZnJhbWUtPncgPSB2bS53aWR0aDsKKwkJZnJhbWUtPmggPSB2bS5oZWlnaHQ7CisJCWZyYW1lLT5mb3JtYXQgPSB2bS5mb3JtYXQ7CisJCWZyYW1lLT5icHAgPSBwYWxldHRlMmZtdFtmcmFtZS0+Zm9ybWF0XS5icHA7CisJCWZyYW1lLT5icGwgPSBmcmFtZS0+dypmcmFtZS0+YnBwOworCQlmcmFtZS0+c3RhdHVzID0gRkJVRkZFUl9CVVNZOworCQlmcmFtZS0+bmV4dCA9IDA7CisJCXsgLyogYWRkIHRvIHRhaWwgb2YgcXVldWUgKi8KKwkJICBzdHJ1Y3QgdmlkaW5mbyogb2xkZnJhbWUgPSB6dHYtPndvcmtxdWV1ZTsKKwkJICBpZiAoIW9sZGZyYW1lKSB6dHYtPndvcmtxdWV1ZSA9IGZyYW1lOworCQkgIGVsc2UgeworCQkgICAgd2hpbGUgKG9sZGZyYW1lLT5uZXh0KSBvbGRmcmFtZSA9IG9sZGZyYW1lLT5uZXh0OworCQkgICAgb2xkZnJhbWUtPm5leHQgPSBmcmFtZTsKKwkJICB9CisJCX0KKwkJd3JpdGVfdW5sb2NrX2lycSgmenR2LT5sb2NrKTsKKwkJem9yYW5fY2FwKHp0diwgMSk7CisJCWJyZWFrOworCSB9CisKKwkgY2FzZSBWSURJT0NHTUJVRjoKKwkgeworCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiBtYjsKKwkJaW50IGk7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHTUJVRlxuIixDQVJEKSk7CisJCW1iLnNpemUgPSBaT1JBTl9NQVhfRkJVRlNJWkU7CisJCW1iLmZyYW1lcyA9IFpPUkFOX01BWF9GQlVGRkVSUzsKKwkJZm9yIChpPTA7IGk8Wk9SQU5fTUFYX0ZCVUZGRVJTOyBpKyspCisJCQltYi5vZmZzZXRzW2ldID0gaSpaT1JBTl9NQVhfRkJVRkZFUjsKKwkJaWYoY29weV90b191c2VyKGFyZywgJm1iLHNpemVvZihtYikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCSB9CisKKwkgY2FzZSBWSURJT0NHVU5JVDoKKwkgeworCQlzdHJ1Y3QgdmlkZW9fdW5pdCB2dTsKKwkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJRElPQ0dVTklUXG4iLENBUkQpKTsKKwkJdnUudmlkZW8gPSB6dHYtPnZpZGVvX2Rldi5taW5vcjsKKwkJdnUudmJpID0genR2LT52YmlfZGV2Lm1pbm9yOworCQl2dS5yYWRpbyA9IFZJREVPX05PX1VOSVQ7CisJCXZ1LmF1ZGlvID0gVklERU9fTk9fVU5JVDsKKwkJdnUudGVsZXRleHQgPSBWSURFT19OT19VTklUOworCQlpZihjb3B5X3RvX3VzZXIoYXJnLCAmdnUsc2l6ZW9mKHZ1KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJIH0KKworCSBjYXNlIFZJRElPQ0dGUkVROgorCSB7CisJCXVuc2lnbmVkIGxvbmcgdiA9IHp0di0+dHVuZXJfZnJlcTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsJnYsc2l6ZW9mKHYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiVklESU9DR0ZSRVFcbiIsQ0FSRCkpOworCQlicmVhazsKKwkgfQorCSBjYXNlIFZJRElPQ1NGUkVROgorCSB7CisJCXVuc2lnbmVkIGxvbmcgdjsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2LCBhcmcsIHNpemVvZih2KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJRElPQ1NGUkVRXG4iLENBUkQpKTsKKworCQlpZiAoenR2LT5oYXZlX3R1bmVyKSB7CisJCQlpbnQgZml4bWUgPSB2OworCQkJaWYgKGkyY19jb250cm9sX2RldmljZSgmKHp0di0+aTJjKSwgSTJDX0RSSVZFUklEX1RVTkVSLCBUVU5FUl9TRVRfVFZGUkVRLCAmZml4bWUpIDwgMCkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQl6dHYtPnR1bmVyX2ZyZXEgPSB2OworCQlicmVhazsKKwkgfQorCisJIC8qIFdoeSBpc24ndCB0aGlzIGluIHRoZSBBUEk/CisJICAqIEFuZCB3aHkgZG9lc24ndCBpdCB0YWtlIGEgYnVmZmVyIG51bWJlcj8KKwkgY2FzZSBCVFRWX0ZJRUxETlI6IAorCSB7CisJCXVuc2lnbmVkIGxvbmcgdiA9IHp0di0+bGFzdGZpZWxkbnI7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCZ2LHNpemVvZih2KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIkJUVFZfRklFTEROUlxuIixDQVJEKSk7CisJCWJyZWFrOworCSB9CisJICovCisKKwkgZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYworaW50IHpvcmFuX21tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2aWRlb19kZXZpY2UqIGRldiwgY29uc3QgY2hhciogYWRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IHpvcmFuKiB6dHYgPSAoc3RydWN0IHpvcmFuKilkZXY7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9ICh1bnNpZ25lZCBsb25nKWFkcjsKKwl1bnNpZ25lZCBsb25nIHBvczsKKworCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJ6b3Jhbl9tbWFwKDB4JXAsJWxkKVxuIixDQVJELGFkcixzaXplKSk7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKHNpemUgPiBaT1JBTl9NQVhfRkJVRlNJWkUgfHwgIXp0di0+ZmJ1ZmZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzdGFydCBtYXBwaW5nIHRoZSB3aG9sZSBzaGFiYW5nIHRvIHVzZXIgbWVtb3J5ICovCisJcG9zID0gKHVuc2lnbmVkIGxvbmcpenR2LT5mYnVmZmVyOworCXdoaWxlIChzaXplPjApIHsKKwkJdW5zaWduZWQgbG9uZyBwZm4gPSB2aXJ0X3RvX3BoeXMoKHZvaWQqKXBvcykgPj4gUEFHRV9TSElGVDsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwZm4sIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB6cjM2MTIwX3RlbXBsYXRlPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiVU5TRVQiLAorCS50eXBlCQk9IFZJRF9UWVBFX1RVTkVSfFZJRF9UWVBFX0NBUFRVUkV8VklEX1RZUEVfT1ZFUkxBWSwKKwkuaGFyZHdhcmUJPSBWSURfSEFSRFdBUkVfWlIzNjEyMCwKKwkub3BlbgkJPSB6b3Jhbl9vcGVuLAorCS5jbG9zZQkJPSB6b3Jhbl9jbG9zZSwKKwkucmVhZAkJPSB6b3Jhbl9yZWFkLAorCS53cml0ZQkJPSB6b3Jhbl93cml0ZSwKKwkucG9sbAkJPSB6b3Jhbl9wb2xsLAorCS5pb2N0bAkJPSB6b3Jhbl9pb2N0bCwKKwkubW1hcAkJPSB6b3Jhbl9tbWFwLAorCS5taW5vcgkJPSAtMSwKK307CisKK3N0YXRpYworaW50IHZiaV9vcGVuKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgaW50IGZsYWdzKQoreworCXN0cnVjdCB6b3JhbiAqenR2ID0gZGV2LT5wcml2OworCXN0cnVjdCB2aWRpbmZvKiBpdGVtOworCisJREVCVUcocHJpbnRrKENBUkRfREVCVUcgInZiaV9vcGVuKGRldiwlZClcbiIsQ0FSRCxmbGFncykpOworCisJLyoKKwkgKiBEdXJpbmcgVkJJIGRldmljZSBvcGVuLCB3ZSBjb250aW5pb3VzbHkgZ3JhYiBWQkktbGlrZQorCSAqIGRhdGEgaW4gdGhlIHZiaSBidWZmZXIgd2hlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCisJICogT25seSB3aGVuIHRoZXJlIGlzIGFuIGV4cGxpY2l0IHJlcXVlc3QgZm9yIFZCSSBkYXRhCisJICogKHJlYWQgY2FsbCkgd2UgL2ZvcmNlLyBhIHJlYWQuCisJICovCisKKwkvKiBhbGxvY2F0ZSBidWZmZXJzICovCisJZm9yIChpdGVtPXp0di0+cmVhZGluZm87IGl0ZW0hPXp0di0+cmVhZGluZm8rWk9SQU5fVkJJX0JVRkZFUlM7IGl0ZW0rKykKKwl7CisJCWl0ZW0tPnN0YXR1cyA9IEZCVUZGRVJfRlJFRTsKKworCQkvKiBhbGxvYyAqLworCQlpZiAoIWl0ZW0tPm1lbWFkcikgeworCQkJaXRlbS0+bWVtYWRyID0gYm1hbGxvYyhaT1JBTl9WQklfQlVGU0laRSk7CisJCQlpZiAoIWl0ZW0tPm1lbWFkcikgeworCQkJCS8qIGNvdWxkIG5vdCBnZXQgYSBidWZmZXIsIGJhaWwgb3V0ICovCisJCQkJd2hpbGUgKGl0ZW0gIT0genR2LT5yZWFkaW5mbykgeworCQkJCQlpdGVtLS07CisJCQkJCWJmcmVlKGl0ZW0tPm1lbWFkciwgWk9SQU5fVkJJX0JVRlNJWkUpOworCQkJCQlpdGVtLT5tZW1hZHIgPSAwOworCQkJCQlpdGVtLT5idXNhZHIgPSAwOworCQkJCX0KKwkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQl9CisJCX0KKworCQkvKiBkZXRlcm1pbmUgdGhlIERNQWFibGUgYWRkcmVzcyAqLworCQlpdGVtLT5idXNhZHIgPSB2aXJ0X3RvX2J1cyhpdGVtLT5tZW1hZHIpOworCX0KKworCS8qIGRvIHRoZSBjb21tb24gcGFydCBvZiBhbGwgb3BlbidzICovCisJem9yYW5fY29tbW9uX29wZW4oenR2LCBmbGFncyk7CisKKwlzZXRfYml0KFNUQVRFX1ZCSSwgJnp0di0+c3RhdGUpOworCS8qIHN0YXJ0IHJlYWQtYWhlYWQgKi8KKwl6b3Jhbl9jYXAoenR2LCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMKK3ZvaWQgdmJpX2Nsb3NlKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgem9yYW4gKnp0diA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdmlkaW5mbyogaXRlbTsKKworCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJ2YmlfY2xvc2UoZGV2KVxuIixDQVJEKSk7CisKKwkvKiBkcml2ZXIgc3BlY2lmaWMgY2xvc3VyZSAqLworCWNsZWFyX2JpdChTVEFURV9WQkksICZ6dHYtPnN0YXRlKTsKKworCXpvcmFuX2NvbW1vbl9jbG9zZSh6dHYpOworCisgICAgICAgIC8qCisgICAgICAgICAqICAgICAgVGhpcyBpcyBzdWNreSBidXQgcmlnaHQgbm93IEkgY2FuJ3QgZmluZCBhIGdvb2Qgd2F5IHRvCisgICAgICAgICAqICAgICAgYmUgc3VyZSBpdHMgc2FmZSB0byBmcmVlIHRoZSBidWZmZXIuIFdlIHdhaXQgNS02IGZpZWxkcworICAgICAgICAgKiAgICAgIHdoaWNoIGlzIG1vcmUgdGhhbiBzdWZmaWNpZW50IHRvIGJlIHN1cmUuCisgICAgICAgICAqLworICAgICAgICBtc2xlZXAoMTAwKTsJCQkvKiBXYWl0IDEvMTB0aCBvZiBhIHNlY29uZCAqLworCisJZm9yIChpdGVtPXp0di0+cmVhZGluZm87IGl0ZW0hPXp0di0+cmVhZGluZm8rWk9SQU5fVkJJX0JVRkZFUlM7IGl0ZW0rKykKKwl7CisJCWlmIChpdGVtLT5tZW1hZHIpCisJCQliZnJlZShpdGVtLT5tZW1hZHIsIFpPUkFOX1ZCSV9CVUZTSVpFKTsKKwkJaXRlbS0+bWVtYWRyID0gMDsKKwl9CisKK30KKworLyoKKyAqIFRoaXMgcmVhZCBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIHJlZW50cmFudCBpbiBhIFNNUCBzaXR1YXRpb24uCisgKgorICogVGhpcyBpcyBtYWRlIHBvc3NpYmxlIGJ5IHRoZSBzcGlubG9jayB3aGljaCBpcyBrZXB0IHRpbGwgd2UKKyAqIGZvdW5kIGFuZCBtYXJrZWQgYSBidWZmZXIgZm9yIG91ciBvd24gdXNlLiBUaGUgbG9jayBtdXN0CisgKiBiZSByZWxlYXNlZCBhcyBzb29uIGFzIHBvc3NpYmxlIHRvIHByZXZlbnQgbG9jayBjb250ZW50aW9uLgorICovCitzdGF0aWMKK2xvbmcgdmJpX3JlYWQoc3RydWN0IHZpZGVvX2RldmljZSogZGV2LCBjaGFyKiBidWYsIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCBub25ibG9jaykKK3sKKwlzdHJ1Y3Qgem9yYW4gKnp0diA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIG1heDsKKwlzdHJ1Y3QgdmlkaW5mbyogdW51c2VkID0gMDsKKwlzdHJ1Y3QgdmlkaW5mbyogZG9uZSA9IDA7CisKKwlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAidmJpX3JlYWQoMHglcCwlbGQsJWQpXG4iLENBUkQsYnVmLGNvdW50LG5vbmJsb2NrKSk7CisKKwkvKiBmaW5kIG91cnNlbGYgYSBmcmVlIG9yIGNvbXBsZXRlZCBidWZmZXIgKi8KKwlmb3IgKDs7KSB7CisJCXN0cnVjdCB2aWRpbmZvKiBpdGVtOworCisJCXdyaXRlX2xvY2tfaXJxKCZ6dHYtPmxvY2spOworCQlmb3IgKGl0ZW09enR2LT5yZWFkaW5mbzsgaXRlbSE9enR2LT5yZWFkaW5mbytaT1JBTl9WQklfQlVGRkVSUzsgaXRlbSsrKSB7CisJCQlpZiAoIXVudXNlZCAmJiBpdGVtLT5zdGF0dXMgPT0gRkJVRkZFUl9GUkVFKQorCQkJCXVudXNlZCA9IGl0ZW07CisJCQlpZiAoIWRvbmUgJiYgaXRlbS0+c3RhdHVzID09IEZCVUZGRVJfRE9ORSkKKwkJCQlkb25lID0gaXRlbTsKKwkJfQorCQlpZiAoZG9uZSB8fCB1bnVzZWQpCisJCQlicmVhazsKKworCQkvKiBubyBtb3JlIGZyZWUgYnVmZmVycywgd2FpdCBmb3IgdGhlbS4gKi8KKwkJd3JpdGVfdW5sb2NrX2lycSgmenR2LT5sb2NrKTsKKwkJaWYgKG5vbmJsb2NrKQorCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmenR2LT52YmlxKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKwl9CisKKwkvKiBEbyB3ZSBoYXZlICdyZWFkeScgZGF0YT8gKi8KKwlpZiAoIWRvbmUpIHsKKwkJLyogbm8/IHRoYW4gdGhpcyB3aWxsIHRha2UgYSB3aGlsZS4uLiAqLworCQlpZiAobm9uYmxvY2spIHsKKwkJCXdyaXRlX3VubG9ja19pcnEoJnp0di0+bG9jayk7CisJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQl9CisJCQorCQkvKiBtYXJrIHRoZSB1bnVzZWQgYnVmZmVyIGFzIHdhbnRlZCAqLworCQl1bnVzZWQtPnN0YXR1cyA9IEZCVUZGRVJfQlVTWTsKKwkJdW51c2VkLT5uZXh0ID0gMDsKKwkJeyAvKiBhZGQgdG8gdGFpbCBvZiBxdWV1ZSAqLworCQkgIHN0cnVjdCB2aWRpbmZvKiBvbGRmcmFtZSA9IHp0di0+d29ya3F1ZXVlOworCQkgIGlmICghb2xkZnJhbWUpIHp0di0+d29ya3F1ZXVlID0gdW51c2VkOworCQkgIGVsc2UgeworCQkgICAgd2hpbGUgKG9sZGZyYW1lLT5uZXh0KSBvbGRmcmFtZSA9IG9sZGZyYW1lLT5uZXh0OworCQkgICAgb2xkZnJhbWUtPm5leHQgPSB1bnVzZWQ7CisJCSAgfQorCQl9CisJCXdyaXRlX3VubG9ja19pcnEoJnp0di0+bG9jayk7CisKKwkJLyogdGVsbCB0aGUgc3RhdGUgbWFjaGluZSB3ZSB3YW50IGl0IGZpbGxlZCAvTk9XLyAqLworCQl6b3Jhbl9jYXAoenR2LCAxKTsKKworCQkvKiB3YWl0IHRpbGwgdGhpcyBidWZmZXIgZ2V0cyBncmFiYmVkICovCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh6dHYtPnZiaXEsCisJCQkJKHVudXNlZC0+c3RhdHVzICE9IEZCVUZGRVJfQlVTWSkpOworCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisJCWRvbmUgPSB1bnVzZWQ7CisJfQorCWVsc2UKKwkJd3JpdGVfdW5sb2NrX2lycSgmenR2LT5sb2NrKTsKKworCS8qIFllcyEgd2UgZ290IGRhdGEhICovCisJbWF4ID0gZG9uZS0+YnBsICogLWRvbmUtPmg7CisJaWYgKGNvdW50ID4gbWF4KQorCQljb3VudCA9IG1heDsKKworCS8qIGNoZWNrIGlmIHRoZSB1c2VyIGdhdmUgdXMgZW5vdWdoIHJvb20gdG8gd3JpdGUgdGhlIGRhdGEgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKSB7CisJCWNvdW50ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBOb3cgdHJhbnNmb3JtL3N0cmlwIHRoZSBkYXRhIGZyb20gWVVWIHRvIFktb25seQorCSAqIE5CLiBBc3N1bWUgdGhlIFkgaXMgaW4gdGhlIExTQiBvZiB0aGUgWVVWIGRhdGEuCisJICovCisJeworCXVuc2lnbmVkIGNoYXIqIG9wdHIgPSBidWY7CisJdW5zaWduZWQgY2hhciogZXB0ciA9IGJ1Zitjb3VudDsKKworCS8qIGFyZSB3ZSBiZWVpbmcgYWNjZXNzZWQgZnJvbSBhbiBvbGQgZHJpdmVyPyAqLworCWlmIChjb3VudCA9PSAyKjE5KjIwNDgpIHsKKwkJLyoKKwkJICogRXh0cmVtZSBIQUNLLCBvbGQgVkJJIHByb2dyYW1zIGV4cGVjdCAyMDQ4IHBvaW50cworCQkgKiBvZiBkYXRhLCBhbmQgd2Ugb25seSBnb3QgODY0IG9yc28uIERvdWJsZSBlYWNoIAorCQkgKiBkYXRhcG9pbnQgYW5kIGNsZWFyIHRoZSByZXN0IG9mIHRoZSBsaW5lLgorCQkgKiBUaGlzIHdheSB3ZSBoYXZlIGFwcGVhciB0byBoYXZlIGEKKwkJICogc2FtcGxlX2ZyZXF1ZW5jeSBvZiAyOS41IE1jLgorCQkgKi8KKwkJaW50IHgseTsKKwkJdW5zaWduZWQgY2hhciogaXB0ciA9IGRvbmUtPm1lbWFkcisxOworCQlmb3IgKHk9ZG9uZS0+aDsgb3B0cjxlcHRyICYmIHk8MDsgeSsrKQorCQl7CisJCQkvKiBjb3B5IHRvIGRvdWJsZWQgZGF0YSB0byB1c2VybGFuZCAqLworCQkJZm9yICh4PTA7IG9wdHIrMTxlcHRyICYmIHg8LWRvbmUtPnc7IHgrKykKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyIGEgPSBpcHRyW3gqMl07CisJCQkJX19wdXRfdXNlcihhLCBvcHRyKyspOworCQkJCV9fcHV0X3VzZXIoYSwgb3B0cisrKTsKKwkJCX0KKwkJCS8qIGFuZCBjbGVhciB0aGUgcmVzdCBvZiB0aGUgbGluZSAqLworCQkJZm9yICh4Kj0yOyBvcHRyPGVwdHIgJiYgeDxkb25lLT5icGw7IHgrKykKKwkJCQlfX3B1dF91c2VyKDAsIG9wdHIrKyk7CisJCQkvKiBuZXh0IGxpbmUgKi8KKwkJCWlwdHIgKz0gZG9uZS0+YnBsOworCQl9CisJfQorCWVsc2UgeworCQkvKgorCQkgKiBPdGhlciAocHJvYmFibHkgbmV3ZXIpIHByb2dyYW1zIGFza2VkCisJCSAqIHVzIHdoYXQgZ2VvbWV0cnkgd2UgYXJlIHVzaW5nLCBhbmQgYXJlCisJCSAqIHJlYWRpbmcgdGhlIGNvcnJlY3Qgc2l6ZS4KKwkJICovCisJCWludCB4LHk7CisJCXVuc2lnbmVkIGNoYXIqIGlwdHIgPSBkb25lLT5tZW1hZHIrMTsKKwkJZm9yICh5PWRvbmUtPmg7IG9wdHI8ZXB0ciAmJiB5PDA7IHkrKykKKwkJeworCQkJLyogY29weSB0byBkb3VibGVkIGRhdGEgdG8gdXNlcmxhbmQgKi8KKwkJCWZvciAoeD0wOyBvcHRyPGVwdHIgJiYgeDwtZG9uZS0+dzsgeCsrKQorCQkJCV9fcHV0X3VzZXIoaXB0clt4KjJdLCBvcHRyKyspOworCQkJLyogYW5kIGNsZWFyIHRoZSByZXN0IG9mIHRoZSBsaW5lICovCisJCQlmb3IgKDtvcHRyPGVwdHIgJiYgeDxkb25lLT5icGw7IHgrKykKKwkJCQlfX3B1dF91c2VyKDAsIG9wdHIrKyk7CisJCQkvKiBuZXh0IGxpbmUgKi8KKwkJCWlwdHIgKz0gZG9uZS0+YnBsOworCQl9CisJfQorCisJLyogQVBJIGNvbXBsaWFuY2U6CisJICogcGxhY2UgdGhlIGZyYW1lbnVtYmVyIChoYWxmIGZpZWxkbnIpIGluIHRoZSBsYXN0IGxvbmcKKwkgKi8KKwlfX3B1dF91c2VyKGRvbmUtPmZpZWxkbnIvMiwgKCh1bG9uZyopZXB0cilbLTFdKTsKKwl9CisKKwkvKiBrZWVwIHRoZSBlbmdpbmUgcnVubmluZyAqLworCWRvbmUtPnN0YXR1cyA9IEZCVUZGRVJfRlJFRTsKKwl6b3Jhbl9jYXAoenR2LCAxKTsKKworCS8qIHRlbGwgbGlzdGVuZXJzIHRoaXMgYnVmZmVyIGp1c3QgYmVjYW1lIGZyZWUgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnp0di0+dmJpcSk7CisKKwkvKiBnb29kYnllICovCitvdXQ6CisJREVCVUcocHJpbnRrKENBUkRfREVCVUcgInZiaV9yZWFkKCkgcmV0dXJucyAlbHVcbiIsQ0FSRCxjb3VudCkpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljCit1bnNpZ25lZCBpbnQgdmJpX3BvbGwoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3Qgem9yYW4gKnp0diA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdmlkaW5mbyogaXRlbTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnp0di0+dmJpcSwgd2FpdCk7CisKKwlmb3IgKGl0ZW09enR2LT5yZWFkaW5mbzsgaXRlbSE9enR2LT5yZWFkaW5mbytaT1JBTl9WQklfQlVGRkVSUzsgaXRlbSsrKQorCQlpZiAoaXRlbS0+c3RhdHVzID09IEZCVUZGRVJfRE9ORSkKKwkJeworCQkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7CisJCQlicmVhazsKKwkJfQorCisJREVCVUcocHJpbnRrKENBUkRfREVCVUcgInZiaV9wb2xsKCk9JXhcbiIsQ0FSRCxtYXNrKSk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljCitpbnQgdmJpX2lvY3RsKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB6b3JhbiogenR2ID0gZGV2LT5wcml2OworCisJc3dpdGNoIChjbWQpIHsKKwkgY2FzZSBWSURJT0NHVkJJRk1UOgorCSB7CisJCXN0cnVjdCB2YmlfZm9ybWF0IGY7CisJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHVkJJSU5GT1xuIixDQVJEKSk7CisJCWYuc2FtcGxpbmdfcmF0ZSA9IDE0NzUwMDAwVUw7CisJCWYuc2FtcGxlc19wZXJfbGluZSA9IC16dHYtPnJlYWRpbmZvWzBdLnc7CisJCWYuc2FtcGxlX2Zvcm1hdCA9IFZJREVPX1BBTEVUVEVfUkFXOworCQlmLnN0YXJ0WzBdID0gZi5zdGFydFsxXSA9IHp0di0+cmVhZGluZm9bMF0ueTsKKwkJZi5zdGFydFsxXSArPSAzMTI7CisJCWYuY291bnRbMF0gPSBmLmNvdW50WzFdID0gLXp0di0+cmVhZGluZm9bMF0uaDsKKwkJZi5mbGFncyA9IFZCSV9JTlRFUkxBQ0VEOworCQlpZiAoY29weV90b191c2VyKGFyZywmZixzaXplb2YoZikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCSB9CisJIGNhc2UgVklESU9DU1ZCSUZNVDoKKwkgeworCQlzdHJ1Y3QgdmJpX2Zvcm1hdCBmOworCQlpbnQgaTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmLCBhcmcsc2l6ZW9mKGYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiVklESU9DU1ZCSUlORk8oJWQsJWQsJWQsJWQsJWQsJWQsJWQsJXgpXG4iLENBUkQsZi5zYW1wbGluZ19yYXRlLGYuc2FtcGxlc19wZXJfbGluZSxmLnNhbXBsZV9mb3JtYXQsZi5zdGFydFswXSxmLnN0YXJ0WzFdLGYuY291bnRbMF0sZi5jb3VudFsxXSxmLmZsYWdzKSk7CisKKwkJLyogbG90cyBvZiBwYXJhbWV0ZXJzIGFyZSBmaXhlZC4uLiAoUEFMKSAqLworCQlpZiAoZi5zYW1wbGluZ19yYXRlICE9IDE0NzUwMDAwVUwgfHwKKwkJICAgIGYuc2FtcGxlc19wZXJfbGluZSA+IDg2NCB8fAorCQkgICAgZi5zYW1wbGVfZm9ybWF0ICE9IFZJREVPX1BBTEVUVEVfUkFXIHx8CisJCSAgICBmLnN0YXJ0WzBdIDwgMCB8fAorCQkgICAgZi5zdGFydFswXSAhPSBmLnN0YXJ0WzFdLTMxMiB8fAorCQkgICAgZi5jb3VudFswXSAhPSBmLmNvdW50WzFdIHx8CisJCSAgICBmLnN0YXJ0WzBdK2YuY291bnRbMF0gPj0gMjg4IHx8CisJCSAgICBmLmZsYWdzICE9IFZCSV9JTlRFUkxBQ0VEKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJd3JpdGVfbG9ja19pcnEoJnp0di0+bG9jayk7CisJCXp0di0+cmVhZGluZm9bMF0ueSA9IGYuc3RhcnRbMF07CisJCXp0di0+cmVhZGluZm9bMF0udyA9IC1mLnNhbXBsZXNfcGVyX2xpbmU7CisJCXp0di0+cmVhZGluZm9bMF0uaCA9IC1mLmNvdW50WzBdOworCQl6dHYtPnJlYWRpbmZvWzBdLmJwbCA9IGYuc2FtcGxlc19wZXJfbGluZSp6dHYtPnJlYWRpbmZvWzBdLmJwcDsKKwkJZm9yIChpPTE7IGk8Wk9SQU5fVkJJX0JVRkZFUlM7IGkrKykKKwkJCXp0di0+cmVhZGluZm9baV0gPSB6dHYtPnJlYWRpbmZvW2ldOworCQl3cml0ZV91bmxvY2tfaXJxKCZ6dHYtPmxvY2spOworCQlicmVhazsKKwkgfQorCSBkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdmJpX3RlbXBsYXRlPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiVU5TRVQiLAorCS50eXBlCQk9IFZJRF9UWVBFX0NBUFRVUkV8VklEX1RZUEVfVEVMRVRFWFQsCisJLmhhcmR3YXJlCT0gVklEX0hBUkRXQVJFX1pSMzYxMjAsCisJLm9wZW4JCT0gdmJpX29wZW4sCisJLmNsb3NlCQk9IHZiaV9jbG9zZSwKKwkucmVhZAkJPSB2YmlfcmVhZCwKKwkud3JpdGUJCT0gem9yYW5fd3JpdGUsCisJLnBvbGwJCT0gdmJpX3BvbGwsCisJLmlvY3RsCQk9IHZiaV9pb2N0bCwKKwkubWlub3IJCT0gLTEsCit9OworCisvKgorICogICAgICBTY2FuIGZvciBhIFpvcmFuIGNoaXAsIHJlcXVlc3QgdGhlIGlycSBhbmQgbWFwIHRoZSBpbyBtZW1vcnkKKyAqLworc3RhdGljCitpbnQgX19pbml0IGZpbmRfem9yYW4odm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCB6b3JhbiAqenR2OworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgcmV2aXNpb247CisJaW50IHpvcmFuX251bT0wOworCisJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9aT1JBTixQQ0lfREVWSUNFX0lEX1pPUkFOXzM2MTIwLCBkZXYpKSkKKwl7CisJCS8qIE9rLCBhIFpSMzYxMjAvWlIzNjEyNSBmb3VuZCEgKi8KKwkJenR2ID0gJnpvcmFuc1t6b3Jhbl9udW1dOworCQl6dHYtPmRldiA9IGRldjsKKworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKKwkJCXJldHVybiAtRUlPOworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2aXNpb24pOworCQlwcmludGsoS0VSTl9JTkZPICJ6b3JhbjogWm9yYW4gJXggKHJldiAlZCkgIiwKKwkJCWRldi0+ZGV2aWNlLCByZXZpc2lvbik7CisJCXByaW50aygiYnVzOiAlZCwgZGV2Zm46ICVkLCBpcnE6ICVkLCAiLAorCQkJZGV2LT5idXMtPm51bWJlciwgZGV2LT5kZXZmbiwgZGV2LT5pcnEpOworCQlwcmludGsoIm1lbW9yeTogMHglMDhseC5cbiIsIHp0di0+em9yYW5fYWRyKTsKKworCQl6dHYtPnpvcmFuX21lbSA9IGlvcmVtYXAoenR2LT56b3Jhbl9hZHIsIDB4MTAwMCk7CisJCURFQlVHKHByaW50ayhLRVJOX0RFQlVHICJ6b3JhbjogbWFwcGVkLW1lbW9yeSBhdCAweCVwXG4iLHp0di0+em9yYW5fbWVtKSk7CisKKwkJcmVzdWx0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHpvcmFuX2lycSwKKwkJCVNBX1NISVJRfFNBX0lOVEVSUlVQVCwiem9yYW4iLCB6dHYpOworCQlpZiAocmVzdWx0PT0tRUlOVkFMKQorCQl7CisJCQlpb3VubWFwKHp0di0+em9yYW5fbWVtKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiem9yYW46IEJhZCBpcnEgbnVtYmVyIG9yIGhhbmRsZXJcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHJlc3VsdD09LUVCVVNZKQorCQkJcHJpbnRrKEtFUk5fRVJSICJ6b3JhbjogSVJRICVkIGJ1c3ksIGNoYW5nZSB5b3VyIFBuUCBjb25maWcgaW4gQklPU1xuIixkZXYtPmlycSk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlpb3VubWFwKHp0di0+em9yYW5fbWVtKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJLyogRW5hYmxlIGJ1cy1tYXN0ZXJpbmcgKi8KKwkJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKworCQl6b3Jhbl9udW0rKzsKKwl9CisJaWYoem9yYW5fbnVtKQorCQlwcmludGsoS0VSTl9JTkZPICJ6b3JhbjogJWQgWm9yYW4gY2FyZChzKSBmb3VuZC5cbiIsem9yYW5fbnVtKTsKKwlyZXR1cm4gem9yYW5fbnVtOworfQorCitzdGF0aWMKK2ludCBfX2luaXQgaW5pdF96b3JhbihpbnQgY2FyZCkKK3sKKwlzdHJ1Y3Qgem9yYW4gKnp0diA9ICZ6b3JhbnNbY2FyZF07CisJaW50CWk7CisKKwkvKiBpZiB0aGUgZ2l2ZW4gY2FyZHR5cGUgdmFsaWQ/ICovCisJaWYgKGNhcmR0eXBlW2NhcmRdPj1OUlRWQ0FSRFMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaW52YWxpZCBjYXJkdHlwZSglZCkgZGV0ZWN0ZWRcbiIsY2FyZHR5cGVbY2FyZF0pOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogcmVzZXQgdGhlIHpvcmFuICovCisJenJhbmQoflpPUkFOX1BDSV9TT0ZUUkVTRVQsWk9SQU5fUENJKTsKKwl1ZGVsYXkoMTApOworCXpyb3IoWk9SQU5fUENJX1NPRlRSRVNFVCxaT1JBTl9QQ0kpOworCXVkZWxheSgxMCk7CisKKwkvKiB6b3JhbiBjaGlwIHNwZWNpZmljIGRldGFpbHMgKi8KKwl6dHYtPmNhcmQgPSB0dmNhcmRzK2NhcmR0eXBlW2NhcmRdOwkvKiBwb2ludCB0byB0aGUgc2VsZWN0ZWQgY2FyZCAqLworCXp0di0+bm9ybSA9IDA7CQkJCS8qIFBBTCAqLworCXp0di0+dHVuZXJfZnJlcSA9IDA7CisKKwkvKiB2aWRlb2NhcmQgZGV0YWlscyAqLworCXp0di0+c3dpZHRoID0gODAwOworCXp0di0+c2hlaWdodCA9IDYwMDsKKwl6dHYtPmRlcHRoID0gMTY7CisKKwkvKiBTdGF0ZSBkZXRhaWxzICovCisJenR2LT5mYnVmZmVyID0gMDsKKwl6dHYtPm92ZXJpbmZvLmtpbmRvZiA9IEZCVUZGRVJfT1ZFUkxBWTsKKwl6dHYtPm92ZXJpbmZvLnN0YXR1cyA9IEZCVUZGRVJfRlJFRTsKKwl6dHYtPm92ZXJpbmZvLnggPSAwOworCXp0di0+b3ZlcmluZm8ueSA9IDA7CisJenR2LT5vdmVyaW5mby53ID0gNzY4OyAvKiA2NDAgKi8KKwl6dHYtPm92ZXJpbmZvLmggPSA1NzY7IC8qIDQ4MCAqLworCXp0di0+b3ZlcmluZm8uZm9ybWF0ID0gVklERU9fUEFMRVRURV9SR0I1NjU7CisJenR2LT5vdmVyaW5mby5icHAgPSBwYWxldHRlMmZtdFt6dHYtPm92ZXJpbmZvLmZvcm1hdF0uYnBwOworCXp0di0+b3ZlcmluZm8uYnBsID0genR2LT5vdmVyaW5mby5icHAqenR2LT5zd2lkdGg7CisJenR2LT5vdmVyaW5mby5idXNhZHIgPSAwOworCXp0di0+b3ZlcmluZm8ubWVtYWRyID0gMDsKKwl6dHYtPm92ZXJpbmZvLm92ZXJsYXkgPSAwOworCWZvciAoaT0wOyBpPFpPUkFOX01BWF9GQlVGRkVSUzsgaSsrKSB7CisJCXp0di0+Z3JhYmluZm9baV0gPSB6dHYtPm92ZXJpbmZvOworCQl6dHYtPmdyYWJpbmZvW2ldLmtpbmRvZiA9IEZCVUZGRVJfR1JBQjsKKwl9CisJaW5pdF93YWl0cXVldWVfaGVhZCgmenR2LT5ncmFicSk7CisKKwkvKiBWQkkgZGV0YWlscyAqLworCXp0di0+cmVhZGluZm9bMF0gPSB6dHYtPm92ZXJpbmZvOworCXp0di0+cmVhZGluZm9bMF0ua2luZG9mID0gRkJVRkZFUl9WQkk7CisJenR2LT5yZWFkaW5mb1swXS53ID0gLTg2NDsKKwl6dHYtPnJlYWRpbmZvWzBdLmggPSAtMzg7CisJenR2LT5yZWFkaW5mb1swXS5mb3JtYXQgPSBWSURFT19QQUxFVFRFX1lVVjQyMjsKKwl6dHYtPnJlYWRpbmZvWzBdLmJwcCA9IHBhbGV0dGUyZm10W3p0di0+cmVhZGluZm9bMF0uZm9ybWF0XS5icHA7CisJenR2LT5yZWFkaW5mb1swXS5icGwgPSAxMDI0Knp0di0+cmVhZGluZm9bMF0uYnBwOworCWZvciAoaT0xOyBpPFpPUkFOX1ZCSV9CVUZGRVJTOyBpKyspCisJCXp0di0+cmVhZGluZm9baV0gPSB6dHYtPnJlYWRpbmZvWzBdOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnp0di0+dmJpcSk7CisKKwkvKiBtYWludGVuYW5jZSBkYXRhICovCisJenR2LT5oYXZlX2RlY29kZXIgPSAwOworCXp0di0+aGF2ZV90dW5lciA9IDA7CisJenR2LT50dW5lcl90eXBlID0gMDsKKwl6dHYtPnJ1bm5pbmcgPSAwOworCXp0di0+dXNlcnMgPSAwOworCXJ3bG9ja19pbml0KCZ6dHYtPmxvY2spOworCXp0di0+d29ya3F1ZXVlID0gMDsKKwl6dHYtPmZpZWxkbnIgPSAwOworCXp0di0+bGFzdGZpZWxkbnIgPSAwOworCisJaWYgKHRyaXRvbjEpCisJCXpyYW5kKH5aT1JBTl9WRENfVFJJQ09NLCBaT1JBTl9WREMpOworCisJLyogZXh0ZXJuYWwgRkwgZGV0ZXJtaW5lcyBUT1AgZnJhbWUgKi8KKwl6cm9yKFpPUkFOX1ZGRUNfRVhURkwsIFpPUkFOX1ZGRUMpOyAKKworCS8qIHNldCBIU3BvbCAqLworCWlmICh6dHYtPmNhcmQtPmhzeW5jX3BvcykKKwkJenJ3cml0ZShaT1JBTl9WRkVIX0hTUE9MLCBaT1JBTl9WRkVIKTsKKwkvKiBzZXQgVlNwb2wgKi8KKwlpZiAoenR2LT5jYXJkLT52c3luY19wb3MpCisJCXpyd3JpdGUoWk9SQU5fVkZFVl9WU1BPTCwgWk9SQU5fVkZFVik7CisKKwkvKiBTZXQgdGhlIHByb3BlciBHZW5lcmFsIFB1cnB1c2UgcmVnaXN0ZXIgYml0cyAqLworCS8qIGltcGxpY2l0OiBubyBzb2Z0cmVzZXQsIDAgd2FpdHN0YXRlcyAqLworCXpyd3JpdGUoWk9SQU5fUENJX1NPRlRSRVNFVHwoenR2LT5jYXJkLT5ncGRpcjw8MCksWk9SQU5fUENJKTsKKwkvKiBpbXBsaWNpdDogMyBkdXJhdGlvbiBhbmQgcmVjb3ZlcnkgUENJIGNsb2NrcyBvbiBndWVzdCAwLTMgKi8KKwl6cndyaXRlKHp0di0+Y2FyZC0+Z3B2YWw8PDI0LFpPUkFOX0dVRVNUKTsKKworCS8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwl6cndyaXRlKH4wLCBaT1JBTl9JU1IpOworCisJLyoKKwkgKiBpMmMgdGVtcGxhdGUKKwkgKi8KKwl6dHYtPmkyYyA9IHpvcmFuX2kyY19idXNfdGVtcGxhdGU7CisJc3ByaW50Zih6dHYtPmkyYy5uYW1lLCJ6b3Jhbi0lZCIsY2FyZCk7CisJenR2LT5pMmMuZGF0YSA9IHp0djsKKworCS8qCisJICogTm93IGFkZCB0aGUgdGVtcGxhdGUgYW5kIHJlZ2lzdGVyIHRoZSBkZXZpY2UgdW5pdAorCSAqLworCXp0di0+dmlkZW9fZGV2ID0genIzNjEyMF90ZW1wbGF0ZTsKKwlzdHJjcHkoenR2LT52aWRlb19kZXYubmFtZSwgenR2LT5pMmMubmFtZSk7CisJenR2LT52aWRlb19kZXYucHJpdiA9IHp0djsKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZ6dHYtPnZpZGVvX2RldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJenR2LT52YmlfZGV2ID0gdmJpX3RlbXBsYXRlOworCXN0cmNweSh6dHYtPnZiaV9kZXYubmFtZSwgenR2LT5pMmMubmFtZSk7CisJenR2LT52YmlfZGV2LnByaXYgPSB6dHY7CisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmenR2LT52YmlfZGV2LCBWRkxfVFlQRV9WQkksIHZiaV9ucikgPCAwKSB7CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZ6dHYtPnZpZGVvX2Rldik7CisJCXJldHVybiAtMTsKKwl9CisJaTJjX3JlZ2lzdGVyX2J1cygmenR2LT5pMmMpOworCisJLyogc2V0IGludGVycnVwdCBtYXNrIC0gdGhlIFBJTiBlbmFibGUgd2lsbCBiZSBzZXQgbGF0ZXIgKi8KKwl6cndyaXRlKFpPUkFOX0lDUl9HSVJRMHxaT1JBTl9JQ1JfR0lSUTF8Wk9SQU5fSUNSX0NPREUsIFpPUkFOX0lDUik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogaW5zdGFsbGVkICVzXG4iLHp0di0+aTJjLm5hbWUsenR2LT5jYXJkLT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljCit2b2lkIHJlbGVhc2Vfem9yYW4oaW50IG1heCkKK3sKKwlzdHJ1Y3Qgem9yYW4gKnp0djsKKwlpbnQgaTsKKworCWZvciAoaT0wO2k8bWF4OyBpKyspIAorCXsKKwkJenR2ID0gJnpvcmFuc1tpXTsKKworCQkvKiB0dXJuIG9mZiBhbGwgY2FwdHVyaW5nLCBETUEgYW5kIElSUXMgKi8KKwkJLyogcmVzZXQgdGhlIHpvcmFuICovCisJCXpyYW5kKH5aT1JBTl9QQ0lfU09GVFJFU0VULFpPUkFOX1BDSSk7CisJCXVkZWxheSgxMCk7CisJCXpyb3IoWk9SQU5fUENJX1NPRlRSRVNFVCxaT1JBTl9QQ0kpOworCQl1ZGVsYXkoMTApOworCisJCS8qIGZpcnN0IGRpc2FibGUgaW50ZXJydXB0cyBiZWZvcmUgdW5tYXBwaW5nIHRoZSBtZW1vcnkhICovCisJCXpyd3JpdGUoMCwgWk9SQU5fSUNSKTsKKwkJenJ3cml0ZSgweGZmZmZmZmZmVUwsWk9SQU5fSVNSKTsKKworCQkvKiBmcmVlIGl0ICovCisJCWZyZWVfaXJxKHp0di0+ZGV2LT5pcnEsenR2KTsKKyAKKyAgICAJCS8qIHVucmVnaXN0ZXIgaTJjX2J1cyAqLworCQlpMmNfdW5yZWdpc3Rlcl9idXMoKCZ6dHYtPmkyYykpOworCisJCS8qIHVubWFwIGFuZCBmcmVlIG1lbW9yeSAqLworCQlpZiAoenR2LT56b3Jhbl9tZW0pCisJCQlpb3VubWFwKHp0di0+em9yYW5fbWVtKTsKKworCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmenR2LT52aWRlb19kZXYpOworCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmenR2LT52YmlfZGV2KTsKKwl9Cit9CisKK3ZvaWQgX19leGl0IHpyMzYxMjBfZXhpdCh2b2lkKQoreworCXJlbGVhc2Vfem9yYW4oem9yYW5fY2FyZHMpOworfQorCitpbnQgX19pbml0IHpyMzYxMjBfaW5pdCh2b2lkKQoreworCWludAljYXJkOworIAorCWhhbmRsZV9jaGlwc2V0KCk7CisJem9yYW5fY2FyZHMgPSBmaW5kX3pvcmFuKCk7CisJaWYgKHpvcmFuX2NhcmRzPDApCisJCS8qIG5vIGNhcmRzIGZvdW5kLCBubyBuZWVkIGZvciBhIGRyaXZlciAqLworCQlyZXR1cm4gLUVJTzsKKworCS8qIGluaXRpYWxpemUgWm9yYW5zICovCisJZm9yIChjYXJkPTA7IGNhcmQ8em9yYW5fY2FyZHM7IGNhcmQrKykgeworCQlpZiAoaW5pdF96b3JhbihjYXJkKTwwKSB7CisJCQkvKiBvbmx5IHJlbGVhc2UgdGhlIHpvcmFucyB3ZSBoYXZlIHJlZ2lzdGVyZWQgKi8KKwkJCXJlbGVhc2Vfem9yYW4oY2FyZCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfSAKKwl9CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KHpyMzYxMjBfaW5pdCk7Cittb2R1bGVfZXhpdCh6cjM2MTIwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzFmOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwLmgKQEAgLTAsMCArMSwyNzkgQEAKKy8qIAorICAgIHpyMzYxMjAuaCAtIFpvcmFuIDM2MTIwLzM2MTI1IGJhc2VkIGZyYW1lZ3JhYmJlcnMKKworICAgIENvcHlyaWdodCAoQykgMTk5OC0xOTk5IFBhdWxpbmUgTWlkZGVsaW5rIChtaWRkZWxpbkBwb2x5d2FyZS5ubCkKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBfWlIzNjEyMF9ICisjZGVmaW5lIF9aUjM2MTIwX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8bGludXgvaTJjLW9sZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoKKyAqIERlYnVnIG1hY3JvJ3MsIHBsYWNlIGFuIHggYmVoaW5kIHRoZSApIGZvciBhY3R1YWwgZGVidWctY29tcGlsYXRpb24KKyAqIEUuZy4gI2RlZmluZSBERUJVRyh4Li4uKQl4CisgKi8KKyNkZWZpbmUgREVCVUcoeC4uLikJCQkvKiBEZWJ1ZyBkcml2ZXIgKi8KKyNkZWZpbmUgSURFQlVHKHguLi4pCQkJLyogRGVidWcgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyNkZWZpbmUgUERFQlVHCQkwCQkvKiBEZWJ1ZyBQQ0kgd3JpdGVzICovCisKKy8qIGRlZmluZWQgaW4genIzNjEyMF9pMmMgKi8KK2V4dGVybiBzdHJ1Y3QgaTJjX2J1cyB6b3Jhbl9pMmNfYnVzX3RlbXBsYXRlOworCisjZGVmaW5lCVpPUkFOX01BWF9GQlVGRkVSUwkyCisjZGVmaW5lCVpPUkFOX01BWF9GQlVGRkVSCSg3NjgqNTc2KjIpCisjZGVmaW5lCVpPUkFOX01BWF9GQlVGU0laRQkoWk9SQU5fTUFYX0ZCVUZGRVJTKlpPUkFOX01BWF9GQlVGRkVSKQorCisjZGVmaW5lCVpPUkFOX1ZCSV9CVUZGRVJTCTIKKyNkZWZpbmUJWk9SQU5fVkJJX0JVRlNJWkUJKDIyKjEwMjQqMikKKworc3RydWN0IHR2Y2FyZCB7CisJY2hhcioJbmFtZTsJCS8qIG5hbWUgb2YgdGhlIGNhcmR0eXBlICovCisJaW50CXZpZGVvX2lucHV0czsJLyogbnVtYmVyIG9mIGNoYW5uZWxzIGRlZmluZWQgaW4gdmlkZW9fbXV4ICovCisJaW50CWF1ZGlvX2lucHV0czsJLyogbnVtYmVyIG9mIGNoYW5uZWxzIGRlZmluZWQgaW4gYXVkaW9fbXV4ICovCisJX191MzIJc3dhcGkyYzoxLAkvKiBuZWVkIHRvIHN3YXAgaTJjIHdpcmVzIFNEQS9TQ0w/ICovCisJCXVzZWdpcnExOjEsCS8qIFZTWU5DIGF0IEdJUlExIGluc3RlYWQgb2YgR0lSUTA/ICovCisJCXZzeW5jX3BvczoxLAkvKiBwb3NpdGl2ZSBWU1lOQyBzaWduYWw/ICovCisJCWhzeW5jX3BvczoxLAkvKiBwb3NpdGl2ZSBIU1lOQyBzaWduYWw/ICovCisJCWdwZGlyOjgsCS8qIEdlbmVyYWwgUHVycG9zZSBEaXJlY3Rpb24gcmVnaXN0ZXIgKi8KKwkJZ3B2YWw6ODsJLyogR2VuZXJhbCBQdXJwb3NlIFZhbHVlIHJlZ2lzdGVyICovCisJaW50CXZpZGVvX211eFs2XTsJLyogbWFwcGluZyBjaGFubmVsIG51bWJlciB0byBwaHlzaWNhbCBpbnB1dCAqLworI2RlZmluZQkJSVNfVFVORVIJMHg4MAorI2RlZmluZQkJSVNfU1ZIUwkJMHg0MAorI2RlZmluZQkJQ0hBTk5FTF9NQVNLCTB4M0YKKwlpbnQJYXVkaW9fbXV4WzZdOwkvKiBtYXBwaW5nIGNoYW5uZWwgbnVtYmVyIHRvIHBoeXNpY2FsIGlucHV0ICovCit9OworI2RlZmluZQlUVU5FUih4KQkoKHgpfElTX1RVTkVSKQorI2RlZmluZQlTVkhTKHgpCQkoKHgpfElTX1NWSFMpCisKK3N0cnVjdCB2aWRpbmZvIHsKKwlzdHJ1Y3QJdmlkaW5mbyogbmV4dDsJLyogbmV4dCBhY3RpdmUgYnVmZmVyCQkJKi8KKwl1aW50CWtpbmRvZjsKKyNkZWZpbmUJRkJVRkZFUl9PVkVSTEFZCQkwCisjZGVmaW5lCUZCVUZGRVJfR1JBQgkJMQorI2RlZmluZQlGQlVGRkVSX1ZCSQkJMgorCXVpbnQJc3RhdHVzOworI2RlZmluZSBGQlVGRkVSX0ZSRUUJCTAKKyNkZWZpbmUgRkJVRkZFUl9CVVNZCQkxCisjZGVmaW5lIEZCVUZGRVJfRE9ORQkJMgorCXVsb25nCWZpZWxkbnI7CS8qICMgb2YgZmllbGQsIG5vdCBmcmFtZXIhCQkqLworCXVpbnQJeCx5OworCWludAl3LGg7CQkvKiB3LGggY2FuIGJlIG5lZ2F0aXZlIQkJCSovCisJdWludAlmb3JtYXQ7CQkvKiBpbmRleCBpbiBwYWxldHRlMmZtdFtdCQkqLworCXVpbnQJYnBwOwkJLyogbG9va3VwIGZyb20gcGFsZXR0ZTJmbXRbXQkJKi8KKwl1aW50CWJwbDsJCS8qIGNhbGM6IHdpZHRoICogYnBwCQkJKi8KKwl1bG9uZwlidXNhZHI7CQkvKiBidXMgYWRkciBmb3IgRE1BIGVuZ2luZQkJKi8KKwljaGFyKgltZW1hZHI7CQkvKiBrZXJuZWwgYWRkciBmb3IgbWFraW5nIGNvcGllcwkqLworCXVsb25nKglvdmVybGF5OwkvKiBrZXJuZWwgYWRkciBvZiBvdmVybGF5IG1hc2sJCSovCit9OworCitzdHJ1Y3Qgem9yYW4gCit7CisJc3RydWN0IHZpZGVvX2RldmljZSB2aWRlb19kZXY7CisjZGVmaW5lIENBUkRfREVCVUcJS0VSTl9ERUJVRyAiJXMoJWx1KTogIgorI2RlZmluZSBDQVJEX0lORk8JS0VSTl9JTkZPICIlcyglbHUpOiAiCisjZGVmaW5lIENBUkRfRVJSCUtFUk5fRVJSICIlcyglbHUpOiAiCisjZGVmaW5lIENBUkQJCXp0di0+dmlkZW9fZGV2Lm5hbWUsenR2LT5maWVsZG5yCisKKwkvKiB6b3JhbiBjaGlwIHNwZWNpZmljIGRldGFpbHMgKi8KKwlzdHJ1Y3QgaTJjX2J1cwlpMmM7CQkvKiBpMmMgcmVnaXN0cmF0aW9uIGRhdGEJKi8KKwlzdHJ1Y3QgcGNpX2RldioJZGV2OwkJLyogcHRyIHRvIFBDSSBkZXZpY2UJCSovCisJdWxvbmcJCXpvcmFuX2FkcjsJLyogYnVzIGFkZHJlc3Mgb2YgSU8gbWVtb3J5CSovCisJY2hhcioJCXpvcmFuX21lbTsJLyoga2VybmVsIGFkZHJlc3Mgb2YgSU8gbWVtb3J5CSovCisJc3RydWN0IHR2Y2FyZCoJY2FyZDsJCS8qIHRoZSBjYXJkdHlwZQkJCSovCisJdWludAkJbm9ybTsJCS8qIDA9UEFMLCAxPU5UU0MsIDI9U0VDQU0JKi8KKwl1aW50CQl0dW5lcl9mcmVxOwkvKiBDdXJyZW50IGZyZXEgaW4ga0h6CQkqLworCXN0cnVjdCB2aWRlb19waWN0dXJlIHBpY3R1cmU7CS8qIEN1cnJlbnQgcGljdHVyZSBwYXJhbXMJKi8KKyAgCisJLyogdmlkZW9jYXJkIGRldGFpbHMgKi8KKwl1aW50CQlzd2lkdGg7CQkvKiBzY3JlZW4gd2lkdGgJCQkqLworCXVpbnQJCXNoZWlnaHQ7CS8qIHNjcmVlbiBoZWlnaHQJCSovCisJdWludAkJZGVwdGg7CQkvKiBkZXB0aCBpbiBiaXRzCQkqLworCisJLyogU3RhdGUgZGV0YWlscyAqLworCWNoYXIqCQlmYnVmZmVyOwkvKiBmcmFtZWJ1ZmZlcnMgZm9yIG1tYXAJKi8KKwlzdHJ1Y3QgdmlkaW5mbwlvdmVyaW5mbzsJLyogb3ZlcmxheSBkYXRhCQkJKi8KKwlzdHJ1Y3QgdmlkaW5mbwlncmFiaW5mb1taT1JBTl9NQVhfRkJVRkZFUlNdOwkvKiBncmFiYmluZyBkYXRhKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBncmFicTsJLyogZ3JhYmJlcnMgcXVldWUJCSovCisKKwkvKiBWQkkgZGV0YWlscyAqLworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmJpX2RldjsKKwlzdHJ1Y3QgdmlkaW5mbwlyZWFkaW5mb1syXTsJLyogVkJJIGRhdGEgLSBmbGlwIGJ1ZmZlcnMJKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB2YmlxOwkJLyogdmJpIHF1ZXVlCQkJKi8KKworCS8qIG1haW50ZW5hbmNlIGRhdGEgKi8KKwlpbnQJCWhhdmVfZGVjb2RlcjsJLyogZGlkIHdlIGRldGVjdCBhIG11eD8JCSovCisJaW50CQloYXZlX3R1bmVyOwkvKiBkaWQgd2UgZGV0ZWN0IGEgdHVuZXI/CSovCisJaW50CQl1c2VyczsJCS8qIGhvd21hbnkgdmlkZW8vdmJpIG9wZW4/CSovCisJaW50CQl0dW5lcl90eXBlOwkvKiB0dW5lciB0eXBlLCB3aGVuIGZvdW5kCSovCisJaW50CQlydW5uaW5nOwkvKiBhcmUgd2Ugcm9sbGluZz8JCSovCisJcndsb2NrX3QJbG9jazsKKwlsb25nCQlzdGF0ZTsJCS8qIHdoYXQgaXMgcmVxdWVzdGVkIG9mIHVzPwkqLworI2RlZmluZSBTVEFURV9PVkVSTEFZCTAKKyNkZWZpbmUgU1RBVEVfVkJJCTEKKwlzdHJ1Y3QgdmlkaW5mbyoJd29ya3F1ZXVlOwkvKiBidWZmZXJzIHRvIGdyYWIsIGhlYWQgaXMgYWN0aXZlICovCisJdWxvbmcJCWZpZWxkbnI7CS8qICNmaWVsZCwgdGlja2VkIGV2ZXJ5IFZTWU5DCSovCisJdWxvbmcJCWxhc3RmaWVsZG5yOwkvKiAjZmllbGQsIHRpY2tlZCBldmVyeSBHUkFCCSovCisKKwlpbnQJCXZpZEludGVybGFjZTsJLyogY2FsY3VsYXRlZCAqLworCWludAkJdmlkWHNoaWZ0OwkvKiBjYWxjdWxhdGVkICovCisJdWludAkJdmlkV2lkdGg7CS8qIGNhbGN1bGF0ZWQgKi8KKwl1aW50CQl2aWRIZWlnaHQ7CS8qIGNhbGN1bGF0ZWQgKi8KK307CisKKyNkZWZpbmUgenJ3cml0ZShkYXQsYWRyKSAgICB3cml0ZWwoKGRhdCksKGNoYXIgKikgKHp0di0+em9yYW5fbWVtKyhhZHIpKSkKKyNkZWZpbmUgenJyZWFkKGFkcikgICAgICAgICByZWFkbCh6dHYtPnpvcmFuX21lbSsoYWRyKSkKKworI2lmIFBERUJVRyA9PSAwCisjZGVmaW5lIHpyYW5kKGRhdCxhZHIpICAgICAgenJ3cml0ZSgoZGF0KSAmIHpycmVhZChhZHIpLCBhZHIpCisjZGVmaW5lIHpyb3IoZGF0LGFkcikgICAgICAgenJ3cml0ZSgoZGF0KSB8IHpycmVhZChhZHIpLCBhZHIpCisjZGVmaW5lIHpyYW9yKGRhdCxtYXNrLGFkcikgenJ3cml0ZSggKChkYXQpJn4obWFzaykpIHwgKChtYXNrKSZ6cnJlYWQoYWRyKSksIGFkcikKKyNlbHNlCisjZGVmaW5lIHpyYW5kKGRhdCwgYWRyKSBcCitkbyB7IFwKKwl1bG9uZyBkYXRhID0gKGRhdCkgJiB6cnJlYWQoKGFkcikpOyBcCisJenJ3cml0ZShkYXRhLCAoYWRyKSk7IFwKKwlpZiAoMCAhPSAofihkYXQpICYgenJyZWFkKChhZHIpKSkpIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgInpvcmFuOiB6cmFuZCBhdCAlZCglZCkgZGV0ZWN0ZWQgc2V0IGJpdHMoJXgpXG4iLCBfX0xJTkVfXywgKGFkciksIChkYXQpKTsgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIHpyb3IoZGF0LCBhZHIpIFwKK2RvIHsgXAorCXVsb25nIGRhdGEgPSAoZGF0KSB8IHpycmVhZCgoYWRyKSk7IFwKKwl6cndyaXRlKGRhdGEsIChhZHIpKTsgXAorCWlmICgoZGF0KSAhPSAoKGRhdCkgJiB6cnJlYWQoYWRyKSkpIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgInpvcmFuOiB6cm9yIGF0ICVkKCVkKSBkZXRlY3RlZCB1bnNldCBiaXRzKCV4KVxuIiwgX19MSU5FX18sIChhZHIpLCAoZGF0KSk7IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSB6cmFvcihkYXQsIG1hc2ssIGFkcikgXAorZG8geyBcCisJdWxvbmcgZGF0YTsgXAorCWlmICgoZGF0KSAmIChtYXNrKSkgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiem9yYW46IHpyYW9yIGF0ICVkKCVkKSBkZXRlY3RlZCBiaXRzKCV4OiV4KVxuIiwgX19MSU5FX18sIChhZHIpLCAoZGF0KSwgKG1hc2spKTsgXAorCWRhdGEgPSAoKGRhdCkmfihtYXNrKSkgfCAoKG1hc2spICYgenJyZWFkKChhZHIpKSk7IFwKKwl6cndyaXRlKGRhdGEsKGFkcikpOyBcCisJaWYgKCAoZGF0KSAhPSAofihtYXNrKSAmIHpycmVhZCgoYWRyKSkpICkgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiem9yYW46IHpyYW9yIGF0ICVkKCVkKSBjb3VsZCBub3Qgc2V0IGFsbCBiaXRzKCV4OiV4KVxuIiwgX19MSU5FX18sIChhZHIpLCAoZGF0KSwgKG1hc2spKTsgXAorfSB3aGlsZSgwKQorI2VuZGlmCisKKyNlbmRpZgorCisvKiB6b3JhbiBQQ0kgYWRkcmVzcyBzcGFjZSAqLworI2RlZmluZSBaT1JBTl9WRkVICQkweDAwMAkvKiBWaWRlbyBGcm9udCBFbmQgSG9yaXpvbnRhbCBDb25mLiAqLworI2RlZmluZQlaT1JBTl9WRkVIX0hTUE9MCSgxPDwzMCkKKyNkZWZpbmUJWk9SQU5fVkZFSF9IU1RBUlQJKDB4M0ZGPDwxMCkKKyNkZWZpbmUJWk9SQU5fVkZFSF9IRU5ECQkoMHgzRkY8PDApCisKKyNkZWZpbmUgWk9SQU5fVkZFVgkJMHgwMDQJLyogVmlkZW8gRnJvbnQgRW5kIFZlcnRpY2FsIENvbmYuICovCisjZGVmaW5lCVpPUkFOX1ZGRVZfVlNQT0wJKDE8PDMwKQorI2RlZmluZQlaT1JBTl9WRkVWX1ZTVEFSVAkoMHgzRkY8PDEwKQorI2RlZmluZQlaT1JBTl9WRkVWX1ZFTkQJCSgweDNGRjw8MCkKKworI2RlZmluZQlaT1JBTl9WRkVDCQkweDAwOAkvKiBWaWRlbyBGcm9udCBFbmQgU2NhbGVyIGFuZCBQaXhlbCAqLworI2RlZmluZSBaT1JBTl9WRkVDX0VYVEZMCSgxPDwyNikKKyNkZWZpbmUJWk9SQU5fVkZFQ19UT1BGSUVMRAkoMTw8MjUpCisjZGVmaW5lCVpPUkFOX1ZGRUNfVkNMS1BPTAkoMTw8MjQpCisjZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUgkoNzw8MjEpCisjZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUl8xCSgwPDwyMSkJLyogbm8gbHVtaSwgICAgMy10YXAgY2hyb21vICovCisjZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUl8yCSgxPDwyMSkJLyogMy10YXAgbHVtaSwgMy10YXAgY2hyb21vICovCisjZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUl8zCSgyPDwyMSkJLyogNC10YXAgbHVtaSwgNC10YXAgY2hyb21vICovCisjZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUl80CSgzPDwyMSkJLyogNS10YXAgbHVtaSwgNC10YXAgY2hyb21vICovCisjZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUl81CSg0PDwyMSkJLyogNC10YXAgbHVtaSwgNC10YXAgY2hyb21vICovCisjZGVmaW5lCVpPUkFOX1ZGRUNfRFVQRkxECSgxPDwyMCkKKyNkZWZpbmUJWk9SQU5fVkZFQ19IT1JEQ00JKDYzPDwxNCkKKyNkZWZpbmUJWk9SQU5fVkZFQ19WRVJEQ00JKDYzPDw4KQorI2RlZmluZQlaT1JBTl9WRkVDX0RJU1BNT0QJKDE8PDYpCisjZGVmaW5lCVpPUkFOX1ZGRUNfUkdCCQkoMzw8MykKKyNkZWZpbmUJWk9SQU5fVkZFQ19SR0JfWVVWNDIyCSgwPDwzKQorI2RlZmluZQlaT1JBTl9WRkVDX1JHQl9SR0I4ODgJKDE8PDMpCisjZGVmaW5lCVpPUkFOX1ZGRUNfUkdCX1JHQjU2NQkoMjw8MykKKyNkZWZpbmUJWk9SQU5fVkZFQ19SR0JfUkdCNTU1CSgzPDwzKQorI2RlZmluZQlaT1JBTl9WRkVDX0VSUkRJRgkoMTw8MikKKyNkZWZpbmUJWk9SQU5fVkZFQ19QQUNLMjQJKDE8PDEpCisjZGVmaW5lCVpPUkFOX1ZGRUNfTEUJCSgxPDwwKQorCisjZGVmaW5lCVpPUkFOX1ZUT1AJCTB4MDBDCS8qIFZpZGVvIERpc3BsYXkgIlRvcCIgKi8KKworI2RlZmluZQlaT1JBTl9WQk9UCQkweDAxMAkvKiBWaWRlbyBEaXNwbGF5ICJCb3R0b20iICovCisKKyNkZWZpbmUJWk9SQU5fVlNUUgkJMHgwMTQJLyogVmlkZW8gRGlzcGxheSBTdHJpZGUgKi8KKyNkZWZpbmUJWk9SQU5fVlNUUl9ESVNQU1RSSURFCSgweEZGRkY8PDE2KQorI2RlZmluZQlaT1JBTl9WU1RSX1ZJRE9WRgkoMTw8OCkKKyNkZWZpbmUJWk9SQU5fVlNUUl9TTkFQU0hPVAkoMTw8MSkKKyNkZWZpbmUJWk9SQU5fVlNUUl9HUkFCCQkoMTw8MCkKKworI2RlZmluZQlaT1JBTl9WREMJCTB4MDE4CS8qIFZpZGVvIERpc3BsYXkgQ29uZi4gKi8KKyNkZWZpbmUJWk9SQU5fVkRDX1ZJREVOCQkoMTw8MzEpCisjZGVmaW5lCVpPUkFOX1ZEQ19NSU5QSVgJKDB4MUY8PDI1KQorI2RlZmluZQlaT1JBTl9WRENfVFJJQ09NCSgxPDwyNCkKKyNkZWZpbmUJWk9SQU5fVkRDX1ZJRFdJTkhUCSgweDNGRjw8MTIpCisjZGVmaW5lCVpPUkFOX1ZEQ19WSURXSU5XSUQJKDB4M0ZGPDwwKQorCisjZGVmaW5lCVpPUkFOX01UT1AJCTB4MDFDCS8qIE1hc2tpbmcgTWFwICJUb3AiICovCisKKyNkZWZpbmUJWk9SQU5fTUJPVAkJMHgwMjAJLyogTWFza2luZyBNYXAgIkJvdHRvbSIgKi8KKworI2RlZmluZQlaT1JBTl9PQ1IJCTB4MDI0CS8qIE92ZXJsYXkgQ29udHJvbCAqLworI2RlZmluZQlaT1JBTl9PQ1JfT1ZMRU4JCSgxPDwxNSkKKyNkZWZpbmUJWk9SQU5fT0NSX01BU0tTVFJJREUJKDB4RkY8PDApCisKKyNkZWZpbmUJWk9SQU5fUENJCQkweDAyOAkvKiBTeXN0ZW0sIFBDSSBhbmQgR1BQIENvbnRyb2wgKi8KKyNkZWZpbmUJWk9SQU5fUENJX1NPRlRSRVNFVAkoMTw8MjQpCisjZGVmaW5lCVpPUkFOX1BDSV9XQUlUU1RBVEUJKDM8PDE2KQorI2RlZmluZQlaT1JBTl9QQ0lfR0VOUFVSRElSCSgweEZGPDwwKQorCisjZGVmaW5lCVpPUkFOX0dVRVNUCQkweDAyQwkvKiBHdWVzdEJ1cyBDb250cm9sICovCisKKyNkZWZpbmUJWk9SQU5fQ1NPVVJDRQkJMHgwMzAJLyogQ29kZSBTb3VyY2UgQWRkcmVzcyAqLworCisjZGVmaW5lCVpPUkFOX0NUUkFOUwkJMHgwMzQJLyogQ29kZSBUcmFuc2ZlciBDb250cm9sICovCisKKyNkZWZpbmUJWk9SQU5fQ01FTQkJMHgwMzgJLyogQ29kZSBNZW1vcnkgUG9pbnRlciAqLworCisjZGVmaW5lCVpPUkFOX0lTUgkJMHgwM0MJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlaT1JBTl9JU1JfQ09ERQkJKDE8PDI4KQorI2RlZmluZQlaT1JBTl9JU1JfR0lSUTAJCSgxPDwyOSkKKyNkZWZpbmUJWk9SQU5fSVNSX0dJUlExCQkoMTw8MzApCisKKyNkZWZpbmUJWk9SQU5fSUNSCQkweDA0MAkvKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlaT1JBTl9JQ1JfRU4JCSgxPDwyNCkKKyNkZWZpbmUJWk9SQU5fSUNSX0NPREUJCSgxPDwyOCkKKyNkZWZpbmUJWk9SQU5fSUNSX0dJUlEwCQkoMTw8MjkpCisjZGVmaW5lCVpPUkFOX0lDUl9HSVJRMQkJKDE8PDMwKQorCisjZGVmaW5lCVpPUkFOX0kyQwkJMHgwNDQJLyogSTJDLUJ1cyAqLworI2RlZmluZSBaT1JBTl9JMkNfU0NMCQkoMTw8MSkKKyNkZWZpbmUgWk9SQU5fSTJDX1NEQQkJKDE8PDApCisKKyNkZWZpbmUJWk9SQU5fUE9TVAkJMHg0OAkvKiBQb3N0T2ZmaWNlICovCisjZGVmaW5lCVpPUkFOX1BPU1RfUEVOCQkoMTw8MjUpCisjZGVmaW5lCVpPUkFOX1BPU1RfVElNRQkJKDE8PDI0KQorI2RlZmluZQlaT1JBTl9QT1NUX0RJUgkJKDE8PDIzKQorI2RlZmluZQlaT1JBTl9QT1NUX0dVRVNUSUQJKDM8PDIwKQorI2RlZmluZQlaT1JBTl9QT1NUX0dVRVNUCSg3PDwxNikKKyNkZWZpbmUJWk9SQU5fUE9TVF9EQVRBCQkoMHhGRjw8MCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjBfaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjBfaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmZTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjEyMF9pMmMuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAgICB6cjM2MTIwX2kyYy5jIC0gWm9yYW4gMzYxMjAvMzYxMjUgYmFzZWQgZnJhbWVncmFiYmVycworCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgUGF1bGluZSBNaWRkZWxpbmsgPG1pZGRlbGluQHBvbHl3YXJlLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJ0dW5lci5oIgorI2luY2x1ZGUgInpyMzYxMjAuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEkyQyBmdW5jdGlvbnMJCQkJCQkJICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHNvZnR3YXJlIEkyQyBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBJMkNfREVMQVkgICAxMAorCitzdGF0aWMgdm9pZCBpMmNfc2V0bGluZXMoc3RydWN0IGkyY19idXMgKmJ1cyxpbnQgY3RybCxpbnQgZGF0YSkKK3sKKwlzdHJ1Y3Qgem9yYW4gKnp0diA9IChzdHJ1Y3Qgem9yYW4qKWJ1cy0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgYiA9IDA7CisJaWYgKGRhdGEpIGIgfD0genR2LT5jYXJkLT5zd2FwaTJjID8gWk9SQU5fSTJDX1NDTCA6IFpPUkFOX0kyQ19TREE7CisJaWYgKGN0cmwpIGIgfD0genR2LT5jYXJkLT5zd2FwaTJjID8gWk9SQU5fSTJDX1NEQSA6IFpPUkFOX0kyQ19TQ0w7CisJenJ3cml0ZShiLCBaT1JBTl9JMkMpOworCXVkZWxheShJMkNfREVMQVkpOworfQorCitzdGF0aWMgaW50IGkyY19nZXRkYXRhbGluZShzdHJ1Y3QgaTJjX2J1cyAqYnVzKQoreworCXN0cnVjdCB6b3JhbiAqenR2ID0gKHN0cnVjdCB6b3JhbiopYnVzLT5kYXRhOworCWlmICh6dHYtPmNhcmQtPnN3YXBpMmMpCisJCXJldHVybiB6cnJlYWQoWk9SQU5fSTJDKSAmIFpPUkFOX0kyQ19TQ0w7CisJcmV0dXJuIHpycmVhZChaT1JBTl9JMkMpICYgWk9SQU5fSTJDX1NEQTsKK30KKworc3RhdGljCit2b2lkIGF0dGFjaF9pbmZvcm0oc3RydWN0IGkyY19idXMgKmJ1cywgaW50IGlkKQoreworCXN0cnVjdCB6b3JhbiAqenR2ID0gKHN0cnVjdCB6b3JhbiopYnVzLT5kYXRhOworCXN0cnVjdCB2aWRlb19kZWNvZGVyX2NhcGFiaWxpdHkgZGM7CisJaW50IHJ2OworCisJc3dpdGNoIChpZCkgeworCSBjYXNlIEkyQ19EUklWRVJJRF9WSURFT0RFQ09ERVI6CisJCURFQlVHKHByaW50ayhDQVJEX0lORk8gImRlY29kZXIgYXR0YWNoZWRcbiIsQ0FSRCkpOworCisJCS8qIGZldGNoIHRoZSBjYXBhYmlsaXRlcyBvZiB0aGUgZGVjb2RlciAqLworCQlydiA9IGkyY19jb250cm9sX2RldmljZSgmenR2LT5pMmMsIEkyQ19EUklWRVJJRF9WSURFT0RFQ09ERVIsIERFQ09ERVJfR0VUX0NBUEFCSUxJVElFUywgJmRjKTsKKwkJaWYgKHJ2KSB7CisJCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiZGVjb2RlciBpcyBub3QgVjRMIGF3YXJlIVxuIixDQVJEKSk7CisJCQlicmVhazsKKwkJfQorCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiY2FwYWJpbGl0aWVzICVkICVkICVkXG4iLENBUkQsZGMuZmxhZ3MsZGMuaW5wdXRzLGRjLm91dHB1dHMpKTsKKworCQkvKiBUZXN0IGlmIHRoZSBkZWNvZGVyIGNhbiBkZSBWQkkgdHJhbnNmZXJzICovCisJCWlmIChkYy5mbGFncyAmIDE2IC8qVklERU9fREVDT0RFUl9WQkkqLykKKwkJCXp0di0+aGF2ZV9kZWNvZGVyID0gMjsKKwkJZWxzZQorCQkJenR2LT5oYXZlX2RlY29kZXIgPSAxOworCQlicmVhazsKKwkgY2FzZSBJMkNfRFJJVkVSSURfVFVORVI6CisJCXp0di0+aGF2ZV90dW5lciA9IDE7CisJCURFQlVHKHByaW50ayhDQVJEX0lORk8gInR1bmVyIGF0dGFjaGVkXG4iLENBUkQpKTsKKwkJaWYgKHp0di0+dHVuZXJfdHlwZSA+PSAwKQorCQl7CisJCQlpZiAoaTJjX2NvbnRyb2xfZGV2aWNlKCZ6dHYtPmkyYyxJMkNfRFJJVkVSSURfVFVORVIsVFVORVJfU0VUX1RZUEUsJnp0di0+dHVuZXJfdHlwZSk8MCkKKwkJCURFQlVHKHByaW50ayhDQVJEX0lORk8gImF0dGFjaF9pbmZvcm07IHR1bmVyIHdvbid0IGJlIHNldCB0byB0eXBlICVkXG4iLENBUkQsenR2LT50dW5lcl90eXBlKSk7CisJCX0KKwkJYnJlYWs7CisJIGRlZmF1bHQ6CisJCURFQlVHKHByaW50ayhDQVJEX0lORk8gImF0dGFjaF9pbmZvcm07IHVua25vd24gZGV2aWNlIGlkPSVkXG4iLENBUkQsaWQpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMKK3ZvaWQgZGV0YWNoX2luZm9ybShzdHJ1Y3QgaTJjX2J1cyAqYnVzLCBpbnQgaWQpCit7CisJc3RydWN0IHpvcmFuICp6dHYgPSAoc3RydWN0IHpvcmFuKilidXMtPmRhdGE7CisKKwlzd2l0Y2ggKGlkKSB7CisJIGNhc2UgSTJDX0RSSVZFUklEX1ZJREVPREVDT0RFUjoKKwkJenR2LT5oYXZlX2RlY29kZXIgPSAwOworCQlERUJVRyhwcmludGsoQ0FSRF9JTkZPICJkZWNvZGVyIGRldGFjaGVkXG4iLENBUkQpKTsKKwkJYnJlYWs7CisJIGNhc2UgSTJDX0RSSVZFUklEX1RVTkVSOgorCQl6dHYtPmhhdmVfdHVuZXIgPSAwOworCQlERUJVRyhwcmludGsoQ0FSRF9JTkZPICJ0dW5lciBkZXRhY2hlZFxuIixDQVJEKSk7CisJCWJyZWFrOworCSBkZWZhdWx0OgorCQlERUJVRyhwcmludGsoQ0FSRF9JTkZPICJkZXRhY2hfaW5mb3JtOyB1bmtub3duIGRldmljZSBpZD0lZFxuIixDQVJELGlkKSk7CisJCWJyZWFrOworCX0KK30KKworc3RydWN0IGkyY19idXMgem9yYW5faTJjX2J1c190ZW1wbGF0ZSA9Cit7CisJIlpSMzYxMjAiLAorCUkyQ19CVVNJRF9aT1JBTiwKKwlOVUxMLAorCisJU1BJTl9MT0NLX1VOTE9DS0VELAorCisJYXR0YWNoX2luZm9ybSwKKwlkZXRhY2hfaW5mb3JtLAorCisJaTJjX3NldGxpbmVzLAorCWkyY19nZXRkYXRhbGluZSwKKwlOVUxMLAorCU5VTEwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjBfbWVtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjBfbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3MTEzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjEyMF9tZW0uYwpAQCAtMCwwICsxLDc5IEBACisvKgorICAgIHpyMzYxMjBfbWVtLmMgLSBab3JhbiAzNjEyMC8zNjEyNSBiYXNlZCBmcmFtZWdyYWJiZXJzCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSBQYXVsaW5lIE1pZGRlbGluayA8bWlkZGVsaW5AcG9seXdhcmUubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpZmRlZiBDT05GSUdfQklHUEhZU19BUkVBCisjaW5jbHVkZSA8bGludXgvYmlncGh5c2FyZWEuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAienIzNjEyMC5oIgorI2luY2x1ZGUgInpyMzYxMjBfbWVtLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCogYm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCogbWVtOworI2lmZGVmIENPTkZJR19CSUdQSFlTX0FSRUEKKwltZW0gPSBiaWdwaHlzYXJlYV9hbGxvY19wYWdlcyhzaXplL1BBR0VfU0laRSwgMSwgR0ZQX0tFUk5FTCk7CisjZWxzZQorCS8qCisJICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBnb3QgYSBsb3Qgb2YgbWVtb3J5IGF0IGJvb3R0aW1lLAorCSAqIHNvIHdlIGtub3cgaXRzIGFsd2F5cyB0aGVyZS4uLgorCSAqLworCW1lbSA9ICh2b2lkKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9VU0VSfEdGUF9ETUEsZ2V0X29yZGVyKHNpemUpKTsKKyNlbmRpZgorCWlmIChtZW0pIHsKKwkJdW5zaWduZWQgbG9uZyBhZHIgPSAodW5zaWduZWQgbG9uZyltZW07CisJCXdoaWxlIChzaXplID4gMCkgeworCQkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShwaHlzX3RvX3ZpcnQoYWRyKSkpOworCQkJYWRyICs9IFBBR0VfU0laRTsKKwkJCXNpemUgLT0gUEFHRV9TSVpFOworCQl9CisJfQorCXJldHVybiBtZW07Cit9CisKK3ZvaWQgYmZyZWUodm9pZCogbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKG1lbSkgeworCQl1bnNpZ25lZCBsb25nIGFkciA9ICh1bnNpZ25lZCBsb25nKW1lbTsKKwkJdW5zaWduZWQgbG9uZyBzaXogPSBzaXplOworCQl3aGlsZSAoc2l6ID4gMCkgeworCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHBoeXNfdG9fdmlydChhZHIpKSk7CisJCQlhZHIgKz0gUEFHRV9TSVpFOworCQkJc2l6IC09IFBBR0VfU0laRTsKKwkJfQorI2lmZGVmIENPTkZJR19CSUdQSFlTX0FSRUEKKwkJYmlncGh5c2FyZWFfZnJlZV9wYWdlcyhtZW0pOworI2Vsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW0sZ2V0X29yZGVyKHNpemUpKTsKKyNlbmRpZgorCX0KK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwX21lbS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwX21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDExN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjBfbWVtLmgKQEAgLTAsMCArMSwzIEBACisvKiBlaXRoZXIga21hbGxvYygpIG9yIGJpZ3BoeXNhcmVhKCkgYWxsb2NlZCBtZW1vcnkgLSBjb250aW51b3VzICovCit2b2lkKglibWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Cit2b2lkCWJmcmVlKHZvaWQqIG1lbSwgdW5zaWduZWQgbG9uZyBzaXplKTsK