ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDIzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCkBAIC0wLDAgKzEsNDQzIEBACisjCisjIEkyQyBTZW5zb3IgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMKKworY29uZmlnIEkyQ19TRU5TT1IKKwl0cmlzdGF0ZQorCWRlZmF1bHQgbgorCitjb25maWcgU0VOU09SU19BRE0xMDIxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEwMjEgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMjEgCisJICBhbmQgQURNMTAyMyBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogTWF4aW0gTUFYMTYxNyBhbmQgTUFYMTYxN0EsCisJICBHZW5lc3lzIExvZ2ljIEdMNTIzU00sIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NCwgVEkgVEhNQzEwLAorCSAgYW5kIHRoZSBYRU9OIHByb2Nlc3NvciBidWlsdC1pbiBzZW5zb3IuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMjEuCisKK2NvbmZpZyBTRU5TT1JTX0FETTEwMjUKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAyNSBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAyNQorCSAgYW5kIFBoaWxpcHMgTkUxNjE5IHNlbnNvciBjaGlwcy4KKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMjUuCisKK2NvbmZpZyBTRU5TT1JTX0FETTEwMjYKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAyNiBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAyNgorCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAyNi4KKworY29uZmlnIFNFTlNPUlNfQURNMTAzMQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDMxIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDMxIAorCSAgYW5kIEFETTEwMzAgc2Vuc29yIGNoaXBzLgorCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAzMS4KKworY29uZmlnIFNFTlNPUlNfQVNCMTAwCisJdHJpc3RhdGUgIkFzdXMgQVNCMTAwIEJhY2giCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEFTQjEwMCBCYWNoIHNlbnNvcgorCSAgY2hpcCBmb3VuZCBvbiBzb21lIEFzdXMgbWFpbmJvYXJkcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXNiMTAwLgorCitjb25maWcgU0VOU09SU19EUzE2MjEKKwl0cmlzdGF0ZSAiRGFsbGFzIFNlbWljb25kdWN0b3IgRFMxNjIxIGFuZCBEUzE2MjUiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRGFsbGFzIFNlbWljb25kdWN0b3IKKwkgIERTMTYyMSBhbmQgRFMxNjI1IHNlbnNvciBjaGlwcy4gCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGRzMTYyMS4KKworY29uZmlnIFNFTlNPUlNfRlNDSEVSCisJdHJpc3RhdGUgIkZTQyBIZXJtZXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRnVqaXRzdSBTaWVtZW5zCisJICBDb21wdXRlcnMgSGVybWVzIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZnNjaGVyLgorCitjb25maWcgU0VOU09SU19GU0NQT1MKKwl0cmlzdGF0ZSAiRlNDIFBvc2VpZG9uIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEZ1aml0c3UgU2llbWVucworCSAgQ29tcHV0ZXJzIFBvc2VpZG9uIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZnNjcG9zLgorCitjb25maWcgU0VOU09SU19HTDUxOFNNCisJdHJpc3RhdGUgIkdlbmVzeXMgTG9naWMgR0w1MThTTSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBHZW5lc3lzIExvZ2ljIEdMNTE4U00KKwkgIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2w1MThzbS4KKworY29uZmlnIFNFTlNPUlNfR0w1MjBTTQorCXRyaXN0YXRlICJHZW5lc3lzIExvZ2ljIEdMNTIwU00iCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2VuZXN5cyBMb2dpYyBHTDUyMFNNCisJICBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdsNTIwc20uCisKK2NvbmZpZyBTRU5TT1JTX0lUODcKKwl0cmlzdGF0ZSAiSVRFIElUODd4eCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgSVRFIElUODd4eCBzZW5zb3IgY2hpcHMKKwkgIGFuZCBjbG9uZXM6IFNpUzk2MC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaXQ4Ny4KKworY29uZmlnIFNFTlNPUlNfTE02MworCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNjMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKKwkgIExNNjMgcmVtb3RlIGRpb2RlIGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIHdpdGggaW50ZWdyYXRlZCBmYW4KKwkgIGNvbnRyb2wuICBTdWNoIGNoaXBzIGFyZSBmb3VuZCBvbiB0aGUgVHlhbiBTNDg4MiAoVGh1bmRlciBLOFFTIFBybykKKwkgIG1vdGhlcmJvYXJkLCBhbW9uZyBvdGhlcnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtNjMuCisKK2NvbmZpZyBTRU5TT1JTX0xNNzUKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc1IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzUKKwkgIHNlbnNvciBjaGlwcyBhbmQgY2xvbmVzOiBEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzc1IGFuZCBEUzE3NzUgKGluCisJICA5LWJpdCBwcmVjaXNpb24gbW9kZSksIGFuZCBUZWxDb20gKG5vdyBNaWNyb2NoaXApIFRDTjc1LgorCisJICBUaGUgRFM3NSBhbmQgRFMxNzc1IGluIDEwLSB0byAxMi1iaXQgcHJlY2lzaW9uIG1vZGVzIHdpbGwgcmVxdWlyZQorCSAgYSBmb3JjZSBtb2R1bGUgcGFyYW1ldGVyLiBUaGUgZHJpdmVyIHdpbGwgbm90IGhhbmRsZSB0aGUgZXh0cmEKKwkgIHByZWNpc2lvbiBhbnlob3cuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtNzUuCisKK2NvbmZpZyBTRU5TT1JTX0xNNzcKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc3IgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NworCSAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTc3LgorCitjb25maWcgU0VOU09SU19MTTc4CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03OCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc4LAorCSAgTE03OC1KIGFuZCBMTTc5LiAgVGhpcyBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGFuZCByZW1vdmVkIHdoaWxlIHRoZSBrZXJuZWwgaXMgcnVubmluZy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG03OC4KKworY29uZmlnIFNFTlNPUlNfTE04MAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODAiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgorCSAgTE04MCBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtODAuCisKK2NvbmZpZyBTRU5TT1JTX0xNODMKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTgzIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgorCSAgTE04MyBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtODMuCisKK2NvbmZpZyBTRU5TT1JTX0xNODUKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg1IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODUKKwkgIHNlbnNvciBjaGlwcyBhbmQgY2xvbmVzOiBBRFQ3NDYzIGFuZCBBRE0xMDI3LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTg1LgorCitjb25maWcgU0VOU09SU19MTTg3CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcKKwkgIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG04Ny4KKworY29uZmlnIFNFTlNPUlNfTE05MAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTAgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkwLAorCSAgTE04NiwgTE04OSBhbmQgTE05OSwgQW5hbG9nIERldmljZXMgQURNMTAzMiBhbmQgTWF4aW0gTUFYNjY1NyBhbmQKKwkgIE1BWDY2NTggc2Vuc29yIGNoaXBzLgorCisJICBUaGUgQW5hbG9nIERldmljZXMgQURUNzQ2MSBzZW5zb3IgY2hpcCBpcyBhbHNvIHN1cHBvcnRlZCwgYnV0IG9ubHkKKwkgIGlmIGZvdW5kIGluIEFETTEwMzIgY29tcGF0aWJpbGl0eSBtb2RlLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTkwLgorCitjb25maWcgU0VOU09SU19MTTkyCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MiBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkyCisJICBhbmQgTWF4aW0gTUFYNjYzNSBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtOTIuCisKK2NvbmZpZyBTRU5TT1JTX01BWDE2MTkKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYxOSBzZW5zb3IgY2hpcCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVgxNjE5IHNlbnNvciBjaGlwLgorCSAgCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXgxNjE5LgorCitjb25maWcgU0VOU09SU19QQzg3MzYwCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzM2MCBmYW1pbHkiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKKwkgIGZ1bmN0aW9ucyBvZiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzZ4IFN1cGVyLUkvTyBjaGlwcy4KKwkgIFRoZSBQQzg3MzYwLCBQQzg3MzYzIGFuZCBQQzg3MzY0IG9ubHkgaGF2ZSBmYW4gbW9uaXRvcmluZyBhbmQKKwkgIGNvbnRyb2wuICBUaGUgUEM4NzM2NSBhbmQgUEM4NzM2NiBhZGRpdGlvbmFsbHkgaGF2ZSB2b2x0YWdlIGFuZAorCSAgdGVtcGVyYXR1cmUgbW9uaXRvcmluZy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcGM4NzM2MC4KKworY29uZmlnIFNFTlNPUlNfU01TQzQ3QjM5NworCXRyaXN0YXRlICJTTVNDIExQQzQ3QjM5Ny1OQyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBJMkNfSVNBCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBTTVNDIExQQzQ3QjM5Ny1OQworCSAgc2Vuc29yIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N2IzOTcuCisKK2NvbmZpZyBTRU5TT1JTX1NJUzU1OTUKKwl0cmlzdGF0ZSAiU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycC4gU2lTNTU5NSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCisJICBTaVM1NTk1IFNvdXRoIEJyaWRnZXMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNpczU1OTUuCisKK2NvbmZpZyBTRU5TT1JTX1NNU0M0N00xCisJdHJpc3RhdGUgIlNNU0MgTFBDNDdNMTB4IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBJMkNfSVNBCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIGZhbgorCSAgbW9uaXRvcmluZyBhbmQgY29udHJvbCBjYXBhYmlsaXRpZXMgb2YgdGhlIFNNU0MgTFBDNDdCMjd4LAorCSAgTFBDNDdNMTB4LCBMUEM0N00xM3ggYW5kIExQQzQ3TTE0eCBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc21zYzQ3bTEuCisKK2NvbmZpZyBTRU5TT1JTX1ZJQTY4NkEKKwl0cmlzdGF0ZSAiVklBNjg2QSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCisJICBWaWEgNjg2QS9CIFNvdXRoIEJyaWRnZXMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHZpYTY4NmEuCisKK2NvbmZpZyBTRU5TT1JTX1c4Mzc4MUQKKwl0cmlzdGF0ZSAiV2luYm9uZCBXODM3ODFELCBXODM3ODJELCBXODM3ODNTLCBXODM2MjdIRiwgQXN1cyBBUzk5MTI3RiIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODM3OHggc2VyaWVzCisJICBvZiBzZW5zb3IgY2hpcHM6IHRoZSBXODM3ODFELCBXODM3ODJELCBXODM3ODNTIGFuZCBXODM2MjdIRiwKKwkgIGFuZCB0aGUgc2ltaWxhciBBc3VzIEFTOTkxMjdGLgorCSAgCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB3ODM3ODFkLgorCitjb25maWcgU0VOU09SU19XODNMNzg1VFMKKwl0cmlzdGF0ZSAiV2luYm9uZCBXODNMNzg1VFMtUyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODNMNzg1VFMtUworCSAgc2Vuc29yIGNoaXAsIHdoaWNoIGlzIHVzZWQgb24gdGhlIEFzdXMgQTdOOFgsIGFtb25nIG90aGVyCisJICBtb3RoZXJib2FyZHMuCisJICAKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHc4M2w3ODV0cy4KKworY29uZmlnIFNFTlNPUlNfVzgzNjI3SEYKKwl0cmlzdGF0ZSAiV2luYm9uZCBXODM2MjdIRiwgVzgzNjI3VEhGLCBXODM2MzdIRiwgVzgzNjk3SEYiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODM2WDcgc2VyaWVzCisJICBvZiBzZW5zb3IgY2hpcHM6IHRoZSBXODM2MjdIRiwgVzgzNjI3VEhGLCBXODM2MzdIRiwgYW5kIHRoZSBXODM2OTdIRgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB3ODM2MjdoZi4KKworZW5kbWVudQorCittZW51ICJPdGhlciBJMkMgQ2hpcCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDCisKK2NvbmZpZyBTRU5TT1JTX0RTMTMzNworCXRyaXN0YXRlICJEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzEzMzcgUmVhbCBUaW1lIENsb2NrIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yCisJICBEUzEzMzcgcmVhbC10aW1lIGNsb2NrIGNoaXBzLiAKKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZHMxMzM3LgorCitjb25maWcgU0VOU09SU19FRVBST00KKwl0cmlzdGF0ZSAiRUVQUk9NIHJlYWRlciIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBFRVBST00gZGF0YQorCSAgYXZhaWxhYmxlIG9uIG1vZGVybiBtZW1vcnkgRElNTXMgYW5kIFNvbnkgVmFpbyBsYXB0b3BzLiAgU3VjaAorCSAgRUVQUk9NcyBjb3VsZCB0aGVvcmV0aWNhbGx5IGJlIGF2YWlsYWJsZSBvbiBvdGhlciBkZXZpY2VzIGFzIHdlbGwuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGVlcHJvbS4KKworY29uZmlnIFNFTlNPUlNfUENGODU3NAorCXRyaXN0YXRlICJQaGlsaXBzIFBDRjg1NzQgYW5kIFBDRjg1NzRBIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIFBoaWxpcHMgUENGODU3NCBhbmQgCisJICBQQ0Y4NTc0QSBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcGNmODU3NC4KKworY29uZmlnIFNFTlNPUlNfUENGODU5MQorCXRyaXN0YXRlICJQaGlsaXBzIFBDRjg1OTEiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgUGhpbGlwcyBQQ0Y4NTkxIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBwY2Y4NTkxLgorCitjb25maWcgU0VOU09SU19SVEM4NTY0CisJdHJpc3RhdGUgIkVwc29uIDg1NjQgUlRDIGNoaXAiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEVwc29uIDg1NjQgUlRDIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1ydGM4NTY0LgorCitjb25maWcgSVNQMTMwMV9PTUFQCisJdHJpc3RhdGUgIlBoaWxpcHMgSVNQMTMwMSB3aXRoIE9NQVAgT1RHIgorCWRlcGVuZHMgb24gSTJDICYmIEFSQ0hfT01BUF9PVEcKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFBoaWxpcHMgSVNQMTMwMQorCSAgVVNCLU9uLVRoZS1HbyB0cmFuc2NlaXZlciB3b3JraW5nIHdpdGggdGhlIE9NQVAgT1RHIGNvbnRyb2xsZXIuCisJICBUaGUgSVNQMTMwMSBpcyB1c2VkIGluIHByb2R1Y3RzIGluY2x1ZGluZyBIMiBhbmQgSDMgZGV2ZWxvcG1lbnQKKwkgIGJvYXJkcyBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgT01BUCBwcm9jZXNzb3JzLgorCSAgCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpc3AxMzAxX29tYXAuCisKK2NvbmZpZyBTRU5TT1JTX000MVQwMAorCXRyaXN0YXRlICJTVCBNNDFUMDAgUlRDIGNoaXAiCisJZGVwZW5kcyBvbiBJMkMgJiYgUFBDMzIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFNUIE00MVQwMCBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbTQxdDAwLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTk5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQ4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUga2VybmVsIGhhcmR3YXJlIHNlbnNvcnMgY2hpcCBkcml2ZXJzLgorIworCisjIGFzYjEwMCwgdGhlbiB3ODM3ODFkIGdvIGZpcnN0LCBhcyB0aGV5IGNhbiBvdmVycmlkZSBvdGhlciBkcml2ZXJzJyBhZGRyZXNzZXMuCitvYmotJChDT05GSUdfU0VOU09SU19BU0IxMDApCSs9IGFzYjEwMC5vCitvYmotJChDT05GSUdfU0VOU09SU19XODM2MjdIRikJKz0gdzgzNjI3aGYubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNzgxRCkJKz0gdzgzNzgxZC5vCisKK29iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjEpCSs9IGFkbTEwMjEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyNSkJKz0gYWRtMTAyNS5vCitvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDI2KQkrPSBhZG0xMDI2Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMzEpCSs9IGFkbTEwMzEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfRFMxMzM3KQkrPSBkczEzMzcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfRFMxNjIxKQkrPSBkczE2MjEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfRUVQUk9NKQkrPSBlZXByb20ubworb2JqLSQoQ09ORklHX1NFTlNPUlNfRlNDSEVSKQkrPSBmc2NoZXIubworb2JqLSQoQ09ORklHX1NFTlNPUlNfRlNDUE9TKQkrPSBmc2Nwb3Mubworb2JqLSQoQ09ORklHX1NFTlNPUlNfR0w1MThTTSkJKz0gZ2w1MThzbS5vCitvYmotJChDT05GSUdfU0VOU09SU19HTDUyMFNNKQkrPSBnbDUyMHNtLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0lUODcpCSs9IGl0ODcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE02MykJKz0gbG02My5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTc1KQkrPSBsbTc1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNNzcpCSs9IGxtNzcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03OCkJKz0gbG03OC5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTgwKQkrPSBsbTgwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNODMpCSs9IGxtODMubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04NSkJKz0gbG04NS5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTg3KQkrPSBsbTg3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNOTApCSs9IGxtOTAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05MikJKz0gbG05Mi5vCitvYmotJChDT05GSUdfU0VOU09SU19NQVgxNjE5KQkrPSBtYXgxNjE5Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX000MVQwMCkJKz0gbTQxdDAwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1BDODczNjApCSs9IHBjODczNjAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfUENGODU3NCkJKz0gcGNmODU3NC5vCitvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTkxKQkrPSBwY2Y4NTkxLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1JUQzg1NjQpCSs9IHJ0Yzg1NjQubworb2JqLSQoQ09ORklHX1NFTlNPUlNfU0lTNTU5NSkJKz0gc2lzNTU5NS5vCitvYmotJChDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3KSs9IHNtc2M0N2IzOTcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEpCSs9IHNtc2M0N20xLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1ZJQTY4NkEpCSs9IHZpYTY4NmEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTKQkrPSB3ODNsNzg1dHMubworb2JqLSQoQ09ORklHX0lTUDEzMDFfT01BUCkJKz0gaXNwMTMwMV9vbWFwLm8KKworaWZlcSAoJChDT05GSUdfSTJDX0RFQlVHX0NISVApLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyMS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTlhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDIxLmMKQEAgLTAsMCArMSw0MTEgQEAKKy8qCisgICAgYWRtMTAyMS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICBtb25pdG9yaW5nCisgICAgQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5ICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+IGFuZAorICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgxOCwgMHgxOSwgMHgxYSwKKwkJCQkJMHgyOSwgMHgyYSwgMHgyYiwKKwkJCQkJMHg0YywgMHg0ZCwgMHg0ZSwgCisJCQkJCUkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF84KGFkbTEwMjEsIGFkbTEwMjMsIG1heDE2MTcsIG1heDE2MTdhLCB0aG1jMTAsIGxtODQsIGdsNTIzc20sIG1jMTA2Nik7CisKKy8qIGFkbTEwMjEgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLworCisvKiBUaGUgYWRtMTAyMSByZWdpc3RlcnMgKi8KKy8qIFJlYWQtb25seSAqLworI2RlZmluZSBBRE0xMDIxX1JFR19URU1QCQkweDAwCisjZGVmaW5lIEFETTEwMjFfUkVHX1JFTU9URV9URU1QCQkweDAxCisjZGVmaW5lIEFETTEwMjFfUkVHX1NUQVRVUwkJMHgwMgorI2RlZmluZSBBRE0xMDIxX1JFR19NQU5fSUQJCTB4MEZFCS8qIDB4NDEgPSBBTUQsIDB4NDkgPSBUSSwgMHg0RCA9IE1heGltLCAweDIzID0gR2VuZXN5cyAsIDB4NTQgPSBPbnNlbWkqLworI2RlZmluZSBBRE0xMDIxX1JFR19ERVZfSUQJCTB4MEZGCS8qIEFETTEwMjEgPSAweDBYLCBBRE0xMDIzID0gMHgzWCAqLworI2RlZmluZSBBRE0xMDIxX1JFR19ESUVfQ09ERQkJMHgwRkYJLyogTUFYMTYxN0EgKi8KKy8qIFRoZXNlIHVzZSBkaWZmZXJlbnQgYWRkcmVzc2VzIGZvciByZWFkaW5nL3dyaXRpbmcgKi8KKyNkZWZpbmUgQURNMTAyMV9SRUdfQ09ORklHX1IJCTB4MDMKKyNkZWZpbmUgQURNMTAyMV9SRUdfQ09ORklHX1cJCTB4MDkKKyNkZWZpbmUgQURNMTAyMV9SRUdfQ09OVl9SQVRFX1IJCTB4MDQKKyNkZWZpbmUgQURNMTAyMV9SRUdfQ09OVl9SQVRFX1cJCTB4MEEKKy8qIFRoZXNlIGFyZSBmb3IgdGhlIEFETTEwMjMncyBhZGRpdGlvbmFsIHByZWNpc2lvbiBvbiB0aGUgcmVtb3RlIHRlbXAgc2Vuc29yICovCisjZGVmaW5lIEFETTEwMjFfUkVHX1JFTV9URU1QX1BSRUMJMHgwMTAKKyNkZWZpbmUgQURNMTAyMV9SRUdfUkVNX09GRlNFVAkJMHgwMTEKKyNkZWZpbmUgQURNMTAyMV9SRUdfUkVNX09GRlNFVF9QUkVDCTB4MDEyCisjZGVmaW5lIEFETTEwMjFfUkVHX1JFTV9UT1NfUFJFQwkweDAxMworI2RlZmluZSBBRE0xMDIxX1JFR19SRU1fVEhZU1RfUFJFQwkweDAxNAorLyogbGltaXRzICovCisjZGVmaW5lIEFETTEwMjFfUkVHX1RPU19SCQkweDA1CisjZGVmaW5lIEFETTEwMjFfUkVHX1RPU19XCQkweDBCCisjZGVmaW5lIEFETTEwMjFfUkVHX1JFTU9URV9UT1NfUgkweDA3CisjZGVmaW5lIEFETTEwMjFfUkVHX1JFTU9URV9UT1NfVwkweDBECisjZGVmaW5lIEFETTEwMjFfUkVHX1RIWVNUX1IJCTB4MDYKKyNkZWZpbmUgQURNMTAyMV9SRUdfVEhZU1RfVwkJMHgwQworI2RlZmluZSBBRE0xMDIxX1JFR19SRU1PVEVfVEhZU1RfUgkweDA4CisjZGVmaW5lIEFETTEwMjFfUkVHX1JFTU9URV9USFlTVF9XCTB4MEUKKy8qIHdyaXRlLW9ubHkgKi8KKyNkZWZpbmUgQURNMTAyMV9SRUdfT05FU0hPVAkJMHgwRgorCisKKy8qIENvbnZlcnNpb25zLiBSb3VuZGluZyBhbmQgbGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcKKyAgIHZhcmlhbnRzLiBOb3RlIHRoYXQgeW91IHNob3VsZCBiZSBhIGJpdCBjYXJlZnVsIHdpdGggd2hpY2ggYXJndW1lbnRzCisgICB0aGVzZSBtYWNyb3MgYXJlIGNhbGxlZDogYXJndW1lbnRzIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCisgICBGaXhpbmcgdGhpcyBpcyBqdXN0IG5vdCB3b3J0aCBpdC4gKi8KKy8qIENvbnZlcnNpb25zICBub3RlOiAxMDIxIHVzZXMgbm9ybWFsIGludGVnZXIgc2lnbmVkLWJ5dGUgZm9ybWF0Ki8KKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCSh2YWwgPiAxMjcgPyAodmFsLTI1NikqMTAwMCA6IHZhbCoxMDAwKQorI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpCShTRU5TT1JTX0xJTUlUKCh2YWwgPCAwID8gKHZhbC8xMDAwKSsyNTYgOiB2YWwvMTAwMCksMCwyNTUpKQorCisvKiBJbml0aWFsIHZhbHVlcyAqLworCisvKiBOb3RlOiBFdmVuIHRob3VnaCBJIGxlZnQgdGhlIGxvdyBhbmQgaGlnaCBsaW1pdHMgbmFtZWQgb3MgYW5kIGh5c3QsIAordGhleSBkb24ndCBxdWl0ZSB3b3JrIGxpa2UgYSB0aGVybW9zdGF0IHRoZSB3YXkgdGhlIExNNzUgZG9lcy4gIEkuZS4sIAorYSBsb3dlciB0ZW1wIHRoYW4gVEhZU1QgYWN0dWFsbHkgdHJpZ2dlcnMgYW4gYWxhcm0gaW5zdGVhZCBvZiAKK2NsZWFyaW5nIGl0LiAgV2VpcmQsIGV5PyAgIC0tUGhpbCAgKi8KKworLyogRWFjaCBjbGllbnQgaGFzIHRoaXMgYWRkaXRpb25hbCBkYXRhICovCitzdHJ1Y3QgYWRtMTAyMV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJZW51bSBjaGlwcyB0eXBlOworCisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCXU4CXRlbXBfbWF4OwkvKiBSZWdpc3RlciB2YWx1ZXMgKi8KKwl1OAl0ZW1wX2h5c3Q7CisJdTgJdGVtcF9pbnB1dDsKKwl1OAlyZW1vdGVfdGVtcF9tYXg7CisJdTgJcmVtb3RlX3RlbXBfaHlzdDsKKwl1OAlyZW1vdGVfdGVtcF9pbnB1dDsKKwl1OAlhbGFybXM7CisJLyogc3BlY2lhbCB2YWx1ZXMgZm9yIEFETTEwMjEgb25seSAqLworCXU4CWRpZV9jb2RlOworICAgICAgICAvKiBTcGVjaWFsIHZhbHVlcyBmb3IgQURNMTAyMyBvbmx5ICovCisJdTgJcmVtb3RlX3RlbXBfcHJlYzsKKwl1OAlyZW1vdGVfdGVtcF9vc19wcmVjOworCXU4CXJlbW90ZV90ZW1wX2h5c3RfcHJlYzsKKwl1OAlyZW1vdGVfdGVtcF9vZmZzZXQ7CisJdTgJcmVtb3RlX3RlbXBfb2Zmc2V0X3ByZWM7Cit9OworCitzdGF0aWMgaW50IGFkbTEwMjFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgYWRtMTAyMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIHZvaWQgYWRtMTAyMV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgYWRtMTAyMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBhZG0xMDIxX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKTsKK3N0YXRpYyBpbnQgYWRtMTAyMV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsCisJCQkgICAgICAgdTE2IHZhbHVlKTsKK3N0YXRpYyBzdHJ1Y3QgYWRtMTAyMV9kYXRhICphZG0xMDIxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyogKGFtYWx5c2gpIHJlYWQgb25seSBtb2RlLCBvdGhlcndpc2UgYW55IGxpbWl0J3Mgd3JpdGluZyBjb25mdXNlIEJJT1MgKi8KK3N0YXRpYyBpbnQgcmVhZF9vbmx5ID0gMDsKKworCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRtMTAyMV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJhZG0xMDIxIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX0FETTEwMjEsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gYWRtMTAyMV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGFkbTEwMjFfZGV0YWNoX2NsaWVudCwKK307CisKKyNkZWZpbmUgc2hvdyh2YWx1ZSkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgYWRtMTAyMV9kYXRhICpkYXRhID0gYWRtMTAyMV91cGRhdGVfZGV2aWNlKGRldik7CQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dmFsdWUpKTsJXAorfQorc2hvdyh0ZW1wX21heCk7CitzaG93KHRlbXBfaHlzdCk7CitzaG93KHRlbXBfaW5wdXQpOworc2hvdyhyZW1vdGVfdGVtcF9tYXgpOworc2hvdyhyZW1vdGVfdGVtcF9oeXN0KTsKK3Nob3cocmVtb3RlX3RlbXBfaW5wdXQpOworCisjZGVmaW5lIHNob3cyKHZhbHVlKQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBhZG0xMDIxX2RhdGEgKmRhdGEgPSBhZG0xMDIxX3VwZGF0ZV9kZXZpY2UoZGV2KTsJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+dmFsdWUpOwkJCVwKK30KK3Nob3cyKGFsYXJtcyk7CitzaG93MihkaWVfY29kZSk7CisKKyNkZWZpbmUgc2V0KHZhbHVlLCByZWcpCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwkJXAorCXN0cnVjdCBhZG0xMDIxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQlcCisJCQkJCQkJCVwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCVwKKwlkYXRhLT52YWx1ZSA9IFRFTVBfVE9fUkVHKHRlbXApOwkJCVwKKwlhZG0xMDIxX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT52YWx1ZSk7CQlcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJXAorfQorc2V0KHRlbXBfbWF4LCBBRE0xMDIxX1JFR19UT1NfVyk7CitzZXQodGVtcF9oeXN0LCBBRE0xMDIxX1JFR19USFlTVF9XKTsKK3NldChyZW1vdGVfdGVtcF9tYXgsIEFETTEwMjFfUkVHX1JFTU9URV9UT1NfVyk7CitzZXQocmVtb3RlX3RlbXBfaHlzdCwgQURNMTAyMV9SRUdfUkVNT1RFX1RIWVNUX1cpOworCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX21heCwgc2V0X3RlbXBfbWF4KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfaHlzdCwgc2V0X3RlbXBfaHlzdCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19yZW1vdGVfdGVtcF9tYXgsIHNldF9yZW1vdGVfdGVtcF9tYXgpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfcmVtb3RlX3RlbXBfaHlzdCwgc2V0X3JlbW90ZV90ZW1wX2h5c3QpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3JlbW90ZV90ZW1wX2lucHV0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkaWVfY29kZSwgU19JUlVHTywgc2hvd19kaWVfY29kZSwgTlVMTCk7CisKKworc3RhdGljIGludCBhZG0xMDIxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGFkbTEwMjFfZGV0ZWN0KTsKK30KKworc3RhdGljIGludCBhZG0xMDIxX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgYWRtMTAyMV9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9ICIiOworCisJLyogTWFrZSBzdXJlIHdlIGFyZW4ndCBwcm9iaW5nIHRoZSBJU0EgYnVzISEgVGhpcyBpcyBqdXN0IGEgc2FmZXR5IGNoZWNrCisJICAgYXQgdGhpcyBtb21lbnQ7IGkyY19kZXRlY3QgcmVhbGx5IHdvbid0IGNhbGwgdXMuICovCisjaWZkZWYgREVCVUcKKwlpZiAoaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpKSB7CisJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImFkbTEwMjFfZGV0ZWN0IGNhbGxlZCBmb3IgYW4gSVNBIGJ1cyBhZGFwdGVyPyE/XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCWdvdG8gZXJyb3IwOworCisJLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKKwkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KKwkgICBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBhZG0xMDIxX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRtMTAyMV9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3IwOworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBhZG0xMDIxX2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmYWRtMTAyMV9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJaWYgKChhZG0xMDIxX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQURNMTAyMV9SRUdfU1RBVFVTKSAmIDB4MDMpICE9IDB4MDAKKwkJIHx8IChhZG0xMDIxX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQURNMTAyMV9SRUdfQ09ORklHX1IpICYgMHgzRikgIT0gMHgwMAorCQkgfHwgKGFkbTEwMjFfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBRE0xMDIxX1JFR19DT05WX1JBVEVfUikgJiAweEY4KSAhPSAweDAwKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBlcnJvcjE7CisJCX0KKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KKwlpZiAoa2luZCA8PSAwKSB7CisJCWkgPSBhZG0xMDIxX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQURNMTAyMV9SRUdfTUFOX0lEKTsKKwkJaWYgKGkgPT0gMHg0MSkKKwkJCWlmICgoYWRtMTAyMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFETTEwMjFfUkVHX0RFVl9JRCkgJiAweDBGMCkgPT0gMHgwMzApCisJCQkJa2luZCA9IGFkbTEwMjM7CisJCQllbHNlCisJCQkJa2luZCA9IGFkbTEwMjE7CisJCWVsc2UgaWYgKGkgPT0gMHg0OSkKKwkJCWtpbmQgPSB0aG1jMTA7CisJCWVsc2UgaWYgKGkgPT0gMHgyMykKKwkJCWtpbmQgPSBnbDUyM3NtOworCQllbHNlIGlmICgoaSA9PSAweDRkKSAmJgorCQkJIChhZG0xMDIxX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQURNMTAyMV9SRUdfREVWX0lEKSA9PSAweDAxKSkKKwkJCWtpbmQgPSBtYXgxNjE3YTsKKwkJZWxzZSBpZiAoaSA9PSAweDU0KQorCQkJa2luZCA9IG1jMTA2NjsKKwkJLyogTE04NCBNZnIgSUQgaW4gYSBkaWZmZXJlbnQgcGxhY2UsIGFuZCBpdCBoYXMgbW9yZSB1bnVzZWQgYml0cyAqLworCQllbHNlIGlmIChhZG0xMDIxX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQURNMTAyMV9SRUdfQ09OVl9SQVRFX1IpID09IDB4MDAKKwkJICAgICAgJiYgKGtpbmQgPT0gMCAvKiBza2lwIGV4dHJhIGRldGVjdGlvbiAqLworCQkgICAgICAgfHwgKChhZG0xMDIxX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQURNMTAyMV9SRUdfQ09ORklHX1IpICYgMHg3RikgPT0gMHgwMAorCQkJJiYgKGFkbTEwMjFfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBRE0xMDIxX1JFR19TVEFUVVMpICYgMHhBQikgPT0gMHgwMCkpKQorCQkJa2luZCA9IGxtODQ7CisJCWVsc2UKKwkJCWtpbmQgPSBtYXgxNjE3OworCX0KKworCWlmIChraW5kID09IG1heDE2MTcpIHsKKwkJdHlwZV9uYW1lID0gIm1heDE2MTciOworCX0gZWxzZSBpZiAoa2luZCA9PSBtYXgxNjE3YSkgeworCQl0eXBlX25hbWUgPSAibWF4MTYxN2EiOworCX0gZWxzZSBpZiAoa2luZCA9PSBhZG0xMDIxKSB7CisJCXR5cGVfbmFtZSA9ICJhZG0xMDIxIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gYWRtMTAyMykgeworCQl0eXBlX25hbWUgPSAiYWRtMTAyMyI7CisJfSBlbHNlIGlmIChraW5kID09IHRobWMxMCkgeworCQl0eXBlX25hbWUgPSAidGhtYzEwIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gbG04NCkgeworCQl0eXBlX25hbWUgPSAibG04NCI7CisJfSBlbHNlIGlmIChraW5kID09IGdsNTIzc20pIHsKKwkJdHlwZV9uYW1lID0gImdsNTIzc20iOworCX0gZWxzZSBpZiAoa2luZCA9PSBtYzEwNjYpIHsKKwkJdHlwZV9uYW1lID0gIm1jMTA2NiI7CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpdCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgdHlwZV9uYW1lLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT50eXBlID0ga2luZDsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGVycm9yMTsKKworCS8qIEluaXRpYWxpemUgdGhlIEFETTEwMjEgY2hpcCAqLworCWlmIChraW5kICE9IGxtODQpCisJCWFkbTEwMjFfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisJaWYgKGRhdGEtPnR5cGUgPT0gYWRtMTAyMSkKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9kaWVfY29kZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3IxOgorCWtmcmVlKGRhdGEpOworZXJyb3IwOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGFkbTEwMjFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwkvKiBFbmFibGUgQURDIGFuZCBkaXNhYmxlIHN1c3BlbmQgbW9kZSAqLworCWFkbTEwMjFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDIxX1JFR19DT05GSUdfVywKKwkJYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfQ09ORklHX1IpICYgMHhCRik7CisJLyogU2V0IENvbnZlcnNpb24gcmF0ZSB0byAxL3NlYyAodGhpcyBjYW4gYmUgdGlua2VyZWQgd2l0aCkgKi8KKwlhZG0xMDIxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfQ09OVl9SQVRFX1csIDB4MDQpOworfQorCitzdGF0aWMgaW50IGFkbTEwMjFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworLyogQWxsIHJlZ2lzdGVycyBhcmUgYnl0ZS1zaXplZCAqLworc3RhdGljIGludCBhZG0xMDIxX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCitzdGF0aWMgaW50IGFkbTEwMjFfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCit7CisJaWYgKCFyZWFkX29ubHkpCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRtMTAyMV9kYXRhICphZG0xMDIxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGFkbTEwMjEgdXBkYXRlXG4iKTsKKworCQlkYXRhLT50ZW1wX2lucHV0ID0gYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfVEVNUCk7CisJCWRhdGEtPnRlbXBfbWF4ID0gYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfVE9TX1IpOworCQlkYXRhLT50ZW1wX2h5c3QgPSBhZG0xMDIxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDIxX1JFR19USFlTVF9SKTsKKwkJZGF0YS0+cmVtb3RlX3RlbXBfaW5wdXQgPSBhZG0xMDIxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDIxX1JFR19SRU1PVEVfVEVNUCk7CisJCWRhdGEtPnJlbW90ZV90ZW1wX21heCA9IGFkbTEwMjFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjFfUkVHX1JFTU9URV9UT1NfUik7CisJCWRhdGEtPnJlbW90ZV90ZW1wX2h5c3QgPSBhZG0xMDIxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDIxX1JFR19SRU1PVEVfVEhZU1RfUik7CisJCWRhdGEtPmFsYXJtcyA9IGFkbTEwMjFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjFfUkVHX1NUQVRVUykgJiAweDdjOworCQlpZiAoZGF0YS0+dHlwZSA9PSBhZG0xMDIxKQorCQkJZGF0YS0+ZGllX2NvZGUgPSBhZG0xMDIxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDIxX1JFR19ESUVfQ09ERSk7CisJCWlmIChkYXRhLT50eXBlID09IGFkbTEwMjMpIHsKKwkJCWRhdGEtPnJlbW90ZV90ZW1wX3ByZWMgPSBhZG0xMDIxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDIxX1JFR19SRU1fVEVNUF9QUkVDKTsKKwkJCWRhdGEtPnJlbW90ZV90ZW1wX29zX3ByZWMgPSBhZG0xMDIxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDIxX1JFR19SRU1fVE9TX1BSRUMpOworCQkJZGF0YS0+cmVtb3RlX3RlbXBfaHlzdF9wcmVjID0gYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfUkVNX1RIWVNUX1BSRUMpOworCQkJZGF0YS0+cmVtb3RlX3RlbXBfb2Zmc2V0ID0gYWRtMTAyMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyMV9SRUdfUkVNX09GRlNFVCk7CisJCQlkYXRhLT5yZW1vdGVfdGVtcF9vZmZzZXRfcHJlYyA9IGFkbTEwMjFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjFfUkVHX1JFTV9PRkZTRVRfUFJFQyk7CisJCX0KKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19hZG0xMDIxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkbTEwMjFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfYWRtMTAyMV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkbTEwMjFfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUiAoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gYW5kICIKKwkJIlBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiYWRtMTAyMSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKHJlYWRfb25seSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlYWRfb25seSwgIkRvbid0IHNldCBhbnkgdmFsdWVzLCByZWFkIG9ubHkgbW9kZSIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2FkbTEwMjFfaW5pdCkKK21vZHVsZV9leGl0KHNlbnNvcnNfYWRtMTAyMV9leGl0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyNS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzcxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDI1LmMKQEAgLTAsMCArMSw1NzQgQEAKKy8qCisgKiBhZG0xMDI1LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgICAgICAgQ2hlbi1ZdWFuIFd1IDxnd3VAZXNvZnQuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICoKKyAqIFRoZSBBRE0xMDI1IGlzIGEgc2Vuc29yIGNoaXAgbWFkZSBieSBBbmFsb2cgRGV2aWNlcy4gSXQgcmVwb3J0cyB1cCB0byA2CisgKiB2b2x0YWdlcyAoaW5jbHVkaW5nIGl0cyBvd24gcG93ZXIgc291cmNlKSBhbmQgdXAgdG8gdHdvIHRlbXBlcmF0dXJlcworICogKGl0cyBvd24gcGx1cyB1cCB0byBvbmUgZXh0ZXJuYWwgb25lKS4gVm9sdGFnZXMgYXJlIHNjYWxlZCBpbnRlcm5hbGx5CisgKiAod2hpY2ggaXMgbm90IHRoZSBjb21tb24gd2F5KSB3aXRoIHJhdGlvcyBzdWNoIHRoYXQgdGhlIG5vbWluYWwgdmFsdWUKKyAqIG9mIGVhY2ggdm9sdGFnZSBjb3JyZXNwb25kIHRvIGEgcmVnaXN0ZXIgdmFsdWUgb2YgMTkyICh3aGljaCBtZWFucyBhCisgKiByZXNvbHV0aW9uIG9mIGFib3V0IDAuNSUgb2YgdGhlIG5vbWluYWwgdmFsdWUpLiBUZW1wZXJhdHVyZSB2YWx1ZXMgYXJlCisgKiByZXBvcnRlZCB3aXRoIGEgMSBkZWcgcmVzb2x1dGlvbiBhbmQgYSAzIGRlZyBhY2N1cmFjeS4gQ29tcGxldGUKKyAqIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBBbmFsb2cncyB3ZWJzaXRlIGF0OgorICogICBodHRwOi8vd3d3LmFuYWxvZy5jb20vQW5hbG9nX1Jvb3QvcHJvZHVjdFBhZ2UvcHJvZHVjdEhvbWUvMCwyMTIxLEFETTEwMjUsMDAuaHRtbAorICoKKyAqIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIEFETTEwMjVBLCB3aGljaCBkaWZmZXJzIGZyb20gdGhlIEFETTEwMjUKKyAqIG9ubHkgaW4gdGhhdCBpdCBoYXMgIm9wZW4tZHJhaW4gVklEIGlucHV0cyB3aGlsZSB0aGUgQURNMTAyNSBoYXMKKyAqIG9uLWNoaXAgMTAwayBwdWxsLXVwcyBvbiB0aGUgVklEIGlucHV0cyIuIEl0IGRvZXNuJ3QgbWFrZSBhbnkKKyAqIGRpZmZlcmVuY2UgZm9yIHVzLgorICoKKyAqIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIE5FMTYxOSwgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IFBoaWxpcHMuCisgKiBUaGF0IGNoaXAgaXMgc2ltaWxhciB0byB0aGUgQURNMTAyNUEsIHdpdGggYSBmZXcgZGlmZmVyZW5jZXMuIFRoZSBvbmx5CisgKiBkaWZmZXJlbmNlIHRoYXQgbWF0dGVycyB0byB1cyBpcyB0aGF0IHRoZSBORTE2MTkgaGFzIG9ubHkgdHdvIHBvc3NpYmxlCisgKiBhZGRyZXNzZXMgd2hpbGUgdGhlIEFETTEwMjVBIGhhcyBhIHRoaXJkIG9uZS4gQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZQorICogb2J0YWluZWQgZnJvbSBQaGlsaXBzJ3Mgd2Vic2l0ZSBhdDoKKyAqICAgaHR0cDovL3d3dy5zZW1pY29uZHVjdG9ycy5waGlsaXBzLmNvbS9waXAvTkUxNjE5RFMuaHRtbAorICoKKyAqIFNpbmNlIHRoZSBBRE0xMDI1IHdhcyB0aGUgZmlyc3QgY2hpcHNldCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsIG1vc3QKKyAqIGNvbW1lbnRzIHdpbGwgcmVmZXIgdG8gdGhpcyBjaGlwc2V0LCBidXQgYXJlIGFjdHVhbGx5IGdlbmVyYWwgYW5kCisgKiBjb25jZXJuIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMsIHVubGVzcyBtZW50aW9uZWQgb3RoZXJ3aXNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXZpZC5oPgorCisvKgorICogQWRkcmVzc2VzIHRvIHNjYW4KKyAqIEFETTEwMjUgYW5kIEFETTEwMjVBIGhhdmUgdGhyZWUgcG9zc2libGUgYWRkcmVzc2VzOiAweDJjLCAweDJkIGFuZCAweDJlLgorICogTkUxNjE5IGhhcyB0d28gcG9zc2libGUgYWRkcmVzc2VzOiAweDJjIGFuZCAweDJkLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIDB4MmUsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qCisgKiBJbnNtb2QgcGFyYW1ldGVycworICovCisKK1NFTlNPUlNfSU5TTU9EXzIoYWRtMTAyNSwgbmUxNjE5KTsKKworLyoKKyAqIFRoZSBBRE0xMDI1IHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgQURNMTAyNV9SRUdfTUFOX0lECQkweDNFCisjZGVmaW5lIEFETTEwMjVfUkVHX0NISVBfSUQgCQkweDNGCisjZGVmaW5lIEFETTEwMjVfUkVHX0NPTkZJRwkJMHg0MAorI2RlZmluZSBBRE0xMDI1X1JFR19TVEFUVVMxCQkweDQxCisjZGVmaW5lIEFETTEwMjVfUkVHX1NUQVRVUzIJCTB4NDIKKyNkZWZpbmUgQURNMTAyNV9SRUdfSU4obnIpCQkoMHgyMCArIChucikpCisjZGVmaW5lIEFETTEwMjVfUkVHX0lOX01BWChucikJCSgweDJCICsgKG5yKSAqIDIpCisjZGVmaW5lIEFETTEwMjVfUkVHX0lOX01JTihucikJCSgweDJDICsgKG5yKSAqIDIpCisjZGVmaW5lIEFETTEwMjVfUkVHX1RFTVAobnIpCQkoMHgyNiArIChucikpCisjZGVmaW5lIEFETTEwMjVfUkVHX1RFTVBfSElHSChucikJKDB4MzcgKyAobnIpICogMikKKyNkZWZpbmUgQURNMTAyNV9SRUdfVEVNUF9MT1cobnIpCSgweDM4ICsgKG5yKSAqIDIpCisjZGVmaW5lIEFETTEwMjVfUkVHX1ZJRAkJCTB4NDcKKyNkZWZpbmUgQURNMTAyNV9SRUdfVklENAkJMHg0OQorCisvKgorICogQ29udmVyc2lvbnMgYW5kIHZhcmlvdXMgbWFjcm9zCisgKiBUaGUgQURNMTAyNSB1c2VzIHNpZ25lZCA4LWJpdCB2YWx1ZXMgZm9yIHRlbXBlcmF0dXJlcy4KKyAqLworCitzdGF0aWMgaW50IGluX3NjYWxlWzZdID0geyAyNTAwLCAyMjUwLCAzMzAwLCA1MDAwLCAxMjAwMCwgMzMwMCB9OworCisjZGVmaW5lIElOX0ZST01fUkVHKHJlZyxzY2FsZSkJKCgocmVnKSAqIChzY2FsZSkgKyA5NikgLyAxOTIpCisjZGVmaW5lIElOX1RPX1JFRyh2YWwsc2NhbGUpCSgodmFsKSA8PSAwID8gMCA6IFwKKwkJCQkgKHZhbCkgKiAxOTIgPj0gKHNjYWxlKSAqIDI1NSA/IDI1NSA6IFwKKwkJCQkgKCh2YWwpICogMTkyICsgKHNjYWxlKS8yKSAvIChzY2FsZSkpCisKKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyhyZWcpCSgocmVnKSAqIDEwMDApCisjZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkJKCh2YWwpIDw9IC0xMjc1MDAgPyAtMTI4IDogXAorCQkJCSAodmFsKSA+PSAxMjY1MDAgPyAxMjcgOiBcCisJCQkJICgoKHZhbCkgPCAwID8gKHZhbCktNTAwIDogKHZhbCkrNTAwKSAvIDEwMDApKQorCisvKgorICogRnVuY3Rpb25zIGRlY2xhcmF0aW9uCisgKi8KKworc3RhdGljIGludCBhZG0xMDI1X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGFkbTEwMjVfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGFkbTEwMjVfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGFkbTEwMjVfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBzdHJ1Y3QgYWRtMTAyNV9kYXRhICphZG0xMDI1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyoKKyAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCisgKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkbTEwMjVfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiYWRtMTAyNSIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9BRE0xMDI1LAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGFkbTEwMjVfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBhZG0xMDI1X2RldGFjaF9jbGllbnQsCit9OworCisvKgorICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKKyAqLworCitzdHJ1Y3QgYWRtMTAyNV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KKworCXU4IGluWzZdOwkJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9tYXhbNl07CQkvKiByZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21pbls2XTsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcFsyXTsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9taW5bMl07CQkvKiByZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfbWF4WzJdOwkJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgYWxhcm1zOwkJLyogcmVnaXN0ZXIgdmFsdWVzLCBjb21iaW5lZCAqLworCXU4IHZpZDsJCQkvKiByZWdpc3RlciB2YWx1ZXMsIGNvbWJpbmVkICovCisJdTggdnJtOworfTsKKworLyoKKyAqIFN5c2ZzIHN0dWZmCisgKi8KKworI2RlZmluZSBzaG93X2luKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bb2Zmc2V0XSwgXAorCQkgICAgICAgaW5fc2NhbGVbb2Zmc2V0XSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGFkbTEwMjVfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltvZmZzZXRdLCBcCisJCSAgICAgICBpbl9zY2FsZVtvZmZzZXRdKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W29mZnNldF0sIFwKKwkJICAgICAgIGluX3NjYWxlW29mZnNldF0pKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2luIyNvZmZzZXQsIE5VTEwpOworc2hvd19pbigwKTsKK3Nob3dfaW4oMSk7CitzaG93X2luKDIpOworc2hvd19pbigzKTsKK3Nob3dfaW4oNCk7CitzaG93X2luKDUpOworCisjZGVmaW5lIHNob3dfdGVtcChvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wW29mZnNldC0xXSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21pbltvZmZzZXQtMV0pKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGFkbTEwMjVfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhbb2Zmc2V0LTFdKSk7IFwKK31cCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCMjb2Zmc2V0LCBOVUxMKTsKK3Nob3dfdGVtcCgxKTsKK3Nob3dfdGVtcCgyKTsKKworI2RlZmluZSBzZXRfaW4ob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT5pbl9taW5bb2Zmc2V0XSA9IElOX1RPX1JFRyh2YWwsIGluX3NjYWxlW29mZnNldF0pOyBcCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX0lOX01JTihvZmZzZXQpLCBcCisJCQkJICBkYXRhLT5pbl9taW5bb2Zmc2V0XSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPmluX21heFtvZmZzZXRdID0gSU5fVE9fUkVHKHZhbCwgaW5fc2NhbGVbb2Zmc2V0XSk7IFwKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyNV9SRUdfSU5fTUFYKG9mZnNldCksIFwKKwkJCQkgIGRhdGEtPmluX21heFtvZmZzZXRdKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd19pbiMjb2Zmc2V0IyNfbWluLCBzZXRfaW4jI29mZnNldCMjX21pbik7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfaW4jI29mZnNldCMjX21heCwgc2V0X2luIyNvZmZzZXQjI19tYXgpOworc2V0X2luKDApOworc2V0X2luKDEpOworc2V0X2luKDIpOworc2V0X2luKDMpOworc2V0X2luKDQpOworc2V0X2luKDUpOworCisjZGVmaW5lIHNldF90ZW1wKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT50ZW1wX21pbltvZmZzZXQtMV0gPSBURU1QX1RPX1JFRyh2YWwpOyBcCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX1RFTVBfTE9XKG9mZnNldC0xKSwgXAorCQkJCSAgZGF0YS0+dGVtcF9taW5bb2Zmc2V0LTFdKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT50ZW1wX21heFtvZmZzZXQtMV0gPSBURU1QX1RPX1JFRyh2YWwpOyBcCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX1RFTVBfSElHSChvZmZzZXQtMSksIFwKKwkJCQkgIGRhdGEtPnRlbXBfbWF4W29mZnNldC0xXSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd190ZW1wIyNvZmZzZXQjI19taW4sIHNldF90ZW1wIyNvZmZzZXQjI19taW4pOyBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfdGVtcCMjb2Zmc2V0IyNfbWF4LCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWF4KTsKK3NldF90ZW1wKDEpOworc2V0X3RlbXAoMik7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+YWxhcm1zKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd192aWQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGFkbTEwMjVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihpbjFfcmVmLCBTX0lSVUdPLCBzaG93X3ZpZCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+dnJtKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF92cm0oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlkYXRhLT52cm0gPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIodnJtLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192cm0sIHNldF92cm0pOworCisvKgorICogUmVhbCBjb2RlCisgKi8KKworc3RhdGljIGludCBhZG0xMDI1X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGFkbTEwMjVfZGV0ZWN0KTsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gZG9lcyBtb3JlIHRoYW4ganVzdCBkZXRlY3Rpb24uIElmIGRldGVjdGlvbgorICogc3VjY2VlZHMsIGl0IGFsc28gcmVnaXN0ZXJzIHRoZSBuZXcgY2hpcC4KKyAqLworc3RhdGljIGludCBhZG0xMDI1X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKKwl1OCBjb25maWc7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRtMTAyNV9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYWRtMTAyNV9kYXRhKSk7CisKKwkvKiBUaGUgY29tbW9uIEkyQyBjbGllbnQgZGF0YSBpcyBwbGFjZWQgcmlnaHQgYmVmb3JlIHRoZQorCSAgIEFETTEwMjUtc3BlY2lmaWMgZGF0YS4gKi8KKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmFkbTEwMjVfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qCisJICogTm93IHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiBBIG5lZ2F0aXZlIGtpbmQgbWVhbnMgdGhhdAorCSAqIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIG5vIGZvcmNlIHBhcmFtZXRlciAoZGVmYXVsdCksIHNvIHdlCisJICogbXVzdCBib3RoIGRldGVjdCBhbmQgaWRlbnRpZnkgdGhlIGNoaXAuIEEgemVybyBraW5kIG1lYW5zIHRoYXQKKwkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyLCB0aGUgZGV0ZWN0aW9uCisJICogc3RlcCBzaGFsbCBiZSBza2lwcGVkLiBBIHBvc2l0aXZlIGtpbmQgbWVhbnMgdGhhdCB0aGUgZHJpdmVyCisJICogd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIgYW5kIGEgZ2l2ZW4ga2luZCBvZiBjaGlwIGlzCisJICogcmVxdWVzdGVkLCBzbyBib3RoIHRoZSBkZXRlY3Rpb24gYW5kIHRoZSBpZGVudGlmaWNhdGlvbiBzdGVwcworCSAqIGFyZSBza2lwcGVkLgorCSAqLworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBBRE0xMDI1X1JFR19DT05GSUcpOworCWlmIChraW5kIDwgMCkgeyAvKiBkZXRlY3Rpb24gKi8KKwkJaWYgKChjb25maWcgJiAweDgwKSAhPSAweDAwCisJCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCSAgICAgQURNMTAyNV9SRUdfU1RBVFVTMSkgJiAweEMwKSAhPSAweDAwCisJCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCSAgICAgQURNMTAyNV9SRUdfU1RBVFVTMikgJiAweEJDKSAhPSAweDAwKSB7CisJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkJIkFETTEwMjUgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnguXG4iLAorCQkJCWFkZHJlc3MpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwl9CisKKwlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uICovCisJCXU4IG1hbl9pZCwgY2hpcF9pZDsKKworCQltYW5faWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCSBBRE0xMDI1X1JFR19NQU5fSUQpOworCQljaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkgIEFETTEwMjVfUkVHX0NISVBfSUQpOworCQkKKwkJaWYgKG1hbl9pZCA9PSAweDQxKSB7IC8qIEFuYWxvZyBEZXZpY2VzICovCisJCQlpZiAoKGNoaXBfaWQgJiAweEYwKSA9PSAweDIwKSB7IC8qIEFETTEwMjUvQURNMTAyNUEgKi8KKwkJCQlraW5kID0gYWRtMTAyNTsKKwkJCX0KKwkJfSBlbHNlCisJCWlmIChtYW5faWQgPT0gMHhBMSkgeyAvKiBQaGlsaXBzICovCisJCQlpZiAoYWRkcmVzcyAhPSAweDJFCisJCQkgJiYgKGNoaXBfaWQgJiAweEYwKSA9PSAweDIwKSB7IC8qIE5FMTYxOSAqLworCQkJCWtpbmQgPSBuZTE2MTk7CisJCQl9CisJCX0KKworCQlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uIGZhaWxlZCAqLworCQkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKKwkJCSAgICAiVW5zdXBwb3J0ZWQgY2hpcCAobWFuX2lkPTB4JTAyWCwgIgorCQkJICAgICJjaGlwX2lkPTB4JTAyWCkuXG4iLCBtYW5faWQsIGNoaXBfaWQpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwl9CisKKwlpZiAoa2luZCA9PSBhZG0xMDI1KSB7CisJCW5hbWUgPSAiYWRtMTAyNSI7CisJfSBlbHNlIGlmIChraW5kID09IG5lMTYxOSkgeworCQluYW1lID0gIm5lMTYxOSI7CisJfQorCisJLyogV2UgY2FuIGZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCS8qIEluaXRpYWxpemUgdGhlIEFETTEwMjUgY2hpcCAqLworCWFkbTEwMjVfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX3JlZik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl92cm0pOworCisJLyogUGluIDExIGlzIGVpdGhlciBpbjQgKCsxMlYpIG9yIFZJRDQgKi8KKwlpZiAoIShjb25maWcgJiAweDIwKSkgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7CisJfQorCisJcmV0dXJuIDA7CisKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYWRtMTAyNV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXU4IHJlZzsKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisKKwkvKgorCSAqIFNldCBoaWdoIGxpbWl0cworCSAqIFVzdWFsbHkgd2UgYXZvaWQgc2V0dGluZyBsaW1pdHMgb24gZHJpdmVyIGluaXQsIGJ1dCBpdCBoYXBwZW5zCisJICogdGhhdCB0aGUgQURNMTAyNSBjb21lcyB3aXRoIHN0dXBpZCBkZWZhdWx0IGxpbWl0cyAoYWxsIHJlZ2lzdGVycworCSAqIHNldCB0byAwKS4gSW4gY2FzZSB0aGUgY2hpcCBoYXMgbm90IGdvbmUgdGhyb3VnaCBhbnkgbGltaXQKKwkgKiBzZXR0aW5nIHlldCwgd2UgYmV0dGVyIHNldCB0aGUgaGlnaCBsaW1pdHMgdG8gdGhlIG1heCBzbyB0aGF0CisJICogbm8gYWxhcm0gdHJpZ2dlcnMuCisJICovCisJZm9yIChpPTA7IGk8NjsgaSsrKSB7CisJCXJlZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCSAgICAgICBBRE0xMDI1X1JFR19JTl9NQVgoaSkpOworCQlpZiAocmVnID09IDApCisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgQURNMTAyNV9SRUdfSU5fTUFYKGkpLAorCQkJCQkJICAweEZGKTsKKwl9CisJZm9yIChpPTA7IGk8MjsgaSsrKSB7CisJCXJlZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCSAgICAgICBBRE0xMDI1X1JFR19URU1QX0hJR0goaSkpOworCQlpZiAocmVnID09IDApCisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgQURNMTAyNV9SRUdfVEVNUF9ISUdIKGkpLAorCQkJCQkJICAweDdGKTsKKwl9CisKKwkvKgorCSAqIFN0YXJ0IHRoZSBjb252ZXJzaW9ucworCSAqLworCXJlZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX0NPTkZJRyk7CisJaWYgKCEocmVnICYgMHgwMSkpCisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI1X1JFR19DT05GSUcsCisJCQkJCSAgKHJlZyYweDdFKXwweDAxKTsKK30KKworc3RhdGljIGludCBhZG0xMDI1X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFkbTEwMjVfZGF0YSAqYWRtMTAyNV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICogMikgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWludCBpOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgZGF0YS5cbiIpOworCQlmb3IgKGk9MDsgaTw2OyBpKyspIHsKKwkJCWRhdGEtPmluW2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgICAgICBBRE0xMDI1X1JFR19JTihpKSk7CisJCQlkYXRhLT5pbl9taW5baV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgIEFETTEwMjVfUkVHX0lOX01JTihpKSk7CisJCQlkYXRhLT5pbl9tYXhbaV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgIEFETTEwMjVfUkVHX0lOX01BWChpKSk7CisJCX0KKwkJZm9yIChpPTA7IGk8MjsgaSsrKSB7CisJCQlkYXRhLT50ZW1wW2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJQURNMTAyNV9SRUdfVEVNUChpKSk7CisJCQlkYXRhLT50ZW1wX21pbltpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCSAgICBBRE0xMDI1X1JFR19URU1QX0xPVyhpKSk7CisJCQlkYXRhLT50ZW1wX21heFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCSAgICBBRE0xMDI1X1JFR19URU1QX0hJR0goaSkpOworCQl9CisJCWRhdGEtPmFsYXJtcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkgICAgICAgQURNMTAyNV9SRUdfU1RBVFVTMSkKKwkJCSAgICAgfCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQlBRE0xMDI1X1JFR19TVEFUVVMyKSA8PCA4KTsKKwkJZGF0YS0+dmlkID0gKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkgICAgIEFETTEwMjVfUkVHX1ZJRCkgJiAweDBmKQorCQkJICB8ICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCSAgICAgIEFETTEwMjVfUkVHX1ZJRDQpICYgMHgwMSkgPDwgNCk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19hZG0xMDI1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkbTEwMjVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfYWRtMTAyNV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkbTEwMjVfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFETTEwMjUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfYWRtMTAyNV9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfYWRtMTAyNV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjYuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWUyZjRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyNi5jCkBAIC0wLDAgKzEsMTc1NCBAQAorLyoKKyAgICBhZG0xMDI2LmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorCSAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUGhpbGlwIFBva29ybnkgPHBwb2tvcm55QHBlbmd1aW5jb21wdXRpbmcuY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNCBKdXN0aW4gVGhpZXNzZW4gPGp0aGllc3NlbkBwZW5ndWluY29tcHV0aW5nLmNvbT4KKworICAgIENoaXAgZGV0YWlscyBhdDoKKworICAgIDxodHRwOi8vd3d3LmFuYWxvZy5jb20vVXBsb2FkZWRGaWxlcy9EYXRhX1NoZWV0cy83NzkyNjMxMDJBRE0xMDI2X2EucGRmPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIDB4MmUsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8xKGFkbTEwMjYpOworCitzdGF0aWMgaW50IGdwaW9faW5wdXRbMTddICA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsgCitzdGF0aWMgaW50IGdwaW9fb3V0cHV0WzE3XSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKK3N0YXRpYyBpbnQgZ3Bpb19pbnZlcnRlZFsxN10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07CitzdGF0aWMgaW50IGdwaW9fbm9ybWFsWzE3XSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKK3N0YXRpYyBpbnQgZ3Bpb19mYW5bOF0gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9OworbW9kdWxlX3BhcmFtX2FycmF5KGdwaW9faW5wdXQsaW50LE5VTEwsMCk7CitNT0RVTEVfUEFSTV9ERVNDKGdwaW9faW5wdXQsIkxpc3Qgb2YgR1BJTyBwaW5zICgwLTE2KSB0byBwcm9ncmFtIGFzIGlucHV0cyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGdwaW9fb3V0cHV0LGludCxOVUxMLDApOworTU9EVUxFX1BBUk1fREVTQyhncGlvX291dHB1dCwiTGlzdCBvZiBHUElPIHBpbnMgKDAtMTYpIHRvIHByb2dyYW0gYXMgIgorCSJvdXRwdXRzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZ3Bpb19pbnZlcnRlZCxpbnQsTlVMTCwwKTsKK01PRFVMRV9QQVJNX0RFU0MoZ3Bpb19pbnZlcnRlZCwiTGlzdCBvZiBHUElPIHBpbnMgKDAtMTYpIHRvIHByb2dyYW0gYXMgIgorCSJpbnZlcnRlZCIpOworbW9kdWxlX3BhcmFtX2FycmF5KGdwaW9fbm9ybWFsLGludCxOVUxMLDApOworTU9EVUxFX1BBUk1fREVTQyhncGlvX25vcm1hbCwiTGlzdCBvZiBHUElPIHBpbnMgKDAtMTYpIHRvIHByb2dyYW0gYXMgIgorCSJub3JtYWwvbm9uLWludmVydGVkIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZ3Bpb19mYW4saW50LE5VTEwsMCk7CitNT0RVTEVfUEFSTV9ERVNDKGdwaW9fZmFuLCJMaXN0IG9mIEdQSU8gcGlucyAoMC03KSB0byBwcm9ncmFtIGFzIGZhbiB0YWNocyIpOworCisvKiBNYW55IEFETTEwMjYgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLworCisvKiBUaGUgQURNMTAyNiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQURNMTAyNl9SRUdfQ09ORklHMSAgMHgwMAorI2RlZmluZSBDRkcxX01PTklUT1IgICAgIDB4MDEKKyNkZWZpbmUgQ0ZHMV9JTlRfRU5BQkxFICAweDAyCisjZGVmaW5lIENGRzFfSU5UX0NMRUFSICAgMHgwNAorI2RlZmluZSBDRkcxX0FJTjhfOSAgICAgIDB4MDgKKyNkZWZpbmUgQ0ZHMV9USEVSTV9IT1QgICAweDEwCisjZGVmaW5lIENGRzFfREFDX0FGQyAgICAgMHgyMAorI2RlZmluZSBDRkcxX1BXTV9BRkMgICAgIDB4NDAKKyNkZWZpbmUgQ0ZHMV9SRVNFVCAgICAgICAweDgwCisjZGVmaW5lIEFETTEwMjZfUkVHX0NPTkZJRzIgIDB4MDEKKy8qIENPTkZJRzIgY29udHJvbHMgRkFOMC9HUElPMCB0aHJvdWdoIEZBTjcvR1BJTzcgKi8KKyNkZWZpbmUgQURNMTAyNl9SRUdfQ09ORklHMyAgMHgwNworI2RlZmluZSBDRkczX0dQSU8xNl9FTkFCTEUgIDB4MDEKKyNkZWZpbmUgQ0ZHM19DSV9DTEVBUiAgMHgwMgorI2RlZmluZSBDRkczX1ZSRUZfMjUwICAweDA0CisjZGVmaW5lIENGRzNfR1BJTzE2X0RJUiAgMHg0MAorI2RlZmluZSBDRkczX0dQSU8xNl9QT0wgIDB4ODAKKyNkZWZpbmUgQURNMTAyNl9SRUdfRTJDT05GSUcgIDB4MTMKKyNkZWZpbmUgRTJDRkdfUkVBRCAgMHgwMQorI2RlZmluZSBFMkNGR19XUklURSAgMHgwMgorI2RlZmluZSBFMkNGR19FUkFTRSAgMHgwNAorI2RlZmluZSBFMkNGR19ST00gIDB4MDgKKyNkZWZpbmUgRTJDRkdfQ0xLX0VYVCAgMHg4MAorCisvKiBUaGVyZSBhcmUgMTAgZ2VuZXJhbCBhbmFsb2cgaW5wdXRzIGFuZCA3IGRlZGljYXRlZCBpbnB1dHMKKyAqIFRoZXkgYXJlOgorICogICAgMCAtIDkgID0gIEFJTjAgLSBBSU45CisgKiAgICAgICAxMCAgPSAgVmJhdAorICogICAgICAgMTEgID0gIDMuM1YgU3RhbmRieQorICogICAgICAgMTIgID0gIDMuM1YgTWFpbgorICogICAgICAgMTMgID0gICs1VgorICogICAgICAgMTQgID0gIFZjY3AgKENQVSBjb3JlIHZvbHRhZ2UpCisgKiAgICAgICAxNSAgPSAgKzEyVgorICogICAgICAgMTYgID0gIC0xMlYKKyAqLworc3RhdGljIHUxNiBBRE0xMDI2X1JFR19JTltdID0geworCQkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LAorCQkweDM2LCAweDM3LCAweDI3LCAweDI5LCAweDI2LCAweDJhLAorCQkweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmCisJfTsKK3N0YXRpYyB1MTYgQURNMTAyNl9SRUdfSU5fTUlOW10gPSB7CisJCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsCisJCTB4NWUsIDB4NWYsIDB4NmQsIDB4NDksIDB4NmIsIDB4NGEsCisJCTB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYKKwl9Oworc3RhdGljIHUxNiBBRE0xMDI2X1JFR19JTl9NQVhbXSA9IHsKKwkJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwKKwkJMHg1NiwgMHg1NywgMHg2YywgMHg0MSwgMHg2YSwgMHg0MiwKKwkJMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NworCX07CisKKy8qIFRlbXBlcmF0dXJlcyBhcmU6CisgKiAgICAwIC0gSW50ZXJuYWwKKyAqICAgIDEgLSBFeHRlcm5hbCAxCisgKiAgICAyIC0gRXh0ZXJuYWwgMgorICovCitzdGF0aWMgdTE2IEFETTEwMjZfUkVHX1RFTVBbXSA9IHsgMHgxZiwgMHgyOCwgMHgyOSB9Oworc3RhdGljIHUxNiBBRE0xMDI2X1JFR19URU1QX01JTltdID0geyAweDY5LCAweDQ4LCAweDQ5IH07CitzdGF0aWMgdTE2IEFETTEwMjZfUkVHX1RFTVBfTUFYW10gPSB7IDB4NjgsIDB4NDAsIDB4NDEgfTsKK3N0YXRpYyB1MTYgQURNMTAyNl9SRUdfVEVNUF9UTUlOW10gPSB7IDB4MTAsIDB4MTEsIDB4MTIgfTsKK3N0YXRpYyB1MTYgQURNMTAyNl9SRUdfVEVNUF9USEVSTVtdID0geyAweDBkLCAweDBlLCAweDBmIH07CitzdGF0aWMgdTE2IEFETTEwMjZfUkVHX1RFTVBfT0ZGU0VUW10gPSB7IDB4MWUsIDB4NmUsIDB4NmYgfTsKKworI2RlZmluZSBBRE0xMDI2X1JFR19GQU4obnIpICgweDM4ICsgKG5yKSkKKyNkZWZpbmUgQURNMTAyNl9SRUdfRkFOX01JTihucikgKDB4NjAgKyAobnIpKQorI2RlZmluZSBBRE0xMDI2X1JFR19GQU5fRElWXzBfMyAweDAyCisjZGVmaW5lIEFETTEwMjZfUkVHX0ZBTl9ESVZfNF83IDB4MDMKKworI2RlZmluZSBBRE0xMDI2X1JFR19EQUMgIDB4MDQKKyNkZWZpbmUgQURNMTAyNl9SRUdfUFdNICAweDA1CisKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19DRkdfMF8zIDB4MDgKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19DRkdfNF83IDB4MDkKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19DRkdfOF8xMSAweDBhCisjZGVmaW5lIEFETTEwMjZfUkVHX0dQSU9fQ0ZHXzEyXzE1IDB4MGIKKy8qIENGR18xNiBpbiBSRUdfQ0ZHMyAqLworI2RlZmluZSBBRE0xMDI2X1JFR19HUElPX1NUQVRVU18wXzcgMHgyNAorI2RlZmluZSBBRE0xMDI2X1JFR19HUElPX1NUQVRVU184XzE1IDB4MjUKKy8qIFNUQVRVU18xNiBpbiBSRUdfU1RBVFVTNCAqLworI2RlZmluZSBBRE0xMDI2X1JFR19HUElPX01BU0tfMF83IDB4MWMKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19NQVNLXzhfMTUgMHgxZAorLyogTUFTS18xNiBpbiBSRUdfTUFTSzQgKi8KKworI2RlZmluZSBBRE0xMDI2X1JFR19DT01QQU5ZIDB4MTYKKyNkZWZpbmUgQURNMTAyNl9SRUdfVkVSU1RFUCAweDE3CisvKiBUaGVzZSBhcmUgdGhlIHJlY29nbml6ZWQgdmFsdWVzIGZvciB0aGUgYWJvdmUgcmVncyAqLworI2RlZmluZSBBRE0xMDI2X0NPTVBBTllfQU5BTE9HX0RFViAweDQxCisjZGVmaW5lIEFETTEwMjZfVkVSU1RFUF9HRU5FUklDIDB4NDAKKyNkZWZpbmUgQURNMTAyNl9WRVJTVEVQX0FETTEwMjYgMHg0NAorCisjZGVmaW5lIEFETTEwMjZfUkVHX01BU0sxIDB4MTgKKyNkZWZpbmUgQURNMTAyNl9SRUdfTUFTSzIgMHgxOQorI2RlZmluZSBBRE0xMDI2X1JFR19NQVNLMyAweDFhCisjZGVmaW5lIEFETTEwMjZfUkVHX01BU0s0IDB4MWIKKworI2RlZmluZSBBRE0xMDI2X1JFR19TVEFUVVMxIDB4MjAKKyNkZWZpbmUgQURNMTAyNl9SRUdfU1RBVFVTMiAweDIxCisjZGVmaW5lIEFETTEwMjZfUkVHX1NUQVRVUzMgMHgyMgorI2RlZmluZSBBRE0xMDI2X1JFR19TVEFUVVM0IDB4MjMKKworI2RlZmluZSBBRE0xMDI2X0ZBTl9BQ1RJVkFUSU9OX1RFTVBfSFlTVCAtNgorI2RlZmluZSBBRE0xMDI2X0ZBTl9DT05UUk9MX1RFTVBfUkFOR0UgMjAKKyNkZWZpbmUgQURNMTAyNl9QV01fTUFYIDI1NQorCisvKiBDb252ZXJzaW9ucy4gUm91bmRpbmcgYW5kIGxpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHIAorICogdmFyaWFudHMuIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGJlIGEgYml0IGNhcmVmdWwgd2l0aCB3aGljaCBhcmd1bWVudHMKKyAqIHRoZXNlIG1hY3JvcyBhcmUgY2FsbGVkOiBhcmd1bWVudHMgbWF5IGJlIGV2YWx1YXRlZCBtb3JlIHRoYW4gb25jZS4KKyAqLworCisvKiBJTiBhcmUgc2NhbGVkIGFjb3JkaW5nIHRvIGJ1aWx0LWluIHJlc2lzdG9ycy4gIFRoZXNlIGFyZSB0aGUKKyAqICAgdm9sdGFnZXMgY29ycmVzcG9uZGluZyB0byAzLzQgb2YgZnVsbCBzY2FsZSAoMTkyIG9yIDB4YzApCisgKiAgIE5PVEU6IFRoZSAtMTJWIGlucHV0IG5lZWRzIGFuIGFkZGl0aW9uYWwgZmFjdG9yIHRvIGFjY291bnQKKyAqICAgICAgZm9yIHRoZSBWcmVmIHB1bGx1cCByZXNpc3Rvci4KKyAqICAgICAgTkVHMTJfT0ZGU0VUID0gU0NBTEUgKiBWcmVmIC8gVi0xOTIgLSBWcmVmCisgKiAgICAgICAgICAgICAgICAgICA9IDEzODc1ICogMi41MCAvIDEuODc1IC0gMjUwMAorICogICAgICAgICAgICAgICAgICAgPSAxNjAwMAorICoKKyAqIFRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYmFzZWQgb24gVGFibGUgSUksIHBhZ2UgMTUgb2YgdGhlCisgKiAgICBkYXRhc2hlZXQuCisgKi8KK3N0YXRpYyBpbnQgYWRtMTAyNl9zY2FsaW5nW10gPSB7ICAvKiAuMDAxIFZvbHRzICovCisJCTIyNTAsIDIyNTAsIDIyNTAsIDIyNTAsIDIyNTAsIDIyNTAsIAorCQkxODc1LCAxODc1LCAxODc1LCAxODc1LCAzMDAwLCAzMzMwLCAKKwkJMzMzMCwgNDk5NSwgMjI1MCwgMTIwMDAsIDEzODc1CisJfTsKKyNkZWZpbmUgTkVHMTJfT0ZGU0VUICAxNjAwMAorI2RlZmluZSBTQ0FMRSh2YWwsZnJvbSx0bykgKCgodmFsKSoodG8pICsgKChmcm9tKS8yKSkvKGZyb20pKQorI2RlZmluZSBJTlNfVE9fUkVHKG4sdmFsKSAgKFNFTlNPUlNfTElNSVQoU0NBTEUodmFsLGFkbTEwMjZfc2NhbGluZ1tuXSwxOTIpLFwKKwkwLDI1NSkpCisjZGVmaW5lIElOU19GUk9NX1JFRyhuLHZhbCkgKFNDQUxFKHZhbCwxOTIsYWRtMTAyNl9zY2FsaW5nW25dKSkKKworLyogRkFOIHNwZWVkIGlzIG1lYXN1cmVkIHVzaW5nIDIyLjVrSHogY2xvY2sgYW5kIGNvdW50cyBmb3IgMiBwdWxzZXMKKyAqICAgYW5kIHdlIGFzc3VtZSBhIDIgcHVsc2UtcGVyLXJldiBmYW4gdGFjaCBzaWduYWwKKyAqICAgICAgMjI1MDAga0h6ICogNjAgKHNlYy9taW4pICogMiAocHVsc2UpIC8gMiAocHVsc2UvcmV2KSA9PSAxMzUwMDAwCisgKi8KKyNkZWZpbmUgRkFOX1RPX1JFRyh2YWwsZGl2KSAgKCh2YWwpPD0wID8gMHhmZiA6IFNFTlNPUlNfTElNSVQoMTM1MDAwMC8oKHZhbCkqXAorCShkaXYpKSwxLDI1NCkpIAorI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wPy0xOih2YWwpPT0weGZmID8gMCA6IDEzNTAwMDAvKCh2YWwpKlwKKwkoZGl2KSkpCisjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxPDwodmFsKSkKKyNkZWZpbmUgRElWX1RPX1JFRyh2YWwpICgodmFsKT49OCA/IDMgOiAodmFsKT49NCA/IDIgOiAodmFsKT49MiA/IDEgOiAwKQorCisvKiBUZW1wZXJhdHVyZSBpcyByZXBvcnRlZCBpbiAxIGRlZ0MgaW5jcmVtZW50cyAqLworI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgodmFsKSsoKHZhbCk8MCA/IC01MDAgOiA1MDApKS8xMDAwLFwKKwktMTI3LDEyNykpCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKSAoKHZhbCkgKiAxMDAwKQorI2RlZmluZSBPRkZTRVRfVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCh2YWwpKygodmFsKTwwID8gLTUwMCA6IDUwMCkpLzEwMDAsXAorCS0xMjcsMTI3KSkKKyNkZWZpbmUgT0ZGU0VUX0ZST01fUkVHKHZhbCkgKCh2YWwpICogMTAwMCkKKworI2RlZmluZSBQV01fVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQodmFsLDAsMjU1KSkKKyNkZWZpbmUgUFdNX0ZST01fUkVHKHZhbCkgKHZhbCkKKworI2RlZmluZSBQV01fTUlOX1RPX1JFRyh2YWwpICgodmFsKSAmIDB4ZjApCisjZGVmaW5lIFBXTV9NSU5fRlJPTV9SRUcodmFsKSAoKCh2YWwpICYgMHhmMCkgKyAoKHZhbCkgPj4gNCkpCisKKy8qIEFuYWxvZyBvdXRwdXQgaXMgYSB2b2x0YWdlLCBhbmQgc2NhbGVkIHRvIG1pbGxpdm9sdHMuICBUaGUgZGF0YXNoZWV0IAorICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgREFDIGNvdWxkIGJlIHVzZWQgdG8gZHJpdmUgdGhlIGZhbnMsIGJ1dCBpbiBvdXIgCisgKiAgIGV4YW1wbGUgYm9hcmQgKEFyaW1hIEhEQU1BKSBpdCBpc24ndCBjb25uZWN0ZWQgdG8gdGhlIGZhbnMgYXQgYWxsLgorICovCisjZGVmaW5lIERBQ19UT19SRUcodmFsKSAoU0VOU09SU19MSU1JVCgoKCgodmFsKSoyNTUpKzUwMCkvMjUwMCksMCwyNTUpKSAKKyNkZWZpbmUgREFDX0ZST01fUkVHKHZhbCkgKCgodmFsKSoyNTAwKS8yNTUpCisKKy8qIFR5cGljYWxseSB1c2VkIHdpdGggc3lzdGVtcyB1c2luZyBhIHY5LjEgVlJNIHNwZWMgPyAqLworI2RlZmluZSBBRE0xMDI2X0lOSVRfVlJNICA5MQorCisvKiBDaGlwIHNhbXBsaW5nIHJhdGVzCisgKgorICogU29tZSBzZW5zb3JzIGFyZSBub3QgdXBkYXRlZCBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlIHBlciBzZWNvbmQKKyAqICAgIHNvIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZWFkIHRoZW0gbW9yZSBvZnRlbiB0aGFuIHRoYXQuCisgKiAgICBXZSBjYWNoZSB0aGUgcmVzdWx0cyBhbmQgcmV0dXJuIHRoZSBzYXZlZCBkYXRhIGlmIHRoZSBkcml2ZXIKKyAqICAgIGlzIGNhbGxlZCBhZ2FpbiBiZWZvcmUgYSBzZWNvbmQgaGFzIGVsYXBzZWQuCisgKgorICogQWxzbywgdGhlcmUgaXMgc2lnbmlmaWNhbnQgY29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGlzIGNoaXAKKyAqICAgIFNvLCB3ZSBrZWVwIHRoZSBjb25maWcgZGF0YSB1cCB0byBkYXRlIGluIHRoZSBjYWNoZQorICogICAgd2hlbiBpdCBpcyB3cml0dGVuIGFuZCBvbmx5IHNhbXBsZSBpdCBvbmNlIGV2ZXJ5IDUgKm1pbnV0ZXMqCisgKi8KKyNkZWZpbmUgQURNMTAyNl9EQVRBX0lOVEVSVkFMICAoMSAqIEhaKQorI2RlZmluZSBBRE0xMDI2X0NPTkZJR19JTlRFUlZBTCAgKDUgKiA2MCAqIEhaKQorCisvKiBXZSBhbGxvdyBmb3IgbXVsdGlwbGUgY2hpcHMgaW4gYSBzaW5nbGUgc3lzdGVtLgorICoKKyAqIEZvciBlYWNoIHJlZ2lzdGVyZWQgQURNMTAyNiwgd2UgbmVlZCB0byBrZWVwIHN0YXRlIGluZm9ybWF0aW9uCisgKiBhdCBjbGllbnQtPmRhdGEuIFRoZSBhZG0xMDI2X2RhdGEgc3RydWN0dXJlIGlzIGR5bmFtaWNhbGx5CisgKiBhbGxvY2F0ZWQsIHdoZW4gYSBuZXcgY2xpZW50IHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQuICovCisKK3N0cnVjdCBwd21fZGF0YSB7CisJdTggcHdtOworCXU4IGVuYWJsZTsKKwl1OCBhdXRvX3B3bV9taW47Cit9OworCitzdHJ1Y3QgYWRtMTAyNl9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCWVudW0gY2hpcHMgdHlwZTsKKworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJaW50IHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3JlYWRpbmc7CS8qIEluIGppZmZpZXMgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfY29uZmlnOwkvKiBJbiBqaWZmaWVzICovCisKKwl1OCBpblsxN107ICAgICAgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21heFsxN107ICAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluWzE3XTsgICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wWzNdOyAgICAgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfbWluWzNdOyAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9tYXhbM107ICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX3RtaW5bM107ICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfY3JpdFszXTsgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9vZmZzZXRbM107ICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5bOF07ICAgICAgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9taW5bOF07ICAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX2Rpdls4XTsgICAgICAgICAgLyogRGVjb2RlZCB2YWx1ZSAqLworCXN0cnVjdCBwd21fZGF0YSBwd20xOyAgIC8qIFB3bSBjb250cm9sIHZhbHVlcyAqLworCWludCB2aWQ7ICAgICAgICAgICAgICAgIC8qIERlY29kZWQgdmFsdWUgKi8KKwl1OCB2cm07ICAgICAgICAgICAgICAgICAvKiBWUk0gdmVyc2lvbiAqLworCXU4IGFuYWxvZ19vdXQ7CQkvKiBSZWdpc3RlciB2YWx1ZSAoREFDKSAqLworCWxvbmcgYWxhcm1zOyAgICAgICAgICAgIC8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCWxvbmcgYWxhcm1fbWFzazsgICAgICAgIC8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCWxvbmcgZ3BpbzsgICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCWxvbmcgZ3Bpb19tYXNrOyAgICAgICAgIC8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCXU4IGdwaW9fY29uZmlnWzE3XTsgICAgIC8qIERlY29kZWQgdmFsdWUgKi8KKwl1OCBjb25maWcxOyAgICAgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGNvbmZpZzI7ICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggY29uZmlnMzsgICAgICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KK307CisKK3N0YXRpYyBpbnQgYWRtMTAyNl9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBhZG0xMDI2X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAorCWludCBraW5kKTsKK3N0YXRpYyBpbnQgYWRtMTAyNl9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBhZG0xMDI2X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnaXN0ZXIpOworc3RhdGljIGludCBhZG0xMDI2X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZ2lzdGVyLAorCWludCB2YWx1ZSk7IAorc3RhdGljIHZvaWQgYWRtMTAyNl9wcmludF9ncGlvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHZvaWQgYWRtMTAyNl9maXh1cF9ncGlvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOyAKK3N0YXRpYyBzdHJ1Y3QgYWRtMTAyNl9kYXRhICphZG0xMDI2X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFkbTEwMjZfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkbTEwMjZfZHJpdmVyID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5uYW1lICAgICAgICAgICA9ICJhZG0xMDI2IiwKKwkuZmxhZ3MgICAgICAgICAgPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9IGFkbTEwMjZfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQgID0gYWRtMTAyNl9kZXRhY2hfY2xpZW50LAorfTsKKworaW50IGFkbTEwMjZfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRtMTAyNl9kZXRlY3QpOworfQorCitpbnQgYWRtMTAyNl9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCitpbnQgYWRtMTAyNl9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgcmVzOworCisJaWYgKHJlZyA8IDB4ODApIHsKKwkJLyogIlJBTSIgbG9jYXRpb25zICovCisJCXJlcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZykgJiAweGZmOworCX0gZWxzZSB7CisJCS8qIEVFUFJPTSwgZG8gbm90aGluZyAqLworCQlyZXMgPSAwOworCX0KKwlyZXR1cm4gcmVzOworfQorCitpbnQgYWRtMTAyNl93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIGludCB2YWx1ZSkKK3sKKwlpbnQgcmVzOworCisJaWYgKHJlZyA8IDB4ODApIHsKKwkJLyogIlJBTSIgbG9jYXRpb25zICovCisJCXJlcyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKKwl9IGVsc2UgeworCQkvKiBFRVBST00sIGRvIG5vdGhpbmcgKi8KKwkJcmVzID0gMDsKKwl9CisJcmV0dXJuIHJlczsKK30KKwordm9pZCBhZG0xMDI2X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHZhbHVlLCBpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworICAgICAgICBkZXZfZGJnKCZjbGllbnQtPmRldiwgIkluaXRpYWxpemluZyBkZXZpY2VcbiIpOworCS8qIFJlYWQgY2hpcCBjb25maWcgKi8KKwlkYXRhLT5jb25maWcxID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfQ09ORklHMSk7CisJZGF0YS0+Y29uZmlnMiA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0NPTkZJRzIpOworCWRhdGEtPmNvbmZpZzMgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUczKTsKKworCS8qIEluZm9ybSB1c2VyIG9mIGNoaXAgY29uZmlnICovCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJBRE0xMDI2X1JFR19DT05GSUcxIGlzOiAweCUwMnhcbiIsCisJCWRhdGEtPmNvbmZpZzEpOworCWlmICgoZGF0YS0+Y29uZmlnMSAmIENGRzFfTU9OSVRPUikgPT0gMCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIk1vbml0b3Jpbmcgbm90IGN1cnJlbnRseSAiCisJCQkiZW5hYmxlZC5cbiIpOworCX0KKwlpZiAoZGF0YS0+Y29uZmlnMSAmIENGRzFfSU5UX0VOQUJMRSkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlNNQkFMRVJUIGludGVycnVwdHMgYXJlICIKKwkJCSJlbmFibGVkLlxuIik7CisJfQorCWlmIChkYXRhLT5jb25maWcxICYgQ0ZHMV9BSU44XzkpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJpbjggYW5kIGluOSBlbmFibGVkLiAiCisJCQkidGVtcDMgZGlzYWJsZWQuXG4iKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgInRlbXAzIGVuYWJsZWQuICBpbjggYW5kICIKKwkJCSJpbjkgZGlzYWJsZWQuXG4iKTsKKwl9CisJaWYgKGRhdGEtPmNvbmZpZzEgJiBDRkcxX1RIRVJNX0hPVCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkF1dG9tYXRpYyBUSEVSTSwgUFdNLCAiCisJCQkiYW5kIHRlbXAgbGltaXRzIGVuYWJsZWQuXG4iKTsKKwl9CisKKwl2YWx1ZSA9IGRhdGEtPmNvbmZpZzM7CisJaWYgKGRhdGEtPmNvbmZpZzMgJiBDRkczX0dQSU8xNl9FTkFCTEUpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJHUElPMTYgZW5hYmxlZC4gIFRIRVJNIgorCQkJInBpbiBkaXNhYmxlZC5cbiIpOworCX0gZWxzZSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVEhFUk0gcGluIGVuYWJsZWQuICAiCisJCQkiR1BJTzE2IGRpc2FibGVkLlxuIik7CisJfQorCWlmIChkYXRhLT5jb25maWczICYgQ0ZHM19WUkVGXzI1MCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlZyZWYgaXMgMi41MCBWb2x0cy5cbiIpOworCX0gZWxzZSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVnJlZiBpcyAxLjgyIFZvbHRzLlxuIik7CisJfQorCS8qIFJlYWQgYW5kIHBpY2sgYXBhcnQgdGhlIGV4aXN0aW5nIEdQSU8gY29uZmlndXJhdGlvbiAqLworCXZhbHVlID0gMDsKKwlmb3IgKGkgPSAwO2kgPD0gMTU7KytpKSB7CisJCWlmICgoaSAmIDB4MDMpID09IDApIHsKKwkJCXZhbHVlID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJQURNMTAyNl9SRUdfR1BJT19DRkdfMF8zICsgaS80KTsKKwkJfQorCQlkYXRhLT5ncGlvX2NvbmZpZ1tpXSA9IHZhbHVlICYgMHgwMzsKKwkJdmFsdWUgPj49IDI7CisJfQorCWRhdGEtPmdwaW9fY29uZmlnWzE2XSA9IChkYXRhLT5jb25maWczID4+IDYpICYgMHgwMzsKKworCS8qIC4uLiBhbmQgdGhlbiBwcmludCBpdCAqLworCWFkbTEwMjZfcHJpbnRfZ3BpbyhjbGllbnQpOworCisJLyogSWYgdGhlIHVzZXIgYXNrcyB1cyB0byByZXByb2dyYW0gdGhlIEdQSU8gY29uZmlnLCB0aGVuCisJICogZG8gaXQgbm93LgorCSAqLworCWlmIChncGlvX2lucHV0WzBdICE9IC0xIHx8IGdwaW9fb3V0cHV0WzBdICE9IC0xCisJCXx8IGdwaW9faW52ZXJ0ZWRbMF0gIT0gLTEgfHwgZ3Bpb19ub3JtYWxbMF0gIT0gLTEKKwkJfHwgZ3Bpb19mYW5bMF0gIT0gLTEpIHsKKwkJYWRtMTAyNl9maXh1cF9ncGlvKGNsaWVudCk7CisJfQorCisJLyogV0UgSU5URU5USU9OQUxMWSBtYWtlIG5vIGNoYW5nZXMgdG8gdGhlIGxpbWl0cywKKwkgKiAgIG9mZnNldHMsIHB3bXMsIGZhbnMgYW5kIHpvbmVzLiAgSWYgdGhleSB3ZXJlCisJICogICBjb25maWd1cmVkLCB3ZSBkb24ndCB3YW50IHRvIG1lc3Mgd2l0aCB0aGVtLgorCSAqICAgSWYgdGhleSB3ZXJlbid0LCB0aGUgZGVmYXVsdCBpcyAxMDAlIFBXTSwgbm8KKwkgKiAgIGNvbnRyb2wgYW5kIHdpbGwgc3VmZmljZSB1bnRpbCAnc2Vuc29ycyAtcycKKwkgKiAgIGNhbiBiZSBydW4gYnkgdGhlIHVzZXIuICBXZSBETyBzZXQgdGhlIGRlZmF1bHQgCisJICogICB2YWx1ZSBmb3IgcHdtMS5hdXRvX3B3bV9taW4gdG8gaXRzIG1heGltdW0KKwkgKiAgIHNvIHRoYXQgZW5hYmxpbmcgYXV0b21hdGljIHB3bSBmYW4gY29udHJvbAorCSAqICAgd2l0aG91dCBmaXJzdCBzZXR0aW5nIGEgdmFsdWUgZm9yIHB3bTEuYXV0b19wd21fbWluIAorCSAqICAgd2lsbCBub3QgcmVzdWx0IGluIHBvdGVudGlhbGx5IGRhbmdlcm91cyBmYW4gc3BlZWQgZGVjcmVhc2UuCisJICovCisJZGF0YS0+cHdtMS5hdXRvX3B3bV9taW49MjU1OworCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KKwl2YWx1ZSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0NPTkZJRzEpOworCS8qIFNldCBNT05JVE9SLCBjbGVhciBpbnRlcnJ1cHQgYWNrbm93bGVkZ2UgYW5kIHMvdyByZXNldCAqLworCXZhbHVlID0gKHZhbHVlIHwgQ0ZHMV9NT05JVE9SKSAmICh+Q0ZHMV9JTlRfQ0xFQVIgJiB+Q0ZHMV9SRVNFVCk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTZXR0aW5nIENPTkZJRyB0bzogMHglMDJ4XG4iLCB2YWx1ZSk7CisJZGF0YS0+Y29uZmlnMSA9IHZhbHVlOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUcxLCB2YWx1ZSk7CisKKwkvKiBpbml0aWFsaXplIGZhbl9kaXZbXSB0byBoYXJkd2FyZSBkZWZhdWx0cyAqLworCXZhbHVlID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfRkFOX0RJVl8wXzMpIHwKKwkJKGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0ZBTl9ESVZfNF83KSA8PCA4KTsKKwlmb3IgKGkgPSAwO2kgPD0gNzsrK2kpIHsKKwkJZGF0YS0+ZmFuX2RpdltpXSA9IERJVl9GUk9NX1JFRyh2YWx1ZSAmIDB4MDMpOworCQl2YWx1ZSA+Pj0gMjsKKwl9Cit9CisKK3ZvaWQgYWRtMTAyNl9wcmludF9ncGlvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCAgaTsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiR1BJTyBjb25maWcgaXM6Iik7CisJZm9yIChpID0gMDtpIDw9IDc7KytpKSB7CisJCWlmIChkYXRhLT5jb25maWcyICYgKDEgPDwgaSkpIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiXHQlc0dQJXMlZFxuIiwKKwkJCQlkYXRhLT5ncGlvX2NvbmZpZ1tpXSAmIDB4MDIgPyAiIiA6ICIhIiwKKwkJCQlkYXRhLT5ncGlvX2NvbmZpZ1tpXSAmIDB4MDEgPyAiT1VUIiA6ICJJTiIsCisJCQkJaSk7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlx0RkFOJWRcbiIsIGkpOworCQl9CisJfQorCWZvciAoaSA9IDg7aSA8PSAxNTsrK2kpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJcdCVzR1AlcyVkXG4iLAorCQkJZGF0YS0+Z3Bpb19jb25maWdbaV0gJiAweDAyID8gIiIgOiAiISIsCisJCQlkYXRhLT5ncGlvX2NvbmZpZ1tpXSAmIDB4MDEgPyAiT1VUIiA6ICJJTiIsCisJCQlpKTsKKwl9CisJaWYgKGRhdGEtPmNvbmZpZzMgJiBDRkczX0dQSU8xNl9FTkFCTEUpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJcdCVzR1AlczE2XG4iLAorCQkJZGF0YS0+Z3Bpb19jb25maWdbMTZdICYgMHgwMiA/ICIiIDogIiEiLAorCQkJZGF0YS0+Z3Bpb19jb25maWdbMTZdICYgMHgwMSA/ICJPVVQiIDogIklOIik7CisJfSBlbHNlIHsKKwkJLyogR1BJTzE2IGlzIFRIRVJNICAqLworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlx0VEhFUk1cbiIpOworCX0KK30KKwordm9pZCBhZG0xMDI2X2ZpeHVwX2dwaW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50ICBpOworCWludCAgdmFsdWU7CisKKwkvKiBNYWtlIHRoZSBjaGFuZ2VzIHJlcXVlc3RlZC4gKi8KKwkvKiBXZSBtYXkgbmVlZCB0byB1bmxvY2svc3RvcCBtb25pdG9yaW5nIG9yIHNvZnQtcmVzZXQgdGhlCisJICogICAgY2hpcCBiZWZvcmUgd2UgY2FuIG1ha2UgY2hhbmdlcy4gIFRoaXMgaGFzbid0IGJlZW4KKwkgKiAgICB0ZXN0ZWQgbXVjaC4gIEZJWE1FCisJICovCisKKwkvKiBNYWtlIG91dHB1dHMgKi8KKwlmb3IgKGkgPSAwO2kgPD0gMTY7KytpKSB7CisJCWlmIChncGlvX291dHB1dFtpXSA+PSAwICYmIGdwaW9fb3V0cHV0W2ldIDw9IDE2KSB7CisJCQlkYXRhLT5ncGlvX2NvbmZpZ1tncGlvX291dHB1dFtpXV0gfD0gMHgwMTsKKwkJfQorCQkvKiBpZiBHUElPMC03IGlzIG91dHB1dCwgaXQgaXNuJ3QgYSBGQU4gdGFjaCAqLworCQlpZiAoZ3Bpb19vdXRwdXRbaV0gPj0gMCAmJiBncGlvX291dHB1dFtpXSA8PSA3KSB7CisJCQlkYXRhLT5jb25maWcyIHw9IDEgPDwgZ3Bpb19vdXRwdXRbaV07CisJCX0KKwl9CisKKwkvKiBJbnB1dCBvdmVycmlkZXMgb3V0cHV0ICovCisJZm9yIChpID0gMDtpIDw9IDE2OysraSkgeworCQlpZiAoZ3Bpb19pbnB1dFtpXSA+PSAwICYmIGdwaW9faW5wdXRbaV0gPD0gMTYpIHsKKwkJCWRhdGEtPmdwaW9fY29uZmlnW2dwaW9faW5wdXRbaV1dICY9IH4gMHgwMTsKKwkJfQorCQkvKiBpZiBHUElPMC03IGlzIGlucHV0LCBpdCBpc24ndCBhIEZBTiB0YWNoICovCisJCWlmIChncGlvX2lucHV0W2ldID49IDAgJiYgZ3Bpb19pbnB1dFtpXSA8PSA3KSB7CisJCQlkYXRhLT5jb25maWcyIHw9IDEgPDwgZ3Bpb19pbnB1dFtpXTsKKwkJfQorCX0KKworCS8qIEludmVydGVkICAqLworCWZvciAoaSA9IDA7aSA8PSAxNjsrK2kpIHsKKwkJaWYgKGdwaW9faW52ZXJ0ZWRbaV0gPj0gMCAmJiBncGlvX2ludmVydGVkW2ldIDw9IDE2KSB7CisJCQlkYXRhLT5ncGlvX2NvbmZpZ1tncGlvX2ludmVydGVkW2ldXSAmPSB+IDB4MDI7CisJCX0KKwl9CisKKwkvKiBOb3JtYWwgb3ZlcnJpZGVzIGludmVydGVkICAqLworCWZvciAoaSA9IDA7aSA8PSAxNjsrK2kpIHsKKwkJaWYgKGdwaW9fbm9ybWFsW2ldID49IDAgJiYgZ3Bpb19ub3JtYWxbaV0gPD0gMTYpIHsKKwkJCWRhdGEtPmdwaW9fY29uZmlnW2dwaW9fbm9ybWFsW2ldXSB8PSAweDAyOworCQl9CisJfQorCisJLyogRmFuIG92ZXJyaWRlcyBpbnB1dCBhbmQgb3V0cHV0ICovCisJZm9yIChpID0gMDtpIDw9IDc7KytpKSB7CisJCWlmIChncGlvX2ZhbltpXSA+PSAwICYmIGdwaW9fZmFuW2ldIDw9IDcpIHsKKwkJCWRhdGEtPmNvbmZpZzIgJj0gfigxIDw8IGdwaW9fZmFuW2ldKTsKKwkJfQorCX0KKworCS8qIFdyaXRlIG5ldyBjb25maWdzIHRvIHJlZ2lzdGVycyAqLworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUcyLCBkYXRhLT5jb25maWcyKTsKKwlkYXRhLT5jb25maWczID0gKGRhdGEtPmNvbmZpZzMgJiAweDNmKQorCQkJfCAoKGRhdGEtPmdwaW9fY29uZmlnWzE2XSAmIDB4MDMpIDw8IDYpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUczLCBkYXRhLT5jb25maWczKTsKKwlmb3IgKGkgPSAxNSwgdmFsdWUgPSAwO2kgPj0gMDstLWkpIHsKKwkJdmFsdWUgPDw9IDI7CisJCXZhbHVlIHw9IGRhdGEtPmdwaW9fY29uZmlnW2ldICYgMHgwMzsKKwkJaWYgKChpICYgMHgwMykgPT0gMCkgeworCQkJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsCisJCQkJCUFETTEwMjZfUkVHX0dQSU9fQ0ZHXzBfMyArIGkvNCwKKwkJCQkJdmFsdWUpOworCQkJdmFsdWUgPSAwOworCQl9CisJfQorCisJLyogUHJpbnQgdGhlIG5ldyBjb25maWcgKi8KKwlhZG0xMDI2X3ByaW50X2dwaW8oY2xpZW50KTsKK30KKworCitzdGF0aWMgc3RydWN0IGFkbTEwMjZfZGF0YSAqYWRtMTAyNl91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaTsKKwlsb25nIHZhbHVlLCBhbGFybXMsIGdwaW87CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKCFkYXRhLT52YWxpZAorCSAgICB8fCB0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfcmVhZGluZyArIEFETTEwMjZfREFUQV9JTlRFUlZBTCkpIHsKKwkJLyogVGhpbmdzIHRoYXQgY2hhbmdlIHF1aWNrbHkgKi8KKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsIlJlYWRpbmcgc2Vuc29yIHZhbHVlc1xuIik7CisJCWZvciAoaSA9IDA7aSA8PSAxNjsrK2kpIHsKKwkJCWRhdGEtPmluW2ldID0KKwkJCSAgICBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19JTltpXSk7CisJCX0KKworCQlmb3IgKGkgPSAwO2kgPD0gNzsrK2kpIHsKKwkJCWRhdGEtPmZhbltpXSA9CisJCQkgICAgYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfRkFOKGkpKTsKKwkJfQorCisJCWZvciAoaSA9IDA7aSA8PSAyOysraSkgeworCQkJLyogTk9URTogdGVtcFtdIGlzIHM4IGFuZCB3ZSBhc3N1bWUgMidzIGNvbXBsZW1lbnQKKwkJCSAqICAgImNvbnZlcnNpb24iIGluIHRoZSBhc3NpZ25tZW50ICAgKi8KKwkJCWRhdGEtPnRlbXBbaV0gPQorCQkJICAgIGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1RFTVBbaV0pOworCQl9CisKKwkJZGF0YS0+cHdtMS5wd20gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCUFETTEwMjZfUkVHX1BXTSk7CisJCWRhdGEtPmFuYWxvZ19vdXQgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCUFETTEwMjZfUkVHX0RBQyk7CisJCS8qIEdQSU8xNiBpcyBNU2JpdCBvZiBhbGFybXMsIG1vdmUgaXQgdG8gZ3BpbyAqLworCQlhbGFybXMgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19TVEFUVVM0KTsKKwkJZ3BpbyA9IGFsYXJtcyAmIDB4ODAgPyAweDAxMDAgOiAwOyAgLyogR1BJTzE2ICovCisJCWFsYXJtcyAmPSAweDdmOworCQlhbGFybXMgPDw9IDg7CisJCWFsYXJtcyB8PSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19TVEFUVVMzKTsKKwkJYWxhcm1zIDw8PSA4OworCQlhbGFybXMgfD0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfU1RBVFVTMik7CisJCWFsYXJtcyA8PD0gODsKKwkJYWxhcm1zIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1NUQVRVUzEpOworCQlkYXRhLT5hbGFybXMgPSBhbGFybXM7CisKKwkJLyogUmVhZCB0aGUgR1BJTyB2YWx1ZXMgKi8KKwkJZ3BpbyB8PSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCUFETTEwMjZfUkVHX0dQSU9fU1RBVFVTXzhfMTUpOworCQlncGlvIDw8PSA4OworCQlncGlvIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJQURNMTAyNl9SRUdfR1BJT19TVEFUVVNfMF83KTsKKwkJZGF0YS0+Z3BpbyA9IGdwaW87CisKKwkJZGF0YS0+bGFzdF9yZWFkaW5nID0gamlmZmllczsKKwl9OyAgLyogbGFzdF9yZWFkaW5nICovCisKKwlpZiAoIWRhdGEtPnZhbGlkIHx8CisJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF9jb25maWcgKyBBRE0xMDI2X0NPTkZJR19JTlRFUlZBTCkpIHsKKwkJLyogVGhpbmdzIHRoYXQgZG9uJ3QgY2hhbmdlIG9mdGVuICovCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUmVhZGluZyBjb25maWcgdmFsdWVzXG4iKTsKKwkJZm9yIChpID0gMDtpIDw9IDE2OysraSkgeworCQkJZGF0YS0+aW5fbWluW2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQkJQURNMTAyNl9SRUdfSU5fTUlOW2ldKTsKKwkJCWRhdGEtPmluX21heFtpXSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJCUFETTEwMjZfUkVHX0lOX01BWFtpXSk7CisJCX0KKworCQl2YWx1ZSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0ZBTl9ESVZfMF8zKQorCQkJfCAoYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfRkFOX0RJVl80XzcpCisJCQk8PCA4KTsKKwkJZm9yIChpID0gMDtpIDw9IDc7KytpKSB7CisJCQlkYXRhLT5mYW5fbWluW2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQkJQURNMTAyNl9SRUdfRkFOX01JTihpKSk7CisJCQlkYXRhLT5mYW5fZGl2W2ldID0gRElWX0ZST01fUkVHKHZhbHVlICYgMHgwMyk7CisJCQl2YWx1ZSA+Pj0gMjsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPD0gMjsgKytpKSB7CisJCQkvKiBOT1RFOiB0ZW1wX3h4eFtdIGFyZSBzOCBhbmQgd2UgYXNzdW1lIDIncyAKKwkJCSAqICAgIGNvbXBsZW1lbnQgImNvbnZlcnNpb24iIGluIHRoZSBhc3NpZ25tZW50CisJCQkgKi8KKwkJCWRhdGEtPnRlbXBfbWluW2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQkJQURNMTAyNl9SRUdfVEVNUF9NSU5baV0pOworCQkJZGF0YS0+dGVtcF9tYXhbaV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCQlBRE0xMDI2X1JFR19URU1QX01BWFtpXSk7CisJCQlkYXRhLT50ZW1wX3RtaW5baV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCQlBRE0xMDI2X1JFR19URU1QX1RNSU5baV0pOworCQkJZGF0YS0+dGVtcF9jcml0W2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQkJQURNMTAyNl9SRUdfVEVNUF9USEVSTVtpXSk7CisJCQlkYXRhLT50ZW1wX29mZnNldFtpXSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJCUFETTEwMjZfUkVHX1RFTVBfT0ZGU0VUW2ldKTsKKwkJfQorCisJCS8qIFJlYWQgdGhlIFNUQVRVUy9hbGFybSBtYXNrcyAqLworCQlhbGFybXMgID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfTUFTSzQpOworCQlncGlvICAgID0gYWxhcm1zICYgMHg4MCA/IDB4MDEwMCA6IDA7ICAvKiBHUElPMTYgKi8KKwkJYWxhcm1zICA9IChhbGFybXMgJiAweDdmKSA8PCA4OworCQlhbGFybXMgfD0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfTUFTSzMpOworCQlhbGFybXMgPDw9IDg7CisJCWFsYXJtcyB8PSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19NQVNLMik7CisJCWFsYXJtcyA8PD0gODsKKwkJYWxhcm1zIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX01BU0sxKTsKKwkJZGF0YS0+YWxhcm1fbWFzayA9IGFsYXJtczsKKworCQkvKiBSZWFkIHRoZSBHUElPIHZhbHVlcyAqLworCQlncGlvIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJQURNMTAyNl9SRUdfR1BJT19NQVNLXzhfMTUpOworCQlncGlvIDw8PSA4OworCQlncGlvIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0dQSU9fTUFTS18wXzcpOworCQlkYXRhLT5ncGlvX21hc2sgPSBncGlvOworCisJCS8qIFJlYWQgdmFyaW91cyB2YWx1ZXMgZnJvbSBDT05GSUcxICovCisJCWRhdGEtPmNvbmZpZzEgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCUFETTEwMjZfUkVHX0NPTkZJRzEpOworCQlpZiAoZGF0YS0+Y29uZmlnMSAmIENGRzFfUFdNX0FGQykgeworCQkJZGF0YS0+cHdtMS5lbmFibGUgPSAyOworCQkJZGF0YS0+cHdtMS5hdXRvX3B3bV9taW4gPSAKKwkJCQlQV01fTUlOX0ZST01fUkVHKGRhdGEtPnB3bTEucHdtKTsKKwkJfQorCQkvKiBSZWFkIHRoZSBHUElPIGNvbmZpZyAqLworCQlkYXRhLT5jb25maWcyID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQlBRE0xMDI2X1JFR19DT05GSUcyKTsKKwkJZGF0YS0+Y29uZmlnMyA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJQURNMTAyNl9SRUdfQ09ORklHMyk7CisJCWRhdGEtPmdwaW9fY29uZmlnWzE2XSA9IChkYXRhLT5jb25maWczID4+IDYpICYgMHgwMzsKKworCQl2YWx1ZSA9IDA7CisJCWZvciAoaSA9IDA7aSA8PSAxNTsrK2kpIHsKKwkJCWlmICgoaSAmIDB4MDMpID09IDApIHsKKwkJCQl2YWx1ZSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICBBRE0xMDI2X1JFR19HUElPX0NGR18wXzMgKyBpLzQpOworCQkJfQorCQkJZGF0YS0+Z3Bpb19jb25maWdbaV0gPSB2YWx1ZSAmIDB4MDM7CisJCQl2YWx1ZSA+Pj0gMjsKKwkJfQorCisJCWRhdGEtPmxhc3RfY29uZmlnID0gamlmZmllczsKKwl9OyAgLyogbGFzdF9jb25maWcgKi8KKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU2V0dGluZyBWSUQgZnJvbSBHUElPMTEtMTUuXG4iKTsKKwlkYXRhLT52aWQgPSAoZGF0YS0+Z3BpbyA+PiAxMSkgJiAweDFmOworCWRhdGEtPnZhbGlkID0gMTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIElOU19GUk9NX1JFRyhuciwgZGF0YS0+aW5bbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSAKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7IAorCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIElOU19GUk9NX1JFRyhuciwgZGF0YS0+aW5fbWluW25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21pbltucl0gPSBJTlNfVE9fUkVHKG5yLCB2YWwpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19JTl9NSU5bbnJdLCBkYXRhLT5pbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsgCit9CitzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBJTlNfRlJPTV9SRUcobnIsIGRhdGEtPmluX21heFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21heFtucl0gPSBJTlNfVE9fUkVHKG5yLCB2YWwpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19JTl9NQVhbbnJdLCBkYXRhLT5pbl9tYXhbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBpbl9yZWcob2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzaG93X2luIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzaG93X2luKGRldiwgYnVmLCBvZmZzZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsICAgICAgICAgICAgICAgICAgXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzZXRfaW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2hvd19pbl9tYXgoZGV2LCBidWYsIG9mZnNldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsICAgICAgICAgICAgICAgICAgXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19pbiMjb2Zmc2V0LCBOVUxMKTsgICBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsICAgICAgICAgICAgICAgICAgIFwKKwkJc2hvd19pbiMjb2Zmc2V0IyNfbWluLCBzZXRfaW4jI29mZnNldCMjX21pbik7ICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICAgICAgICAgXAorCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKKworCitpbl9yZWcoMCk7Citpbl9yZWcoMSk7Citpbl9yZWcoMik7Citpbl9yZWcoMyk7Citpbl9yZWcoNCk7Citpbl9yZWcoNSk7Citpbl9yZWcoNik7Citpbl9yZWcoNyk7Citpbl9yZWcoOCk7Citpbl9yZWcoOSk7Citpbl9yZWcoMTApOworaW5fcmVnKDExKTsKK2luX3JlZygxMik7Citpbl9yZWcoMTMpOworaW5fcmVnKDE0KTsKK2luX3JlZygxNSk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4xNihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgSU5TX0ZST01fUkVHKDE2LCBkYXRhLT5pblsxNl0pIC0KKwkJTkVHMTJfT0ZGU0VUKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4xNl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIAoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsgCisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgSU5TX0ZST01fUkVHKDE2LCBkYXRhLT5pbl9taW5bMTZdKQorCQktIE5FRzEyX09GRlNFVCk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfaW4xNl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9taW5bMTZdID0gSU5TX1RPX1JFRygxNiwgdmFsICsgTkVHMTJfT0ZGU0VUKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfSU5fTUlOWzE2XSwgZGF0YS0+aW5fbWluWzE2XSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7IAorfQorc3RhdGljIHNzaXplX3Qgc2hvd19pbjE2X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgSU5TX0ZST01fUkVHKDE2LCBkYXRhLT5pbl9tYXhbMTZdKQorCQkJLSBORUcxMl9PRkZTRVQpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2luMTZfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fbWF4WzE2XSA9IElOU19UT19SRUcoMTYsIHZhbCtORUcxMl9PRkZTRVQpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19JTl9NQVhbMTZdLCBkYXRhLT5pbl9tYXhbMTZdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGluMTZfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4xNiwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4xNl9taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2luMTZfbWluLCBzZXRfaW4xNl9taW4pOworc3RhdGljIERFVklDRV9BVFRSKGluMTZfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19pbjE2X21heCwgc2V0X2luMTZfbWF4KTsKKworCisKKworLyogTm93IGFkZCBmYW4gcmVhZC93cml0ZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbltucl0sCisJCWRhdGEtPmZhbl9kaXZbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLAorCQlkYXRhLT5mYW5fZGl2W25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIGRhdGEtPmZhbl9kaXZbbnJdKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfRkFOX01JTihuciksCisJCWRhdGEtPmZhbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBmYW5fb2Zmc2V0KG9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgICAgICAgICAgICAgICAgICBcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOyAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl8jI29mZnNldCwgTlVMTCk7ICBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAgICAgICAgICAgICAgICAgICAgXAorCQlzaG93X2Zhbl8jI29mZnNldCMjX21pbiwgc2V0X2Zhbl8jI29mZnNldCMjX21pbik7CisKK2Zhbl9vZmZzZXQoMSk7CitmYW5fb2Zmc2V0KDIpOworZmFuX29mZnNldCgzKTsKK2Zhbl9vZmZzZXQoNCk7CitmYW5fb2Zmc2V0KDUpOworZmFuX29mZnNldCg2KTsKK2Zhbl9vZmZzZXQoNyk7CitmYW5fb2Zmc2V0KDgpOworCisvKiBBZGp1c3QgZmFuX21pbiB0byBhY2NvdW50IGZvciBuZXcgZmFuIGRpdmlzb3IgKi8KK3N0YXRpYyB2b2lkIGZpeHVwX2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZmFuLCBpbnQgb2xkX2RpdikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgICAgbmV3X21pbjsKKwlpbnQgICAgbmV3X2RpdiA9IGRhdGEtPmZhbl9kaXZbZmFuXTsKKworCS8qIDAgYW5kIDB4ZmYgYXJlIHNwZWNpYWwuICBEb24ndCBhZGp1c3QgdGhlbSAqLworCWlmIChkYXRhLT5mYW5fbWluW2Zhbl0gPT0gMCB8fCBkYXRhLT5mYW5fbWluW2Zhbl0gPT0gMHhmZikgeworCQlyZXR1cm47CisJfQorCisJbmV3X21pbiA9IGRhdGEtPmZhbl9taW5bZmFuXSAqIG9sZF9kaXYgLyBuZXdfZGl2OworCW5ld19taW4gPSBTRU5TT1JTX0xJTUlUKG5ld19taW4sIDEsIDI1NCk7CisJZGF0YS0+ZmFuX21pbltmYW5dID0gbmV3X21pbjsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfRkFOX01JTihmYW4pLCBuZXdfbWluKTsKK30KKworLyogTm93IGFkZCBmYW5fZGl2IHJlYWQvd3JpdGUgZnVuY3Rpb25zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgZGF0YS0+ZmFuX2Rpdltucl0pOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCAgICB2YWwsb3JpZ19kaXYsbmV3X2RpdixzaGlmdDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJbmV3X2RpdiA9IERJVl9UT19SRUcodmFsKTsgCisJaWYgKG5ld19kaXYgPT0gMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCW9yaWdfZGl2ID0gZGF0YS0+ZmFuX2Rpdltucl07CisJZGF0YS0+ZmFuX2Rpdltucl0gPSBESVZfRlJPTV9SRUcobmV3X2Rpdik7CisKKwlpZiAobnIgPCA0KSB7IC8qIDAgPD0gbnIgPCA0ICovCisJCXNoaWZ0ID0gMiAqIG5yOworCQlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfRkFOX0RJVl8wXzMsCisJCQkoKERJVl9UT19SRUcob3JpZ19kaXYpICYgKH4oMHgwMyA8PCBzaGlmdCkpKSB8CisJCQkobmV3X2RpdiA8PCBzaGlmdCkpKTsKKwl9IGVsc2UgeyAvKiAzIDwgbnIgPCA4ICovCisJCXNoaWZ0ID0gMiAqIChuciAtIDQpOworCQlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfRkFOX0RJVl80XzcsCisJCQkoKERJVl9UT19SRUcob3JpZ19kaXYpICYgKH4oMHgwMyA8PCAoMiAqIHNoaWZ0KSkpKSB8CisJCQkobmV3X2RpdiA8PCBzaGlmdCkpKTsKKwl9CisKKwlpZiAoZGF0YS0+ZmFuX2Rpdltucl0gIT0gb3JpZ19kaXYpIHsKKwkJZml4dXBfZmFuX21pbihkZXYsbnIsb3JpZ19kaXYpOworCX0KKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBmYW5fb2Zmc2V0X2RpdihvZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzaG93X2Zhbl9kaXYoZGV2LCBidWYsIG9mZnNldCAtIDEpOyAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsICAgICAgICAgICAgICBcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICAgICAgXAorCQlzaG93X2Zhbl8jI29mZnNldCMjX2Rpdiwgc2V0X2Zhbl8jI29mZnNldCMjX2Rpdik7CisKK2Zhbl9vZmZzZXRfZGl2KDEpOworZmFuX29mZnNldF9kaXYoMik7CitmYW5fb2Zmc2V0X2RpdigzKTsKK2Zhbl9vZmZzZXRfZGl2KDQpOworZmFuX29mZnNldF9kaXYoNSk7CitmYW5fb2Zmc2V0X2Rpdig2KTsKK2Zhbl9vZmZzZXRfZGl2KDcpOworZmFuX29mZnNldF9kaXYoOCk7CisKKy8qIFRlbXBzICovCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wW25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWluW25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX21pbltucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19URU1QX01JTltucl0sCisJCWRhdGEtPnRlbXBfbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWF4W25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1RFTVBfTUFYW25yXSwKKwkJZGF0YS0+dGVtcF9tYXhbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKyNkZWZpbmUgdGVtcF9yZWcob2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzaG93X3RlbXBfbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNob3dfdGVtcF9tYXgoZGV2LCBidWYsIG9mZnNldCAtIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsICAgICAgICAgICAgICAgICAgIFwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzZXRfdGVtcF9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCAgICAgICAgICAgICAgICAgICBcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2V0X3RlbXBfbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfIyNvZmZzZXQsIE5VTEwpOyAgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsICAgICAgICAgICAgICAgICAgICAgXAorCQlzaG93X3RlbXBfIyNvZmZzZXQjI19taW4sIHNldF90ZW1wXyMjb2Zmc2V0IyNfbWluKTsgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCAgICAgICAgICAgICAgICAgICAgIFwKKwkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWF4LCBzZXRfdGVtcF8jI29mZnNldCMjX21heCk7CisKKwordGVtcF9yZWcoMSk7Cit0ZW1wX3JlZygyKTsKK3RlbXBfcmVnKDMpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9vZmZzZXRbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfb2Zmc2V0W25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1RFTVBfT0ZGU0VUW25yXSwKKwkJZGF0YS0+dGVtcF9vZmZzZXRbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSB0ZW1wX29mZnNldF9yZWcob2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCMjX29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzaG93X3RlbXBfb2Zmc2V0KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsICAgICAgICAgICAgICBcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzZXRfdGVtcF9vZmZzZXQoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19vZmZzZXQsIFNfSVJVR08gfCBTX0lXVVNSLCAgICAgICAgICAgICAgICBcCisJCXNob3dfdGVtcF8jI29mZnNldCMjX29mZnNldCwgc2V0X3RlbXBfIyNvZmZzZXQjI19vZmZzZXQpOworCit0ZW1wX29mZnNldF9yZWcoMSk7Cit0ZW1wX29mZnNldF9yZWcoMik7Cit0ZW1wX29mZnNldF9yZWcoMyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9hdXRvX3BvaW50MV90ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsCisJCWludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRygKKwkJQURNMTAyNl9GQU5fQUNUSVZBVElPTl9URU1QX0hZU1QgKyBkYXRhLT50ZW1wX3RtaW5bbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfYXV0b19wb2ludDJfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwKKwkJaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfdG1pbltucl0gKworCQlBRE0xMDI2X0ZBTl9DT05UUk9MX1RFTVBfUkFOR0UpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9hdXRvX3BvaW50MV90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLAorCQlpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF90bWluW25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfYXV0b19wb2ludDFfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF90bWluW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1RFTVBfVE1JTltucl0sCisJCWRhdGEtPnRlbXBfdG1pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHRlbXBfYXV0b19wb2ludChvZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50MV90ZW1wIChzdHJ1Y3QgZGV2aWNlICpkZXYsICAgIFwKKwljaGFyICpidWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNob3dfdGVtcF9hdXRvX3BvaW50MV90ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX2F1dG9fcG9pbnQxX3RlbXAgKHN0cnVjdCBkZXZpY2UgKmRldiwgICAgIFwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNldF90ZW1wX2F1dG9fcG9pbnQxX3RlbXAoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50MV90ZW1wX2h5c3QgKHN0cnVjdCBkZXZpY2UgICAgIFwKKwkqZGV2LCBjaGFyICpidWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNob3dfdGVtcF9hdXRvX3BvaW50MV90ZW1wX2h5c3QoZGV2LCBidWYsIG9mZnNldCAtIDEpOyAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50Ml90ZW1wIChzdHJ1Y3QgZGV2aWNlICpkZXYsICAgIFwKKwkgY2hhciAqYnVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNob3dfdGVtcF9hdXRvX3BvaW50Ml90ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2F1dG9fcG9pbnQxX3RlbXAsIFNfSVJVR08gfCBTX0lXVVNSLCAgICAgIFwKKwkJc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50MV90ZW1wLCAgICAgICAgICAgICAgICAgICAgICAgXAorCQlzZXRfdGVtcCMjb2Zmc2V0IyNfYXV0b19wb2ludDFfdGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfYXV0b19wb2ludDFfdGVtcF9oeXN0LCBTX0lSVUdPLCAgICAgICAgICAgXAorCQlzaG93X3RlbXAjI29mZnNldCMjX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgTlVMTCk7ICAgICAgICAgICBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfYXV0b19wb2ludDJfdGVtcCwgU19JUlVHTywgICAgICAgICAgICAgICAgXAorCQlzaG93X3RlbXAjI29mZnNldCMjX2F1dG9fcG9pbnQyX3RlbXAsIE5VTEwpOworCit0ZW1wX2F1dG9fcG9pbnQoMSk7Cit0ZW1wX2F1dG9fcG9pbnQoMik7Cit0ZW1wX2F1dG9fcG9pbnQoMyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9jcml0X2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgKGRhdGEtPmNvbmZpZzEgJiBDRkcxX1RIRVJNX0hPVCkgPj4gNCk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9jcml0X2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJaWYgKCh2YWwgPT0gMSkgfHwgKHZhbD09MCkpIHsKKwkJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCQlkYXRhLT5jb25maWcxID0gKGRhdGEtPmNvbmZpZzEgJiB+Q0ZHMV9USEVSTV9IT1QpIHwgKHZhbCA8PCA0KTsKKwkJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0NPTkZJRzEsIAorCQkJZGF0YS0+Y29uZmlnMSk7CisJCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2NyaXRfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgCisJc2hvd190ZW1wX2NyaXRfZW5hYmxlLCBzZXRfdGVtcF9jcml0X2VuYWJsZSk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsIAorCXNob3dfdGVtcF9jcml0X2VuYWJsZSwgc2V0X3RlbXBfY3JpdF9lbmFibGUpOworCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfY3JpdF9lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCAKKwlzaG93X3RlbXBfY3JpdF9lbmFibGUsIHNldF90ZW1wX2NyaXRfZW5hYmxlKTsKKworCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfY3JpdFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfY3JpdFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19URU1QX1RIRVJNW25yXSwKKwkJZGF0YS0+dGVtcF9jcml0W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgdGVtcF9jcml0X3JlZyhvZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjb2Zmc2V0IyNfY3JpdCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc2hvd190ZW1wX2NyaXQoZGV2LCBidWYsIG9mZnNldCAtIDEpOyAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfY3JpdCAoc3RydWN0IGRldmljZSAqZGV2LCAgICAgICAgICAgICAgXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzZXRfdGVtcF9jcml0KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7ICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2NyaXQsIFNfSVJVR08gfCBTX0lXVVNSLCAgICAgICAgICAgICAgICBcCisJCXNob3dfdGVtcF8jI29mZnNldCMjX2NyaXQsIHNldF90ZW1wXyMjb2Zmc2V0IyNfY3JpdCk7CisKK3RlbXBfY3JpdF9yZWcoMSk7Cit0ZW1wX2NyaXRfcmVnKDIpOwordGVtcF9jcml0X3JlZygzKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19hbmFsb2dfb3V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgREFDX0ZST01fUkVHKGRhdGEtPmFuYWxvZ19vdXQpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9hbmFsb2dfb3V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmFuYWxvZ19vdXQgPSBEQUNfVE9fUkVHKHZhbCk7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0RBQywgZGF0YS0+YW5hbG9nX291dCk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihhbmFsb2dfb3V0LCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19hbmFsb2dfb3V0X3JlZywgCisJc2V0X2FuYWxvZ19vdXRfcmVnKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd192aWRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkICYgMHgzZiwgZGF0YS0+dnJtKSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih2aWQsIFNfSVJVR08sIHNob3dfdmlkX3JlZywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdnJtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgZGF0YS0+dnJtKTsKK30KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3ZybV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRhdGEtPnZybSA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodnJtLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192cm1fcmVnLCBzdG9yZV92cm1fcmVnKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXNfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSAoZGF0YS0+YWxhcm1zKSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zX3JlZywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1fbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIGRhdGEtPmFsYXJtX21hc2spOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2FsYXJtX21hc2soc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+YWxhcm1fbWFzayA9IHZhbCAmIDB4N2ZmZmZmZmY7CisJbWFzayA9IGRhdGEtPmFsYXJtX21hc2sKKwkJfCAoZGF0YS0+Z3Bpb19tYXNrICYgMHgxMDAwMCA/IDB4ODAwMDAwMDAgOiAwKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfTUFTSzEsCisJCW1hc2sgJiAweGZmKTsKKwltYXNrID4+PSA4OworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19NQVNLMiwKKwkJbWFzayAmIDB4ZmYpOworCW1hc2sgPj49IDg7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX01BU0szLAorCQltYXNrICYgMHhmZik7CisJbWFzayA+Pj0gODsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfTUFTSzQsCisJCW1hc2sgJiAweGZmKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGFsYXJtX21hc2ssIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2FsYXJtX21hc2ssCisJc2V0X2FsYXJtX21hc2spOworCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIGRhdGEtPmdwaW8pOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2dwaW8oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwlsb25nICAgZ3BpbzsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5ncGlvID0gdmFsICYgMHgxZmZmZjsKKwlncGlvID0gZGF0YS0+Z3BpbzsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfR1BJT19TVEFUVVNfMF83LGdwaW8gJiAweGZmKTsKKwlncGlvID4+PSA4OworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19HUElPX1NUQVRVU184XzE1LGdwaW8gJiAweGZmKTsKKwlncGlvID0gKChncGlvID4+IDEpICYgMHg4MCkgfCAoZGF0YS0+YWxhcm1zID4+IDI0ICYgMHg3Zik7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1NUQVRVUzQsZ3BpbyAmIDB4ZmYpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbywgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfZ3Bpbywgc2V0X2dwaW8pOworCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZ3Bpb19tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgZGF0YS0+Z3Bpb19tYXNrKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9ncGlvX21hc2soc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwlsb25nICAgbWFzazsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5ncGlvX21hc2sgPSB2YWwgJiAweDFmZmZmOworCW1hc2sgPSBkYXRhLT5ncGlvX21hc2s7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0dQSU9fTUFTS18wXzcsbWFzayAmIDB4ZmYpOworCW1hc2sgPj49IDg7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0dQSU9fTUFTS184XzE1LG1hc2sgJiAweGZmKTsKKwltYXNrID0gKChtYXNrID4+IDEpICYgMHg4MCkgfCAoZGF0YS0+YWxhcm1fbWFzayA+PiAyNCAmIDB4N2YpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19NQVNLMSxtYXNrICYgMHhmZik7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvX21hc2ssIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2dwaW9fbWFzaywgc2V0X2dwaW9fbWFzayk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgUFdNX0ZST01fUkVHKGRhdGEtPnB3bTEucHdtKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWYgKGRhdGEtPnB3bTEuZW5hYmxlID09IDEpIHsKKwkJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwkJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCQlkYXRhLT5wd20xLnB3bSA9IFBXTV9UT19SRUcodmFsKTsKKwkJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1BXTSwgZGF0YS0+cHdtMS5wd20pOworCQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fcHdtX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgZGF0YS0+cHdtMS5hdXRvX3B3bV9taW4pOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2F1dG9fcHdtX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bTEuYXV0b19wd21fbWluID0gU0VOU09SU19MSU1JVCh2YWwsMCwyNTUpOworCWlmIChkYXRhLT5wd20xLmVuYWJsZSA9PSAyKSB7IC8qIGFwcGx5IGltbWVkaWF0ZWx5ICovCisJCWRhdGEtPnB3bTEucHdtID0gUFdNX1RPX1JFRygoZGF0YS0+cHdtMS5wd20gJiAweDBmKSB8CisJCQlQV01fTUlOX1RPX1JFRyhkYXRhLT5wd20xLmF1dG9fcHdtX21pbikpOyAKKwkJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1BXTSwgZGF0YS0+cHdtMS5wd20pOworCX0KKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfYXV0b19wd21fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIEFETTEwMjZfUFdNX01BWCk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIGRhdGEtPnB3bTEuZW5hYmxlKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJaW50ICAgICBvbGRfZW5hYmxlOworCisJaWYgKCh2YWwgPj0gMCkgJiYgKHZhbCA8IDMpKSB7CisJCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJb2xkX2VuYWJsZSA9IGRhdGEtPnB3bTEuZW5hYmxlOworCQlkYXRhLT5wd20xLmVuYWJsZSA9IHZhbDsKKwkJZGF0YS0+Y29uZmlnMSA9IChkYXRhLT5jb25maWcxICYgfkNGRzFfUFdNX0FGQykKKwkJCQl8ICgodmFsID09IDIpID8gQ0ZHMV9QV01fQUZDIDogMCk7CisJCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUcxLAorCQkJZGF0YS0+Y29uZmlnMSk7CisJCWlmICh2YWwgPT0gMikgeyAgLyogYXBwbHkgcHdtMV9hdXRvX3B3bV9taW4gdG8gcHdtMSAqLworCQkJZGF0YS0+cHdtMS5wd20gPSBQV01fVE9fUkVHKChkYXRhLT5wd20xLnB3bSAmIDB4MGYpIHwKKwkJCQlQV01fTUlOX1RPX1JFRyhkYXRhLT5wd20xLmF1dG9fcHdtX21pbikpOyAKKwkJCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19QV00sIAorCQkJCWRhdGEtPnB3bTEucHdtKTsKKwkJfSBlbHNlIGlmICghKChvbGRfZW5hYmxlID09IDEpICYmICh2YWwgPT0gMSkpKSB7CisJCQkvKiBzZXQgcHdtIHRvIHNhZmUgdmFsdWUgKi8KKwkJCWRhdGEtPnB3bTEucHdtID0gMjU1OworCQkJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1BXTSwgCisJCQkJZGF0YS0+cHdtMS5wd20pOworCQl9CisJCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyogZW5hYmxlIFBXTSBmYW4gY29udHJvbCAqLworc3RhdGljIERFVklDRV9BVFRSKHB3bTEsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bV9yZWcsIHNldF9wd21fcmVnKTsgCitzdGF0aWMgREVWSUNFX0FUVFIocHdtMiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtX3JlZywgc2V0X3B3bV9yZWcpOyAKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20zLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd21fcmVnLCBzZXRfcHdtX3JlZyk7IAorc3RhdGljIERFVklDRV9BVFRSKHB3bTFfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd21fZW5hYmxlLCAKKwlzZXRfcHdtX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHdtMl9lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsIAorCXNldF9wd21fZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20zX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwgCisJc2V0X3B3bV9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsIAorCXNob3dfYXV0b19wd21fbWluLCBzZXRfYXV0b19wd21fbWluKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9hdXRvX3BvaW50MV9wd20sIFNfSVJVR08gfCBTX0lXVVNSLCAKKwlzaG93X2F1dG9fcHdtX21pbiwgc2V0X2F1dG9fcHdtX21pbik7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfYXV0b19wb2ludDFfcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwgCisJc2hvd19hdXRvX3B3bV9taW4sIHNldF9hdXRvX3B3bV9taW4pOworCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPLCBzaG93X2F1dG9fcHdtX21heCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPLCBzaG93X2F1dG9fcHdtX21heCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPLCBzaG93X2F1dG9fcHdtX21heCwgTlVMTCk7CisKK2ludCBhZG0xMDI2X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAorCQlpbnQga2luZCkKK3sKKwlpbnQgY29tcGFueSwgdmVyc3RlcDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9ICIiOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CisJCS8qIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBkbyBieXRlIEkvTyAqLworCQlnb3RvIGV4aXQ7CisJfTsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgYWRtMTAyNl97cmVhZCx3cml0ZX1fdmFsdWUuICovCisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkbTEwMjZfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYWRtMTAyNl9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmFkbTEwMjZfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCisKKwljb21wYW55ID0gYWRtMTAyNl9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFETTEwMjZfUkVHX0NPTVBBTlkpOworCXZlcnN0ZXAgPSBhZG0xMDI2X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQURNMTAyNl9SRUdfVkVSU1RFUCk7CisKKwlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJEZXRlY3RpbmcgZGV2aWNlIGF0ICVkLDB4JTAyeCB3aXRoIgorCQkiIENPTVBBTlk6IDB4JTAyeCBhbmQgVkVSU1RFUDogMHglMDJ4XG4iLAorCQlpMmNfYWRhcHRlcl9pZChuZXdfY2xpZW50LT5hZGFwdGVyKSwgbmV3X2NsaWVudC0+YWRkciwKKwkJY29tcGFueSwgdmVyc3RlcCk7CisKKwkvKiBJZiBhdXRvLWRldGVjdGluZywgRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCisJaWYgKGtpbmQgPD0gMCkgeworCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJBdXRvZGV0ZWN0aW5nIGRldmljZSBhdCAlZCwweCUwMnggIgorCQkJIi4uLlxuIiwgaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGFkZHJlc3MpOworCQlpZiAoY29tcGFueSA9PSBBRE0xMDI2X0NPTVBBTllfQU5BTE9HX0RFVgorCQkgICAgJiYgdmVyc3RlcCA9PSBBRE0xMDI2X1ZFUlNURVBfQURNMTAyNikgeworCQkJa2luZCA9IGFkbTEwMjY7CisJCX0gZWxzZSBpZiAoY29tcGFueSA9PSBBRE0xMDI2X0NPTVBBTllfQU5BTE9HX0RFVgorCQkJJiYgKHZlcnN0ZXAgJiAweGYwKSA9PSBBRE0xMDI2X1ZFUlNURVBfR0VORVJJQykgeworCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiOiBVbnJlY29nbml6ZWQgc3RlcHBpbmcgIgorCQkJCSIweCUwMnguIERlZmF1bHRpbmcgdG8gQURNMTAyNi5cbiIsIHZlcnN0ZXApOworCQkJa2luZCA9IGFkbTEwMjY7CisJCX0gZWxzZSBpZiAoKHZlcnN0ZXAgJiAweGYwKSA9PSBBRE0xMDI2X1ZFUlNURVBfR0VORVJJQykgeworCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiOiBGb3VuZCB2ZXJzaW9uL3N0ZXBwaW5nICIKKwkJCQkiMHglMDJ4LiBBc3N1bWluZyBnZW5lcmljIEFETTEwMjYuXG4iLAorCQkJCXZlcnN0ZXApOworCQkJa2luZCA9IGFueV9jaGlwOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiOiBBdXRvZGV0ZWN0aW9uICIKKwkJCQkiZmFpbGVkXG4iKTsKKwkJCS8qIE5vdCBhbiBBRE0xMDI2IC4uLiAqLworCQkJaWYgKGtpbmQgPT0gMCkgIHsgLyogVXNlciB1c2VkIGZvcmNlPXgseSAqLworCQkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIkdlbmVyaWMgQURNMTAyNiBub3QgIgorCQkJCQkiZm91bmQgYXQgJWQsMHglMDJ4LiAgVHJ5ICIKKwkJCQkJImZvcmNlX2FkbTEwMjYuXG4iLAorCQkJCQlpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgYWRkcmVzcyk7CisJCQl9CisJCQllcnIgPSAwOworCQkJZ290byBleGl0ZnJlZTsKKwkJfQorCX0KKworCS8qIEZpbGwgaW4gdGhlIGNoaXAgc3BlY2lmaWMgZHJpdmVyIHZhbHVlcyAqLworCXN3aXRjaCAoa2luZCkgeworCWNhc2UgYW55X2NoaXAgOgorCQl0eXBlX25hbWUgPSAiYWRtMTAyNiI7CisJCWJyZWFrOworCWNhc2UgYWRtMTAyNiA6CisJCXR5cGVfbmFtZSA9ICJhZG0xMDI2IjsKKwkJYnJlYWs7CisJZGVmYXVsdCA6CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIjogSW50ZXJuYWwgZXJyb3IsIGludmFsaWQgIgorCQkJImtpbmQgKCVkKSEiLCBraW5kKTsKKwkJZXJyID0gLUVGQVVMVDsKKwkJZ290byBleGl0ZnJlZTsKKwl9CisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCB0eXBlX25hbWUsIEkyQ19OQU1FX1NJWkUpOworCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KKwlkYXRhLT50eXBlID0ga2luZDsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRmcmVlOworCisJLyogU2V0IHRoZSBWUk0gdmVyc2lvbiAqLworCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKworCS8qIEluaXRpYWxpemUgdGhlIEFETTEwMjYgY2hpcCAqLworCWFkbTEwMjZfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjdfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW43X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjdfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjhfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW45X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW45X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEwX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTBfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEyX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEyX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEzX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTRfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xNF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xNF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xNV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjE1X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjE1X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjE2X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTZfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTZfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjRfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuNF9kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuNF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuNV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW41X2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW41X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW42X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjZfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjZfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjdfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuN19kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuN19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuOF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW44X2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW44X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9vZmZzZXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfb2Zmc2V0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX29mZnNldCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsIAorCQkmZGV2X2F0dHJfdGVtcDFfYXV0b19wb2ludDFfdGVtcCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsIAorCQkmZGV2X2F0dHJfdGVtcDJfYXV0b19wb2ludDFfdGVtcCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsIAorCQkmZGV2X2F0dHJfdGVtcDNfYXV0b19wb2ludDFfdGVtcCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCSZkZXZfYXR0cl90ZW1wMV9hdXRvX3BvaW50MV90ZW1wX2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkmZGV2X2F0dHJfdGVtcDJfYXV0b19wb2ludDFfdGVtcF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJJmRldl9hdHRyX3RlbXAzX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsIAorCQkmZGV2X2F0dHJfdGVtcDFfYXV0b19wb2ludDJfdGVtcCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsIAorCQkmZGV2X2F0dHJfdGVtcDJfYXV0b19wb2ludDJfdGVtcCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsIAorCQkmZGV2X2F0dHJfdGVtcDNfYXV0b19wb2ludDJfdGVtcCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0X2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9jcml0X2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19jcml0X2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl92aWQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdnJtKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybV9tYXNrKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2dwaW8pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZ3Bpb19tYXNrKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTEpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20zKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTFfZW5hYmxlKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTJfZW5hYmxlKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTNfZW5hYmxlKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2F1dG9fcG9pbnQxX3B3bSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9hdXRvX3BvaW50MV9wd20pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfYXV0b19wb2ludDFfcHdtKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2F1dG9fcG9pbnQyX3B3bSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9hdXRvX3BvaW50Ml9wd20pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfYXV0b19wb2ludDJfcHdtKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FuYWxvZ19vdXQpOworCXJldHVybiAwOworCisJLyogRXJyb3Igb3V0IGFuZCBjbGVhbnVwIGNvZGUgKi8KK2V4aXRmcmVlOgorCWtmcmVlKG5ld19jbGllbnQpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorc3RhdGljIGludCBfX2luaXQgc21fYWRtMTAyNl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZG0xMDI2X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkICBfX2V4aXQgc21fYWRtMTAyNl9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkbTEwMjZfZHJpdmVyKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGhpbGlwIFBva29ybnkgPHBwb2tvcm55QHBlbmd1aW5jb21wdXRpbmcuY29tPiwgIgorICAgICAgICAgICAgICAiSnVzdGluIFRoaWVzc2VuIDxqdGhpZXNzZW5AcGVuZ3VpbmNvbXB1dGluZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFETTEwMjYgZHJpdmVyIik7CisKK21vZHVsZV9pbml0KHNtX2FkbTEwMjZfaW5pdCk7Cittb2R1bGVfZXhpdChzbV9hZG0xMDI2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAzMS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAzMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Mzg1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDMxLmMKQEAgLTAsMCArMSw5NzcgQEAKKy8qCisgIGFkbTEwMzEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgIG1vbml0b3JpbmcKKyAgQmFzZWQgb24gbG03NS5jIGFuZCBsbTg1LmMKKyAgU3VwcG9ydHMgYWRtMTAzMCAvIGFkbTEwMzEKKyAgQ29weXJpZ2h0IChDKSAyMDA0IEFsZXhhbmRyZSBkJ0FsdG9uIDxhbGV4QGFsZXhkYWx0b24ub3JnPgorICBSZXdvcmtlZCBieSBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKy8qIEZvbGxvd2luZyBtYWNyb3MgdGFrZXMgY2hhbm5lbCBwYXJhbWV0ZXIgc3RhcnRpbmcgZnJvbSAwIHRvIDIgKi8KKyNkZWZpbmUgQURNMTAzMV9SRUdfRkFOX1NQRUVEKG5yKQkoMHgwOCArIChucikpCisjZGVmaW5lIEFETTEwMzFfUkVHX0ZBTl9ESVYobnIpCQkoMHgyMCAgKyAobnIpKQorI2RlZmluZSBBRE0xMDMxX1JFR19QV00JCQkoMHgyMikKKyNkZWZpbmUgQURNMTAzMV9SRUdfRkFOX01JTihucikJCSgweDEwICsgKG5yKSkKKworI2RlZmluZSBBRE0xMDMxX1JFR19URU1QX01BWChucikJKDB4MTQgICsgNCoobnIpKQorI2RlZmluZSBBRE0xMDMxX1JFR19URU1QX01JTihucikJKDB4MTUgICsgNCoobnIpKQorI2RlZmluZSBBRE0xMDMxX1JFR19URU1QX0NSSVQobnIpCSgweDE2ICArIDQqKG5yKSkKKworI2RlZmluZSBBRE0xMDMxX1JFR19URU1QKG5yKQkJKDB4YSArIChucikpCisjZGVmaW5lIEFETTEwMzFfUkVHX0FVVE9fVEVNUChucikJKDB4MjQgKyAobnIpKQorCisjZGVmaW5lIEFETTEwMzFfUkVHX1NUQVRVUyhucikJCSgweDIgKyAobnIpKQorCisjZGVmaW5lIEFETTEwMzFfUkVHX0NPTkYxCQkweDAKKyNkZWZpbmUgQURNMTAzMV9SRUdfQ09ORjIJCTB4MQorI2RlZmluZSBBRE0xMDMxX1JFR19FWFRfVEVNUAkJMHg2CisKKyNkZWZpbmUgQURNMTAzMV9DT05GMV9NT05JVE9SX0VOQUJMRQkweDAxCS8qIE1vbml0b3JpbmcgZW5hYmxlICovCisjZGVmaW5lIEFETTEwMzFfQ09ORjFfUFdNX0lOVkVSVAkweDA4CS8qIFBXTSBJbnZlcnQgKi8KKyNkZWZpbmUgQURNMTAzMV9DT05GMV9BVVRPX01PREUJCTB4ODAJLyogQXV0byBGQU4gKi8KKworI2RlZmluZSBBRE0xMDMxX0NPTkYyX1BXTTFfRU5BQkxFCTB4MDEKKyNkZWZpbmUgQURNMTAzMV9DT05GMl9QV00yX0VOQUJMRQkweDAyCisjZGVmaW5lIEFETTEwMzFfQ09ORjJfVEFDSDFfRU5BQkxFCTB4MDQKKyNkZWZpbmUgQURNMTAzMV9DT05GMl9UQUNIMl9FTkFCTEUJMHgwOAorI2RlZmluZSBBRE0xMDMxX0NPTkYyX1RFTVBfRU5BQkxFKGNoYW4pCSgweDEwIDw8IChjaGFuKSkKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIDB4MmUsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8yKGFkbTEwMzAsIGFkbTEwMzEpOworCit0eXBlZGVmIHU4IGF1dG9fY2hhbl90YWJsZV90WzhdWzJdOworCisvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KK3N0cnVjdCBhZG0xMDMxX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWludCBjaGlwX3R5cGU7CisJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisJLyogVGhlIGNoYW5fc2VsZWN0X3RhYmxlIGNvbnRhaW5zIHRoZSBwb3NzaWJsZSBjb25maWd1cmF0aW9ucyBmb3IKKwkgKiBhdXRvIGZhbiBjb250cm9sLgorCSAqLworCWF1dG9fY2hhbl90YWJsZV90ICpjaGFuX3NlbGVjdF90YWJsZTsKKwl1MTYgYWxhcm07CisJdTggY29uZjE7CisJdTggY29uZjI7CisJdTggZmFuWzJdOworCXU4IGZhbl9kaXZbMl07CisJdTggZmFuX21pblsyXTsKKwl1OCBwd21bMl07CisJdTggb2xkX3B3bVsyXTsKKwlzOCB0ZW1wWzNdOworCXU4IGV4dF90ZW1wWzNdOworCXU4IGF1dG9fdGVtcFszXTsKKwl1OCBhdXRvX3RlbXBfbWluWzNdOworCXU4IGF1dG9fdGVtcF9vZmZbM107CisJdTggYXV0b190ZW1wX21heFszXTsKKwlzOCB0ZW1wX21pblszXTsKKwlzOCB0ZW1wX21heFszXTsKKwlzOCB0ZW1wX2NyaXRbM107Cit9OworCitzdGF0aWMgaW50IGFkbTEwMzFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgYWRtMTAzMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIHZvaWQgYWRtMTAzMV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgYWRtMTAzMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHN0cnVjdCBhZG0xMDMxX2RhdGEgKmFkbTEwMzFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRtMTAzMV9kcml2ZXIgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAiYWRtMTAzMSIsCisJLmZsYWdzID0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBhZG0xMDMxX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50ID0gYWRtMTAzMV9kZXRhY2hfY2xpZW50LAorfTsKKworc3RhdGljIGlubGluZSB1OCBhZG0xMDMxX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIGludAorYWRtMTAzMV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworfQorCisKKyNkZWZpbmUgVEVNUF9UT19SRUcodmFsKQkJKCgodmFsKSA8IDAgPyAoKHZhbCAtIDUwMCkgLyAxMDAwKSA6IFwKKwkJCQkJKCh2YWwgKyA1MDApIC8gMTAwMCkpKQorCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKQkJKCh2YWwpICogMTAwMCkKKworI2RlZmluZSBURU1QX0ZST01fUkVHX0VYVCh2YWwsIGV4dCkJKFRFTVBfRlJPTV9SRUcodmFsKSArIChleHQpICogMTI1KQorCisjZGVmaW5lIEZBTl9GUk9NX1JFRyhyZWcsIGRpdikJCSgocmVnKSA/ICgxMTI1MCAqIDYwKSAvICgocmVnKSAqIChkaXYpKSA6IDApCisKK3N0YXRpYyBpbnQgRkFOX1RPX1JFRyhpbnQgcmVnLCBpbnQgZGl2KQoreworCWludCB0bXA7CisJdG1wID0gRkFOX0ZST01fUkVHKFNFTlNPUlNfTElNSVQocmVnLCAwLCA2NTUzNSksIGRpdik7CisJcmV0dXJuIHRtcCA+IDI1NSA/IDI1NSA6IHRtcDsKK30KKworI2RlZmluZSBGQU5fRElWX0ZST01fUkVHKHJlZykJCSgxPDwoKChyZWcpJjB4YzApPj42KSkKKworI2RlZmluZSBQV01fVE9fUkVHKHZhbCkJCQkoU0VOU09SU19MSU1JVCgodmFsKSwgMCwgMjU1KSA+PiA0KQorI2RlZmluZSBQV01fRlJPTV9SRUcodmFsKQkJKCh2YWwpIDw8IDQpCisKKyNkZWZpbmUgRkFOX0NIQU5fRlJPTV9SRUcocmVnKQkJKCgocmVnKSA+PiA1KSAmIDcpCisjZGVmaW5lIEZBTl9DSEFOX1RPX1JFRyh2YWwsIHJlZykJXAorCSgoKHJlZykgJiAweDFGKSB8ICgoKHZhbCkgPDwgNSkgJiAweGUwKSkKKworI2RlZmluZSBBVVRPX1RFTVBfTUlOX1RPX1JFRyh2YWwsIHJlZykJXAorCSgoKCh2YWwpLzUwMCkgJiAweGY4KXwoKHJlZykgJiAweDcpKQorI2RlZmluZSBBVVRPX1RFTVBfUkFOR0VfRlJPTV9SRUcocmVnKQkoNTAwMCAqICgxPDwgKChyZWcpJjB4NykpKQorI2RlZmluZSBBVVRPX1RFTVBfTUlOX0ZST01fUkVHKHJlZykJKDEwMDAgKiAoKCgocmVnKSA+PiAzKSAmIDB4MWYpIDw8IDIpKQorCisjZGVmaW5lIEFVVE9fVEVNUF9NSU5fRlJPTV9SRUdfREVHKHJlZykJKCgoKHJlZykgPj4gMykgJiAweDFmKSA8PCAyKQorCisjZGVmaW5lIEFVVE9fVEVNUF9PRkZfRlJPTV9SRUcocmVnKQkJXAorCShBVVRPX1RFTVBfTUlOX0ZST01fUkVHKHJlZykgLSA1MDAwKQorCisjZGVmaW5lIEFVVE9fVEVNUF9NQVhfRlJPTV9SRUcocmVnKQkJXAorCShBVVRPX1RFTVBfUkFOR0VfRlJPTV9SRUcocmVnKSArCVwKKwlBVVRPX1RFTVBfTUlOX0ZST01fUkVHKHJlZykpCisKK3N0YXRpYyBpbnQgQVVUT19URU1QX01BWF9UT19SRUcoaW50IHZhbCwgaW50IHJlZywgaW50IHB3bSkKK3sKKwlpbnQgcmV0OworCWludCByYW5nZSA9IHZhbCAtIEFVVE9fVEVNUF9NSU5fRlJPTV9SRUcocmVnKTsKKworCXJhbmdlID0gKCh2YWwgLSBBVVRPX1RFTVBfTUlOX0ZST01fUkVHKHJlZykpKjEwKS8oMTYgLSBwd20pOworCXJldCA9ICgocmVnICYgMHhmOCkgfAorCSAgICAgICAocmFuZ2UgPCAxMDAwMCA/IDAgOgorCQlyYW5nZSA8IDIwMDAwID8gMSA6CisJCXJhbmdlIDwgNDAwMDAgPyAyIDogcmFuZ2UgPCA4MDAwMCA/IDMgOiA0KSk7CisJcmV0dXJuIHJldDsKK30KKworLyogRkFOIGF1dG8gY29udHJvbCAqLworI2RlZmluZSBHRVRfRkFOX0FVVE9fQklURklFTEQoZGF0YSwgaWR4KQlcCisJKCooZGF0YSktPmNoYW5fc2VsZWN0X3RhYmxlKVtGQU5fQ0hBTl9GUk9NX1JFRygoZGF0YSktPmNvbmYxKV1baWR4JTJdCisKKy8qIFRoZSB0YWJsZXMgYmVsb3cgY29udGFpbnMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGF1dG8gZmFuIAorICogY29udHJvbCBiaXRmaWVsZHMuIHRoZSBpbmRleCBpbiB0aGUgdGFibGUgaXMgdGhlIHJlZ2lzdGVyIHZhbHVlLgorICogTVNiIGlzIHRoZSBhdXRvIGZhbiBjb250cm9sIGVuYWJsZSBiaXQsIHNvIHRoZSBmb3VyIGZpcnN0IGVudHJpZXMKKyAqIGluIHRoZSB0YWJsZSBkaXNhYmxlcyBhdXRvIGZhbiBjb250cm9sIHdoZW4gYm90aCBiaXRmaWVsZHMgYXJlIHplcm8uCisgKi8KK3N0YXRpYyBhdXRvX2NoYW5fdGFibGVfdCBhdXRvX2NoYW5uZWxfc2VsZWN0X3RhYmxlX2FkbTEwMzEgPSB7CisJezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9LAorCXsyIC8qMGIwMTAgKi8gLCA0IC8qMGIxMDAgKi8gfSwKKwl7MiAvKjBiMDEwICovICwgMiAvKjBiMDEwICovIH0sCisJezQgLyowYjEwMCAqLyAsIDQgLyowYjEwMCAqLyB9LAorCXs3IC8qMGIxMTEgKi8gLCA3IC8qMGIxMTEgKi8gfSwKK307CisKK3N0YXRpYyBhdXRvX2NoYW5fdGFibGVfdCBhdXRvX2NoYW5uZWxfc2VsZWN0X3RhYmxlX2FkbTEwMzAgPSB7CisJezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9LAorCXsyIC8qMGIxMCAqLwkJLCAwfSwKKwl7MHhmZiAvKmludmFsaWQgKi8JLCAwfSwKKwl7MHhmZiAvKmludmFsaWQgKi8JLCAwfSwKKwl7MyAvKjBiMTEgKi8JCSwgMH0sCit9OworCisvKiBUaGF0IGZ1bmN0aW9uIGNoZWNrcyBpZiBhIGJpdGZpZWxkIGlzIHZhbGlkIGFuZCByZXR1cm5zIHRoZSBvdGhlciBiaXRmaWVsZAorICogbmVhcmVzdCBtYXRjaCBpZiBubyBleGFjdCBtYXRjaCB3aGVyZSBmb3VuZC4KKyAqLworc3RhdGljIGludAorZ2V0X2Zhbl9hdXRvX25lYXJlc3Qoc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSwKKwkJICAgICBpbnQgY2hhbiwgdTggdmFsLCB1OCByZWcsIHU4ICogbmV3X3JlZykKK3sKKwlpbnQgaTsKKwlpbnQgZmlyc3RfbWF0Y2ggPSAtMSwgZXhhY3RfbWF0Y2ggPSAtMTsKKwl1OCBvdGhlcl9yZWdfdmFsID0KKwkgICAgKCpkYXRhLT5jaGFuX3NlbGVjdF90YWJsZSlbRkFOX0NIQU5fRlJPTV9SRUcocmVnKV1bY2hhbiA/IDAgOiAxXTsKKworCWlmICh2YWwgPT0gMCkgeworCQkqbmV3X3JlZyA9IDA7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKCh2YWwgPT0gKCpkYXRhLT5jaGFuX3NlbGVjdF90YWJsZSlbaV1bY2hhbl0pICYmCisJCSAgICAoKCpkYXRhLT5jaGFuX3NlbGVjdF90YWJsZSlbaV1bY2hhbiA/IDAgOiAxXSA9PQorCQkgICAgIG90aGVyX3JlZ192YWwpKSB7CisJCQkvKiBXZSBmb3VuZCBhbiBleGFjdCBtYXRjaCAqLworCQkJZXhhY3RfbWF0Y2ggPSBpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAodmFsID09ICgqZGF0YS0+Y2hhbl9zZWxlY3RfdGFibGUpW2ldW2NoYW5dICYmCisJCQkgICBmaXJzdF9tYXRjaCA9PSAtMSkgeworCQkJLyogU2F2ZSB0aGUgZmlyc3QgbWF0Y2ggaW4gY2FzZSBvZiBhbiBleGFjdCBtYXRjaCBoYXMgbm90IGJlZW4KKwkJCSAqIGZvdW5kIAorCQkJICovCisJCQlmaXJzdF9tYXRjaCA9IGk7CisJCX0KKwl9CisKKwlpZiAoZXhhY3RfbWF0Y2ggPj0gMCkgeworCQkqbmV3X3JlZyA9IGV4YWN0X21hdGNoOworCX0gZWxzZSBpZiAoZmlyc3RfbWF0Y2ggPj0gMCkgeworCQkqbmV3X3JlZyA9IGZpcnN0X21hdGNoOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fYXV0b19jaGFubmVsKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBHRVRfRkFOX0FVVE9fQklURklFTEQoZGF0YSwgbnIpKTsKK30KKworc3RhdGljIHNzaXplX3QKK3NldF9mYW5fYXV0b19jaGFubmVsKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwl1OCByZWc7CisJaW50IHJldDsKKwl1OCBvbGRfZmFuX21vZGU7CisKKwlvbGRfZmFuX21vZGUgPSBkYXRhLT5jb25mMTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkKKwlpZiAoKHJldCA9IGdldF9mYW5fYXV0b19uZWFyZXN0KGRhdGEsIG5yLCB2YWwsIGRhdGEtPmNvbmYxLCAmcmVnKSkpIHsKKwkJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKCgoZGF0YS0+Y29uZjEgPSBGQU5fQ0hBTl9UT19SRUcocmVnLCBkYXRhLT5jb25mMSkpICYgQURNMTAzMV9DT05GMV9BVVRPX01PREUpIF4gCisJICAgIChvbGRfZmFuX21vZGUgJiBBRE0xMDMxX0NPTkYxX0FVVE9fTU9ERSkpIHsKKwkJaWYgKGRhdGEtPmNvbmYxICYgQURNMTAzMV9DT05GMV9BVVRPX01PREUpeworCQkJLyogU3dpdGNoIHRvIEF1dG8gRmFuIE1vZGUgCisJCQkgKiBTYXZlIFBXTSByZWdpc3RlcnMgCisJCQkgKiBTZXQgUFdNIHJlZ2lzdGVycyB0byAzMyUgQm90aCAqLworCQkJZGF0YS0+b2xkX3B3bVswXSA9IGRhdGEtPnB3bVswXTsKKwkJCWRhdGEtPm9sZF9wd21bMV0gPSBkYXRhLT5wd21bMV07CisJCQlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfUFdNLCAweDU1KTsKKwkJfSBlbHNlIHsKKwkJCS8qIFN3aXRjaCB0byBNYW51YWwgTW9kZSAqLworCQkJZGF0YS0+cHdtWzBdID0gZGF0YS0+b2xkX3B3bVswXTsKKwkJCWRhdGEtPnB3bVsxXSA9IGRhdGEtPm9sZF9wd21bMV07CisJCQkvKiBSZXN0b3JlIFBXTSByZWdpc3RlcnMgKi8KKwkJCWFkbTEwMzFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19QV00sIAorCQkJCQkgICAgZGF0YS0+cHdtWzBdIHwgKGRhdGEtPnB3bVsxXSA8PCA0KSk7CisJCX0KKwl9CisJZGF0YS0+Y29uZjEgPSBGQU5fQ0hBTl9UT19SRUcocmVnLCBkYXRhLT5jb25mMSk7CisJYWRtMTAzMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0NPTkYxLCBkYXRhLT5jb25mMSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgZmFuX2F1dG9fY2hhbm5lbF9vZmZzZXQob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2F1dG9fY2hhbm5lbF8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzaG93X2Zhbl9hdXRvX2NoYW5uZWwoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9hdXRvX2NoYW5uZWxfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJCQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2Zhbl9hdXRvX2NoYW5uZWwoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGF1dG9fZmFuIyNvZmZzZXQjI19jaGFubmVsLCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKKwkJICAgc2hvd19mYW5fYXV0b19jaGFubmVsXyMjb2Zmc2V0LAkJCQlcCisJCSAgIHNldF9mYW5fYXV0b19jaGFubmVsXyMjb2Zmc2V0KQorCitmYW5fYXV0b19jaGFubmVsX29mZnNldCgxKTsKK2Zhbl9hdXRvX2NoYW5uZWxfb2Zmc2V0KDIpOworCisvKiBBdXRvIFRlbXBzICovCitzdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fdGVtcF9vZmYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIAorCQkgICAgICAgQVVUT19URU1QX09GRl9GUk9NX1JFRyhkYXRhLT5hdXRvX3RlbXBbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCSAgICAgICBBVVRPX1RFTVBfTUlOX0ZST01fUkVHKGRhdGEtPmF1dG9fdGVtcFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90CitzZXRfYXV0b190ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+YXV0b190ZW1wW25yXSA9IEFVVE9fVEVNUF9NSU5fVE9fUkVHKHZhbCwgZGF0YS0+YXV0b190ZW1wW25yXSk7CisJYWRtMTAzMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0FVVE9fVEVNUChuciksCisJCQkgICAgZGF0YS0+YXV0b190ZW1wW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCSAgICAgICBBVVRPX1RFTVBfTUFYX0ZST01fUkVHKGRhdGEtPmF1dG9fdGVtcFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90CitzZXRfYXV0b190ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9tYXhbbnJdID0gQVVUT19URU1QX01BWF9UT19SRUcodmFsLCBkYXRhLT5hdXRvX3RlbXBbbnJdLCBkYXRhLT5wd21bbnJdKTsKKwlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfQVVUT19URU1QKG5yKSwKKwkJCSAgICBkYXRhLT50ZW1wX21heFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIGF1dG9fdGVtcF9yZWcob2Zmc2V0KQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fdGVtcF8jI29mZnNldCMjX29mZiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzaG93X2F1dG9fdGVtcF9vZmYoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3RlbXBfIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19hdXRvX3RlbXBfbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfYXV0b190ZW1wXyMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfYXV0b190ZW1wX21heChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfYXV0b190ZW1wXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzZXRfYXV0b190ZW1wX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfYXV0b190ZW1wXyMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzZXRfYXV0b190ZW1wX21heChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoYXV0b190ZW1wIyNvZmZzZXQjI19vZmYsIFNfSVJVR08sCQkJCVwKKwkJICAgc2hvd19hdXRvX3RlbXBfIyNvZmZzZXQjI19vZmYsIE5VTEwpOwkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihhdXRvX3RlbXAjI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAorCQkgICBzaG93X2F1dG9fdGVtcF8jI29mZnNldCMjX21pbiwgc2V0X2F1dG9fdGVtcF8jI29mZnNldCMjX21pbik7XAorc3RhdGljIERFVklDRV9BVFRSKGF1dG9fdGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwJCQlcCisJCSAgIHNob3dfYXV0b190ZW1wXyMjb2Zmc2V0IyNfbWF4LCBzZXRfYXV0b190ZW1wXyMjb2Zmc2V0IyNfbWF4KQorCithdXRvX3RlbXBfcmVnKDEpOworYXV0b190ZW1wX3JlZygyKTsKK2F1dG9fdGVtcF9yZWcoMyk7CisKKy8qIHB3bSAqLworc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFBXTV9GUk9NX1JFRyhkYXRhLT5wd21bbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdAorc2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJaW50IHJlZzsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAoKGRhdGEtPmNvbmYxICYgQURNMTAzMV9DT05GMV9BVVRPX01PREUpICYmIAorCSAgICAoKCh2YWw+PjQpICYgMHhmKSAhPSA1KSkgeworCQkvKiBJbiBhdXRvbWF0aWMgbW9kZSwgdGhlIG9ubHkgUFdNIGFjY2VwdGVkIGlzIDMzJSAqLworCQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGF0YS0+cHdtW25yXSA9IFBXTV9UT19SRUcodmFsKTsKKwlyZWcgPSBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19QV00pOworCWFkbTEwMzFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19QV00sCisJCQkgICAgbnIgPyAoKGRhdGEtPnB3bVtucl0gPDwgNCkgJiAweGYwKSB8IChyZWcgJiAweGYpCisJCQkgICAgOiAoZGF0YS0+cHdtW25yXSAmIDB4ZikgfCAocmVnICYgMHhmMCkpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHB3bV9yZWcob2Zmc2V0KQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfcHdtKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3B3bV8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfcHdtKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwJCQlcCisJCSAgIHNob3dfcHdtXyMjb2Zmc2V0LCBzZXRfcHdtXyMjb2Zmc2V0KQorCitwd21fcmVnKDEpOworcHdtX3JlZygyKTsKKworLyogRmFucyAqLworCisvKgorICogVGhhdCBmdW5jdGlvbiBjaGVja3MgdGhlIGNhc2VzIHdoZXJlIHRoZSBmYW4gcmVhZGluZyBpcyBub3QKKyAqIHJlbGV2ZW50LiAgSXQgaXMgdXNlZCB0byBwcm92aWRlIDAgYXMgZmFuIHJlYWRpbmcgd2hlbiB0aGUgZmFuIGlzCisgKiBub3Qgc3VwcG9zZWQgdG8gcnVuCisgKi8KK3N0YXRpYyBpbnQgdHJ1c3RfZmFuX3JlYWRpbmdzKHN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEsIGludCBjaGFuKQoreworCWludCByZXMgPSAwOworCisJaWYgKGRhdGEtPmNvbmYxICYgQURNMTAzMV9DT05GMV9BVVRPX01PREUpIHsKKwkJc3dpdGNoIChkYXRhLT5jb25mMSAmIDB4NjApIHsKKwkJY2FzZSAweDAwOgkvKiByZW1vdGUgdGVtcDEgY29udHJvbHMgZmFuMSByZW1vdGUgdGVtcDIgY29udHJvbHMgZmFuMiAqLworCQkJcmVzID0gZGF0YS0+dGVtcFtjaGFuKzFdID49CisJCQkgICAgICBBVVRPX1RFTVBfTUlOX0ZST01fUkVHX0RFRyhkYXRhLT5hdXRvX3RlbXBbY2hhbisxXSk7CisJCQlicmVhazsKKwkJY2FzZSAweDIwOgkvKiByZW1vdGUgdGVtcDEgY29udHJvbHMgYm90aCBmYW5zICovCisJCQlyZXMgPQorCQkJICAgIGRhdGEtPnRlbXBbMV0gPj0KKwkJCSAgICBBVVRPX1RFTVBfTUlOX0ZST01fUkVHX0RFRyhkYXRhLT5hdXRvX3RlbXBbMV0pOworCQkJYnJlYWs7CisJCWNhc2UgMHg0MDoJLyogcmVtb3RlIHRlbXAyIGNvbnRyb2xzIGJvdGggZmFucyAqLworCQkJcmVzID0KKwkJCSAgICBkYXRhLT50ZW1wWzJdID49CisJCQkgICAgQVVUT19URU1QX01JTl9GUk9NX1JFR19ERUcoZGF0YS0+YXV0b190ZW1wWzJdKTsKKwkJCWJyZWFrOworCQljYXNlIDB4NjA6CS8qIG1heCBjb250cm9scyBib3RoIGZhbnMgKi8KKwkJCXJlcyA9CisJCQkgICAgZGF0YS0+dGVtcFswXSA+PQorCQkJICAgIEFVVE9fVEVNUF9NSU5fRlJPTV9SRUdfREVHKGRhdGEtPmF1dG9fdGVtcFswXSkKKwkJCSAgICB8fCBkYXRhLT50ZW1wWzFdID49CisJCQkgICAgQVVUT19URU1QX01JTl9GUk9NX1JFR19ERUcoZGF0YS0+YXV0b190ZW1wWzFdKQorCQkJICAgIHx8IChkYXRhLT5jaGlwX3R5cGUgPT0gYWRtMTAzMSAKKwkJCQkmJiBkYXRhLT50ZW1wWzJdID49CisJCQkJQVVUT19URU1QX01JTl9GUk9NX1JFR19ERUcoZGF0YS0+YXV0b190ZW1wWzJdKSk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXJlcyA9IGRhdGEtPnB3bVtjaGFuXSA+IDA7CisJfQorCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IHZhbHVlOworCisJdmFsdWUgPSB0cnVzdF9mYW5fcmVhZGluZ3MoZGF0YSwgbnIpID8gRkFOX0ZST01fUkVHKGRhdGEtPmZhbltucl0sCisJCQkJIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSA6IDA7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCSAgICAgICBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCQkJICAgIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSk7Cit9CitzdGF0aWMgc3NpemVfdAorc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWlmICh2YWwpIHsKKwkJZGF0YS0+ZmFuX21pbltucl0gPSAKKwkJCUZBTl9UT19SRUcodmFsLCBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJfSBlbHNlIHsKKwkJZGF0YS0+ZmFuX21pbltucl0gPSAweGZmOworCX0KKwlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfRkFOX01JTihuciksIGRhdGEtPmZhbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90CitzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdTggdG1wOworCWludCBvbGRfZGl2OworCWludCBuZXdfbWluOworCisJdG1wID0gdmFsID09IDggPyAweGMwIDoKKwkgICAgICB2YWwgPT0gNCA/IDB4ODAgOgorCSAgICAgIHZhbCA9PSAyID8gMHg0MCA6CQorCSAgICAgIHZhbCA9PSAxID8gMHgwMCA6ICAKKwkgICAgICAweGZmOworCWlmICh0bXAgPT0gMHhmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCW9sZF9kaXYgPSBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKTsKKwlkYXRhLT5mYW5fZGl2W25yXSA9ICh0bXAgJiAweEMwKSB8ICgweDNmICYgZGF0YS0+ZmFuX2Rpdltucl0pOworCW5ld19taW4gPSBkYXRhLT5mYW5fbWluW25yXSAqIG9sZF9kaXYgLyAKKwkJRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSk7CisJZGF0YS0+ZmFuX21pbltucl0gPSBuZXdfbWluID4gMHhmZiA/IDB4ZmYgOiBuZXdfbWluOworCWRhdGEtPmZhbltucl0gPSBkYXRhLT5mYW5bbnJdICogb2xkX2RpdiAvIAorCQlGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKTsKKworCWFkbTEwMzFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19GQU5fRElWKG5yKSwgCisJCQkgICAgZGF0YS0+ZmFuX2Rpdltucl0pOworCWFkbTEwMzFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19GQU5fTUlOKG5yKSwgCisJCQkgICAgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIGZhbl9vZmZzZXQob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW5fZGl2KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl8jI29mZnNldCwJXAorCQkgICBOVUxMKTsJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQkgICBzaG93X2Zhbl8jI29mZnNldCMjX21pbiwgc2V0X2Zhbl8jI29mZnNldCMjX21pbik7CVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCSAgIHNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2KTsJXAorc3RhdGljIERFVklDRV9BVFRSKGF1dG9fZmFuIyNvZmZzZXQjI19taW5fcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQkgICBzaG93X3B3bV8jI29mZnNldCwgc2V0X3B3bV8jI29mZnNldCkKKworZmFuX29mZnNldCgxKTsKK2Zhbl9vZmZzZXQoMik7CisKKworLyogVGVtcHMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgZXh0OworCWV4dCA9IG5yID09IDAgPworCSAgICAoKGRhdGEtPmV4dF90ZW1wW25yXSA+PiA2KSAmIDB4MykgKiAyIDoKKwkgICAgKCgoZGF0YS0+ZXh0X3RlbXBbbnJdID4+ICgobnIgLSAxKSAqIDMpKSAmIDcpKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFR19FWFQoZGF0YS0+dGVtcFtucl0sIGV4dCkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21pbltucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2NyaXRbbnJdKSk7Cit9CitzdGF0aWMgc3NpemVfdAorc2V0X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgLTU1MDAwLCBuciA9PSAwID8gMTI3NzUwIDogMTI3ODc1KTsKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9taW5bbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfVEVNUF9NSU4obnIpLAorCQkJICAgIGRhdGEtPnRlbXBfbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdAorc2V0X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgLTU1MDAwLCBuciA9PSAwID8gMTI3NzUwIDogMTI3ODc1KTsKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9tYXhbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfVEVNUF9NQVgobnIpLAorCQkJICAgIGRhdGEtPnRlbXBfbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdAorc2V0X3RlbXBfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIC01NTAwMCwgbnIgPT0gMCA/IDEyNzc1MCA6IDEyNzg3NSk7CisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfY3JpdFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWFkbTEwMzFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19URU1QX0NSSVQobnIpLAorCQkJICAgIGRhdGEtPnRlbXBfY3JpdFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHRlbXBfcmVnKG9mZnNldCkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXAoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCit9CQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKK30JCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXBfbWF4KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQjI19jcml0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfdGVtcF9jcml0KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzZXRfdGVtcF9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBzZXRfdGVtcF9tYXgoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfY3JpdCAoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJXAorewkJCQkJCQkJCQlcCisJcmV0dXJuIHNldF90ZW1wX2NyaXQoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wXyMjb2Zmc2V0LAkJXAorCQkgICBOVUxMKTsJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAorCQkgICBzaG93X3RlbXBfIyNvZmZzZXQjI19taW4sIHNldF90ZW1wXyMjb2Zmc2V0IyNfbWluKTsJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAkJCVwKKwkJICAgc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWF4LCBzZXRfdGVtcF8jI29mZnNldCMjX21heCk7CQlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfY3JpdCwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAorCQkgICBzaG93X3RlbXBfIyNvZmZzZXQjI19jcml0LCBzZXRfdGVtcF8jI29mZnNldCMjX2NyaXQpCisKK3RlbXBfcmVnKDEpOwordGVtcF9yZWcoMik7Cit0ZW1wX3JlZygzKTsKKworLyogQWxhcm1zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmFsYXJtKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOworCisKK3N0YXRpYyBpbnQgYWRtMTAzMV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBhZG0xMDMxX2RldGVjdCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19kZXRlY3QgKi8KK3N0YXRpYyBpbnQgYWRtMTAzMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpuYW1lID0gIiI7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRtMTAzMV9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYWRtMTAzMV9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmFkbTEwMzFfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCWlmIChraW5kIDwgMCkgeworCQlpbnQgaWQsIGNvOworCQlpZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCAweDNkKTsKKwkJY28gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgzZSk7CisKKwkJaWYgKCEoKGlkID09IDB4MzEgfHwgaWQgPT0gMHgzMCkgJiYgY28gPT0gMHg0MSkpCisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJa2luZCA9IChpZCA9PSAweDMwKSA/IGFkbTEwMzAgOiBhZG0xMDMxOworCX0KKworCWlmIChraW5kIDw9IDApCisJCWtpbmQgPSBhZG0xMDMxOworCisJLyogR2l2ZW4gdGhlIGRldGVjdGVkIGNoaXAgdHlwZSwgc2V0IHRoZSBjaGlwIG5hbWUgYW5kIHRoZQorCSAqIGF1dG8gZmFuIGNvbnRyb2wgaGVscGVyIHRhYmxlLiAqLworCWlmIChraW5kID09IGFkbTEwMzApIHsKKwkJbmFtZSA9ICJhZG0xMDMwIjsKKwkJZGF0YS0+Y2hhbl9zZWxlY3RfdGFibGUgPSAmYXV0b19jaGFubmVsX3NlbGVjdF90YWJsZV9hZG0xMDMwOworCX0gZWxzZSBpZiAoa2luZCA9PSBhZG0xMDMxKSB7CisJCW5hbWUgPSAiYWRtMTAzMSI7CisJCWRhdGEtPmNoYW5fc2VsZWN0X3RhYmxlID0gJmF1dG9fY2hhbm5lbF9zZWxlY3RfdGFibGVfYWRtMTAzMTsKKwl9CisJZGF0YS0+Y2hpcF90eXBlID0ga2luZDsKKworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBBRE0xMDMxIGNoaXAgKi8KKwlhZG0xMDMxX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hdXRvX2ZhbjFfY2hhbm5lbCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9jcml0KTsKKworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXV0b190ZW1wMV9vZmYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXV0b190ZW1wMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXV0b190ZW1wMV9tYXgpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hdXRvX3RlbXAyX29mZik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hdXRvX3RlbXAyX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hdXRvX3RlbXAyX21heCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2F1dG9fZmFuMV9taW5fcHdtKTsKKworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKworCWlmIChraW5kID09IGFkbTEwMzEpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJCQkgICAmZGV2X2F0dHJfYXV0b19mYW4yX2NoYW5uZWwpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfY3JpdCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXV0b190ZW1wM19vZmYpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2F1dG9fdGVtcDNfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hdXRvX3RlbXAzX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXV0b19mYW4yX21pbl9wd20pOworCX0KKworCXJldHVybiAwOworCitleGl0X2ZyZWU6CisJa2ZyZWUobmV3X2NsaWVudCk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYWRtMTAzMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJldDsKKwlpZiAoKHJldCA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpICE9IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWRtMTAzMV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXVuc2lnbmVkIGludCByZWFkX3ZhbDsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwltYXNrID0gKEFETTEwMzFfQ09ORjJfUFdNMV9FTkFCTEUgfCBBRE0xMDMxX0NPTkYyX1RBQ0gxX0VOQUJMRSk7CisJaWYgKGRhdGEtPmNoaXBfdHlwZSA9PSBhZG0xMDMxKSB7CisJCW1hc2sgfD0gKEFETTEwMzFfQ09ORjJfUFdNMl9FTkFCTEUgfAorCQkJQURNMTAzMV9DT05GMl9UQUNIMl9FTkFCTEUpOworCX0gCisJLyogSW5pdGlhbGl6ZSB0aGUgQURNMTAzMSBjaGlwIChlbmFibGVzIGZhbiBzcGVlZCByZWFkaW5nICkgKi8KKwlyZWFkX3ZhbCA9IGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0NPTkYyKTsKKwlpZiAoKHJlYWRfdmFsIHwgbWFzaykgIT0gcmVhZF92YWwpIHsKKwkgICAgYWRtMTAzMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0NPTkYyLCByZWFkX3ZhbCB8IG1hc2spOworCX0KKworCXJlYWRfdmFsID0gYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfQ09ORjEpOworCWlmICgocmVhZF92YWwgfCBBRE0xMDMxX0NPTkYxX01PTklUT1JfRU5BQkxFKSAhPSByZWFkX3ZhbCkgeworCSAgICBhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfQ09ORjEsIHJlYWRfdmFsIHwKKwkJCQlBRE0xMDMxX0NPTkYxX01PTklUT1JfRU5BQkxFKTsKKwl9CisKK30KKworc3RhdGljIHN0cnVjdCBhZG0xMDMxX2RhdGEgKmFkbTEwMzFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGNoYW47CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTdGFydGluZyBhZG0xMDMxIHVwZGF0ZVxuIik7CisJCWZvciAoY2hhbiA9IDA7CisJCSAgICAgY2hhbiA8ICgoZGF0YS0+Y2hpcF90eXBlID09IGFkbTEwMzEpID8gMyA6IDIpOyBjaGFuKyspIHsKKwkJCXU4IG9sZGgsIG5ld2g7CisKKwkJCW9sZGggPQorCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX1RFTVAoY2hhbikpOworCQkJZGF0YS0+ZXh0X3RlbXBbY2hhbl0gPQorCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0VYVF9URU1QKTsKKwkJCW5ld2ggPQorCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX1RFTVAoY2hhbikpOworCQkJaWYgKG5ld2ggIT0gb2xkaCkgeworCQkJCWRhdGEtPmV4dF90ZW1wW2NoYW5dID0KKwkJCQkgICAgYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgICAgICBBRE0xMDMxX1JFR19FWFRfVEVNUCk7CisjaWZkZWYgREVCVUcKKwkJCQlvbGRoID0KKwkJCQkgICAgYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgICAgICBBRE0xMDMxX1JFR19URU1QKGNoYW4pKTsKKworCQkJCS8qIG9sZGggaXMgYWN0dWFsbHkgbmV3ZXIgKi8KKwkJCQlpZiAobmV3aCAhPSBvbGRoKQorCQkJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsCisJCQkJCQkgIlJlbW90ZSB0ZW1wZXJhdHVyZSBtYXkgYmUgIgorCQkJCQkJICJ3cm9uZy5cbiIpOworI2VuZGlmCisJCQl9CisJCQlkYXRhLT50ZW1wW2NoYW5dID0gbmV3aDsKKworCQkJZGF0YS0+dGVtcF9taW5bY2hhbl0gPQorCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBBRE0xMDMxX1JFR19URU1QX01JTihjaGFuKSk7CisJCQlkYXRhLT50ZW1wX21heFtjaGFuXSA9CisJCQkgICAgYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIEFETTEwMzFfUkVHX1RFTVBfTUFYKGNoYW4pKTsKKwkJCWRhdGEtPnRlbXBfY3JpdFtjaGFuXSA9CisJCQkgICAgYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIEFETTEwMzFfUkVHX1RFTVBfQ1JJVChjaGFuKSk7CisJCQlkYXRhLT5hdXRvX3RlbXBbY2hhbl0gPQorCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBBRE0xMDMxX1JFR19BVVRPX1RFTVAoY2hhbikpOworCisJCX0KKworCQlkYXRhLT5jb25mMSA9IGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0NPTkYxKTsKKwkJZGF0YS0+Y29uZjIgPSBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19DT05GMik7CisKKwkJZGF0YS0+YWxhcm0gPSBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19TVEFUVVMoMCkpCisJCQkgICAgIHwgKGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX1NUQVRVUygxKSkKKwkJCQk8PCA4KTsKKwkJaWYgKGRhdGEtPmNoaXBfdHlwZSA9PSBhZG0xMDMwKSB7CisJCQlkYXRhLT5hbGFybSAmPSAweGMwZmY7CisJCX0KKwkJCisJCWZvciAoY2hhbj0wOyBjaGFuPChkYXRhLT5jaGlwX3R5cGUgPT0gYWRtMTAzMCA/IDEgOiAyKTsgY2hhbisrKSB7CisJCQlkYXRhLT5mYW5fZGl2W2NoYW5dID0KKwkJCSAgICBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19GQU5fRElWKGNoYW4pKTsKKwkJCWRhdGEtPmZhbl9taW5bY2hhbl0gPQorCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0ZBTl9NSU4oY2hhbikpOworCQkJZGF0YS0+ZmFuW2NoYW5dID0KKwkJCSAgICBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19GQU5fU1BFRUQoY2hhbikpOworCQkJZGF0YS0+cHdtW2NoYW5dID0KKwkJCSAgICAweGYgJiAoYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfUFdNKSA+PiAKKwkJCQkgICAoNCpjaGFuKSk7CisJCX0KKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19hZG0xMDMxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkbTEwMzFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfYWRtMTAzMV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkbTEwMzFfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxleGFuZHJlIGQnQWx0b24gPGFsZXhAYWxleGRhbHRvbi5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFETTEwMzEvQURNMTAzMCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19hZG0xMDMxX2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc19hZG0xMDMxX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYXNiMTAwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9hc2IxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjg5OTAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvYXNiMTAwLmMKQEAgLTAsMCArMSwxMDY2IEBACisvKgorICAgIGFzYjEwMC5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKwkgICAgICAgIG1vbml0b3JpbmcKKworICAgIENvcHlyaWdodCAoQykgMjAwNCBNYXJrIE0uIEhvZmZtYW4gPG1ob2ZmbWFuQGxpZ2h0bGluay5jb20+CisKKwkoZGVyaXZlZCBmcm9tIHc4Mzc4MWQuYykKKworICAgIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMDMgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCisgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwgYW5kCisgICAgTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBoYXJkd2FyZSBzZW5zb3IgY2hpcHM6IEFzdXMgQVNCMTAwIGFuZAorICAgIEFTQjEwMC1BICJCQUNIIi4KKworICAgIEFTQjEwMC1BIHN1cHBvcnRzIHB3bTEsIHdoaWxlIHBsYWluIEFTQjEwMCBkb2VzIG5vdC4gIFRoZXJlIGlzIG5vIGtub3duCisgICAgd2F5IGZvciB0aGUgZHJpdmVyIHRvIHRlbGwgd2hpY2ggb25lIGlzIHRoZXJlLgorCisgICAgQ2hpcAkjdmluCSNmYW5pbgkjcHdtCSN0ZW1wCXdjaGlwaWQJdmVuZGlkCWkyYwlJU0EKKyAgICBhc2IxMDAJNwkzCTEJNAkweDMxCTB4MDY5NAl5ZXMJbm8KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAibG03NS5oIgorCisvKgorCUhJU1RPUlk6CisJMjAwMy0xMi0yOQkxLjAuMAlQb3J0ZWQgZnJvbSBsbV9zZW5zb3JzIHByb2plY3QgZm9yIGtlcm5lbCAyLjYKKyovCisjZGVmaW5lIEFTQjEwMF9WRVJTSU9OICIxLjAuMCIKKworLyogSTJDIGFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJkLCBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBJU0EgYWRkcmVzc2VzIHRvIHNjYW4gKG5vbmUpICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8xKGFzYjEwMCk7CitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKKwkie2J1cywgY2xpZW50YWRkciwgc3ViY2xpZW50YWRkcjEsIHN1YmNsaWVudGFkZHIyfSIpOworCisvKiBWb2x0YWdlIElOIHJlZ2lzdGVycyAwLTYgKi8KKyNkZWZpbmUgQVNCMTAwX1JFR19JTihucikJKDB4MjAgKyAobnIpKQorI2RlZmluZSBBU0IxMDBfUkVHX0lOX01BWChucikJKDB4MmIgKyAobnIgKiAyKSkKKyNkZWZpbmUgQVNCMTAwX1JFR19JTl9NSU4obnIpCSgweDJjICsgKG5yICogMikpCisKKy8qIEZBTiBJTiByZWdpc3RlcnMgMS0zICovCisjZGVmaW5lIEFTQjEwMF9SRUdfRkFOKG5yKQkoMHgyOCArIChucikpCisjZGVmaW5lIEFTQjEwMF9SRUdfRkFOX01JTihucikJKDB4M2IgKyAobnIpKQorCisvKiBURU1QRVJBVFVSRSByZWdpc3RlcnMgMS00ICovCitzdGF0aWMgY29uc3QgdTE2IGFzYjEwMF9yZWdfdGVtcFtdCT0gezAsIDB4MjcsIDB4MTUwLCAweDI1MCwgMHgxN307CitzdGF0aWMgY29uc3QgdTE2IGFzYjEwMF9yZWdfdGVtcF9tYXhbXQk9IHswLCAweDM5LCAweDE1NSwgMHgyNTUsIDB4MTh9Oworc3RhdGljIGNvbnN0IHUxNiBhc2IxMDBfcmVnX3RlbXBfaHlzdFtdCT0gezAsIDB4M2EsIDB4MTUzLCAweDI1MywgMHgxOX07CisKKyNkZWZpbmUgQVNCMTAwX1JFR19URU1QKG5yKSAoYXNiMTAwX3JlZ190ZW1wW25yXSkKKyNkZWZpbmUgQVNCMTAwX1JFR19URU1QX01BWChucikgKGFzYjEwMF9yZWdfdGVtcF9tYXhbbnJdKQorI2RlZmluZSBBU0IxMDBfUkVHX1RFTVBfSFlTVChucikgKGFzYjEwMF9yZWdfdGVtcF9oeXN0W25yXSkKKworI2RlZmluZSBBU0IxMDBfUkVHX1RFTVAyX0NPTkZJRwkweDAxNTIKKyNkZWZpbmUgQVNCMTAwX1JFR19URU1QM19DT05GSUcJMHgwMjUyCisKKworI2RlZmluZSBBU0IxMDBfUkVHX0NPTkZJRwkweDQwCisjZGVmaW5lIEFTQjEwMF9SRUdfQUxBUk0xCTB4NDEKKyNkZWZpbmUgQVNCMTAwX1JFR19BTEFSTTIJMHg0MgorI2RlZmluZSBBU0IxMDBfUkVHX1NNSU0xCTB4NDMKKyNkZWZpbmUgQVNCMTAwX1JFR19TTUlNMgkweDQ0CisjZGVmaW5lIEFTQjEwMF9SRUdfVklEX0ZBTkRJVgkweDQ3CisjZGVmaW5lIEFTQjEwMF9SRUdfSTJDX0FERFIJMHg0OAorI2RlZmluZSBBU0IxMDBfUkVHX0NISVBJRAkweDQ5CisjZGVmaW5lIEFTQjEwMF9SRUdfSTJDX1NVQkFERFIJMHg0YQorI2RlZmluZSBBU0IxMDBfUkVHX1BJTgkJMHg0YgorI2RlZmluZSBBU0IxMDBfUkVHX0lSUQkJMHg0YworI2RlZmluZSBBU0IxMDBfUkVHX0JBTksJCTB4NGUKKyNkZWZpbmUgQVNCMTAwX1JFR19DSElQTUFOCTB4NGYKKworI2RlZmluZSBBU0IxMDBfUkVHX1dDSElQSUQJMHg1OAorCisvKiBiaXQgNyAtPiBlbmFibGUsIGJpdHMgMC0zIC0+IGR1dHkgY3ljbGUgKi8KKyNkZWZpbmUgQVNCMTAwX1JFR19QV00xCQkweDU5CisKKy8qIENPTlZFUlNJT05TCisgICBSb3VuZGluZyBhbmQgbGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcgdmFyaWFudHMuICovCisKKy8qIFRoZXNlIGNvbnN0YW50cyBhcmUgYSBndWVzcywgY29uc2lzdGVudCB3LyB3ODM3ODFkICovCisjZGVmaW5lIEFTQjEwMF9JTl9NSU4gKCAgIDApCisjZGVmaW5lIEFTQjEwMF9JTl9NQVggKDQwODApCisKKy8qIElOOiAxLzEwMDAgViAoMFYgdG8gNC4wOFYpCisgICBSRUc6IDE2bVYvYml0ICovCitzdGF0aWMgdTggSU5fVE9fUkVHKHVuc2lnbmVkIHZhbCkKK3sKKwl1bnNpZ25lZCBudmFsID0gU0VOU09SU19MSU1JVCh2YWwsIEFTQjEwMF9JTl9NSU4sIEFTQjEwMF9JTl9NQVgpOworCXJldHVybiAobnZhbCArIDgpIC8gMTY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBJTl9GUk9NX1JFRyh1OCByZWcpCit7CisJcmV0dXJuIHJlZyAqIDE2OworfQorCitzdGF0aWMgdTggRkFOX1RPX1JFRyhsb25nIHJwbSwgaW50IGRpdikKK3sKKwlpZiAocnBtID09IC0xKQorCQlyZXR1cm4gMDsKKwlpZiAocnBtID09IDApCisJCXJldHVybiAyNTU7CisJcnBtID0gU0VOU09SU19MSU1JVChycG0sIDEsIDEwMDAwMDApOworCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwgMjU0KTsKK30KKworc3RhdGljIGludCBGQU5fRlJPTV9SRUcodTggdmFsLCBpbnQgZGl2KQoreworCXJldHVybiB2YWw9PTAgPyAtMSA6IHZhbD09MjU1ID8gMCA6IDEzNTAwMDAvKHZhbCpkaXYpOworfQorCisvKiBUaGVzZSBjb25zdGFudHMgYXJlIGEgZ3Vlc3MsIGNvbnNpc3RlbnQgdy8gdzgzNzgxZCAqLworI2RlZmluZSBBU0IxMDBfVEVNUF9NSU4gKC0xMjgwMDApCisjZGVmaW5lIEFTQjEwMF9URU1QX01BWCAoIDEyNzAwMCkKKworLyogVEVNUDogMC4wMDFDL2JpdCAoLTEyOEMgdG8gKzEyN0MpCisgICBSRUc6IDFDL2JpdCwgdHdvJ3MgY29tcGxlbWVudCAqLworc3RhdGljIHU4IFRFTVBfVE9fUkVHKGludCB0ZW1wKQoreworCWludCBudGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgQVNCMTAwX1RFTVBfTUlOLCBBU0IxMDBfVEVNUF9NQVgpOworCW50ZW1wICs9IChudGVtcDwwID8gLTUwMCA6IDUwMCk7CisJcmV0dXJuICh1OCkobnRlbXAgLyAxMDAwKTsKK30KKworc3RhdGljIGludCBURU1QX0ZST01fUkVHKHU4IHJlZykKK3sKKwlyZXR1cm4gKHM4KXJlZyAqIDEwMDA7Cit9CisKKy8qIFBXTTogMCAtIDI1NSBwZXIgc2Vuc29ycyBkb2N1bWVudGF0aW9uCisgICBSRUc6ICg2LjI1JSBkdXR5IGN5Y2xlIHBlciBiaXQpICovCitzdGF0aWMgdTggQVNCMTAwX1BXTV9UT19SRUcoaW50IHB3bSkKK3sKKwlwd20gPSBTRU5TT1JTX0xJTUlUKHB3bSwgMCwgMjU1KTsKKwlyZXR1cm4gKHU4KShwd20gLyAxNik7Cit9CisKK3N0YXRpYyBpbnQgQVNCMTAwX1BXTV9GUk9NX1JFRyh1OCByZWcpCit7CisJcmV0dXJuIHJlZyAqIDE2OworfQorCisjZGVmaW5lIEFMQVJNU19GUk9NX1JFRyh2YWwpICh2YWwpCisKKyNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkgKDEgPDwgKHZhbCkpCisKKy8qIEZBTiBESVY6IDEsIDIsIDQsIG9yIDggKGRlZmF1bHRzIHRvIDIpCisgICBSRUc6IDAsIDEsIDIsIG9yIDMgKHJlc3BlY3RpdmVseSkgKGRlZmF1bHRzIHRvIDEpICovCitzdGF0aWMgdTggRElWX1RPX1JFRyhsb25nIHZhbCkKK3sKKwlyZXR1cm4gdmFsPT04ID8gMyA6IHZhbD09NCA/IDIgOiB2YWw9PTEgPyAwIDogMTsKK30KKworLyogRm9yIGVhY2ggcmVnaXN0ZXJlZCBjbGllbnQsIHdlIG5lZWQgdG8ga2VlcCBzb21lIGRhdGEgaW4gbWVtb3J5LiBUaGF0CisgICBkYXRhIGlzIHBvaW50ZWQgdG8gYnkgY2xpZW50LT5kYXRhLiBUaGUgc3RydWN0dXJlIGl0c2VsZiBpcworICAgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHRoZSBjbGllbnQgaXRzZWxmIGlzIGFsbG9jYXRlZC4gKi8KK3N0cnVjdCBhc2IxMDBfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwllbnVtIGNoaXBzIHR5cGU7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisKKwkvKiBhcnJheSBvZiAyIHBvaW50ZXJzIHRvIHN1YmNsaWVudHMgKi8KKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbG03NVsyXTsKKworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1OCBpbls3XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bN107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX21pblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTE2IHRlbXBbNF07CQkvKiBSZWdpc3RlciB2YWx1ZSAoMCBhbmQgMyBhcmUgdTggb25seSkgKi8KKwl1MTYgdGVtcF9tYXhbNF07CS8qIFJlZ2lzdGVyIHZhbHVlICgwIGFuZCAzIGFyZSB1OCBvbmx5KSAqLworCXUxNiB0ZW1wX2h5c3RbNF07CS8qIFJlZ2lzdGVyIHZhbHVlICgwIGFuZCAzIGFyZSB1OCBvbmx5KSAqLworCXU4IGZhbl9kaXZbM107CQkvKiBSZWdpc3RlciBlbmNvZGluZywgcmlnaHQganVzdGlmaWVkICovCisJdTggcHdtOwkJCS8qIFJlZ2lzdGVyIGVuY29kaW5nICovCisJdTggdmlkOwkJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCXUzMiBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1OCB2cm07Cit9OworCitzdGF0aWMgaW50IGFzYjEwMF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiByZWcpOworc3RhdGljIHZvaWQgYXNiMTAwX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiByZWcsIHUxNiB2YWwpOworCitzdGF0aWMgaW50IGFzYjEwMF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBhc2IxMDBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgYXNiMTAwX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgc3RydWN0IGFzYjEwMF9kYXRhICphc2IxMDBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYXNiMTAwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYXNiMTAwX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImFzYjEwMCIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9BU0IxMDAsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gYXNiMTAwX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gYXNiMTAwX2RldGFjaF9jbGllbnQsCit9OworCisvKiA3IFZvbHRhZ2VzICovCisjZGVmaW5lIHNob3dfaW5fcmVnKHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgXAoreyBcCisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gYXNiMTAwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5yZWdbbnJdKSk7IFwKK30KKworc2hvd19pbl9yZWcoaW4pCitzaG93X2luX3JlZyhpbl9taW4pCitzaG93X2luX3JlZyhpbl9tYXgpCisKKyNkZWZpbmUgc2V0X2luX3JlZyhSRUcsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2V0X2luXyMjcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJCXNpemVfdCBjb3VudCwgaW50IG5yKSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPmluXyMjcmVnW25yXSA9IElOX1RPX1JFRyh2YWwpOyBcCisJYXNiMTAwX3dyaXRlX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19JTl8jI1JFRyhuciksIFwKKwkJZGF0YS0+aW5fIyNyZWdbbnJdKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30KKworc2V0X2luX3JlZyhNSU4sIG1pbikKK3NldF9pbl9yZWcoTUFYLCBtYXgpCisKKyNkZWZpbmUgc3lzZnNfaW4ob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBcCisJc2hvd19pbiMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgXAorCQlzaG93X2luIyNvZmZzZXQsIE5VTEwpOyBcCitzdGF0aWMgc3NpemVfdCBcCisJc2hvd19pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfaW5fbWluKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IFwKKwlzaG93X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19pbl9tYXgoZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHNldF9pbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19pbiMjb2Zmc2V0IyNfbWluLCBzZXRfaW4jI29mZnNldCMjX21pbik7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKKworc3lzZnNfaW4oMCk7CitzeXNmc19pbigxKTsKK3N5c2ZzX2luKDIpOworc3lzZnNfaW4oMyk7CitzeXNmc19pbig0KTsKK3N5c2ZzX2luKDUpOworc3lzZnNfaW4oNik7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2luKGNsaWVudCwgb2Zmc2V0KSBkbyB7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI29mZnNldCMjX2lucHV0KTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjb2Zmc2V0IyNfbWluKTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjb2Zmc2V0IyNfbWF4KTsgXAorfSB3aGlsZSAoMCkKKworLyogMyBGYW5zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bbnJdLAorCQlESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKKwkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBhc2IxMDBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKHZhbCwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJYXNiMTAwX3dyaXRlX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19GQU5fTUlOKG5yKSwgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcworICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCisgICBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKKyAgIGJlY2F1c2UgdGhlIGRpdmlzb3IgY2hhbmdlZC4gKi8KK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyBtaW47CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpbnQgcmVnOworCQorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCW1pbiA9IEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKKwkJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX1RPX1JFRyh2YWwpOworCisJc3dpdGNoKG5yKSB7CisJY2FzZSAwOgkvKiBmYW4gMSAqLworCQlyZWcgPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfVklEX0ZBTkRJVik7CisJCXJlZyA9IChyZWcgJiAweGNmKSB8IChkYXRhLT5mYW5fZGl2WzBdIDw8IDQpOworCQlhc2IxMDBfd3JpdGVfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1ZJRF9GQU5ESVYsIHJlZyk7CisJCWJyZWFrOworCisJY2FzZSAxOgkvKiBmYW4gMiAqLworCQlyZWcgPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfVklEX0ZBTkRJVik7CisJCXJlZyA9IChyZWcgJiAweDNmKSB8IChkYXRhLT5mYW5fZGl2WzFdIDw8IDYpOworCQlhc2IxMDBfd3JpdGVfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1ZJRF9GQU5ESVYsIHJlZyk7CisJCWJyZWFrOworCisJY2FzZSAyOgkvKiBmYW4gMyAqLworCQlyZWcgPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfUElOKTsKKwkJcmVnID0gKHJlZyAmIDB4M2YpIHwgKGRhdGEtPmZhbl9kaXZbMl0gPDwgNik7CisJCWFzYjEwMF93cml0ZV92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfUElOLCByZWcpOworCQlicmVhazsKKwl9CisKKwlkYXRhLT5mYW5fbWluW25yXSA9CisJCUZBTl9UT19SRUcobWluLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwlhc2IxMDBfd3JpdGVfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX0ZBTl9NSU4obnIpLCBkYXRhLT5mYW5fbWluW25yXSk7CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX2ZhbihvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfZmFuX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW4jI29mZnNldCMjX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X2ZhbiMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJCQkJCXNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHNldF9mYW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X2ZhbiMjb2Zmc2V0IyNfZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJCQkJCXNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHNldF9mYW5fZGl2KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwkJc2hvd19mYW4jI29mZnNldCwgTlVMTCk7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19mYW4jI29mZnNldCMjX21pbiwgc2V0X2ZhbiMjb2Zmc2V0IyNfbWluKTsgXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X2ZhbiMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuIyNvZmZzZXQjI19kaXYpOworCitzeXNmc19mYW4oMSk7CitzeXNmc19mYW4oMik7CitzeXNmc19mYW4oMyk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihjbGllbnQsIG9mZnNldCkgZG8geyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfaW5wdXQpOyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfbWluKTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI29mZnNldCMjX2Rpdik7IFwKK30gd2hpbGUgKDApCisKKy8qIDQgVGVtcC4gU2Vuc29ycyAqLworc3RhdGljIGludCBzcHJpbnRmX3RlbXBfZnJvbV9yZWcodTE2IHJlZywgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKG5yKSB7CisJY2FzZSAxOiBjYXNlIDI6CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIExNNzVfVEVNUF9GUk9NX1JFRyhyZWcpKTsKKwkJYnJlYWs7CisJY2FzZSAwOiBjYXNlIDM6IGRlZmF1bHQ6CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcocmVnKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCQkgCQorI2RlZmluZSBzaG93X3RlbXBfcmVnKHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSBcCit7IFwKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBhc2IxMDBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGZfdGVtcF9mcm9tX3JlZyhkYXRhLT5yZWdbbnJdLCBidWYsIG5yKTsgXAorfQorCitzaG93X3RlbXBfcmVnKHRlbXApOworc2hvd190ZW1wX3JlZyh0ZW1wX21heCk7CitzaG93X3RlbXBfcmVnKHRlbXBfaHlzdCk7CisKKyNkZWZpbmUgc2V0X3RlbXBfcmVnKFJFRywgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfIyNyZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwkJCXNpemVfdCBjb3VudCwgaW50IG5yKSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXN3aXRjaCAobnIpIHsgXAorCWNhc2UgMTogY2FzZSAyOiBcCisJCWRhdGEtPnJlZ1tucl0gPSBMTTc1X1RFTVBfVE9fUkVHKHZhbCk7IFwKKwkJYnJlYWs7IFwKKwljYXNlIDA6IGNhc2UgMzogZGVmYXVsdDogXAorCQlkYXRhLT5yZWdbbnJdID0gVEVNUF9UT19SRUcodmFsKTsgXAorCQlicmVhazsgXAorCX0gXAorCWFzYjEwMF93cml0ZV92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfVEVNUF8jI1JFRyhucisxKSwgXAorCQkJZGF0YS0+cmVnW25yXSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CisKK3NldF90ZW1wX3JlZyhNQVgsIHRlbXBfbWF4KTsKK3NldF90ZW1wX3JlZyhIWVNULCB0ZW1wX2h5c3QpOworCisjZGVmaW5lIHN5c2ZzX3RlbXAobnVtKSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI251bShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfdGVtcChkZXYsIGJ1ZiwgbnVtLTEpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNudW0jI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wIyNudW0sIE5VTEwpOyBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWF4IyNudW0oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X3RlbXBfbWF4KGRldiwgYnVmLCBudW0tMSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWF4IyNudW0oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwkJCQkJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc2V0X3RlbXBfbWF4KGRldiwgYnVmLCBjb3VudCwgbnVtLTEpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNudW0jI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfdGVtcF9tYXgjI251bSwgc2V0X3RlbXBfbWF4IyNudW0pOyBcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfaHlzdCMjbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd190ZW1wX2h5c3QoZGV2LCBidWYsIG51bS0xKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0IyNudW0oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwkJCQkJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc2V0X3RlbXBfaHlzdChkZXYsIGJ1ZiwgY291bnQsIG51bS0xKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjbnVtIyNfbWF4X2h5c3QsIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfdGVtcF9oeXN0IyNudW0sIHNldF90ZW1wX2h5c3QjI251bSk7CisKK3N5c2ZzX3RlbXAoMSk7CitzeXNmc190ZW1wKDIpOworc3lzZnNfdGVtcCgzKTsKK3N5c2ZzX3RlbXAoNCk7CisKKy8qIFZJRCAqLworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChjbGllbnQsIG51bSkgZG8geyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI251bSMjX2lucHV0KTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNudW0jI19tYXgpOyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI251bSMjX21heF9oeXN0KTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHNzaXplX3Qgc2hvd192aWQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gYXNiMTAwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCwgZGF0YS0+dnJtKSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjcHUwX3ZpZCwgU19JUlVHTywgc2hvd192aWQsIE5VTEwpOworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdmlkKGNsaWVudCkgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NwdTBfdmlkKQorCisvKiBWUk0gKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnZybSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF92cm0oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJZGF0YS0+dnJtID0gdmFsOworCXJldHVybiBjb3VudDsKK30KKworLyogQWxhcm1zICovCitzdGF0aWMgREVWSUNFX0FUVFIodnJtLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192cm0sIHNldF92cm0pOworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdnJtKGNsaWVudCkgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3ZybSk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEFMQVJNU19GUk9NX1JFRyhkYXRhLT5hbGFybXMpKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKGNsaWVudCkgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcykKKworLyogMSBQV00gKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtMShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBhc2IxMDBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBBU0IxMDBfUFdNX0ZST01fUkVHKGRhdGEtPnB3bSAmIDB4MGYpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bTEoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtICY9IDB4ODA7IC8qIGtlZXAgdGhlIGVuYWJsZSBiaXQgKi8KKwlkYXRhLT5wd20gfD0gKDB4MGYgJiBBU0IxMDBfUFdNX1RPX1JFRyh2YWwpKTsKKwlhc2IxMDBfd3JpdGVfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX1BXTTEsIGRhdGEtPnB3bSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZTEoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gYXNiMTAwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGRhdGEtPnB3bSAmIDB4ODApID8gMSA6IDApOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2VuYWJsZTEoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd20gJj0gMHgwZjsgLyoga2VlcCB0aGUgZHV0eSBjeWNsZSBiaXRzICovCisJZGF0YS0+cHdtIHw9ICh2YWwgPyAweDgwIDogMHgwMCk7CisJYXNiMTAwX3dyaXRlX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19QV00xLCBkYXRhLT5wd20pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocHdtMSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtMSwgc2V0X3B3bTEpOworc3RhdGljIERFVklDRV9BVFRSKHB3bTFfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJc2hvd19wd21fZW5hYmxlMSwgc2V0X3B3bV9lbmFibGUxKTsKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3B3bTEoY2xpZW50KSBkbyB7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTEpOyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xX2VuYWJsZSk7IFwKK30gd2hpbGUgKDApCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW46CisJYXNiMTAwX2RyaXZlciBpcyBpbnNlcnRlZCAod2hlbiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQpLCBmb3IgZWFjaAorCQlhdmFpbGFibGUgYWRhcHRlcgorCXdoZW4gYSBuZXcgYWRhcHRlciBpcyBpbnNlcnRlZCAoYW5kIGFzYjEwMF9kcml2ZXIgaXMgc3RpbGwgcHJlc2VudCkKKyAqLworc3RhdGljIGludCBhc2IxMDBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgYXNiMTAwX2RldGVjdCk7Cit9CisKK3N0YXRpYyBpbnQgYXNiMTAwX2RldGVjdF9zdWJjbGllbnRzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsCisJCWludCBraW5kLCBzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCkKK3sKKwlpbnQgaSwgaWQsIGVycjsKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCk7CisKKwlkYXRhLT5sbTc1WzBdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIShkYXRhLT5sbTc1WzBdKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SX1NDXzA7CisJfQorCW1lbXNldChkYXRhLT5sbTc1WzBdLCAweDAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKKworCWRhdGEtPmxtNzVbMV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmICghKGRhdGEtPmxtNzVbMV0pKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gRVJST1JfU0NfMTsKKwl9CisJbWVtc2V0KGRhdGEtPmxtNzVbMV0sIDB4MDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCisJaWQgPSBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKTsKKworCWlmIChmb3JjZV9zdWJjbGllbnRzWzBdID09IGlkICYmIGZvcmNlX3N1YmNsaWVudHNbMV0gPT0gYWRkcmVzcykgeworCQlmb3IgKGkgPSAyOyBpIDw9IDM7IGkrKykgeworCQkJaWYgKGZvcmNlX3N1YmNsaWVudHNbaV0gPCAweDQ4IHx8CisJCQkgICAgZm9yY2Vfc3ViY2xpZW50c1tpXSA+IDB4NGYpIHsKKwkJCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsICJpbnZhbGlkIHN1YmNsaWVudCAiCisJCQkJCSJhZGRyZXNzICVkOyBtdXN0IGJlIDB4NDgtMHg0ZlxuIiwKKwkJCQkJZm9yY2Vfc3ViY2xpZW50c1tpXSk7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIEVSUk9SX1NDXzI7CisJCQl9CisJCX0KKwkJYXNiMTAwX3dyaXRlX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfSTJDX1NVQkFERFIsCisJCQkJCShmb3JjZV9zdWJjbGllbnRzWzJdICYgMHgwNykgfAorCQkJCQkoKGZvcmNlX3N1YmNsaWVudHNbM10gJiAweDA3KSA8PDQpKTsKKwkJZGF0YS0+bG03NVswXS0+YWRkciA9IGZvcmNlX3N1YmNsaWVudHNbMl07CisJCWRhdGEtPmxtNzVbMV0tPmFkZHIgPSBmb3JjZV9zdWJjbGllbnRzWzNdOworCX0gZWxzZSB7CisJCWludCB2YWwgPSBhc2IxMDBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX0kyQ19TVUJBRERSKTsKKwkJZGF0YS0+bG03NVswXS0+YWRkciA9IDB4NDggKyAodmFsICYgMHgwNyk7CisJCWRhdGEtPmxtNzVbMV0tPmFkZHIgPSAweDQ4ICsgKCh2YWwgPj4gNCkgJiAweDA3KTsKKwl9CisKKwlpZihkYXRhLT5sbTc1WzBdLT5hZGRyID09IGRhdGEtPmxtNzVbMV0tPmFkZHIpIHsKKwkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAiZHVwbGljYXRlIGFkZHJlc3NlcyAweCV4ICIKKwkJCQkiZm9yIHN1YmNsaWVudHNcbiIsIGRhdGEtPmxtNzVbMF0tPmFkZHIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIEVSUk9SX1NDXzI7CisJfQorCisJZm9yIChpID0gMDsgaSA8PSAxOyBpKyspIHsKKwkJaTJjX3NldF9jbGllbnRkYXRhKGRhdGEtPmxtNzVbaV0sIE5VTEwpOworCQlkYXRhLT5sbTc1W2ldLT5hZGFwdGVyID0gYWRhcHRlcjsKKwkJZGF0YS0+bG03NVtpXS0+ZHJpdmVyID0gJmFzYjEwMF9kcml2ZXI7CisJCWRhdGEtPmxtNzVbaV0tPmZsYWdzID0gMDsKKwkJc3RybGNweShkYXRhLT5sbTc1W2ldLT5uYW1lLCAiYXNiMTAwIHN1YmNsaWVudCIsIEkyQ19OQU1FX1NJWkUpOworCX0KKworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoZGF0YS0+bG03NVswXSkpKSB7CisJCWRldl9lcnIoJm5ld19jbGllbnQtPmRldiwgInN1YmNsaWVudCAlZCByZWdpc3RyYXRpb24gIgorCQkJImF0IGFkZHJlc3MgMHgleCBmYWlsZWQuXG4iLCBpLCBkYXRhLT5sbTc1WzBdLT5hZGRyKTsKKwkJZ290byBFUlJPUl9TQ18yOworCX0KKworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoZGF0YS0+bG03NVsxXSkpKSB7CisJCWRldl9lcnIoJm5ld19jbGllbnQtPmRldiwgInN1YmNsaWVudCAlZCByZWdpc3RyYXRpb24gIgorCQkJImF0IGFkZHJlc3MgMHgleCBmYWlsZWQuXG4iLCBpLCBkYXRhLT5sbTc1WzFdLT5hZGRyKTsKKwkJZ290byBFUlJPUl9TQ18zOworCX0KKworCXJldHVybiAwOworCisvKiBVbmRvIGluaXRzIGluIGNhc2Ugb2YgZXJyb3JzICovCitFUlJPUl9TQ18zOgorCWkyY19kZXRhY2hfY2xpZW50KGRhdGEtPmxtNzVbMF0pOworRVJST1JfU0NfMjoKKwlrZnJlZShkYXRhLT5sbTc1WzFdKTsKK0VSUk9SX1NDXzE6CisJa2ZyZWUoZGF0YS0+bG03NVswXSk7CitFUlJPUl9TQ18wOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYXNiMTAwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YTsKKworCS8qIGFzYjEwMCBpcyBTTUJ1cyBvbmx5ICovCisJaWYgKGkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkgeworCQlwcl9kZWJ1ZygiYXNiMTAwLm86IGRldGVjdCBmYWlsZWQsICIKKwkJCQkiY2Fubm90IGF0dGFjaCB0byBsZWdhY3kgYWRhcHRlciFcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIEVSUk9SMDsKKwl9CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKKwkJcHJfZGVidWcoImFzYjEwMC5vOiBkZXRlY3QgZmFpbGVkLCAiCisJCQkJInNtYnVzIGJ5dGUgZGF0YSBub3Qgc3VwcG9ydGVkIVxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gRVJST1IwOworCX0KKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgYXNiMTAwX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXNiMTAwX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJcHJfZGVidWcoImFzYjEwMC5vOiBkZXRlY3QgZmFpbGVkLCBrbWFsbG9jIGZhaWxlZCFcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SMDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYXNiMTAwX2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWluaXRfTVVURVgoJmRhdGEtPmxvY2spOworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmYXNiMTAwX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLworCisJLyogVGhlIGNoaXAgbWF5IGJlIHN0dWNrIGluIHNvbWUgb3RoZXIgYmFuayB0aGFuIGJhbmsgMC4gVGhpcyBtYXkKKwkgICBtYWtlIHJlYWRpbmcgb3RoZXIgaW5mb3JtYXRpb24gaW1wb3NzaWJsZS4gU3BlY2lmeSBhIGZvcmNlPS4uLiBvcgorCSAgIGZvcmNlXyo9Li4uIHBhcmFtZXRlciwgYW5kIHRoZSBjaGlwIHdpbGwgYmUgcmVzZXQgdG8gdGhlIHJpZ2h0CisJICAgYmFuay4gKi8KKwlpZiAoa2luZCA8IDApIHsKKworCQlpbnQgdmFsMSA9IGFzYjEwMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfQkFOSyk7CisJCWludCB2YWwyID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19DSElQTUFOKTsKKworCQkvKiBJZiB3ZSdyZSBpbiBiYW5rIDAgKi8KKwkJaWYgKCAoISh2YWwxICYgMHgwNykpICYmCisJCQkJLyogQ2hlY2sgZm9yIEFTQjEwMCBJRCAobG93IGJ5dGUpICovCisJCQkJKCAoKCEodmFsMSAmIDB4ODApKSAmJiAodmFsMiAhPSAweDk0KSkgfHwKKwkJCQkvKiBDaGVjayBmb3IgQVNCMTAwIElEIChoaWdoIGJ5dGUgKSAqLworCQkJCSgodmFsMSAmIDB4ODApICYmICh2YWwyICE9IDB4MDYpKSApICkgeworCQkJcHJfZGVidWcoImFzYjEwMC5vOiBkZXRlY3QgZmFpbGVkLCAiCisJCQkJCSJiYWQgY2hpcCBpZCAweCUwMnghXG4iLCB2YWwyKTsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIEVSUk9SMTsKKwkJfQorCisJfSAvKiBraW5kIDwgMCAqLworCisJLyogV2UgaGF2ZSBlaXRoZXIgaGFkIGEgZm9yY2UgcGFyYW1ldGVyLCBvciB3ZSBoYXZlIGFscmVhZHkgZGV0ZWN0ZWQKKwkgICBXaW5ib25kLiBQdXQgaXQgbm93IGludG8gYmFuayAwIGFuZCBWZW5kb3IgSUQgSGlnaCBCeXRlICovCisJYXNiMTAwX3dyaXRlX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfQkFOSywKKwkJKGFzYjEwMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfQkFOSykgJiAweDc4KSB8IDB4ODApOworCisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCisJaWYgKGtpbmQgPD0gMCkgeworCQlpbnQgdmFsMSA9IGFzYjEwMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfV0NISVBJRCk7CisJCWludCB2YWwyID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19DSElQTUFOKTsKKworCQlpZiAoKHZhbDEgPT0gMHgzMSkgJiYgKHZhbDIgPT0gMHgwNikpCisJCQlraW5kID0gYXNiMTAwOworCQllbHNlIHsKKwkJCWlmIChraW5kID09IDApCisJCQkJZGV2X3dhcm4oJm5ld19jbGllbnQtPmRldiwgImlnbm9yaW5nICIKKwkJCQkJIidmb3JjZScgcGFyYW1ldGVyIGZvciB1bmtub3duIGNoaXAgIgorCQkJCQkiYXQgYWRhcHRlciAlZCwgYWRkcmVzcyAweCUwMnguXG4iLAorCQkJCQlpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgYWRkcmVzcyk7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBFUlJPUjE7CisJCX0KKwl9CisKKwkvKiBGaWxsIGluIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJhc2IxMDAiLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT50eXBlID0ga2luZDsKKworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gRVJST1IxOworCisJLyogQXR0YWNoIHNlY29uZGFyeSBsbTc1IGNsaWVudHMgKi8KKwlpZiAoKGVyciA9IGFzYjEwMF9kZXRlY3Rfc3ViY2xpZW50cyhhZGFwdGVyLCBhZGRyZXNzLCBraW5kLAorCQkJbmV3X2NsaWVudCkpKQorCQlnb3RvIEVSUk9SMjsKKworCS8qIEluaXRpYWxpemUgdGhlIGNoaXAgKi8KKwlhc2IxMDBfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBBIGZldyB2YXJzIG5lZWQgdG8gYmUgZmlsbGVkIHVwb24gc3RhcnR1cCAqLworCWRhdGEtPmZhbl9taW5bMF0gPSBhc2IxMDBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX0ZBTl9NSU4oMCkpOworCWRhdGEtPmZhbl9taW5bMV0gPSBhc2IxMDBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX0ZBTl9NSU4oMSkpOworCWRhdGEtPmZhbl9taW5bMl0gPSBhc2IxMDBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX0ZBTl9NSU4oMikpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDQpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA1KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgNik7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAzKTsKKworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDMpOworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDQpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChuZXdfY2xpZW50KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfdnJtKG5ld19jbGllbnQpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2FsYXJtcyhuZXdfY2xpZW50KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9wd20xKG5ld19jbGllbnQpOworCisJcmV0dXJuIDA7CisKK0VSUk9SMjoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKK0VSUk9SMToKKwlrZnJlZShkYXRhKTsKK0VSUk9SMDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFzYjEwMF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkOyAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KT09TlVMTCkgeworCQkvKiBzdWJjbGllbnRzICovCisJCWtmcmVlKGNsaWVudCk7CisJfSBlbHNlIHsKKwkJLyogbWFpbiBjbGllbnQgKi8KKwkJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBUaGUgU01CdXMgbG9ja3MgaXRzZWxmLCB1c3VhbGx5LCBidXQgbm90aGluZyBtYXkgYWNjZXNzIHRoZSBjaGlwIGJldHdlZW4KKyAgIGJhbmsgc3dpdGNoZXMuICovCitzdGF0aWMgaW50IGFzYjEwMF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiByZWcpCit7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsOworCWludCByZXMsIGJhbms7CisKKwlkb3duKCZkYXRhLT5sb2NrKTsKKworCWJhbmsgPSAocmVnID4+IDgpICYgMHgwZjsKKwlpZiAoYmFuayA+IDIpCisJCS8qIHN3aXRjaCBiYW5rcyAqLworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQVNCMTAwX1JFR19CQU5LLCBiYW5rKTsKKworCWlmIChiYW5rID09IDAgfHwgYmFuayA+IDIpIHsKKwkJcmVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnICYgMHhmZik7CisJfSBlbHNlIHsKKwkJLyogc3dpdGNoIHRvIHN1YmNsaWVudCAqLworCQljbCA9IGRhdGEtPmxtNzVbYmFuayAtIDFdOworCisJCS8qIGNvbnZlcnQgZnJvbSBJU0EgdG8gTE03NSBJMkMgYWRkcmVzc2VzICovCisJCXN3aXRjaCAocmVnICYgMHhmZikgeworCQljYXNlIDB4NTA6IC8qIFRFTVAgKi8KKwkJCXJlcyA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEgKGNsLCAwKSk7CisJCQlicmVhazsKKwkJY2FzZSAweDUyOiAvKiBDT05GSUcgKi8KKwkJCXJlcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSAweDUzOiAvKiBIWVNUICovCisJCQlyZXMgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhIChjbCwgMikpOworCQkJYnJlYWs7CisJCWNhc2UgMHg1NTogLyogTUFYICovCisJCWRlZmF1bHQ6CisJCQlyZXMgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhIChjbCwgMykpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYmFuayA+IDIpCisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBU0IxMDBfUkVHX0JBTkssIDApOworCisJdXAoJmRhdGEtPmxvY2spOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgYXNiMTAwX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiByZWcsIHUxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2w7CisJaW50IGJhbms7CisKKwlkb3duKCZkYXRhLT5sb2NrKTsKKworCWJhbmsgPSAocmVnID4+IDgpICYgMHgwZjsKKwlpZiAoYmFuayA+IDIpCisJCS8qIHN3aXRjaCBiYW5rcyAqLworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQVNCMTAwX1JFR19CQU5LLCBiYW5rKTsKKworCWlmIChiYW5rID09IDAgfHwgYmFuayA+IDIpIHsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZyAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CisJfSBlbHNlIHsKKwkJLyogc3dpdGNoIHRvIHN1YmNsaWVudCAqLworCQljbCA9IGRhdGEtPmxtNzVbYmFuayAtIDFdOworCisJCS8qIGNvbnZlcnQgZnJvbSBJU0EgdG8gTE03NSBJMkMgYWRkcmVzc2VzICovCisJCXN3aXRjaCAocmVnICYgMHhmZikgeworCQljYXNlIDB4NTI6IC8qIENPTkZJRyAqLworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbCwgMSwgdmFsdWUgJiAweGZmKTsKKwkJCWJyZWFrOworCQljYXNlIDB4NTM6IC8qIEhZU1QgKi8KKwkJCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2wsIDIsIHN3YWIxNih2YWx1ZSkpOworCQkJYnJlYWs7CisJCWNhc2UgMHg1NTogLyogTUFYICovCisJCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsLCAzLCBzd2FiMTYodmFsdWUpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGJhbmsgPiAyKQorCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQVNCMTAwX1JFR19CQU5LLCAwKTsKKworCXVwKCZkYXRhLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgYXNiMTAwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZpZCA9IDA7CisKKwl2aWQgPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfVklEX0ZBTkRJVikgJiAweDBmOworCXZpZCB8PSAoYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX0NISVBJRCkgJiAweDAxKSA8PCA0OworCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKwl2aWQgPSB2aWRfZnJvbV9yZWcodmlkLCBkYXRhLT52cm0pOworCisJLyogU3RhcnQgbW9uaXRvcmluZyAqLworCWFzYjEwMF93cml0ZV92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfQ09ORklHLCAKKwkJKGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19DT05GSUcpICYgMHhmNykgfCAweDAxKTsKK30KKworc3RhdGljIHN0cnVjdCBhc2IxMDBfZGF0YSAqYXNiMTAwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkJfHwgIWRhdGEtPnZhbGlkKSB7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJzdGFydGluZyBkZXZpY2UgdXBkYXRlLi4uXG4iKTsKKworCQkvKiA3IHZvbHRhZ2UgaW5wdXRzICovCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCWRhdGEtPmluW2ldID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCUFTQjEwMF9SRUdfSU4oaSkpOworCQkJZGF0YS0+aW5fbWluW2ldID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCUFTQjEwMF9SRUdfSU5fTUlOKGkpKTsKKwkJCWRhdGEtPmluX21heFtpXSA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlBU0IxMDBfUkVHX0lOX01BWChpKSk7CisJCX0KKworCQkvKiAzIGZhbiBpbnB1dHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZGF0YS0+ZmFuW2ldID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQlBU0IxMDBfUkVHX0ZBTihpKSk7CisJCQlkYXRhLT5mYW5fbWluW2ldID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQlBU0IxMDBfUkVHX0ZBTl9NSU4oaSkpOworCQl9CisKKwkJLyogNCB0ZW1wZXJhdHVyZSBpbnB1dHMgKi8KKwkJZm9yIChpID0gMTsgaSA8PSA0OyBpKyspIHsKKwkJCWRhdGEtPnRlbXBbaS0xXSA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJQVNCMTAwX1JFR19URU1QKGkpKTsKKwkJCWRhdGEtPnRlbXBfbWF4W2ktMV0gPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCUFTQjEwMF9SRUdfVEVNUF9NQVgoaSkpOworCQkJZGF0YS0+dGVtcF9oeXN0W2ktMV0gPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCUFTQjEwMF9SRUdfVEVNUF9IWVNUKGkpKTsKKwkJfQorCisJCS8qIFZJRCBhbmQgZmFuIGRpdmlzb3JzICovCisJCWkgPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfVklEX0ZBTkRJVik7CisJCWRhdGEtPnZpZCA9IGkgJiAweDBmOworCQlkYXRhLT52aWQgfD0gKGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlBU0IxMDBfUkVHX0NISVBJRCkgJiAweDAxKSA8PCA0OworCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzFdID0gKGkgPj4gNikgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzJdID0gKGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlBU0IxMDBfUkVHX1BJTikgPj4gNikgJiAweDAzOworCisJCS8qIFBXTSAqLworCQlkYXRhLT5wd20gPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfUFdNMSk7CisKKwkJLyogYWxhcm1zICovCisJCWRhdGEtPmFsYXJtcyA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19BTEFSTTEpICsKKwkJCShhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfQUxBUk0yKSA8PCA4KTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICIuLi4gZGV2aWNlIHVwZGF0ZSBjb21wbGV0ZVxuIik7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhc2IxMDBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYXNiMTAwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhc2IxMDBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhc2IxMDBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiTWFyayBNLiBIb2ZmbWFuIDxtaG9mZm1hbkBsaWdodGxpbmsuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU0IxMDAgQmFjaCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoYXNiMTAwX2luaXQpOworbW9kdWxlX2V4aXQoYXNiMTAwX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9kczEzMzcuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTMzNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjE2YzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9kczEzMzcuYwpAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2kyYy9jaGlwcy9kczEzMzcuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgSmFtZXMgQ2hhcG1hbiA8amNoYXBtYW5Aa2F0YWxpeC5jb20+CisgKgorICoJYmFzZWQgb24gbGludXgvZHJpdmVycy9hY3Jvbi9jaGFyL3BjZjg1ODMuYworICogIENvcHlyaWdodCAoQykgMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERyaXZlciBmb3IgRGFsbGFzIFNlbWljb25kdWN0b3IgRFMxMzM3IHJlYWwgdGltZSBjbG9jayBjaGlwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgkJLyogZ2V0IHRoZSB1c2VyLWxldmVsIEFQSSAqLworI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworLyogRGV2aWNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBEUzEzMzdfUkVHX0hPVVIJCTIKKyNkZWZpbmUgRFMxMzM3X1JFR19EQVkJCTMKKyNkZWZpbmUgRFMxMzM3X1JFR19EQVRFCQk0CisjZGVmaW5lIERTMTMzN19SRUdfTU9OVEgJNQorI2RlZmluZSBEUzEzMzdfUkVHX0NPTlRST0wJMTQKKyNkZWZpbmUgRFMxMzM3X1JFR19TVEFUVVMJMTUKKworLyogRklYTUUgLSBob3cgZG8gd2UgZXhwb3J0IHRoZXNlIGludGVyZmFjZSBjb25zdGFudHM/ICovCisjZGVmaW5lIERTMTMzN19HRVRfREFURQkJMAorI2RlZmluZSBEUzEzMzdfU0VUX0RBVEUJCTEKKworLyoKKyAqIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbgorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDY4LCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCitTRU5TT1JTX0lOU01PRF8xKGRzMTMzNyk7CisKK3N0YXRpYyBpbnQgZHMxMzM3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGRzMTMzN19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIHZvaWQgZHMxMzM3X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBkczEzMzdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgZHMxMzM3X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgdm9pZCAqYXJnKTsKKworLyoKKyAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczEzMzdfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZHMxMzM3IiwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBkczEzMzdfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBkczEzMzdfZGV0YWNoX2NsaWVudCwKKwkuY29tbWFuZAk9IGRzMTMzN19jb21tYW5kLAorfTsKKworLyoKKyAqIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pCisgKi8KK3N0cnVjdCBkczEzMzdfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgaWQ7Cit9OworCisvKgorICogSW50ZXJuYWwgdmFyaWFibGVzCisgKi8KK3N0YXRpYyBpbnQgZHMxMzM3X2lkOworc3RhdGljIExJU1RfSEVBRChkczEzMzdfY2xpZW50cyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGRzMTMzN19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggKnZhbHVlKQoreworCXMzMiB0bXAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworCisJaWYgKHRtcCA8IDApCisJCXJldHVybiAtRUlPOworCisJKnZhbHVlID0gdG1wOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGlwIGFjY2VzcyBmdW5jdGlvbnMKKyAqLworc3RhdGljIGludCBkczEzMzdfZ2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJc3RydWN0IGRzMTMzN19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJlc3VsdDsKKwl1OCBidWZbN107CisJdTggdmFsOworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKKwl1OCBvZmZzID0gMDsKKworCWlmICghZHQpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICIlczogRUlOVkFMOiBkdD1OVUxMXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2dbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwltc2dbMF0uZmxhZ3MgPSAwOworCW1zZ1swXS5sZW4gPSAxOworCW1zZ1swXS5idWYgPSAmb2ZmczsKKworCW1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOworCW1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOworCW1zZ1sxXS5sZW4gPSBzaXplb2YoYnVmKTsKKwltc2dbMV0uYnVmID0gJmJ1ZlswXTsKKworCXJlc3VsdCA9IGNsaWVudC0+YWRhcHRlci0+YWxnby0+bWFzdGVyX3hmZXIoY2xpZW50LT5hZGFwdGVyLAorCQkJCQkJICAgICZtc2dbMF0sIDIpOworCisJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsCisJCSIlczogWyVkXSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAorCQlidWZbNF0sIGJ1Zls1XSwgYnVmWzZdKTsKKworCWlmIChyZXN1bHQgPj0gMCkgeworCQlkdC0+dG1fc2VjID0gQkNEX1RPX0JJTihidWZbMF0pOworCQlkdC0+dG1fbWluID0gQkNEX1RPX0JJTihidWZbMV0pOworCQl2YWwgPSBidWZbMl0gJiAweDNmOworCQlkdC0+dG1faG91ciA9IEJDRF9UT19CSU4odmFsKTsKKwkJZHQtPnRtX3dkYXkgPSBCQ0RfVE9fQklOKGJ1ZlszXSkgLSAxOworCQlkdC0+dG1fbWRheSA9IEJDRF9UT19CSU4oYnVmWzRdKTsKKwkJdmFsID0gYnVmWzVdICYgMHg3ZjsKKwkJZHQtPnRtX21vbiA9IEJDRF9UT19CSU4odmFsKTsKKwkJZHQtPnRtX3llYXIgPSAxOTAwICsgQkNEX1RPX0JJTihidWZbNl0pOworCQlpZiAoYnVmWzVdICYgMHg4MCkKKwkJCWR0LT50bV95ZWFyICs9IDEwMDsKKworCQlkZXZfZGJnKCZjbGllbnQtPmFkYXB0ZXItPmRldiwgIiVzOiBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCQkiaG91cnM9JWQsIG1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgZHQtPnRtX3NlYywgZHQtPnRtX21pbiwKKwkJCWR0LT50bV9ob3VyLCBkdC0+dG1fbWRheSwKKwkJCWR0LT50bV9tb24sIGR0LT50bV95ZWFyLCBkdC0+dG1fd2RheSk7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmY2xpZW50LT5hZGFwdGVyLT5kZXYsICJkczEzMzdbJWRdOiBlcnJvciByZWFkaW5nICIKKwkJCSJkYXRhISAlZFxuIiwgZGF0YS0+aWQsIHJlc3VsdCk7CisJCXJlc3VsdCA9IC1FSU87CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkczEzMzdfc2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJc3RydWN0IGRzMTMzN19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJlc3VsdDsKKwl1OCBidWZbOF07CisJdTggdmFsOworCXN0cnVjdCBpMmNfbXNnIG1zZ1sxXTsKKworCWlmICghZHQpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICIlczogRUlOVkFMOiBkdD1OVUxMXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKCZjbGllbnQtPmFkYXB0ZXItPmRldiwgIiVzOiBzZWNzPSVkLCBtaW5zPSVkLCBob3Vycz0lZCwgIgorCQkibWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCWR0LT50bV9zZWMsIGR0LT50bV9taW4sIGR0LT50bV9ob3VyLAorCQlkdC0+dG1fbWRheSwgZHQtPnRtX21vbiwgZHQtPnRtX3llYXIsIGR0LT50bV93ZGF5KTsKKworCWJ1ZlswXSA9IDA7CQkvKiByZWcgb2Zmc2V0ICovCisJYnVmWzFdID0gQklOX1RPX0JDRChkdC0+dG1fc2VjKTsKKwlidWZbMl0gPSBCSU5fVE9fQkNEKGR0LT50bV9taW4pOworCWJ1ZlszXSA9IEJJTl9UT19CQ0QoZHQtPnRtX2hvdXIpIHwgKDEgPDwgNik7CisJYnVmWzRdID0gQklOX1RPX0JDRChkdC0+dG1fd2RheSkgKyAxOworCWJ1Zls1XSA9IEJJTl9UT19CQ0QoZHQtPnRtX21kYXkpOworCWJ1Zls2XSA9IEJJTl9UT19CQ0QoZHQtPnRtX21vbik7CisJaWYgKGR0LT50bV95ZWFyID49IDIwMDApIHsKKwkJdmFsID0gZHQtPnRtX3llYXIgLSAyMDAwOworCQlidWZbNl0gfD0gKDEgPDwgNyk7CisJfSBlbHNlIHsKKwkJdmFsID0gZHQtPnRtX3llYXIgLSAxOTAwOworCX0KKwlidWZbN10gPSBCSU5fVE9fQkNEKHZhbCk7CisKKwltc2dbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwltc2dbMF0uZmxhZ3MgPSAwOworCW1zZ1swXS5sZW4gPSBzaXplb2YoYnVmKTsKKwltc2dbMF0uYnVmID0gJmJ1ZlswXTsKKworCXJlc3VsdCA9IGNsaWVudC0+YWRhcHRlci0+YWxnby0+bWFzdGVyX3hmZXIoY2xpZW50LT5hZGFwdGVyLAorCQkJCQkJICAgICZtc2dbMF0sIDEpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAiZHMxMzM3WyVkXTogZXJyb3IgIgorCQkJIndyaXRpbmcgZGF0YSEgJWRcbiIsIGRhdGEtPmlkLCByZXN1bHQpOworCQlyZXN1bHQgPSAtRUlPOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IDA7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkczEzMzdfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICB2b2lkICphcmcpCit7CisJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICIlczogY21kPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGNtZCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRFMxMzM3X0dFVF9EQVRFOgorCQlyZXR1cm4gZHMxMzM3X2dldF9kYXRldGltZShjbGllbnQsIGFyZyk7CisKKwljYXNlIERTMTMzN19TRVRfREFURToKKwkJcmV0dXJuIGRzMTMzN19zZXRfZGF0ZXRpbWUoY2xpZW50LCBhcmcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKgorICogUHVibGljIEFQSSBmb3IgYWNjZXNzIHRvIHNwZWNpZmljIGRldmljZS4gVXNlZnVsIGZvciBsb3ctbGV2ZWwKKyAqIFJUQyBhY2Nlc3MgZnJvbSBrZXJuZWwgY29kZS4KKyAqLworaW50IGRzMTMzN19kb19jb21tYW5kKGludCBpZCwgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKndhbGs7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBkczEzMzdfZGF0YSAqZGF0YTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZSh3YWxrLCB0bXAsICZkczEzMzdfY2xpZW50cykgeworCQlkYXRhID0gbGlzdF9lbnRyeSh3YWxrLCBzdHJ1Y3QgZHMxMzM3X2RhdGEsIGxpc3QpOworCQlpZiAoZGF0YS0+aWQgPT0gaWQpCisJCQlyZXR1cm4gZHMxMzM3X2NvbW1hbmQoJmRhdGEtPmNsaWVudCwgY21kLCBhcmcpOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGRzMTMzN19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgZHMxMzM3X2RldGVjdCk7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRvZXMgbW9yZSB0aGFuIGp1c3QgZGV0ZWN0aW9uLiBJZiBkZXRlY3Rpb24KKyAqIHN1Y2NlZWRzLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbmV3IGNoaXAuCisgKi8KK3N0YXRpYyBpbnQgZHMxMzM3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgZHMxMzM3X2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9ICIiOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAorCQkJCSAgICAgSTJDX0ZVTkNfSTJDKSkKKwkJZ290byBleGl0OworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkczEzMzdfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGRzMTMzN19kYXRhKSk7CisJSU5JVF9MSVNUX0hFQUQoJmRhdGEtPmxpc3QpOworCisJLyogVGhlIGNvbW1vbiBJMkMgY2xpZW50IGRhdGEgaXMgcGxhY2VkIHJpZ2h0IGJlZm9yZSB0aGUKKwkgKiBEUzEzMzctc3BlY2lmaWMgZGF0YS4gCisJICovCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZkczEzMzdfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qCisJICogTm93IHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiBBIG5lZ2F0aXZlIGtpbmQgbWVhbnMgdGhhdAorCSAqIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIG5vIGZvcmNlIHBhcmFtZXRlciAoZGVmYXVsdCksIHNvIHdlCisJICogbXVzdCBib3RoIGRldGVjdCBhbmQgaWRlbnRpZnkgdGhlIGNoaXAuIEEgemVybyBraW5kIG1lYW5zIHRoYXQKKwkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyLCB0aGUgZGV0ZWN0aW9uCisJICogc3RlcCBzaGFsbCBiZSBza2lwcGVkLiBBIHBvc2l0aXZlIGtpbmQgbWVhbnMgdGhhdCB0aGUgZHJpdmVyCisJICogd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIgYW5kIGEgZ2l2ZW4ga2luZCBvZiBjaGlwIGlzCisJICogcmVxdWVzdGVkLCBzbyBib3RoIHRoZSBkZXRlY3Rpb24gYW5kIHRoZSBpZGVudGlmaWNhdGlvbiBzdGVwcworCSAqIGFyZSBza2lwcGVkLgorCSAqCisJICogRm9yIGRldGVjdGlvbiwgd2UgcmVhZCByZWdpc3RlcnMgdGhhdCBhcmUgbW9zdCBsaWtlbHkgdG8gY2F1c2UKKwkgKiBkZXRlY3Rpb24gZmFpbHVyZSwgaS5lLiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBiaXRzIHdpdGggZml4ZWQKKwkgKiBvciByZXNlcnZlZCB2YWx1ZXMuCisJICovCisKKwkvKiBEZWZhdWx0IHRvIGFuIERTMTMzNyBpZiBmb3JjZWQgKi8KKwlpZiAoa2luZCA9PSAwKQorCQlraW5kID0gZHMxMzM3OworCisJaWYgKGtpbmQgPCAwKSB7CQkvKiBkZXRlY3Rpb24gYW5kIGlkZW50aWZpY2F0aW9uICovCisJCXU4IGRhdGE7CisKKwkJLyogQ2hlY2sgdGhhdCBzdGF0dXMgcmVnaXN0ZXIgYml0cyA2LTIgYXJlIHplcm8gKi8KKwkJaWYgKChkczEzMzdfcmVhZChuZXdfY2xpZW50LCBEUzEzMzdfUkVHX1NUQVRVUywgJmRhdGEpIDwgMCkgfHwKKwkJICAgIChkYXRhICYgMHg3YykpCisJCQlnb3RvIGV4aXRfZnJlZTsKKworCQkvKiBDaGVjayBmb3IgYSB2YWxpZCBkYXkgcmVnaXN0ZXIgdmFsdWUgKi8KKwkJaWYgKChkczEzMzdfcmVhZChuZXdfY2xpZW50LCBEUzEzMzdfUkVHX0RBWSwgJmRhdGEpIDwgMCkgfHwKKwkJICAgIChkYXRhID09IDApIHx8IChkYXRhICYgMHhmOCkpCisJCQlnb3RvIGV4aXRfZnJlZTsKKworCQkvKiBDaGVjayBmb3IgYSB2YWxpZCBkYXRlIHJlZ2lzdGVyIHZhbHVlICovCisJCWlmICgoZHMxMzM3X3JlYWQobmV3X2NsaWVudCwgRFMxMzM3X1JFR19EQVRFLCAmZGF0YSkgPCAwKSB8fAorCQkgICAgKGRhdGEgPT0gMCkgfHwgKGRhdGEgJiAweGMwKSB8fCAoKGRhdGEgJiAweDBmKSA+IDkpIHx8CisJCSAgICAoZGF0YSA+PSAweDMyKSkKKwkJCWdvdG8gZXhpdF9mcmVlOworCisJCS8qIENoZWNrIGZvciBhIHZhbGlkIG1vbnRoIHJlZ2lzdGVyIHZhbHVlICovCisJCWlmICgoZHMxMzM3X3JlYWQobmV3X2NsaWVudCwgRFMxMzM3X1JFR19NT05USCwgJmRhdGEpIDwgMCkgfHwKKwkJICAgIChkYXRhID09IDApIHx8IChkYXRhICYgMHg2MCkgfHwgKChkYXRhICYgMHgwZikgPiA5KSB8fAorCQkgICAgKChkYXRhID49IDB4MTMpICYmIChkYXRhIDw9IDB4MTkpKSkKKwkJCWdvdG8gZXhpdF9mcmVlOworCisJCS8qIENoZWNrIHRoYXQgY29udHJvbCByZWdpc3RlciBiaXRzIDYtNSBhcmUgemVybyAqLworCQlpZiAoKGRzMTMzN19yZWFkKG5ld19jbGllbnQsIERTMTMzN19SRUdfQ09OVFJPTCwgJmRhdGEpIDwgMCkgfHwKKwkJICAgIChkYXRhICYgMHg2MCkpCisJCQlnb3RvIGV4aXRfZnJlZTsKKworCQlraW5kID0gZHMxMzM3OworCX0KKworCWlmIChraW5kID09IGRzMTMzNykKKwkJbmFtZSA9ICJkczEzMzciOworCisJLyogV2UgY2FuIGZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBEUzEzMzcgY2hpcCAqLworCWRzMTMzN19pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIEFkZCBjbGllbnQgdG8gbG9jYWwgbGlzdCAqLworCWRhdGEtPmlkID0gZHMxMzM3X2lkKys7CisJbGlzdF9hZGQoJmRhdGEtPmxpc3QsICZkczEzMzdfY2xpZW50cyk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBkczEzMzdfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzMzIgdmFsOworCisJLyogRW5zdXJlIHRoYXQgZGV2aWNlIGlzIHNldCBpbiAyNC1ob3VyIG1vZGUgKi8KKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMzdfUkVHX0hPVVIpOworCWlmICgodmFsID49IDApICYmICh2YWwgJiAoMSA8PCA2KSkgPT0gMCkKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfSE9VUiwKKwkJCQkJICB2YWwgfCAoMSA8PCA2KSk7Cit9CisKK3N0YXRpYyBpbnQgZHMxMzM3X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBkczEzMzdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJbGlzdF9kZWwoJmRhdGEtPmxpc3QpOworCWtmcmVlKGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkczEzMzdfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHMxMzM3X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkczEzMzdfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZkczEzMzdfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmFtZXMgQ2hhcG1hbiA8amNoYXBtYW5Aa2F0YWxpeC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRTMTMzNyBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGRzMTMzN19pbml0KTsKK21vZHVsZV9leGl0KGRzMTMzN19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTYyMS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvZHMxNjIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxZmVmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTYyMS5jCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICAgIGRzMTYyMS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICBtb25pdG9yaW5nCisgICAgQ2hyaXN0aWFuIFcuIFp1Y2tzY2h3ZXJkdCAgPHphbnlAdHJpcS5uZXQ+ICAyMDAwLTExLTIzCisgICAgYmFzZWQgb24gbG03NS5jIGJ5IEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KKyAgICBQb3J0ZWQgdG8gTGludXggMi42IGJ5IEF1cmVsaWVuIEphcm5vIDxhdXJlbGllbkBhdXJlbDMyLm5ldD4gd2l0aCAKKyAgICB0aGUgaGVscCBvZiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlICJsbTc1LmgiCisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLAorCQkJCQkweDRkLCAweDRlLCAweDRmLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMShkczE2MjEpOworc3RhdGljIGludCBwb2xhcml0eSA9IC0xOworbW9kdWxlX3BhcmFtKHBvbGFyaXR5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwb2xhcml0eSwgIk91dHB1dCdzIHBvbGFyaXR5OiAwID0gYWN0aXZlIGhpZ2gsIDEgPSBhY3RpdmUgbG93Iik7CisKKy8qIE1hbnkgRFMxNjIxIGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KKy8qIENvbmZpZyByZWdpc3RlciB1c2VkIGZvciBkZXRlY3Rpb24gICAgICAgICAqLworLyogIDcgICAgNiAgICA1ICAgIDQgICAgMyAgICAyICAgIDEgICAgMCAgICAgICovCisvKiB8RG9uZXxUSEYgfFRMRiB8TlZCIHwgWCAgfCBYICB8UE9MIHwxU0hPVHwgKi8KKyNkZWZpbmUgRFMxNjIxX1JFR19DT05GSUdfTlZCCQkweDEwCisjZGVmaW5lIERTMTYyMV9SRUdfQ09ORklHX1BPTEFSSVRZCTB4MDIKKyNkZWZpbmUgRFMxNjIxX1JFR19DT05GSUdfMVNIT1QJCTB4MDEKKyNkZWZpbmUgRFMxNjIxX1JFR19DT05GSUdfRE9ORQkJMHg4MAorCisvKiBUaGUgRFMxNjIxIHJlZ2lzdGVycyAqLworI2RlZmluZSBEUzE2MjFfUkVHX1RFTVAJCQkweEFBIC8qIHdvcmQsIFJPICovCisjZGVmaW5lIERTMTYyMV9SRUdfVEVNUF9NSU4JCTB4QTEgLyogd29yZCwgUlcgKi8KKyNkZWZpbmUgRFMxNjIxX1JFR19URU1QX01BWAkJMHhBMiAvKiB3b3JkLCBSVyAqLworI2RlZmluZSBEUzE2MjFfUkVHX0NPTkYJCQkweEFDIC8qIGJ5dGUsIFJXICovCisjZGVmaW5lIERTMTYyMV9DT01fU1RBUlQJCTB4RUUgLyogbm8gZGF0YSAqLworI2RlZmluZSBEUzE2MjFfQ09NX1NUT1AJCQkweDIyIC8qIG5vIGRhdGEgKi8KKworLyogVGhlIERTMTYyMSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIERTMTYyMV9BTEFSTV9URU1QX0hJR0gJCTB4NDAKKyNkZWZpbmUgRFMxNjIxX0FMQVJNX1RFTVBfTE9XCQkweDIwCisKKy8qIENvbnZlcnNpb25zLiBSb3VuZGluZyBhbmQgbGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcKKyAgIHZhcmlhbnRzLiBOb3RlIHRoYXQgeW91IHNob3VsZCBiZSBhIGJpdCBjYXJlZnVsIHdpdGggd2hpY2ggYXJndW1lbnRzCisgICB0aGVzZSBtYWNyb3MgYXJlIGNhbGxlZDogYXJndW1lbnRzIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCisgICBGaXhpbmcgdGhpcyBpcyBqdXN0IG5vdCB3b3J0aCBpdC4gKi8KKyNkZWZpbmUgQUxBUk1TX0ZST01fUkVHKHZhbCkgKCh2YWwpICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERTMTYyMV9BTEFSTV9URU1QX0hJR0ggfCBEUzE2MjFfQUxBUk1fVEVNUF9MT1cpKQorCisvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KK3N0cnVjdCBkczE2MjFfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJdTE2IHRlbXAsIHRlbXBfbWluLCB0ZW1wX21heDsJLyogUmVnaXN0ZXIgdmFsdWVzLCB3b3JkICovCisJdTggY29uZjsJCQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KK307CisKK3N0YXRpYyBpbnQgZHMxNjIxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGRzMTYyMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwkJCSBpbnQga2luZCk7CitzdGF0aWMgdm9pZCBkczE2MjFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGRzMTYyMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHN0cnVjdCBkczE2MjFfZGF0YSAqZHMxNjIxX3VwZGF0ZV9jbGllbnQoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRzMTYyMV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJkczE2MjEiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfRFMxNjIxLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGRzMTYyMV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGRzMTYyMV9kZXRhY2hfY2xpZW50LAorfTsKKworLyogQWxsIHJlZ2lzdGVycyBhcmUgd29yZC1zaXplZCwgZXhjZXB0IGZvciB0aGUgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAgIERTMTYyMSB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24sIHdoaWNoIGlzIGV4YWN0bHkgb3Bwb3NpdGUgdG8KKyAgIHRoZSB1c3VhbCBwcmFjdGljZS4gKi8KK3N0YXRpYyBpbnQgZHMxNjIxX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCWlmIChyZWcgPT0gRFMxNjIxX1JFR19DT05GKQorCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwllbHNlCisJCXJldHVybiBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKSk7Cit9CisKKy8qIEFsbCByZWdpc3RlcnMgYXJlIHdvcmQtc2l6ZWQsIGV4Y2VwdCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCisgICBEUzE2MjEgdXNlcyBhIGhpZ2gtYnl0ZSBmaXJzdCBjb252ZW50aW9uLCB3aGljaCBpcyBleGFjdGx5IG9wcG9zaXRlIHRvCisgICB0aGUgdXN1YWwgcHJhY3RpY2UuICovCitzdGF0aWMgaW50IGRzMTYyMV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSkKK3sKKwlpZiAocmVnID09IERTMTYyMV9SRUdfQ09ORikKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKKwllbHNlCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKK30KKworc3RhdGljIHZvaWQgZHMxNjIxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJlZyA9IGRzMTYyMV9yZWFkX3ZhbHVlKGNsaWVudCwgRFMxNjIxX1JFR19DT05GKTsKKwkvKiBzd2l0Y2ggdG8gY29udGlub3VzIGNvbnZlcnNpb24gbW9kZSAqLworCXJlZyAmPSB+IERTMTYyMV9SRUdfQ09ORklHXzFTSE9UOworCisJLyogc2V0dXAgb3V0cHV0IHBvbGFyaXR5ICovCisJaWYgKHBvbGFyaXR5ID09IDApCisJCXJlZyAmPSB+RFMxNjIxX1JFR19DT05GSUdfUE9MQVJJVFk7CisJZWxzZSBpZiAocG9sYXJpdHkgPT0gMSkKKwkJcmVnIHw9IERTMTYyMV9SRUdfQ09ORklHX1BPTEFSSVRZOworCQorCWRzMTYyMV93cml0ZV92YWx1ZShjbGllbnQsIERTMTYyMV9SRUdfQ09ORiwgcmVnKTsKKwkKKwkvKiBzdGFydCBjb252ZXJzaW9uICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBEUzE2MjFfQ09NX1NUQVJUKTsKK30KKworI2RlZmluZSBzaG93KHZhbHVlKQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBkczE2MjFfZGF0YSAqZGF0YSA9IGRzMTYyMV91cGRhdGVfY2xpZW50KGRldik7CQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIExNNzVfVEVNUF9GUk9NX1JFRyhkYXRhLT52YWx1ZSkpOwlcCit9CisKK3Nob3codGVtcCk7CitzaG93KHRlbXBfbWluKTsKK3Nob3codGVtcF9tYXgpOworCisjZGVmaW5lIHNldF90ZW1wKHN1ZmZpeCwgdmFsdWUsIHJlZykJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAlcCisJCQkJIHNpemVfdCBjb3VudCkJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwkJCVwKKwlzdHJ1Y3QgZHMxNjIxX2RhdGEgKmRhdGEgPSBkczE2MjFfdXBkYXRlX2NsaWVudChkZXYpOwkJXAorCXUxNiB2YWwgPSBMTTc1X1RFTVBfVE9fUkVHKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApKTsJXAorCQkJCQkJCQkJXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsJCQkJCVwKKwlkYXRhLT52YWx1ZSA9IHZhbDsJCQkJCQlcCisJZHMxNjIxX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT52YWx1ZSk7CQkJXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQorCitzZXRfdGVtcChtaW4sIHRlbXBfbWluLCBEUzE2MjFfUkVHX1RFTVBfTUlOKTsKK3NldF90ZW1wKG1heCwgdGVtcF9tYXgsIERTMTYyMV9SRUdfVEVNUF9NQVgpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZHMxNjIxX2RhdGEgKmRhdGEgPSBkczE2MjFfdXBkYXRlX2NsaWVudChkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBBTEFSTVNfRlJPTV9SRUcoZGF0YS0+Y29uZikpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08gLCBzaG93X3RlbXAsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JV1VTUiB8IFNfSVJVR08gLCBzaG93X3RlbXBfbWluLCBzZXRfdGVtcF9taW4pOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9tYXgsIHNldF90ZW1wX21heCk7CisKKworc3RhdGljIGludCBkczE2MjFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGRzMTYyMV9kZXRlY3QpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfZGV0ZWN0ICovCitpbnQgZHMxNjIxX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgaW50IGtpbmQpCit7CisJaW50IGNvbmYsIHRlbXA7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGRzMTYyMV9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgCisJCQkJICAgICB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSAKKwkJCQkgICAgIHwgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURSkpCisJCWdvdG8gZXhpdDsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgZHMxNjIxX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRzMTYyMV9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgZHMxNjIxX2RhdGEpKTsKKwkKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmRzMTYyMV9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisKKwkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiBJdCBpcyBsb3VzeS4gKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJLyogVGhlIE5WQiBiaXQgc2hvdWxkIGJlIGxvdyBpZiBubyBFRVBST00gd3JpdGUgaGFzIGJlZW4gCisJCSAgIHJlcXVlc3RlZCBkdXJpbmcgdGhlIGxhdGVzdCAxMG1zLCB3aGljaCBpcyBoaWdobHkgCisJCSAgIGltcHJvYmFibGUgaW4gb3VyIGNhc2UuICovCisJCWNvbmYgPSBkczE2MjFfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBEUzE2MjFfUkVHX0NPTkYpOworCQlpZiAoY29uZiAmIERTMTYyMV9SRUdfQ09ORklHX05WQikKKwkJCWdvdG8gZXhpdF9mcmVlOworCQkvKiBUaGUgNyBsb3dlc3QgYml0cyBvZiBhIHRlbXBlcmF0dXJlIHNob3VsZCBhbHdheXMgYmUgMC4gKi8KKwkJdGVtcCA9IGRzMTYyMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIERTMTYyMV9SRUdfVEVNUCk7CisJCWlmICh0ZW1wICYgMHgwMDdmKQorCQkJZ290byBleGl0X2ZyZWU7CisJCXRlbXAgPSBkczE2MjFfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBEUzE2MjFfUkVHX1RFTVBfTUlOKTsKKwkJaWYgKHRlbXAgJiAweDAwN2YpCisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJdGVtcCA9IGRzMTYyMV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIERTMTYyMV9SRUdfVEVNUF9NQVgpOworCQlpZiAodGVtcCAmIDB4MDA3ZikKKwkJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlIC0gb25seSBvbmUga2luZCBzdXBwb3J0ZWQhICovCisJaWYgKGtpbmQgPD0gMCkKKwkJa2luZCA9IGRzMTYyMTsKKworCS8qIEZpbGwgaW4gcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpdCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImRzMTYyMSIsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgRFMxNjIxIGNoaXAgKi8KKwlkczE2MjFfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCQorCXJldHVybiAwOworCisvKiBPSywgdGhpcyBpcyBub3QgZXhhY3RseSBnb29kIHByb2dyYW1taW5nIHByYWN0aWNlLCB1c3VhbGx5LiBCdXQgaXQgaXMKKyAgIHZlcnkgY29kZS1lZmZpY2llbnQgaW4gdGhpcyBjYXNlLiAqLworICAgICAgZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworICAgICAgZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRzMTYyMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZHMxNjIxX2RhdGEgKmRzMTYyMV91cGRhdGVfY2xpZW50KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBkczE2MjFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXU4IG5ld19jb25mOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgZHMxNjIxIHVwZGF0ZVxuIik7CisKKwkJZGF0YS0+Y29uZiA9IGRzMTYyMV9yZWFkX3ZhbHVlKGNsaWVudCwgRFMxNjIxX1JFR19DT05GKTsKKworCQlkYXRhLT50ZW1wID0gZHMxNjIxX3JlYWRfdmFsdWUoY2xpZW50LCBEUzE2MjFfUkVHX1RFTVApOworCQkKKwkJZGF0YS0+dGVtcF9taW4gPSBkczE2MjFfcmVhZF92YWx1ZShjbGllbnQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTMTYyMV9SRUdfVEVNUF9NSU4pOworCQlkYXRhLT50ZW1wX21heCA9IGRzMTYyMV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgICBEUzE2MjFfUkVHX1RFTVBfTUFYKTsKKworCQkvKiByZXNldCBhbGFybXMgaWYgbmVjY2Vzc2FyeSAqLworCQluZXdfY29uZiA9IGRhdGEtPmNvbmY7CisJCWlmIChkYXRhLT50ZW1wIDwgZGF0YS0+dGVtcF9taW4pCisJCQluZXdfY29uZiAmPSB+RFMxNjIxX0FMQVJNX1RFTVBfTE9XOworCQlpZiAoZGF0YS0+dGVtcCA+IGRhdGEtPnRlbXBfbWF4KQorCQkJbmV3X2NvbmYgJj0gfkRTMTYyMV9BTEFSTV9URU1QX0hJR0g7CisJCWlmIChkYXRhLT5jb25mICE9IG5ld19jb25mKQorCQkJZHMxNjIxX3dyaXRlX3ZhbHVlKGNsaWVudCwgRFMxNjIxX1JFR19DT05GLAorCQkJCQkgICBuZXdfY29uZik7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgZHMxNjIxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRzMTYyMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHMxNjIxX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZHMxNjIxX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUigiQ2hyaXN0aWFuIFcuIFp1Y2tzY2h3ZXJkdCA8emFueUB0cmlxLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRFMxNjIxIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChkczE2MjFfaW5pdCk7Cittb2R1bGVfZXhpdChkczE2MjFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2VlcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZGZhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAgICBlZXByb20uYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgICBtb25pdG9yaW5nCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5ICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+IGFuZAorCQkJICAgICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMgSUJNIENvcnAuCisKKyAgICAyMDA0LTAxLTE2ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgICBEaXZpZGUgdGhlIGVlcHJvbSBpbiAzMi1ieXRlIChhcmJpdHJhcnkpIHNsaWNlcy4gVGhpcyBzaWduaWZpY2FudGx5CisgICAgc3BlZWRzIHNlbnNvcnMgdXAsIGFzIHdlbGwgYXMgdmFyaW91cyBzY3JpcHRzIHVzaW5nIHRoZSBlZXByb20KKyAgICBtb2R1bGUuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsCisJCQkJCTB4NTUsIDB4NTYsIDB4NTcsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8xKGVlcHJvbSk7CisKKworLyogU2l6ZSBvZiBFRVBST00gaW4gYnl0ZXMgKi8KKyNkZWZpbmUgRUVQUk9NX1NJWkUJCTI1NgorCisvKiBwb3NzaWJsZSB0eXBlcyBvZiBlZXByb20gZGV2aWNlcyAqLworZW51bSBlZXByb21fbmF0dXJlIHsKKwlVTktOT1dOLAorCVZBSU8sCit9OworCisvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KK3N0cnVjdCBlZXByb21fZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJdTggdmFsaWQ7CQkJLyogYml0ZmllbGQsIGJpdCE9MCBpZiBzbGljZSBpcyB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkWzhdOwkvKiBJbiBqaWZmaWVzLCA4IHNsaWNlcyAqLworCXU4IGRhdGFbRUVQUk9NX1NJWkVdOwkJLyogUmVnaXN0ZXIgdmFsdWVzICovCisJZW51bSBlZXByb21fbmF0dXJlIG5hdHVyZTsKK307CisKKworc3RhdGljIGludCBlZXByb21fYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgZWVwcm9tX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IGVlcHJvbV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZWVwcm9tX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImVlcHJvbSIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9FRVBST00sCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gZWVwcm9tX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gZWVwcm9tX2RldGFjaF9jbGllbnQsCit9OworCitzdGF0aWMgdm9pZCBlZXByb21fdXBkYXRlX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBzbGljZSkKK3sKKwlzdHJ1Y3QgZWVwcm9tX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaSwgajsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICghKGRhdGEtPnZhbGlkICYgKDEgPDwgc2xpY2UpKSB8fAorCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZFtzbGljZV0gKyAzMDAgKiBIWikpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTdGFydGluZyBlZXByb20gdXBkYXRlLCBzbGljZSAldVxuIiwgc2xpY2UpOworCisJCWlmIChpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLKSkgeworCQkJZm9yIChpID0gc2xpY2UgPDwgNTsgaSA8IChzbGljZSArIDEpIDw8IDU7IGkgKz0gSTJDX1NNQlVTX0kyQ19CTE9DS19NQVgpCisJCQkJaWYgKGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwgaSwgZGF0YS0+ZGF0YSArIGkpICE9IEkyQ19TTUJVU19JMkNfQkxPQ0tfTUFYKQorCQkJCQlnb3RvIGV4aXQ7CisJCX0gZWxzZSB7CisJCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBzbGljZSA8PCA1KSkgeworCQkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiZWVwcm9tIHJlYWQgc3RhcnQgaGFzIGZhaWxlZCFcbiIpOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJCWZvciAoaSA9IHNsaWNlIDw8IDU7IGkgPCAoc2xpY2UgKyAxKSA8PCA1OyBpKyspIHsKKwkJCQlqID0gaTJjX3NtYnVzX3JlYWRfYnl0ZShjbGllbnQpOworCQkJCWlmIChqIDwgMCkKKwkJCQkJZ290byBleGl0OworCQkJCWRhdGEtPmRhdGFbaV0gPSAodTgpIGo7CisJCQl9CisJCX0KKwkJZGF0YS0+bGFzdF91cGRhdGVkW3NsaWNlXSA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkIHw9ICgxIDw8IHNsaWNlKTsKKwl9CitleGl0OgorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVlcHJvbV9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOworCXN0cnVjdCBlZXByb21fZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXU4IHNsaWNlOworCisJaWYgKG9mZiA+IEVFUFJPTV9TSVpFKQorCQlyZXR1cm4gMDsKKwlpZiAob2ZmICsgY291bnQgPiBFRVBST01fU0laRSkKKwkJY291bnQgPSBFRVBST01fU0laRSAtIG9mZjsKKworCS8qIE9ubHkgcmVmcmVzaCBzbGljZXMgd2hpY2ggY29udGFpbiByZXF1ZXN0ZWQgYnl0ZXMgKi8KKwlmb3IgKHNsaWNlID0gb2ZmID4+IDU7IHNsaWNlIDw9IChvZmYgKyBjb3VudCAtIDEpID4+IDU7IHNsaWNlKyspCisJCWVlcHJvbV91cGRhdGVfY2xpZW50KGNsaWVudCwgc2xpY2UpOworCisJLyogSGlkZSBWYWlvIHNlY3VyaXR5IHNldHRpbmdzIHRvIHJlZ3VsYXIgdXNlcnMgKDE2IGZpcnN0IGJ5dGVzKSAqLworCWlmIChkYXRhLT5uYXR1cmUgPT0gVkFJTyAmJiBvZmYgPCAxNiAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlzaXplX3QgaW5fcm93MSA9IDE2IC0gb2ZmOworCQlpbl9yb3cxID0gbWluKGluX3JvdzEsIGNvdW50KTsKKwkJbWVtc2V0KGJ1ZiwgMCwgaW5fcm93MSk7CisJCWlmIChjb3VudCAtIGluX3JvdzEgPiAwKQorCQkJbWVtY3B5KGJ1ZiArIGluX3JvdzEsICZkYXRhLT5kYXRhWzE2XSwgY291bnQgLSBpbl9yb3cxKTsKKwl9IGVsc2UgeworCQltZW1jcHkoYnVmLCAmZGF0YS0+ZGF0YVtvZmZdLCBjb3VudCk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZWVwcm9tX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gImVlcHJvbSIsCisJCS5tb2RlID0gU19JUlVHTywKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuc2l6ZSA9IEVFUFJPTV9TSVpFLAorCS5yZWFkID0gZWVwcm9tX3JlYWQsCit9OworCitzdGF0aWMgaW50IGVlcHJvbV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgZWVwcm9tX2RldGVjdCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19kZXRlY3QgKi8KK2ludCBlZXByb21fZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBlZXByb21fZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCS8qIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHdlIGNhbiByZWFkIHRoZSBFRVBST00gZGF0YToKKwkgICAoMSkgSTJDIGJsb2NrIHJlYWRzIChmYXN0ZXIsIGJ1dCB1bnN1cHBvcnRlZCBieSBtb3N0IGFkYXB0ZXJzKQorCSAgICgyKSBDb25zZWN1dGl2ZSBieXRlIHJlYWRzICgxMDAlIG92ZXJoZWFkKQorCSAgICgzKSBSZWd1bGFyIGJ5dGUgZGF0YSByZWFkcyAoMjAwJSBvdmVyaGVhZCkKKwkgICBUaGUgdGhpcmQgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIGRyaXZlciBiZWNhdXNlIGFsbAorCSAgIGtub3duIGFkYXB0ZXJzIHN1cHBvcnQgYXQgbGVhc3QgdGhlIHNlY29uZC4gKi8KKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBCisJCQkJCSAgICB8IEkyQ19GVU5DX1NNQlVTX0JZVEUpKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGVlcHJvbV97cmVhZCx3cml0ZX1fdmFsdWUuICovCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlZXByb21fZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGVlcHJvbV9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwltZW1zZXQoZGF0YS0+ZGF0YSwgMHhmZiwgRUVQUk9NX1NJWkUpOworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmZWVwcm9tX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBwcmV2ZW50IDI0UkYwOCBjb3JydXB0aW9uICovCisJaTJjX3NtYnVzX3dyaXRlX3F1aWNrKG5ld19jbGllbnQsIDApOworCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJlZXByb20iLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPm5hdHVyZSA9IFVOS05PV047CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9rZnJlZTsKKworCS8qIERldGVjdCB0aGUgVmFpbyBuYXR1cmUgb2YgRUVQUk9Ncy4KKwkgICBXZSB1c2UgdGhlICJQQ0ctIiBwcmVmaXggYXMgdGhlIHNpZ25hdHVyZS4gKi8KKwlpZiAoYWRkcmVzcyA9PSAweDU3KSB7CisJCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHg4MCkgPT0gJ1AnCisJCSAmJiBpMmNfc21idXNfcmVhZF9ieXRlKG5ld19jbGllbnQpID09ICdDJworCQkgJiYgaTJjX3NtYnVzX3JlYWRfYnl0ZShuZXdfY2xpZW50KSA9PSAnRycKKwkJICYmIGkyY19zbWJ1c19yZWFkX2J5dGUobmV3X2NsaWVudCkgPT0gJy0nKSB7CisJCQlkZXZfaW5mbygmbmV3X2NsaWVudC0+ZGV2LCAiVmFpbyBFRVBST00gZGV0ZWN0ZWQsICIKKwkJCQkiZW5hYmxpbmcgcGFzc3dvcmQgcHJvdGVjdGlvblxuIik7CisJCQlkYXRhLT5uYXR1cmUgPSBWQUlPOworCQl9CisJfQorCisJLyogY3JlYXRlIHRoZSBzeXNmcyBlZXByb20gZmlsZSAqLworCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZlZXByb21fYXR0cik7CisKKwlyZXR1cm4gMDsKKworZXhpdF9rZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBlZXByb21fZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwllcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVlcHJvbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZlZXByb21fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVlcHJvbV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmVlcHJvbV9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gYW5kICIKKwkJIlBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4gYW5kICIKKwkJIkdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBFRVBST00gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGVlcHJvbV9pbml0KTsKK21vZHVsZV9leGl0KGVlcHJvbV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY2hlci5jIGIvZHJpdmVycy9pMmMvY2hpcHMvZnNjaGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMzNhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY2hlci5jCkBAIC0wLDAgKzEsNjkyIEBACisvKgorICogZnNjaGVyLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICogbW9uaXRvcmluZworICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IFJlaW5oYXJkIE5pc3NsIDxybmlzc2xAZ214LmRlPgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIAorICogIGZ1aml0c3Ugc2llbWVucyBoZXJtZXMgY2hpcCwgCisgKiAgbW9kdWxlIGJhc2VkIG9uIGZzY3Bvcy5jIAorICogIENvcHlyaWdodCAoQykgMjAwMCBIZXJtYW5uIEp1bmcgPGhlakBvZG4uZGU+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KKyAqICBhbmQgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKy8qCisgKiBBZGRyZXNzZXMgdG8gc2NhbgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NzMsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qCisgKiBJbnNtb2QgcGFyYW1ldGVycworICovCisKK1NFTlNPUlNfSU5TTU9EXzEoZnNjaGVyKTsKKworLyoKKyAqIFRoZSBGU0NIRVIgcmVnaXN0ZXJzCisgKi8KKworLyogY2hpcCBpZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSBGU0NIRVJfUkVHX0lERU5UXzAJCTB4MDAKKyNkZWZpbmUgRlNDSEVSX1JFR19JREVOVF8xCQkweDAxCisjZGVmaW5lIEZTQ0hFUl9SRUdfSURFTlRfMgkJMHgwMgorI2RlZmluZSBGU0NIRVJfUkVHX1JFVklTSU9OCQkweDAzCisKKy8qIGdsb2JhbCBjb250cm9sIGFuZCBzdGF0dXMgKi8KKyNkZWZpbmUgRlNDSEVSX1JFR19FVkVOVF9TVEFURQkJMHgwNAorI2RlZmluZSBGU0NIRVJfUkVHX0NPTlRST0wJCTB4MDUKKworLyogd2F0Y2hkb2cgKi8KKyNkZWZpbmUgRlNDSEVSX1JFR19XRE9HX1BSRVNFVAkJMHgyOAorI2RlZmluZSBGU0NIRVJfUkVHX1dET0dfU1RBVEUJCTB4MjMKKyNkZWZpbmUgRlNDSEVSX1JFR19XRE9HX0NPTlRST0wJCTB4MjEKKworLyogZmFuIDAgKi8KKyNkZWZpbmUgRlNDSEVSX1JFR19GQU4wX01JTgkJMHg1NQorI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjBfQUNUCQkweDBlCisjZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMF9TVEFURQkJMHgwZAorI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjBfUklQUExFCQkweDBmCisKKy8qIGZhbiAxICovCisjZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMV9NSU4JCTB4NjUKKyNkZWZpbmUgRlNDSEVSX1JFR19GQU4xX0FDVAkJMHg2YgorI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjFfU1RBVEUJCTB4NjIKKyNkZWZpbmUgRlNDSEVSX1JFR19GQU4xX1JJUFBMRQkJMHg2ZgorCisvKiBmYW4gMiAqLworI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjJfTUlOCQkweGI1CisjZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMl9BQ1QJCTB4YmIKKyNkZWZpbmUgRlNDSEVSX1JFR19GQU4yX1NUQVRFCQkweGIyCisjZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMl9SSVBQTEUJCTB4YmYKKworLyogdm9sdGFnZSBzdXBlcnZpc2lvbiAqLworI2RlZmluZSBGU0NIRVJfUkVHX1ZPTFRfMTIJCTB4NDUKKyNkZWZpbmUgRlNDSEVSX1JFR19WT0xUXzUJCTB4NDIKKyNkZWZpbmUgRlNDSEVSX1JFR19WT0xUX0JBVFQJCTB4NDgKKworLyogdGVtcGVyYXR1cmUgMCAqLworI2RlZmluZSBGU0NIRVJfUkVHX1RFTVAwX0FDVAkJMHg2NAorI2RlZmluZSBGU0NIRVJfUkVHX1RFTVAwX1NUQVRFCQkweDcxCisKKy8qIHRlbXBlcmF0dXJlIDEgKi8KKyNkZWZpbmUgRlNDSEVSX1JFR19URU1QMV9BQ1QJCTB4MzIKKyNkZWZpbmUgRlNDSEVSX1JFR19URU1QMV9TVEFURQkJMHg4MQorCisvKiB0ZW1wZXJhdHVyZSAyICovCisjZGVmaW5lIEZTQ0hFUl9SRUdfVEVNUDJfQUNUCQkweDM1CisjZGVmaW5lIEZTQ0hFUl9SRUdfVEVNUDJfU1RBVEUJCTB4OTEKKworLyoKKyAqIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbgorICovCisKK3N0YXRpYyBpbnQgZnNjaGVyX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGZzY2hlcl9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCBmc2NoZXJfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBzdHJ1Y3QgZnNjaGVyX2RhdGEgKmZzY2hlcl91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmc2NoZXJfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBpbnQgZnNjaGVyX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKTsKK3N0YXRpYyBpbnQgZnNjaGVyX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpOworCisvKgorICogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykKKyAqLworIAorc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGZzY2hlcl9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJmc2NoZXIiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfRlNDSEVSLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGZzY2hlcl9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGZzY2hlcl9kZXRhY2hfY2xpZW50LAorfTsKKworLyoKKyAqIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pCisgKi8KKworc3RydWN0IGZzY2hlcl9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KKworCS8qIHJlZ2lzdGVyIHZhbHVlcyAqLworCXU4IHJldmlzaW9uOwkJLyogcmV2aXNpb24gb2YgY2hpcCAqLworCXU4IGdsb2JhbF9ldmVudDsJLyogZ2xvYmFsIGV2ZW50IHN0YXR1cyAqLworCXU4IGdsb2JhbF9jb250cm9sOwkvKiBnbG9iYWwgY29udHJvbCByZWdpc3RlciAqLworCXU4IHdhdGNoZG9nWzNdOwkJLyogd2F0Y2hkb2cgKi8KKwl1OCB2b2x0WzNdOwkJLyogMTIsIDUsIGJhdHRlcnkgdm9sdGFnZSAqLyAKKwl1OCB0ZW1wX2FjdFszXTsJCS8qIHRlbXBlcmF0dXJlICovCisJdTggdGVtcF9zdGF0dXNbM107CS8qIHN0YXR1cyBvZiBzZW5zb3IgKi8KKwl1OCBmYW5fYWN0WzNdOwkJLyogZmFucyByZXZvbHV0aW9ucyBwZXIgc2Vjb25kICovCisJdTggZmFuX3N0YXR1c1szXTsJLyogZmFuIHN0YXR1cyAqLworCXU4IGZhbl9taW5bM107CQkvKiBmYW4gbWluIHZhbHVlIGZvciBycHMgKi8KKwl1OCBmYW5fcmlwcGxlWzNdOwkvKiBkaXZpZGVyIGZvciBycHMgKi8KK307CisKKy8qCisgKiBTeXNmcyBzdHVmZgorICovCisKKyNkZWZpbmUgc3lzZnNfcihraW5kLCBzdWIsIG9mZnNldCwgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMja2luZCMjc3ViIChzdHJ1Y3QgZnNjaGVyX2RhdGEgKiwgY2hhciAqLCBpbnQpOyBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMja2luZCMjb2Zmc2V0IyNzdWIgKHN0cnVjdCBkZXZpY2UgKiwgY2hhciAqKTsgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI2tpbmQjI29mZnNldCMjc3ViIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhID0gZnNjaGVyX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzaG93XyMja2luZCMjc3ViKGRhdGEsIGJ1ZiwgKG9mZnNldCkpOyBcCit9CisKKyNkZWZpbmUgc3lzZnNfdyhraW5kLCBzdWIsIG9mZnNldCwgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfIyNraW5kIyNzdWIgKHN0cnVjdCBpMmNfY2xpZW50ICosIHN0cnVjdCBmc2NoZXJfZGF0YSAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgaW50LCBpbnQpOyBcCitzdGF0aWMgc3NpemVfdCBzZXRfIyNraW5kIyNvZmZzZXQjI3N1YiAoc3RydWN0IGRldmljZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7IFwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI2tpbmQjI29mZnNldCMjc3ViIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlyZXR1cm4gc2V0XyMja2luZCMjc3ViKGNsaWVudCwgZGF0YSwgYnVmLCBjb3VudCwgKG9mZnNldCksIHJlZyk7IFwKK30KKworI2RlZmluZSBzeXNmc19yd19uKGtpbmQsIHN1Yiwgb2Zmc2V0LCByZWcpIFwKK3N5c2ZzX3Ioa2luZCwgc3ViLCBvZmZzZXQsIHJlZykgXAorc3lzZnNfdyhraW5kLCBzdWIsIG9mZnNldCwgcmVnKSBcCitzdGF0aWMgREVWSUNFX0FUVFIoa2luZCMjb2Zmc2V0IyNzdWIsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93XyMja2luZCMjb2Zmc2V0IyNzdWIsIHNldF8jI2tpbmQjI29mZnNldCMjc3ViKTsKKworI2RlZmluZSBzeXNmc19ydyhraW5kLCBzdWIsIHJlZykgXAorc3lzZnNfcihraW5kLCBzdWIsIDAsIHJlZykgXAorc3lzZnNfdyhraW5kLCBzdWIsIDAsIHJlZykgXAorc3RhdGljIERFVklDRV9BVFRSKGtpbmQjI3N1YiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfIyNraW5kIyMwIyNzdWIsIHNldF8jI2tpbmQjIzAjI3N1Yik7CisKKyNkZWZpbmUgc3lzZnNfcm9fbihraW5kLCBzdWIsIG9mZnNldCwgcmVnKSBcCitzeXNmc19yKGtpbmQsIHN1Yiwgb2Zmc2V0LCByZWcpIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihraW5kIyNvZmZzZXQjI3N1YiwgU19JUlVHTywgc2hvd18jI2tpbmQjI29mZnNldCMjc3ViLCBOVUxMKTsKKworI2RlZmluZSBzeXNmc19ybyhraW5kLCBzdWIsIHJlZykgXAorc3lzZnNfcihraW5kLCBzdWIsIDAsIHJlZykgXAorc3RhdGljIERFVklDRV9BVFRSKGtpbmQsIFNfSVJVR08sIHNob3dfIyNraW5kIyMwIyNzdWIsIE5VTEwpOworCisjZGVmaW5lIHN5c2ZzX2ZhbihvZmZzZXQsIHJlZ19zdGF0dXMsIHJlZ19taW4sIHJlZ19yaXBwbGUsIHJlZ19hY3QpIFwKK3N5c2ZzX3J3X24ocHdtLCAgICAgICAgLCBvZmZzZXQsIHJlZ19taW4pIFwKK3N5c2ZzX3J3X24oZmFuLCBfc3RhdHVzLCBvZmZzZXQsIHJlZ19zdGF0dXMpIFwKK3N5c2ZzX3J3X24oZmFuLCBfZGl2ICAgLCBvZmZzZXQsIHJlZ19yaXBwbGUpIFwKK3N5c2ZzX3JvX24oZmFuLCBfaW5wdXQgLCBvZmZzZXQsIHJlZ19hY3QpCisKKyNkZWZpbmUgc3lzZnNfdGVtcChvZmZzZXQsIHJlZ19zdGF0dXMsIHJlZ19hY3QpIFwKK3N5c2ZzX3J3X24odGVtcCwgX3N0YXR1cywgb2Zmc2V0LCByZWdfc3RhdHVzKSBcCitzeXNmc19yb19uKHRlbXAsIF9pbnB1dCAsIG9mZnNldCwgcmVnX2FjdCkKKyAgICAKKyNkZWZpbmUgc3lzZnNfaW4ob2Zmc2V0LCByZWdfYWN0KSBcCitzeXNmc19yb19uKGluLCBfaW5wdXQsIG9mZnNldCwgcmVnX2FjdCkKKworI2RlZmluZSBzeXNmc19yZXZpc2lvbihyZWdfcmV2aXNpb24pIFwKK3N5c2ZzX3JvKHJldmlzaW9uLCAsIHJlZ19yZXZpc2lvbikKKworI2RlZmluZSBzeXNmc19hbGFybXMocmVnX2V2ZW50cykgXAorc3lzZnNfcm8oYWxhcm1zLCAsIHJlZ19ldmVudHMpCisKKyNkZWZpbmUgc3lzZnNfY29udHJvbChyZWdfY29udHJvbCkgXAorc3lzZnNfcncoY29udHJvbCwgLCByZWdfY29udHJvbCkKKworI2RlZmluZSBzeXNmc193YXRjaGRvZyhyZWdfY29udHJvbCwgcmVnX3N0YXR1cywgcmVnX3ByZXNldCkgXAorc3lzZnNfcncod2F0Y2hkb2csIF9jb250cm9sLCByZWdfY29udHJvbCkgXAorc3lzZnNfcncod2F0Y2hkb2csIF9zdGF0dXMgLCByZWdfc3RhdHVzKSBcCitzeXNmc19ydyh3YXRjaGRvZywgX3ByZXNldCAsIHJlZ19wcmVzZXQpCisKK3N5c2ZzX2ZhbigxLCBGU0NIRVJfUkVHX0ZBTjBfU1RBVEUsIEZTQ0hFUl9SRUdfRkFOMF9NSU4sCisJICAgICBGU0NIRVJfUkVHX0ZBTjBfUklQUExFLCBGU0NIRVJfUkVHX0ZBTjBfQUNUKQorc3lzZnNfZmFuKDIsIEZTQ0hFUl9SRUdfRkFOMV9TVEFURSwgRlNDSEVSX1JFR19GQU4xX01JTiwKKwkgICAgIEZTQ0hFUl9SRUdfRkFOMV9SSVBQTEUsIEZTQ0hFUl9SRUdfRkFOMV9BQ1QpCitzeXNmc19mYW4oMywgRlNDSEVSX1JFR19GQU4yX1NUQVRFLCBGU0NIRVJfUkVHX0ZBTjJfTUlOLAorCSAgICAgRlNDSEVSX1JFR19GQU4yX1JJUFBMRSwgRlNDSEVSX1JFR19GQU4yX0FDVCkKKworc3lzZnNfdGVtcCgxLCBGU0NIRVJfUkVHX1RFTVAwX1NUQVRFLCBGU0NIRVJfUkVHX1RFTVAwX0FDVCkKK3N5c2ZzX3RlbXAoMiwgRlNDSEVSX1JFR19URU1QMV9TVEFURSwgRlNDSEVSX1JFR19URU1QMV9BQ1QpCitzeXNmc190ZW1wKDMsIEZTQ0hFUl9SRUdfVEVNUDJfU1RBVEUsIEZTQ0hFUl9SRUdfVEVNUDJfQUNUKQorCitzeXNmc19pbigwLCBGU0NIRVJfUkVHX1ZPTFRfMTIpCitzeXNmc19pbigxLCBGU0NIRVJfUkVHX1ZPTFRfNSkKK3N5c2ZzX2luKDIsIEZTQ0hFUl9SRUdfVk9MVF9CQVRUKQorCitzeXNmc19yZXZpc2lvbihGU0NIRVJfUkVHX1JFVklTSU9OKQorc3lzZnNfYWxhcm1zKEZTQ0hFUl9SRUdfRVZFTlRTKQorc3lzZnNfY29udHJvbChGU0NIRVJfUkVHX0NPTlRST0wpCitzeXNmc193YXRjaGRvZyhGU0NIRVJfUkVHX1dET0dfQ09OVFJPTCwgRlNDSEVSX1JFR19XRE9HX1NUQVRFLCBGU0NIRVJfUkVHX1dET0dfUFJFU0VUKQorICAKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfc3RhdHVzKTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20jI29mZnNldCk7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19kaXYpOyBcCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfaW5wdXQpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV90ZW1wKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjb2Zmc2V0IyNfc3RhdHVzKTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNvZmZzZXQjI19pbnB1dCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2luKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI29mZnNldCMjX2lucHV0KTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfcmV2aXNpb24oY2xpZW50KSBcCitkbyB7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcmV2aXNpb24pOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9hbGFybXMoY2xpZW50KSBcCitkbyB7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfY29udHJvbChjbGllbnQpIFwKK2RvIHsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jb250cm9sKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfd2F0Y2hkb2coY2xpZW50KSBcCitkbyB7IFwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfd2F0Y2hkb2dfc3RhdHVzKTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl93YXRjaGRvZ19jb250cm9sKTsgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl93YXRjaGRvZ19wcmVzZXQpOyBcCit9IHdoaWxlICgwKQorICAKKy8qCisgKiBSZWFsIGNvZGUKKyAqLworCitzdGF0aWMgaW50IGZzY2hlcl9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBmc2NoZXJfZGV0ZWN0KTsKK30KKworc3RhdGljIGludCBmc2NoZXJfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJZ290byBleGl0OworCisJLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKKwkgKiBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KKwkgKiBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEuICovCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmc2NoZXJfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisgIAl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgZnNjaGVyX2RhdGEpKTsKKworCS8qIFRoZSBjb21tb24gSTJDIGNsaWVudCBkYXRhIGlzIHBsYWNlZCByaWdodCBiZWZvcmUgdGhlCisJICogSGVybWVzLXNwZWNpZmljIGRhdGEuICovCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZmc2NoZXJfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIERvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uIHVubGVzcyBmb3JjZSBvciBmb3JjZV9mc2NoZXIgcGFyYW1ldGVyICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCSAgICAgRlNDSEVSX1JFR19JREVOVF8wKSAhPSAweDQ4KQkvKiAnSCcgKi8KKwkJIHx8IChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJICAgICBGU0NIRVJfUkVHX0lERU5UXzEpICE9IDB4NDUpCS8qICdFJyAqLworCQkgfHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkgICAgIEZTQ0hFUl9SRUdfSURFTlRfMikgIT0gMHg1MikpCS8qICdSJyAqLworCQkJZ290byBleGl0X2ZyZWU7CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpdCBpbnRvIHRoZQorCSAqIGdsb2JhbCBsaXN0ICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAiZnNjaGVyIiwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwlmc2NoZXJfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZV9yZXZpc2lvbihuZXdfY2xpZW50KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKG5ld19jbGllbnQpOworCWRldmljZV9jcmVhdGVfZmlsZV9jb250cm9sKG5ld19jbGllbnQpOworCWRldmljZV9jcmVhdGVfZmlsZV93YXRjaGRvZyhuZXdfY2xpZW50KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDIpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgMyk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAzKTsKKworCXJldHVybiAwOworCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnNjaGVyX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZzY2hlcl9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgInJlYWQgcmVnIDB4JTAyeFxuIiwgcmVnKTsKKworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCitzdGF0aWMgaW50IGZzY2hlcl93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKQoreworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAid3JpdGUgcmVnIDB4JTAyeCwgdmFsIDB4JTAyeFxuIiwKKwkJcmVnLCB2YWx1ZSk7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IEZTQyBIZXJtZXMuICovCitzdGF0aWMgdm9pZCBmc2NoZXJfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCS8qIFJlYWQgcmV2aXNpb24gZnJvbSBjaGlwICovCisJZGF0YS0+cmV2aXNpb24gPSAgZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1JFVklTSU9OKTsKK30KKworc3RhdGljIHN0cnVjdCBmc2NoZXJfZGF0YSAqZnNjaGVyX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyAyICogSFopIHx8ICFkYXRhLT52YWxpZCkgeworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgZnNjaGVyIHVwZGF0ZVxuIik7CisKKwkJZGF0YS0+dGVtcF9hY3RbMF0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfVEVNUDBfQUNUKTsKKwkJZGF0YS0+dGVtcF9hY3RbMV0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfVEVNUDFfQUNUKTsKKwkJZGF0YS0+dGVtcF9hY3RbMl0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfVEVNUDJfQUNUKTsKKwkJZGF0YS0+dGVtcF9zdGF0dXNbMF0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfVEVNUDBfU1RBVEUpOworCQlkYXRhLT50ZW1wX3N0YXR1c1sxXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19URU1QMV9TVEFURSk7CisJCWRhdGEtPnRlbXBfc3RhdHVzWzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1RFTVAyX1NUQVRFKTsKKworCQlkYXRhLT52b2x0WzBdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1ZPTFRfMTIpOworCQlkYXRhLT52b2x0WzFdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1ZPTFRfNSk7CisJCWRhdGEtPnZvbHRbMl0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfVk9MVF9CQVRUKTsKKworCQlkYXRhLT5mYW5fYWN0WzBdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjBfQUNUKTsKKwkJZGF0YS0+ZmFuX2FjdFsxXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4xX0FDVCk7CisJCWRhdGEtPmZhbl9hY3RbMl0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfRkFOMl9BQ1QpOworCQlkYXRhLT5mYW5fc3RhdHVzWzBdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjBfU1RBVEUpOworCQlkYXRhLT5mYW5fc3RhdHVzWzFdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjFfU1RBVEUpOworCQlkYXRhLT5mYW5fc3RhdHVzWzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjJfU1RBVEUpOworCQlkYXRhLT5mYW5fbWluWzBdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjBfTUlOKTsKKwkJZGF0YS0+ZmFuX21pblsxXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4xX01JTik7CisJCWRhdGEtPmZhbl9taW5bMl0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfRkFOMl9NSU4pOworCQlkYXRhLT5mYW5fcmlwcGxlWzBdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjBfUklQUExFKTsKKwkJZGF0YS0+ZmFuX3JpcHBsZVsxXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4xX1JJUFBMRSk7CisJCWRhdGEtPmZhbl9yaXBwbGVbMl0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfRkFOMl9SSVBQTEUpOworCisJCWRhdGEtPndhdGNoZG9nWzBdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1dET0dfUFJFU0VUKTsKKwkJZGF0YS0+d2F0Y2hkb2dbMV0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfV0RPR19TVEFURSk7CisJCWRhdGEtPndhdGNoZG9nWzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1dET0dfQ09OVFJPTCk7CisKKwkJZGF0YS0+Z2xvYmFsX2V2ZW50ID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0VWRU5UX1NUQVRFKTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7ICAgICAgICAgICAgICAgICAKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKKworCisjZGVmaW5lIEZBTl9JTkRFWF9GUk9NX05VTShucikJKChucikgLSAxKQorCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQoreworCS8qIGJpdHMgMC4uMSwgMy4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgwNCAqLyAgCisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweDA0OworCQorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fc3RhdHVzW0ZBTl9JTkRFWF9GUk9NX05VTShucildICY9IH52OworCWZzY2hlcl93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgdik7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX3N0YXR1cyhzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCS8qIGJpdHMgMC4uMSwgMy4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgwNCAqLyAgCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmZhbl9zdGF0dXNbRkFOX0lOREVYX0ZST01fTlVNKG5yKV0gJiAweDA0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsCisJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bRkFOX0lOREVYX0ZST01fTlVNKG5yKV0gPSB2ID4gMHhmZiA/IDB4ZmYgOiB2OworCWZzY2hlcl93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+ZmFuX21pbltGQU5fSU5ERVhfRlJPTV9OVU0obnIpXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmZhbl9taW5bRkFOX0lOREVYX0ZST01fTlVNKG5yKV0pOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQoreworCS8qIHN1cHBvcnRlZCB2YWx1ZXM6IDIsIDQsIDggKi8KKwl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCXN3aXRjaCAodikgeworCWNhc2UgMjogdiA9IDE7IGJyZWFrOworCWNhc2UgNDogdiA9IDI7IGJyZWFrOworCWNhc2UgODogdiA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFuX2RpdiB2YWx1ZSAlbGQgbm90ICIKKwkJCSAic3VwcG9ydGVkLiBDaG9vc2Ugb25lIG9mIDIsIDQgb3IgOCFcbiIsIHYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBiaXRzIDIuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDMgKi8KKwlkYXRhLT5mYW5fcmlwcGxlW0ZBTl9JTkRFWF9GUk9NX05VTShucildICY9IH4weDAzOworCWRhdGEtPmZhbl9yaXBwbGVbRkFOX0lOREVYX0ZST01fTlVNKG5yKV0gfD0gdjsKKworCWZzY2hlcl93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+ZmFuX3JpcHBsZVtGQU5fSU5ERVhfRlJPTV9OVU0obnIpXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCS8qIGJpdHMgMi4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgwMyAqLyAgCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIDEgPDwgKGRhdGEtPmZhbl9yaXBwbGVbRkFOX0lOREVYX0ZST01fTlVNKG5yKV0gJiAweDAzKSk7Cit9CisKKyNkZWZpbmUgUlBNX0ZST01fUkVHKHZhbCkJKHZhbCo2MCkKKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5faW5wdXQgKHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIFJQTV9GUk9NX1JFRyhkYXRhLT5mYW5fYWN0W0ZBTl9JTkRFWF9GUk9NX05VTShucildKSk7Cit9CisKKworCisjZGVmaW5lIFRFTVBfSU5ERVhfRlJPTV9OVU0obnIpCQkoKG5yKSAtIDEpCisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuciwgaW50IHJlZykKK3sKKwkvKiBiaXRzIDIuLjcgcmVzZXJ2ZWQsIDAgcmVhZCBvbmx5ID0+IG1hc2sgd2l0aCAweDAyICovICAKKwl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIDB4MDI7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9zdGF0dXNbVEVNUF9JTkRFWF9GUk9NX05VTShucildICY9IH52OworCWZzY2hlcl93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgdik7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9zdGF0dXMoc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKK3sKKwkvKiBiaXRzIDIuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDMgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+dGVtcF9zdGF0dXNbVEVNUF9JTkRFWF9GUk9NX05VTShucildICYgMHgwMyk7Cit9CisKKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCSgoKHZhbCkgLSAxMjgpICogMTAwMCkKKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2lucHV0KHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9hY3RbVEVNUF9JTkRFWF9GUk9NX05VTShucildKSk7Cit9CisKKy8qCisgKiBUaGUgZmluYWwgY29udmVyc2lvbiBpcyBzcGVjaWZpZWQgaW4gc2Vuc29ycy5jb25mLCBhcyBpdCBkZXBlbmRzIG9uCisgKiBtYWluYm9hcmQgc3BlY2lmaWMgdmFsdWVzLiBXZSBleHBvcnQgdGhlIHJlZ2lzdGVycyBjb250ZW50cyBhcworICogcHNldWRvLWh1bmRyZWR0aHMtb2YtVm9sdHMgKHJhbmdlIDBWIC0gMi41NVYpLiBOb3QgdGhhdCBpdCBtYWtlcyBtdWNoCisgKiBzZW5zZSBwZXIgc2UsIGJ1dCBpdCBtaW5pbWl6ZXMgdGhlIGNvbnZlcnNpb25zIGNvdW50IGFuZCBrZWVwcyB0aGUKKyAqIHZhbHVlcyB3aXRoaW4gYSB1c3VhbCByYW5nZS4KKyAqLworI2RlZmluZSBWT0xUX0ZST01fUkVHKHZhbCkJKCh2YWwpICogMTApCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5faW5wdXQoc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgVk9MVF9GUk9NX1JFRyhkYXRhLT52b2x0W25yXSkpOworfQorCisKKworc3RhdGljIHNzaXplX3Qgc2hvd19yZXZpc2lvbihzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5yZXZpc2lvbik7Cit9CisKKworCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCS8qIGJpdHMgMiwgNS4uNiByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHg5YiAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5nbG9iYWxfZXZlbnQgJiAweDliKTsKK30KKworCisKK3N0YXRpYyBzc2l6ZV90IHNldF9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIsIGludCByZWcpCit7CisJLyogYml0cyAxLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAxICovICAKKwl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIDB4MDE7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+Z2xvYmFsX2NvbnRyb2wgJj0gfnY7CisJZnNjaGVyX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCB2KTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19jb250cm9sKHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJLyogYml0cyAxLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAxICovCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmdsb2JhbF9jb250cm9sICYgMHgwMSk7Cit9CisKKworCitzdGF0aWMgc3NpemVfdCBzZXRfd2F0Y2hkb2dfY29udHJvbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QKKwkJCQkgICAgZnNjaGVyX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJCSAgICBpbnQgbnIsIGludCByZWcpCit7CisJLyogYml0cyAwLi4zIHJlc2VydmVkID0+IG1hc2sgd2l0aCAweGYwICovICAKKwl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIDB4ZjA7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+d2F0Y2hkb2dbMl0gJj0gfjB4ZjA7CisJZGF0YS0+d2F0Y2hkb2dbMl0gfD0gdjsKKwlmc2NoZXJfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPndhdGNoZG9nWzJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd193YXRjaGRvZ19jb250cm9sKHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJLyogYml0cyAwLi4zIHJlc2VydmVkLCBiaXQgNSB3cml0ZSBvbmx5ID0+IG1hc2sgd2l0aCAweGQwICovCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPndhdGNoZG9nWzJdICYgMHhkMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF93YXRjaGRvZ19zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIsIGludCByZWcpCit7CisJLyogYml0cyAwLCAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAyICovICAKKwl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIDB4MDI7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+d2F0Y2hkb2dbMV0gJj0gfnY7CisJZnNjaGVyX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCB2KTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd193YXRjaGRvZ19zdGF0dXMoc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKK3sKKwkvKiBiaXRzIDAsIDIuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDIgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+d2F0Y2hkb2dbMV0gJiAweDAyKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3dhdGNoZG9nX3ByZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuciwgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIDB4ZmY7CisJCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPndhdGNoZG9nWzBdID0gdjsKKwlmc2NoZXJfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPndhdGNoZG9nWzBdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd193YXRjaGRvZ19wcmVzZXQoc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+d2F0Y2hkb2dbMF0pOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2ZzY2hlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZmc2NoZXJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfZnNjaGVyX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZnNjaGVyX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlJlaW5oYXJkIE5pc3NsIDxybmlzc2xAZ214LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGU0MgSGVybWVzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2ZzY2hlcl9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfZnNjaGVyX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvZnNjcG9zLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9mc2Nwb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNzkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvZnNjcG9zLmMKQEAgLTAsMCArMSw2NDEgQEAKKy8qCisJZnNjcG9zLmMgLSBLZXJuZWwgbW9kdWxlIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nIHdpdGggRlNDIFBvc2VpZG9uIGNoaXBzCisJQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFN0ZWZhbiBPdHQgPHN0ZWZhbkBkZXNpcmUuY2g+CisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKwlHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKwlhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKwlmdWppdHN1IHNpZW1lbnMgcG9zZWlkb24gY2hpcCwKKwltb2R1bGUgYmFzZWQgb24gdGhlIG9sZCBmc2Nwb3MgbW9kdWxlIGJ5IEhlcm1hbm4gSnVuZyA8aGVqQG9kbi5kZT4gYW5kCisJdGhlIGZzY2hlciBtb2R1bGUgYnkgUmVpbmhhcmQgTmlzc2wgPHJuaXNzbEBnbXguZGU+CisKKwlvcmlnaW5hbCBtb2R1bGUgYmFzZWQgb24gbG04MC5jCisJQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KKwlhbmQgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPgorCisJVGhhbmtzIHRvIEplYW4gRGVsdmFyZSBmb3IgcmV2aWV3aW5nIG15IGNvZGUgYW5kIHN1Z2dlc3RpbmcgYSBsb3Qgb2YKKwlpbXByb3ZlbWVudHMuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKy8qCisgKiBBZGRyZXNzZXMgdG8gc2NhbgorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDczLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKgorICogSW5zbW9kIHBhcmFtZXRlcnMKKyAqLworU0VOU09SU19JTlNNT0RfMShmc2Nwb3MpOworCisvKgorICogVGhlIEZTQ1BPUyByZWdpc3RlcnMKKyAqLworCisvKiBjaGlwIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIEZTQ1BPU19SRUdfSURFTlRfMAkJMHgwMAorI2RlZmluZSBGU0NQT1NfUkVHX0lERU5UXzEJCTB4MDEKKyNkZWZpbmUgRlNDUE9TX1JFR19JREVOVF8yCQkweDAyCisjZGVmaW5lIEZTQ1BPU19SRUdfUkVWSVNJT04JCTB4MDMKKworLyogZ2xvYmFsIGNvbnRyb2wgYW5kIHN0YXR1cyAqLworI2RlZmluZSBGU0NQT1NfUkVHX0VWRU5UX1NUQVRFCQkweDA0CisjZGVmaW5lIEZTQ1BPU19SRUdfQ09OVFJPTAkJMHgwNQorCisvKiB3YXRjaGRvZyAqLworI2RlZmluZSBGU0NQT1NfUkVHX1dET0dfUFJFU0VUCQkweDI4CisjZGVmaW5lIEZTQ1BPU19SRUdfV0RPR19TVEFURQkJMHgyMworI2RlZmluZSBGU0NQT1NfUkVHX1dET0dfQ09OVFJPTAkJMHgyMQorCisvKiB2b2x0YWdlcyAqLworI2RlZmluZSBGU0NQT1NfUkVHX1ZPTFRfMTIJCTB4NDUKKyNkZWZpbmUgRlNDUE9TX1JFR19WT0xUXzUJCTB4NDIKKyNkZWZpbmUgRlNDUE9TX1JFR19WT0xUX0JBVFQJCTB4NDgKKworLyogZmFucyAtIHRoZSBjaGlwIGRvZXMgbm90IHN1cHBvcnQgbWluaW11bSBzcGVlZCBmb3IgZmFuMiAqLworc3RhdGljIHU4IEZTQ1BPU19SRUdfUFdNW10gPSB7IDB4NTUsIDB4NjUgfTsKK3N0YXRpYyB1OCBGU0NQT1NfUkVHX0ZBTl9BQ1RbXSA9IHsgMHgwZSwgMHg2YiwgMHhhYiB9Oworc3RhdGljIHU4IEZTQ1BPU19SRUdfRkFOX1NUQVRFW10gPSB7IDB4MGQsIDB4NjIsIDB4YTIgfTsKK3N0YXRpYyB1OCBGU0NQT1NfUkVHX0ZBTl9SSVBQTEVbXSA9IHsgMHgwZiwgMHg2ZiwgMHhhZiB9OworCisvKiB0ZW1wZXJhdHVyZXMgKi8KK3N0YXRpYyB1OCBGU0NQT1NfUkVHX1RFTVBfQUNUW10gPSB7IDB4NjQsIDB4MzIsIDB4MzUgfTsKK3N0YXRpYyB1OCBGU0NQT1NfUkVHX1RFTVBfU1RBVEVbXSA9IHsgMHg3MSwgMHg4MSwgMHg5MSB9OworCisvKgorICogRnVuY3Rpb25zIGRlY2xhcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgZnNjcG9zX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGZzY3Bvc19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCBmc2Nwb3NfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIGludCBmc2Nwb3NfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3Rlcik7CitzdGF0aWMgaW50IGZzY3Bvc193cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3RlciwgdTggdmFsdWUpOworc3RhdGljIHN0cnVjdCBmc2Nwb3NfZGF0YSAqZnNjcG9zX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGZzY3Bvc19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIHZvaWQgcmVzZXRfZmFuX2FsYXJtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBucik7CisKKy8qCisgKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKQorICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZnNjcG9zX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImZzY3BvcyIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9GU0NQT1MsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gZnNjcG9zX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gZnNjcG9zX2RldGFjaF9jbGllbnQsCit9OworCisvKgorICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKKyAqLworc3RydWN0IGZzY3Bvc19kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOyAJCS8qIDAgdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJLyogcmVnaXN0ZXIgdmFsdWVzICovCisJdTggcmV2aXNpb247CQkvKiByZXZpc2lvbiBvZiBjaGlwICovCisJdTggZ2xvYmFsX2V2ZW50OwkvKiBnbG9iYWwgZXZlbnQgc3RhdHVzICovCisJdTggZ2xvYmFsX2NvbnRyb2w7CS8qIGdsb2JhbCBjb250cm9sIHJlZ2lzdGVyICovCisJdTggd2RvZ19jb250cm9sOwkvKiB3YXRjaGRvZyBjb250cm9sICovCisJdTggd2RvZ19zdGF0ZTsJCS8qIHdhdGNoZG9nIHN0YXR1cyAqLworCXU4IHdkb2dfcHJlc2V0OwkJLyogd2F0Y2hkb2cgcHJlc2V0ICovCisJdTggdm9sdFszXTsJCS8qIDEyLCA1LCBiYXR0ZXJ5IGN1cnJlbnQgKi8KKwl1OCB0ZW1wX2FjdFszXTsJCS8qIHRlbXBlcmF0dXJlICovCisJdTggdGVtcF9zdGF0dXNbM107CS8qIHN0YXR1cyBvZiBzZW5zb3IgKi8KKwl1OCBmYW5fYWN0WzNdOwkJLyogZmFucyByZXZvbHV0aW9ucyBwZXIgc2Vjb25kICovCisJdTggZmFuX3N0YXR1c1szXTsJLyogZmFuIHN0YXR1cyAqLworCXU4IHB3bVsyXTsJCS8qIGZhbiBtaW4gdmFsdWUgZm9yIHJwcyAqLworCXU4IGZhbl9yaXBwbGVbM107CS8qIGRpdmlkZXIgZm9yIHJwcyAqLworfTsKKworLyogVGVtcGVyYXR1cmUgKi8KKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCSgoKHZhbCkgLSAxMjgpICogMTAwMCkKKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2lucHV0KHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9hY3RbbnIgLSAxXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfc3RhdHVzKHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJLyogYml0cyAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAzICovCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPnRlbXBfc3RhdHVzW25yIC0gMV0gJiAweDAzKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX3Jlc2V0KHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX3Jlc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBmc2Nwb3NfZGF0YQorCQkJKmRhdGEsIGNvbnN0IGNoYXIgKmJ1ZiwJc2l6ZV90IGNvdW50LCBpbnQgbnIsIGludCByZWcpCit7CisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJaWYgKHYgIT0gMSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInRlbXBfcmVzZXQgdmFsdWUgJWxkIG5vdCBzdXBwb3J0ZWQuICIKKwkJCQkJIlVzZSAxIHRvIHJlc2V0IHRoZSBhbGFybSFcbiIsIHYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJZb3UgdXNlZCB0aGUgdGVtcF9yZXNldCBmZWF0dXJlIHdoaWNoIGhhcyBub3QgIgorCQkJCSJiZWVuIHByb3BsZXJseSB0ZXN0ZWQuIFBsZWFzZSByZXBvcnQgeW91ciAiCisJCQkJImV4cGVyaWVuY2UgdG8gdGhlIG1vZHVsZSBhdXRob3IuXG4iKTsKKworCS8qIFN1cHBvcnRlZCB2YWx1ZTogMiAoY2xlYXJzIHRoZSBzdGF0dXMpICovCisJZnNjcG9zX3dyaXRlX3ZhbHVlKGNsaWVudCwgRlNDUE9TX1JFR19URU1QX1NUQVRFW25yXSwgMik7CisJcmV0dXJuIGNvdW50OworfQorCisvKiBGYW5zICovCisjZGVmaW5lIFJQTV9GUk9NX1JFRyh2YWwpCSgodmFsKSAqIDYwKQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9zdGF0dXMoc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKK3sKKwkvKiBiaXRzIDAuLjEsIDMuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDQgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+ZmFuX3N0YXR1c1tuciAtIDFdICYgMHgwNCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2lucHV0KHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIFJQTV9GUk9NX1JFRyhkYXRhLT5mYW5fYWN0W25yIC0gMV0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fcmlwcGxlKHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJLyogYml0cyAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAzICovCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmZhbl9yaXBwbGVbbnIgLSAxXSAmIDB4MDMpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX3JpcHBsZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjcG9zX2RhdGEKKwkJCSpkYXRhLCBjb25zdCBjaGFyICpidWYsCXNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQoreworCS8qIHN1cHBvcnRlZCB2YWx1ZXM6IDIsIDQsIDggKi8KKwl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCXN3aXRjaCAodikgeworCQljYXNlIDI6IHYgPSAxOyBicmVhazsKKwkJY2FzZSA0OiB2ID0gMjsgYnJlYWs7CisJCWNhc2UgODogdiA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFuX3JpcHBsZSB2YWx1ZSAlbGQgbm90IHN1cHBvcnRlZC4gIgorCQkJCQkiTXVzdCBiZSBvbmUgb2YgMiwgNCBvciA4IVxuIiwgdik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJLyogYml0cyAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAzICovCisJZGF0YS0+ZmFuX3JpcHBsZVtuciAtIDFdICY9IH4weDAzOworCWRhdGEtPmZhbl9yaXBwbGVbbnIgLSAxXSB8PSB2OworCQorCWZzY3Bvc193cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+ZmFuX3JpcHBsZVtuciAtIDFdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+cHdtW25yIC0gMV0pOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJLyogUmFuZ2U6IDAuLjI1NSAqLworCWlmICh2IDwgMCkgdiA9IDA7CisJaWYgKHYgPiAyNTUpIHYgPSAyNTU7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtW25yIC0gMV0gPSB2OworCWZzY3Bvc193cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+cHdtW25yIC0gMV0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCByZXNldF9mYW5fYWxhcm0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG5yKQoreworCWZzY3Bvc193cml0ZV92YWx1ZShjbGllbnQsIEZTQ1BPU19SRUdfRkFOX1NUQVRFW25yXSwgNCk7Cit9CisKKy8qIFZvbHRzICovCisjZGVmaW5lIFZPTFRfRlJPTV9SRUcodmFsLCBtdWx0KQkoKHZhbCkgKiAobXVsdCkgLyAyNTUpCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdm9sdF8xMihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBmc2Nwb3NfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBWT0xUX0ZST01fUkVHKGRhdGEtPnZvbHRbMF0sIDE0MjAwKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdm9sdF81KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSA9IGZzY3Bvc191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIFZPTFRfRlJPTV9SRUcoZGF0YS0+dm9sdFsxXSwgNjYwMCkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3ZvbHRfYmF0dChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBmc2Nwb3NfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBWT0xUX0ZST01fUkVHKGRhdGEtPnZvbHRbMl0sIDMzMDApKTsKK30KKworLyogV2F0Y2hkb2cgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfd2RvZ19jb250cm9sKHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmKQoreworCS8qIGJpdHMgMC4uMyByZXNlcnZlZCwgYml0IDYgd3JpdGUgb25seSA9PiBtYXNrIHdpdGggMHhiMCAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT53ZG9nX2NvbnRyb2wgJiAweGIwKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3dkb2dfY29udHJvbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjcG9zX2RhdGEKKwkJCQkqZGF0YSwgY29uc3QgY2hhciAqYnVmLAlzaXplX3QgY291bnQsIGludCByZWcpCit7CisJLyogYml0cyAwLi4zIHJlc2VydmVkID0+IG1hc2sgd2l0aCAweGYwICovCisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweGYwOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPndkb2dfY29udHJvbCAmPSB+MHhmMDsKKwlkYXRhLT53ZG9nX2NvbnRyb2wgfD0gdjsKKwlmc2Nwb3Nfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPndkb2dfY29udHJvbCk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfd2RvZ19zdGF0ZShzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZikKK3sKKwkvKiBiaXRzIDAsIDIuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDIgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+d2RvZ19zdGF0ZSAmIDB4MDIpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfd2RvZ19zdGF0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjcG9zX2RhdGEKKwkJCQkqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCByZWcpCit7CisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweDAyOworCisJLyogVmFsaWQgdmFsdWVzOiAyIChjbGVhcikgKi8KKwlpZiAodiAhPSAyKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid2RvZ19zdGF0ZSB2YWx1ZSAlbGQgbm90IHN1cHBvcnRlZC4gIgorCQkJCQkiTXVzdCBiZSAyIHRvIGNsZWFyIHRoZSBzdGF0ZSFcbiIsIHYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+d2RvZ19zdGF0ZSAmPSB+djsKKwlmc2Nwb3Nfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHYpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3dkb2dfcHJlc2V0KHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT53ZG9nX3ByZXNldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF93ZG9nX3ByZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjcG9zX2RhdGEKKwkJCQkqZGF0YSwgY29uc3QgY2hhciAqYnVmLAlzaXplX3QgY291bnQsIGludCByZWcpCit7CisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweGZmOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPndkb2dfcHJlc2V0ID0gdjsKKwlmc2Nwb3Nfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPndkb2dfcHJlc2V0KTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworLyogRXZlbnQgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJLyogYml0cyA1Li43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDFmICovCisJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gZnNjcG9zX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+Z2xvYmFsX2V2ZW50ICYgMHg5Yik7Cit9CisKKy8qCisgKiBTeXNmcyBzdHVmZgorICovCisjZGVmaW5lIGNyZWF0ZV9nZXR0ZXIoa2luZCwgc3ViKSBcCisJc3RhdGljIHNzaXplX3Qgc3lzZnNfc2hvd18jI2tpbmQjI3N1YihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAorCXsgXAorCQlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBmc2Nwb3NfdXBkYXRlX2RldmljZShkZXYpOyBcCisJCXJldHVybiBzaG93XyMja2luZCMjc3ViKGRhdGEsIGJ1Zik7IFwKKwl9CisKKyNkZWZpbmUgY3JlYXRlX2dldHRlcl9uKGtpbmQsIG9mZnNldCwgc3ViKSBcCisJc3RhdGljIHNzaXplX3Qgc3lzZnNfc2hvd18jI2tpbmQjI29mZnNldCMjc3ViKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhclwKKwkJCQkJCQkJIAkqYnVmKSBcCisJeyBcCisJCXN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSA9IGZzY3Bvc191cGRhdGVfZGV2aWNlKGRldik7IFwKKwkJcmV0dXJuIHNob3dfIyNraW5kIyNzdWIoZGF0YSwgYnVmLCBvZmZzZXQpOyBcCisJfQorCisjZGVmaW5lIGNyZWF0ZV9zZXR0ZXIoa2luZCwgc3ViLCByZWcpIFwKKwlzdGF0aWMgc3NpemVfdCBzeXNmc19zZXRfIyNraW5kIyNzdWIgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciBcCisJCQkJCQkJKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCisJeyBcCisJCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwkJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwkJcmV0dXJuIHNldF8jI2tpbmQjI3N1YihjbGllbnQsIGRhdGEsIGJ1ZiwgY291bnQsIHJlZyk7IFwKKwl9CisKKyNkZWZpbmUgY3JlYXRlX3NldHRlcl9uKGtpbmQsIG9mZnNldCwgc3ViLCByZWcpIFwKKwlzdGF0aWMgc3NpemVfdCBzeXNmc19zZXRfIyNraW5kIyNvZmZzZXQjI3N1YiAoc3RydWN0IGRldmljZSAqZGV2LCBcCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCisJeyBcCisJCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwkJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwkJcmV0dXJuIHNldF8jI2tpbmQjI3N1YihjbGllbnQsIGRhdGEsIGJ1ZiwgY291bnQsIG9mZnNldCwgcmVnKTtcCisJfQorCisjZGVmaW5lIGNyZWF0ZV9zeXNmc19kZXZpY2Vfcm8oa2luZCwgc3ViLCBvZmZzZXQpIFwKKwlzdGF0aWMgREVWSUNFX0FUVFIoa2luZCMjb2Zmc2V0IyNzdWIsIFNfSVJVR08sIFwKKwkJCQkJc3lzZnNfc2hvd18jI2tpbmQjI29mZnNldCMjc3ViLCBOVUxMKTsKKworI2RlZmluZSBjcmVhdGVfc3lzZnNfZGV2aWNlX3J3KGtpbmQsIHN1Yiwgb2Zmc2V0KSBcCisJc3RhdGljIERFVklDRV9BVFRSKGtpbmQjI29mZnNldCMjc3ViLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzeXNmc19zaG93XyMja2luZCMjb2Zmc2V0IyNzdWIsIHN5c2ZzX3NldF8jI2tpbmQjI29mZnNldCMjc3ViKTsKKworI2RlZmluZSBzeXNmc19yb19uKGtpbmQsIHN1Yiwgb2Zmc2V0KSBcCisJY3JlYXRlX2dldHRlcl9uKGtpbmQsIG9mZnNldCwgc3ViKTsgXAorCWNyZWF0ZV9zeXNmc19kZXZpY2Vfcm8oa2luZCwgc3ViLCBvZmZzZXQpOworCisjZGVmaW5lIHN5c2ZzX3J3X24oa2luZCwgc3ViLCBvZmZzZXQsIHJlZykgXAorCWNyZWF0ZV9nZXR0ZXJfbihraW5kLCBvZmZzZXQsIHN1Yik7IFwKKwljcmVhdGVfc2V0dGVyX24oa2luZCwgb2Zmc2V0LCBzdWIsIHJlZyk7IFwKKwljcmVhdGVfc3lzZnNfZGV2aWNlX3J3KGtpbmQsIHN1Yiwgb2Zmc2V0KTsKKworI2RlZmluZSBzeXNmc19ydyhraW5kLCBzdWIsIHJlZykgXAorCWNyZWF0ZV9nZXR0ZXIoa2luZCwgc3ViKTsgXAorCWNyZWF0ZV9zZXR0ZXIoa2luZCwgc3ViLCByZWcpOyBcCisJY3JlYXRlX3N5c2ZzX2RldmljZV9ydyhraW5kLCBzdWIsKTsKKworI2RlZmluZSBzeXNmc19mYW5fd2l0aF9taW4ob2Zmc2V0LCByZWdfc3RhdHVzLCByZWdfcmlwcGxlLCByZWdfbWluKSBcCisJc3lzZnNfZmFuKG9mZnNldCwgcmVnX3N0YXR1cywgcmVnX3JpcHBsZSk7IFwKKwlzeXNmc19yd19uKHB3bSwsIG9mZnNldCwgcmVnX21pbik7CisKKyNkZWZpbmUgc3lzZnNfZmFuKG9mZnNldCwgcmVnX3N0YXR1cywgcmVnX3JpcHBsZSkgXAorCXN5c2ZzX3JvX24oZmFuLCBfaW5wdXQsIG9mZnNldCk7IFwKKwlzeXNmc19yb19uKGZhbiwgX3N0YXR1cywgb2Zmc2V0KTsgXAorCXN5c2ZzX3J3X24oZmFuLCBfcmlwcGxlLCBvZmZzZXQsIHJlZ19yaXBwbGUpOworCisjZGVmaW5lIHN5c2ZzX3RlbXAob2Zmc2V0LCByZWdfc3RhdHVzKSBcCisJc3lzZnNfcm9fbih0ZW1wLCBfaW5wdXQsIG9mZnNldCk7IFwKKwlzeXNmc19yb19uKHRlbXAsIF9zdGF0dXMsIG9mZnNldCk7IFwKKwlzeXNmc19yd19uKHRlbXAsIF9yZXNldCwgb2Zmc2V0LCByZWdfc3RhdHVzKTsKKworI2RlZmluZSBzeXNmc193YXRjaGRvZyhyZWdfd2RvZ19wcmVzZXQsIHJlZ193ZG9nX3N0YXRlLCByZWdfd2RvZ19jb250cm9sKSBcCisJc3lzZnNfcncod2RvZywgX2NvbnRyb2wsIHJlZ193ZG9nX2NvbnRyb2wpOyBcCisJc3lzZnNfcncod2RvZywgX3ByZXNldCwgcmVnX3dkb2dfcHJlc2V0KTsgXAorCXN5c2ZzX3J3KHdkb2csIF9zdGF0ZSwgcmVnX3dkb2dfc3RhdGUpOworCitzeXNmc19mYW5fd2l0aF9taW4oMSwgRlNDUE9TX1JFR19GQU5fU1RBVEVbMF0sIEZTQ1BPU19SRUdfRkFOX1JJUFBMRVswXSwKKwkJCQkJCQlGU0NQT1NfUkVHX1BXTVswXSk7CitzeXNmc19mYW5fd2l0aF9taW4oMiwgRlNDUE9TX1JFR19GQU5fU1RBVEVbMV0sIEZTQ1BPU19SRUdfRkFOX1JJUFBMRVsxXSwKKwkJCQkJCQlGU0NQT1NfUkVHX1BXTVsxXSk7CitzeXNmc19mYW4oMywgRlNDUE9TX1JFR19GQU5fU1RBVEVbMl0sIEZTQ1BPU19SRUdfRkFOX1JJUFBMRVsyXSk7CisKK3N5c2ZzX3RlbXAoMSwgRlNDUE9TX1JFR19URU1QX1NUQVRFWzBdKTsKK3N5c2ZzX3RlbXAoMiwgRlNDUE9TX1JFR19URU1QX1NUQVRFWzFdKTsKK3N5c2ZzX3RlbXAoMywgRlNDUE9TX1JFR19URU1QX1NUQVRFWzJdKTsKKworc3lzZnNfd2F0Y2hkb2coRlNDUE9TX1JFR19XRE9HX1BSRVNFVCwgRlNDUE9TX1JFR19XRE9HX1NUQVRFLAorCQkJCQkJRlNDUE9TX1JFR19XRE9HX0NPTlRST0wpOworCitzdGF0aWMgREVWSUNFX0FUVFIoZXZlbnQsIFNfSVJVR08sIHNob3dfZXZlbnQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0XzEyLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdF81LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdF9iYXR0LCBOVUxMKTsKKworc3RhdGljIGludCBmc2Nwb3NfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgZnNjcG9zX2RldGVjdCk7Cit9CisKK2ludCBmc2Nwb3NfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJZ290byBleGl0OworCisJLyoKKwkgKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAqIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAqIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGZzY3Bvc197cmVhZCx3cml0ZX1fdmFsdWUuCisJICovCisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZzY3Bvc19kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgZnNjcG9zX2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmZnNjcG9zX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBEbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbiB1bmxlc3MgZm9yY2Ugb3IgZm9yY2VfZnNjcG9zIHBhcmFtZXRlciAqLworCWlmIChraW5kIDwgMCkgeworCQlpZiAoKGZzY3Bvc19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEZTQ1BPU19SRUdfSURFTlRfMCkKKwkJCSE9IDB4NTApIC8qICdQJyAqLworCQl8fCAoZnNjcG9zX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgRlNDUE9TX1JFR19JREVOVF8xKQorCQkJIT0gMHg0NSkgLyogJ0UnICovCisJCXx8IChmc2Nwb3NfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBGU0NQT1NfUkVHX0lERU5UXzIpCisJCQkhPSAweDQ3KSkvKiAnRycgKi8KKwkJeworCQkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiZnNjcG9zIGRldGVjdGlvbiBmYWlsZWRcbiIpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwl9CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGluIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImZzY3BvcyIsIEkyQ19OQU1FX1NJWkUpOworCisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml6aWFsaXplIHRoZSBmc2Nwb3MgY2hpcCAqLworCWZzY3Bvc19pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIEFubm91bmNlIHRoYXQgdGhlIGNoaXAgd2FzIGZvdW5kICovCisJZGV2X2luZm8oJm5ld19jbGllbnQtPmRldiwgIkZvdW5kIGZzY3BvcyBjaGlwLCByZXYgJXVcbiIsIGRhdGEtPnJldmlzaW9uKTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9ldmVudCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl93ZG9nX2NvbnRyb2wpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfd2RvZ19wcmVzZXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfd2RvZ19zdGF0ZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9zdGF0dXMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfcmVzZXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfc3RhdHVzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX3Jlc2V0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX3N0YXR1cyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19yZXNldCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfc3RhdHVzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfcmlwcGxlKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTEpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX3N0YXR1cyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX3JpcHBsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20yKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuM19zdGF0dXMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuM19yaXBwbGUpOworCisJcmV0dXJuIDA7CisKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmc2Nwb3NfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IgorCQkJCQkJCSIgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2Nwb3NfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJSZWFkIHJlZyAweCUwMnhcbiIsIHJlZyk7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgZnNjcG9zX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpCit7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJXcml0ZSByZWcgMHglMDJ4LCB2YWwgMHglMDJ4XG4iLCByZWcsIHZhbHVlKTsKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IEZTQ1BPUyBjaGlwICovCitzdGF0aWMgdm9pZCBmc2Nwb3NfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCS8qIHJlYWQgcmV2aXNpb24gZnJvbSBjaGlwICovCisJZGF0YS0+cmV2aXNpb24gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsIEZTQ1BPU19SRUdfUkVWSVNJT04pOworfQorCitzdGF0aWMgc3RydWN0IGZzY3Bvc19kYXRhICpmc2Nwb3NfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICgoamlmZmllcyAtIGRhdGEtPmxhc3RfdXBkYXRlZCA+IDIgKiBIWikgfHwKKwkJCShqaWZmaWVzIDwgZGF0YS0+bGFzdF91cGRhdGVkKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJaW50IGk7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTdGFydGluZyBmc2Nwb3MgdXBkYXRlXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlkYXRhLT50ZW1wX2FjdFtpXSA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCUZTQ1BPU19SRUdfVEVNUF9BQ1RbaV0pOworCQkJZGF0YS0+dGVtcF9zdGF0dXNbaV0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlGU0NQT1NfUkVHX1RFTVBfU1RBVEVbaV0pOworCQkJZGF0YS0+ZmFuX2FjdFtpXSA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCUZTQ1BPU19SRUdfRkFOX0FDVFtpXSk7CisJCQlkYXRhLT5mYW5fc3RhdHVzW2ldID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJRlNDUE9TX1JFR19GQU5fU1RBVEVbaV0pOworCQkJZGF0YS0+ZmFuX3JpcHBsZVtpXSA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCUZTQ1BPU19SRUdfRkFOX1JJUFBMRVtpXSk7CisJCQlpZiAoaSA8IDIpIHsKKwkJCQkvKiBmYW4yX21pbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwICovCisJCQkJZGF0YS0+cHdtW2ldID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJCUZTQ1BPU19SRUdfUFdNW2ldKTsKKwkJCX0KKwkJCS8qIHJlc2V0IGZhbiBzdGF0dXMgaWYgc3BlZWQgaXMgYmFjayB0byA+IDAgKi8KKwkJCWlmIChkYXRhLT5mYW5fc3RhdHVzW2ldICE9IDAgJiYgZGF0YS0+ZmFuX2FjdFtpXSA+IDApIHsKKwkJCQlyZXNldF9mYW5fYWxhcm0oY2xpZW50LCBpKTsKKwkJCX0KKwkJfQorCisJCWRhdGEtPnZvbHRbMF0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsIEZTQ1BPU19SRUdfVk9MVF8xMik7CisJCWRhdGEtPnZvbHRbMV0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsIEZTQ1BPU19SRUdfVk9MVF81KTsKKwkJZGF0YS0+dm9sdFsyXSA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwgRlNDUE9TX1JFR19WT0xUX0JBVFQpOworCisJCWRhdGEtPndkb2dfcHJlc2V0ID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJCUZTQ1BPU19SRUdfV0RPR19QUkVTRVQpOworCQlkYXRhLT53ZG9nX3N0YXRlID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJCUZTQ1BPU19SRUdfV0RPR19TVEFURSk7CisJCWRhdGEtPndkb2dfY29udHJvbCA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCUZTQ1BPU19SRUdfV0RPR19DT05UUk9MKTsKKworCQlkYXRhLT5nbG9iYWxfZXZlbnQgPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlGU0NQT1NfUkVHX0VWRU5UX1NUQVRFKTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtX2ZzY3Bvc19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZmc2Nwb3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNtX2ZzY3Bvc19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmZzY3Bvc19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTdGVmYW4gT3R0IDxzdGVmYW5AZGVzaXJlLmNoPiBiYXNlZCBvbiB3b3JrIGZyb20gSGVybWFubiBKdW5nICIKKwkJCQkiPGhlakBvZG4uZGU+LCBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+IgorCQkJCSIgYW5kIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiZnVqaXRzdSBzaWVtZW5zIHBvc2VpZG9uIGNoaXAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNtX2ZzY3Bvc19pbml0KTsKK21vZHVsZV9leGl0KHNtX2ZzY3Bvc19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2dsNTE4c20uYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2dsNTE4c20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODJkNmNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvZ2w1MThzbS5jCkBAIC0wLDAgKzEsNjA1IEBACisvKgorICogZ2w1MThzbS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAqICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+IGFuZAorICogS3lvc3RpIE1hbGtraSA8a21hbGtraUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSG9uZy1HdW5uIENoZXcgPGhnbGludXhAZ3VubmV0Lm9yZz4gYW5kCisgKiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBQb3J0ZWQgdG8gTGludXggMi42IGJ5IEhvbmctR3VubiBDaGV3IHdpdGggdGhlIGhlbHAgb2YgSmVhbiBEZWx2YXJlCisgKiBhbmQgYWR2aWNlIG9mIEdyZWcgS3JvYWgtSGFydG1hbi4KKyAqCisgKiBOb3RlcyBhYm91dCB0aGUgcG9ydDoKKyAqIFJlbGVhc2UgMHgwMCBvZiB0aGUgR0w1MThTTSBjaGlwc2V0IGRvZXNuJ3Qgc3VwcG9ydCByZWFkaW5nIG9mIGluMCwKKyAqIGluMSBub3IgaW4yLiBUaGUgb3JpZ2luYWwgZHJpdmVyIGhhZCBhbiB1Z2x5IHdvcmthcm91bmQgdG8gZ2V0IHRoZW0KKyAqIGFueXdheSAoY2hhbmdpbmcgbGltaXRzIGFuZCB3YXRjaGluZyBhbGFybXMgdHJpZ2dlciBhbmQgd2VhciBvZmYpLgorICogV2UgZGlkIG5vdCBrZWVwIHRoYXQgcGFydCBvZiB0aGUgb3JpZ2luYWwgZHJpdmVyIGluIHRoZSBMaW51eCAyLjYKKyAqIHZlcnNpb24sIHNpbmNlIGl0IHdhcyBtYWtpbmcgdGhlIGRyaXZlciBzaWduaWZpY2FudGx5IG1vcmUgY29tcGxleAorICogd2l0aCBubyByZWFsIGJlbmVmaXQuCisgKgorICogSGlzdG9yeToKKyAqIDIwMDQtMDEtMjggIE9yaWdpbmFsIHBvcnQuIChIb25nLUd1bm4gQ2hldykKKyAqIDIwMDQtMDEtMzEgIENvZGUgcmV2aWV3IGFuZCBhcHByb3ZhbC4gKEplYW4gRGVsdmFyZSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyYywgMHgyZCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzIoZ2w1MThzbV9yMDAsIGdsNTE4c21fcjgwKTsKKworLyogTWFueSBHTDUxOCBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCisKKy8qIFRoZSBHTDUxOCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR0w1MThfUkVHX0NISVBfSUQJMHgwMAorI2RlZmluZSBHTDUxOF9SRUdfUkVWSVNJT04JMHgwMQorI2RlZmluZSBHTDUxOF9SRUdfVkVORE9SX0lECTB4MDIKKyNkZWZpbmUgR0w1MThfUkVHX0NPTkYJCTB4MDMKKyNkZWZpbmUgR0w1MThfUkVHX1RFTVBfSU4JMHgwNAorI2RlZmluZSBHTDUxOF9SRUdfVEVNUF9NQVgJMHgwNQorI2RlZmluZSBHTDUxOF9SRUdfVEVNUF9IWVNUCTB4MDYKKyNkZWZpbmUgR0w1MThfUkVHX0ZBTl9DT1VOVAkweDA3CisjZGVmaW5lIEdMNTE4X1JFR19GQU5fTElNSVQJMHgwOAorI2RlZmluZSBHTDUxOF9SRUdfVklOMV9MSU1JVAkweDA5CisjZGVmaW5lIEdMNTE4X1JFR19WSU4yX0xJTUlUCTB4MGEKKyNkZWZpbmUgR0w1MThfUkVHX1ZJTjNfTElNSVQJMHgwYgorI2RlZmluZSBHTDUxOF9SRUdfVkREX0xJTUlUCTB4MGMKKyNkZWZpbmUgR0w1MThfUkVHX1ZJTjMJCTB4MGQKKyNkZWZpbmUgR0w1MThfUkVHX01JU0MJCTB4MGYKKyNkZWZpbmUgR0w1MThfUkVHX0FMQVJNCQkweDEwCisjZGVmaW5lIEdMNTE4X1JFR19NQVNLCQkweDExCisjZGVmaW5lIEdMNTE4X1JFR19JTlQJCTB4MTIKKyNkZWZpbmUgR0w1MThfUkVHX1ZJTjIJCTB4MTMKKyNkZWZpbmUgR0w1MThfUkVHX1ZJTjEJCTB4MTQKKyNkZWZpbmUgR0w1MThfUkVHX1ZERAkJMHgxNQorCisKKy8qCisgKiBDb252ZXJzaW9ucy4gUm91bmRpbmcgYW5kIGxpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHCisgKiB2YXJpYW50cy4gTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgYSBiaXQgY2FyZWZ1bCB3aXRoIHdoaWNoIGFyZ3VtZW50cworICogdGhlc2UgbWFjcm9zIGFyZSBjYWxsZWQ6IGFyZ3VtZW50cyBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICogRml4aW5nIHRoaXMgaXMganVzdCBub3Qgd29ydGggaXQuCisgKi8KKworI2RlZmluZSBSQVdfRlJPTV9SRUcodmFsKQl2YWwKKworI2RlZmluZSBCT09MX0ZST01fUkVHKHZhbCkJKCh2YWwpPzA6MSkKKyNkZWZpbmUgQk9PTF9UT19SRUcodmFsKQkoKHZhbCk/MDoxKQorCisjZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkJKFNFTlNPUlNfTElNSVQoKCgoKHZhbCk8MD8gXAorCQkJCSh2YWwpLTUwMDoodmFsKSs1MDApLzEwMDApKzExOSksMCwyNTUpKQorI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkJKCgodmFsKSAtIDExOSkgKiAxMDAwKQorCitzdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCit7CisJbG9uZyBycG1kaXY7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gMDsKKwlycG1kaXYgPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTkyMDAwMCkgKiBkaXY7CisJcmV0dXJuIFNFTlNPUlNfTElNSVQoKDk2MDAwMCArIHJwbWRpdiAvIDIpIC8gcnBtZGl2LCAxLCAyNTUpOworfQorI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikJKCh2YWwpPT0wID8gMCA6ICg5NjAwMDAvKCh2YWwpKihkaXYpKSkpCisKKyNkZWZpbmUgSU5fVE9fUkVHKHZhbCkJCShTRU5TT1JTX0xJTUlUKCgoKHZhbCkrOSkvMTkpLDAsMjU1KSkKKyNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKQkoKHZhbCkqMTkpCisKKyNkZWZpbmUgVkREX1RPX1JFRyh2YWwpCQkoU0VOU09SU19MSU1JVCgoKCh2YWwpKjQrNDcpLzk1KSwwLDI1NSkpCisjZGVmaW5lIFZERF9GUk9NX1JFRyh2YWwpCSgoKHZhbCkqOTUrMikvNCkKKworI2RlZmluZSBESVZfVE9fUkVHKHZhbCkJCSgodmFsKT09ND8yOih2YWwpPT0yPzE6KHZhbCk9PTE/MDozKQorI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKQkoMSA8PCAodmFsKSkKKworI2RlZmluZSBCRUVQX01BU0tfVE9fUkVHKHZhbCkJKCh2YWwpICYgMHg3ZiAmIGRhdGEtPmFsYXJtX21hc2spCisjZGVmaW5lIEJFRVBfTUFTS19GUk9NX1JFRyh2YWwpCSgodmFsKSAmIDB4N2YpCisKKy8qIEVhY2ggY2xpZW50IGhhcyB0aGlzIGFkZGl0aW9uYWwgZGF0YSAqLworc3RydWN0IGdsNTE4X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwllbnVtIGNoaXBzIHR5cGU7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJdTggdm9sdGFnZV9pbls0XTsJLyogUmVnaXN0ZXIgdmFsdWVzOyBbMF0gPSBWREQgKi8KKwl1OCB2b2x0YWdlX21pbls0XTsJLyogUmVnaXN0ZXIgdmFsdWVzOyBbMF0gPSBWREQgKi8KKwl1OCB2b2x0YWdlX21heFs0XTsJLyogUmVnaXN0ZXIgdmFsdWVzOyBbMF0gPSBWREQgKi8KKwl1OCBpdGVyX3ZvbHRhZ2VfaW5bNF07CS8qIFJlZ2lzdGVyIHZhbHVlczsgWzBdID0gVkREICovCisJdTggZmFuX2luWzJdOworCXU4IGZhbl9taW5bMl07CisJdTggZmFuX2RpdlsyXTsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBzaGlmdGVkIHJpZ2h0ICovCisJdTggZmFuX2F1dG8xOwkJLyogQm9vbGVhbiAqLworCXU4IHRlbXBfaW47CQkvKiBSZWdpc3RlciB2YWx1ZXMgKi8KKwl1OCB0ZW1wX21heDsJCS8qIFJlZ2lzdGVyIHZhbHVlcyAqLworCXU4IHRlbXBfaHlzdDsJCS8qIFJlZ2lzdGVyIHZhbHVlcyAqLworCXU4IGFsYXJtczsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggYWxhcm1fbWFzazsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggYmVlcF9tYXNrOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBiZWVwX2VuYWJsZTsJCS8qIEJvb2xlYW4gKi8KK307CisKK3N0YXRpYyBpbnQgZ2w1MThfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgZ2w1MThfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGdsNTE4X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBnbDUxOF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBnbDUxOF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7CitzdGF0aWMgaW50IGdsNTE4X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKTsKK3N0YXRpYyBzdHJ1Y3QgZ2w1MThfZGF0YSAqZ2w1MThfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZ2w1MThfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZ2w1MThzbSIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9HTDUxOCwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBnbDUxOF9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGdsNTE4X2RldGFjaF9jbGllbnQsCit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCisjZGVmaW5lIHNob3codHlwZSwgc3VmZml4LCB2YWx1ZSkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBnbDUxOF9kYXRhICpkYXRhID0gZ2w1MThfdXBkYXRlX2RldmljZShkZXYpOwkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0eXBlIyNfRlJPTV9SRUcoZGF0YS0+dmFsdWUpKTsJXAorfQorCisjZGVmaW5lIHNob3dfZmFuKHN1ZmZpeCwgdmFsdWUsIGluZGV4KQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGdsNTE4X2RhdGEgKmRhdGEgPSBnbDUxOF91cGRhdGVfZGV2aWNlKGRldik7CQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT52YWx1ZVtpbmRleF0sCVwKKwkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbaW5kZXhdKSkpOwkJCVwKK30KKworc2hvdyhURU1QLCB0ZW1wX2lucHV0MSwgdGVtcF9pbik7CitzaG93KFRFTVAsIHRlbXBfbWF4MSwgdGVtcF9tYXgpOworc2hvdyhURU1QLCB0ZW1wX2h5c3QxLCB0ZW1wX2h5c3QpOworc2hvdyhCT09MLCBmYW5fYXV0bzEsIGZhbl9hdXRvMSk7CitzaG93X2ZhbihmYW5faW5wdXQxLCBmYW5faW4sIDApOworc2hvd19mYW4oZmFuX2lucHV0MiwgZmFuX2luLCAxKTsKK3Nob3dfZmFuKGZhbl9taW4xLCBmYW5fbWluLCAwKTsKK3Nob3dfZmFuKGZhbl9taW4yLCBmYW5fbWluLCAxKTsKK3Nob3coRElWLCBmYW5fZGl2MSwgZmFuX2RpdlswXSk7CitzaG93KERJViwgZmFuX2RpdjIsIGZhbl9kaXZbMV0pOworc2hvdyhWREQsIGluX2lucHV0MCwgdm9sdGFnZV9pblswXSk7CitzaG93KElOLCBpbl9pbnB1dDEsIHZvbHRhZ2VfaW5bMV0pOworc2hvdyhJTiwgaW5faW5wdXQyLCB2b2x0YWdlX2luWzJdKTsKK3Nob3coSU4sIGluX2lucHV0Mywgdm9sdGFnZV9pblszXSk7CitzaG93KFZERCwgaW5fbWluMCwgdm9sdGFnZV9taW5bMF0pOworc2hvdyhJTiwgaW5fbWluMSwgdm9sdGFnZV9taW5bMV0pOworc2hvdyhJTiwgaW5fbWluMiwgdm9sdGFnZV9taW5bMl0pOworc2hvdyhJTiwgaW5fbWluMywgdm9sdGFnZV9taW5bM10pOworc2hvdyhWREQsIGluX21heDAsIHZvbHRhZ2VfbWF4WzBdKTsKK3Nob3coSU4sIGluX21heDEsIHZvbHRhZ2VfbWF4WzFdKTsKK3Nob3coSU4sIGluX21heDIsIHZvbHRhZ2VfbWF4WzJdKTsKK3Nob3coSU4sIGluX21heDMsIHZvbHRhZ2VfbWF4WzNdKTsKK3Nob3coUkFXLCBhbGFybXMsIGFsYXJtcyk7CitzaG93KEJPT0wsIGJlZXBfZW5hYmxlLCBiZWVwX2VuYWJsZSk7CitzaG93KEJFRVBfTUFTSywgYmVlcF9tYXNrLCBiZWVwX21hc2spOworCisjZGVmaW5lIHNldCh0eXBlLCBzdWZmaXgsIHZhbHVlLCByZWcpCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCVwKKwlzaXplX3QgY291bnQpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsJCQlcCisJc3RydWN0IGdsNTE4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsJCVwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CQkJXAorCQkJCQkJCQkJXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsJCQkJCVwKKwlkYXRhLT52YWx1ZSA9IHR5cGUjI19UT19SRUcodmFsKTsJCQkJXAorCWdsNTE4X3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT52YWx1ZSk7CQkJXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQorCisjZGVmaW5lIHNldF9iaXRzKHR5cGUsIHN1ZmZpeCwgdmFsdWUsIHJlZywgbWFzaywgc2hpZnQpCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAlcCisJc2l6ZV90IGNvdW50KQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CQkJXAorCXN0cnVjdCBnbDUxOF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CQlcCisJaW50IHJlZ3ZhbHVlOwkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCVwKKwkJCQkJCQkJCVwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCQlcCisJcmVndmFsdWUgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKTsJCQlcCisJZGF0YS0+dmFsdWUgPSB0eXBlIyNfVE9fUkVHKHZhbCk7CQkJCVwKKwlyZWd2YWx1ZSA9IChyZWd2YWx1ZSAmIH5tYXNrKSB8IChkYXRhLT52YWx1ZSA8PCBzaGlmdCk7CQlcCisJZ2w1MThfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHJlZ3ZhbHVlKTsJCQlcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsJCQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CisKKyNkZWZpbmUgc2V0X2xvdyh0eXBlLCBzdWZmaXgsIHZhbHVlLCByZWcpCQkJCVwKKwlzZXRfYml0cyh0eXBlLCBzdWZmaXgsIHZhbHVlLCByZWcsIDB4MDBmZiwgMCkKKyNkZWZpbmUgc2V0X2hpZ2godHlwZSwgc3VmZml4LCB2YWx1ZSwgcmVnKQkJCQlcCisJc2V0X2JpdHModHlwZSwgc3VmZml4LCB2YWx1ZSwgcmVnLCAweGZmMDAsIDgpCisKK3NldChURU1QLCB0ZW1wX21heDEsIHRlbXBfbWF4LCBHTDUxOF9SRUdfVEVNUF9NQVgpOworc2V0KFRFTVAsIHRlbXBfaHlzdDEsIHRlbXBfaHlzdCwgR0w1MThfUkVHX1RFTVBfSFlTVCk7CitzZXRfYml0cyhCT09MLCBmYW5fYXV0bzEsIGZhbl9hdXRvMSwgR0w1MThfUkVHX01JU0MsIDB4MDgsIDMpOworc2V0X2JpdHMoRElWLCBmYW5fZGl2MSwgZmFuX2RpdlswXSwgR0w1MThfUkVHX01JU0MsIDB4YzAsIDYpOworc2V0X2JpdHMoRElWLCBmYW5fZGl2MiwgZmFuX2RpdlsxXSwgR0w1MThfUkVHX01JU0MsIDB4MzAsIDQpOworc2V0X2xvdyhWREQsIGluX21pbjAsIHZvbHRhZ2VfbWluWzBdLCBHTDUxOF9SRUdfVkREX0xJTUlUKTsKK3NldF9sb3coSU4sIGluX21pbjEsIHZvbHRhZ2VfbWluWzFdLCBHTDUxOF9SRUdfVklOMV9MSU1JVCk7CitzZXRfbG93KElOLCBpbl9taW4yLCB2b2x0YWdlX21pblsyXSwgR0w1MThfUkVHX1ZJTjJfTElNSVQpOworc2V0X2xvdyhJTiwgaW5fbWluMywgdm9sdGFnZV9taW5bM10sIEdMNTE4X1JFR19WSU4zX0xJTUlUKTsKK3NldF9oaWdoKFZERCwgaW5fbWF4MCwgdm9sdGFnZV9tYXhbMF0sIEdMNTE4X1JFR19WRERfTElNSVQpOworc2V0X2hpZ2goSU4sIGluX21heDEsIHZvbHRhZ2VfbWF4WzFdLCBHTDUxOF9SRUdfVklOMV9MSU1JVCk7CitzZXRfaGlnaChJTiwgaW5fbWF4Miwgdm9sdGFnZV9tYXhbMl0sIEdMNTE4X1JFR19WSU4yX0xJTUlUKTsKK3NldF9oaWdoKElOLCBpbl9tYXgzLCB2b2x0YWdlX21heFszXSwgR0w1MThfUkVHX1ZJTjNfTElNSVQpOworc2V0X2JpdHMoQk9PTCwgYmVlcF9lbmFibGUsIGJlZXBfZW5hYmxlLCBHTDUxOF9SRUdfQ09ORiwgMHgwNCwgMik7CitzZXQoQkVFUF9NQVNLLCBiZWVwX21hc2ssIGJlZXBfbWFzaywgR0w1MThfUkVHX0FMQVJNKTsKKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4xKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZ2w1MThfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByZWd2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCXJlZ3ZhbHVlID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19GQU5fTElNSVQpOworCWRhdGEtPmZhbl9taW5bMF0gPSBGQU5fVE9fUkVHKHZhbCwKKwkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbMF0pKTsKKwlyZWd2YWx1ZSA9IChyZWd2YWx1ZSAmIDB4MDBmZikgfCAoZGF0YS0+ZmFuX21pblswXSA8PCA4KTsKKwlnbDUxOF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19GQU5fTElNSVQsIHJlZ3ZhbHVlKTsKKworCWRhdGEtPmJlZXBfbWFzayA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfQUxBUk0pOworCWlmIChkYXRhLT5mYW5fbWluWzBdID09IDApCisJCWRhdGEtPmFsYXJtX21hc2sgJj0gfjB4MjA7CisJZWxzZQorCQlkYXRhLT5hbGFybV9tYXNrIHw9IDB4MjA7CisJZGF0YS0+YmVlcF9tYXNrICY9IGRhdGEtPmFsYXJtX21hc2s7CisJZ2w1MThfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfQUxBUk0sIGRhdGEtPmJlZXBfbWFzayk7CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4yKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZ2w1MThfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByZWd2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCXJlZ3ZhbHVlID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19GQU5fTElNSVQpOworCWRhdGEtPmZhbl9taW5bMV0gPSBGQU5fVE9fUkVHKHZhbCwKKwkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbMV0pKTsKKwlyZWd2YWx1ZSA9IChyZWd2YWx1ZSAmIDB4ZmYwMCkgfCBkYXRhLT5mYW5fbWluWzFdOworCWdsNTE4X3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0ZBTl9MSU1JVCwgcmVndmFsdWUpOworCisJZGF0YS0+YmVlcF9tYXNrID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19BTEFSTSk7CisJaWYgKGRhdGEtPmZhbl9taW5bMV0gPT0gMCkKKwkJZGF0YS0+YWxhcm1fbWFzayAmPSB+MHg0MDsKKwllbHNlCisJCWRhdGEtPmFsYXJtX21hc2sgfD0gMHg0MDsKKwlkYXRhLT5iZWVwX21hc2sgJj0gZGF0YS0+YWxhcm1fbWFzazsKKwlnbDUxOF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19BTEFSTSwgZGF0YS0+YmVlcF9tYXNrKTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dDEsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUnxTX0lSVUdPLCBzaG93X3RlbXBfbWF4MSwgc2V0X3RlbXBfbWF4MSk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4X2h5c3QsIFNfSVdVU1J8U19JUlVHTywKKwlzaG93X3RlbXBfaHlzdDEsIHNldF90ZW1wX2h5c3QxKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4xX2F1dG8sIFNfSVdVU1J8U19JUlVHTywgc2hvd19mYW5fYXV0bzEsIHNldF9mYW5fYXV0bzEpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuX2lucHV0MSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW5faW5wdXQyLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4xX21pbiwgU19JV1VTUnxTX0lSVUdPLCBzaG93X2Zhbl9taW4xLCBzZXRfZmFuX21pbjEpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjJfbWluLCBTX0lXVVNSfFNfSVJVR08sIHNob3dfZmFuX21pbjIsIHNldF9mYW5fbWluMik7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9kaXYsIFNfSVdVU1J8U19JUlVHTywgc2hvd19mYW5fZGl2MSwgc2V0X2Zhbl9kaXYxKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4yX2RpdiwgU19JV1VTUnxTX0lSVUdPLCBzaG93X2Zhbl9kaXYyLCBzZXRfZmFuX2RpdjIpOworc3RhdGljIERFVklDRV9BVFRSKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDAsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDEsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluMl9pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDIsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluM19pbnB1dCwgU19JUlVHTywgc2hvd19pbl9pbnB1dDMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluMF9taW4sIFNfSVdVU1J8U19JUlVHTywgc2hvd19pbl9taW4wLCBzZXRfaW5fbWluMCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4xX21pbiwgU19JV1VTUnxTX0lSVUdPLCBzaG93X2luX21pbjEsIHNldF9pbl9taW4xKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjJfbWluLCBTX0lXVVNSfFNfSVJVR08sIHNob3dfaW5fbWluMiwgc2V0X2luX21pbjIpOworc3RhdGljIERFVklDRV9BVFRSKGluM19taW4sIFNfSVdVU1J8U19JUlVHTywgc2hvd19pbl9taW4zLCBzZXRfaW5fbWluMyk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4wX21heCwgU19JV1VTUnxTX0lSVUdPLCBzaG93X2luX21heDAsIHNldF9pbl9tYXgwKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjFfbWF4LCBTX0lXVVNSfFNfSVJVR08sIHNob3dfaW5fbWF4MSwgc2V0X2luX21heDEpOworc3RhdGljIERFVklDRV9BVFRSKGluMl9tYXgsIFNfSVdVU1J8U19JUlVHTywgc2hvd19pbl9tYXgyLCBzZXRfaW5fbWF4Mik7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4zX21heCwgU19JV1VTUnxTX0lSVUdPLCBzaG93X2luX21heDMsIHNldF9pbl9tYXgzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiZWVwX2VuYWJsZSwgU19JV1VTUnxTX0lSVUdPLAorCXNob3dfYmVlcF9lbmFibGUsIHNldF9iZWVwX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmVlcF9tYXNrLCBTX0lXVVNSfFNfSVJVR08sCisJc2hvd19iZWVwX21hc2ssIHNldF9iZWVwX21hc2spOworCisvKgorICogUmVhbCBjb2RlCisgKi8KKworc3RhdGljIGludCBnbDUxOF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBnbDUxOF9kZXRlY3QpOworfQorCitzdGF0aWMgaW50IGdsNTE4X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgZ2w1MThfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgZ2w1MThfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBnbDUxOF9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgZ2w1MThfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmdsNTE4X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLworCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmICgoZ2w1MThfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBHTDUxOF9SRUdfQ0hJUF9JRCkgIT0gMHg4MCkKKwkJIHx8IChnbDUxOF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEdMNTE4X1JFR19DT05GKSAmIDB4ODApKQorCQkJZ290byBleGl0X2ZyZWU7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCisJaWYgKGtpbmQgPD0gMCkgeworCQlpID0gZ2w1MThfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBHTDUxOF9SRUdfUkVWSVNJT04pOworCQlpZiAoaSA9PSAweDAwKSB7CisJCQlraW5kID0gZ2w1MThzbV9yMDA7CisJCX0gZWxzZSBpZiAoaSA9PSAweDgwKSB7CisJCQlraW5kID0gZ2w1MThzbV9yODA7CisJCX0gZWxzZSB7CisJCQlpZiAoa2luZCA8PSAwKQorCQkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCisJCQkJICAgICJJZ25vcmluZyAnZm9yY2UnIHBhcmFtZXRlciBmb3IgdW5rbm93biAiCisJCQkJICAgICJjaGlwIGF0IGFkYXB0ZXIgJWQsIGFkZHJlc3MgMHglMDJ4XG4iLAorCQkJCSAgICBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgYWRkcmVzcyk7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCX0KKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAiZ2w1MThzbSIsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnR5cGUgPSBraW5kOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgR0w1MThTTSBjaGlwICovCisJZGF0YS0+YWxhcm1fbWFzayA9IDB4ZmY7CisJZGF0YS0+dm9sdGFnZV9pblswXT1kYXRhLT52b2x0YWdlX2luWzFdPWRhdGEtPnZvbHRhZ2VfaW5bMl09MDsKKwlnbDUxOF9pbml0X2NsaWVudCgoc3RydWN0IGkyY19jbGllbnQgKikgbmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2F1dG8pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXhfaHlzdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYmVlcF9lbmFibGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYmVlcF9tYXNrKTsKKworCXJldHVybiAwOworCisvKiBPSywgdGhpcyBpcyBub3QgZXhhY3RseSBnb29kIHByb2dyYW1taW5nIHByYWN0aWNlLCB1c3VhbGx5LiBCdXQgaXQgaXMKKyAgIHZlcnkgY29kZS1lZmZpY2llbnQgaW4gdGhpcyBjYXNlLiAqLworCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKKworLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBHTDUxOFNNLgorICAgTm90ZSB0aGF0IHdlIHByZXNlcnZlIEQ0Ok5vRmFuMiBhbmQgRDI6YmVlcF9lbmFibGUuICovCitzdGF0aWMgdm9pZCBnbDUxOF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCS8qIE1ha2Ugc3VyZSB3ZSBsZWF2ZSBENzpSZXNldCB1bnRvdWNoZWQgKi8KKwl1OCByZWd2YWx1ZSA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfQ09ORikgJiAweDdmOworCisJLyogQ29tcGFyYXRvciBtb2RlIChEMz0wKSwgc3RhbmRieSBtb2RlIChENj0wKSAqLworCWdsNTE4X3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0NPTkYsIChyZWd2YWx1ZSAmPSAweDM3KSk7CisKKwkvKiBOZXZlciBpbnRlcnJ1cHRzICovCisJZ2w1MThfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfTUFTSywgMHgwMCk7CisKKwkvKiBDbGVhciBzdGF0dXMgcmVnaXN0ZXIgKEQ1PTEpLCBzdGFydCAoRDY9MSkgKi8KKwlnbDUxOF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19DT05GLCAweDIwIHwgcmVndmFsdWUpOworCWdsNTE4X3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0NPTkYsIDB4NDAgfCByZWd2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ2w1MThfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVnaXN0ZXJzIDB4MDcgdG8gMHgwYyBhcmUgd29yZC1zaXplZCwgb3RoZXJzIGFyZSBieXRlLXNpemVkIAorICAgR0w1MTggdXNlcyBhIGhpZ2gtYnl0ZSBmaXJzdCBjb252ZW50aW9uLCB3aGljaCBpcyBleGFjdGx5IG9wcG9zaXRlIHRvCisgICB0aGUgdXN1YWwgcHJhY3RpY2UuICovCitzdGF0aWMgaW50IGdsNTE4X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCWlmICgocmVnID49IDB4MDcpICYmIChyZWcgPD0gMHgwYykpCisJCXJldHVybiBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKSk7CisJZWxzZQorCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKK30KKworLyogUmVnaXN0ZXJzIDB4MDcgdG8gMHgwYyBhcmUgd29yZC1zaXplZCwgb3RoZXJzIGFyZSBieXRlLXNpemVkIAorICAgR0w1MTggdXNlcyBhIGhpZ2gtYnl0ZSBmaXJzdCBjb252ZW50aW9uLCB3aGljaCBpcyBleGFjdGx5IG9wcG9zaXRlIHRvCisgICB0aGUgdXN1YWwgcHJhY3RpY2UuICovCitzdGF0aWMgaW50IGdsNTE4X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQoreworCWlmICgocmVnID49IDB4MDcpICYmIChyZWcgPD0gMHgwYykpCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKKwllbHNlCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2w1MThfZGF0YSAqZ2w1MThfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZ2w1MThfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWw7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgZ2w1MTggdXBkYXRlXG4iKTsKKworCQlkYXRhLT5hbGFybXMgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0lOVCk7CisJCWRhdGEtPmJlZXBfbWFzayA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfQUxBUk0pOworCisJCXZhbCA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfVkREX0xJTUlUKTsKKwkJZGF0YS0+dm9sdGFnZV9taW5bMF0gPSB2YWwgJiAweGZmOworCQlkYXRhLT52b2x0YWdlX21heFswXSA9ICh2YWwgPj4gOCkgJiAweGZmOworCQl2YWwgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX1ZJTjFfTElNSVQpOworCQlkYXRhLT52b2x0YWdlX21pblsxXSA9IHZhbCAmIDB4ZmY7CisJCWRhdGEtPnZvbHRhZ2VfbWF4WzFdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCXZhbCA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfVklOMl9MSU1JVCk7CisJCWRhdGEtPnZvbHRhZ2VfbWluWzJdID0gdmFsICYgMHhmZjsKKwkJZGF0YS0+dm9sdGFnZV9tYXhbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKKwkJdmFsID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19WSU4zX0xJTUlUKTsKKwkJZGF0YS0+dm9sdGFnZV9taW5bM10gPSB2YWwgJiAweGZmOworCQlkYXRhLT52b2x0YWdlX21heFszXSA9ICh2YWwgPj4gOCkgJiAweGZmOworCisJCXZhbCA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfRkFOX0NPVU5UKTsKKwkJZGF0YS0+ZmFuX2luWzBdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWRhdGEtPmZhbl9pblsxXSA9IHZhbCAmIDB4ZmY7CisKKwkJdmFsID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19GQU5fTElNSVQpOworCQlkYXRhLT5mYW5fbWluWzBdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWRhdGEtPmZhbl9taW5bMV0gPSB2YWwgJiAweGZmOworCisJCWRhdGEtPnRlbXBfaW4gPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX1RFTVBfSU4pOworCQlkYXRhLT50ZW1wX21heCA9CisJCSAgICBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX1RFTVBfTUFYKTsKKwkJZGF0YS0+dGVtcF9oeXN0ID0KKwkJICAgIGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfVEVNUF9IWVNUKTsKKworCQl2YWwgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX01JU0MpOworCQlkYXRhLT5mYW5fZGl2WzBdID0gKHZhbCA+PiA2KSAmIDB4MDM7CisJCWRhdGEtPmZhbl9kaXZbMV0gPSAodmFsID4+IDQpICYgMHgwMzsKKwkJZGF0YS0+ZmFuX2F1dG8xICA9ICh2YWwgPj4gMykgJiAweDAxOworCisJCWRhdGEtPmFsYXJtcyAmPSBkYXRhLT5hbGFybV9tYXNrOworCisJCXZhbCA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfQ09ORik7CisJCWRhdGEtPmJlZXBfZW5hYmxlID0gKHZhbCA+PiAyKSAmIDE7CisKKwkJaWYgKGRhdGEtPnR5cGUgIT0gZ2w1MThzbV9yMDApIHsKKwkJCWRhdGEtPnZvbHRhZ2VfaW5bMF0gPQorCQkJICAgIGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfVkREKTsKKwkJCWRhdGEtPnZvbHRhZ2VfaW5bMV0gPQorCQkJICAgIGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfVklOMSk7CisJCQlkYXRhLT52b2x0YWdlX2luWzJdID0KKwkJCSAgICBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX1ZJTjIpOworCQl9CisJCWRhdGEtPnZvbHRhZ2VfaW5bM10gPQorCQkgICAgZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19WSU4zKTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2dsNTE4c21faW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZ2w1MThfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfZ2w1MThzbV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmdsNTE4X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sICIKKwkiS3lvc3RpIE1hbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCAiCisJIkhvbmctR3VubiBDaGV3IDxoZ2xpbnV4QGd1bm5ldC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdMNTE4U00gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfZ2w1MThzbV9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfZ2w1MThzbV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2dsNTIwc20uYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2dsNTIwc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQxN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvZ2w1MjBzbS5jCkBAIC0wLDAgKzEsNzY5IEBACisvKgorICAgIGdsNTIwc20uYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgorICAgIENvcHlyaWdodCAoYykgMjAwNSAgICAgICAgTWFhcnRlbiBEZXByZXogPG1hYXJ0ZW5kZXByZXpAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisKKy8qIFR5cGUgb2YgdGhlIGV4dHJhIHNlbnNvciAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGV4dHJhX3NlbnNvcl90eXBlOworbW9kdWxlX3BhcmFtKGV4dHJhX3NlbnNvcl90eXBlLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhleHRyYV9zZW5zb3JfdHlwZSwgIlR5cGUgb2YgZXh0cmEgc2Vuc29yICgwPWF1dG9kZXRlY3QsIDE9dGVtcGVyYXR1cmUsIDI9dm9sdGFnZSkiKTsKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8xKGdsNTIwc20pOworCisvKiBNYW55IEdMNTIwIGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgCitPbmUgb2YgdGhlIGlucHV0cyBjYW4gYmUgY29uZmlndXJlZCBhcyBlaXRoZXIgdGVtcCBvciB2b2x0YWdlLgorVGhhdCdzIHdoeSBfVEVNUDIgYW5kIF9JTjQgYWNjZXNzIHRoZSBzYW1lIHJlZ2lzdGVyIAorKi8KKworLyogVGhlIEdMNTIwIHJlZ2lzdGVycyAqLworI2RlZmluZSBHTDUyMF9SRUdfQ0hJUF9JRAkJMHgwMAorI2RlZmluZSBHTDUyMF9SRUdfUkVWSVNJT04JCTB4MDEKKyNkZWZpbmUgR0w1MjBfUkVHX0NPTkYJCQkweDAzCisjZGVmaW5lIEdMNTIwX1JFR19NQVNLCQkJMHgxMQorCisjZGVmaW5lIEdMNTIwX1JFR19WSURfSU5QVVQJCTB4MDIKKworI2RlZmluZSBHTDUyMF9SRUdfSU4wX0lOUFVUCQkweDE1CisjZGVmaW5lIEdMNTIwX1JFR19JTjBfTElNSVQJCTB4MGMKKyNkZWZpbmUgR0w1MjBfUkVHX0lOMF9NSU4JCUdMNTIwX1JFR19JTjBfTElNSVQKKyNkZWZpbmUgR0w1MjBfUkVHX0lOMF9NQVgJCUdMNTIwX1JFR19JTjBfTElNSVQKKworI2RlZmluZSBHTDUyMF9SRUdfSU4xX0lOUFVUCQkweDE0CisjZGVmaW5lIEdMNTIwX1JFR19JTjFfTElNSVQJCTB4MDkKKyNkZWZpbmUgR0w1MjBfUkVHX0lOMV9NSU4JCUdMNTIwX1JFR19JTjFfTElNSVQKKyNkZWZpbmUgR0w1MjBfUkVHX0lOMV9NQVgJCUdMNTIwX1JFR19JTjFfTElNSVQKKworI2RlZmluZSBHTDUyMF9SRUdfSU4yX0lOUFVUCQkweDEzCisjZGVmaW5lIEdMNTIwX1JFR19JTjJfTElNSVQJCTB4MGEKKyNkZWZpbmUgR0w1MjBfUkVHX0lOMl9NSU4JCUdMNTIwX1JFR19JTjJfTElNSVQKKyNkZWZpbmUgR0w1MjBfUkVHX0lOMl9NQVgJCUdMNTIwX1JFR19JTjJfTElNSVQKKworI2RlZmluZSBHTDUyMF9SRUdfSU4zX0lOUFVUCQkweDBkCisjZGVmaW5lIEdMNTIwX1JFR19JTjNfTElNSVQJCTB4MGIKKyNkZWZpbmUgR0w1MjBfUkVHX0lOM19NSU4JCUdMNTIwX1JFR19JTjNfTElNSVQKKyNkZWZpbmUgR0w1MjBfUkVHX0lOM19NQVgJCUdMNTIwX1JFR19JTjNfTElNSVQKKworI2RlZmluZSBHTDUyMF9SRUdfSU40X0lOUFVUCQkweDBlCisjZGVmaW5lIEdMNTIwX1JFR19JTjRfTUFYCQkweDE3CisjZGVmaW5lIEdMNTIwX1JFR19JTjRfTUlOCQkweDE4CisKKyNkZWZpbmUgR0w1MjBfUkVHX1RFTVAxX0lOUFVUCQkweDA0CisjZGVmaW5lIEdMNTIwX1JFR19URU1QMV9NQVgJCTB4MDUKKyNkZWZpbmUgR0w1MjBfUkVHX1RFTVAxX01BWF9IWVNUCTB4MDYKKworI2RlZmluZSBHTDUyMF9SRUdfVEVNUDJfSU5QVVQJCTB4MGUKKyNkZWZpbmUgR0w1MjBfUkVHX1RFTVAyX01BWAkJMHgxNworI2RlZmluZSBHTDUyMF9SRUdfVEVNUDJfTUFYX0hZU1QJMHgxOAorCisjZGVmaW5lIEdMNTIwX1JFR19GQU5fSU5QVVQJCTB4MDcKKyNkZWZpbmUgR0w1MjBfUkVHX0ZBTl9NSU4JCTB4MDgKKyNkZWZpbmUgR0w1MjBfUkVHX0ZBTl9ESVYJCTB4MGYKKyNkZWZpbmUgR0w1MjBfUkVHX0ZBTl9PRkYJCUdMNTIwX1JFR19GQU5fRElWCisKKyNkZWZpbmUgR0w1MjBfUkVHX0FMQVJNUwkJMHgxMgorI2RlZmluZSBHTDUyMF9SRUdfQkVFUF9NQVNLCQkweDEwCisjZGVmaW5lIEdMNTIwX1JFR19CRUVQX0VOQUJMRQkJR0w1MjBfUkVHX0NPTkYKKworLyoKKyAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQgZ2w1MjBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgZ2w1MjBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGdsNTIwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBnbDUyMF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBnbDUyMF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7CitzdGF0aWMgaW50IGdsNTIwX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKTsKK3N0YXRpYyBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZ2w1MjBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisvKiBEcml2ZXIgZGF0YSAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGdsNTIwX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImdsNTIwc20iLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfR0w1MjAsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gZ2w1MjBfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBnbDUyMF9kZXRhY2hfY2xpZW50LAorfTsKKworLyogQ2xpZW50IGRhdGEgKi8KK3N0cnVjdCBnbDUyMF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogemVybyB1bnRpbCB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogaW4gamlmZmllcyAqLworCisJdTggdmlkOworCXU4IHZybTsKKwl1OCBpbl9pbnB1dFs1XTsJCS8qIFswXSA9IFZWRCAqLworCXU4IGluX21pbls1XTsJCS8qIFswXSA9IFZERCAqLworCXU4IGluX21heFs1XTsJCS8qIFswXSA9IFZERCAqLworCXU4IGZhbl9pbnB1dFsyXTsKKwl1OCBmYW5fbWluWzJdOworCXU4IGZhbl9kaXZbMl07CisJdTggZmFuX29mZjsKKwl1OCB0ZW1wX2lucHV0WzJdOworCXU4IHRlbXBfbWF4WzJdOworCXU4IHRlbXBfbWF4X2h5c3RbMl07CisJdTggYWxhcm1zOworCXU4IGJlZXBfZW5hYmxlOworCXU4IGJlZXBfbWFzazsKKwl1OCBhbGFybV9tYXNrOworCXU4IHR3b190ZW1wczsKK307CisKKy8qCisgKiBTeXNmcyBzdHVmZgorICovCisKKyNkZWZpbmUgc3lzZnNfcih0eXBlLCBuLCBpdGVtLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IGdldF8jI3R5cGUjI2l0ZW0gKHN0cnVjdCBnbDUyMF9kYXRhICosIGNoYXIgKiwgaW50KTsgXAorc3RhdGljIHNzaXplX3QgZ2V0XyMjdHlwZSMjbiMjaXRlbSAoc3RydWN0IGRldmljZSAqLCBjaGFyICopOyBcCitzdGF0aWMgc3NpemVfdCBnZXRfIyN0eXBlIyNuIyNpdGVtIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBnbDUyMF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gZ2V0XyMjdHlwZSMjaXRlbShkYXRhLCBidWYsIChuKSk7IFwKK30KKworI2RlZmluZSBzeXNmc193KHR5cGUsIG4sIGl0ZW0sIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdHlwZSMjaXRlbSAoc3RydWN0IGkyY19jbGllbnQgKiwgc3RydWN0IGdsNTIwX2RhdGEgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGludCwgaW50KTsgXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdHlwZSMjbiMjaXRlbSAoc3RydWN0IGRldmljZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7IFwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJcmV0dXJuIHNldF8jI3R5cGUjI2l0ZW0oY2xpZW50LCBkYXRhLCBidWYsIGNvdW50LCAobiksIHJlZyk7IFwKK30KKworI2RlZmluZSBzeXNmc19yd19uKHR5cGUsIG4sIGl0ZW0sIHJlZykgXAorc3lzZnNfcih0eXBlLCBuLCBpdGVtLCByZWcpIFwKK3N5c2ZzX3codHlwZSwgbiwgaXRlbSwgcmVnKSBcCitzdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjbiMjaXRlbSwgU19JUlVHTyB8IFNfSVdVU1IsIGdldF8jI3R5cGUjI24jI2l0ZW0sIHNldF8jI3R5cGUjI24jI2l0ZW0pOworCisjZGVmaW5lIHN5c2ZzX3JvX24odHlwZSwgbiwgaXRlbSwgcmVnKSBcCitzeXNmc19yKHR5cGUsIG4sIGl0ZW0sIHJlZykgXAorc3RhdGljIERFVklDRV9BVFRSKHR5cGUjI24jI2l0ZW0sIFNfSVJVR08sIGdldF8jI3R5cGUjI24jI2l0ZW0sIE5VTEwpOworCisjZGVmaW5lIHN5c2ZzX3J3KHR5cGUsIGl0ZW0sIHJlZykgXAorc3lzZnNfcih0eXBlLCAwLCBpdGVtLCByZWcpIFwKK3N5c2ZzX3codHlwZSwgMCwgaXRlbSwgcmVnKSBcCitzdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjaXRlbSwgU19JUlVHTyB8IFNfSVdVU1IsIGdldF8jI3R5cGUjIzAjI2l0ZW0sIHNldF8jI3R5cGUjIzAjI2l0ZW0pOworCisjZGVmaW5lIHN5c2ZzX3JvKHR5cGUsIGl0ZW0sIHJlZykgXAorc3lzZnNfcih0eXBlLCAwLCBpdGVtLCByZWcpIFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0eXBlIyNpdGVtLCBTX0lSVUdPLCBnZXRfIyN0eXBlIyMwIyNpdGVtLCBOVUxMKTsKKworCisjZGVmaW5lIHN5c2ZzX3ZpZChuKSBcCitzeXNmc19yb19uKGNwdSwgbiwgX3ZpZCwgR0w1MjBfUkVHX1ZJRF9JTlBVVCkKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdmlkKGNsaWVudCwgbikgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NwdSMjbiMjX3ZpZCkKKworI2RlZmluZSBzeXNmc19pbihuKSBcCitzeXNmc19yb19uKGluLCBuLCBfaW5wdXQsIEdMNTIwX1JFR19JTiMjbiMjSU5QVVQpIFwKK3N5c2ZzX3J3X24oaW4sIG4sIF9taW4sIEdMNTIwX1JFR19JTiMjbiMjX01JTikgXAorc3lzZnNfcndfbihpbiwgbiwgX21heCwgR0w1MjBfUkVHX0lOIyNuIyNfTUFYKSBcCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2luKGNsaWVudCwgbikgXAorKHtkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI24jI19pbnB1dCk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjbiMjX21pbik7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjbiMjX21heCk7fSkKKworI2RlZmluZSBzeXNmc19mYW4obikgXAorc3lzZnNfcm9fbihmYW4sIG4sIF9pbnB1dCwgR0w1MjBfUkVHX0ZBTl9JTlBVVCkgXAorc3lzZnNfcndfbihmYW4sIG4sIF9taW4sIEdMNTIwX1JFR19GQU5fTUlOKSBcCitzeXNmc19yd19uKGZhbiwgbiwgX2RpdiwgR0w1MjBfUkVHX0ZBTl9ESVYpCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihjbGllbnQsIG4pIFwKKyh7ZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjbiMjX2lucHV0KTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjbiMjX21pbik7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI24jI19kaXYpO30pCisKKyNkZWZpbmUgc3lzZnNfZmFuX29mZihuKSBcCitzeXNmc19yd19uKGZhbiwgbiwgX29mZiwgR0w1MjBfUkVHX0ZBTl9PRkYpIFwKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX29mZihjbGllbnQsIG4pIFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI24jI19vZmYpCisKKyNkZWZpbmUgc3lzZnNfdGVtcChuKSBcCitzeXNmc19yb19uKHRlbXAsIG4sIF9pbnB1dCwgR0w1MjBfUkVHX1RFTVAjI24jI19JTlBVVCkgXAorc3lzZnNfcndfbih0ZW1wLCBuLCBfbWF4LCBHTDUyMF9SRUdfVEVNUCMjbiMjX01BWCkgXAorc3lzZnNfcndfbih0ZW1wLCBuLCBfbWF4X2h5c3QsIEdMNTIwX1JFR19URU1QIyNuIyNfTUFYX0hZU1QpCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAoY2xpZW50LCBuKSBcCisoe2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNuIyNfaW5wdXQpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjbiMjX21heCk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNuIyNfbWF4X2h5c3QpO30pCisKKyNkZWZpbmUgc3lzZnNfYWxhcm1zKCkgXAorc3lzZnNfcm8oYWxhcm1zLCAsIEdMNTIwX1JFR19BTEFSTVMpIFwKK3N5c2ZzX3J3KGJlZXBfZW5hYmxlLCAsIEdMNTIwX1JFR19CRUVQX0VOQUJMRSkgXAorc3lzZnNfcncoYmVlcF9tYXNrLCAsIEdMNTIwX1JFR19CRUVQX01BU0spCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2FsYXJtcyhjbGllbnQpIFwKKyh7ZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9iZWVwX2VuYWJsZSk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9iZWVwX21hc2spO30pCisKKworc3lzZnNfdmlkKDApCisKK3N5c2ZzX2luKDApCitzeXNmc19pbigxKQorc3lzZnNfaW4oMikKK3N5c2ZzX2luKDMpCitzeXNmc19pbig0KQorCitzeXNmc19mYW4oMSkKK3N5c2ZzX2ZhbigyKQorc3lzZnNfZmFuX29mZigxKQorCitzeXNmc190ZW1wKDEpCitzeXNmc190ZW1wKDIpCisKK3N5c2ZzX2FsYXJtcygpCisKKworc3RhdGljIHNzaXplX3QgZ2V0X2NwdV92aWQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZpZF9mcm9tX3JlZyhkYXRhLT52aWQsIGRhdGEtPnZybSkpOworfQorCisjZGVmaW5lIFZERF9GUk9NX1JFRyh2YWwpICgoKHZhbCkqOTUrMikvNCkKKyNkZWZpbmUgVkREX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgoKHZhbCkqNCs0NykvOTUpLDAsMjU1KSkKKworI2RlZmluZSBJTl9GUk9NX1JFRyh2YWwpICgodmFsKSoxOSkKKyNkZWZpbmUgSU5fVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCgodmFsKSs5KS8xOSksMCwyNTUpKQorCitzdGF0aWMgc3NpemVfdCBnZXRfaW5faW5wdXQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJdTggciA9IGRhdGEtPmluX2lucHV0W25dOworCisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFZERF9GUk9NX1JFRyhyKSk7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcocikpOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfaW5fbWluKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXU4IHIgPSBkYXRhLT5pbl9taW5bbl07CisKKwlpZiAobiA9PSAwKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVkREX0ZST01fUkVHKHIpKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhyKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9pbl9tYXgoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJdTggciA9IGRhdGEtPmluX21heFtuXTsKKworCWlmIChuID09IDApCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBWRERfRlJPTV9SRUcocikpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKHIpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQoreworCWxvbmcgdiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdTggcjsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmIChuID09IDApCisJCXIgPSBWRERfVE9fUkVHKHYpOworCWVsc2UKKwkJciA9IElOX1RPX1JFRyh2KTsKKworCWRhdGEtPmluX21pbltuXSA9IHI7CisKKwlpZiAobiA8IDQpCisJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhmZikgfCByKTsKKwllbHNlCisJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCByKTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCit7CisJbG9uZyB2ID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwl1OCByOworCisJaWYgKG4gPT0gMCkKKwkJciA9IFZERF9UT19SRUcodik7CisJZWxzZQorCQlyID0gSU5fVE9fUkVHKHYpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJZGF0YS0+aW5fbWF4W25dID0gcjsKKworCWlmIChuIDwgNCkKKwkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weGZmMDApIHwgKHIgPDwgOCkpOworCWVsc2UKKwkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHIpOworCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkgKDEgPDwgKHZhbCkpCisjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsZGl2KSAoKHZhbCk9PTAgPyAwIDogKDQ4MDAwMC8oKHZhbCkgPDwgKGRpdikpKSkKKyNkZWZpbmUgRkFOX1RPX1JFRyh2YWwsZGl2KSAoKHZhbCk8PTA/MDpTRU5TT1JTX0xJTUlUKCg0ODAwMDAgKyAoKHZhbCkgPDwgKChkaXYpLTEpKSkgLyAoKHZhbCkgPDwgKGRpdikpLCAxLCAyNTUpKTsKKworc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9pbnB1dChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9pbnB1dFtuIC0gMV0sIGRhdGEtPmZhbl9kaXZbbiAtIDFdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW5fbWluKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltuIC0gMV0sIGRhdGEtPmZhbl9kaXZbbiAtIDFdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW5fZGl2KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2RpdltuIC0gMV0pKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9vZmYoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmZhbl9vZmYpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXU4IHI7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJciA9IEZBTl9UT19SRUcodiwgZGF0YS0+ZmFuX2RpdltuIC0gMV0pOworCWRhdGEtPmZhbl9taW5bbiAtIDFdID0gcjsKKworCWlmIChuID09IDEpCisJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhmZjAwKSB8IChyIDw8IDgpKTsKKwllbHNlCisJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhmZikgfCByKTsKKworCWRhdGEtPmJlZXBfbWFzayA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLKTsKKwlpZiAoZGF0YS0+ZmFuX21pbltuIC0gMV0gPT0gMCkKKwkJZGF0YS0+YWxhcm1fbWFzayAmPSAobiA9PSAxKSA/IH4weDIwIDogfjB4NDA7CisJZWxzZQorCQlkYXRhLT5hbGFybV9tYXNrIHw9IChuID09IDEpID8gMHgyMCA6IDB4NDA7CisJZGF0YS0+YmVlcF9tYXNrICY9IGRhdGEtPmFsYXJtX21hc2s7CisJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLLCBkYXRhLT5iZWVwX21hc2spOworCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCit7CisJdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJdTggcjsKKworCXN3aXRjaCAodikgeworCWNhc2UgMTogciA9IDA7IGJyZWFrOworCWNhc2UgMjogciA9IDE7IGJyZWFrOworCWNhc2UgNDogciA9IDI7IGJyZWFrOworCWNhc2UgODogciA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFuX2RpdiB2YWx1ZSAlbGQgbm90IHN1cHBvcnRlZC4gQ2hvb3NlIG9uZSBvZiAxLCAyLCA0IG9yIDghXG4iLCB2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9kaXZbbiAtIDFdID0gcjsKKworCWlmIChuID09IDEpCisJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhjMCkgfCAociA8PCA2KSk7CisJZWxzZQorCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4MzApIHwgKHIgPDwgNCkpOworCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fb2ZmKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCit7CisJdTggciA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApPzE6MDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fb2ZmID0gcjsKKwlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4MGMpIHwgKHIgPDwgMikpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKSAoKCh2YWwpIC0gMTMwKSAqIDEwMDApCisjZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCgoKHZhbCk8MD8odmFsKS01MDA6KHZhbCkrNTAwKSAvIDEwMDApKzEzMCksMCwyNTUpKQorCitzdGF0aWMgc3NpemVfdCBnZXRfdGVtcF9pbnB1dChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2lucHV0W24gLSAxXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfdGVtcF9tYXgoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhbbiAtIDFdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF90ZW1wX21heF9oeXN0KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWF4X2h5c3RbbiAtIDFdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21heChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQoreworCWxvbmcgdiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9tYXhbbiAtIDFdID0gVEVNUF9UT19SRUcodik7OworCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT50ZW1wX21heFtuIC0gMV0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXhfaHlzdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQoreworCWxvbmcgdiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9tYXhfaHlzdFtuIC0gMV0gPSBURU1QX1RPX1JFRyh2KTsKKwlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dGVtcF9tYXhfaHlzdFtuIC0gMV0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfYWxhcm1zKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybXMpOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfYmVlcF9lbmFibGUoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmJlZXBfZW5hYmxlKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2JlZXBfbWFzayhzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YmVlcF9tYXNrKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2JlZXBfZW5hYmxlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCit7CisJdTggciA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApPzA6MTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5iZWVwX2VuYWJsZSA9ICFyOworCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHgwNCkgfCAociA8PCAyKSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9iZWVwX21hc2soc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKK3sKKwl1OCByID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCXIgJj0gZGF0YS0+YWxhcm1fbWFzazsKKwlkYXRhLT5iZWVwX21hc2sgPSByOworCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCByKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworCisvKgorICogUmVhbCBjb2RlCisgKi8KKworc3RhdGljIGludCBnbDUyMF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBnbDUyMF9kZXRlY3QpOworfQorCitzdGF0aWMgaW50IGdsNTIwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgZ2w1MjBfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBnbDUyMF9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgZ2w1MjBfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZnbDUyMF9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmICgoZ2w1MjBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBHTDUyMF9SRUdfQ0hJUF9JRCkgIT0gMHgyMCkgfHwKKwkJICAgICgoZ2w1MjBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBHTDUyMF9SRUdfUkVWSVNJT04pICYgMHg3ZikgIT0gMHgwMCkgfHwKKwkJICAgICgoZ2w1MjBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBHTDUyMF9SRUdfQ09ORikgJiAweDgwKSAhPSAweDAwKSkgeworCQkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiVW5rbm93biBjaGlwIHR5cGUsIHNraXBwaW5nXG4iKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJnbDUyMHNtIiwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBHTDUyMFNNIGNoaXAgKi8KKwlnbDUyMF9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChuZXdfY2xpZW50LCAwKTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAzKTsKKwlpZiAoIWRhdGEtPnR3b190ZW1wcykKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDQpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV9mYW5fb2ZmKG5ld19jbGllbnQsIDEpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMSk7CisJaWYgKGRhdGEtPnR3b190ZW1wcykKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMik7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKG5ld19jbGllbnQpOworCisJcmV0dXJuIDA7CisKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IEdMNTIwU00uICovCitzdGF0aWMgdm9pZCBnbDUyMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggb2xkY29uZiwgY29uZjsKKworCWNvbmYgPSBvbGRjb25mID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GKTsKKworCWRhdGEtPmFsYXJtX21hc2sgPSAweGZmOworCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKworCWlmIChleHRyYV9zZW5zb3JfdHlwZSA9PSAxKQorCQljb25mICY9IH4weDEwOworCWVsc2UgaWYgKGV4dHJhX3NlbnNvcl90eXBlID09IDIpCisJCWNvbmYgfD0gMHgxMDsKKwlkYXRhLT50d29fdGVtcHMgPSAhKGNvbmYgJiAweDEwKTsKKworCS8qIElmIElSUSMgaXMgZGlzYWJsZWQsIHdlIGNhbiBzYWZlbHkgZm9yY2UgY29tcGFyYXRvciBtb2RlICovCisJaWYgKCEoY29uZiAmIDB4MjApKQorCQljb25mICY9IDB4Zjc7CisKKwkvKiBFbmFibGUgbW9uaXRvcmluZyBpZiBuZWVkZWQgKi8KKwljb25mIHw9IDB4NDA7CisKKwlpZiAoY29uZiAhPSBvbGRjb25mKQorCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GLCBjb25mKTsKKworCWdsNTIwX3VwZGF0ZV9kZXZpY2UoJihjbGllbnQtPmRldikpOworCisJaWYgKGRhdGEtPmZhbl9taW5bMF0gPT0gMCkKKwkJZGF0YS0+YWxhcm1fbWFzayAmPSB+MHgyMDsKKwlpZiAoZGF0YS0+ZmFuX21pblsxXSA9PSAwKQorCQlkYXRhLT5hbGFybV9tYXNrICY9IH4weDQwOworCisJZGF0YS0+YmVlcF9tYXNrICY9IGRhdGEtPmFsYXJtX21hc2s7CisJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLLCBkYXRhLT5iZWVwX21hc2spOworfQorCitzdGF0aWMgaW50IGdsNTIwX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCisKKy8qIFJlZ2lzdGVycyAweDA3IHRvIDB4MGMgYXJlIHdvcmQtc2l6ZWQsIG90aGVycyBhcmUgYnl0ZS1zaXplZCAKKyAgIEdMNTIwIHVzZXMgYSBoaWdoLWJ5dGUgZmlyc3QgY29udmVudGlvbiAqLworc3RhdGljIGludCBnbDUyMF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpZiAoKHJlZyA+PSAweDA3KSAmJiAocmVnIDw9IDB4MGMpKQorCQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOworCWVsc2UKKwkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgZ2w1MjBfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCit7CisJaWYgKChyZWcgPj0gMHgwNykgJiYgKHJlZyA8PSAweDBjKSkKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNih2YWx1ZSkpOworCWVsc2UKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworCitzdGF0aWMgc3RydWN0IGdsNTIwX2RhdGEgKmdsNTIwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKChqaWZmaWVzIC0gZGF0YS0+bGFzdF91cGRhdGVkID4gMiAqIEhaKSB8fAorCSAgICAoamlmZmllcyA8IGRhdGEtPmxhc3RfdXBkYXRlZCkgfHwgIWRhdGEtPnZhbGlkKSB7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTdGFydGluZyBnbDUyMHNtIHVwZGF0ZVxuIik7CisKKwkJZGF0YS0+YWxhcm1zID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19BTEFSTVMpOworCQlkYXRhLT5iZWVwX21hc2sgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0JFRVBfTUFTSyk7CisJCWRhdGEtPnZpZCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVklEX0lOUFVUKSAmIDB4MWY7CisKKwkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjBfTElNSVQpOworCQlkYXRhLT5pbl9taW5bMF0gPSB2YWwgJiAweGZmOworCQlkYXRhLT5pbl9tYXhbMF0gPSAodmFsID4+IDgpICYgMHhmZjsKKwkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjFfTElNSVQpOworCQlkYXRhLT5pbl9taW5bMV0gPSB2YWwgJiAweGZmOworCQlkYXRhLT5pbl9tYXhbMV0gPSAodmFsID4+IDgpICYgMHhmZjsKKwkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjJfTElNSVQpOworCQlkYXRhLT5pbl9taW5bMl0gPSB2YWwgJiAweGZmOworCQlkYXRhLT5pbl9tYXhbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKKwkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjNfTElNSVQpOworCQlkYXRhLT5pbl9taW5bM10gPSB2YWwgJiAweGZmOworCQlkYXRhLT5pbl9tYXhbM10gPSAodmFsID4+IDgpICYgMHhmZjsKKworCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9JTlBVVCk7CisJCWRhdGEtPmZhbl9pbnB1dFswXSA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlkYXRhLT5mYW5faW5wdXRbMV0gPSB2YWwgJiAweGZmOworCisJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfRkFOX01JTik7CisJCWRhdGEtPmZhbl9taW5bMF0gPSAodmFsID4+IDgpICYgMHhmZjsKKwkJZGF0YS0+ZmFuX21pblsxXSA9IHZhbCAmIDB4ZmY7CisKKwkJZGF0YS0+dGVtcF9pbnB1dFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVEVNUDFfSU5QVVQpOworCQlkYXRhLT50ZW1wX21heFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVEVNUDFfTUFYKTsKKwkJZGF0YS0+dGVtcF9tYXhfaHlzdFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVEVNUDFfTUFYX0hZU1QpOworCisJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfRkFOX0RJVik7CisJCWRhdGEtPmZhbl9kaXZbMF0gPSAodmFsID4+IDYpICYgMHgwMzsKKwkJZGF0YS0+ZmFuX2RpdlsxXSA9ICh2YWwgPj4gNCkgJiAweDAzOworCQlkYXRhLT5mYW5fb2ZmID0gKHZhbCA+PiAyKSAmIDB4MDE7CisKKwkJZGF0YS0+YWxhcm1zICY9IGRhdGEtPmFsYXJtX21hc2s7CisKKwkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GKTsKKwkJZGF0YS0+YmVlcF9lbmFibGUgPSAhKCh2YWwgPj4gMikgJiAxKTsKKworCQlkYXRhLT5pbl9pbnB1dFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4wX0lOUFVUKTsKKwkJZGF0YS0+aW5faW5wdXRbMV0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMV9JTlBVVCk7CisJCWRhdGEtPmluX2lucHV0WzJdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjJfSU5QVVQpOworCQlkYXRhLT5pbl9pbnB1dFszXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4zX0lOUFVUKTsKKworCQkvKiBUZW1wMSBhbmQgVmluNCBhcmUgdGhlIHNhbWUgaW5wdXQgKi8KKwkJaWYgKGRhdGEtPnR3b190ZW1wcykgeworCQkJZGF0YS0+dGVtcF9pbnB1dFsxXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVEVNUDJfSU5QVVQpOworCQkJZGF0YS0+dGVtcF9tYXhbMV0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAyX01BWCk7CisJCQlkYXRhLT50ZW1wX21heF9oeXN0WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9NQVhfSFlTVCk7CisJCX0gZWxzZSB7CisJCQlkYXRhLT5pbl9pbnB1dFs0XSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU40X0lOUFVUKTsKKwkJCWRhdGEtPmluX21pbls0XSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU40X01JTik7CisJCQlkYXRhLT5pbl9tYXhbNF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lONF9NQVgpOworCQl9CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2dsNTIwc21faW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZ2w1MjBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfZ2w1MjBzbV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmdsNTIwX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgIgorCSJLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4sICIKKwkiTWFhcnRlbiBEZXByZXogPG1hYXJ0ZW5kZXByZXpAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHTDUyMFNNIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2dsNTIwc21faW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2dsNTIwc21fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9pc3AxMzAxX29tYXAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMjlhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9pc3AxMzAxX29tYXAuYwpAQCAtMCwwICsxLDE2NTggQEAKKy8qCisgKiBpc3AxMzAxX29tYXAgLSBJU1AgMTMwMSBVU0IgdHJhbnNjZWl2ZXIsIHRhbGtpbmcgdG8gT01BUCBPVEcgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICogQ29weXJpZ2h0IChDKSAyMDA0IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyN1bmRlZglERUJVRworI3VuZGVmCVZFUkJPU0UKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiX2NoOS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Jfb3RnLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CisKKworI2lmbmRlZglERUJVRworI3VuZGVmCVZFUkJPU0UKKyNlbmRpZgorCisKKyNkZWZpbmUJRFJJVkVSX1ZFUlNJT04JIjI0IEF1Z3VzdCAyMDA0IgorI2RlZmluZQlEUklWRVJfTkFNRQkoaXNwMTMwMV9kcml2ZXIubmFtZSkKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJU1AxMzAxIFVTQiBPVEcgVHJhbnNjZWl2ZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBpc3AxMzAxIHsKKwlzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyCW90ZzsKKwlzdHJ1Y3QgaTJjX2NsaWVudAljbGllbnQ7CisJdm9pZAkJCSgqaTJjX3JlbGVhc2UpKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKwlpbnQJCQlpcnE7CisKKwl1MzIJCQlsYXN0X290Z19jdHJsOworCXVuc2lnbmVkCQl3b3JraW5nOjE7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKworCS8qIHVzZSBrZXZlbnRkIGNvbnRleHQgdG8gY2hhbmdlIHRoZSBzdGF0ZSBmb3IgdXMgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKwkKKwl1bnNpZ25lZCBsb25nCQl0b2RvOworIwkJZGVmaW5lIFdPUktfVVBEQVRFX0lTUAkwCS8qIHVwZGF0ZSBJU1AgZnJvbSBPVEcgKi8KKyMJCWRlZmluZSBXT1JLX1VQREFURV9PVEcJMQkvKiB1cGRhdGUgT1RHIGZyb20gSVNQICovCisjCQlkZWZpbmUgV09SS19IT1NUX1JFU1VNRQk0CS8qIHJlc3VtZSBob3N0ICovCisjCQlkZWZpbmUgV09SS19USU1FUgk2CS8qIHRpbWVyIGZpcmVkICovCisjCQlkZWZpbmUgV09SS19TVE9QCTcJLyogZG9uJ3QgcmVzdWJtaXQgKi8KK307CisKKworLyogYml0cyBpbiBPVEdfQ1RSTF9SRUcgKi8KKworI2RlZmluZQlPVEdfWENFSVZfT1VUUFVUUyBcCisJKE9UR19BU0VTU1ZMRHxPVEdfQlNFU1NFTkR8T1RHX0JTRVNTVkxEfE9UR19WQlVTVkxEfE9UR19JRCkKKyNkZWZpbmUJT1RHX1hDRUlWX0lOUFVUUyBcCisJKE9UR19QVUxMRE9XTnxPVEdfUFVMTFVQfE9UR19EUlZfVkJVU3xPVEdfUERfVkJVU3xPVEdfUFVfVkJVU3xPVEdfUFVfSUQpCisjZGVmaW5lCU9UR19DVFJMX0JJVFMgXAorCShPVEdfQV9CVVNSRVF8T1RHX0FfU0VUQl9ITlBFTnxPVEdfQl9CVVNSRVF8T1RHX0JfSE5QRU58T1RHX0JVU0RST1ApCisJLyogYW5kIE9UR19QVUxMVVAgaXMgc29tZXRpbWVzIHdyaXR0ZW4gKi8KKworI2RlZmluZQlPVEdfQ1RSTF9NQVNLCShPVEdfRFJJVkVSX1NFTHwgXAorCU9UR19YQ0VJVl9PVVRQVVRTfE9UR19YQ0VJVl9JTlBVVFN8IFwKKwlPVEdfQ1RSTF9CSVRTKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZglDT05GSUdfTUFDSF9PTUFQX0gyCisKKy8qIGJvYXJkLXNwZWNpZmljIFBNIGhvb2tzICovCisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworCisjaWYJZGVmaW5lZChDT05GSUdfVFBTNjUwMTApIHx8IGRlZmluZWQoQ09ORklHX1RQUzY1MDEwX01PRFVMRSkKKworI2luY2x1ZGUgPGFzbS9hcmNoL3RwczY1MDEwLmg+CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IHRwczY1MDEwX3NldF92YnVzX2RyYXcodW5zaWduZWQgbUEpCit7CisJcHJfZGVidWcoInRwczY1MDEwOiBkcmF3ICVkIG1BIChTVFVCKVxuIiwgbUEpOworCXJldHVybiAwOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgZW5hYmxlX3ZidXNfZHJhdyhzdHJ1Y3QgaXNwMTMwMSAqaXNwLCB1bnNpZ25lZCBtQSkKK3sKKwlpbnQgc3RhdHVzID0gdHBzNjUwMTBfc2V0X3ZidXNfZHJhdyhtQSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByX2RlYnVnKCIgIFZCVVMgJWQgbUEgZXJyb3IgJWRcbiIsIG1BLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfdmJ1c19zb3VyY2Uoc3RydWN0IGlzcDEzMDEgKmlzcCkKK3sKKwkvKiB0aGlzIGJvYXJkIHdvbid0IHN1cHBseSBtb3JlIHRoYW4gOG1BIHZidXMgcG93ZXIuCisJICogc29tZSBib2FyZHMgY2FuIHN3aXRjaCBhIDEwMG1hICJ1bml0IGxvYWQiIChvciBtb3JlKS4KKwkgKi8KK30KKworCisvKiBwcm9kdWN0cyB3aWxsIGRlbGl2ZXIgT1RHIG1lc3NhZ2VzIHdpdGggTEVEcywgR1VJLCBldGMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBub3RyZXNwb25kaW5nKHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisJcHJpbnRrKEtFUk5fTk9USUNFICJPVEcgZGV2aWNlIG5vdCByZXNwb25kaW5nLlxuIik7Cit9CisKKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG9ubHkgdHdvIGFkZHJlc3NlcyBwb3NzaWJsZSAqLworI2RlZmluZQlJU1BfQkFTRQkJMHgyYworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKKwlJU1BfQkFTRSwgSVNQX0JBU0UgKyAxLAorCUkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY19yYW5nZVtdID0geyBJMkNfQ0xJRU5UX0VORCB9OworCitJMkNfQ0xJRU5UX0lOU01PRDsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlzcDEzMDFfZHJpdmVyOworCisvKiBzbWJ1cyBhcGlzIGFyZSB1c2VkIGZvciBwb3J0YWJpbGl0eSAqLworCitzdGF0aWMgaW5saW5lIHU4Citpc3AxMzAxX2dldF91OChzdHJ1Y3QgaXNwMTMwMSAqaXNwLCB1OCByZWcpCit7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmaXNwLT5jbGllbnQsIHJlZyArIDApOworfQorCitzdGF0aWMgaW5saW5lIGludAoraXNwMTMwMV9nZXRfdTE2KHN0cnVjdCBpc3AxMzAxICppc3AsIHU4IHJlZykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKCZpc3AtPmNsaWVudCwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lzcDEzMDFfc2V0X2JpdHMoc3RydWN0IGlzcDEzMDEgKmlzcCwgdTggcmVnLCB1OCBiaXRzKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCZpc3AtPmNsaWVudCwgcmVnICsgMCwgYml0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citpc3AxMzAxX2NsZWFyX2JpdHMoc3RydWN0IGlzcDEzMDEgKmlzcCwgdTggcmVnLCB1OCBiaXRzKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCZpc3AtPmNsaWVudCwgcmVnICsgMSwgYml0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lCUlTUDEzMDFfVkVORE9SX0lECQkweDAwCS8qIHUxNiByZWFkICovCisjZGVmaW5lCUlTUDEzMDFfUFJPRFVDVF9JRAkJMHgwMgkvKiB1MTYgcmVhZCAqLworI2RlZmluZQlJU1AxMzAxX0JDRF9ERVZJQ0UJCTB4MTQJLyogdTE2IHJlYWQgKi8KKworI2RlZmluZQlJMkNfVkVORE9SX0lEX1BISUxJUFMJCTB4MDRjYworI2RlZmluZQlJMkNfUFJPRFVDVF9JRF9QSElMSVBTXzEzMDEJMHgxMzAxCisKKy8qIG9wZXJhdGlvbmFsIHJlZ2lzdGVycyAqLworI2RlZmluZQlJU1AxMzAxX01PREVfQ09OVFJPTF8xCQkweDA0CS8qIHU4IHJlYWQsIHNldCwgKzEgY2xlYXIgKi8KKyMJZGVmaW5lCU1DMV9TUEVFRF9SRUcJCSgxIDw8IDApCisjCWRlZmluZQlNQzFfU1VTUEVORF9SRUcJCSgxIDw8IDEpCisjCWRlZmluZQlNQzFfREFUX1NFMAkJKDEgPDwgMikKKyMJZGVmaW5lCU1DMV9UUkFOU1BBUkVOVAkJKDEgPDwgMykKKyMJZGVmaW5lCU1DMV9CRElTX0FDT05fRU4JKDEgPDwgNCkKKyMJZGVmaW5lCU1DMV9PRV9JTlRfRU4JCSgxIDw8IDUpCisjCWRlZmluZQlNQzFfVUFSVF9FTgkJKDEgPDwgNikKKyMJZGVmaW5lCU1DMV9NQVNLCQkweDdmCisjZGVmaW5lCUlTUDEzMDFfTU9ERV9DT05UUk9MXzIJCTB4MTIJLyogdTggcmVhZCwgc2V0LCArMSBjbGVhciAqLworIwlkZWZpbmUJTUMyX0dMT0JBTF9QV1JfRE4JKDEgPDwgMCkKKyMJZGVmaW5lCU1DMl9TUERfU1VTUF9DVFJMCSgxIDw8IDEpCisjCWRlZmluZQlNQzJfQklfREkJCSgxIDw8IDIpCisjCWRlZmluZQlNQzJfVFJBTlNQX0JESVIwCSgxIDw8IDMpCisjCWRlZmluZQlNQzJfVFJBTlNQX0JESVIxCSgxIDw8IDQpCisjCWRlZmluZQlNQzJfQVVESU9fRU4JCSgxIDw8IDUpCisjCWRlZmluZQlNQzJfUFNXX0VOCQkoMSA8PCA2KQorIwlkZWZpbmUJTUMyX0VOMlY3CQkoMSA8PCA3KQorI2RlZmluZQlJU1AxMzAxX09UR19DT05UUk9MXzEJCTB4MDYJLyogdTggcmVhZCwgc2V0LCArMSBjbGVhciAqLworIwlkZWZpbmUJT1RHMV9EUF9QVUxMVVAJCSgxIDw8IDApCisjCWRlZmluZQlPVEcxX0RNX1BVTExVUAkJKDEgPDwgMSkKKyMJZGVmaW5lCU9URzFfRFBfUFVMTERPV04JKDEgPDwgMikKKyMJZGVmaW5lCU9URzFfRE1fUFVMTERPV04JKDEgPDwgMykKKyMJZGVmaW5lCU9URzFfSURfUFVMTERPV04JKDEgPDwgNCkKKyMJZGVmaW5lCU9URzFfVkJVU19EUlYJCSgxIDw8IDUpCisjCWRlZmluZQlPVEcxX1ZCVVNfRElTQ0hSRwkoMSA8PCA2KQorIwlkZWZpbmUJT1RHMV9WQlVTX0NIUkcJCSgxIDw8IDcpCisjZGVmaW5lCUlTUDEzMDFfT1RHX1NUQVRVUwkJMHgxMAkvKiB1OCByZWFkb25seSAqLworIwlkZWZpbmUJT1RHX0JfU0VTU19FTkQJCSgxIDw8IDYpCisjCWRlZmluZQlPVEdfQl9TRVNTX1ZMRAkJKDEgPDwgNykKKworI2RlZmluZQlJU1AxMzAxX0lOVEVSUlVQVF9TT1VSQ0UJMHgwOAkvKiB1OCByZWFkICovCisjZGVmaW5lCUlTUDEzMDFfSU5URVJSVVBUX0xBVENICQkweDBBCS8qIHU4IHJlYWQsIHNldCwgKzEgY2xlYXIgKi8KKworI2RlZmluZQlJU1AxMzAxX0lOVEVSUlVQVF9GQUxMSU5HCTB4MEMJLyogdTggcmVhZCwgc2V0LCArMSBjbGVhciAqLworI2RlZmluZQlJU1AxMzAxX0lOVEVSUlVQVF9SSVNJTkcJMHgwRQkvKiB1OCByZWFkLCBzZXQsICsxIGNsZWFyICovCisKKy8qIHNhbWUgYml0ZmllbGRzIGluIGFsbCBpbnRlcnJ1cHQgcmVnaXN0ZXJzICovCisjCWRlZmluZQlJTlRSX1ZCVVNfVkxECQkoMSA8PCAwKQorIwlkZWZpbmUJSU5UUl9TRVNTX1ZMRAkJKDEgPDwgMSkKKyMJZGVmaW5lCUlOVFJfRFBfSEkJCSgxIDw8IDIpCisjCWRlZmluZQlJTlRSX0lEX0dORAkJKDEgPDwgMykKKyMJZGVmaW5lCUlOVFJfRE1fSEkJCSgxIDw8IDQpCisjCWRlZmluZQlJTlRSX0lEX0ZMT0FUCQkoMSA8PCA1KQorIwlkZWZpbmUJSU5UUl9CRElTX0FDT04JCSgxIDw8IDYpCisjCWRlZmluZQlJTlRSX0NSX0lOVAkJKDEgPDwgNykKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRlX3N0cmluZyhlbnVtIHVzYl9vdGdfc3RhdGUgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgT1RHX1NUQVRFX0FfSURMRToJCXJldHVybiAiYV9pZGxlIjsKKwljYXNlIE9UR19TVEFURV9BX1dBSVRfVlJJU0U6CXJldHVybiAiYV93YWl0X3ZyaXNlIjsKKwljYXNlIE9UR19TVEFURV9BX1dBSVRfQkNPTjoJcmV0dXJuICJhX3dhaXRfYmNvbiI7CisJY2FzZSBPVEdfU1RBVEVfQV9IT1NUOgkJcmV0dXJuICJhX2hvc3QiOworCWNhc2UgT1RHX1NUQVRFX0FfU1VTUEVORDoJcmV0dXJuICJhX3N1c3BlbmQiOworCWNhc2UgT1RHX1NUQVRFX0FfUEVSSVBIRVJBTDoJcmV0dXJuICJhX3BlcmlwaGVyYWwiOworCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9WRkFMTDoJcmV0dXJuICJhX3dhaXRfdmZhbGwiOworCWNhc2UgT1RHX1NUQVRFX0FfVkJVU19FUlI6CXJldHVybiAiYV92YnVzX2VyciI7CisJY2FzZSBPVEdfU1RBVEVfQl9JRExFOgkJcmV0dXJuICJiX2lkbGUiOworCWNhc2UgT1RHX1NUQVRFX0JfU1JQX0lOSVQ6CXJldHVybiAiYl9zcnBfaW5pdCI7CisJY2FzZSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOglyZXR1cm4gImJfcGVyaXBoZXJhbCI7CisJY2FzZSBPVEdfU1RBVEVfQl9XQUlUX0FDT046CXJldHVybiAiYl93YWl0X2Fjb24iOworCWNhc2UgT1RHX1NUQVRFX0JfSE9TVDoJCXJldHVybiAiYl9ob3N0IjsKKwlkZWZhdWx0OgkJCXJldHVybiAiVU5ERUZJTkVEIjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqc3RhdGVfbmFtZShzdHJ1Y3QgaXNwMTMwMSAqaXNwKQoreworCXJldHVybiBzdGF0ZV9zdHJpbmcoaXNwLT5vdGcuc3RhdGUpOworfQorCisjaWZkZWYJVkVSQk9TRQorI2RlZmluZQlkZXZfdmRiZwkJCWRldl9kYmcKKyNlbHNlCisjZGVmaW5lCWRldl92ZGJnKGRldiwgZm10LCBhcmcuLi4pCWRve313aGlsZSgwKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE5PVEU6ICBzb21lIG9mIHRoaXMgSVNQMTMwMSBzZXR1cCBpcyBzcGVjaWZpYyB0byBIMiBib2FyZHM7CisgKiBub3QgZXZlcnl0aGluZyBpcyBndWFyZGVkIGJ5IGJvYXJkLXNwZWNpZmljIGNoZWNrcywgb3IgZXZlbiB1c2luZworICogb21hcF91c2JfY29uZmlnIGRhdGEgdG8gZGVkdWNlIE1DMV9EQVRfU0UwIGFuZCBNQzJfQklfREkuCisgKgorICogQUxTTzogIHRoaXMgY3VycmVudGx5IGRvZXNuJ3QgdXNlIElTUDEzMDEgbG93LXBvd2VyIG1vZGVzCisgKiB3aGlsZSBPVEcgaXMgcnVubmluZy4KKyAqLworCitzdGF0aWMgdm9pZCBwb3dlcl9kb3duKHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfVU5ERUZJTkVEOworCisJLy8gaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzIsIE1DMl9HTE9CQUxfUFdSX0ROKTsKKwlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMSwgTUMxX1NVU1BFTkRfUkVHKTsKKworCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfT1RHX0NPTlRST0xfMSwgT1RHMV9JRF9QVUxMRE9XTik7CisJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMSwgTUMxX0RBVF9TRTApOworfQorCitzdGF0aWMgdm9pZCBwb3dlcl91cChzdHJ1Y3QgaXNwMTMwMSAqaXNwKQoreworCS8vIGlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzIsIE1DMl9HTE9CQUxfUFdSX0ROKTsKKwlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX01PREVfQ09OVFJPTF8xLCBNQzFfU1VTUEVORF9SRUcpOworCQorCS8qIGRvIHRoaXMgb25seSB3aGVuIGNwdSBpcyBkcml2aW5nIHRyYW5zY2VpdmVyLAorCSAqIHNvIGhvc3Qgd29uJ3Qgc2VlIGEgbG93IHNwZWVkIGRldmljZS4uLgorCSAqLworCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX01PREVfQ09OVFJPTF8xLCBNQzFfREFUX1NFMCk7Cit9CisKKyNkZWZpbmUJTk9fSE9TVF9TVVNQRU5ECisKK3N0YXRpYyBpbnQgaG9zdF9zdXNwZW5kKHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisjaWZkZWYJTk9fSE9TVF9TVVNQRU5ECisJcmV0dXJuIDA7CisjZWxzZQorCXN0cnVjdCBkZXZpY2UJKmRldjsKKworCWlmICghaXNwLT5vdGcuaG9zdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDdXJyZW50bHkgQVNTVU1FUyBvbmx5IHRoZSBPVEcgcG9ydCBtYXR0ZXJzOworCSAqIG90aGVyIHBvcnRzIGNvdWxkIGJlIGFjdGl2ZS4uLgorCSAqLworCWRldiA9IGlzcC0+b3RnLmhvc3QtPmNvbnRyb2xsZXI7CisJcmV0dXJuIGRldi0+ZHJpdmVyLT5zdXNwZW5kKGRldiwgMywgMCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBob3N0X3Jlc3VtZShzdHJ1Y3QgaXNwMTMwMSAqaXNwKQoreworI2lmZGVmCU5PX0hPU1RfU1VTUEVORAorCXJldHVybiAwOworI2Vsc2UKKwlzdHJ1Y3QgZGV2aWNlCSpkZXY7CisKKwlpZiAoIWlzcC0+b3RnLmhvc3QpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2ID0gaXNwLT5vdGcuaG9zdC0+Y29udHJvbGxlcjsKKwlyZXR1cm4gZGV2LT5kcml2ZXItPnJlc3VtZShkZXYsIDApOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZ2FkZ2V0X3N1c3BlbmQoc3RydWN0IGlzcDEzMDEgKmlzcCkKK3sKKwlpc3AtPm90Zy5nYWRnZXQtPmJfaG5wX2VuYWJsZSA9IDA7CisJaXNwLT5vdGcuZ2FkZ2V0LT5hX2hucF9zdXBwb3J0ID0gMDsKKwlpc3AtPm90Zy5nYWRnZXQtPmFfYWx0X2hucF9zdXBwb3J0ID0gMDsKKwlyZXR1cm4gdXNiX2dhZGdldF92YnVzX2Rpc2Nvbm5lY3QoaXNwLT5vdGcuZ2FkZ2V0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZQlUSU1FUl9NSU5VVEVTCTEwCisjZGVmaW5lCVRJTUVSX0pJRkZJRVMJKFRJTUVSX01JTlVURVMgKiA2MCAqIEhaKQorCisvKiBBbG1vc3QgYWxsIG91ciBJMkMgbWVzc2FnaW5nIGNvbWVzIGZyb20gYSB3b3JrIHF1ZXVlJ3MgdGFzayBjb250ZXh0LgorICogTk9URTogZ3VhcmFudGVlaW5nIGNlcnRhaW4gcmVzcG9uc2UgdGltZXMgbWlnaHQgbWVhbiB3ZSBzaG91bGRuJ3QKKyAqIHNoYXJlIGtldmVudGQncyB3b3JrIHF1ZXVlOyBhIHJlYWx0aW1lIHRhc2sgbWlnaHQgYmUgc2FmZXN0LgorICovCit2b2lkCitpc3AxMzAxX2RlZmVyX3dvcmsoc3RydWN0IGlzcDEzMDEgKmlzcCwgaW50IHdvcmspCit7CisJaW50IHN0YXR1czsKKworCWlmIChpc3AgJiYgIXRlc3RfYW5kX3NldF9iaXQod29yaywgJmlzcC0+dG9kbykpIHsKKwkJKHZvaWQpIGdldF9kZXZpY2UoJmlzcC0+Y2xpZW50LmRldik7CisJCXN0YXR1cyA9IHNjaGVkdWxlX3dvcmsoJmlzcC0+d29yayk7CisJCWlmICghc3RhdHVzICYmICFpc3AtPndvcmtpbmcpCisJCQlkZXZfdmRiZygmaXNwLT5jbGllbnQuZGV2LAorCQkJCSJ3b3JrIGl0ZW0gJWQgbWF5IGJlIGxvc3RcbiIsIHdvcmspOworCX0KK30KKworLyogY2FsbGVkIGZyb20gaXJxIGhhbmRsZXJzICovCitzdGF0aWMgdm9pZCBhX2lkbGUoc3RydWN0IGlzcDEzMDEgKmlzcCwgY29uc3QgY2hhciAqdGFnKQoreworCWlmIChpc3AtPm90Zy5zdGF0ZSA9PSBPVEdfU1RBVEVfQV9JRExFKQorCQlyZXR1cm47CisKKwlpc3AtPm90Zy5kZWZhdWx0X2EgPSAxOworCWlmIChpc3AtPm90Zy5ob3N0KSB7CisJCWlzcC0+b3RnLmhvc3QtPmlzX2JfaG9zdCA9IDA7CisJCWhvc3Rfc3VzcGVuZChpc3ApOworCX0KKwlpZiAoaXNwLT5vdGcuZ2FkZ2V0KSB7CisJCWlzcC0+b3RnLmdhZGdldC0+aXNfYV9wZXJpcGhlcmFsID0gMTsKKwkJZ2FkZ2V0X3N1c3BlbmQoaXNwKTsKKwl9CisJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQV9JRExFOworCWlzcC0+bGFzdF9vdGdfY3RybCA9IE9UR19DVFJMX1JFRyA9IE9UR19DVFJMX1JFRyAmIE9UR19YQ0VJVl9PVVRQVVRTOworCXByX2RlYnVnKCIgIC0tPiAlcy8lc1xuIiwgc3RhdGVfbmFtZShpc3ApLCB0YWcpOworfQorCisvKiBjYWxsZWQgZnJvbSBpcnEgaGFuZGxlcnMgKi8KK3N0YXRpYyB2b2lkIGJfaWRsZShzdHJ1Y3QgaXNwMTMwMSAqaXNwLCBjb25zdCBjaGFyICp0YWcpCit7CisJaWYgKGlzcC0+b3RnLnN0YXRlID09IE9UR19TVEFURV9CX0lETEUpCisJCXJldHVybjsKKworCWlzcC0+b3RnLmRlZmF1bHRfYSA9IDA7CisJaWYgKGlzcC0+b3RnLmhvc3QpIHsKKwkJaXNwLT5vdGcuaG9zdC0+aXNfYl9ob3N0ID0gMTsKKwkJaG9zdF9zdXNwZW5kKGlzcCk7CisJfQorCWlmIChpc3AtPm90Zy5nYWRnZXQpIHsKKwkJaXNwLT5vdGcuZ2FkZ2V0LT5pc19hX3BlcmlwaGVyYWwgPSAwOworCQlnYWRnZXRfc3VzcGVuZChpc3ApOworCX0KKwlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9CX0lETEU7CisJaXNwLT5sYXN0X290Z19jdHJsID0gT1RHX0NUUkxfUkVHID0gT1RHX0NUUkxfUkVHICYgT1RHX1hDRUlWX09VVFBVVFM7CisJcHJfZGVidWcoIiAgLS0+ICVzLyVzXG4iLCBzdGF0ZV9uYW1lKGlzcCksIHRhZyk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3JlZ3Moc3RydWN0IGlzcDEzMDEgKmlzcCwgY29uc3QgY2hhciAqbGFiZWwpCit7CisjaWZkZWYJREVCVUcKKwl1OAljdHJsID0gaXNwMTMwMV9nZXRfdTgoaXNwLCBJU1AxMzAxX09UR19DT05UUk9MXzEpOworCXU4CXN0YXR1cyA9IGlzcDEzMDFfZ2V0X3U4KGlzcCwgSVNQMTMwMV9PVEdfU1RBVFVTKTsKKwl1OAlzcmMgPSBpc3AxMzAxX2dldF91OChpc3AsIElTUDEzMDFfSU5URVJSVVBUX1NPVVJDRSk7CisKKwlwcl9kZWJ1Zygib3RnOiAlMDZ4LCAlcyAlcywgb3RnLyUwMnggc3RhdC8lMDJ4LiUwMnhcbiIsCisJCU9UR19DVFJMX1JFRywgbGFiZWwsIHN0YXRlX25hbWUoaXNwKSwKKwkJY3RybCwgc3RhdHVzLCBzcmMpOworCS8qIG1vZGUgY29udHJvbCBhbmQgaXJxIGVuYWJsZXMgZG9uJ3QgY2hhbmdlIG11Y2ggKi8KKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYJQ09ORklHX1VTQl9PVEcKKworLyoKKyAqIFRoZSBPTUFQIE9URyBjb250cm9sbGVyIGhhbmRsZXMgbW9zdCBvZiB0aGUgT1RHIHN0YXRlIHRyYW5zaXRpb25zLgorICoKKyAqIFdlIHRyYW5zbGF0ZSBpc3AxMzAxIG91dHB1dHMgKG1vc3RseSB2b2x0YWdlIGNvbXBhcmF0b3Igc3RhdHVzKSBpbnRvCisgKiBPVEcgaW5wdXRzOyBPVEcgb3V0cHV0cyAobW9zdGx5IHB1bGx1cC9wdWxsZG93biBjb250cm9scykgYW5kIEhOUCBzdGF0ZQorICogZmxhZ3MgaW50byBpc3AxMzAxIGlucHV0cyAuLi4gYW5kIGluZmVyIHN0YXRlIHRyYW5zaXRpb25zLgorICovCisKKyNpZmRlZglWRVJCT1NFCisKK3N0YXRpYyB2b2lkIGNoZWNrX3N0YXRlKHN0cnVjdCBpc3AxMzAxICppc3AsIGNvbnN0IGNoYXIgKnRhZykKK3sKKwllbnVtIHVzYl9vdGdfc3RhdGUJc3RhdGUgPSBPVEdfU1RBVEVfVU5ERUZJTkVEOworCXU4CQkJZnNtID0gT1RHX1RFU1RfUkVHICYgMHgwZmY7CisJdW5zaWduZWQJCWV4dHJhID0gMDsKKworCXN3aXRjaCAoZnNtKSB7CisKKwkvKiBkZWZhdWx0LWIgKi8KKwljYXNlIDB4MDoKKwkJc3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOworCQlicmVhazsKKwljYXNlIDB4MzoKKwljYXNlIDB4NzoKKwkJZXh0cmEgPSAxOworCWNhc2UgMHgxOgorCQlzdGF0ZSA9IE9UR19TVEFURV9CX1BFUklQSEVSQUw7CisJCWJyZWFrOworCWNhc2UgMHgxMToKKwkJc3RhdGUgPSBPVEdfU1RBVEVfQl9TUlBfSU5JVDsKKwkJYnJlYWs7CisKKwkvKiBleHRyYSBkdWFsLXJvbGUgZGVmYXVsdC1iIHN0YXRlcyAqLworCWNhc2UgMHgxMjoKKwljYXNlIDB4MTM6CisJY2FzZSAweDE2OgorCQlleHRyYSA9IDE7CisJY2FzZSAweDE3OgorCQlzdGF0ZSA9IE9UR19TVEFURV9CX1dBSVRfQUNPTjsKKwkJYnJlYWs7CisJY2FzZSAweDM0OgorCQlzdGF0ZSA9IE9UR19TVEFURV9CX0hPU1Q7CisJCWJyZWFrOworCisJLyogZGVmYXVsdC1hICovCisJY2FzZSAweDM2OgorCQlzdGF0ZSA9IE9UR19TVEFURV9BX0lETEU7CisJCWJyZWFrOworCWNhc2UgMHgzYzoKKwkJc3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMOworCQlicmVhazsKKwljYXNlIDB4N2Q6CisJCXN0YXRlID0gT1RHX1NUQVRFX0FfVkJVU19FUlI7CisJCWJyZWFrOworCWNhc2UgMHg5ZToKKwljYXNlIDB4OWY6CisJCWV4dHJhID0gMTsKKwljYXNlIDB4ODk6CisJCXN0YXRlID0gT1RHX1NUQVRFX0FfUEVSSVBIRVJBTDsKKwkJYnJlYWs7CisJY2FzZSAweGI3OgorCQlzdGF0ZSA9IE9UR19TVEFURV9BX1dBSVRfVlJJU0U7CisJCWJyZWFrOworCWNhc2UgMHhiODoKKwkJc3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX0JDT047CisJCWJyZWFrOworCWNhc2UgMHhiOToKKwkJc3RhdGUgPSBPVEdfU1RBVEVfQV9IT1NUOworCQlicmVhazsKKwljYXNlIDB4YmE6CisJCXN0YXRlID0gT1RHX1NUQVRFX0FfU1VTUEVORDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChpc3AtPm90Zy5zdGF0ZSA9PSBzdGF0ZSAmJiAhZXh0cmEpCisJCXJldHVybjsKKwlwcl9kZWJ1Zygib3RnOiAlcyBGU00gJXMvJTAyeCwgJXMsICUwNnhcbiIsIHRhZywKKwkJc3RhdGVfc3RyaW5nKHN0YXRlKSwgZnNtLCBzdGF0ZV9uYW1lKGlzcCksIE9UR19DVFJMX1JFRyk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19zdGF0ZShzdHJ1Y3QgaXNwMTMwMSAqaXNwLCBjb25zdCBjaGFyICp0YWcpIHsgfQorCisjZW5kaWYKKworLyogb3V0cHV0cyBmcm9tIElTUDEzMDFfSU5URVJSVVBUX1NPVVJDRSAqLworc3RhdGljIHZvaWQgdXBkYXRlX290ZzEoc3RydWN0IGlzcDEzMDEgKmlzcCwgdTggaW50X3NyYykKK3sKKwl1MzIJb3RnX2N0cmw7CisKKwlvdGdfY3RybCA9IE9UR19DVFJMX1JFRworCQkJJiBPVEdfQ1RSTF9NQVNLCisJCQkmIH5PVEdfWENFSVZfSU5QVVRTCisJCQkmIH4oT1RHX0lEfE9UR19BU0VTU1ZMRHxPVEdfVkJVU1ZMRCk7CisJaWYgKGludF9zcmMgJiBJTlRSX1NFU1NfVkxEKQorCQlvdGdfY3RybCB8PSBPVEdfQVNFU1NWTEQ7CisJZWxzZSBpZiAoaXNwLT5vdGcuc3RhdGUgPT0gT1RHX1NUQVRFX0FfV0FJVF9WRkFMTCkgeworCQlhX2lkbGUoaXNwLCAidmZhbGwiKTsKKwkJb3RnX2N0cmwgJj0gfk9UR19DVFJMX0JJVFM7CisJfQorCWlmIChpbnRfc3JjICYgSU5UUl9WQlVTX1ZMRCkKKwkJb3RnX2N0cmwgfD0gT1RHX1ZCVVNWTEQ7CisJaWYgKGludF9zcmMgJiBJTlRSX0lEX0dORCkgewkJLyogZGVmYXVsdC1BICovCisJCWlmIChpc3AtPm90Zy5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9JRExFCisJCQkJfHwgaXNwLT5vdGcuc3RhdGUgPT0gT1RHX1NUQVRFX1VOREVGSU5FRCkgeworCQkJYV9pZGxlKGlzcCwgImluaXQiKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CQkJCS8qIGRlZmF1bHQtQiAqLworCQlvdGdfY3RybCB8PSBPVEdfSUQ7CisJCWlmIChpc3AtPm90Zy5zdGF0ZSA9PSBPVEdfU1RBVEVfQV9JRExFCisJCQkJfHwgaXNwLT5vdGcuc3RhdGUgPT0gT1RHX1NUQVRFX1VOREVGSU5FRCkgeworCQkJYl9pZGxlKGlzcCwgImluaXQiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlPVEdfQ1RSTF9SRUcgPSBvdGdfY3RybDsKK30KKworLyogb3V0cHV0cyBmcm9tIElTUDEzMDFfT1RHX1NUQVRVUyAqLworc3RhdGljIHZvaWQgdXBkYXRlX290ZzIoc3RydWN0IGlzcDEzMDEgKmlzcCwgdTggb3RnX3N0YXR1cykKK3sKKwl1MzIJb3RnX2N0cmw7CisKKwlvdGdfY3RybCA9IE9UR19DVFJMX1JFRworCQkJJiBPVEdfQ1RSTF9NQVNLCisJCQkmIH5PVEdfWENFSVZfSU5QVVRTCisJCQkmIH4oT1RHX0JTRVNTVkxEfE9UR19CU0VTU0VORCk7CisJaWYgKG90Z19zdGF0dXMgJiBPVEdfQl9TRVNTX1ZMRCkKKwkJb3RnX2N0cmwgfD0gT1RHX0JTRVNTVkxEOworCWVsc2UgaWYgKG90Z19zdGF0dXMgJiBPVEdfQl9TRVNTX0VORCkKKwkJb3RnX2N0cmwgfD0gT1RHX0JTRVNTRU5EOworCU9UR19DVFJMX1JFRyA9IG90Z19jdHJsOworfQorCisvKiBpbnB1dHMgZ29pbmcgdG8gSVNQMTMwMSAqLworc3RhdGljIHZvaWQgb3RnX3VwZGF0ZV9pc3Aoc3RydWN0IGlzcDEzMDEgKmlzcCkKK3sKKwl1MzIJb3RnX2N0cmwsIG90Z19jaGFuZ2U7CisJdTgJc2V0ID0gT1RHMV9ETV9QVUxMRE9XTiwgY2xyID0gT1RHMV9ETV9QVUxMVVA7CisKKwlvdGdfY3RybCA9IE9UR19DVFJMX1JFRzsKKwlvdGdfY2hhbmdlID0gb3RnX2N0cmwgXiBpc3AtPmxhc3Rfb3RnX2N0cmw7CisJaXNwLT5sYXN0X290Z19jdHJsID0gb3RnX2N0cmw7CisJb3RnX2N0cmwgPSBvdGdfY3RybCAmIE9UR19YQ0VJVl9JTlBVVFM7CisKKwlzd2l0Y2ggKGlzcC0+b3RnLnN0YXRlKSB7CisJY2FzZSBPVEdfU1RBVEVfQl9JRExFOgorCWNhc2UgT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDoKKwljYXNlIE9UR19TVEFURV9CX1NSUF9JTklUOgorCQlpZiAoIShvdGdfY3RybCAmIE9UR19QVUxMVVApKSB7CisJCQkvLyBpZiAob3RnX2N0cmwgJiBPVEdfQl9ITlBFTikgeworCQkJaWYgKGlzcC0+b3RnLmdhZGdldC0+Yl9obnBfZW5hYmxlKSB7CisJCQkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9XQUlUX0FDT047CisJCQkJcHJfZGVidWcoIiAgLS0+IGJfd2FpdF9hY29uXG4iKTsKKwkJCX0KKwkJCWdvdG8gcHVsbGRvd247CisJCX0KK3B1bGx1cDoKKwkJc2V0IHw9IE9URzFfRFBfUFVMTFVQOworCQljbHIgfD0gT1RHMV9EUF9QVUxMRE9XTjsKKwkJYnJlYWs7CisJY2FzZSBPVEdfU1RBVEVfQV9TVVNQRU5EOgorCWNhc2UgT1RHX1NUQVRFX0FfUEVSSVBIRVJBTDoKKwkJaWYgKG90Z19jdHJsICYgT1RHX1BVTExVUCkKKwkJCWdvdG8gcHVsbHVwOworCQkvKiBGQUxMVEhST1VHSCAqLworCS8vIGNhc2UgT1RHX1NUQVRFX0JfV0FJVF9BQ09OOgorCWRlZmF1bHQ6CitwdWxsZG93bjoKKwkJc2V0IHw9IE9URzFfRFBfUFVMTERPV047CisJCWNsciB8PSBPVEcxX0RQX1BVTExVUDsKKwkJYnJlYWs7CisJfQorCisjCWRlZmluZSB0b2dnbGUoT1RHLElTUCkgZG8geyBcCisJCWlmIChvdGdfY3RybCAmIE9URykgc2V0IHw9IElTUDsgXAorCQllbHNlIGNsciB8PSBJU1A7IFwKKwkJfSB3aGlsZSAoMCkKKworCWlmICghKGlzcC0+b3RnLmhvc3QpKQorCQlvdGdfY3RybCAmPSB+T1RHX0RSVl9WQlVTOworCisJc3dpdGNoIChpc3AtPm90Zy5zdGF0ZSkgeworCWNhc2UgT1RHX1NUQVRFX0FfU1VTUEVORDoKKwkJaWYgKG90Z19jdHJsICYgT1RHX0RSVl9WQlVTKSB7CisJCQlzZXQgfD0gT1RHMV9WQlVTX0RSVjsKKwkJCWJyZWFrOworCQl9CisJCS8qIEhOUCBmYWlsZWQgZm9yIHNvbWUgcmVhc29uIChBX0FJRExfQkRJUyB0aW1lb3V0KSAqLworCQlub3RyZXNwb25kaW5nKGlzcCk7CisKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIE9UR19TVEFURV9BX1ZCVVNfRVJSOgorCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9BX1dBSVRfVkZBTEw7CisJCXByX2RlYnVnKCIgIC0tPiBhX3dhaXRfdmZhbGxcbiIpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9WRkFMTDoKKwkJLyogRklYTUUgdXNiY29yZSB0aGlua3MgcG9ydCBwb3dlciBpcyBzdGlsbCBvbiAuLi4gKi8KKwkJY2xyIHw9IE9URzFfVkJVU19EUlY7CisJCWJyZWFrOworCWNhc2UgT1RHX1NUQVRFX0FfSURMRToKKwkJaWYgKG90Z19jdHJsICYgT1RHX0RSVl9WQlVTKSB7CisJCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9BX1dBSVRfVlJJU0U7CisJCQlwcl9kZWJ1ZygiICAtLT4gYV93YWl0X3ZyaXNlXG4iKTsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworCWRlZmF1bHQ6CisJCXRvZ2dsZShPVEdfRFJWX1ZCVVMsIE9URzFfVkJVU19EUlYpOworCX0KKworCXRvZ2dsZShPVEdfUFVfVkJVUywgT1RHMV9WQlVTX0NIUkcpOworCXRvZ2dsZShPVEdfUERfVkJVUywgT1RHMV9WQlVTX0RJU0NIUkcpOworCisjCXVuZGVmIHRvZ2dsZQorCisJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfT1RHX0NPTlRST0xfMSwgc2V0KTsKKwlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX09UR19DT05UUk9MXzEsIGNscik7CisKKwkvKiBITlAgc3dpdGNoIHRvIGhvc3Qgb3IgcGVyaXBoZXJhbDsgYW5kIFNSUCAqLworCWlmIChvdGdfY2hhbmdlICYgT1RHX1BVTExVUCkgeworCQlzd2l0Y2ggKGlzcC0+b3RnLnN0YXRlKSB7CisJCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKKwkJCWlmIChjbHIgJiBPVEcxX0RQX1BVTExVUCkKKwkJCQlicmVhazsKKwkJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDsKKwkJCXByX2RlYnVnKCIgIC0tPiBiX3BlcmlwaGVyYWxcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgT1RHX1NUQVRFX0FfU1VTUEVORDoKKwkJCWlmIChjbHIgJiBPVEcxX0RQX1BVTExVUCkKKwkJCQlicmVhazsKKwkJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0FfUEVSSVBIRVJBTDsKKwkJCXByX2RlYnVnKCIgIC0tPiBhX3BlcmlwaGVyYWxcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlPVEdfQ1RSTF9SRUcgfD0gT1RHX1BVTExVUDsKKwl9CisKKwljaGVja19zdGF0ZShpc3AsIF9fRlVOQ1RJT05fXyk7CisJZHVtcF9yZWdzKGlzcCwgIm90Zy0+aXNwMTMwMSIpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9vdGdfaXJxKGludCBpcnEsIHZvaWQgKl9pc3AsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUxNgkJb3RnX2lycSA9IE9UR19JUlFfU1JDX1JFRzsKKwl1MzIJCW90Z19jdHJsOworCWludAkJcmV0ID0gSVJRX05PTkU7CisJc3RydWN0IGlzcDEzMDEJKmlzcCA9IF9pc3A7CisKKwkvKiB1cGRhdGUgSVNQMTMwMSB0cmFuc2NpZXZlciBmcm9tIE9URyBjb250cm9sbGVyICovCisJaWYgKG90Z19pcnEgJiBPUFJUX0NIRykgeworCQlPVEdfSVJRX1NSQ19SRUcgPSBPUFJUX0NIRzsKKwkJaXNwMTMwMV9kZWZlcl93b3JrKGlzcCwgV09SS19VUERBVEVfSVNQKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwkvKiBTUlAgdG8gYmVjb21lIGJfcGVyaXBoZXJhbCBmYWlsZWQgKi8KKwl9IGVsc2UgaWYgKG90Z19pcnEgJiBCX1NSUF9UTVJPVVQpIHsKKwkJcHJfZGVidWcoIm90ZzogQl9TUlBfVElNRU9VVCwgJTA2eFxuIiwgT1RHX0NUUkxfUkVHKTsKKwkJbm90cmVzcG9uZGluZyhpc3ApOworCisJCS8qIGdhZGdldCBkcml2ZXJzIHRoYXQgY2FyZSBzaG91bGQgbW9uaXRvciBhbGwga2luZHMgb2YKKwkJICogcmVtb3RlIHdha2V1cCAoU1JQLCBub3JtYWwpIHVzaW5nIHRoZWlyIG93biB0aW1lcgorCQkgKiB0byBnaXZlICJjaGVjayBjYWJsZSBhbmQgQS1kZXZpY2UiIG1lc3NhZ2VzLgorCQkgKi8KKwkJaWYgKGlzcC0+b3RnLnN0YXRlID09IE9UR19TVEFURV9CX1NSUF9JTklUKQorCQkJYl9pZGxlKGlzcCwgInNycF90aW1lb3V0Iik7CisKKwkJT1RHX0lSUV9TUkNfUkVHID0gQl9TUlBfVE1ST1VUOworCQlyZXQgPSBJUlFfSEFORExFRDsKKworCS8qIEhOUCB0byBiZWNvbWUgYl9ob3N0IGZhaWxlZCAqLworCX0gZWxzZSBpZiAob3RnX2lycSAmIEJfSE5QX0ZBSUwpIHsKKwkJcHJfZGVidWcoIm90ZzogJXMgQl9ITlBfRkFJTCwgJTA2eFxuIiwKKwkJCQlzdGF0ZV9uYW1lKGlzcCksIE9UR19DVFJMX1JFRyk7CisJCW5vdHJlc3BvbmRpbmcoaXNwKTsKKworCQlvdGdfY3RybCA9IE9UR19DVFJMX1JFRzsKKwkJb3RnX2N0cmwgfD0gT1RHX0JVU0RST1A7CisJCW90Z19jdHJsICY9IE9UR19DVFJMX01BU0sgJiB+T1RHX1hDRUlWX0lOUFVUUzsKKwkJT1RHX0NUUkxfUkVHID0gb3RnX2N0cmw7CisKKwkJLyogc3Vic2V0IG9mIGJfcGVyaXBoZXJhbCgpLi4uICovCisJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDsKKwkJcHJfZGVidWcoIiAgLS0+IGJfcGVyaXBoZXJhbFxuIik7CisKKwkJT1RHX0lSUV9TUkNfUkVHID0gQl9ITlBfRkFJTDsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwkvKiBkZXRlY3QgU1JQIGZyb20gQi1kZXZpY2UgLi4uICovCisJfSBlbHNlIGlmIChvdGdfaXJxICYgQV9TUlBfREVURUNUKSB7CisJCXByX2RlYnVnKCJvdGc6ICVzIFNSUF9ERVRFQ1QsICUwNnhcbiIsCisJCQkJc3RhdGVfbmFtZShpc3ApLCBPVEdfQ1RSTF9SRUcpOworCisJCWlzcDEzMDFfZGVmZXJfd29yayhpc3AsIFdPUktfVVBEQVRFX09URyk7CisJCXN3aXRjaCAoaXNwLT5vdGcuc3RhdGUpIHsKKwkJY2FzZSBPVEdfU1RBVEVfQV9JRExFOgorCQkJaWYgKCFpc3AtPm90Zy5ob3N0KQorCQkJCWJyZWFrOworCQkJaXNwMTMwMV9kZWZlcl93b3JrKGlzcCwgV09SS19IT1NUX1JFU1VNRSk7CisJCQlvdGdfY3RybCA9IE9UR19DVFJMX1JFRzsKKwkJCW90Z19jdHJsIHw9IE9UR19BX0JVU1JFUTsKKwkJCW90Z19jdHJsICY9IH4oT1RHX0JVU0RST1B8T1RHX0JfQlVTUkVRKQorCQkJCQkmIH5PVEdfWENFSVZfSU5QVVRTCisJCQkJCSYgT1RHX0NUUkxfTUFTSzsKKwkJCU9UR19DVFJMX1JFRyA9IG90Z19jdHJsOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCU9UR19JUlFfU1JDX1JFRyA9IEFfU1JQX0RFVEVDVDsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwkvKiB0aW1lciBleHBpcmVkOiAgVChhX3dhaXRfYmNvbikgYW5kIG1heWJlIFQoYV93YWl0X3ZyaXNlKQorCSAqIHdlIGRvbid0IHRyYWNrIHRoZW0gc2VwYXJhdGVseQorCSAqLworCX0gZWxzZSBpZiAob3RnX2lycSAmIEFfUkVRX1RNUk9VVCkgeworCQlvdGdfY3RybCA9IE9UR19DVFJMX1JFRzsKKwkJcHJfaW5mbygib3RnOiBCQ09OX1RNT1VUIGZyb20gJXMsICUwNnhcbiIsCisJCQkJc3RhdGVfbmFtZShpc3ApLCBvdGdfY3RybCk7CisJCW5vdHJlc3BvbmRpbmcoaXNwKTsKKworCQlvdGdfY3RybCB8PSBPVEdfQlVTRFJPUDsKKwkJb3RnX2N0cmwgJj0gfk9UR19BX0JVU1JFUSAmIE9UR19DVFJMX01BU0sgJiB+T1RHX1hDRUlWX0lOUFVUUzsKKwkJT1RHX0NUUkxfUkVHID0gb3RnX2N0cmw7CisJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0FfV0FJVF9WRkFMTDsKKworCQlPVEdfSVJRX1NSQ19SRUcgPSBBX1JFUV9UTVJPVVQ7CisJCXJldCA9IElSUV9IQU5ETEVEOworCisJLyogQS1zdXBwbGllZCB2b2x0YWdlIGZlbGwgdG9vIGxvdzsgb3ZlcmN1cnJlbnQgKi8KKwl9IGVsc2UgaWYgKG90Z19pcnEgJiBBX1ZCVVNfRVJSKSB7CisJCW90Z19jdHJsID0gT1RHX0NUUkxfUkVHOworCQlwcmludGsoS0VSTl9FUlIgIm90ZzogJXMsIFZCVVNfRVJSICUwNHggY3RybCAlMDZ4XG4iLAorCQkJc3RhdGVfbmFtZShpc3ApLCBvdGdfaXJxLCBvdGdfY3RybCk7CisKKwkJb3RnX2N0cmwgfD0gT1RHX0JVU0RST1A7CisJCW90Z19jdHJsICY9IH5PVEdfQV9CVVNSRVEgJiBPVEdfQ1RSTF9NQVNLICYgfk9UR19YQ0VJVl9JTlBVVFM7CisJCU9UR19DVFJMX1JFRyA9IG90Z19jdHJsOworCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9BX1ZCVVNfRVJSOworCisJCU9UR19JUlFfU1JDX1JFRyA9IEFfVkJVU19FUlI7CisJCXJldCA9IElSUV9IQU5ETEVEOworCisJLyogc3dpdGNoIGRyaXZlcjsgdGhlIHRyYW5zY2lldmVyIGNvZGUgYWN0aXZhdGVzIGl0LAorCSAqIHVuZ2F0aW5nIHRoZSB1ZGMgY2xvY2sgb3IgcmVzdW1pbmcgT0hDSS4KKwkgKi8KKwl9IGVsc2UgaWYgKG90Z19pcnEgJiBEUklWRVJfU1dJVENIKSB7CisJCWludAlraWNrID0gMDsKKworCQlvdGdfY3RybCA9IE9UR19DVFJMX1JFRzsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJvdGc6ICVzLCBTV0lUQ0ggdG8gJXMsIGN0cmwgJTA2eFxuIiwKKwkJCQlzdGF0ZV9uYW1lKGlzcCksCisJCQkJKG90Z19jdHJsICYgT1RHX0RSSVZFUl9TRUwpCisJCQkJCT8gImdhZGdldCIgOiAiaG9zdCIsCisJCQkJb3RnX2N0cmwpOworCQlpc3AxMzAxX2RlZmVyX3dvcmsoaXNwLCBXT1JLX1VQREFURV9JU1ApOworCisJCS8qIHJvbGUgaXMgcGVyaXBoZXJhbCAqLworCQlpZiAob3RnX2N0cmwgJiBPVEdfRFJJVkVSX1NFTCkgeworCQkJc3dpdGNoIChpc3AtPm90Zy5zdGF0ZSkgeworCQkJY2FzZSBPVEdfU1RBVEVfQV9JRExFOgorCQkJCWJfaWRsZShpc3AsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJaXNwMTMwMV9kZWZlcl93b3JrKGlzcCwgV09SS19VUERBVEVfSVNQKTsKKworCQkvKiByb2xlIGlzIGhvc3QgKi8KKwkJfSBlbHNlIHsKKwkJCWlmICghKG90Z19jdHJsICYgT1RHX0lEKSkgeworCQkgCQlvdGdfY3RybCAmPSBPVEdfQ1RSTF9NQVNLICYgfk9UR19YQ0VJVl9JTlBVVFM7CisJCQkJT1RHX0NUUkxfUkVHID0gb3RnX2N0cmwgfCBPVEdfQV9CVVNSRVE7CisJCQl9CisKKwkJCWlmIChpc3AtPm90Zy5ob3N0KSB7CisJCQkJc3dpdGNoIChpc3AtPm90Zy5zdGF0ZSkgeworCQkJCWNhc2UgT1RHX1NUQVRFX0JfV0FJVF9BQ09OOgorCQkJCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9CX0hPU1Q7CisJCQkJCXByX2RlYnVnKCIgIC0tPiBiX2hvc3RcbiIpOworCQkJCQlraWNrID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX0JDT046CisJCQkJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0FfSE9TVDsKKwkJCQkJcHJfZGVidWcoIiAgLS0+IGFfaG9zdFxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT1RHX1NUQVRFX0FfUEVSSVBIRVJBTDoKKwkJCQkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX0JDT047CisJCQkJCXByX2RlYnVnKCIgIC0tPiBhX3dhaXRfYmNvblxuIik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpc3AxMzAxX2RlZmVyX3dvcmsoaXNwLCBXT1JLX0hPU1RfUkVTVU1FKTsKKwkJCX0KKwkJfQorCisJCU9UR19JUlFfU1JDX1JFRyA9IERSSVZFUl9TV0lUQ0g7CisJCXJldCA9IElSUV9IQU5ETEVEOworCisJCWlmIChraWNrKQorCQkJdXNiX2J1c19zdGFydF9lbnVtKGlzcC0+b3RnLmhvc3QsCisJCQkJCQlpc3AtPm90Zy5ob3N0LT5vdGdfcG9ydCk7CisJfQorCisJY2hlY2tfc3RhdGUoaXNwLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvdGdfZGV2OworCitzdGF0aWMgaW50IG90Z19pbml0KHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisJaWYgKCFvdGdfZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWR1bXBfcmVncyhpc3AsIF9fRlVOQ1RJT05fXyk7CisJLyogc29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlIGJvYXJkLXNwZWNpZmljLi4uICovCisJT1RHX1NZU0NPTl8yX1JFRyB8PSBPVEdfRU4KKwkJLyogZm9yIEItZGV2aWNlOiAqLworCQl8IFNSUF9HUERBVEEJCS8qIDltc2VjIEJkZXYgRCsgcHVsc2UgKi8KKwkJfCBTUlBfR1BEVkJVUwkJLyogZGlzY2hhcmdlIGFmdGVyIFZCVVMgcHVsc2UgKi8KKwkJLy8gfCAoMyA8PCAyNCkJCS8qIDJtc2VjIFZCVVMgcHVsc2UgKi8KKwkJLyogZm9yIEEtZGV2aWNlOiAqLworCQl8ICgwIDw8IDIwKQkJLyogMjAwbXMgbm9taW5hbCBBX1dBSVRfVlJJU0UgdGltZXIgKi8KKwkJfCBTUlBfRFBXCQkvKiBkZXRlY3QgMTY3K25zIFNSUCBwdWxzZXMgKi8KKwkJfCBTUlBfREFUQSB8IFNSUF9WQlVTCS8qIGFjY2VwdCBib3RoIGtpbmRzIG9mIFNSUCBwdWxzZSAqLworCQk7CisKKwl1cGRhdGVfb3RnMShpc3AsIGlzcDEzMDFfZ2V0X3U4KGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfU09VUkNFKSk7CisJdXBkYXRlX290ZzIoaXNwLCBpc3AxMzAxX2dldF91OChpc3AsIElTUDEzMDFfT1RHX1NUQVRVUykpOworCisJY2hlY2tfc3RhdGUoaXNwLCBfX0ZVTkNUSU9OX18pOworCXByX2RlYnVnKCJvdGc6ICVzLCAlcyAlMDZ4XG4iLAorCQkJc3RhdGVfbmFtZShpc3ApLCBfX0ZVTkNUSU9OX18sIE9UR19DVFJMX1JFRyk7CisKKwlPVEdfSVJRX0VOX1JFRyA9IERSSVZFUl9TV0lUQ0ggfCBPUFJUX0NIRworCQkJfCBCX1NSUF9UTVJPVVQgfCBCX0hOUF9GQUlMCisJCQl8IEFfVkJVU19FUlIgfCBBX1NSUF9ERVRFQ1QgfCBBX1JFUV9UTVJPVVQ7CisJT1RHX1NZU0NPTl8yX1JFRyB8PSBPVEdfRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdGdfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8vIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgKmNvbmZpZyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKworCW90Z19kZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdGdfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlvdGdfZGV2ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRldmljZV9kcml2ZXIgb21hcF9vdGdfZHJpdmVyID0geworCS5uYW1lCQk9ICJvbWFwX290ZyIsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCQk9IG90Z19wcm9iZSwKKwkucmVtb3ZlCQk9IG90Z19yZW1vdmUsCQorfTsKKworc3RhdGljIGludCBvdGdfYmluZChzdHJ1Y3QgaXNwMTMwMSAqaXNwKQoreworCWludAlzdGF0dXM7CisKKwlpZiAob3RnX2RldikKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN0YXR1cyA9IGRyaXZlcl9yZWdpc3Rlcigmb21hcF9vdGdfZHJpdmVyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChvdGdfZGV2KQorCQlzdGF0dXMgPSByZXF1ZXN0X2lycShvdGdfZGV2LT5yZXNvdXJjZVsxXS5zdGFydCwgb21hcF9vdGdfaXJxLAorCQkJCVNBX0lOVEVSUlVQVCwgRFJJVkVSX05BTUUsIGlzcCk7CisJZWxzZQorCQlzdGF0dXMgPSAtRU5PREVWOworCisJaWYgKHN0YXR1cyA8IDApCisJCWRyaXZlcl91bnJlZ2lzdGVyKCZvbWFwX290Z19kcml2ZXIpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIG90Z191bmJpbmQoc3RydWN0IGlzcDEzMDEgKmlzcCkKK3sKKwlpZiAoIW90Z19kZXYpCisJCXJldHVybjsKKwlmcmVlX2lycShvdGdfZGV2LT5yZXNvdXJjZVsxXS5zdGFydCwgaXNwKTsKK30KKworI2Vsc2UKKworLyogT1RHIGNvbnRyb2xsZXIgaXNuJ3QgY2xvY2tlZCAqLworCisjZW5kaWYJLyogQ09ORklHX1VTQl9PVEcgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgYl9wZXJpcGhlcmFsKHN0cnVjdCBpc3AxMzAxICppc3ApCit7CisJT1RHX0NUUkxfUkVHID0gT1RHX0NUUkxfUkVHICYgT1RHX1hDRUlWX09VVFBVVFM7CisJdXNiX2dhZGdldF92YnVzX2Nvbm5lY3QoaXNwLT5vdGcuZ2FkZ2V0KTsKKworI2lmZGVmCUNPTkZJR19VU0JfT1RHCisJZW5hYmxlX3ZidXNfZHJhdyhpc3AsIDgpOworCW90Z191cGRhdGVfaXNwKGlzcCk7CisjZWxzZQorCWVuYWJsZV92YnVzX2RyYXcoaXNwLCAxMDApOworCS8qIFVEQyBkcml2ZXIganVzdCBzZXQgT1RHX0JTRVNTVkxEICovCisJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfT1RHX0NPTlRST0xfMSwgT1RHMV9EUF9QVUxMVVApOworCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfT1RHX0NPTlRST0xfMSwgT1RHMV9EUF9QVUxMRE9XTik7CisJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOworCXByX2RlYnVnKCIgIC0tPiBiX3BlcmlwaGVyYWxcbiIpOworCWR1bXBfcmVncyhpc3AsICIycGVyaXBoIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgaXNwX3VwZGF0ZV9vdGcoc3RydWN0IGlzcDEzMDEgKmlzcCwgdTggc3RhdCkKK3sKKwl1OAkJCWlzcF9zdGF0LCBpc3BfYnN0YXQ7CisJZW51bSB1c2Jfb3RnX3N0YXRlCXN0YXRlID0gaXNwLT5vdGcuc3RhdGU7CisKKwlpZiAoc3RhdCAmIElOVFJfQkRJU19BQ09OKQorCQlwcl9kZWJ1ZygiT1RHOiAgQkRJU19BQ09OLCAlc1xuIiwgc3RhdGVfbmFtZShpc3ApKTsKKworCS8qIHN0YXJ0IGNlcnRhaW4gc3RhdGUgdHJhbnNpdGlvbnMgcmlnaHQgYXdheSAqLworCWlzcF9zdGF0ID0gaXNwMTMwMV9nZXRfdTgoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9TT1VSQ0UpOworCWlmIChpc3Bfc3RhdCAmIElOVFJfSURfR05EKSB7CisJCWlmIChpc3AtPm90Zy5kZWZhdWx0X2EpIHsKKwkJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKKwkJCQlhX2lkbGUoaXNwLCAiaWRsZSIpOworCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQljYXNlIE9UR19TVEFURV9BX0lETEU6CisJCQkJZW5hYmxlX3ZidXNfc291cmNlKGlzcCk7CisJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9WUklTRToKKwkJCQkvKiB3ZSBza2lwIG92ZXIgT1RHX1NUQVRFX0FfV0FJVF9CQ09OLCBzaW5jZQorCQkJCSAqIHRoZSBIQyB3aWxsIHRyYW5zaXRpb24gdG8gQV9IT1NUIChvcgorCQkJCSAqIEFfU1VTUEVORCEpIHdpdGhvdXQgb3VyIG5vdGljaW5nIGV4Y2VwdAorCQkJCSAqIHdoZW4gSE5QIGlzIHVzZWQuCisJCQkJICovCisJCQkJaWYgKGlzcF9zdGF0ICYgSU5UUl9WQlVTX1ZMRCkKKwkJCQkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQV9IT1NUOworCQkJCWJyZWFrOworCQkJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMOgorCQkJCWlmICghKGlzcF9zdGF0ICYgSU5UUl9TRVNTX1ZMRCkpCisJCQkJCWFfaWRsZShpc3AsICJ2ZmVsbCIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoIShpc3Bfc3RhdCAmIElOVFJfVkJVU19WTEQpKQorCQkJCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9BX1ZCVVNfRVJSOworCQkJCWJyZWFrOworCQkJfQorCQkJaXNwX2JzdGF0ID0gaXNwMTMwMV9nZXRfdTgoaXNwLCBJU1AxMzAxX09UR19TVEFUVVMpOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJY2FzZSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOgorCQkJY2FzZSBPVEdfU1RBVEVfQl9IT1NUOgorCQkJY2FzZSBPVEdfU1RBVEVfQl9XQUlUX0FDT046CisJCQkJdXNiX2dhZGdldF92YnVzX2Rpc2Nvbm5lY3QoaXNwLT5vdGcuZ2FkZ2V0KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RhdGUgIT0gT1RHX1NUQVRFX0FfSURMRSkKKwkJCQlhX2lkbGUoaXNwLCAiaWQiKTsKKwkJCWlmIChpc3AtPm90Zy5ob3N0ICYmIHN0YXRlID09IE9UR19TVEFURV9BX0lETEUpCisJCQkJaXNwMTMwMV9kZWZlcl93b3JrKGlzcCwgV09SS19IT1NUX1JFU1VNRSk7CisJCQlpc3BfYnN0YXQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogaWYgdXNlciB1bnBsdWdnZWQgbWluaS1BIGVuZCBvZiBjYWJsZSwKKwkJICogZG9uJ3QgYnlwYXNzIEFfV0FJVF9WRkFMTC4KKwkJICovCisJCWlmIChpc3AtPm90Zy5kZWZhdWx0X2EpIHsKKwkJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCWRlZmF1bHQ6CisJCQkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMOworCQkJCWJyZWFrOworCQkJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMOgorCQkJCXN0YXRlID0gT1RHX1NUQVRFX0FfSURMRTsKKwkJCQkvKiBraHViZCBtYXkgdGFrZSBhIHdoaWxlIHRvIG5vdGljZSBhbmQKKwkJCQkgKiBoYW5kbGUgdGhpcyBkaXNjb25uZWN0LCBzbyBkb24ndCBnbworCQkJCSAqIHRvIEJfSURMRSBxdWl0ZSB5ZXQuCisJCQkJICovCisJCQkJYnJlYWs7CisJCQljYXNlIE9UR19TVEFURV9BX0lETEU6CisJCQkJaG9zdF9zdXNwZW5kKGlzcCk7CisJCQkJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMSwKKwkJCQkJCU1DMV9CRElTX0FDT05fRU4pOworCQkJCWlzcC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0JfSURMRTsKKwkJCQlPVEdfQ1RSTF9SRUcgJj0gT1RHX0NUUkxfUkVHICYgT1RHX0NUUkxfTUFTSworCQkJCQkJJiB+T1RHX0NUUkxfQklUUzsKKwkJCQlicmVhazsKKwkJCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpc3BfYnN0YXQgPSBpc3AxMzAxX2dldF91OChpc3AsIElTUDEzMDFfT1RHX1NUQVRVUyk7CisKKwkJc3dpdGNoIChpc3AtPm90Zy5zdGF0ZSkgeworCQljYXNlIE9UR19TVEFURV9CX1BFUklQSEVSQUw6CisJCWNhc2UgT1RHX1NUQVRFX0JfV0FJVF9BQ09OOgorCQljYXNlIE9UR19TVEFURV9CX0hPU1Q6CisJCQlpZiAobGlrZWx5KGlzcF9ic3RhdCAmIE9UR19CX1NFU1NfVkxEKSkKKwkJCQlicmVhazsKKwkJCWVuYWJsZV92YnVzX2RyYXcoaXNwLCAwKTsKKyNpZm5kZWYJQ09ORklHX1VTQl9PVEcKKwkJCS8qIFVEQyBkcml2ZXIgd2lsbCBjbGVhciBPVEdfQlNFU1NWTEQgKi8KKwkJCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX09UR19DT05UUk9MXzEsCisJCQkJCQlPVEcxX0RQX1BVTExET1dOKTsKKwkJCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfT1RHX0NPTlRST0xfMSwKKwkJCQkJCU9URzFfRFBfUFVMTFVQKTsKKwkJCWR1bXBfcmVncyhpc3AsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgT1RHX1NUQVRFX0JfU1JQX0lOSVQ6CisJCQliX2lkbGUoaXNwLCBfX0ZVTkNUSU9OX18pOworCQkJT1RHX0NUUkxfUkVHICY9IE9UR19DVFJMX1JFRyAmIE9UR19YQ0VJVl9PVVRQVVRTOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBPVEdfU1RBVEVfQl9JRExFOgorCQkJaWYgKGlzcC0+b3RnLmdhZGdldCAmJiAoaXNwX2JzdGF0ICYgT1RHX0JfU0VTU19WTEQpKSB7CisjaWZkZWYJQ09ORklHX1VTQl9PVEcKKwkJCQl1cGRhdGVfb3RnMShpc3AsIGlzcF9zdGF0KTsKKwkJCQl1cGRhdGVfb3RnMihpc3AsIGlzcF9ic3RhdCk7CisjZW5kaWYKKwkJCQliX3BlcmlwaGVyYWwoaXNwKTsKKwkJCX0gZWxzZSBpZiAoIShpc3Bfc3RhdCAmIChJTlRSX1ZCVVNfVkxEfElOVFJfU0VTU19WTEQpKSkKKwkJCQlpc3BfYnN0YXQgfD0gT1RHX0JfU0VTU19FTkQ7CisJCQlicmVhazsKKwkJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9kZWJ1Zygib3RnOiB1bnN1cHBvcnRlZCBiLWRldmljZSAlc1xuIiwKKwkJCQlzdGF0ZV9uYW1lKGlzcCkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc3RhdGUgIT0gaXNwLT5vdGcuc3RhdGUpCisJCXByX2RlYnVnKCIgIGlzcCwgJXMgLT4gJXNcbiIsCisJCQkJc3RhdGVfc3RyaW5nKHN0YXRlKSwgc3RhdGVfbmFtZShpc3ApKTsKKworI2lmZGVmCUNPTkZJR19VU0JfT1RHCisJLyogdXBkYXRlIHRoZSBPVEcgY29udHJvbGxlciBzdGF0ZSB0byBtYXRjaCB0aGUgaXNwMTMwMTsgbWF5CisJICogdHJpZ2dlciBPUFJUX0NIRyBpcnFzIGZvciBjaGFuZ2VzIGdvaW5nIHRvIHRoZSBpc3AxMzAxLgorCSAqLworCXVwZGF0ZV9vdGcxKGlzcCwgaXNwX3N0YXQpOworCXVwZGF0ZV9vdGcyKGlzcCwgaXNwX2JzdGF0KTsKKwljaGVja19zdGF0ZShpc3AsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKKworCWR1bXBfcmVncyhpc3AsICJpc3AxMzAxLT5vdGciKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHU4IGlzcDEzMDFfY2xlYXJfbGF0Y2goc3RydWN0IGlzcDEzMDEgKmlzcCkKK3sKKwl1OCBsYXRjaCA9IGlzcDEzMDFfZ2V0X3U4KGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfTEFUQ0gpOworCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX0xBVENILCBsYXRjaCk7CisJcmV0dXJuIGxhdGNoOworfQorCitzdGF0aWMgdm9pZAoraXNwMTMwMV93b3JrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlzcDEzMDEJKmlzcCA9IGRhdGE7CisJaW50CQlzdG9wOworCisJLyogaW1wbGljaXQgbG9jazogIHdlJ3JlIHRoZSBvbmx5IHRhc2sgdXNpbmcgdGhpcyBkZXZpY2UgKi8KKwlpc3AtPndvcmtpbmcgPSAxOworCWRvIHsKKwkJc3RvcCA9IHRlc3RfYml0KFdPUktfU1RPUCwgJmlzcC0+dG9kbyk7CisKKyNpZmRlZglDT05GSUdfVVNCX09URworCQkvKiB0cmFuc2ZlciBzdGF0ZSBmcm9tIG90ZyBlbmdpbmUgdG8gaXNwMTMwMSAqLworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdPUktfVVBEQVRFX0lTUCwgJmlzcC0+dG9kbykpIHsKKwkJCW90Z191cGRhdGVfaXNwKGlzcCk7CisJCQlwdXRfZGV2aWNlKCZpc3AtPmNsaWVudC5kZXYpOworCQl9CisjZW5kaWYKKwkJLyogdHJhbnNmZXIgc3RhdGUgZnJvbSBpc3AxMzAxIHRvIG90ZyBlbmdpbmUgKi8KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXT1JLX1VQREFURV9PVEcsICZpc3AtPnRvZG8pKSB7CisJCQl1OAkJc3RhdCA9IGlzcDEzMDFfY2xlYXJfbGF0Y2goaXNwKTsKKworCQkJaXNwX3VwZGF0ZV9vdGcoaXNwLCBzdGF0KTsKKwkJCXB1dF9kZXZpY2UoJmlzcC0+Y2xpZW50LmRldik7CisJCX0KKworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdPUktfSE9TVF9SRVNVTUUsICZpc3AtPnRvZG8pKSB7CisJCQl1MzIJb3RnX2N0cmw7CisKKwkJCS8qCisJCQkgKiBza2lwIEFfV0FJVF9WUklTRTsgaGMgdHJhbnNpdGlvbnMgaW52aXNpYmx5CisJCQkgKiBza2lwIEFfV0FJVF9CQ09OOyBzYW1lLgorCQkJICovCisJCQlzd2l0Y2ggKGlzcC0+b3RnLnN0YXRlKSB7CisJCQljYXNlIE9UR19TVEFURV9BX1dBSVRfQkNPTjoKKwkJCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9WUklTRToKKwkJCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9BX0hPU1Q7CisJCQkJcHJfZGVidWcoIiAgLS0+IGFfaG9zdFxuIik7CisJCQkJb3RnX2N0cmwgPSBPVEdfQ1RSTF9SRUc7CisJCQkJb3RnX2N0cmwgfD0gT1RHX0FfQlVTUkVROworCQkJCW90Z19jdHJsICY9IH4oT1RHX0JVU0RST1B8T1RHX0JfQlVTUkVRKQorCQkJCQkJJiBPVEdfQ1RSTF9NQVNLOworCQkJCU9UR19DVFJMX1JFRyA9IG90Z19jdHJsOworCQkJCWJyZWFrOworCQkJY2FzZSBPVEdfU1RBVEVfQl9XQUlUX0FDT046CisJCQkJaXNwLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9IT1NUOworCQkJCXByX2RlYnVnKCIgIC0tPiBiX2hvc3QgKGFjb24pXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT1RHX1NUQVRFX0JfSE9TVDoKKwkJCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKKwkJCWNhc2UgT1RHX1NUQVRFX0FfSURMRToKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJfZGVidWcoIiAgaG9zdCByZXN1bWUgaW4gJXNcbiIsCisJCQkJCQlzdGF0ZV9uYW1lKGlzcCkpOworCQkJfQorCQkJaG9zdF9yZXN1bWUoaXNwKTsKKwkJCS8vIG1kZWxheSgxMCk7CisJCQlwdXRfZGV2aWNlKCZpc3AtPmNsaWVudC5kZXYpOworCQl9CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXT1JLX1RJTUVSLCAmaXNwLT50b2RvKSkgeworI2lmZGVmCVZFUkJPU0UKKwkJCWR1bXBfcmVncyhpc3AsICJ0aW1lciIpOworCQkJaWYgKCFzdG9wKQorCQkJCW1vZF90aW1lcigmaXNwLT50aW1lciwgamlmZmllcyArIFRJTUVSX0pJRkZJRVMpOworI2VuZGlmCisJCQlwdXRfZGV2aWNlKCZpc3AtPmNsaWVudC5kZXYpOworCQl9CisKKwkJaWYgKGlzcC0+dG9kbykKKwkJCWRldl92ZGJnKCZpc3AtPmNsaWVudC5kZXYsCisJCQkJIndvcmsgZG9uZSwgdG9kbyA9IDB4JWx4XG4iLAorCQkJCWlzcC0+dG9kbyk7CisJCWlmIChzdG9wKSB7CisJCQlkZXZfZGJnKCZpc3AtPmNsaWVudC5kZXYsICJzdG9wXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoaXNwLT50b2RvKTsKKwlpc3AtPndvcmtpbmcgPSAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaXNwMTMwMV9pcnEoaW50IGlycSwgdm9pZCAqaXNwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpc3AxMzAxX2RlZmVyX3dvcmsoaXNwLCBXT1JLX1VQREFURV9PVEcpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgaXNwMTMwMV90aW1lcih1bnNpZ25lZCBsb25nIF9pc3ApCit7CisJaXNwMTMwMV9kZWZlcl93b3JrKCh2b2lkICopX2lzcCwgV09SS19USU1FUik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIGlzcDEzMDFfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlzcDEzMDEJKmlzcDsKKworCWlzcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpc3AxMzAxLCBjbGllbnQuZGV2KTsKKworCS8qIHVnbHkgLS0gaTJjIGhpamFja3Mgb3VyIG1lbW9yeSBob29rIHRvIHdhaXRfZm9yX2NvbXBsZXRpb24oKSAqLworCWlmIChpc3AtPmkyY19yZWxlYXNlKQorCQlpc3AtPmkyY19yZWxlYXNlKGRldik7CisJa2ZyZWUgKGlzcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNwMTMwMSAqdGhlX3RyYW5zY2VpdmVyOworCitzdGF0aWMgaW50IGlzcDEzMDFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXN0cnVjdCBpc3AxMzAxCSppc3A7CisKKwlpc3AgPSBjb250YWluZXJfb2YoaTJjLCBzdHJ1Y3QgaXNwMTMwMSwgY2xpZW50KTsKKworCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX0ZBTExJTkcsIH4wKTsKKwlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9SSVNJTkcsIH4wKTsKKwlmcmVlX2lycShpc3AtPmlycSwgaXNwKTsKKyNpZmRlZglDT05GSUdfVVNCX09URworCW90Z191bmJpbmQoaXNwKTsKKyNlbmRpZgorCWlmIChtYWNoaW5lX2lzX29tYXBfaDIoKSkKKwkJb21hcF9mcmVlX2dwaW8oMik7CisKKwlpc3AtPnRpbWVyLmRhdGEgPSAwOworCXNldF9iaXQoV09SS19TVE9QLCAmaXNwLT50b2RvKTsKKwlkZWxfdGltZXJfc3luYygmaXNwLT50aW1lcik7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCXB1dF9kZXZpY2UoJmkyYy0+ZGV2KTsKKwl0aGVfdHJhbnNjZWl2ZXIgPSAwOworCisJcmV0dXJuIGkyY19kZXRhY2hfY2xpZW50KGkyYyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE5PVEU6ICB0aHJlZSBtb2RlcyBhcmUgcG9zc2libGUgaGVyZSwgb25seSBvbmUgb2Ygd2hpY2gKKyAqIHdpbGwgYmUgc3RhbmRhcmRzLWNvbmZvcm1hbnQgb24gYW55IGdpdmVuIHN5c3RlbToKKyAqCisgKiAgLSBPVEcgbW9kZSAoZHVhbC1yb2xlKSwgcmVxdWlyZWQgaWYgdGhlcmUncyBhIE1pbmktQUIgY29ubmVjdG9yCisgKiAgLSBIT1NUIG1vZGUsIGZvciB3aGVuIHRoZXJlJ3Mgb25lIG9yIG1vcmUgQSAoaG9zdCkgY29ubmVjdG9ycworICogIC0gREVWSUNFIG1vZGUsIGZvciB3aGVuIHRoZXJlJ3MgYSBCL01pbmktQiAoZGV2aWNlKSBjb25uZWN0b3IKKyAqCisgKiBBcyBhIHJ1bGUsIHlvdSB3b24ndCBoYXZlIGFuIGlzcDEzMDEgY2hpcCB1bmxlc3MgaXQncyB0aGVyZSB0bworICogc3VwcG9ydCB0aGUgT1RHIG1vZGUuICBPdGhlciBtb2RlcyBoZWxwIHRlc3RpbmcgVVNCIGNvbnRyb2xsZXJzIAorICogaW4gaXNvbGF0aW9uIGZyb20gKGZ1bGwpIE9URyBzdXBwb3J0LCBvciBtYXliZSBzbyBsYXRlciBib2FyZAorICogcmV2aXNpb25zIGNhbiBoZWxwIHRvIHN1cHBvcnQgdGhvc2UgZmVhdHVyZS4KKyAqLworCisjaWZkZWYJQ09ORklHX1VTQl9PVEcKKworc3RhdGljIGludCBpc3AxMzAxX290Z19lbmFibGUoc3RydWN0IGlzcDEzMDEgKmlzcCkKK3sKKwlwb3dlcl91cChpc3ApOworCW90Z19pbml0KGlzcCk7CisKKwkvKiBOT1RFOiAgc2luY2Ugd2UgZG9uJ3QgY2hhbmdlIHRoaXMsIHRoaXMgcHJvdmlkZXMKKwkgKiBhIGZldyBtb3JlIGludGVycnVwdHMgdGhhbiBhcmUgc3RyaWN0bHkgbmVlZGVkLgorCSAqLworCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9SSVNJTkcsCisJIAlJTlRSX1ZCVVNfVkxEIHwgSU5UUl9TRVNTX1ZMRCB8IElOVFJfSURfR05EKTsKKwlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfRkFMTElORywKKwkgCUlOVFJfVkJVU19WTEQgfCBJTlRSX1NFU1NfVkxEIHwgSU5UUl9JRF9HTkQpOworCisJZGV2X2luZm8oJmlzcC0+Y2xpZW50LmRldiwgInJlYWR5IGZvciBkdWFsLXJvbGUgVVNCIC4uLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8qIGFkZCBvciBkaXNhYmxlIHRoZSBob3N0IGRldmljZStkcml2ZXIgKi8KK3N0YXRpYyBpbnQKK2lzcDEzMDFfc2V0X2hvc3Qoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLCBzdHJ1Y3QgdXNiX2J1cyAqaG9zdCkKK3sKKwlzdHJ1Y3QgaXNwMTMwMQkqaXNwID0gY29udGFpbmVyX29mKG90Zywgc3RydWN0IGlzcDEzMDEsIG90Zyk7CisKKwlpZiAoIW90ZyB8fCBpc3AgIT0gdGhlX3RyYW5zY2VpdmVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghaG9zdCkgeworCQlPVEdfSVJRX0VOX1JFRyA9IDA7CisJCXBvd2VyX2Rvd24oaXNwKTsKKwkJaXNwLT5vdGcuaG9zdCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmCUNPTkZJR19VU0JfT1RHCisJaXNwLT5vdGcuaG9zdCA9IGhvc3Q7CisJZGV2X2RiZygmaXNwLT5jbGllbnQuZGV2LCAicmVnaXN0ZXJlZCBob3N0XG4iKTsKKwlob3N0X3N1c3BlbmQoaXNwKTsKKwlpZiAoaXNwLT5vdGcuZ2FkZ2V0KQorCQlyZXR1cm4gaXNwMTMwMV9vdGdfZW5hYmxlKGlzcCk7CisJcmV0dXJuIDA7CisKKyNlbGlmCSFkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX09NQVApCisJLy8gRklYTUUgdXBkYXRlIGl0cyByZWZjb3VudAorCWlzcC0+b3RnLmhvc3QgPSBob3N0OworCisJcG93ZXJfdXAoaXNwKTsKKworCWlmIChtYWNoaW5lX2lzX29tYXBfaDIoKSkKKwkJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzEsIE1DMV9EQVRfU0UwKTsKKworCWRldl9pbmZvKCZpc3AtPmNsaWVudC5kZXYsICJBLUhvc3Qgc2Vzc2lvbnMgb2tcbiIpOworCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9SSVNJTkcsCisJIAlJTlRSX0lEX0dORCk7CisJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX0ZBTExJTkcsCisJIAlJTlRSX0lEX0dORCk7CisKKwkvKiBJZiB0aGlzIGhhcyBhIE1pbmktQUIgY29ubmVjdG9yLCB0aGlzIG1vZGUgaXMgaGlnaGx5CisJICogbm9uc3RhbmRhcmQgLi4uIGJ1dCBjYW4gYmUgaGFuZHkgZm9yIHRlc3RpbmcsIGVzcGVjaWFsbHkgd2l0aAorCSAqIHRoZSBNaW5pLUEgZW5kIG9mIGFuIE9URyBjYWJsZS4gIChPciBzb21ldGhpbmcgbm9uc3RhbmRhcmQKKwkgKiBsaWtlIE1pbmlCLXRvLVN0YW5kYXJkQiwgbWF5YmUgYnVpbHQgd2l0aCBhIGdlbmRlciBtZW5kZXIuKQorCSAqLworCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX09UR19DT05UUk9MXzEsIE9URzFfVkJVU19EUlYpOworCisJZHVtcF9yZWdzKGlzcCwgX19GVU5DVElPTl9fKTsKKworCXJldHVybiAwOworCisjZWxzZQorCWRldl9kYmcoJmlzcC0+Y2xpZW50LmRldiwgImhvc3Qgc2Vzc2lvbnMgbm90IGFsbG93ZWRcbiIpOworCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisKK30KKworc3RhdGljIGludAoraXNwMTMwMV9zZXRfcGVyaXBoZXJhbChzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGcsIHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJc3RydWN0IGlzcDEzMDEJKmlzcCA9IGNvbnRhaW5lcl9vZihvdGcsIHN0cnVjdCBpc3AxMzAxLCBvdGcpOworCisJaWYgKCFvdGcgfHwgaXNwICE9IHRoZV90cmFuc2NlaXZlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWdhZGdldCkgeworCQlPVEdfSVJRX0VOX1JFRyA9IDA7CisJCWlmICghaXNwLT5vdGcuZGVmYXVsdF9hKQorCQkJZW5hYmxlX3ZidXNfZHJhdyhpc3AsIDApOworCQl1c2JfZ2FkZ2V0X3ZidXNfZGlzY29ubmVjdChpc3AtPm90Zy5nYWRnZXQpOworCQlpc3AtPm90Zy5nYWRnZXQgPSAwOworCQlwb3dlcl9kb3duKGlzcCk7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmCUNPTkZJR19VU0JfT1RHCisJaXNwLT5vdGcuZ2FkZ2V0ID0gZ2FkZ2V0OworCWRldl9kYmcoJmlzcC0+Y2xpZW50LmRldiwgInJlZ2lzdGVyZWQgZ2FkZ2V0XG4iKTsKKwkvKiBnYWRnZXQgZHJpdmVyIG1heSBiZSBzdXNwZW5kZWQgdW50aWwgdmJ1c19jb25uZWN0ICgpICovCisJaWYgKGlzcC0+b3RnLmhvc3QpCisJCXJldHVybiBpc3AxMzAxX290Z19lbmFibGUoaXNwKTsKKwlyZXR1cm4gMDsKKworI2VsaWYJIWRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgJiYgIWRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCisJaXNwLT5vdGcuZ2FkZ2V0ID0gZ2FkZ2V0OworCS8vIEZJWE1FIHVwZGF0ZSBpdHMgcmVmY291bnQKKworCU9UR19DVFJMX1JFRyA9IChPVEdfQ1RSTF9SRUcgJiBPVEdfQ1RSTF9NQVNLCisJCQkJJiB+KE9UR19YQ0VJVl9PVVRQVVRTfE9UR19DVFJMX0JJVFMpKQorCQkJfCBPVEdfSUQ7CisJcG93ZXJfdXAoaXNwKTsKKwlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9CX0lETEU7CisKKwlpZiAobWFjaGluZV9pc19vbWFwX2gyKCkpCisJCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX01PREVfQ09OVFJPTF8xLCBNQzFfREFUX1NFMCk7CisKKwlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfUklTSU5HLAorCSAJSU5UUl9TRVNTX1ZMRCk7CisJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX0ZBTExJTkcsCisJIAlJTlRSX1ZCVVNfVkxEKTsKKwlkZXZfaW5mbygmaXNwLT5jbGllbnQuZGV2LCAiQi1QZXJpcGhlcmFsIHNlc3Npb25zIG9rXG4iKTsKKwlkdW1wX3JlZ3MoaXNwLCBfX0ZVTkNUSU9OX18pOworCisJLyogSWYgdGhpcyBoYXMgYSBNaW5pLUFCIGNvbm5lY3RvciwgdGhpcyBtb2RlIGlzIGhpZ2hseQorCSAqIG5vbnN0YW5kYXJkIC4uLiBidXQgY2FuIGJlIGhhbmR5IGZvciB0ZXN0aW5nLCBzbyBsb25nCisJICogYXMgeW91IGRvbid0IHBsdWcgYSBNaW5pLUEgY2FibGUgaW50byB0aGUgamFjay4KKwkgKi8KKwlpZiAoaXNwMTMwMV9nZXRfdTgoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9TT1VSQ0UpICYgSU5UUl9WQlVTX1ZMRCkKKwkJYl9wZXJpcGhlcmFsKGlzcCk7CisKKwlyZXR1cm4gMDsKKworI2Vsc2UKKwlkZXZfZGJnKCZpc3AtPmNsaWVudC5kZXYsICJwZXJpcGhlcmFsIHNlc3Npb25zIG5vdCBhbGxvd2VkXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQKK2lzcDEzMDFfc2V0X3Bvd2VyKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKmRldiwgdW5zaWduZWQgbUEpCit7CisJaWYgKCF0aGVfdHJhbnNjZWl2ZXIpCisJCXJldHVybiAtRU5PREVWOworCWlmIChkZXYtPnN0YXRlID09IE9UR19TVEFURV9CX1BFUklQSEVSQUwpCisJCWVuYWJsZV92YnVzX2RyYXcodGhlX3RyYW5zY2VpdmVyLCBtQSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzcDEzMDFfc3RhcnRfc3JwKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKmRldikKK3sKKwlzdHJ1Y3QgaXNwMTMwMQkqaXNwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGlzcDEzMDEsIG90Zyk7CisJdTMyCQlvdGdfY3RybDsKKworCWlmICghZGV2IHx8IGlzcCAhPSB0aGVfdHJhbnNjZWl2ZXIKKwkJCXx8IGlzcC0+b3RnLnN0YXRlICE9IE9UR19TVEFURV9CX0lETEUpCisJCXJldHVybiAtRU5PREVWOworCisJb3RnX2N0cmwgPSBPVEdfQ1RSTF9SRUc7CisJaWYgKCEob3RnX2N0cmwgJiBPVEdfQlNFU1NFTkQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW90Z19jdHJsIHw9IE9UR19CX0JVU1JFUTsKKwlvdGdfY3RybCAmPSB+T1RHX0FfQlVTUkVRICYgT1RHX0NUUkxfTUFTSzsKKwlPVEdfQ1RSTF9SRUcgPSBvdGdfY3RybDsKKwlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9CX1NSUF9JTklUOworCisJcHJfZGVidWcoIm90ZzogU1JQLCAlcyAuLi4gJTA2eFxuIiwgc3RhdGVfbmFtZShpc3ApLCBPVEdfQ1RSTF9SRUcpOworI2lmZGVmCUNPTkZJR19VU0JfT1RHCisJY2hlY2tfc3RhdGUoaXNwLCBfX0ZVTkNUSU9OX18pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzcDEzMDFfc3RhcnRfaG5wKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKmRldikKK3sKKyNpZmRlZglDT05GSUdfVVNCX09URworCXN0cnVjdCBpc3AxMzAxCSppc3AgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaXNwMTMwMSwgb3RnKTsKKworCWlmICghZGV2IHx8IGlzcCAhPSB0aGVfdHJhbnNjZWl2ZXIpCisJCXJldHVybiAtRU5PREVWOworCWlmIChpc3AtPm90Zy5kZWZhdWx0X2EgJiYgKGlzcC0+b3RnLmhvc3QgPT0gTlVMTAorCQkJfHwgIWlzcC0+b3RnLmhvc3QtPmJfaG5wX2VuYWJsZSkpCisJCXJldHVybiAtRU5PVENPTk47CisJaWYgKCFpc3AtPm90Zy5kZWZhdWx0X2EgJiYgKGlzcC0+b3RnLmdhZGdldCA9PSBOVUxMCisJCQl8fCAhaXNwLT5vdGcuZ2FkZ2V0LT5iX2hucF9lbmFibGUpKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJLyogV2Ugd2FudCBoYXJkd2FyZSB0byBtYW5hZ2UgbW9zdCBITlAgcHJvdG9jb2wgdGltaW5ncy4KKwkgKiBTbyBkbyB0aGlzIHBhcnQgYXMgZWFybHkgYXMgcG9zc2libGUuLi4KKwkgKi8KKwlzd2l0Y2ggKGlzcC0+b3RnLnN0YXRlKSB7CisJY2FzZSBPVEdfU1RBVEVfQl9IT1NUOgorCQlpc3AtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9CX1BFUklQSEVSQUw7CisJCS8qIGNhbGxlciB3aWxsIHN1c3BlbmQgbmV4dCAqLworCQlicmVhazsKKwljYXNlIE9UR19TVEFURV9BX0hPU1Q6CisjaWYgMAorCQkvKiBhdXRvY29ubmVjdCBtb2RlIGF2b2lkcyBpcnEgbGF0ZW5jeSBidWdzICovCisJCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX01PREVfQ09OVFJPTF8xLAorCQkJCU1DMV9CRElTX0FDT05fRU4pOworI2VuZGlmCisJCS8qIGNhbGxlciBtdXN0IHN1c3BlbmQgdGhlbiBjbGVhciBBX0JVU1JFUSAqLworCQl1c2JfZ2FkZ2V0X3ZidXNfY29ubmVjdChpc3AtPm90Zy5nYWRnZXQpOworCQlPVEdfQ1RSTF9SRUcgfD0gT1RHX0FfU0VUQl9ITlBFTjsKKworCQlicmVhazsKKwljYXNlIE9UR19TVEFURV9BX1BFUklQSEVSQUw6CisJCS8qIGluaXRpYXRlZCBieSBCLUhvc3Qgc3VzcGVuZCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTFNFUTsKKwl9CisJcHJfZGVidWcoIm90ZzogSE5QICVzLCAlMDZ4IC4uLlxuIiwKKwkJc3RhdGVfbmFtZShpc3ApLCBPVEdfQ1RSTF9SRUcpOworCWNoZWNrX3N0YXRlKGlzcCwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gMDsKKyNlbHNlCisJLyogc3JwLW9ubHkgKi8KKwlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBubyBlcnJvciByZXR1cm5zLCB0aGV5J2QganVzdCBtYWtlIGJ1cyBzY2FubmluZyBzdG9wICovCitzdGF0aWMgaW50IGlzcDEzMDFfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICpidXMsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlpbnQJCQlzdGF0dXM7CisJc3RydWN0IGlzcDEzMDEJCSppc3A7CisJc3RydWN0IGkyY19jbGllbnQJKmkyYzsKKworCWlmICh0aGVfdHJhbnNjZWl2ZXIpCisJCXJldHVybiAwOworCisJaXNwID0ga2NhbGxvYygxLCBzaXplb2YgKmlzcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpc3ApCisJCXJldHVybiAwOworCisJSU5JVF9XT1JLKCZpc3AtPndvcmssIGlzcDEzMDFfd29yaywgaXNwKTsKKwlpbml0X3RpbWVyKCZpc3AtPnRpbWVyKTsKKwlpc3AtPnRpbWVyLmZ1bmN0aW9uID0gaXNwMTMwMV90aW1lcjsKKwlpc3AtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaXNwOworCisJaXNwLT5pcnEgPSAtMTsKKwlpc3AtPmNsaWVudC5hZGRyID0gYWRkcmVzczsKKwlpMmNfc2V0X2NsaWVudGRhdGEoJmlzcC0+Y2xpZW50LCBpc3ApOworCWlzcC0+Y2xpZW50LmFkYXB0ZXIgPSBidXM7CisJaXNwLT5jbGllbnQuZHJpdmVyID0gJmlzcDEzMDFfZHJpdmVyOworCXN0cmxjcHkoaXNwLT5jbGllbnQubmFtZSwgRFJJVkVSX05BTUUsIEkyQ19OQU1FX1NJWkUpOworCWkyYyA9ICZpc3AtPmNsaWVudDsKKworCS8qIGlmIHRoaXMgaXMgYSB0cnVlIHByb2JlLCB2ZXJpZnkgdGhlIGNoaXAgLi4uICovCisJaWYgKGtpbmQgPCAwKSB7CisJCXN0YXR1cyA9IGlzcDEzMDFfZ2V0X3UxNihpc3AsIElTUDEzMDFfVkVORE9SX0lEKTsKKwkJaWYgKHN0YXR1cyAhPSBJMkNfVkVORE9SX0lEX1BISUxJUFMpIHsKKwkJCWRldl9kYmcoJmJ1cy0+ZGV2LCAiYWRkciAlZCBub3QgcGhpbGlwcyBpZDogJWRcbiIsCisJCQkJYWRkcmVzcywgc3RhdHVzKTsKKwkJCWdvdG8gZmFpbDE7CisJCX0KKwkJc3RhdHVzID0gaXNwMTMwMV9nZXRfdTE2KGlzcCwgSVNQMTMwMV9QUk9EVUNUX0lEKTsKKwkJaWYgKHN0YXR1cyAhPSBJMkNfUFJPRFVDVF9JRF9QSElMSVBTXzEzMDEpIHsKKwkJCWRldl9kYmcoJmJ1cy0+ZGV2LCAiJWQgbm90IGlzcDEzMDEsICVkXG4iLAorCQkJCWFkZHJlc3MsIHN0YXR1cyk7CisJCQlnb3RvIGZhaWwxOworCQl9CisJfQorCisJc3RhdHVzID0gaTJjX2F0dGFjaF9jbGllbnQoaTJjKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZGJnKCZidXMtPmRldiwgImNhbid0IGF0dGFjaCAlcyB0byBkZXZpY2UgJWQsIGVyciAlZFxuIiwKKwkJCQlEUklWRVJfTkFNRSwgYWRkcmVzcywgc3RhdHVzKTsKK2ZhaWwxOgorCQlrZnJlZShpc3ApOworCQlyZXR1cm4gMDsKKwl9CisJaXNwLT5pMmNfcmVsZWFzZSA9IGkyYy0+ZGV2LnJlbGVhc2U7CisJaTJjLT5kZXYucmVsZWFzZSA9IGlzcDEzMDFfcmVsZWFzZTsKKworCS8qIGluaXRpYWwgZGV2ZWxvcG1lbnQgdXNlZCBjaGlwcmV2IDIuMDAgKi8KKwlzdGF0dXMgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoaTJjLCBJU1AxMzAxX0JDRF9ERVZJQ0UpOworCWRldl9pbmZvKCZpMmMtPmRldiwgImNoaXByZXYgJXguJTAyeCwgZHJpdmVyICIgRFJJVkVSX1ZFUlNJT04gIlxuIiwKKwkJc3RhdHVzID4+IDgsIHN0YXR1cyAmIDB4ZmYpOworCisJLyogbWFrZSBsaWtlIHBvd2VyLW9uIHJlc2V0ICovCisJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMSwgTUMxX01BU0spOworCisJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfTU9ERV9DT05UUk9MXzIsIE1DMl9CSV9ESSk7CisJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMiwgfk1DMl9CSV9ESSk7CisKKwlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9PVEdfQ09OVFJPTF8xLAorCQkJCU9URzFfRE1fUFVMTERPV04gfCBPVEcxX0RQX1BVTExET1dOKTsKKwlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX09UR19DT05UUk9MXzEsCisJCQkJfihPVEcxX0RNX1BVTExET1dOIHwgT1RHMV9EUF9QVUxMRE9XTikpOworCisJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfTEFUQ0gsIH4wKTsKKwlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9GQUxMSU5HLCB+MCk7CisJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfUklTSU5HLCB+MCk7CisKKyNpZmRlZglDT05GSUdfVVNCX09URworCXN0YXR1cyA9IG90Z19iaW5kKGlzcCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGV2X2RiZygmaTJjLT5kZXYsICJjYW4ndCBiaW5kIE9UR1xuIik7CisJCWdvdG8gZmFpbDI7CisJfQorI2VuZGlmCisKKwlpZiAobWFjaGluZV9pc19vbWFwX2gyKCkpIHsKKwkJLyogZnVsbCBzcGVlZCBzaWduYWxpbmcgYnkgZGVmYXVsdCAqLworCQlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMSwKKwkJCU1DMV9TUEVFRF9SRUcpOworCQlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMiwKKwkJCU1DMl9TUERfU1VTUF9DVFJMKTsKKworCQkvKiBJUlEgd2lyZWQgYXQgTTE0ICovCisJCW9tYXBfY2ZnX3JlZyhNMTRfMTUxMF9HUElPMik7CisJCWlzcC0+aXJxID0gT01BUF9HUElPX0lSUSgyKTsKKwkJb21hcF9yZXF1ZXN0X2dwaW8oMik7CisJCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDIsIDEpOworCQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgyLCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKKwl9CisKKwlzdGF0dXMgPSByZXF1ZXN0X2lycShpc3AtPmlycSwgaXNwMTMwMV9pcnEsCisJCQlTQV9TQU1QTEVfUkFORE9NLCBEUklWRVJfTkFNRSwgaXNwKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZGJnKCZpMmMtPmRldiwgImNhbid0IGdldCBJUlEgJWQsIGVyciAlZFxuIiwKKwkJCQlpc3AtPmlycSwgc3RhdHVzKTsKKyNpZmRlZglDT05GSUdfVVNCX09URworZmFpbDI6CisjZW5kaWYKKwkJaTJjX2RldGFjaF9jbGllbnQoaTJjKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwlpc3AtPm90Zy5kZXYgPSAmaXNwLT5jbGllbnQuZGV2OworCWlzcC0+b3RnLmxhYmVsID0gRFJJVkVSX05BTUU7CisKKwlpc3AtPm90Zy5zZXRfaG9zdCA9IGlzcDEzMDFfc2V0X2hvc3QsCisJaXNwLT5vdGcuc2V0X3BlcmlwaGVyYWwgPSBpc3AxMzAxX3NldF9wZXJpcGhlcmFsLAorCWlzcC0+b3RnLnNldF9wb3dlciA9IGlzcDEzMDFfc2V0X3Bvd2VyLAorCWlzcC0+b3RnLnN0YXJ0X3NycCA9IGlzcDEzMDFfc3RhcnRfc3JwLAorCWlzcC0+b3RnLnN0YXJ0X2hucCA9IGlzcDEzMDFfc3RhcnRfaG5wLAorCisJZW5hYmxlX3ZidXNfZHJhdyhpc3AsIDApOworCXBvd2VyX2Rvd24oaXNwKTsKKwl0aGVfdHJhbnNjZWl2ZXIgPSBpc3A7CisKKyNpZmRlZglDT05GSUdfVVNCX09URworCXVwZGF0ZV9vdGcxKGlzcCwgaXNwMTMwMV9nZXRfdTgoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9TT1VSQ0UpKTsKKwl1cGRhdGVfb3RnMihpc3AsIGlzcDEzMDFfZ2V0X3U4KGlzcCwgSVNQMTMwMV9PVEdfU1RBVFVTKSk7CisjZW5kaWYKKworCWR1bXBfcmVncyhpc3AsIF9fRlVOQ1RJT05fXyk7CisKKyNpZmRlZglWRVJCT1NFCisJbW9kX3RpbWVyKCZpc3AtPnRpbWVyLCBqaWZmaWVzICsgVElNRVJfSklGRklFUyk7CisJZGV2X2RiZygmaTJjLT5kZXYsICJzY2hlZHVsZWQgdGltZXIsICVkIG1pblxuIiwgVElNRVJfTUlOVVRFUyk7CisjZW5kaWYKKworCXN0YXR1cyA9IG90Z19zZXRfdHJhbnNjZWl2ZXIoJmlzcC0+b3RnKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZGV2X2VycigmaTJjLT5kZXYsICJjYW4ndCByZWdpc3RlciB0cmFuc2NlaXZlciwgJWRcbiIsCisJCQlzdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNwMTMwMV9zY2FuX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmJ1cykKK3sKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGJ1cywgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBCisJCQl8IEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGkyY19wcm9iZShidXMsICZhZGRyX2RhdGEsIGlzcDEzMDFfcHJvYmUpOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaXNwMTMwMV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJpc3AxMzAxX29tYXAiLAorCS5pZAkJPSAxMzAxLAkJLyogRklYTUUgIm9mZmljaWFsIiwgaTJjLWlkcy5oICovCisJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBpc3AxMzAxX3NjYW5fYnVzLAorCS5kZXRhY2hfY2xpZW50CT0gaXNwMTMwMV9kZXRhY2hfY2xpZW50LAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBfX2luaXQgaXNwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmlzcDEzMDFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGlzcF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGlzcF9leGl0KHZvaWQpCit7CisJaWYgKHRoZV90cmFuc2NlaXZlcikKKwkJb3RnX3NldF90cmFuc2NlaXZlcigwKTsKKwlpMmNfZGVsX2RyaXZlcigmaXNwMTMwMV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoaXNwX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9pdDg3LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9pdDg3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0ODRhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2l0ODcuYwpAQCAtMCwwICsxLDEyMDggQEAKKy8qCisgICAgaXQ4Ny5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICBtb25pdG9yaW5nLgorCisgICAgU3VwcG9ydHM6IElUODcwNUYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZSAmIFNNQnVzCisgICAgICAgICAgICAgIElUODcxMkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZSAmIFNNQnVzCisgICAgICAgICAgICAgIFNpczk1MCAgIEEgY2xvbmUgb2YgdGhlIElUODcwNUYKKworICAgIENvcHlyaWdodCAoQykgMjAwMSBDaHJpcyBHYXV0aHJvbiA8Y2hyaXNnQDAtaW4uY29tPiAKKyAgICBMYXJnZWx5IGluc3BpcmVkIGJ5IGxtNzguYyBvZiB0aGUgc2FtZSBwYWNrYWdlCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qCisgICAgZGpnQHBkcDgubmV0IERhdmlkIEdlc3N3ZWluIDcvMTgvMDEKKyAgICBNb2RpZmllZCB0byBmaXggYnVnIHdpdGggbm90IGFsbCBhbGFybXMgZW5hYmxlZC4KKyAgICBBZGRlZCBhYmlsaXR5IHRvIHJlYWQgYmF0dGVyeSB2b2x0YWdlIGFuZCBzZWxlY3QgdGVtcGVyYXR1cmUgc2Vuc29yCisgICAgdHlwZSBhdCBtb2R1bGUgbG9hZCB0aW1lLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsCisJCQkJCTB4MmUsIDB4MmYsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMjkwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzIoaXQ4NywgaXQ4NzEyKTsKKworI2RlZmluZQlSRUcJMHgyZQkvKiBUaGUgcmVnaXN0ZXIgdG8gcmVhZC93cml0ZSAqLworI2RlZmluZQlERVYJMHgwNwkvKiBSZWdpc3RlcjogTG9naWNhbCBkZXZpY2Ugc2VsZWN0ICovCisjZGVmaW5lCVZBTAkweDJmCS8qIFRoZSB2YWx1ZSB0byByZWFkL3dyaXRlICovCisjZGVmaW5lIFBNRQkweDA0CS8qIFRoZSBkZXZpY2Ugd2l0aCB0aGUgZmFuIHJlZ2lzdGVycyBpbiBpdCAqLworI2RlZmluZQlERVZJRAkweDIwCS8qIFJlZ2lzdGVyOiBEZXZpY2UgSUQgKi8KKyNkZWZpbmUJREVWUkVWCTB4MjIJLyogUmVnaXN0ZXI6IERldmljZSBSZXZpc2lvbiAqLworCitzdGF0aWMgaW5saW5lIGludAorc3VwZXJpb19pbmIoaW50IHJlZykKK3sKKwlvdXRiKHJlZywgUkVHKTsKKwlyZXR1cm4gaW5iKFZBTCk7Cit9CisKK3N0YXRpYyBpbnQgc3VwZXJpb19pbncoaW50IHJlZykKK3sKKwlpbnQgdmFsOworCW91dGIocmVnKyssIFJFRyk7CisJdmFsID0gaW5iKFZBTCkgPDwgODsKKwlvdXRiKHJlZywgUkVHKTsKKwl2YWwgfD0gaW5iKFZBTCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzdXBlcmlvX3NlbGVjdCh2b2lkKQoreworCW91dGIoREVWLCBSRUcpOworCW91dGIoUE1FLCBWQUwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3N1cGVyaW9fZW50ZXIodm9pZCkKK3sKKwlvdXRiKDB4ODcsIFJFRyk7CisJb3V0YigweDAxLCBSRUcpOworCW91dGIoMHg1NSwgUkVHKTsKKwlvdXRiKDB4NTUsIFJFRyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3VwZXJpb19leGl0KHZvaWQpCit7CisJb3V0YigweDAyLCBSRUcpOworCW91dGIoMHgwMiwgVkFMKTsKK30KKworI2RlZmluZSBJVDg3MTJGX0RFVklEIDB4ODcxMgorI2RlZmluZSBJVDg3MDVGX0RFVklEIDB4ODcwNQorI2RlZmluZSBJVDg3X0FDVF9SRUcgIDB4MzAKKyNkZWZpbmUgSVQ4N19CQVNFX1JFRyAweDYwCisKKy8qIFVwZGF0ZSBiYXR0ZXJ5IHZvbHRhZ2UgYWZ0ZXIgZXZlcnkgcmVhZGluZyBpZiB0cnVlICovCitzdGF0aWMgaW50IHVwZGF0ZV92YmF0OworCisvKiBOb3QgYWxsIEJJT1NlcyBwcm9wZXJseSBjb25maWd1cmUgdGhlIFBXTSByZWdpc3RlcnMgKi8KK3N0YXRpYyBpbnQgZml4X3B3bV9wb2xhcml0eTsKKworLyogQ2hpcCBUeXBlICovCisKK3N0YXRpYyB1MTYgY2hpcF90eXBlOworCisvKiBNYW55IElUODcgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLworCisvKiBMZW5ndGggb2YgSVNBIGFkZHJlc3Mgc2VnbWVudCAqLworI2RlZmluZSBJVDg3X0VYVEVOVCA4CisKKy8qIFdoZXJlIGFyZSB0aGUgSVNBIGFkZHJlc3MvZGF0YSByZWdpc3RlcnMgcmVsYXRpdmUgdG8gdGhlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBJVDg3X0FERFJfUkVHX09GRlNFVCA1CisjZGVmaW5lIElUODdfREFUQV9SRUdfT0ZGU0VUIDYKKworLyotLS0tLSBUaGUgSVQ4NyByZWdpc3RlcnMgLS0tLS0qLworCisjZGVmaW5lIElUODdfUkVHX0NPTkZJRyAgICAgICAgMHgwMAorCisjZGVmaW5lIElUODdfUkVHX0FMQVJNMSAgICAgICAgMHgwMQorI2RlZmluZSBJVDg3X1JFR19BTEFSTTIgICAgICAgIDB4MDIKKyNkZWZpbmUgSVQ4N19SRUdfQUxBUk0zICAgICAgICAweDAzCisKKyNkZWZpbmUgSVQ4N19SRUdfVklEICAgICAgICAgICAweDBhCisjZGVmaW5lIElUODdfUkVHX0ZBTl9ESVYgICAgICAgMHgwYgorCisvKiBNb25pdG9yczogOSB2b2x0YWdlICgwIHRvIDcsIGJhdHRlcnkpLCAzIHRlbXAgKDEgdG8gMyksIDMgZmFuICgxIHRvIDMpICovCisKKyNkZWZpbmUgSVQ4N19SRUdfRkFOKG5yKSAgICAgICAoMHgwZCArIChucikpCisjZGVmaW5lIElUODdfUkVHX0ZBTl9NSU4obnIpICAgKDB4MTAgKyAobnIpKQorI2RlZmluZSBJVDg3X1JFR19GQU5fTUFJTl9DVFJMIDB4MTMKKyNkZWZpbmUgSVQ4N19SRUdfRkFOX0NUTCAgICAgICAweDE0CisjZGVmaW5lIElUODdfUkVHX1BXTShucikgICAgICAgKDB4MTUgKyAobnIpKQorCisjZGVmaW5lIElUODdfUkVHX1ZJTihucikgICAgICAgKDB4MjAgKyAobnIpKQorI2RlZmluZSBJVDg3X1JFR19URU1QKG5yKSAgICAgICgweDI5ICsgKG5yKSkKKworI2RlZmluZSBJVDg3X1JFR19WSU5fTUFYKG5yKSAgICgweDMwICsgKG5yKSAqIDIpCisjZGVmaW5lIElUODdfUkVHX1ZJTl9NSU4obnIpICAgKDB4MzEgKyAobnIpICogMikKKyNkZWZpbmUgSVQ4N19SRUdfVEVNUF9ISUdIKG5yKSAoMHg0MCArIChucikgKiAyKQorI2RlZmluZSBJVDg3X1JFR19URU1QX0xPVyhucikgICgweDQxICsgKG5yKSAqIDIpCisKKyNkZWZpbmUgSVQ4N19SRUdfSTJDX0FERFIgICAgICAweDQ4CisKKyNkZWZpbmUgSVQ4N19SRUdfVklOX0VOQUJMRSAgICAweDUwCisjZGVmaW5lIElUODdfUkVHX1RFTVBfRU5BQkxFICAgMHg1MQorCisjZGVmaW5lIElUODdfUkVHX0NISVBJRCAgICAgICAgMHg1OAorCisjZGVmaW5lIElOX1RPX1JFRyh2YWwpICAoU0VOU09SU19MSU1JVCgoKCh2YWwpICsgOCkvMTYpLDAsMjU1KSkKKyNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKSAoKHZhbCkgKiAxNikKKworc3RhdGljIGlubGluZSB1OCBGQU5fVE9fUkVHKGxvbmcgcnBtLCBpbnQgZGl2KQoreworCWlmIChycG0gPT0gMCkKKwkJcmV0dXJuIDI1NTsKKwlycG0gPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTAwMDAwMCk7CisJcmV0dXJuIFNFTlNPUlNfTElNSVQoKDEzNTAwMDAgKyBycG0gKiBkaXYgLyAyKSAvIChycG0gKiBkaXYpLCAxLAorCQkJICAgICAyNTQpOworfQorCisjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsZGl2KSAoKHZhbCk9PTA/LTE6KHZhbCk9PTI1NT8wOjEzNTAwMDAvKCh2YWwpKihkaXYpKSkKKworI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgodmFsKTwwPygoKHZhbCktNTAwKS8xMDAwKTpcCisJCQkJCSgodmFsKSs1MDApLzEwMDApLC0xMjgsMTI3KSkKKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpICgoKHZhbCk+MHg4MD8odmFsKS0weDEwMDoodmFsKSkqMTAwMCkKKworI2RlZmluZSBBTEFSTVNfRlJPTV9SRUcodmFsKSAodmFsKQorCisjZGVmaW5lIFBXTV9UT19SRUcodmFsKSAgICgodmFsKSA+PiAxKQorI2RlZmluZSBQV01fRlJPTV9SRUcodmFsKSAoKCh2YWwpJjB4N2YpIDw8IDEpCisKK3N0YXRpYyBpbnQgRElWX1RPX1JFRyhpbnQgdmFsKQoreworCWludCBhbnN3ZXIgPSAwOworCXdoaWxlICgodmFsID4+PSAxKSAhPSAwKQorCQlhbnN3ZXIrKzsKKwlyZXR1cm4gYW5zd2VyOworfQorI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMSA8PCAodmFsKSkKKworCisvKiBGb3IgZWFjaCByZWdpc3RlcmVkIElUODcsIHdlIG5lZWQgdG8ga2VlcCBzb21lIGRhdGEgaW4gbWVtb3J5LiBUaGF0CisgICBkYXRhIGlzIHBvaW50ZWQgdG8gYnkgaXQ4N19saXN0W05SXS0+ZGF0YS4gVGhlIHN0cnVjdHVyZSBpdHNlbGYgaXMKKyAgIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwgYXQgdGhlIHNhbWUgdGltZSB3aGVuIGEgbmV3IGl0ODcgY2xpZW50IGlzCisgICBhbGxvY2F0ZWQuICovCitzdHJ1Y3QgaXQ4N19kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCWVudW0gY2hpcHMgdHlwZTsKKworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisKKwl1OCBpbls5XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzldOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bOV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX21pblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdGVtcFszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdGVtcF9oaWdoWzNdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHRlbXBfbG93WzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBzZW5zb3I7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9kaXZbM107CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLworCXU4IHZpZDsJCQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwlpbnQgdnJtOworCXUzMiBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1OCBmYW5fbWFpbl9jdHJsOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IG1hbnVhbF9wd21fY3RsWzNdOyAgIC8qIG1hbnVhbCBQV00gdmFsdWUgc2V0IGJ5IHVzZXIgKi8KK307CisKKworc3RhdGljIGludCBpdDg3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGl0ODdfZmluZChpbnQgKmFkZHJlc3MpOworc3RhdGljIGludCBpdDg3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IGl0ODdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIGludCBpdDg3X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnaXN0ZXIpOworc3RhdGljIGludCBpdDg3X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZ2lzdGVyLAorCQkJdTggdmFsdWUpOworc3RhdGljIHN0cnVjdCBpdDg3X2RhdGEgKml0ODdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpdDg3X2NoZWNrX3B3bShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyB2b2lkIGl0ODdfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGl0ODdfZGF0YSAqZGF0YSk7CisKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGl0ODdfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiaXQ4NyIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9JVDg3LAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGl0ODdfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBpdDg3X2RldGFjaF9jbGllbnQsCit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbltucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFtucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fbWluW25yXSA9IElOX1RPX1JFRyh2YWwpOworCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19WSU5fTUlOKG5yKSwgCisJCQlkYXRhLT5pbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21heFtucl0gPSBJTl9UT19SRUcodmFsKTsKKwlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVklOX01BWChuciksIAorCQkJZGF0YS0+aW5fbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc2hvd19pbl9vZmZzZXQob2Zmc2V0KQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJXAorCXNob3dfaW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19pbiMjb2Zmc2V0LCBOVUxMKTsKKworI2RlZmluZSBsaW1pdF9pbl9vZmZzZXQob2Zmc2V0KQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJXAorCXNob3dfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJXAorCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9tYXgoZGV2LCBidWYsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2luX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7CQlcCit9CQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LAlcCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2luX21heChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7CQlcCit9CQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIAlcCisJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOwlcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIAlcCisJCXNob3dfaW4jI29mZnNldCMjX21heCwgc2V0X2luIyNvZmZzZXQjI19tYXgpOworCitzaG93X2luX29mZnNldCgwKTsKK2xpbWl0X2luX29mZnNldCgwKTsKK3Nob3dfaW5fb2Zmc2V0KDEpOworbGltaXRfaW5fb2Zmc2V0KDEpOworc2hvd19pbl9vZmZzZXQoMik7CitsaW1pdF9pbl9vZmZzZXQoMik7CitzaG93X2luX29mZnNldCgzKTsKK2xpbWl0X2luX29mZnNldCgzKTsKK3Nob3dfaW5fb2Zmc2V0KDQpOworbGltaXRfaW5fb2Zmc2V0KDQpOworc2hvd19pbl9vZmZzZXQoNSk7CitsaW1pdF9pbl9vZmZzZXQoNSk7CitzaG93X2luX29mZnNldCg2KTsKK2xpbWl0X2luX29mZnNldCg2KTsKK3Nob3dfaW5fb2Zmc2V0KDcpOworbGltaXRfaW5fb2Zmc2V0KDcpOworc2hvd19pbl9vZmZzZXQoOCk7CisKKy8qIDMgdGVtcGVyYXR1cmVzICovCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9oaWdoW25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpdDg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2xvd1tucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfaGlnaFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19URU1QX0hJR0gobnIpLCBkYXRhLT50ZW1wX2hpZ2hbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbG93W25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX1RFTVBfTE9XKG5yKSwgZGF0YS0+dGVtcF9sb3dbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKyNkZWZpbmUgc2hvd190ZW1wX29mZnNldChvZmZzZXQpCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXAoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfdGVtcF8jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXBfbWF4KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfdGVtcF8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXBfbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3RlbXBfbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3RlbXBfbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfIyNvZmZzZXQsIE5VTEwpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfdGVtcF8jI29mZnNldCMjX21heCwgc2V0X3RlbXBfIyNvZmZzZXQjI19tYXgpOyAJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAorCQlzaG93X3RlbXBfIyNvZmZzZXQjI19taW4sIHNldF90ZW1wXyMjb2Zmc2V0IyNfbWluKTsJCisKK3Nob3dfdGVtcF9vZmZzZXQoMSk7CitzaG93X3RlbXBfb2Zmc2V0KDIpOworc2hvd190ZW1wX29mZnNldCgzKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19zZW5zb3Ioc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJdTggcmVnID0gZGF0YS0+c2Vuc29yOyAvKiBJbiBjYXNlIHRoZSB2YWx1ZSBpcyB1cGRhdGVkIHdoaWxlIHdlIHVzZSBpdCAqLworCQorCWlmIChyZWcgJiAoMSA8PCBucikpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjNcbiIpOyAgLyogdGhlcm1hbCBkaW9kZSAqLworCWlmIChyZWcgJiAoOCA8PCBucikpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjJcbiIpOyAgLyogdGhlcm1pc3RvciAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjBcbiIpOyAgICAgIC8qIGRpc2FibGVkICovCit9CitzdGF0aWMgc3NpemVfdCBzZXRfc2Vuc29yKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlkYXRhLT5zZW5zb3IgJj0gfigxIDw8IG5yKTsKKwlkYXRhLT5zZW5zb3IgJj0gfig4IDw8IG5yKTsKKwkvKiAzID0gdGhlcm1hbCBkaW9kZTsgMiA9IHRoZXJtaXN0b3I7IDAgPSBkaXNhYmxlZCAqLworCWlmICh2YWwgPT0gMykKKwkgICAgZGF0YS0+c2Vuc29yIHw9IDEgPDwgbnI7CisJZWxzZSBpZiAodmFsID09IDIpCisJICAgIGRhdGEtPnNlbnNvciB8PSA4IDw8IG5yOworCWVsc2UgaWYgKHZhbCAhPSAwKSB7CisJCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVEVNUF9FTkFCTEUsIGRhdGEtPnNlbnNvcik7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisjZGVmaW5lIHNob3dfc2Vuc29yX29mZnNldChvZmZzZXQpCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3NlbnNvcl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfc2Vuc29yKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3NlbnNvcl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfc2Vuc29yKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI190eXBlLCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfc2Vuc29yXyMjb2Zmc2V0LCBzZXRfc2Vuc29yXyMjb2Zmc2V0KTsKKworc2hvd19zZW5zb3Jfb2Zmc2V0KDEpOworc2hvd19zZW5zb3Jfb2Zmc2V0KDIpOworc2hvd19zZW5zb3Jfb2Zmc2V0KDMpOworCisvKiAzIEZhbnMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bbnJdLCAKKwkJCQlESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwKKwkJRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIChkYXRhLT5mYW5fbWFpbl9jdHJsICYgKDEgPDwgbnIpKSA/IDEgOiAwKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGl0ODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIGRhdGEtPm1hbnVhbF9wd21fY3RsW25yXSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fTUlOKG5yKSwgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwlpbnQgaSwgbWluWzNdOworCXU4IG9sZDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlvbGQgPSBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fRElWKTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCW1pbltpXSA9IEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW2ldLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2RpdltpXSkpOworCisJc3dpdGNoIChucikgeworCWNhc2UgMDoKKwljYXNlIDE6CisJCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX1RPX1JFRyh2YWwpOworCQlicmVhazsKKwljYXNlIDI6CisJCWlmICh2YWwgPCA4KQorCQkJZGF0YS0+ZmFuX2Rpdltucl0gPSAxOworCQllbHNlCisJCQlkYXRhLT5mYW5fZGl2W25yXSA9IDM7CisJfQorCXZhbCA9IG9sZCAmIDB4ODA7CisJdmFsIHw9IChkYXRhLT5mYW5fZGl2WzBdICYgMHgwNyk7CisJdmFsIHw9IChkYXRhLT5mYW5fZGl2WzFdICYgMHgwNykgPDwgMzsKKwlpZiAoZGF0YS0+ZmFuX2RpdlsyXSA9PSAzKQorCQl2YWwgfD0gMHgxIDw8IDY7CisJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX0ZBTl9ESVYsIHZhbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWRhdGEtPmZhbl9taW5baV09RkFOX1RPX1JFRyhtaW5baV0sIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W2ldKSk7CisJCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fTUlOKGkpLCBkYXRhLT5mYW5fbWluW2ldKTsKKwl9CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodmFsID09IDApIHsKKwkJaW50IHRtcDsKKwkJLyogbWFrZSBzdXJlIHRoZSBmYW4gaXMgb24gd2hlbiBpbiBvbi9vZmYgbW9kZSAqLworCQl0bXAgPSBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fQ1RMKTsKKwkJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX0ZBTl9DVEwsIHRtcCB8ICgxIDw8IG5yKSk7CisJCS8qIHNldCBvbi9vZmYgbW9kZSAqLworCQlkYXRhLT5mYW5fbWFpbl9jdHJsICY9IH4oMSA8PCBucik7CisJCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fTUFJTl9DVFJMLCBkYXRhLT5mYW5fbWFpbl9jdHJsKTsKKwl9IGVsc2UgaWYgKHZhbCA9PSAxKSB7CisJCS8qIHNldCBTbWFydEd1YXJkaWFuIG1vZGUgKi8KKwkJZGF0YS0+ZmFuX21haW5fY3RybCB8PSAoMSA8PCBucik7CisJCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fTUFJTl9DVFJMLCBkYXRhLT5mYW5fbWFpbl9jdHJsKTsKKwkJLyogc2V0IHNhdmVkIHB3bSB2YWx1ZSwgY2xlYXIgRkFOX0NUTFggUFdNIG1vZGUgYml0ICovCisJCWl0ODdfd3JpdGVfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19QV00obnIpLCBQV01fVE9fUkVHKGRhdGEtPm1hbnVhbF9wd21fY3RsW25yXSkpOworCX0gZWxzZSB7CisJCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlpZiAodmFsIDwgMCB8fCB2YWwgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPm1hbnVhbF9wd21fY3RsW25yXSA9IHZhbDsKKwlpZiAoZGF0YS0+ZmFuX21haW5fY3RybCAmICgxIDw8IG5yKSkKKwkJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX1BXTShuciksIFBXTV9UT19SRUcoZGF0YS0+bWFudWFsX3B3bV9jdGxbbnJdKSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc2hvd19mYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2Zhbl9kaXYoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIAkJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9mYW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl8jI29mZnNldCwgTlVMTCk7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAorCQlzaG93X2Zhbl8jI29mZnNldCMjX21pbiwgc2V0X2Zhbl8jI29mZnNldCMjX21pbik7IAlcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd19mYW5fIyNvZmZzZXQjI19kaXYsIHNldF9mYW5fIyNvZmZzZXQjI19kaXYpOworCitzaG93X2Zhbl9vZmZzZXQoMSk7CitzaG93X2Zhbl9vZmZzZXQoMik7CitzaG93X2Zhbl9vZmZzZXQoMyk7CisKKyNkZWZpbmUgc2hvd19wd21fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bSMjb2Zmc2V0IyNfZW5hYmxlIChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJY2hhciAqYnVmKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3B3bV9lbmFibGUoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bSMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfcHdtKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20jI29mZnNldCMjX2VuYWJsZSAoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3B3bV9lbmFibGUoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfcHdtKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20jI29mZnNldCMjX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCXNob3dfcHdtIyNvZmZzZXQjI19lbmFibGUsCQkJCVwKKwkJc2V0X3B3bSMjb2Zmc2V0IyNfZW5hYmxlKTsJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwJCQlcCisJCXNob3dfcHdtIyNvZmZzZXQgLCBzZXRfcHdtIyNvZmZzZXQgKTsKKworc2hvd19wd21fb2Zmc2V0KDEpOworc2hvd19wd21fb2Zmc2V0KDIpOworc2hvd19wd21fb2Zmc2V0KDMpOworCisvKiBBbGFybXMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpdDg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBBTEFSTVNfRlJPTV9SRUcoZGF0YS0+YWxhcm1zKSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19hbGFybXMsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAorc2hvd192cm1fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpdDg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSBkYXRhLT52cm0pOworfQorc3RhdGljIHNzaXplX3QKK3N0b3JlX3ZybV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJZGF0YS0+dnJtID0gdmFsOworCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKHZybSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdnJtX3JlZywgc3RvcmVfdnJtX3JlZyk7CisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV92cm0oY2xpZW50KSBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdnJtKQorCitzdGF0aWMgc3NpemVfdAorc2hvd192aWRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpdDg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihjcHUwX3ZpZCwgU19JUlVHTywgc2hvd192aWRfcmVnLCBOVUxMKTsKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChjbGllbnQpIFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCkKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbjoKKyAgICAgKiBpdDg3X2RyaXZlciBpcyBpbnNlcnRlZCAod2hlbiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQpLCBmb3IgZWFjaAorICAgICAgIGF2YWlsYWJsZSBhZGFwdGVyCisgICAgICogd2hlbiBhIG5ldyBhZGFwdGVyIGlzIGluc2VydGVkIChhbmQgaXQ4N19kcml2ZXIgaXMgc3RpbGwgcHJlc2VudCkgKi8KK3N0YXRpYyBpbnQgaXQ4N19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBpdDg3X2RldGVjdCk7Cit9CisKKy8qIFN1cGVySU8gZGV0ZWN0aW9uIC0gd2lsbCBjaGFuZ2Ugbm9ybWFsX2lzYVswXSBpZiBhIGNoaXAgaXMgZm91bmQgKi8KK3N0YXRpYyBpbnQgaXQ4N19maW5kKGludCAqYWRkcmVzcykKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCXN1cGVyaW9fZW50ZXIoKTsKKwljaGlwX3R5cGUgPSBzdXBlcmlvX2ludyhERVZJRCk7CisJaWYgKGNoaXBfdHlwZSAhPSBJVDg3MTJGX0RFVklECisJICYmIGNoaXBfdHlwZSAhPSBJVDg3MDVGX0RFVklEKQorCSAJZ290byBleGl0OworCisJc3VwZXJpb19zZWxlY3QoKTsKKwlpZiAoIShzdXBlcmlvX2luYihJVDg3X0FDVF9SRUcpICYgMHgwMSkpIHsKKwkJcHJfaW5mbygiaXQ4NzogRGV2aWNlIG5vdCBhY3RpdmF0ZWQsIHNraXBwaW5nXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCSphZGRyZXNzID0gc3VwZXJpb19pbncoSVQ4N19CQVNFX1JFRykgJiB+KElUODdfRVhURU5UIC0gMSk7CisJaWYgKCphZGRyZXNzID09IDApIHsKKwkJcHJfaW5mbygiaXQ4NzogQmFzZSBhZGRyZXNzIG5vdCBzZXQsIHNraXBwaW5nXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCWVyciA9IDA7CisJcHJfaW5mbygiaXQ4NzogRm91bmQgSVQlMDR4RiBjaGlwIGF0IDB4JXgsIHJldmlzaW9uICVkXG4iLAorCQljaGlwX3R5cGUsICphZGRyZXNzLCBzdXBlcmlvX2luYihERVZSRVYpICYgMHgwZik7CisKK2V4aXQ6CisJc3VwZXJpb19leGl0KCk7CisJcmV0dXJuIGVycjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworaW50IGl0ODdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCWludCBpOworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9ICIiOworCWludCBpc19pc2EgPSBpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcik7CisJaW50IGVuYWJsZV9wd21faW50ZXJmYWNlOworCisJaWYgKCFpc19pc2EgJiYgCisJICAgICFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlnb3RvIEVSUk9SMDsKKworCS8qIFJlc2VydmUgdGhlIElTQSByZWdpb24gKi8KKwlpZiAoaXNfaXNhKQorCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIElUODdfRVhURU5ULCBpdDg3X2RyaXZlci5uYW1lKSkKKwkJCWdvdG8gRVJST1IwOworCisJLyogUHJvYmUgd2hldGhlciB0aGVyZSBpcyBhbnl0aGluZyBhdmFpbGFibGUgb24gdGhpcyBhZGRyZXNzLiBBbHJlYWR5CisJICAgZG9uZSBmb3IgU01CdXMgYW5kIFN1cGVyLUkvTyBjbGllbnRzICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmIChpc19pc2EgJiYgIWNoaXBfdHlwZSkgeworI2RlZmluZSBSRUFMTFlfU0xPV19JTworCQkJLyogV2UgbmVlZCB0aGUgdGltZW91dHMgZm9yIGF0IGxlYXN0IHNvbWUgSVQ4Ny1saWtlIGNoaXBzLiBCdXQgb25seQorCQkJICAgaWYgd2UgcmVhZCAndW5kZWZpbmVkJyByZWdpc3RlcnMuICovCisJCQlpID0gaW5iX3AoYWRkcmVzcyArIDEpOworCQkJaWYgKGluYl9wKGFkZHJlc3MgKyAyKSAhPSBpCisJCQkgfHwgaW5iX3AoYWRkcmVzcyArIDMpICE9IGkKKwkJCSB8fCBpbmJfcChhZGRyZXNzICsgNykgIT0gaSkgeworCQkgCQllcnIgPSAtRU5PREVWOworCQkJCWdvdG8gRVJST1IxOworCQkJfQorI3VuZGVmIFJFQUxMWV9TTE9XX0lPCisKKwkJCS8qIExldCdzIGp1c3QgaG9wZSBub3RoaW5nIGJyZWFrcyBoZXJlICovCisJCQlpID0gaW5iX3AoYWRkcmVzcyArIDUpICYgMHg3ZjsKKwkJCW91dGJfcCh+aSAmIDB4N2YsIGFkZHJlc3MgKyA1KTsKKwkJCWlmICgoaW5iX3AoYWRkcmVzcyArIDUpICYgMHg3ZikgIT0gKH5pICYgMHg3ZikpIHsKKwkJCQlvdXRiX3AoaSwgYWRkcmVzcyArIDUpOworCQkJCWVyciA9IC1FTk9ERVY7CisJCQkJZ290byBFUlJPUjE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGl0ODdfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpdDg3X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBFUlJPUjE7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGl0ODdfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaWYgKGlzX2lzYSkKKwkJaW5pdF9NVVRFWCgmZGF0YS0+bG9jayk7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZpdDg3X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLworCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmICgoaXQ4N19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIElUODdfUkVHX0NPTkZJRykgJiAweDgwKQorCQkgIHx8ICghaXNfaXNhCisJCSAgICYmIGl0ODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBJVDg3X1JFR19JMkNfQUREUikgIT0gYWRkcmVzcykpIHsKKwkJICAgCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIEVSUk9SMjsKKwkJfQorCX0KKworCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLworCWlmIChraW5kIDw9IDApIHsKKwkJaSA9IGl0ODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBJVDg3X1JFR19DSElQSUQpOworCQlpZiAoaSA9PSAweDkwKSB7CisJCQlraW5kID0gaXQ4NzsKKwkJCWlmICgoaXNfaXNhKSAmJiAoY2hpcF90eXBlID09IElUODcxMkZfREVWSUQpKQorCQkJCWtpbmQgPSBpdDg3MTI7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoa2luZCA9PSAwKQorCQkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsIAorCQkJCQkiSWdub3JpbmcgJ2ZvcmNlJyBwYXJhbWV0ZXIgZm9yIHVua25vd24gY2hpcCBhdCAiCisJCQkJCSJhZGFwdGVyICVkLCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCQkJaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGFkZHJlc3MpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gRVJST1IyOworCQl9CisJfQorCisJaWYgKGtpbmQgPT0gaXQ4NykgeworCQluYW1lID0gIml0ODciOworCX0gZWxzZSBpZiAoa2luZCA9PSBpdDg3MTIpIHsKKwkJbmFtZSA9ICJpdDg3MTIiOworCX0KKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnR5cGUgPSBraW5kOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gRVJST1IyOworCisJLyogQ2hlY2sgUFdNIGNvbmZpZ3VyYXRpb24gKi8KKwllbmFibGVfcHdtX2ludGVyZmFjZSA9IGl0ODdfY2hlY2tfcHdtKG5ld19jbGllbnQpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgSVQ4NyBjaGlwICovCisJaXQ4N19pbml0X2NsaWVudChuZXdfY2xpZW50LCBkYXRhKTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW43X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luN19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjdfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX3R5cGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfdHlwZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM190eXBlKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisJaWYgKGVuYWJsZV9wd21faW50ZXJmYWNlKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMV9lbmFibGUpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTJfZW5hYmxlKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20zX2VuYWJsZSk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMSk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMyk7CisJfQorCisJaWYgKGRhdGEtPnR5cGUgPT0gaXQ4NzEyKSB7CisJCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3ZybShuZXdfY2xpZW50KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChuZXdfY2xpZW50KTsKKwl9CisKKwlyZXR1cm4gMDsKKworRVJST1IyOgorCWtmcmVlKGRhdGEpOworRVJST1IxOgorCWlmIChpc19pc2EpCisJCXJlbGVhc2VfcmVnaW9uKGFkZHJlc3MsIElUODdfRVhURU5UKTsKK0VSUk9SMDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGl0ODdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZihpMmNfaXNfaXNhX2NsaWVudChjbGllbnQpKQorCQlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIElUODdfRVhURU5UKTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIFNNQnVzIGxvY2tzIGl0c2VsZiwgYnV0IElTQSBhY2Nlc3MgbXVzdCBiZSBsb2NrZWQgZXhwbGljaXRlbHkhIAorICAgV2UgZG9uJ3Qgd2FudCB0byBsb2NrIHRoZSB3aG9sZSBJU0EgYnVzLCBzbyB3ZSBsb2NrIGVhY2ggY2xpZW50CisgICBzZXBhcmF0ZWx5LgorICAgV2UgaWdub3JlIHRoZSBJVDg3IEJVU1kgZmxhZyBhdCB0aGlzIG1vbWVudCAtIGl0IGNvdWxkIGxlYWQgdG8gZGVhZGxvY2tzLAorICAgd291bGQgc2xvdyBkb3duIHRoZSBJVDg3IGFjY2VzcyBhbmQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkuICovCitzdGF0aWMgaW50IGl0ODdfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaW50IHJlczsKKwlpZiAoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkgeworCQlkb3duKCZkYXRhLT5sb2NrKTsKKwkJb3V0Yl9wKHJlZywgY2xpZW50LT5hZGRyICsgSVQ4N19BRERSX1JFR19PRkZTRVQpOworCQlyZXMgPSBpbmJfcChjbGllbnQtPmFkZHIgKyBJVDg3X0RBVEFfUkVHX09GRlNFVCk7CisJCXVwKCZkYXRhLT5sb2NrKTsKKwkJcmV0dXJuIHJlczsKKwl9IGVsc2UKKwkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7Cit9CisKKy8qIFRoZSBTTUJ1cyBsb2NrcyBpdHNlbGYsIGJ1dCBJU0EgYWNjZXNzIG11c2UgYmUgbG9ja2VkIGV4cGxpY2l0ZWx5ISAKKyAgIFdlIGRvbid0IHdhbnQgdG8gbG9jayB0aGUgd2hvbGUgSVNBIGJ1cywgc28gd2UgbG9jayBlYWNoIGNsaWVudAorICAgc2VwYXJhdGVseS4KKyAgIFdlIGlnbm9yZSB0aGUgSVQ4NyBCVVNZIGZsYWcgYXQgdGhpcyBtb21lbnQgLSBpdCBjb3VsZCBsZWFkIHRvIGRlYWRsb2NrcywKKyAgIHdvdWxkIHNsb3cgZG93biB0aGUgSVQ4NyBhY2Nlc3MgYW5kIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LiAqLworc3RhdGljIGludCBpdDg3X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpCit7CisJc3RydWN0IGl0ODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWYgKGkyY19pc19pc2FfY2xpZW50KGNsaWVudCkpIHsKKwkJZG93bigmZGF0YS0+bG9jayk7CisJCW91dGJfcChyZWcsIGNsaWVudC0+YWRkciArIElUODdfQUREUl9SRUdfT0ZGU0VUKTsKKwkJb3V0Yl9wKHZhbHVlLCBjbGllbnQtPmFkZHIgKyBJVDg3X0RBVEFfUkVHX09GRlNFVCk7CisJCXVwKCZkYXRhLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7Cit9CisKKy8qIFJldHVybiAxIGlmIGFuZCBvbmx5IGlmIHRoZSBQV00gaW50ZXJmYWNlIGlzIHNhZmUgdG8gdXNlICovCitzdGF0aWMgaW50IGl0ODdfY2hlY2tfcHdtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJLyogU29tZSBCSU9TZXMgZmFpbCB0byBjb3JyZWN0bHkgY29uZmlndXJlIHRoZSBJVDg3IGZhbnMuIEFsbCBmYW5zIG9mZgorCSAqIGFuZCBwb2xhcml0eSBzZXQgdG8gYWN0aXZlIGxvdyBpcyBzaWduIHRoYXQgdGhpcyBpcyB0aGUgY2FzZSBzbyB3ZQorCSAqIGRpc2FibGUgcHdtIGNvbnRyb2wgdG8gcHJvdGVjdCB0aGUgdXNlci4gKi8KKwlpbnQgdG1wID0gaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX0NUTCk7CisJaWYgKCh0bXAgJiAweDg3KSA9PSAwKSB7CisJCWlmIChmaXhfcHdtX3BvbGFyaXR5KSB7CisJCQkvKiBUaGUgdXNlciBhc2tzIHVzIHRvIGF0dGVtcHQgYSBjaGlwIHJlY29uZmlndXJhdGlvbi4KKwkJCSAqIFRoaXMgbWVhbnMgc3dpdGNoaW5nIHRvIGFjdGl2ZSBoaWdoIHBvbGFyaXR5IGFuZAorCQkJICogaW52ZXJ0aW5nIGFsbCBmYW4gc3BlZWQgdmFsdWVzLiAqLworCQkJaW50IGk7CisJCQl1OCBwd21bM107CisKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQkJcHdtW2ldID0gaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQkgSVQ4N19SRUdfUFdNKGkpKTsKKworCQkJLyogSWYgYW55IGZhbiBpcyBpbiBhdXRvbWF0aWMgcHdtIG1vZGUsIHRoZSBwb2xhcml0eQorCQkJICogbWlnaHQgYmUgY29ycmVjdCwgYXMgc3VzcGljaW91cyBhcyBpdCBzZWVtcywgc28gd2UKKwkJCSAqIGJldHRlciBkb24ndCBjaGFuZ2UgYW55dGhpbmcgKGJ1dCBzdGlsbCBkaXNhYmxlIHRoZQorCQkJICogUFdNIGludGVyZmFjZSkuICovCisJCQlpZiAoISgocHdtWzBdIHwgcHdtWzFdIHwgcHdtWzJdKSAmIDB4ODApKSB7CisJCQkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiUmVjb25maWd1cmluZyBQV00gdG8gIgorCQkJCQkgImFjdGl2ZSBoaWdoIHBvbGFyaXR5XG4iKTsKKwkJCQlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX0NUTCwKKwkJCQkJCSB0bXAgfCAweDg3KTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJCQlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQkgSVQ4N19SRUdfUFdNKGkpLAorCQkJCQkJCSAweDdmICYgfnB3bVtpXSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlBXTSBjb25maWd1cmF0aW9uIGlzICIKKwkJCQkgInRvbyBicm9rZW4gdG8gYmUgZml4ZWRcbiIpOworCQl9CisKKwkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiRGV0ZWN0ZWQgYnJva2VuIEJJT1MgIgorCQkJICJkZWZhdWx0cywgZGlzYWJsaW5nIFBXTSBpbnRlcmZhY2VcbiIpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGZpeF9wd21fcG9sYXJpdHkpIHsKKwkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiUFdNIGNvbmZpZ3VyYXRpb24gbG9va3MgIgorCQkJICJzYW5lLCB3b24ndCB0b3VjaFxuIik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIENhbGxlZCB3aGVuIHdlIGhhdmUgZm91bmQgYSBuZXcgSVQ4Ny4gKi8KK3N0YXRpYyB2b2lkIGl0ODdfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGl0ODdfZGF0YSAqZGF0YSkKK3sKKwlpbnQgdG1wLCBpOworCisJLyogaW5pdGlhbGl6ZSB0byBzYW5lIGRlZmF1bHRzOgorCSAqIC0gaWYgdGhlIGNoaXAgaXMgaW4gbWFudWFsIHB3bSBtb2RlLCB0aGlzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aAorCSAqICAgdGhlIGFjdHVhbCBzZXR0aW5ncyBvbiB0aGUgY2hpcCAoc28gaW4gdGhpcyBjYXNlLCBpbml0aWFsaXphdGlvbgorCSAqICAgaXMgbm90IG5lZWRlZCkKKwkgKiAtIGlmIGluIGF1dG9tYXRpYyBvciBvbi9vZmYgbW9kZSwgd2UgY291bGQgc3dpdGNoIHRvIG1hbnVhbCBtb2RlLAorCSAqICAgcmVhZCB0aGUgcmVnaXN0ZXJzIGFuZCBzZXQgbWFudWFsX3B3bV9jdGwgYWNjb3JkaW5nbHksIGJ1dCBjdXJyZW50bHkKKwkgKiAgIHRoaXMgaXMgbm90IGltcGxlbWVudGVkLCBzbyB3ZSBpbml0aWFsaXplIHRvIHNvbWV0aGluZyBzYW5lICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlkYXRhLT5tYW51YWxfcHdtX2N0bFtpXSA9IDB4ZmY7CisJfQorCisJLyogQ2hlY2sgaWYgdGVtcGVyYXR1cmUgY2hhbm5uZWxzIGFyZSByZXNldCBtYW51YWxseSBvciBieSBzb21lIHJlYXNvbiAqLworCXRtcCA9IGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX1RFTVBfRU5BQkxFKTsKKwlpZiAoKHRtcCAmIDB4M2YpID09IDApIHsKKwkJLyogVGVtcDEsVGVtcDM9dGhlcm1pc3RvcjsgVGVtcDI9dGhlcm1hbCBkaW9kZSAqLworCQl0bXAgPSAodG1wICYgMHhjMCkgfCAweDJhOworCQlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVEVNUF9FTkFCTEUsIHRtcCk7CisJfQorCWRhdGEtPnNlbnNvciA9IHRtcDsKKworCS8qIENoZWNrIGlmIHZvbHRhZ2UgbW9uaXRvcnMgYXJlIHJlc2V0IG1hbnVhbGx5IG9yIGJ5IHNvbWUgcmVhc29uICovCisJdG1wID0gaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVklOX0VOQUJMRSk7CisJaWYgKCh0bXAgJiAweGZmKSA9PSAwKSB7CisJCS8qIEVuYWJsZSBhbGwgdm9sdGFnZSBtb25pdG9ycyAqLworCQlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVklOX0VOQUJMRSwgMHhmZik7CisJfQorCisJLyogQ2hlY2sgaWYgdGFjaG9tZXRlcnMgYXJlIHJlc2V0IG1hbnVhbGx5IG9yIGJ5IHNvbWUgcmVhc29uICovCisJZGF0YS0+ZmFuX21haW5fY3RybCA9IGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX0ZBTl9NQUlOX0NUUkwpOworCWlmICgoZGF0YS0+ZmFuX21haW5fY3RybCAmIDB4NzApID09IDApIHsKKwkJLyogRW5hYmxlIGFsbCBmYW4gdGFjaG9tZXRlcnMgKi8KKwkJZGF0YS0+ZmFuX21haW5fY3RybCB8PSAweDcwOworCQlpdDg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX01BSU5fQ1RSTCwgZGF0YS0+ZmFuX21haW5fY3RybCk7CisJfQorCisJLyogU2V0IGN1cnJlbnQgZmFuIG1vZGUgcmVnaXN0ZXJzIGFuZCB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlCisJICogb3RoZXIgbW9kZSByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlmIChkYXRhLT5mYW5fbWFpbl9jdHJsICYgKDEgPDwgaSkpIHsKKwkJCS8qIHB3bSBtb2RlICovCisJCQl0bXAgPSBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19QV00oaSkpOworCQkJaWYgKHRtcCAmIDB4ODApIHsKKwkJCQkvKiBhdXRvbWF0aWMgcHdtIC0gbm90IHlldCBpbXBsZW1lbnRlZCwgYnV0CisJCQkJICogbGVhdmUgdGhlIHNldHRpbmdzIG1hZGUgYnkgdGhlIEJJT1MgYWxvbmUKKwkJCQkgKiB1bnRpbCBhIGNoYW5nZSBpcyByZXF1ZXN0ZWQgdmlhIHRoZSBzeXNmcworCQkJCSAqIGludGVyZmFjZSAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBtYW51YWwgcHdtICovCisJCQkJZGF0YS0+bWFudWFsX3B3bV9jdGxbaV0gPSBQV01fRlJPTV9SRUcodG1wKTsKKwkJCX0KKwkJfQorIAl9CisKKwkvKiBTdGFydCBtb25pdG9yaW5nICovCisJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX0NPTkZJRywKKwkJCSAoaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfQ09ORklHKSAmIDB4MzYpCisJCQkgfCAodXBkYXRlX3ZiYXQgPyAweDQxIDogMHgwMSkpOworfQorCitzdGF0aWMgc3RydWN0IGl0ODdfZGF0YSAqaXQ4N191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQorCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKKworCQlpZiAodXBkYXRlX3ZiYXQpIHsKKwkJCS8qIENsZWFyZWQgYWZ0ZXIgZWFjaCB1cGRhdGUsIHNvIHJlZW5hYmxlLiAgVmFsdWUKKwkJIAkgIHJldHVybmVkIGJ5IHRoaXMgcmVhZCB3aWxsIGJlIHByZXZpb3VzIHZhbHVlICovCQorCQkJaXQ4N193cml0ZV92YWx1ZShjbGllbnQsIElUODdfUkVHX0NPTkZJRywKKwkJCSAgIGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX0NPTkZJRykgfCAweDQwKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDw9IDc7IGkrKykgeworCQkJZGF0YS0+aW5baV0gPQorCQkJICAgIGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX1ZJTihpKSk7CisJCQlkYXRhLT5pbl9taW5baV0gPQorCQkJICAgIGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX1ZJTl9NSU4oaSkpOworCQkJZGF0YS0+aW5fbWF4W2ldID0KKwkJCSAgICBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19WSU5fTUFYKGkpKTsKKwkJfQorCQlkYXRhLT5pbls4XSA9CisJCSAgICBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19WSU4oOCkpOworCQkvKiBUZW1wZXJhdHVyZSBzZW5zb3IgZG9lc24ndCBoYXZlIGxpbWl0IHJlZ2lzdGVycywgc2V0CisJCSAgIHRvIG1pbiBhbmQgbWF4IHZhbHVlICovCisJCWRhdGEtPmluX21pbls4XSA9IDA7CisJCWRhdGEtPmluX21heFs4XSA9IDI1NTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlkYXRhLT5mYW5baV0gPQorCQkJICAgIGl0ODdfcmVhZF92YWx1ZShjbGllbnQsIElUODdfUkVHX0ZBTihpKSk7CisJCQlkYXRhLT5mYW5fbWluW2ldID0KKwkJCSAgICBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fTUlOKGkpKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlkYXRhLT50ZW1wW2ldID0KKwkJCSAgICBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19URU1QKGkpKTsKKwkJCWRhdGEtPnRlbXBfaGlnaFtpXSA9CisJCQkgICAgaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfVEVNUF9ISUdIKGkpKTsKKwkJCWRhdGEtPnRlbXBfbG93W2ldID0KKwkJCSAgICBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19URU1QX0xPVyhpKSk7CisJCX0KKworCQlpID0gaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfRkFOX0RJVik7CisJCWRhdGEtPmZhbl9kaXZbMF0gPSBpICYgMHgwNzsKKwkJZGF0YS0+ZmFuX2RpdlsxXSA9IChpID4+IDMpICYgMHgwNzsKKwkJZGF0YS0+ZmFuX2RpdlsyXSA9IChpICYgMHg0MCkgPyAzIDogMTsKKworCQlkYXRhLT5hbGFybXMgPQorCQkJaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfQUxBUk0xKSB8CisJCQkoaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfQUxBUk0yKSA8PCA4KSB8CisJCQkoaXQ4N19yZWFkX3ZhbHVlKGNsaWVudCwgSVQ4N19SRUdfQUxBUk0zKSA8PCAxNik7CisJCWRhdGEtPmZhbl9tYWluX2N0cmwgPSBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19GQU5fTUFJTl9DVFJMKTsKKworCQlkYXRhLT5zZW5zb3IgPSBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19URU1QX0VOQUJMRSk7CisJCS8qIFRoZSA4NzA1IGRvZXMgbm90IGhhdmUgVklEIGNhcGFiaWxpdHkgKi8KKwkJaWYgKGRhdGEtPnR5cGUgPT0gaXQ4NzEyKSB7CisJCQlkYXRhLT52aWQgPSBpdDg3X3JlYWRfdmFsdWUoY2xpZW50LCBJVDg3X1JFR19WSUQpOworCQkJZGF0YS0+dmlkICY9IDB4MWY7CisJCX0KKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc21faXQ4N19pbml0KHZvaWQpCit7CisJaW50IGFkZHI7CisKKwlpZiAoIWl0ODdfZmluZCgmYWRkcikpIHsKKwkJbm9ybWFsX2lzYVswXSA9IGFkZHI7CisJfQorCXJldHVybiBpMmNfYWRkX2RyaXZlcigmaXQ4N19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc21faXQ4N19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJml0ODdfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJDaHJpcyBHYXV0aHJvbiA8Y2hyaXNnQDAtaW4uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJVDg3MDVGLCBJVDg3MTJGLCBTaXM5NTAgZHJpdmVyIik7Cittb2R1bGVfcGFyYW0odXBkYXRlX3ZiYXQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyh1cGRhdGVfdmJhdCwgIlVwZGF0ZSB2YmF0IGlmIHNldCBlbHNlIHJldHVybiBwb3dlcnVwIHZhbHVlIik7Cittb2R1bGVfcGFyYW0oZml4X3B3bV9wb2xhcml0eSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZpeF9wd21fcG9sYXJpdHksICJGb3JjZSBQV00gcG9sYXJpdHkgdG8gYWN0aXZlIGhpZ2ggKERBTkdFUk9VUykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc21faXQ4N19pbml0KTsKK21vZHVsZV9leGl0KHNtX2l0ODdfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTYzLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjYzVhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtNjMuYwpAQCAtMCwwICsxLDU4MSBAQAorLyoKKyAqIGxtNjMuYyAtIGRyaXZlciBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE02MyB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAqICAgICAgICAgIHdpdGggaW50ZWdyYXRlZCBmYW4gY29udHJvbAorICogQ29weXJpZ2h0IChDKSAyMDA0ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqIEJhc2VkIG9uIHRoZSBsbTkwIGRyaXZlci4KKyAqCisgKiBUaGUgTE02MyBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTmF0aW9uYWwgU2VtaWNvbmR1Y3Rvci4gSXQgbWVhc3VyZXMKKyAqIHR3byB0ZW1wZXJhdHVyZXMgKGl0cyBvd24gYW5kIG9uZSBleHRlcm5hbCBvbmUpIGFuZCB0aGUgc3BlZWQgb2Ygb25lCisgKiBmYW4sIHRob3NlIHNwZWVkIGl0IGNhbiBhZGRpdGlvbmFsbHkgY29udHJvbC4gQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZQorICogb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNNjMuaHRtbAorICoKKyAqIFRoZSBMTTYzIGlzIGJhc2ljYWxseSBhbiBMTTg2IHdpdGggZmFuIHNwZWVkIG1vbml0b3JpbmcgYW5kIGNvbnRyb2wKKyAqIGNhcGFiaWxpdGllcyBhZGRlZC4gSXQgbWlzc2VzIHNvbWUgb2YgdGhlIExNODYgZmVhdHVyZXMgdGhvdWdoOgorICogIC0gTm8gbG93IGxpbWl0IGZvciBsb2NhbCB0ZW1wZXJhdHVyZS4KKyAqICAtIE5vIGNyaXRpY2FsIGxpbWl0IGZvciBsb2NhbCB0ZW1wZXJhdHVyZS4KKyAqICAtIENyaXRpY2FsIGxpbWl0IGZvciByZW1vdGUgdGVtcGVyYXR1cmUgY2FuIGJlIGNoYW5nZWQgb25seSBvbmNlLiBXZQorICogICAgd2lsbCBjb25zaWRlciB0aGF0IHRoZSBjcml0aWNhbCBsaW1pdCBpcyByZWFkLW9ubHkuCisgKgorICogVGhlIGRhdGFzaGVldCBpc24ndCB2ZXJ5IGNsZWFyIGFib3V0IHdoYXQgdGhlIHRhY2hvbWV0ZXIgcmVhZGluZyBpcy4KKyAqIEkgaGFkIGEgZXhwbGFuYXRpb24gZnJvbSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIHRob3VnaC4gVGhlIHR3byBsb3dlcgorICogYml0cyBvZiB0aGUgcmVhZCB2YWx1ZSBoYXZlIHRvIGJlIG1hc2tlZCBvdXQuIFRoZSB2YWx1ZSBpcyBzdGlsbCAxNiBiaXQKKyAqIGluIHdpZHRoLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKy8qCisgKiBBZGRyZXNzZXMgdG8gc2NhbgorICogQWRkcmVzcyBpcyBmdWxseSBkZWZpbmVkIGludGVybmFsbHkgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NGMsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qCisgKiBJbnNtb2QgcGFyYW1ldGVycworICovCisKK1NFTlNPUlNfSU5TTU9EXzEobG02Myk7CisKKy8qCisgKiBUaGUgTE02MyByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIExNNjNfUkVHX0NPTkZJRzEJCTB4MDMKKyNkZWZpbmUgTE02M19SRUdfQ09ORklHMgkJMHhCRgorI2RlZmluZSBMTTYzX1JFR19DT05GSUdfRkFOCQkweDRBCisKKyNkZWZpbmUgTE02M19SRUdfVEFDSF9DT1VOVF9NU0IJCTB4NDcKKyNkZWZpbmUgTE02M19SRUdfVEFDSF9DT1VOVF9MU0IJCTB4NDYKKyNkZWZpbmUgTE02M19SRUdfVEFDSF9MSU1JVF9NU0IJCTB4NDkKKyNkZWZpbmUgTE02M19SRUdfVEFDSF9MSU1JVF9MU0IJCTB4NDgKKworI2RlZmluZSBMTTYzX1JFR19QV01fVkFMVUUJCTB4NEMKKyNkZWZpbmUgTE02M19SRUdfUFdNX0ZSRVEJCTB4NEQKKworI2RlZmluZSBMTTYzX1JFR19MT0NBTF9URU1QCQkweDAwCisjZGVmaW5lIExNNjNfUkVHX0xPQ0FMX0hJR0gJCTB4MDUKKworI2RlZmluZSBMTTYzX1JFR19SRU1PVEVfVEVNUF9NU0IJMHgwMQorI2RlZmluZSBMTTYzX1JFR19SRU1PVEVfVEVNUF9MU0IJMHgxMAorI2RlZmluZSBMTTYzX1JFR19SRU1PVEVfT0ZGU0VUX01TQgkweDExCisjZGVmaW5lIExNNjNfUkVHX1JFTU9URV9PRkZTRVRfTFNCCTB4MTIKKyNkZWZpbmUgTE02M19SRUdfUkVNT1RFX0hJR0hfTVNCCTB4MDcKKyNkZWZpbmUgTE02M19SRUdfUkVNT1RFX0hJR0hfTFNCCTB4MTMKKyNkZWZpbmUgTE02M19SRUdfUkVNT1RFX0xPV19NU0IJCTB4MDgKKyNkZWZpbmUgTE02M19SRUdfUkVNT1RFX0xPV19MU0IJCTB4MTQKKyNkZWZpbmUgTE02M19SRUdfUkVNT1RFX1RDUklUCQkweDE5CisjZGVmaW5lIExNNjNfUkVHX1JFTU9URV9UQ1JJVF9IWVNUCTB4MjEKKworI2RlZmluZSBMTTYzX1JFR19BTEVSVF9TVEFUVVMJCTB4MDIKKyNkZWZpbmUgTE02M19SRUdfQUxFUlRfTUFTSwkJMHgxNgorCisjZGVmaW5lIExNNjNfUkVHX01BTl9JRAkJCTB4RkUKKyNkZWZpbmUgTE02M19SRUdfQ0hJUF9JRAkJMHhGRgorCisvKgorICogQ29udmVyc2lvbnMgYW5kIHZhcmlvdXMgbWFjcm9zCisgKiBGb3IgdGFjaG9tZXRlciBjb3VudHMsIHRoZSBMTTYzIHVzZXMgMTYtYml0IHZhbHVlcy4KKyAqIEZvciBsb2NhbCB0ZW1wZXJhdHVyZSBhbmQgaGlnaCBsaW1pdCwgcmVtb3RlIGNyaXRpY2FsIGxpbWl0IGFuZCBoeXN0ZXJlc2lzCisgKiB2YWx1ZSwgaXQgdXNlcyBzaWduZWQgOC1iaXQgdmFsdWVzIHdpdGggTFNCID0gMSBkZWdyZWUgQ2VsY2l1cy4KKyAqIEZvciByZW1vdGUgdGVtcGVyYXR1cmUsIGxvdyBhbmQgaGlnaCBsaW1pdHMsIGl0IHVzZXMgc2lnbmVkIDExLWJpdCB2YWx1ZXMKKyAqIHdpdGggTFNCID0gMC4xMjUgZGVncmVlIENlbGNpdXMsIGxlZnQtanVzdGlmaWVkIGluIDE2LWJpdCByZWdpc3RlcnMuCisgKi8KKworI2RlZmluZSBGQU5fRlJPTV9SRUcocmVnKQkoKHJlZykgPT0gMHhGRkZDIHx8IChyZWcpID09IDAgPyAwIDogXAorCQkJCSA1NDAwMDAwIC8gKHJlZykpCisjZGVmaW5lIEZBTl9UT19SRUcodmFsKQkJKCh2YWwpIDw9IDgyID8gMHhGRkZDIDogXAorCQkJCSAoNTQwMDAwMCAvICh2YWwpKSAmIDB4RkZGQykKKyNkZWZpbmUgVEVNUDhfRlJPTV9SRUcocmVnKQkoKHJlZykgKiAxMDAwKQorI2RlZmluZSBURU1QOF9UT19SRUcodmFsKQkoKHZhbCkgPD0gLTEyODAwMCA/IC0xMjggOiBcCisJCQkJICh2YWwpID49IDEyNzAwMCA/IDEyNyA6IFwKKwkJCQkgKHZhbCkgPCAwID8gKCh2YWwpIC0gNTAwKSAvIDEwMDAgOiBcCisJCQkJICgodmFsKSArIDUwMCkgLyAxMDAwKQorI2RlZmluZSBURU1QMTFfRlJPTV9SRUcocmVnKQkoKHJlZykgLyAzMiAqIDEyNSkKKyNkZWZpbmUgVEVNUDExX1RPX1JFRyh2YWwpCSgodmFsKSA8PSAtMTI4MDAwID8gMHg4MDAwIDogXAorCQkJCSAodmFsKSA+PSAxMjc4NzUgPyAweDdGRTAgOiBcCisJCQkJICh2YWwpIDwgMCA/ICgodmFsKSAtIDYyKSAvIDEyNSAqIDMyIDogXAorCQkJCSAoKHZhbCkgKyA2MikgLyAxMjUgKiAzMikKKyNkZWZpbmUgSFlTVF9UT19SRUcodmFsKQkoKHZhbCkgPD0gMCA/IDAgOiBcCisJCQkJICh2YWwpID49IDEyNzAwMCA/IDEyNyA6IFwKKwkJCQkgKCh2YWwpICsgNTAwKSAvIDEwMDApCisKKy8qCisgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworCitzdGF0aWMgaW50IGxtNjNfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgbG02M19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgc3RydWN0IGxtNjNfZGF0YSAqbG02M191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgbG02M19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIHZvaWQgbG02M19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworLyoKKyAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCisgKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtNjNfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibG02MyIsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gbG02M19hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGxtNjNfZGV0YWNoX2NsaWVudCwKK307CisKKy8qCisgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQorICovCisKK3N0cnVjdCBsbTYzX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLworCisJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLworCXU4IGNvbmZpZywgY29uZmlnX2ZhbjsKKwl1MTYgZmFuMV9pbnB1dDsKKwl1MTYgZmFuMV9sb3c7CisJdTggcHdtMV9mcmVxOworCXU4IHB3bTFfdmFsdWU7CisJczggdGVtcDFfaW5wdXQ7CisJczggdGVtcDFfaGlnaDsKKwlzMTYgdGVtcDJfaW5wdXQ7CisJczE2IHRlbXAyX2hpZ2g7CisJczE2IHRlbXAyX2xvdzsKKwlzOCB0ZW1wMl9jcml0OworCXU4IHRlbXAyX2NyaXRfaHlzdDsKKwl1OCBhbGFybXM7Cit9OworCisvKgorICogU3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zIGFuZCBmaWxlcworICovCisKKyNkZWZpbmUgc2hvd19mYW4odmFsdWUpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YSA9IGxtNjNfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT52YWx1ZSkpOyBcCit9CitzaG93X2ZhbihmYW4xX2lucHV0KTsKK3Nob3dfZmFuKGZhbjFfbG93KTsKKworc3RhdGljIHNzaXplX3Qgc2V0X2ZhbjFfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTYzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbjFfbG93ID0gRkFOX1RPX1JFRyh2YWwpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTYzX1JFR19UQUNIX0xJTUlUX0xTQiwKKwkJCQkgIGRhdGEtPmZhbjFfbG93ICYgMHhGRik7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNNjNfUkVHX1RBQ0hfTElNSVRfTVNCLAorCQkJCSAgZGF0YS0+ZmFuMV9sb3cgPj4gOCk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtMShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhID0gbG02M191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnB3bTFfdmFsdWUgPj0gMiAqIGRhdGEtPnB3bTFfZnJlcSA/CisJCSAgICAgICAyNTUgOiAoZGF0YS0+cHdtMV92YWx1ZSAqIDI1NSArIGRhdGEtPnB3bTFfZnJlcSkgLworCQkgICAgICAgKDIgKiBkYXRhLT5wd20xX2ZyZXEpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bTEoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTYzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwkKKwlpZiAoIShkYXRhLT5jb25maWdfZmFuICYgMHgyMCkpIC8qIHJlZ2lzdGVyIGlzIHJlYWQtb25seSAqLworCQlyZXR1cm4gLUVQRVJNOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bTFfdmFsdWUgPSB2YWwgPD0gMCA/IDAgOgorCQkJICAgdmFsID49IDI1NSA/IDIgKiBkYXRhLT5wd20xX2ZyZXEgOgorCQkJICAgKHZhbCAqIGRhdGEtPnB3bTFfZnJlcSAqIDIgKyAxMjcpIC8gMjU1OworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTYzX1JFR19QV01fVkFMVUUsIGRhdGEtPnB3bTFfdmFsdWUpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bTFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTYzX2RhdGEgKmRhdGEgPSBsbTYzX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+Y29uZmlnX2ZhbiAmIDB4MjAgPyAxIDogMik7Cit9CisKKyNkZWZpbmUgc2hvd190ZW1wOCh2YWx1ZSkgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhID0gbG02M191cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUDhfRlJPTV9SRUcoZGF0YS0+dmFsdWUpKTsgXAorfQorI2RlZmluZSBzaG93X3RlbXAxMSh2YWx1ZSkgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhID0gbG02M191cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUDExX0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7IFwKK30KK3Nob3dfdGVtcDgodGVtcDFfaW5wdXQpOworc2hvd190ZW1wOCh0ZW1wMV9oaWdoKTsKK3Nob3dfdGVtcDExKHRlbXAyX2lucHV0KTsKK3Nob3dfdGVtcDExKHRlbXAyX2hpZ2gpOworc2hvd190ZW1wMTEodGVtcDJfbG93KTsKK3Nob3dfdGVtcDgodGVtcDJfY3JpdCk7CisKKyNkZWZpbmUgc2V0X3RlbXA4KHZhbHVlLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPnZhbHVlID0gVEVNUDhfVE9fUkVHKHZhbCk7IFwKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCBkYXRhLT52YWx1ZSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CisjZGVmaW5lIHNldF90ZW1wMTEodmFsdWUsIHJlZ19tc2IsIHJlZ19sc2IpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPnZhbHVlID0gVEVNUDExX1RPX1JFRyh2YWwpOyBcCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ19tc2IsIGRhdGEtPnZhbHVlID4+IDgpOyBcCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ19sc2IsIGRhdGEtPnZhbHVlICYgMHhmZik7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CitzZXRfdGVtcDgodGVtcDFfaGlnaCwgTE02M19SRUdfTE9DQUxfSElHSCk7CitzZXRfdGVtcDExKHRlbXAyX2hpZ2gsIExNNjNfUkVHX1JFTU9URV9ISUdIX01TQiwgTE02M19SRUdfUkVNT1RFX0hJR0hfTFNCKTsKK3NldF90ZW1wMTEodGVtcDJfbG93LCBMTTYzX1JFR19SRU1PVEVfTE9XX01TQiwgTE02M19SRUdfUkVNT1RFX0xPV19MU0IpOworCisvKiBIeXN0ZXJlc2lzIHJlZ2lzdGVyIGhvbGRzIGEgcmVsYXRpdmUgdmFsdWUsIHdoaWxlIHdlIHdhbnQgdG8gcHJlc2VudAorICAgYW4gYWJzb2x1dGUgdG8gdXNlci1zcGFjZSAqLworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wMl9jcml0X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtNjNfZGF0YSAqZGF0YSA9IGxtNjNfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QOF9GUk9NX1JFRyhkYXRhLT50ZW1wMl9jcml0KQorCQkgICAgICAgLSBURU1QOF9GUk9NX1JFRyhkYXRhLT50ZW1wMl9jcml0X2h5c3QpKTsKK30KKworLyogQW5kIG5vdyB0aGUgb3RoZXIgd2F5IGFyb3VuZCwgdXNlci1zcGFjZSBwcm92aWRlcyBhbiBhYnNvbHV0ZQorICAgaHlzdGVyZXNpcyB2YWx1ZSBhbmQgd2UgaGF2ZSB0byBzdG9yZSBhIHJlbGF0aXZlIG9uZSAqLworc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAyX2NyaXRfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCWxvbmcgaHlzdDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwloeXN0ID0gVEVNUDhfRlJPTV9SRUcoZGF0YS0+dGVtcDJfY3JpdCkgLSB2YWw7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNNjNfUkVHX1JFTU9URV9UQ1JJVF9IWVNULAorCQkJCSAgSFlTVF9UT19SRUcoaHlzdCkpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhID0gbG02M191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbjFfaW5wdXQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW4xX2xvdywKKwlzZXRfZmFuMV9sb3cpOworCitzdGF0aWMgREVWSUNFX0FUVFIocHdtMSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfcHdtMSwgc2V0X3B3bTEpOworc3RhdGljIERFVklDRV9BVFRSKHB3bTFfZW5hYmxlLCBTX0lSVUdPLCBzaG93X3B3bTFfZW5hYmxlLCBOVUxMKTsKKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAxX2lucHV0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAxX2hpZ2gsCisJc2V0X3RlbXAxX2hpZ2gpOworCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcDJfaW5wdXQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDJfbG93LAorCXNldF90ZW1wMl9sb3cpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDJfaGlnaCwKKwlzZXRfdGVtcDJfaGlnaCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JUlVHTywgc2hvd190ZW1wMl9jcml0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAyX2NyaXRfaHlzdCwKKwlzZXRfdGVtcDJfY3JpdF9oeXN0KTsKKworc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOworCisvKgorICogUmVhbCBjb2RlCisgKi8KKworc3RhdGljIGludCBsbTYzX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtNjNfZGV0ZWN0KTsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gZG9lcyBtb3JlIHRoYW4ganVzdCBkZXRlY3Rpb24uIElmIGRldGVjdGlvbgorICogc3VjY2VlZHMsIGl0IGFsc28gcmVnaXN0ZXJzIHRoZSBuZXcgY2hpcC4KKyAqLworc3RhdGljIGludCBsbTYzX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxtNjNfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGxtNjNfZGF0YSkpOworCisJLyogVGhlIGNvbW1vbiBJMkMgY2xpZW50IGRhdGEgaXMgcGxhY2VkIHJpZ2h0IGJlZm9yZSB0aGUKKwkgICBMTTYzLXNwZWNpZmljIGRhdGEuICovCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZsbTYzX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBEZWZhdWx0IHRvIGFuIExNNjMgaWYgZm9yY2VkICovCisJaWYgKGtpbmQgPT0gMCkKKwkJa2luZCA9IGxtNjM7CisKKwlpZiAoa2luZCA8IDApIHsgLyogbXVzdCBpZGVudGlmeSAqLworCQl1OCBtYW5faWQsIGNoaXBfaWQsIHJlZ19jb25maWcxLCByZWdfY29uZmlnMjsKKwkJdTggcmVnX2FsZXJ0X3N0YXR1cywgcmVnX2FsZXJ0X21hc2s7CisKKwkJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkgTE02M19SRUdfTUFOX0lEKTsKKwkJY2hpcF9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJICBMTTYzX1JFR19DSElQX0lEKTsKKwkJcmVnX2NvbmZpZzEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCSAgICAgIExNNjNfUkVHX0NPTkZJRzEpOworCQlyZWdfY29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJICAgICAgTE02M19SRUdfQ09ORklHMik7CisJCXJlZ19hbGVydF9zdGF0dXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCQkgICBMTTYzX1JFR19BTEVSVF9TVEFUVVMpOworCQlyZWdfYWxlcnRfbWFzayA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJCSBMTTYzX1JFR19BTEVSVF9NQVNLKTsKKworCQlpZiAobWFuX2lkID09IDB4MDEgLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAqLworCQkgJiYgY2hpcF9pZCA9PSAweDQxIC8qIExNNjMgKi8KKwkJICYmIChyZWdfY29uZmlnMSAmIDB4MTgpID09IDB4MDAKKwkJICYmIChyZWdfY29uZmlnMiAmIDB4RjgpID09IDB4MDAKKwkJICYmIChyZWdfYWxlcnRfc3RhdHVzICYgMHgyMCkgPT0gMHgwMAorCQkgJiYgKHJlZ19hbGVydF9tYXNrICYgMHhBNCkgPT0gMHhBNCkgeworCQkJa2luZCA9IGxtNjM7CisJCX0gZWxzZSB7IC8qIGZhaWxlZCAqLworCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiVW5zdXBwb3J0ZWQgY2hpcCAiCisJCQkJIihtYW5faWQ9MHglMDJYLCBjaGlwX2lkPTB4JTAyWCkuXG4iLAorCQkJCW1hbl9pZCwgY2hpcF9pZCk7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCX0KKworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImxtNjMiLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCS8qIEluaXRpYWxpemUgdGhlIExNNjMgY2hpcCAqLworCWxtNjNfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWlmIChkYXRhLT5jb25maWcgJiAweDA0KSB7IC8qIHRhY2hvbWV0ZXIgZW5hYmxlZCAqLworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwl9CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTFfZW5hYmxlKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfY3JpdF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCisvKiBJZGVhbHkgd2Ugc2hvdWxkbid0IGhhdmUgdG8gaW5pdGlhbGl6ZSBhbnl0aGluZywgc2luY2UgdGhlIEJJT1MKKyAgIHNob3VsZCBoYXZlIHRha2VuIGNhcmUgb2YgZXZlcnl0aGluZyAqLworc3RhdGljIHZvaWQgbG02M19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBsbTYzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRhdGEtPmNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNNjNfUkVHX0NPTkZJRzEpOworCWRhdGEtPmNvbmZpZ19mYW4gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJICAgIExNNjNfUkVHX0NPTkZJR19GQU4pOworCisJLyogU3RhcnQgY29udmVydGluZyBpZiBuZWVkZWQgKi8KKwlpZiAoZGF0YS0+Y29uZmlnICYgMHg0MCkgeyAvKiBzdGFuZGJ5ICovCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3dpdGNoaW5nIHRvIG9wZXJhdGlvbmFsIG1vZGUiKTsKKwkJZGF0YS0+Y29uZmlnICY9IDB4QTc7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTYzX1JFR19DT05GSUcxLAorCQkJCQkgIGRhdGEtPmNvbmZpZyk7CisJfQorCisJLyogV2UgbWF5IG5lZWQgcHdtMV9mcmVxIGJlZm9yZSBldmVyIHVwZGF0aW5nIHRoZSBjbGllbnQgZGF0YSAqLworCWRhdGEtPnB3bTFfZnJlcSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNNjNfUkVHX1BXTV9GUkVRKTsKKwlpZiAoZGF0YS0+cHdtMV9mcmVxID09IDApCisJCWRhdGEtPnB3bTFfZnJlcSA9IDE7CisKKwkvKiBTaG93IHNvbWUgZGVidWcgaW5mbyBhYm91dCB0aGUgTE02MyBjb25maWd1cmF0aW9uICovCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJBbGVydC90YWNoIHBpbiBjb25maWd1cmVkIGZvciAlc1xuIiwKKwkJKGRhdGEtPmNvbmZpZyAmIDB4MDQpID8gInRhY2hvbWV0ZXIgaW5wdXQiIDoKKwkJImFsZXJ0IG91dHB1dCIpOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUFdNIGNsb2NrICVzIGtIeiwgb3V0cHV0IGZyZXF1ZW5jeSAldSBIelxuIiwKKwkJKGRhdGEtPmNvbmZpZ19mYW4gJiAweDA4KSA/ICIxLjQiIDogIjM2MCIsCisJCSgoZGF0YS0+Y29uZmlnX2ZhbiAmIDB4MDgpID8gNzAwIDogMTgwMDAwKSAvIGRhdGEtPnB3bTFfZnJlcSk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJQV00gb3V0cHV0IGFjdGl2ZSAlcywgJXMgbW9kZVxuIiwKKwkJKGRhdGEtPmNvbmZpZ19mYW4gJiAweDEwKSA/ICJsb3ciIDogImhpZ2giLAorCQkoZGF0YS0+Y29uZmlnX2ZhbiAmIDB4MjApID8gIm1hbnVhbCIgOiAiYXV0byIpOworfQorCitzdGF0aWMgaW50IGxtNjNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBsbTYzX2RhdGEgKmxtNjNfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG02M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWlmIChkYXRhLT5jb25maWcgJiAweDA0KSB7IC8qIHRhY2hvbWV0ZXIgZW5hYmxlZCAgKi8KKwkJCS8qIG9yZGVyIG1hdHRlcnMgZm9yIGZhbjFfaW5wdXQgKi8KKwkJCWRhdGEtPmZhbjFfaW5wdXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgICBMTTYzX1JFR19UQUNIX0NPVU5UX0xTQikgJiAweEZDOworCQkJZGF0YS0+ZmFuMV9pbnB1dCB8PSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgICAgTE02M19SRUdfVEFDSF9DT1VOVF9NU0IpIDw8IDg7CisJCQlkYXRhLT5mYW4xX2xvdyA9IChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgIExNNjNfUkVHX1RBQ0hfTElNSVRfTFNCKSAmIDB4RkMpCisJCQkJICAgICAgIHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCSAgTE02M19SRUdfVEFDSF9MSU1JVF9NU0IpIDw8IDgpOworCQl9CisKKwkJZGF0YS0+cHdtMV9mcmVxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgIExNNjNfUkVHX1BXTV9GUkVRKTsKKwkJaWYgKGRhdGEtPnB3bTFfZnJlcSA9PSAwKQorCQkJZGF0YS0+cHdtMV9mcmVxID0gMTsKKwkJZGF0YS0+cHdtMV92YWx1ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgTE02M19SRUdfUFdNX1ZBTFVFKTsKKworCQlkYXRhLT50ZW1wMV9pbnB1dCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgIExNNjNfUkVHX0xPQ0FMX1RFTVApOworCQlkYXRhLT50ZW1wMV9oaWdoID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgICBMTTYzX1JFR19MT0NBTF9ISUdIKTsKKworCQkvKiBvcmRlciBtYXR0ZXJzIGZvciB0ZW1wMl9pbnB1dCAqLworCQlkYXRhLT50ZW1wMl9pbnB1dCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgIExNNjNfUkVHX1JFTU9URV9URU1QX01TQikgPDwgODsKKwkJZGF0YS0+dGVtcDJfaW5wdXQgfD0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgICAgIExNNjNfUkVHX1JFTU9URV9URU1QX0xTQik7CisJCWRhdGEtPnRlbXAyX2hpZ2ggPSAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgICBMTTYzX1JFR19SRU1PVEVfSElHSF9NU0IpIDw8IDgpCisJCQkJIHwgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgICBMTTYzX1JFR19SRU1PVEVfSElHSF9MU0IpOworCQlkYXRhLT50ZW1wMl9sb3cgPSAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgIExNNjNfUkVHX1JFTU9URV9MT1dfTVNCKSA8PCA4KQorCQkJCXwgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgIExNNjNfUkVHX1JFTU9URV9MT1dfTFNCKTsKKwkJZGF0YS0+dGVtcDJfY3JpdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgTE02M19SRUdfUkVNT1RFX1RDUklUKTsKKwkJZGF0YS0+dGVtcDJfY3JpdF9oeXN0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJTE02M19SRUdfUkVNT1RFX1RDUklUX0hZU1QpOworCisJCWRhdGEtPmFsYXJtcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkgICAgICAgTE02M19SRUdfQUxFUlRfU1RBVFVTKSAmIDB4N0Y7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19sbTYzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmxtNjNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfbG02M19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmxtNjNfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxNNjMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfbG02M19pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfbG02M19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzUuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTg2Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbG03NS5jCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICAgIGxtNzUuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgImxtNzUuaCIKKworCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywKKwkJCQkJMHg0ZCwgMHg0ZSwgMHg0ZiwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzEobG03NSk7CisKKy8qIE1hbnkgTE03NSBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCisKKy8qIFRoZSBMTTc1IHJlZ2lzdGVycyAqLworI2RlZmluZSBMTTc1X1JFR19URU1QCQkweDAwCisjZGVmaW5lIExNNzVfUkVHX0NPTkYJCTB4MDEKKyNkZWZpbmUgTE03NV9SRUdfVEVNUF9IWVNUCTB4MDIKKyNkZWZpbmUgTE03NV9SRUdfVEVNUF9PUwkweDAzCisKKy8qIEVhY2ggY2xpZW50IGhhcyB0aGlzIGFkZGl0aW9uYWwgZGF0YSAqLworc3RydWN0IGxtNzVfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQJY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUJdXBkYXRlX2xvY2s7CisJY2hhcgkJCXZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZwkJbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisJdTE2CQkJdGVtcF9pbnB1dDsJLyogUmVnaXN0ZXIgdmFsdWVzICovCisJdTE2CQkJdGVtcF9tYXg7CisJdTE2CQkJdGVtcF9oeXN0OworfTsKKworc3RhdGljIGludCBsbTc1X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGxtNzVfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIGxtNzVfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgaW50IGxtNzVfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgbG03NV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7CitzdGF0aWMgaW50IGxtNzVfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpOworc3RhdGljIHN0cnVjdCBsbTc1X2RhdGEgKmxtNzVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisKKy8qIFRoaXMgaXMgdGhlIGRyaXZlciB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTc1X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImxtNzUiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfTE03NSwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBsbTc1X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gbG03NV9kZXRhY2hfY2xpZW50LAorfTsKKworI2RlZmluZSBzaG93KHZhbHVlKQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBsbTc1X2RhdGEgKmRhdGEgPSBsbTc1X3VwZGF0ZV9kZXZpY2UoZGV2KTsJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgTE03NV9URU1QX0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7CVwKK30KK3Nob3codGVtcF9tYXgpOworc2hvdyh0ZW1wX2h5c3QpOworc2hvdyh0ZW1wX2lucHV0KTsKKworI2RlZmluZSBzZXQodmFsdWUsIHJlZykJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CQlcCisJc3RydWN0IGxtNzVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCVwKKwkJCQkJCQkJXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsJCQkJXAorCWRhdGEtPnZhbHVlID0gTE03NV9URU1QX1RPX1JFRyh0ZW1wKTsJCQlcCisJbG03NV93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOwkJXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCVwKK30KK3NldCh0ZW1wX21heCwgTE03NV9SRUdfVEVNUF9PUyk7CitzZXQodGVtcF9oeXN0LCBMTTc1X1JFR19URU1QX0hZU1QpOworCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX21heCwgc2V0X3RlbXBfbWF4KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXhfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9oeXN0LCBzZXRfdGVtcF9oeXN0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX2lucHV0LCBOVUxMKTsKKworc3RhdGljIGludCBsbTc1X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtNzVfZGV0ZWN0KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworc3RhdGljIGludCBsbTc1X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgbG03NV9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmVuJ3QgcHJvYmluZyB0aGUgSVNBIGJ1cyEhIFRoaXMgaXMganVzdCBhIHNhZmV0eSBjaGVjaworCSAgIGF0IHRoaXMgbW9tZW50OyBpMmNfZGV0ZWN0IHJlYWxseSB3b24ndCBjYWxsIHVzLiAqLworI2lmZGVmIERFQlVHCisJaWYgKGkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkgeworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkibG03NV9kZXRlY3QgY2FsbGVkIGZvciBhbiBJU0EgYnVzIGFkYXB0ZXI/IT9cbiIpOworCQlnb3RvIGV4aXQ7CisJfQorI2VuZGlmCisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGxtNzVfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG03NV9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbG03NV9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmxtNzVfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIFRoZXJlIGlzIG5vIGlkZW50aWZpY2F0aW9uLQorCSAgIGRlZGljYXRlZCByZWdpc3RlciBzbyB3ZSBoYXZlIHRvIHJlbHkgb24gc2V2ZXJhbCB0cmlja3M6CisJICAgdW51c2VkIGJpdHMsIHJlZ2lzdGVycyBjeWNsaW5nIG92ZXIgOC1hZGRyZXNzIGJvdW5kYXJpZXMsCisJICAgYWRkcmVzc2VzIDB4MDQtMHgwNyByZXR1cm5pbmcgdGhlIGxhc3QgcmVhZCB2YWx1ZS4KKwkgICBUaGUgY3ljbGluZyt1bnVzZWQgYWRkcmVzc2VzIGNvbWJpbmF0aW9uIGlzIG5vdCB0ZXN0ZWQsCisJICAgc2luY2UgaXQgd291bGQgc2lnbmlmaWNhbnRseSBzbG93IHRoZSBkZXRlY3Rpb24gZG93biBhbmQgd291bGQKKwkgICBoYXJkbHkgYWRkIGFueSB2YWx1ZS4gKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJaW50IGN1ciwgY29uZiwgaHlzdCwgb3M7CisKKwkJLyogVW51c2VkIGFkZHJlc3NlcyAqLworCQljdXIgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMCk7CisJCWNvbmYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMSk7CisJCWh5c3QgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMik7CisJCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNCkgIT0gaHlzdAorCQkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDUpICE9IGh5c3QKKwkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA2KSAhPSBoeXN0CisJCSB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNykgIT0gaHlzdCkKKwkJIAlnb3RvIGV4aXRfZnJlZTsKKwkJb3MgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMyk7CisJCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNCkgIT0gb3MKKwkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA1KSAhPSBvcworCQkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDYpICE9IG9zCisJCSB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNykgIT0gb3MpCisJCSAJZ290byBleGl0X2ZyZWU7CisKKwkJLyogVW51c2VkIGJpdHMgKi8KKwkJaWYgKGNvbmYgJiAweGUwKQorCQkgCWdvdG8gZXhpdF9mcmVlOworCisJCS8qIEFkZHJlc3NlcyBjeWNsaW5nICovCisJCWZvciAoaSA9IDg7IGkgPCAweGZmOyBpICs9IDgpCisJCQlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIGkgKyAxKSAhPSBjb25mCisJCQkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIGkgKyAyKSAhPSBoeXN0CisJCQkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIGkgKyAzKSAhPSBvcykKKwkJCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZSAtIG9ubHkgb25lIGtpbmQgc3VwcG9ydGVkISAqLworCWlmIChraW5kIDw9IDApCisJCWtpbmQgPSBsbTc1OworCisJaWYgKGtpbmQgPT0gbG03NSkgeworCQluYW1lID0gImxtNzUiOworCX0KKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgTE03NSBjaGlwICovCisJbG03NV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKwkKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKworCXJldHVybiAwOworCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbG03NV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEFsbCByZWdpc3RlcnMgYXJlIHdvcmQtc2l6ZWQsIGV4Y2VwdCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCisgICBMTTc1IHVzZXMgYSBoaWdoLWJ5dGUgZmlyc3QgY29udmVudGlvbiwgd2hpY2ggaXMgZXhhY3RseSBvcHBvc2l0ZSB0bworICAgdGhlIHVzdWFsIHByYWN0aWNlLiAqLworc3RhdGljIGludCBsbTc1X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCWlmIChyZWcgPT0gTE03NV9SRUdfQ09ORikKKwkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CisJZWxzZQorCQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOworfQorCisvKiBBbGwgcmVnaXN0ZXJzIGFyZSB3b3JkLXNpemVkLCBleGNlcHQgZm9yIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICAgTE03NSB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24sIHdoaWNoIGlzIGV4YWN0bHkgb3Bwb3NpdGUgdG8KKyAgIHRoZSB1c3VhbCBwcmFjdGljZS4gKi8KK3N0YXRpYyBpbnQgbG03NV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSkKK3sKKwlpZiAocmVnID09IExNNzVfUkVHX0NPTkYpCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CisJZWxzZQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbHVlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGxtNzVfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwkvKiBJbml0aWFsaXplIHRoZSBMTTc1IGNoaXAgKi8KKwlsbTc1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE03NV9SRUdfQ09ORiwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG03NV9kYXRhICpsbTc1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtNzVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGxtNzUgdXBkYXRlXG4iKTsKKworCQlkYXRhLT50ZW1wX2lucHV0ID0gbG03NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE03NV9SRUdfVEVNUCk7CisJCWRhdGEtPnRlbXBfbWF4ID0gbG03NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE03NV9SRUdfVEVNUF9PUyk7CisJCWRhdGEtPnRlbXBfaHlzdCA9IGxtNzVfcmVhZF92YWx1ZShjbGllbnQsIExNNzVfUkVHX1RFTVBfSFlTVCk7CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfbG03NV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZsbTc1X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2xtNzVfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsbTc1X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTE03NSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19sbTc1X2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc19sbTc1X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG03NS5oIGIvZHJpdmVycy9pMmMvY2hpcHMvbG03NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZTNmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTc1LmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAgICBsbTc1LmggLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKGMpIDIwMDMgTWFyayBNLiBIb2ZmbWFuIDxtaG9mZm1hbkBsaWdodGxpbmsuY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gY29kZSBmb3IgZW5jb2RpbmcvZGVjb2RpbmcgTE03NSB0eXBlCisgICAgdGVtcGVyYXR1cmUgcmVhZGluZ3MsIHdoaWNoIGFyZSBlbXVsYXRlZCBieSBtYW55IG9mIHRoZSBjaGlwcworICAgIHdlIHN1cHBvcnQuICBBcyB0aGUgdXNlciBpcyB1bmxpa2VseSB0byBsb2FkIG1vcmUgdGhhbiBvbmUgZHJpdmVyCisgICAgd2hpY2ggY29udGFpbnMgdGhpcyBjb2RlLCB3ZSBkb24ndCB3b3JyeSBhYm91dCB0aGUgd2FzdGVkIHNwYWNlLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworLyogc3RyYWlnaHQgZnJvbSB0aGUgZGF0YXNoZWV0ICovCisjZGVmaW5lIExNNzVfVEVNUF9NSU4gKC01NTAwMCkKKyNkZWZpbmUgTE03NV9URU1QX01BWCAxMjUwMDAKKworLyogVEVNUDogMC4wMDFDL2JpdCAoLTU1QyB0byArMTI1QykKKyAgIFJFRzogKDAuNUMvYml0LCB0d28ncyBjb21wbGVtZW50KSA8PCA3ICovCitzdGF0aWMgaW5saW5lIHUxNiBMTTc1X1RFTVBfVE9fUkVHKGludCB0ZW1wKQoreworCWludCBudGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgTE03NV9URU1QX01JTiwgTE03NV9URU1QX01BWCk7CisJbnRlbXAgKz0gKG50ZW1wPDAgPyAtMjUwIDogMjUwKTsKKwlyZXR1cm4gKHUxNikoKG50ZW1wIC8gNTAwKSA8PCA3KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgTE03NV9URU1QX0ZST01fUkVHKHUxNiByZWcpCit7CisJLyogdXNlIGludGVnZXIgZGl2aXNpb24gaW5zdGVhZCBvZiBlcXVpdmFsZW50IHJpZ2h0IHNoaWZ0IHRvCisJICAgZ3VhcmFudGVlIGFyaXRobWV0aWMgc2hpZnQgYW5kIHByZXNlcnZlIHRoZSBzaWduICovCisJcmV0dXJuICgoczE2KXJlZyAvIDEyOCkgKiA1MDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzcuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTZiN2EzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbG03Ny5jCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICAgIGxtNzcuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgbW9uaXRvcmluZworCisgICAgQ29weXJpZ2h0IChjKSAyMDA0ICBBbmRyYXMgQkFMSSA8ZHJld2llQGZyZWVtYWlsLmh1PgorCisgICAgSGVhdmlseSBiYXNlZCBvbiBsbTc1LmMgYnkgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPi4gIFRoZSBMTTc3CisgICAgaXMgYSB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIHRoZXJtYWwgd2luZG93IGNvbXBhcmF0b3Igd2l0aCAwLjUgZGVnCisgICAgcmVzb2x1dGlvbiBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3IuICBDb21wbGV0ZSBkYXRhc2hlZXQgY2FuIGJlCisgICAgb2J0YWluZWQgYXQgdGhlaXIgc2l0ZToKKyAgICAgICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTc3Lmh0bWwKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzEobG03Nyk7CisKKy8qIFRoZSBMTTc3IHJlZ2lzdGVycyAqLworI2RlZmluZSBMTTc3X1JFR19URU1QCQkweDAwCisjZGVmaW5lIExNNzdfUkVHX0NPTkYJCTB4MDEKKyNkZWZpbmUgTE03N19SRUdfVEVNUF9IWVNUCTB4MDIKKyNkZWZpbmUgTE03N19SRUdfVEVNUF9DUklUCTB4MDMKKyNkZWZpbmUgTE03N19SRUdfVEVNUF9NSU4JMHgwNAorI2RlZmluZSBMTTc3X1JFR19URU1QX01BWAkweDA1CisKKy8qIEVhY2ggY2xpZW50IGhhcyB0aGlzIGFkZGl0aW9uYWwgZGF0YSAqLworc3RydWN0IGxtNzdfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQJY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUJdXBkYXRlX2xvY2s7CisJY2hhcgkJCXZhbGlkOworCXVuc2lnbmVkIGxvbmcJCWxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCWludAkJCXRlbXBfaW5wdXQ7CS8qIFRlbXBlcmF0dXJlcyAqLworCWludAkJCXRlbXBfY3JpdDsKKwlpbnQJCQl0ZW1wX21pbjsKKwlpbnQJCQl0ZW1wX21heDsKKwlpbnQJCQl0ZW1wX2h5c3Q7CisJdTgJCQlhbGFybXM7Cit9OworCitzdGF0aWMgaW50IGxtNzdfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgbG03N19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIHZvaWQgbG03N19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgbG03N19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHUxNiBsbTc3X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKTsKK3N0YXRpYyBpbnQgbG03N193cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSk7CisKK3N0YXRpYyBzdHJ1Y3QgbG03N19kYXRhICpsbTc3X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG03N19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJsbTc3IiwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBsbTc3X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gbG03N19kZXRhY2hfY2xpZW50LAorfTsKKworLyogc3RyYWlnaHQgZnJvbSB0aGUgZGF0YXNoZWV0ICovCisjZGVmaW5lIExNNzdfVEVNUF9NSU4gKC01NTAwMCkKKyNkZWZpbmUgTE03N19URU1QX01BWCAxMjUwMDAKKworLyogSW4gdGhlIHRlbXBlcmF0dXJlIHJlZ2lzdGVycywgdGhlIGxvdyAzIGJpdHMgYXJlIG5vdCBwYXJ0IG9mIHRoZQorICAgdGVtcGVyYXR1cmUgdmFsdWVzOyB0aGV5IGFyZSB0aGUgc3RhdHVzIGJpdHMuICovCitzdGF0aWMgaW5saW5lIHUxNiBMTTc3X1RFTVBfVE9fUkVHKGludCB0ZW1wKQoreworCWludCBudGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgTE03N19URU1QX01JTiwgTE03N19URU1QX01BWCk7CisJcmV0dXJuICh1MTYpKChudGVtcCAvIDUwMCkgKiA4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgTE03N19URU1QX0ZST01fUkVHKHUxNiByZWcpCit7CisJcmV0dXJuICgoaW50KXJlZyAvIDgpICogNTAwOworfQorCisvKiBzeXNmcyBzdHVmZiAqLworCisvKiByZWFkIHJvdXRpbmVzIGZvciB0ZW1wZXJhdHVyZSBsaW1pdHMgKi8KKyNkZWZpbmUgc2hvdyh2YWx1ZSkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGxtNzdfZGF0YSAqZGF0YSA9IGxtNzdfdXBkYXRlX2RldmljZShkZXYpOwlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnZhbHVlKTsJCVwKK30KKworc2hvdyh0ZW1wX2lucHV0KTsKK3Nob3codGVtcF9jcml0KTsKK3Nob3codGVtcF9taW4pOworc2hvdyh0ZW1wX21heCk7CitzaG93KGFsYXJtcyk7CisKKy8qIHJlYWQgcm91dGluZXMgZm9yIGh5c3RlcmVzaXMgdmFsdWVzICovCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTc3X2RhdGEgKmRhdGEgPSBsbTc3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+dGVtcF9jcml0IC0gZGF0YS0+dGVtcF9oeXN0KTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW5faHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG03N19kYXRhICpkYXRhID0gbG03N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfbWluICsgZGF0YS0+dGVtcF9oeXN0KTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9tYXhfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG03N19kYXRhICpkYXRhID0gbG03N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfbWF4IC0gZGF0YS0+dGVtcF9oeXN0KTsKK30KKworLyogd3JpdGUgcm91dGluZXMgKi8KKyNkZWZpbmUgc2V0KHZhbHVlLCByZWcpCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQkJXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CQkJCVwKKwlzdHJ1Y3QgbG03N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CQkJXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJCVwKKwkJCQkJCQkJCQlcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwkJCQkJCVwKKwlkYXRhLT52YWx1ZSA9IHZhbDsJCQkJXAorCWxtNzdfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIExNNzdfVEVNUF9UT19SRUcoZGF0YS0+dmFsdWUpKTsJCVwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwkJCQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQkJXAorfQorCitzZXQodGVtcF9taW4sIExNNzdfUkVHX1RFTVBfTUlOKTsKK3NldCh0ZW1wX21heCwgTE03N19SRUdfVEVNUF9NQVgpOworCisvKiBoeXN0ZXJlc2lzIGlzIHN0b3JlZCBhcyBhIHJlbGF0aXZlIHZhbHVlIG9uIHRoZSBjaGlwLCBzbyBpdCBoYXMgdG8gYmUKKyAgIGNvbnZlcnRlZCBmaXJzdCAqLworc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG03N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX2h5c3QgPSBkYXRhLT50ZW1wX2NyaXQgLSB2YWw7CisJbG03N193cml0ZV92YWx1ZShjbGllbnQsIExNNzdfUkVHX1RFTVBfSFlTVCwKKwkJCSBMTTc3X1RFTVBfVE9fUkVHKGRhdGEtPnRlbXBfaHlzdCkpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisvKiBwcmVzZXJ2ZSBoeXN0ZXJlc2lzIHdoZW4gc2V0dGluZyBUX2NyaXQgKi8KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTc3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWludCBvbGRjcml0aHlzdDsKKwkKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJb2xkY3JpdGh5c3QgPSBkYXRhLT50ZW1wX2NyaXQgLSBkYXRhLT50ZW1wX2h5c3Q7CisJZGF0YS0+dGVtcF9jcml0ID0gdmFsOworCWRhdGEtPnRlbXBfaHlzdCA9IGRhdGEtPnRlbXBfY3JpdCAtIG9sZGNyaXRoeXN0OworCWxtNzdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTc3X1JFR19URU1QX0NSSVQsCisJCQkgTE03N19URU1QX1RPX1JFRyhkYXRhLT50ZW1wX2NyaXQpKTsKKwlsbTc3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE03N19SRUdfVEVNUF9IWVNULAorCQkJIExNNzdfVEVNUF9UT19SRUcoZGF0YS0+dGVtcF9oeXN0KSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywKKwkJICAgc2hvd190ZW1wX2lucHV0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJICAgc2hvd190ZW1wX2NyaXQsIHNldF90ZW1wX2NyaXQpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfdGVtcF9taW4sIHNldF90ZW1wX21pbik7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJICAgc2hvd190ZW1wX21heCwgc2V0X3RlbXBfbWF4KTsKKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfdGVtcF9jcml0X2h5c3QsIHNldF90ZW1wX2NyaXRfaHlzdCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWluX2h5c3QsIFNfSVJVR08sCisJCSAgIHNob3dfdGVtcF9taW5faHlzdCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4X2h5c3QsIFNfSVJVR08sCisJCSAgIHNob3dfdGVtcF9tYXhfaHlzdCwgTlVMTCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sCisJCSAgIHNob3dfYWxhcm1zLCBOVUxMKTsKKworc3RhdGljIGludCBsbTc3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtNzdfZGV0ZWN0KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworc3RhdGljIGludCBsbTc3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgbG03N19kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgbG03N197cmVhZCx3cml0ZX1fdmFsdWUuICovCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbTc3X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBsbTc3X2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmbG03N19kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogSGVyZSBjb21lcyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gIFNpbmNlIHRoZSBMTTc3IGhhcyBubworCSAgIHJlZ2lzdGVyIGRlZGljYXRlZCB0byBpZGVudGlmaWNhdGlvbiwgd2UgaGF2ZSB0byByZWx5IG9uIHRoZQorCSAgIGZvbGxvd2luZyB0cmlja3M6CisKKwkgICAxLiB0aGUgaGlnaCA0IGJpdHMgcmVwcmVzZW50IHRoZSBzaWduIGFuZCB0aHVzIHRoZXkgc2hvdWxkCisJICAgICAgYWx3YXlzIGJlIHRoZSBzYW1lCisJICAgMi4gdGhlIGhpZ2ggMyBiaXRzIGFyZSB1bnVzZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwkgICAzLiBhZGRyZXNzZXMgMHgwNiBhbmQgMHgwNyByZXR1cm4gdGhlIGxhc3QgcmVhZCB2YWx1ZQorCSAgIDQuIHJlZ2lzdGVycyBjeWNsaW5nIG92ZXIgOC1hZGRyZXNzIGJvdW5kYXJpZXMKKworCSAgIFdvcmQtc2l6ZWQgcmVnaXN0ZXJzIGFyZSBoaWdoLWJ5dGUgZmlyc3QuICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWludCBpLCBjdXIsIGNvbmYsIGh5c3QsIGNyaXQsIG1pbiwgbWF4OworCisJCS8qIGFkZHJlc3NlcyBjeWNsaW5nICovCisJCWN1ciA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCAwKTsKKwkJY29uZiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCAxKTsKKwkJaHlzdCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCAyKTsKKwkJY3JpdCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCAzKTsKKwkJbWluID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDQpOworCQltYXggPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNSk7CisJCWZvciAoaSA9IDg7IGkgPD0gMHhmZjsgaSArPSA4KQorCQkJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBpICsgMSkgIT0gY29uZgorCQkJICAgIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgMikgIT0gaHlzdAorCQkJICAgIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgMykgIT0gY3JpdAorCQkJICAgIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgNCkgIT0gbWluCisJCQkgICAgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIGkgKyA1KSAhPSBtYXgpCisJCQkJZ290byBleGl0X2ZyZWU7CisKKwkJLyogc2lnbiBiaXRzICovCisJCWlmICgoKGN1ciAmIDB4MDBmMCkgIT0gMHhmMCAmJiAoY3VyICYgMHgwMGYwKSAhPSAweDApCisJCSAgICB8fCAoKGh5c3QgJiAweDAwZjApICE9IDB4ZjAgJiYgKGh5c3QgJiAweDAwZjApICE9IDB4MCkKKwkJICAgIHx8ICgoY3JpdCAmIDB4MDBmMCkgIT0gMHhmMCAmJiAoY3JpdCAmIDB4MDBmMCkgIT0gMHgwKQorCQkgICAgfHwgKChtaW4gJiAweDAwZjApICE9IDB4ZjAgJiYgKG1pbiAmIDB4MDBmMCkgIT0gMHgwKQorCQkgICAgfHwgKChtYXggJiAweDAwZjApICE9IDB4ZjAgJiYgKG1heCAmIDB4MDBmMCkgIT0gMHgwKSkKKwkJCWdvdG8gZXhpdF9mcmVlOworCisJCS8qIHVudXNlZCBiaXRzICovCisJCWlmIChjb25mICYgMHhlMCkKKwkJCWdvdG8gZXhpdF9mcmVlOworCisJCS8qIDB4MDYgYW5kIDB4MDcgcmV0dXJuIHRoZSBsYXN0IHJlYWQgdmFsdWUgKi8KKwkJY3VyID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDApOworCQlpZiAoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDYpICE9IGN1cgorCQkgICAgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDcpICE9IGN1cikKKwkJCWdvdG8gZXhpdF9mcmVlOworCQloeXN0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDIpOworCQlpZiAoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDYpICE9IGh5c3QKKwkJICAgIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA3KSAhPSBoeXN0KQorCQkJZ290byBleGl0X2ZyZWU7CisJCW1pbiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA0KTsKKwkJaWYgKGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA2KSAhPSBtaW4KKwkJICAgIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA3KSAhPSBtaW4pCisJCQlnb3RvIGV4aXRfZnJlZTsKKworCX0KKworCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlIC0gb25seSBvbmUga2luZCBzdXBwb3J0ZWQhICovCisJaWYgKGtpbmQgPD0gMCkKKwkJa2luZCA9IGxtNzc7CisKKwlpZiAoa2luZCA9PSBsbTc3KSB7CisJCW5hbWUgPSAibG03NyI7CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpdCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBMTTc3IGNoaXAgKi8KKwlsbTc3X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWluX2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxtNzdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCisvKiBBbGwgcmVnaXN0ZXJzIGFyZSB3b3JkLXNpemVkLCBleGNlcHQgZm9yIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICAgVGhlIExNNzcgdXNlcyB0aGUgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24uICovCitzdGF0aWMgdTE2IGxtNzdfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJaWYgKHJlZyA9PSBMTTc3X1JFR19DT05GKQorCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwllbHNlCisJCXJldHVybiBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKSk7Cit9CisKK3N0YXRpYyBpbnQgbG03N193cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSkKK3sKKwlpZiAocmVnID09IExNNzdfUkVHX0NPTkYpCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CisJZWxzZQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbHVlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGxtNzdfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwkvKiBJbml0aWFsaXplIHRoZSBMTTc3IGNoaXAgLSB0dXJuIG9mZiBzaHV0ZG93biBtb2RlICovCisJaW50IGNvbmYgPSBsbTc3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTc3X1JFR19DT05GKTsKKwlpZiAoY29uZiAmIDEpCisJCWxtNzdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTc3X1JFR19DT05GLCBjb25mICYgMHhmZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG03N19kYXRhICpsbTc3X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtNzdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGxtNzcgdXBkYXRlXG4iKTsKKwkJZGF0YS0+dGVtcF9pbnB1dCA9CisJCQlMTTc3X1RFTVBfRlJPTV9SRUcobG03N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQkgICBMTTc3X1JFR19URU1QKSk7CisJCWRhdGEtPnRlbXBfaHlzdCA9CisJCQlMTTc3X1RFTVBfRlJPTV9SRUcobG03N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQkgICBMTTc3X1JFR19URU1QX0hZU1QpKTsKKwkJZGF0YS0+dGVtcF9jcml0ID0KKwkJCUxNNzdfVEVNUF9GUk9NX1JFRyhsbTc3X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJCSAgIExNNzdfUkVHX1RFTVBfQ1JJVCkpOworCQlkYXRhLT50ZW1wX21pbiA9CisJCQlMTTc3X1RFTVBfRlJPTV9SRUcobG03N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQkgICBMTTc3X1JFR19URU1QX01JTikpOworCQlkYXRhLT50ZW1wX21heCA9CisJCQlMTTc3X1RFTVBfRlJPTV9SRUcobG03N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQkgICBMTTc3X1JFR19URU1QX01BWCkpOworCQlkYXRhLT5hbGFybXMgPQorCQkJbG03N19yZWFkX3ZhbHVlKGNsaWVudCwgTE03N19SRUdfVEVNUCkgJiAweDAwMDc7CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfbG03N19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZsbTc3X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2xtNzdfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsbTc3X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkFuZHJhcyBCQUxJIDxkcmV3aWVAZnJlZW1haWwuaHU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxNNzcgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfbG03N19pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfbG03N19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzguYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDUyZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbG03OC5jCkBAIC0wLDAgKzEsNzk2IEBACisvKgorICAgIGxtNzguYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsCisJCQkJCTB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksCisJCQkJCTB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsCisJCQkJCTB4MmYsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMjkwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzMobG03OCwgbG03OGosIGxtNzkpOworCisvKiBNYW55IExNNzggY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLworCisvKiBMZW5ndGggb2YgSVNBIGFkZHJlc3Mgc2VnbWVudCAqLworI2RlZmluZSBMTTc4X0VYVEVOVCA4CisKKy8qIFdoZXJlIGFyZSB0aGUgSVNBIGFkZHJlc3MvZGF0YSByZWdpc3RlcnMgcmVsYXRpdmUgdG8gdGhlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTTc4X0FERFJfUkVHX09GRlNFVCA1CisjZGVmaW5lIExNNzhfREFUQV9SRUdfT0ZGU0VUIDYKKworLyogVGhlIExNNzggcmVnaXN0ZXJzICovCisjZGVmaW5lIExNNzhfUkVHX0lOX01BWChucikgKDB4MmIgKyAobnIpICogMikKKyNkZWZpbmUgTE03OF9SRUdfSU5fTUlOKG5yKSAoMHgyYyArIChucikgKiAyKQorI2RlZmluZSBMTTc4X1JFR19JTihucikgKDB4MjAgKyAobnIpKQorCisjZGVmaW5lIExNNzhfUkVHX0ZBTl9NSU4obnIpICgweDNiICsgKG5yKSkKKyNkZWZpbmUgTE03OF9SRUdfRkFOKG5yKSAoMHgyOCArIChucikpCisKKyNkZWZpbmUgTE03OF9SRUdfVEVNUCAweDI3CisjZGVmaW5lIExNNzhfUkVHX1RFTVBfT1ZFUiAweDM5CisjZGVmaW5lIExNNzhfUkVHX1RFTVBfSFlTVCAweDNhCisKKyNkZWZpbmUgTE03OF9SRUdfQUxBUk0xIDB4NDEKKyNkZWZpbmUgTE03OF9SRUdfQUxBUk0yIDB4NDIKKworI2RlZmluZSBMTTc4X1JFR19WSURfRkFORElWIDB4NDcKKworI2RlZmluZSBMTTc4X1JFR19DT05GSUcgMHg0MAorI2RlZmluZSBMTTc4X1JFR19DSElQSUQgMHg0OQorI2RlZmluZSBMTTc4X1JFR19JMkNfQUREUiAweDQ4CisKKworLyogQ29udmVyc2lvbnMuIFJvdW5kaW5nIGFuZCBsaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRyAKKyAgIHZhcmlhbnRzLiAqLworCisvKiBJTjogbVYsICgwViB0byA0LjA4VikKKyAgIFJFRzogMTZtVi9iaXQgKi8KK3N0YXRpYyBpbmxpbmUgdTggSU5fVE9fUkVHKHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgbnZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAwLCA0MDgwKTsKKwlyZXR1cm4gKG52YWwgKyA4KSAvIDE2OworfQorI2RlZmluZSBJTl9GUk9NX1JFRyh2YWwpICgodmFsKSAqICAxNikKKworc3RhdGljIGlubGluZSB1OCBGQU5fVE9fUkVHKGxvbmcgcnBtLCBpbnQgZGl2KQoreworCWlmIChycG0gPD0gMCkKKwkJcmV0dXJuIDI1NTsKKwlyZXR1cm4gU0VOU09SU19MSU1JVCgoMTM1MDAwMCArIHJwbSAqIGRpdiAvIDIpIC8gKHJwbSAqIGRpdiksIDEsIDI1NCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IEZBTl9GUk9NX1JFRyh1OCB2YWwsIGludCBkaXYpCit7CisJcmV0dXJuIHZhbD09MCA/IC0xIDogdmFsPT0yNTUgPyAwIDogMTM1MDAwMC8odmFsKmRpdik7Cit9CisKKy8qIFRFTVA6IG1DICgtMTI4QyB0byArMTI3QykKKyAgIFJFRzogMUMvYml0LCB0d28ncyBjb21wbGVtZW50ICovCitzdGF0aWMgaW5saW5lIHM4IFRFTVBfVE9fUkVHKGludCB2YWwpCit7CisJaW50IG52YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgLTEyODAwMCwgMTI3MDAwKSA7CisJcmV0dXJuIG52YWw8MCA/IChudmFsLTUwMCkvMTAwMCA6IChudmFsKzUwMCkvMTAwMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgVEVNUF9GUk9NX1JFRyhzOCB2YWwpCit7CisJcmV0dXJuIHZhbCAqIDEwMDA7Cit9CisKKy8qIFZJRDogbVYKKyAgIFJFRzogKHNlZSBkb2MvdmlkKSAqLworc3RhdGljIGlubGluZSBpbnQgVklEX0ZST01fUkVHKHU4IHZhbCkKK3sKKwlyZXR1cm4gdmFsPT0weDFmID8gMCA6IHZhbD49MHgxMCA/IDUxMDAtdmFsKjEwMCA6IDIwNTAtdmFsKjUwOworfQorCisjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQorCisvKiBUaGVyZSBhcmUgc29tZSBjb21wbGljYXRpb25zIGluIGEgbW9kdWxlIGxpa2UgdGhpcy4gRmlyc3Qgb2ZmLCBMTTc4IGNoaXBzCisgICBtYXkgYmUgYm90aCBwcmVzZW50IG9uIHRoZSBTTUJ1cyBhbmQgdGhlIElTQSBidXMsIGFuZCB3ZSBoYXZlIHRvIGhhbmRsZQorICAgdGhvc2UgY2FzZXMgc2VwYXJhdGVseSBhdCBzb21lIHBsYWNlcy4gU2Vjb25kLCB0aGVyZSBtaWdodCBiZSBzZXZlcmFsCisgICBMTTc4IGNoaXBzIGF2YWlsYWJsZSAod2VsbCwgYWN0dWFsbHksIHRoYXQgaXMgcHJvYmFibHkgbmV2ZXIgZG9uZTsgYnV0CisgICBpdCBpcyBhIGNsZWFuIGlsbHVzdHJhdGlvbiBvZiBob3cgdG8gaGFuZGxlIGEgY2FzZSBsaWtlIHRoYXQpLiBGaW5hbGx5LAorICAgYSBzcGVjaWZpYyBjaGlwIG1heSBiZSBhdHRhY2hlZCB0byAqYm90aCogSVNBIGFuZCBTTUJ1cywgYW5kIHdlIHdvdWxkCisgICBub3QgbGlrZSB0byBkZXRlY3QgaXQgZG91YmxlLiBGb3J0dW5hdGVseSwgaW4gdGhlIGNhc2Ugb2YgdGhlIExNNzggYXQKKyAgIGxlYXN0LCBhIHJlZ2lzdGVyIHRlbGxzIHVzIHdoYXQgU01CdXMgYWRkcmVzcyB3ZSBhcmUgb24sIHNvIHRoYXQgaGVscHMKKyAgIGEgYml0IC0gZXhjZXB0IGlmIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgU01CdXMuIEdyb2FuLiBObyBzb2x1dGlvbgorICAgZm9yIHRoaXMgeWV0LiAqLworCisvKiBUaGlzIG1vZHVsZSBtYXkgc2VlbSBvdmVybHkgbG9uZyBhbmQgY29tcGxpY2F0ZWQuIEluIGZhY3QsIGl0IGlzIG5vdCBzbworICAgYmFkLiBRdWl0ZSBhIGxvdCBvZiBib29ra2VlcGluZyBpcyBkb25lLiBBIHJlYWwgZHJpdmVyIGNhbiBvZnRlbiBjdXQKKyAgIHNvbWUgY29ybmVycy4gKi8KKworLyogRm9yIGVhY2ggcmVnaXN0ZXJlZCBMTTc4LCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBkYXRhIGluIG1lbW9yeS4gVGhhdAorICAgZGF0YSBpcyBwb2ludGVkIHRvIGJ5IGxtNzhfbGlzdFtOUl0tPmRhdGEuIFRoZSBzdHJ1Y3R1cmUgaXRzZWxmIGlzCisgICBkeW5hbWljYWxseSBhbGxvY2F0ZWQsIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBhIG5ldyBsbTc4IGNsaWVudCBpcworICAgYWxsb2NhdGVkLiAqLworc3RydWN0IGxtNzhfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwllbnVtIGNoaXBzIHR5cGU7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJdTggaW5bN107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21heFs3XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluWzddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9taW5bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXA7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfb3ZlcjsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9oeXN0OwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2WzNdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KKwl1OCB2aWQ7CQkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJdTE2IGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworfTsKKworCitzdGF0aWMgaW50IGxtNzhfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgbG03OF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCBsbTc4X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBpbnQgbG03OF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZ2lzdGVyKTsKK3N0YXRpYyBpbnQgbG03OF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3RlciwgdTggdmFsdWUpOworc3RhdGljIHN0cnVjdCBsbTc4X2RhdGEgKmxtNzhfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbG03OF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG03OF9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJsbTc4IiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX0xNNzgsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gbG03OF9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGxtNzhfZGV0YWNoX2NsaWVudCwKK307CisKKy8qIDcgVm9sdGFnZXMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gbG03OF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluW25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBsbTc4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWluW25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBsbTc4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21pbltucl0gPSBJTl9UT19SRUcodmFsKTsKKwlsbTc4X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfSU5fTUlOKG5yKSwgZGF0YS0+aW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fbWF4W25yXSA9IElOX1RPX1JFRyh2YWwpOworCWxtNzhfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19JTl9NQVgobnIpLCBkYXRhLT5pbl9tYXhbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKwkKKyNkZWZpbmUgc2hvd19pbl9vZmZzZXQob2Zmc2V0KQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJXAorCXNob3dfaW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgCQlcCisJCXNob3dfaW4jI29mZnNldCwgTlVMTCk7CQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCVwKKwlzaG93X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSAgIFwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJXAorCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICAgXAorewkJCQkJCQkJXAorCXJldHVybiBzaG93X2luX21heChkZXYsIGJ1Ziwgb2Zmc2V0KTsJCQlcCit9CQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LAlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2luX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7CQlcCit9CQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LAlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2luX21heChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7CQlcCit9CQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOwlcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCXNob3dfaW4jI29mZnNldCMjX21heCwgc2V0X2luIyNvZmZzZXQjI19tYXgpOworCitzaG93X2luX29mZnNldCgwKTsKK3Nob3dfaW5fb2Zmc2V0KDEpOworc2hvd19pbl9vZmZzZXQoMik7CitzaG93X2luX29mZnNldCgzKTsKK3Nob3dfaW5fb2Zmc2V0KDQpOworc2hvd19pbl9vZmZzZXQoNSk7CitzaG93X2luX29mZnNldCg2KTsKKworLyogVGVtcGVyYXR1cmUgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gbG03OF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcCkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfb3ZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gbG03OF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9vdmVyKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX292ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9vdmVyID0gVEVNUF9UT19SRUcodmFsKTsKKwlsbTc4X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfVEVNUF9PVkVSLCBkYXRhLT50ZW1wX292ZXIpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gbG03OF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9oeXN0KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9oeXN0ID0gVEVNUF9UT19SRUcodmFsKTsKKwlsbTc4X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfVEVNUF9IWVNULCBkYXRhLT50ZW1wX2h5c3QpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJc2hvd190ZW1wX292ZXIsIHNldF90ZW1wX292ZXIpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJc2hvd190ZW1wX2h5c3QsIHNldF90ZW1wX2h5c3QpOworCisvKiAzIEZhbnMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGxtNzhfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwKKwkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGxtNzhfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKKwkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKHZhbCwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJbG03OF93cml0ZV92YWx1ZShjbGllbnQsIExNNzhfUkVHX0ZBTl9NSU4obnIpLCBkYXRhLT5mYW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBsbTc4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSApOworfQorCisvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcworICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCisgICBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKKyAgIGJlY2F1c2UgdGhlIGRpdmlzb3IgY2hhbmdlZC4gKi8KK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJdW5zaWduZWQgbG9uZyBtaW47CisJdTggcmVnOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCW1pbiA9IEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKKwkJCSAgIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6IGRhdGEtPmZhbl9kaXZbbnJdID0gMDsgYnJlYWs7CisJY2FzZSAyOiBkYXRhLT5mYW5fZGl2W25yXSA9IDE7IGJyZWFrOworCWNhc2UgNDogZGF0YS0+ZmFuX2Rpdltucl0gPSAyOyBicmVhazsKKwljYXNlIDg6IGRhdGEtPmZhbl9kaXZbbnJdID0gMzsgYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYW5fZGl2IHZhbHVlICVsZCBub3QgIgorCQkJInN1cHBvcnRlZC4gQ2hvb3NlIG9uZSBvZiAxLCAyLCA0IG9yIDghXG4iLCB2YWwpOworCQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWcgPSBsbTc4X3JlYWRfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19WSURfRkFORElWKTsKKwlzd2l0Y2ggKG5yKSB7CisJY2FzZSAwOgorCQlyZWcgPSAocmVnICYgMHhjZikgfCAoZGF0YS0+ZmFuX2Rpdltucl0gPDwgNCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcmVnID0gKHJlZyAmIDB4M2YpIHwgKGRhdGEtPmZhbl9kaXZbbnJdIDw8IDYpOworCQlicmVhazsKKwl9CisJbG03OF93cml0ZV92YWx1ZShjbGllbnQsIExNNzhfUkVHX1ZJRF9GQU5ESVYsIHJlZyk7CisKKwlkYXRhLT5mYW5fbWluW25yXSA9CisJCUZBTl9UT19SRUcobWluLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwlsbTc4X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfRkFOX01JTihuciksIGRhdGEtPmZhbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHNob3dfZmFuX29mZnNldChvZmZzZXQpCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICBcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpICBcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2Zhbl9kaXYoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl8jI29mZnNldCwgTlVMTCk7XAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKKwkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOworCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXzFfZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHNldF9mYW5fZGl2KGRldiwgYnVmLCBjb3VudCwgMCkgOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXzJfZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHNldF9mYW5fZGl2KGRldiwgYnVmLCBjb3VudCwgMSkgOworfQorCitzaG93X2Zhbl9vZmZzZXQoMSk7CitzaG93X2Zhbl9vZmZzZXQoMik7CitzaG93X2Zhbl9vZmZzZXQoMyk7CisKKy8qIEZhbiAzIGRpdmlzb3IgaXMgbG9ja2VkIGluIEgvVyAqLworc3RhdGljIERFVklDRV9BVFRSKGZhbjFfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJc2hvd19mYW5fMV9kaXYsIHNldF9mYW5fMV9kaXYpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjJfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJc2hvd19mYW5fMl9kaXYsIHNldF9mYW5fMl9kaXYpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjNfZGl2LCBTX0lSVUdPLCBzaG93X2Zhbl8zX2RpdiwgTlVMTCk7CisKKy8qIFZJRCAqLworc3RhdGljIHNzaXplX3Qgc2hvd192aWQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGxtNzhfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBWSURfRlJPTV9SRUcoZGF0YS0+dmlkKSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfdmlkLCBOVUxMKTsKKworLyogQWxhcm1zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gbG03OF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW46CisgICAgICogbG03OF9kcml2ZXIgaXMgaW5zZXJ0ZWQgKHdoZW4gdGhpcyBtb2R1bGUgaXMgbG9hZGVkKSwgZm9yIGVhY2gKKyAgICAgICBhdmFpbGFibGUgYWRhcHRlcgorICAgICAqIHdoZW4gYSBuZXcgYWRhcHRlciBpcyBpbnNlcnRlZCAoYW5kIGxtNzhfZHJpdmVyIGlzIHN0aWxsIHByZXNlbnQpICovCitzdGF0aWMgaW50IGxtNzhfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG03OF9kZXRlY3QpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfZGV0ZWN0ICovCitpbnQgbG03OF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJaW50IGksIGVycjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhOworCWNvbnN0IGNoYXIgKmNsaWVudF9uYW1lID0gIiI7CisJaW50IGlzX2lzYSA9IGkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKTsKKworCWlmICghaXNfaXNhICYmCisJICAgICFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gRVJST1IwOworCX0KKworCS8qIFJlc2VydmUgdGhlIElTQSByZWdpb24gKi8KKwlpZiAoaXNfaXNhKQorCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIExNNzhfRVhURU5ULCBsbTc4X2RyaXZlci5uYW1lKSkgeworCQkJZXJyID0gLUVCVVNZOworCQkJZ290byBFUlJPUjA7CisJCX0KKworCS8qIFByb2JlIHdoZXRoZXIgdGhlcmUgaXMgYW55dGhpbmcgYXZhaWxhYmxlIG9uIHRoaXMgYWRkcmVzcy4gQWxyZWFkeQorCSAgIGRvbmUgZm9yIFNNQnVzIGNsaWVudHMgKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJaWYgKGlzX2lzYSkgeworCisjZGVmaW5lIFJFQUxMWV9TTE9XX0lPCisJCQkvKiBXZSBuZWVkIHRoZSB0aW1lb3V0cyBmb3IgYXQgbGVhc3Qgc29tZSBMTTc4LWxpa2UKKwkJCSAgIGNoaXBzLiBCdXQgb25seSBpZiB3ZSByZWFkICd1bmRlZmluZWQnIHJlZ2lzdGVycy4gKi8KKwkJCWkgPSBpbmJfcChhZGRyZXNzICsgMSk7CisJCQlpZiAoaW5iX3AoYWRkcmVzcyArIDIpICE9IGkpIHsKKwkJCQllcnIgPSAtRU5PREVWOworCQkJCWdvdG8gRVJST1IxOworCQkJfQorCQkJaWYgKGluYl9wKGFkZHJlc3MgKyAzKSAhPSBpKSB7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIEVSUk9SMTsKKwkJCX0KKwkJCWlmIChpbmJfcChhZGRyZXNzICsgNykgIT0gaSkgeworCQkJCWVyciA9IC1FTk9ERVY7CisJCQkJZ290byBFUlJPUjE7CisJCQl9CisjdW5kZWYgUkVBTExZX1NMT1dfSU8KKworCQkJLyogTGV0J3MganVzdCBob3BlIG5vdGhpbmcgYnJlYWtzIGhlcmUgKi8KKwkJCWkgPSBpbmJfcChhZGRyZXNzICsgNSkgJiAweDdmOworCQkJb3V0Yl9wKH5pICYgMHg3ZiwgYWRkcmVzcyArIDUpOworCQkJaWYgKChpbmJfcChhZGRyZXNzICsgNSkgJiAweDdmKSAhPSAofmkgJiAweDdmKSkgeworCQkJCW91dGJfcChpLCBhZGRyZXNzICsgNSk7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIEVSUk9SMTsKKwkJCX0KKwkJfQorCX0KKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgbG03OF97cmVhZCx3cml0ZX1fdmFsdWUuICovCisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxtNzhfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SMTsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbG03OF9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpZiAoaXNfaXNhKQorCQlpbml0X01VVEVYKCZkYXRhLT5sb2NrKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmxtNzhfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmIChsbTc4X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgTE03OF9SRUdfQ09ORklHKSAmIDB4ODApIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIEVSUk9SMjsKKwkJfQorCQlpZiAoIWlzX2lzYSAmJiAobG03OF9yZWFkX3ZhbHVlKAorCQkJCW5ld19jbGllbnQsIExNNzhfUkVHX0kyQ19BRERSKSAhPSBhZGRyZXNzKSkgeworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gRVJST1IyOworCQl9CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCisJaWYgKGtpbmQgPD0gMCkgeworCQlpID0gbG03OF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNNzhfUkVHX0NISVBJRCk7CisJCWlmIChpID09IDB4MDAgfHwgaSA9PSAweDIwKQorCQkJa2luZCA9IGxtNzg7CisJCWVsc2UgaWYgKGkgPT0gMHg0MCkKKwkJCWtpbmQgPSBsbTc4ajsKKwkJZWxzZSBpZiAoKGkgJiAweGZlKSA9PSAweGMwKQorCQkJa2luZCA9IGxtNzk7CisJCWVsc2UgeworCQkJaWYgKGtpbmQgPT0gMCkKKwkJCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAiSWdub3JpbmcgJ2ZvcmNlJyAiCisJCQkJCSJwYXJhbWV0ZXIgZm9yIHVua25vd24gY2hpcCBhdCAiCisJCQkJCSJhZGFwdGVyICVkLCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCQkJaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGFkZHJlc3MpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gRVJST1IyOworCQl9CisJfQorCisJaWYgKGtpbmQgPT0gbG03OCkgeworCQljbGllbnRfbmFtZSA9ICJsbTc4IjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gbG03OGopIHsKKwkJY2xpZW50X25hbWUgPSAibG03OC1qIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gbG03OSkgeworCQljbGllbnRfbmFtZSA9ICJsbTc5IjsKKwl9CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBjbGllbnRfbmFtZSwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dHlwZSA9IGtpbmQ7CisKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIEVSUk9SMjsKKworCS8qIEluaXRpYWxpemUgdGhlIExNNzggY2hpcCAqLworCWxtNzhfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBBIGZldyB2YXJzIG5lZWQgdG8gYmUgZmlsbGVkIHVwb24gc3RhcnR1cCAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJZGF0YS0+ZmFuX21pbltpXSA9IGxtNzhfcmVhZF92YWx1ZShuZXdfY2xpZW50LAorCQkJCQlMTTc4X1JFR19GQU5fTUlOKGkpKTsKKwl9CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuM19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuM19kaXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2NwdTBfdmlkKTsKKworCXJldHVybiAwOworCitFUlJPUjI6CisJa2ZyZWUoZGF0YSk7CitFUlJPUjE6CisJaWYgKGlzX2lzYSkKKwkJcmVsZWFzZV9yZWdpb24oYWRkcmVzcywgTE03OF9FWFRFTlQpOworRVJST1IwOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbG03OF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCSAgICAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmKGkyY19pc19pc2FfY2xpZW50KGNsaWVudCkpCisJCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgTE03OF9FWFRFTlQpOworCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBTTUJ1cyBsb2NrcyBpdHNlbGYsIGJ1dCBJU0EgYWNjZXNzIG11c3QgYmUgbG9ja2VkIGV4cGxpY2l0ZWx5ISAKKyAgIFdlIGRvbid0IHdhbnQgdG8gbG9jayB0aGUgd2hvbGUgSVNBIGJ1cywgc28gd2UgbG9jayBlYWNoIGNsaWVudAorICAgc2VwYXJhdGVseS4KKyAgIFdlIGlnbm9yZSB0aGUgTE03OCBCVVNZIGZsYWcgYXQgdGhpcyBtb21lbnQgLSBpdCBjb3VsZCBsZWFkIHRvIGRlYWRsb2NrcywKKyAgIHdvdWxkIHNsb3cgZG93biB0aGUgTE03OCBhY2Nlc3MgYW5kIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LiAgKi8KK3N0YXRpYyBpbnQgbG03OF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgcmVzOworCWlmIChpMmNfaXNfaXNhX2NsaWVudChjbGllbnQpKSB7CisJCXN0cnVjdCBsbTc4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwkJZG93bigmZGF0YS0+bG9jayk7CisJCW91dGJfcChyZWcsIGNsaWVudC0+YWRkciArIExNNzhfQUREUl9SRUdfT0ZGU0VUKTsKKwkJcmVzID0gaW5iX3AoY2xpZW50LT5hZGRyICsgTE03OF9EQVRBX1JFR19PRkZTRVQpOworCQl1cCgmZGF0YS0+bG9jayk7CisJCXJldHVybiByZXM7CisJfSBlbHNlCisJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCisvKiBUaGUgU01CdXMgbG9ja3MgaXRzZWxmLCBidXQgSVNBIGFjY2VzcyBtdXNlIGJlIGxvY2tlZCBleHBsaWNpdGVseSEgCisgICBXZSBkb24ndCB3YW50IHRvIGxvY2sgdGhlIHdob2xlIElTQSBidXMsIHNvIHdlIGxvY2sgZWFjaCBjbGllbnQKKyAgIHNlcGFyYXRlbHkuCisgICBXZSBpZ25vcmUgdGhlIExNNzggQlVTWSBmbGFnIGF0IHRoaXMgbW9tZW50IC0gaXQgY291bGQgbGVhZCB0byBkZWFkbG9ja3MsCisgICB3b3VsZCBzbG93IGRvd24gdGhlIExNNzggYWNjZXNzIGFuZCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4gCisgICBUaGVyZSBhcmUgc29tZSB1Z2x5IHR5cGVjYXN0cyBoZXJlLCBidXQgdGhlIGdvb2QgbmV3IGlzIC0gdGhleSBzaG91bGQKKyAgIG5vd2hlcmUgZWxzZSBiZSBuZWNlc3NhcnkhICovCitzdGF0aWMgaW50IGxtNzhfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlpZiAoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkgeworCQlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJCWRvd24oJmRhdGEtPmxvY2spOworCQlvdXRiX3AocmVnLCBjbGllbnQtPmFkZHIgKyBMTTc4X0FERFJfUkVHX09GRlNFVCk7CisJCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgTE03OF9EQVRBX1JFR19PRkZTRVQpOworCQl1cCgmZGF0YS0+bG9jayk7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IExNNzguIEl0IHNob3VsZCBzZXQgbGltaXRzLCBldGMuICovCitzdGF0aWMgdm9pZCBsbTc4X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTggY29uZmlnID0gbG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfQ09ORklHKTsKKworCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KKwlpZiAoIShjb25maWcgJiAweDAxKSkKKwkJbG03OF93cml0ZV92YWx1ZShjbGllbnQsIExNNzhfUkVHX0NPTkZJRywKKwkJCQkgKGNvbmZpZyAmIDB4ZjcpIHwgMHgwMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG03OF9kYXRhICpsbTc4X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgbG03OCB1cGRhdGVcbiIpOworCisJCWZvciAoaSA9IDA7IGkgPD0gNjsgaSsrKSB7CisJCQlkYXRhLT5pbltpXSA9CisJCQkgICAgbG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfSU4oaSkpOworCQkJZGF0YS0+aW5fbWluW2ldID0KKwkJCSAgICBsbTc4X3JlYWRfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19JTl9NSU4oaSkpOworCQkJZGF0YS0+aW5fbWF4W2ldID0KKwkJCSAgICBsbTc4X3JlYWRfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19JTl9NQVgoaSkpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWRhdGEtPmZhbltpXSA9CisJCQkgICAgbG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfRkFOKGkpKTsKKwkJCWRhdGEtPmZhbl9taW5baV0gPQorCQkJICAgIGxtNzhfcmVhZF92YWx1ZShjbGllbnQsIExNNzhfUkVHX0ZBTl9NSU4oaSkpOworCQl9CisJCWRhdGEtPnRlbXAgPSBsbTc4X3JlYWRfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19URU1QKTsKKwkJZGF0YS0+dGVtcF9vdmVyID0KKwkJICAgIGxtNzhfcmVhZF92YWx1ZShjbGllbnQsIExNNzhfUkVHX1RFTVBfT1ZFUik7CisJCWRhdGEtPnRlbXBfaHlzdCA9CisJCSAgICBsbTc4X3JlYWRfdmFsdWUoY2xpZW50LCBMTTc4X1JFR19URU1QX0hZU1QpOworCQlpID0gbG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfVklEX0ZBTkRJVik7CisJCWRhdGEtPnZpZCA9IGkgJiAweDBmOworCQlpZiAoZGF0YS0+dHlwZSA9PSBsbTc5KQorCQkJZGF0YS0+dmlkIHw9CisJCQkgICAgKGxtNzhfcmVhZF92YWx1ZShjbGllbnQsIExNNzhfUkVHX0NISVBJRCkgJgorCQkJICAgICAweDAxKSA8PCA0OworCQllbHNlCisJCQlkYXRhLT52aWQgfD0gMHgxMDsKKwkJZGF0YS0+ZmFuX2RpdlswXSA9IChpID4+IDQpICYgMHgwMzsKKwkJZGF0YS0+ZmFuX2RpdlsxXSA9IGkgPj4gNjsKKwkJZGF0YS0+YWxhcm1zID0gbG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfQUxBUk0xKSArCisJCSAgICAobG03OF9yZWFkX3ZhbHVlKGNsaWVudCwgTE03OF9SRUdfQUxBUk0yKSA8PCA4KTsKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCisJCWRhdGEtPmZhbl9kaXZbMl0gPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc21fbG03OF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZsbTc4X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbV9sbTc4X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG03OF9kcml2ZXIpOworfQorCisKKworTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTc4LCBMTTc4LUogYW5kIExNNzkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNtX2xtNzhfaW5pdCk7Cittb2R1bGVfZXhpdChzbV9sbTc4X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG04MC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbG04MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmY0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTgwLmMKQEAgLTAsMCArMSw2MDIgQEAKKy8qCisgKiBsbTgwLmMgLSBGcm9tIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICogbW9uaXRvcmluZworICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5ICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisgKiBhbmQgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPgorICoKKyAqIFBvcnRlZCB0byBMaW51eCAyLjYgYnkgVGlhZ28gU291c2EgPG1pcmFnZUBrYW90aWsub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLAorCQkJCQkweDJkLCAweDJlLCAweDJmLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMShsbTgwKTsKKworLyogTWFueSBMTTgwIGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KKworLyogVGhlIExNODAgcmVnaXN0ZXJzICovCisjZGVmaW5lIExNODBfUkVHX0lOX01BWChucikJCSgweDJhICsgKG5yKSAqIDIpCisjZGVmaW5lIExNODBfUkVHX0lOX01JTihucikJCSgweDJiICsgKG5yKSAqIDIpCisjZGVmaW5lIExNODBfUkVHX0lOKG5yKQkJCSgweDIwICsgKG5yKSkKKworI2RlZmluZSBMTTgwX1JFR19GQU4xCQkJMHgyOAorI2RlZmluZSBMTTgwX1JFR19GQU4yCQkJMHgyOQorI2RlZmluZSBMTTgwX1JFR19GQU5fTUlOKG5yKQkJKDB4M2IgKyAobnIpKQorCisjZGVmaW5lIExNODBfUkVHX1RFTVAJCQkweDI3CisjZGVmaW5lIExNODBfUkVHX1RFTVBfSE9UX01BWAkJMHgzOAorI2RlZmluZSBMTTgwX1JFR19URU1QX0hPVF9IWVNUCQkweDM5CisjZGVmaW5lIExNODBfUkVHX1RFTVBfT1NfTUFYCQkweDNhCisjZGVmaW5lIExNODBfUkVHX1RFTVBfT1NfSFlTVAkJMHgzYgorCisjZGVmaW5lIExNODBfUkVHX0NPTkZJRwkJCTB4MDAKKyNkZWZpbmUgTE04MF9SRUdfQUxBUk0xCQkJMHgwMQorI2RlZmluZSBMTTgwX1JFR19BTEFSTTIJCQkweDAyCisjZGVmaW5lIExNODBfUkVHX01BU0sxCQkJMHgwMworI2RlZmluZSBMTTgwX1JFR19NQVNLMgkJCTB4MDQKKyNkZWZpbmUgTE04MF9SRUdfRkFORElWCQkJMHgwNQorI2RlZmluZSBMTTgwX1JFR19SRVMJCQkweDA2CisKKworLyogQ29udmVyc2lvbnMuIFJvdW5kaW5nIGFuZCBsaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRworICAgdmFyaWFudHMuIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGJlIGEgYml0IGNhcmVmdWwgd2l0aCB3aGljaCBhcmd1bWVudHMKKyAgIHRoZXNlIG1hY3JvcyBhcmUgY2FsbGVkOiBhcmd1bWVudHMgbWF5IGJlIGV2YWx1YXRlZCBtb3JlIHRoYW4gb25jZS4KKyAgIEZpeGluZyB0aGlzIGlzIGp1c3Qgbm90IHdvcnRoIGl0LiAqLworCisjZGVmaW5lIElOX1RPX1JFRyh2YWwpCQkoU0VOU09SU19MSU1JVCgoKHZhbCkrNSkvMTAsMCwyNTUpKQorI2RlZmluZSBJTl9GUk9NX1JFRyh2YWwpCSgodmFsKSoxMCkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIEZBTl9UT19SRUcodW5zaWduZWQgcnBtLCB1bnNpZ25lZCBkaXYpCit7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gMjU1OworCXJwbSA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCAxMDAwMDAwKTsKKwlyZXR1cm4gU0VOU09SU19MSU1JVCgoMTM1MDAwMCArIHJwbSpkaXYgLyAyKSAvIChycG0qZGl2KSwgMSwgMjU0KTsKK30KKworI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikJKCh2YWwpPT0wPy0xOlwKKwkJCQkodmFsKT09MjU1PzA6MTM1MDAwMC8oKGRpdikqKHZhbCkpKQorCitzdGF0aWMgaW5saW5lIGxvbmcgVEVNUF9GUk9NX1JFRyh1MTYgdGVtcCkKK3sKKwlsb25nIHJlczsKKworCXRlbXAgPj49IDQ7CisJaWYgKHRlbXAgPCAweDA4MDApCisJCXJlcyA9IDYyNSAqIChsb25nKSB0ZW1wOworCWVsc2UKKwkJcmVzID0gKChsb25nKSB0ZW1wIC0gMHgwMTAwMCkgKiA2MjU7CisKKwlyZXR1cm4gcmVzIC8gMTA7Cit9CisKKyNkZWZpbmUgVEVNUF9MSU1JVF9GUk9NX1JFRyh2YWwpCSgoKHZhbCk+MHg4MD8odmFsKS0weDEwMDoodmFsKSkqMTAwMCkKKworI2RlZmluZSBURU1QX0xJTUlUX1RPX1JFRyh2YWwpCQlTRU5TT1JTX0xJTUlUKCh2YWwpPDA/XAorCQkJCQkoKHZhbCktNTAwKS8xMDAwOigodmFsKSs1MDApLzEwMDAsMCwyNTUpCisKKyNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkJCSgxIDw8ICh2YWwpKQorCisvKgorICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKKyAqLworCitzdHJ1Y3QgbG04MF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCXU4IGluWzddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9tYXhbN107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21pbls3XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fbWluWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2WzJdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KKwl1MTYgdGVtcDsJCS8qIFJlZ2lzdGVyIHZhbHVlcywgc2hpZnRlZCByaWdodCAqLworCXU4IHRlbXBfaG90X21heDsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wX2hvdF9oeXN0OwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHRlbXBfb3NfbWF4OwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wX29zX2h5c3Q7CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworfTsKKworLyogCisgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworCitzdGF0aWMgaW50IGxtODBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgbG04MF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIHZvaWQgbG04MF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgbG04MF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHN0cnVjdCBsbTgwX2RhdGEgKmxtODBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsbTgwX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKTsKK3N0YXRpYyBpbnQgbG04MF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKTsKKworLyoKKyAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCisgKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtODBfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibG04MCIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9MTTgwLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IGxtODBfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBsbTgwX2RldGFjaF9jbGllbnQsCit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCisjZGVmaW5lIHNob3dfaW4oc3VmZml4LCB2YWx1ZSkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbl8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGxtODBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7IFwKK30KK3Nob3dfaW4obWluMCwgaW5fbWluWzBdKTsKK3Nob3dfaW4obWluMSwgaW5fbWluWzFdKTsKK3Nob3dfaW4obWluMiwgaW5fbWluWzJdKTsKK3Nob3dfaW4obWluMywgaW5fbWluWzNdKTsKK3Nob3dfaW4obWluNCwgaW5fbWluWzRdKTsKK3Nob3dfaW4obWluNSwgaW5fbWluWzVdKTsKK3Nob3dfaW4obWluNiwgaW5fbWluWzZdKTsKK3Nob3dfaW4obWF4MCwgaW5fbWF4WzBdKTsKK3Nob3dfaW4obWF4MSwgaW5fbWF4WzFdKTsKK3Nob3dfaW4obWF4MiwgaW5fbWF4WzJdKTsKK3Nob3dfaW4obWF4MywgaW5fbWF4WzNdKTsKK3Nob3dfaW4obWF4NCwgaW5fbWF4WzRdKTsKK3Nob3dfaW4obWF4NSwgaW5fbWF4WzVdKTsKK3Nob3dfaW4obWF4NiwgaW5fbWF4WzZdKTsKK3Nob3dfaW4oaW5wdXQwLCBpblswXSk7CitzaG93X2luKGlucHV0MSwgaW5bMV0pOworc2hvd19pbihpbnB1dDIsIGluWzJdKTsKK3Nob3dfaW4oaW5wdXQzLCBpblszXSk7CitzaG93X2luKGlucHV0NCwgaW5bNF0pOworc2hvd19pbihpbnB1dDUsIGluWzVdKTsKK3Nob3dfaW4oaW5wdXQ2LCBpbls2XSk7CisKKyNkZWZpbmUgc2V0X2luKHN1ZmZpeCwgdmFsdWUsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2V0X2luXyMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTtcCisJZGF0YS0+dmFsdWUgPSBJTl9UT19SRUcodmFsKTsgXAorCWxtODBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPnZhbHVlKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7XAorCXJldHVybiBjb3VudDsgXAorfQorc2V0X2luKG1pbjAsIGluX21pblswXSwgTE04MF9SRUdfSU5fTUlOKDApKTsKK3NldF9pbihtaW4xLCBpbl9taW5bMV0sIExNODBfUkVHX0lOX01JTigxKSk7CitzZXRfaW4obWluMiwgaW5fbWluWzJdLCBMTTgwX1JFR19JTl9NSU4oMikpOworc2V0X2luKG1pbjMsIGluX21pblszXSwgTE04MF9SRUdfSU5fTUlOKDMpKTsKK3NldF9pbihtaW40LCBpbl9taW5bNF0sIExNODBfUkVHX0lOX01JTig0KSk7CitzZXRfaW4obWluNSwgaW5fbWluWzVdLCBMTTgwX1JFR19JTl9NSU4oNSkpOworc2V0X2luKG1pbjYsIGluX21pbls2XSwgTE04MF9SRUdfSU5fTUlOKDYpKTsKK3NldF9pbihtYXgwLCBpbl9tYXhbMF0sIExNODBfUkVHX0lOX01BWCgwKSk7CitzZXRfaW4obWF4MSwgaW5fbWF4WzFdLCBMTTgwX1JFR19JTl9NQVgoMSkpOworc2V0X2luKG1heDIsIGluX21heFsyXSwgTE04MF9SRUdfSU5fTUFYKDIpKTsKK3NldF9pbihtYXgzLCBpbl9tYXhbM10sIExNODBfUkVHX0lOX01BWCgzKSk7CitzZXRfaW4obWF4NCwgaW5fbWF4WzRdLCBMTTgwX1JFR19JTl9NQVgoNCkpOworc2V0X2luKG1heDUsIGluX21heFs1XSwgTE04MF9SRUdfSU5fTUFYKDUpKTsKK3NldF9pbihtYXg2LCBpbl9tYXhbNl0sIExNODBfUkVHX0lOX01BWCg2KSk7CisKKyNkZWZpbmUgc2hvd19mYW4oc3VmZml4LCB2YWx1ZSwgZGl2KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGxtODBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT52YWx1ZSwgXAorCQkgICAgICAgRElWX0ZST01fUkVHKGRhdGEtPmRpdikpKTsgXAorfQorc2hvd19mYW4obWluMSwgZmFuX21pblswXSwgZmFuX2RpdlswXSk7CitzaG93X2ZhbihtaW4yLCBmYW5fbWluWzFdLCBmYW5fZGl2WzFdKTsKK3Nob3dfZmFuKGlucHV0MSwgZmFuWzBdLCBmYW5fZGl2WzBdKTsKK3Nob3dfZmFuKGlucHV0MiwgZmFuWzFdLCBmYW5fZGl2WzFdKTsKKworI2RlZmluZSBzaG93X2Zhbl9kaXYoc3VmZml4LCB2YWx1ZSkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2IyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBsbTgwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBESVZfRlJPTV9SRUcoZGF0YS0+dmFsdWUpKTsgXAorfQorc2hvd19mYW5fZGl2KDEsIGZhbl9kaXZbMF0pOworc2hvd19mYW5fZGl2KDIsIGZhbl9kaXZbMV0pOworCisjZGVmaW5lIHNldF9mYW4oc3VmZml4LCB2YWx1ZSwgcmVnLCBkaXYpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwlzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgbG04MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTtcCisJZGF0YS0+dmFsdWUgPSBGQU5fVE9fUkVHKHZhbCwgRElWX0ZST01fUkVHKGRhdGEtPmRpdikpOyBcCisJbG04MF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTtcCisJcmV0dXJuIGNvdW50OyBcCit9CitzZXRfZmFuKG1pbjEsIGZhbl9taW5bMF0sIExNODBfUkVHX0ZBTl9NSU4oMSksIGZhbl9kaXZbMF0pOworc2V0X2ZhbihtaW4yLCBmYW5fbWluWzFdLCBMTTgwX1JFR19GQU5fTUlOKDIpLCBmYW5fZGl2WzFdKTsKKworLyogTm90ZTogd2Ugc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmFuIG1pbmltdW0gaGVyZSwgYmVjYXVzZSBpdHMgdmFsdWUgaXMKKyAgIGRldGVybWluZWQgaW4gcGFydCBieSB0aGUgZmFuIGRpdmlzb3IuICBUaGlzIGZvbGxvd3MgdGhlIHByaW5jaXBsZSBvZgorICAgbGVhc3Qgc3VwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CisgICBiZWNhdXNlIHRoZSBkaXZpc29yIGNoYW5nZWQuICovCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIG1pbiwgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJdTggcmVnOworCisJLyogU2F2ZSBmYW5fbWluICovCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCW1pbiA9IEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKKwkJCSAgIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6IGRhdGEtPmZhbl9kaXZbbnJdID0gMDsgYnJlYWs7CisJY2FzZSAyOiBkYXRhLT5mYW5fZGl2W25yXSA9IDE7IGJyZWFrOworCWNhc2UgNDogZGF0YS0+ZmFuX2Rpdltucl0gPSAyOyBicmVhazsKKwljYXNlIDg6IGRhdGEtPmZhbl9kaXZbbnJdID0gMzsgYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYW5fZGl2IHZhbHVlICVsZCBub3QgIgorCQkJInN1cHBvcnRlZC4gQ2hvb3NlIG9uZSBvZiAxLCAyLCA0IG9yIDghXG4iLCB2YWwpOworCQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWcgPSAobG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfRkFORElWKSAmIH4oMyA8PCAoMiAqIChuciArIDEpKSkpCisJICAgIHwgKGRhdGEtPmZhbl9kaXZbbnJdIDw8ICgyICogKG5yICsgMSkpKTsKKwlsbTgwX3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfRkFORElWLCByZWcpOworCisJLyogUmVzdG9yZSBmYW5fbWluICovCisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKG1pbiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJbG04MF93cml0ZV92YWx1ZShjbGllbnQsIExNODBfUkVHX0ZBTl9NSU4obnIgKyAxKSwgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc2V0X2Zhbl9kaXYobnVtYmVyKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdiMjbnVtYmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCBudW1iZXIgLSAxKTsgXAorfQorc2V0X2Zhbl9kaXYoMSk7CitzZXRfZmFuX2RpdigyKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2lucHV0MShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG04MF9kYXRhICpkYXRhID0gbG04MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXApKTsKK30KKworI2RlZmluZSBzaG93X3RlbXAoc3VmZml4LCB2YWx1ZSkgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG04MF9kYXRhICpkYXRhID0gbG04MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9MSU1JVF9GUk9NX1JFRyhkYXRhLT52YWx1ZSkpOyBcCit9CitzaG93X3RlbXAoaG90X21heCwgdGVtcF9ob3RfbWF4KTsKK3Nob3dfdGVtcChob3RfaHlzdCwgdGVtcF9ob3RfaHlzdCk7CitzaG93X3RlbXAob3NfbWF4LCB0ZW1wX29zX21heCk7CitzaG93X3RlbXAob3NfaHlzdCwgdGVtcF9vc19oeXN0KTsKKworI2RlZmluZSBzZXRfdGVtcChzdWZmaXgsIHZhbHVlLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT52YWx1ZSA9IFRFTVBfTElNSVRfVE9fUkVHKHZhbCk7IFwKKwlsbTgwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT52YWx1ZSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CitzZXRfdGVtcChob3RfbWF4LCB0ZW1wX2hvdF9tYXgsIExNODBfUkVHX1RFTVBfSE9UX01BWCk7CitzZXRfdGVtcChob3RfaHlzdCwgdGVtcF9ob3RfaHlzdCwgTE04MF9SRUdfVEVNUF9IT1RfSFlTVCk7CitzZXRfdGVtcChvc19tYXgsIHRlbXBfb3NfbWF4LCBMTTgwX1JFR19URU1QX09TX01BWCk7CitzZXRfdGVtcChvc19oeXN0LCB0ZW1wX29zX2h5c3QsIExNODBfUkVHX1RFTVBfT1NfSFlTVCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBsbTgwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+YWxhcm1zKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGluMF9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbjAsIHNldF9pbl9taW4wKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4xLCBzZXRfaW5fbWluMSk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4yX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluMiwgc2V0X2luX21pbjIpOworc3RhdGljIERFVklDRV9BVFRSKGluM19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbjMsIHNldF9pbl9taW4zKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjRfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW40LCBzZXRfaW5fbWluNCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW41X21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluNSwgc2V0X2luX21pbjUpOworc3RhdGljIERFVklDRV9BVFRSKGluNl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbjYsIHNldF9pbl9taW42KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjBfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgwLCBzZXRfaW5fbWF4MCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4xX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4MSwgc2V0X2luX21heDEpOworc3RhdGljIERFVklDRV9BVFRSKGluMl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heDIsIHNldF9pbl9tYXgyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgzLCBzZXRfaW5fbWF4Myk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW40X21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4NCwgc2V0X2luX21heDQpOworc3RhdGljIERFVklDRV9BVFRSKGluNV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heDUsIHNldF9pbl9tYXg1KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpbjZfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXg2LCBzZXRfaW5fbWF4Nik7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4wX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MiwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4zX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0NCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0NSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW42X2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0NiwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9taW4xLAorICAgIHNldF9mYW5fbWluMSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9taW4yLAorICAgIHNldF9mYW5fbWluMik7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW5faW5wdXQxLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl9pbnB1dDIsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGZhbjFfZGl2LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fZGl2MSwgc2V0X2Zhbl9kaXYxKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4yX2RpdiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX2RpdjIsIHNldF9mYW5fZGl2Mik7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dDEsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9ob3RfbWF4LAorICAgIHNldF90ZW1wX2hvdF9tYXgpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2hvdF9oeXN0LAorICAgIHNldF90ZW1wX2hvdF9oeXN0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX29zX21heCwKKyAgICBzZXRfdGVtcF9vc19tYXgpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9vc19oeXN0LAorICAgIHNldF90ZW1wX29zX2h5c3QpOworc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOworCisvKgorICogUmVhbCBjb2RlCisgKi8KKworc3RhdGljIGludCBsbTgwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtODBfZGV0ZWN0KTsKK30KKworaW50IGxtODBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCWludCBpLCBjdXI7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGxtODBfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpuYW1lOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGxtODBfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG04MF9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbG04MF9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmxtODBfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIEl0IGlzIGxvdXN5LiAqLworCWlmIChsbTgwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgTE04MF9SRUdfQUxBUk0yKSAmIDB4YzApCisJCWdvdG8gZXJyb3JfZnJlZTsKKwlmb3IgKGkgPSAweDJhOyBpIDw9IDB4M2Q7IGkrKykgeworCQljdXIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgaSk7CisJCWlmICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIGkgKyAweDQwKSAhPSBjdXIpCisJCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIGkgKyAweDgwKSAhPSBjdXIpCisJCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIGkgKyAweGMwKSAhPSBjdXIpKQorCQkgICAgZ290byBlcnJvcl9mcmVlOworCX0KKworCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlIC0gb25seSBvbmUga2luZCBzdXBwb3J0ZWQhICovCisJa2luZCA9IGxtODA7CisJbmFtZSA9ICJsbTgwIjsKKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXJyb3JfZnJlZTsKKworCS8qIEluaXRpYWxpemUgdGhlIExNODAgY2hpcCAqLworCWxtODBfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBBIGZldyB2YXJzIG5lZWQgdG8gYmUgZmlsbGVkIHVwb24gc3RhcnR1cCAqLworCWRhdGEtPmZhbl9taW5bMF0gPSBsbTgwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgTE04MF9SRUdfRkFOX01JTigxKSk7CisJZGF0YS0+ZmFuX21pblsxXSA9IGxtODBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTgwX1JFR19GQU5fTUlOKDIpKTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxtODBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG04MF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKK30KKworc3RhdGljIGludCBsbTgwX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBMTTgwLiAqLworc3RhdGljIHZvaWQgbG04MF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCS8qIFJlc2V0IGFsbCBleGNlcHQgV2F0Y2hkb2cgdmFsdWVzIGFuZCBsYXN0IGNvbnZlcnNpb24gdmFsdWVzCisJICAgVGhpcyBzZXRzIGZhbi1kaXZzIHRvIDIsIGFtb25nIG90aGVycy4gVGhpcyBtYWtlcyBtb3N0IG90aGVyCisJICAgaW5pdGlhbGl6YXRpb25zIHVubmVjZXNzYXJ5ICovCisJbG04MF93cml0ZV92YWx1ZShjbGllbnQsIExNODBfUkVHX0NPTkZJRywgMHg4MCk7CisJLyogU2V0IDExLWJpdCB0ZW1wZXJhdHVyZSByZXNvbHV0aW9uICovCisJbG04MF93cml0ZV92YWx1ZShjbGllbnQsIExNODBfUkVHX1JFUywgMHgwOCk7CisKKwkvKiBTdGFydCBtb25pdG9yaW5nICovCisJbG04MF93cml0ZV92YWx1ZShjbGllbnQsIExNODBfUkVHX0NPTkZJRywgMHgwMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG04MF9kYXRhICpsbTgwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgMiAqIEhaKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTdGFydGluZyBsbTgwIHVwZGF0ZVxuIik7CisJCWZvciAoaSA9IDA7IGkgPD0gNjsgaSsrKSB7CisJCQlkYXRhLT5pbltpXSA9CisJCQkgICAgbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfSU4oaSkpOworCQkJZGF0YS0+aW5fbWluW2ldID0KKwkJCSAgICBsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19JTl9NSU4oaSkpOworCQkJZGF0YS0+aW5fbWF4W2ldID0KKwkJCSAgICBsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19JTl9NQVgoaSkpOworCQl9CisJCWRhdGEtPmZhblswXSA9IGxtODBfcmVhZF92YWx1ZShjbGllbnQsIExNODBfUkVHX0ZBTjEpOworCQlkYXRhLT5mYW5fbWluWzBdID0KKwkJICAgIGxtODBfcmVhZF92YWx1ZShjbGllbnQsIExNODBfUkVHX0ZBTl9NSU4oMSkpOworCQlkYXRhLT5mYW5bMV0gPSBsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19GQU4yKTsKKwkJZGF0YS0+ZmFuX21pblsxXSA9CisJCSAgICBsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19GQU5fTUlOKDIpKTsKKworCQlkYXRhLT50ZW1wID0KKwkJICAgIChsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19URU1QKSA8PCA4KSB8CisJCSAgICAobG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfUkVTKSAmIDB4ZjApOworCQlkYXRhLT50ZW1wX29zX21heCA9CisJCSAgICBsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19URU1QX09TX01BWCk7CisJCWRhdGEtPnRlbXBfb3NfaHlzdCA9CisJCSAgICBsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19URU1QX09TX0hZU1QpOworCQlkYXRhLT50ZW1wX2hvdF9tYXggPQorCQkgICAgbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfVEVNUF9IT1RfTUFYKTsKKwkJZGF0YS0+dGVtcF9ob3RfaHlzdCA9CisJCSAgICBsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19URU1QX0hPVF9IWVNUKTsKKworCQlpID0gbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfRkFORElWKTsKKwkJZGF0YS0+ZmFuX2RpdlswXSA9IChpID4+IDIpICYgMHgwMzsKKwkJZGF0YS0+ZmFuX2RpdlsxXSA9IChpID4+IDQpICYgMHgwMzsKKwkJZGF0YS0+YWxhcm1zID0gbG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfQUxBUk0xKSArCisJCSAgICAobG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfQUxBUk0yKSA8PCA4KTsKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19sbTgwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmxtODBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfbG04MF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmxtODBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiBhbmQgIgorCSJQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxNODAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfbG04MF9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfbG04MF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtODMuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtODMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGFmZTYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbG04My5jCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICogbG04My5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAqICAgICAgICAgIG1vbml0b3JpbmcKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogSGVhdmlseSBpbnNwaXJlZCBmcm9tIHRoZSBsbTc4LCBsbTc1IGFuZCBhZG0xMDIxIGRyaXZlcnMuIFRoZSBMTTgzIGlzCisgKiBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTmF0aW9uYWwgU2VtaWNvbmR1Y3Rvci4gSXQgcmVwb3J0cyB1cCB0byBmb3VyCisgKiB0ZW1wZXJhdHVyZXMgKGl0cyBvd24gcGx1cyB1cCB0byB0aHJlZSBleHRlcm5hbCBvbmVzKSB3aXRoIGEgMSBkZWcKKyAqIHJlc29sdXRpb24gYW5kIGEgMy00IGRlZyBhY2N1cmFjeS4gQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZSBvYnRhaW5lZAorICogZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNODMuaHRtbAorICogU2luY2UgdGhlIGRhdGFzaGVldCBvbWl0cyB0byBnaXZlIHRoZSBjaGlwIHN0ZXBwaW5nIGNvZGUsIEkgZ2l2ZSBpdAorICogaGVyZTogMHgwMyAoYXQgcmVnaXN0ZXIgMHhmZikuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworLyoKKyAqIEFkZHJlc3NlcyB0byBzY2FuCisgKiBBZGRyZXNzIGlzIHNlbGVjdGVkIHVzaW5nIDIgdGhyZWUtbGV2ZWwgcGlucywgcmVzdWx0aW5nIGluIDkgcG9zc2libGUKKyAqIGFkZHJlc3Nlcy4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDE4LCAweDE5LCAweDFhLAorCQkJCQkweDI5LCAweDJhLCAweDJiLAorCQkJCQkweDRjLCAweDRkLCAweDRlLAorCQkJCQlJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKgorICogSW5zbW9kIHBhcmFtZXRlcnMKKyAqLworCitTRU5TT1JTX0lOU01PRF8xKGxtODMpOworCisvKgorICogVGhlIExNODMgcmVnaXN0ZXJzCisgKiBNYW51ZmFjdHVyZXIgSUQgaXMgMHgwMSBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3Rvci4KKyAqLworCisjZGVmaW5lIExNODNfUkVHX1JfTUFOX0lECQkweEZFCisjZGVmaW5lIExNODNfUkVHX1JfQ0hJUF9JRAkJMHhGRgorI2RlZmluZSBMTTgzX1JFR19SX0NPTkZJRwkJMHgwMworI2RlZmluZSBMTTgzX1JFR19XX0NPTkZJRwkJMHgwOQorI2RlZmluZSBMTTgzX1JFR19SX1NUQVRVUzEJCTB4MDIKKyNkZWZpbmUgTE04M19SRUdfUl9TVEFUVVMyCQkweDM1CisjZGVmaW5lIExNODNfUkVHX1JfTE9DQUxfVEVNUAkJMHgwMAorI2RlZmluZSBMTTgzX1JFR19SX0xPQ0FMX0hJR0gJCTB4MDUKKyNkZWZpbmUgTE04M19SRUdfV19MT0NBTF9ISUdICQkweDBCCisjZGVmaW5lIExNODNfUkVHX1JfUkVNT1RFMV9URU1QCQkweDMwCisjZGVmaW5lIExNODNfUkVHX1JfUkVNT1RFMV9ISUdICQkweDM4CisjZGVmaW5lIExNODNfUkVHX1dfUkVNT1RFMV9ISUdICQkweDUwCisjZGVmaW5lIExNODNfUkVHX1JfUkVNT1RFMl9URU1QCQkweDAxCisjZGVmaW5lIExNODNfUkVHX1JfUkVNT1RFMl9ISUdICQkweDA3CisjZGVmaW5lIExNODNfUkVHX1dfUkVNT1RFMl9ISUdICQkweDBECisjZGVmaW5lIExNODNfUkVHX1JfUkVNT1RFM19URU1QCQkweDMxCisjZGVmaW5lIExNODNfUkVHX1JfUkVNT1RFM19ISUdICQkweDNBCisjZGVmaW5lIExNODNfUkVHX1dfUkVNT1RFM19ISUdICQkweDUyCisjZGVmaW5lIExNODNfUkVHX1JfVENSSVQJCTB4NDIKKyNkZWZpbmUgTE04M19SRUdfV19UQ1JJVAkJMHg1QQorCisvKgorICogQ29udmVyc2lvbnMgYW5kIHZhcmlvdXMgbWFjcm9zCisgKiBUaGUgTE04MyB1c2VzIHNpZ25lZCA4LWJpdCB2YWx1ZXMgd2l0aCBMU0IgPSAxIGRlZ3JlZSBDZWxjaXVzLgorICovCisKKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCSgodmFsKSAqIDEwMDApCisjZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkJKCh2YWwpIDw9IC0xMjgwMDAgPyAtMTI4IDogXAorCQkJCSAodmFsKSA+PSAxMjcwMDAgPyAxMjcgOiBcCisJCQkJICh2YWwpIDwgMCA/ICgodmFsKSAtIDUwMCkgLyAxMDAwIDogXAorCQkJCSAoKHZhbCkgKyA1MDApIC8gMTAwMCkKKworc3RhdGljIGNvbnN0IHU4IExNODNfUkVHX1JfVEVNUFtdID0geworCUxNODNfUkVHX1JfTE9DQUxfVEVNUCwKKwlMTTgzX1JFR19SX1JFTU9URTFfVEVNUCwKKwlMTTgzX1JFR19SX1JFTU9URTJfVEVNUCwKKwlMTTgzX1JFR19SX1JFTU9URTNfVEVNUAorfTsKKworc3RhdGljIGNvbnN0IHU4IExNODNfUkVHX1JfSElHSFtdID0geworCUxNODNfUkVHX1JfTE9DQUxfSElHSCwKKwlMTTgzX1JFR19SX1JFTU9URTFfSElHSCwKKwlMTTgzX1JFR19SX1JFTU9URTJfSElHSCwKKwlMTTgzX1JFR19SX1JFTU9URTNfSElHSAorfTsKKworc3RhdGljIGNvbnN0IHU4IExNODNfUkVHX1dfSElHSFtdID0geworCUxNODNfUkVHX1dfTE9DQUxfSElHSCwKKwlMTTgzX1JFR19XX1JFTU9URTFfSElHSCwKKwlMTTgzX1JFR19XX1JFTU9URTJfSElHSCwKKwlMTTgzX1JFR19XX1JFTU9URTNfSElHSAorfTsKKworLyoKKyAqIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbgorICovCisKK3N0YXRpYyBpbnQgbG04M19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBsbTgzX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IGxtODNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBzdHJ1Y3QgbG04M19kYXRhICpsbTgzX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyoKKyAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCisgKi8KKyAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTgzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImxtODMiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfTE04MywKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBsbTgzX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gbG04M19kZXRhY2hfY2xpZW50LAorfTsKKworLyoKKyAqIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pCisgKi8KKworc3RydWN0IGxtODNfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCisKKwkvKiByZWdpc3RlcnMgdmFsdWVzICovCisJczggdGVtcF9pbnB1dFs0XTsKKwlzOCB0ZW1wX2hpZ2hbNF07CisJczggdGVtcF9jcml0OworCXUxNiBhbGFybXM7IC8qIGJpdHZlY3RvciwgY29tYmluZWQgKi8KK307CisKKy8qCisgKiBTeXNmcyBzdHVmZgorICovCisKKyNkZWZpbmUgc2hvd190ZW1wKHN1ZmZpeCwgdmFsdWUpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtODNfZGF0YSAqZGF0YSA9IGxtODNfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dmFsdWUpKTsgXAorfQorc2hvd190ZW1wKGlucHV0MSwgdGVtcF9pbnB1dFswXSk7CitzaG93X3RlbXAoaW5wdXQyLCB0ZW1wX2lucHV0WzFdKTsKK3Nob3dfdGVtcChpbnB1dDMsIHRlbXBfaW5wdXRbMl0pOworc2hvd190ZW1wKGlucHV0NCwgdGVtcF9pbnB1dFszXSk7CitzaG93X3RlbXAoaGlnaDEsIHRlbXBfaGlnaFswXSk7CitzaG93X3RlbXAoaGlnaDIsIHRlbXBfaGlnaFsxXSk7CitzaG93X3RlbXAoaGlnaDMsIHRlbXBfaGlnaFsyXSk7CitzaG93X3RlbXAoaGlnaDQsIHRlbXBfaGlnaFszXSk7CitzaG93X3RlbXAoY3JpdCwgdGVtcF9jcml0KTsKKworI2RlZmluZSBzZXRfdGVtcChzdWZmaXgsIHZhbHVlLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGxtODNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPnZhbHVlID0gVEVNUF9UT19SRUcodmFsKTsgXAorCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIGRhdGEtPnZhbHVlKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30KK3NldF90ZW1wKGhpZ2gxLCB0ZW1wX2hpZ2hbMF0sIExNODNfUkVHX1dfTE9DQUxfSElHSCk7CitzZXRfdGVtcChoaWdoMiwgdGVtcF9oaWdoWzFdLCBMTTgzX1JFR19XX1JFTU9URTFfSElHSCk7CitzZXRfdGVtcChoaWdoMywgdGVtcF9oaWdoWzJdLCBMTTgzX1JFR19XX1JFTU9URTJfSElHSCk7CitzZXRfdGVtcChoaWdoNCwgdGVtcF9oaWdoWzNdLCBMTTgzX1JFR19XX1JFTU9URTNfSElHSCk7CitzZXRfdGVtcChjcml0LCB0ZW1wX2NyaXQsIExNODNfUkVHX1dfVENSSVQpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG04M19kYXRhICpkYXRhID0gbG04M191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX2lucHV0MSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dDIsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfaW5wdXQzLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wNF9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX2lucHV0NCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2hpZ2gxLAorICAgIHNldF90ZW1wX2hpZ2gxKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfaGlnaDIsCisgICAgc2V0X3RlbXBfaGlnaDIpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9oaWdoMywKKyAgICBzZXRfdGVtcF9oaWdoMyk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDRfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2hpZ2g0LAorICAgIHNldF90ZW1wX2hpZ2g0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lSVUdPLCBzaG93X3RlbXBfY3JpdCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfY3JpdCwKKyAgICBzZXRfdGVtcF9jcml0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wNF9jcml0LCBTX0lSVUdPLCBzaG93X3RlbXBfY3JpdCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CisKKy8qCisgKiBSZWFsIGNvZGUKKyAqLworCitzdGF0aWMgaW50IGxtODNfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG04M19kZXRlY3QpOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBkb2VzIG1vcmUgdGhhbiBqdXN0IGRldGVjdGlvbi4gSWYgZGV0ZWN0aW9uCisgKiBzdWNjZWVkcywgaXQgYWxzbyByZWdpc3RlcnMgdGhlIG5ldyBjaGlwLgorICovCitzdGF0aWMgaW50IGxtODNfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBsbTgzX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9ICIiOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxtODNfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGxtODNfZGF0YSkpOworCisJLyogVGhlIGNvbW1vbiBJMkMgY2xpZW50IGRhdGEgaXMgcGxhY2VkIHJpZ2h0IGFmdGVyIHRoZQorCSAqIExNODMtc3BlY2lmaWMgZGF0YS4gKi8KKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmxtODNfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIE5vdyB3ZSBkbyB0aGUgZGV0ZWN0aW9uIGFuZCBpZGVudGlmaWNhdGlvbi4gQSBuZWdhdGl2ZSBraW5kCisJICogbWVhbnMgdGhhdCB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCBubyBmb3JjZSBwYXJhbWV0ZXIKKwkgKiAoZGVmYXVsdCksIHNvIHdlIG11c3QgYm90aCBkZXRlY3QgYW5kIGlkZW50aWZ5IHRoZSBjaGlwCisJICogKGFjdHVhbGx5IHRoZXJlIGlzIG9ubHkgb25lIHBvc3NpYmxlIGtpbmQgb2YgY2hpcCBmb3Igbm93LCBMTTgzKS4KKwkgKiBBIHplcm8ga2luZCBtZWFucyB0aGF0IHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZQorCSAqIHBhcmFtZXRlciwgdGhlIGRldGVjdGlvbiBzdGVwIHNoYWxsIGJlIHNraXBwZWQuIEEgcG9zaXRpdmUga2luZAorCSAqIG1lYW5zIHRoYXQgdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciBhbmQgYQorCSAqIGdpdmVuIGtpbmQgb2YgY2hpcCBpcyByZXF1ZXN0ZWQsIHNvIGJvdGggdGhlIGRldGVjdGlvbiBhbmQgdGhlCisJICogaWRlbnRpZmljYXRpb24gc3RlcHMgYXJlIHNraXBwZWQuICovCisKKwkvKiBEZWZhdWx0IHRvIGFuIExNODMgaWYgZm9yY2VkICovCisJaWYgKGtpbmQgPT0gMCkKKwkJa2luZCA9IGxtODM7CisKKwlpZiAoa2luZCA8IDApIHsgLyogZGV0ZWN0aW9uICovCisJCWlmICgoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTgzX1JFR19SX1NUQVRVUzEpCisJCSAgICAmIDB4QTgpICE9IDB4MDApIHx8CisJCSAgICAoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTgzX1JFR19SX1NUQVRVUzIpCisJCSAgICAmIDB4NDgpICE9IDB4MDApIHx8CisJCSAgICAoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTgzX1JFR19SX0NPTkZJRykKKwkJICAgICYgMHg0MSkgIT0gMHgwMCkpIHsKKwkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKKwkJCSAgICAiTE04MyBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeC5cbiIsIGFkZHJlc3MpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwl9CisKKwlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uICovCisJCXU4IG1hbl9pZCwgY2hpcF9pZDsKKworCQltYW5faWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJICAgIExNODNfUkVHX1JfTUFOX0lEKTsKKwkJY2hpcF9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkgICAgTE04M19SRUdfUl9DSElQX0lEKTsKKworCQlpZiAobWFuX2lkID09IDB4MDEpIHsgLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAqLworCQkJaWYgKGNoaXBfaWQgPT0gMHgwMykgeworCQkJCWtpbmQgPSBsbTgzOworCQkJfQorCQl9CisKKwkJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCisJCQkgICAgIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwMlgsICIKKwkJCSAgICAiY2hpcF9pZD0weCUwMlgpLlxuIiwgbWFuX2lkLCBjaGlwX2lkKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJaWYgKGtpbmQgPT0gbG04MykgeworCQluYW1lID0gImxtODMiOworCX0KKworCS8qIFdlIGNhbiBmaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIExNODMgY2hpcAorCSAqIChOb3RoaW5nIHRvIGRvIGZvciB0aGlzIG9uZS4pCisJICovCisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDRfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDRfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA0X2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKworCXJldHVybiAwOworCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbG04M19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCSAgICAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBsbTgzX2RhdGEgKmxtODNfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiAqIDIpIHx8ICFkYXRhLT52YWxpZCkgeworCQlpbnQgbnI7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBsbTgzIGRhdGEuXG4iKTsKKwkJZm9yIChuciA9IDA7IG5yIDwgNCA7IG5yKyspIHsKKwkJCWRhdGEtPnRlbXBfaW5wdXRbbnJdID0KKwkJCSAgICBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJICAgIExNODNfUkVHX1JfVEVNUFtucl0pOworCQkJZGF0YS0+dGVtcF9oaWdoW25yXSA9CisJCQkgICAgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCSAgICBMTTgzX1JFR19SX0hJR0hbbnJdKTsKKwkJfQorCQlkYXRhLT50ZW1wX2NyaXQgPQorCQkgICAgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE04M19SRUdfUl9UQ1JJVCk7CisJCWRhdGEtPmFsYXJtcyA9CisJCSAgICBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTgzX1JFR19SX1NUQVRVUzEpCisJCSAgICArIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTgzX1JFR19SX1NUQVRVUzIpCisJCSAgICA8PCA4KTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2xtODNfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbG04M19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19sbTgzX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG04M19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTE04MyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19sbTgzX2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc19sbTgzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG04NS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbG04NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYTBkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTg1LmMKQEAgLTAsMCArMSwxNTc4IEBACisvKgorICAgIGxtODUuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAKKyAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgIFBoaWxpcCBQb2tvcm55IDxwcG9rb3JueUBwZW5ndWluY29tcHV0aW5nLmNvbT4KKyAgICBDb3B5cmlnaHQgKGMpIDIwMDMgICAgICAgIE1hcmdpdCBTY2h1YmVydC1XaGlsZSA8bWFyZ2l0c3dAdC1vbmxpbmUuZGU+CisgICAgQ29weXJpZ2h0IChjKSAyMDA0ICAgICAgICBKdXN0aW4gVGhpZXNzZW4gPGp0aGllc3NlbkBwZW5ndWluY29tcHV0aW5nLmNvbT4KKworICAgIENoaXAgZGV0YWlscyBhdAkgICAgICA8aHR0cDovL3d3dy5uYXRpb25hbC5jb20vZHMvTE0vTE04NS5wZGY+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXZpZC5oPgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyYywgMHgyZCwgMHgyZSwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzYobG04NWIsIGxtODVjLCBhZG0xMDI3LCBhZHQ3NDYzLCBlbWM2ZDEwMCwgZW1jNmQxMDIpOworCisvKiBUaGUgTE04NSByZWdpc3RlcnMgKi8KKworI2RlZmluZQlMTTg1X1JFR19JTihucikJCQkoMHgyMCArIChucikpCisjZGVmaW5lCUxNODVfUkVHX0lOX01JTihucikJCSgweDQ0ICsgKG5yKSAqIDIpCisjZGVmaW5lCUxNODVfUkVHX0lOX01BWChucikJCSgweDQ1ICsgKG5yKSAqIDIpCisKKyNkZWZpbmUJTE04NV9SRUdfVEVNUChucikJCSgweDI1ICsgKG5yKSkKKyNkZWZpbmUJTE04NV9SRUdfVEVNUF9NSU4obnIpCQkoMHg0ZSArIChucikgKiAyKQorI2RlZmluZQlMTTg1X1JFR19URU1QX01BWChucikJCSgweDRmICsgKG5yKSAqIDIpCisKKy8qIEZhbiBzcGVlZHMgYXJlIExTQiwgTVNCICgyIGJ5dGVzKSAqLworI2RlZmluZQlMTTg1X1JFR19GQU4obnIpCQkoMHgyOCArIChucikgKjIpCisjZGVmaW5lCUxNODVfUkVHX0ZBTl9NSU4obnIpCQkoMHg1NCArIChucikgKjIpCisKKyNkZWZpbmUJTE04NV9SRUdfUFdNKG5yKQkJKDB4MzAgKyAobnIpKQorCisjZGVmaW5lCUFEVDc0NjNfUkVHX09QUE9JTlQobnIpCQkoMHgzMyArIChucikpCisKKyNkZWZpbmUJQURUNzQ2M19SRUdfVE1JTl9DVEwxCQkweDM2CisjZGVmaW5lCUFEVDc0NjNfUkVHX1RNSU5fQ1RMMgkJMHgzNworCisjZGVmaW5lCUxNODVfUkVHX0RFVklDRQkJCTB4M2QKKyNkZWZpbmUJTE04NV9SRUdfQ09NUEFOWQkJMHgzZQorI2RlZmluZQlMTTg1X1JFR19WRVJTVEVQCQkweDNmCisvKiBUaGVzZSBhcmUgdGhlIHJlY29nbml6ZWQgdmFsdWVzIGZvciB0aGUgYWJvdmUgcmVncyAqLworI2RlZmluZQlMTTg1X0RFVklDRV9BRFgJCQkweDI3CisjZGVmaW5lCUxNODVfQ09NUEFOWV9OQVRJT05BTAkJMHgwMQorI2RlZmluZQlMTTg1X0NPTVBBTllfQU5BTE9HX0RFVgkJMHg0MQorI2RlZmluZQlMTTg1X0NPTVBBTllfU01TQyAgICAgIAkJMHg1YworI2RlZmluZQlMTTg1X1ZFUlNURVBfVk1BU0sgICAgICAgICAgICAgIDB4ZjAKKyNkZWZpbmUJTE04NV9WRVJTVEVQX0dFTkVSSUMJCTB4NjAKKyNkZWZpbmUJTE04NV9WRVJTVEVQX0xNODVDCQkweDYwCisjZGVmaW5lCUxNODVfVkVSU1RFUF9MTTg1QgkJMHg2MgorI2RlZmluZQlMTTg1X1ZFUlNURVBfQURNMTAyNwkJMHg2MAorI2RlZmluZQlMTTg1X1ZFUlNURVBfQURUNzQ2MwkJMHg2MgorI2RlZmluZQlMTTg1X1ZFUlNURVBfQURUNzQ2M0MJCTB4NkEKKyNkZWZpbmUJTE04NV9WRVJTVEVQX0VNQzZEMTAwX0EwICAgICAgICAweDYwCisjZGVmaW5lCUxNODVfVkVSU1RFUF9FTUM2RDEwMF9BMSAgICAgICAgMHg2MQorI2RlZmluZQlMTTg1X1ZFUlNURVBfRU1DNkQxMDIJCTB4NjUKKworI2RlZmluZQlMTTg1X1JFR19DT05GSUcJCQkweDQwCisKKyNkZWZpbmUJTE04NV9SRUdfQUxBUk0xCQkJMHg0MQorI2RlZmluZQlMTTg1X1JFR19BTEFSTTIJCQkweDQyCisKKyNkZWZpbmUJTE04NV9SRUdfVklECQkJMHg0MworCisvKiBBdXRvbWF0ZWQgRkFOIGNvbnRyb2wgKi8KKyNkZWZpbmUJTE04NV9SRUdfQUZBTl9DT05GSUcobnIpCSgweDVjICsgKG5yKSkKKyNkZWZpbmUJTE04NV9SRUdfQUZBTl9SQU5HRShucikJCSgweDVmICsgKG5yKSkKKyNkZWZpbmUJTE04NV9SRUdfQUZBTl9TUElLRTEJCTB4NjIKKyNkZWZpbmUJTE04NV9SRUdfQUZBTl9TUElLRTIJCTB4NjMKKyNkZWZpbmUJTE04NV9SRUdfQUZBTl9NSU5QV00obnIpCSgweDY0ICsgKG5yKSkKKyNkZWZpbmUJTE04NV9SRUdfQUZBTl9MSU1JVChucikJCSgweDY3ICsgKG5yKSkKKyNkZWZpbmUJTE04NV9SRUdfQUZBTl9DUklUSUNBTChucikJKDB4NmEgKyAobnIpKQorI2RlZmluZQlMTTg1X1JFR19BRkFOX0hZU1QxCQkweDZkCisjZGVmaW5lCUxNODVfUkVHX0FGQU5fSFlTVDIJCTB4NmUKKworI2RlZmluZQlMTTg1X1JFR19UQUNIX01PREUJCTB4NzQKKyNkZWZpbmUJTE04NV9SRUdfU1BJTlVQX0NUTAkJMHg3NQorCisjZGVmaW5lCUFETTEwMjdfUkVHX1RFTVBfT0ZGU0VUKG5yKQkoMHg3MCArIChucikpCisjZGVmaW5lCUFETTEwMjdfUkVHX0NPTkZJRzIJCTB4NzMKKyNkZWZpbmUJQURNMTAyN19SRUdfSU5UTUFTSzEJCTB4NzQKKyNkZWZpbmUJQURNMTAyN19SRUdfSU5UTUFTSzIJCTB4NzUKKyNkZWZpbmUJQURNMTAyN19SRUdfRVhURU5EX0FEQzEJCTB4NzYKKyNkZWZpbmUJQURNMTAyN19SRUdfRVhURU5EX0FEQzIJCTB4NzcKKyNkZWZpbmUJQURNMTAyN19SRUdfQ09ORklHMwkJMHg3OAorI2RlZmluZQlBRE0xMDI3X1JFR19GQU5fUFBSCQkweDdiCisKKyNkZWZpbmUJQURUNzQ2M19SRUdfVEhFUk0JCTB4NzkKKyNkZWZpbmUJQURUNzQ2M19SRUdfVEhFUk1fTElNSVQJCTB4N0EKKworI2RlZmluZSBFTUM2RDEwMF9SRUdfQUxBUk0zICAgICAgICAgICAgIDB4N2QKKy8qIElONSwgSU42IGFuZCBJTjcgKi8KKyNkZWZpbmUJRU1DNkQxMDBfUkVHX0lOKG5yKSAgICAgICAgICAgICAoMHg3MCArICgobnIpLTUpKQorI2RlZmluZQlFTUM2RDEwMF9SRUdfSU5fTUlOKG5yKSAgICAgICAgICgweDczICsgKChuciktNSkgKiAyKQorI2RlZmluZQlFTUM2RDEwMF9SRUdfSU5fTUFYKG5yKSAgICAgICAgICgweDc0ICsgKChuciktNSkgKiAyKQorI2RlZmluZQlFTUM2RDEwMl9SRUdfRVhURU5EX0FEQzEJMHg4NQorI2RlZmluZQlFTUM2RDEwMl9SRUdfRVhURU5EX0FEQzIJMHg4NgorI2RlZmluZQlFTUM2RDEwMl9SRUdfRVhURU5EX0FEQzMJMHg4NworI2RlZmluZQlFTUM2RDEwMl9SRUdfRVhURU5EX0FEQzQJMHg4OAorCisjZGVmaW5lCUxNODVfQUxBUk1fSU4wCQkJMHgwMDAxCisjZGVmaW5lCUxNODVfQUxBUk1fSU4xCQkJMHgwMDAyCisjZGVmaW5lCUxNODVfQUxBUk1fSU4yCQkJMHgwMDA0CisjZGVmaW5lCUxNODVfQUxBUk1fSU4zCQkJMHgwMDA4CisjZGVmaW5lCUxNODVfQUxBUk1fVEVNUDEJCTB4MDAxMAorI2RlZmluZQlMTTg1X0FMQVJNX1RFTVAyCQkweDAwMjAKKyNkZWZpbmUJTE04NV9BTEFSTV9URU1QMwkJMHgwMDQwCisjZGVmaW5lCUxNODVfQUxBUk1fQUxBUk0yCQkweDAwODAKKyNkZWZpbmUJTE04NV9BTEFSTV9JTjQJCQkweDAxMDAKKyNkZWZpbmUJTE04NV9BTEFSTV9SRVNFUlZFRAkJMHgwMjAwCisjZGVmaW5lCUxNODVfQUxBUk1fRkFOMQkJCTB4MDQwMAorI2RlZmluZQlMTTg1X0FMQVJNX0ZBTjIJCQkweDA4MDAKKyNkZWZpbmUJTE04NV9BTEFSTV9GQU4zCQkJMHgxMDAwCisjZGVmaW5lCUxNODVfQUxBUk1fRkFONAkJCTB4MjAwMAorI2RlZmluZQlMTTg1X0FMQVJNX1RFTVAxX0ZBVUxUCQkweDQwMDAKKyNkZWZpbmUJTE04NV9BTEFSTV9URU1QM19GQVVMVAkJMHg4MDAwCisKKworLyogQ29udmVyc2lvbnMuIFJvdW5kaW5nIGFuZCBsaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRyAKKyAgIHZhcmlhbnRzLiBOb3RlIHRoYXQgeW91IHNob3VsZCBiZSBhIGJpdCBjYXJlZnVsIHdpdGggd2hpY2ggYXJndW1lbnRzCisgICB0aGVzZSBtYWNyb3MgYXJlIGNhbGxlZDogYXJndW1lbnRzIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCisgKi8KKworLyogSU4gYXJlIHNjYWxlZCBhY29yZGluZyB0byBidWlsdC1pbiByZXNpc3RvcnMgKi8KK3N0YXRpYyBpbnQgbG04NV9zY2FsaW5nW10gPSB7ICAvKiAuMDAxIFZvbHRzICovCisJCTI1MDAsIDIyNTAsIDMzMDAsIDUwMDAsIDEyMDAwLAorCQkzMzAwLCAxNTAwLCAxODAwIC8qRU1DNkQxMDAqLworCX07CisjZGVmaW5lIFNDQUxFKHZhbCxmcm9tLHRvKQkJKCgodmFsKSoodG8pICsgKChmcm9tKS8yKSkvKGZyb20pKQorCisjZGVmaW5lIElOU19UT19SRUcobix2YWwpCVwKKwkJU0VOU09SU19MSU1JVChTQ0FMRSh2YWwsbG04NV9zY2FsaW5nW25dLDE5MiksMCwyNTUpCisKKyNkZWZpbmUgSU5TRVhUX0ZST01fUkVHKG4sdmFsLGV4dCxzY2FsZSkJXAorCQlTQ0FMRSgodmFsKSooc2NhbGUpICsgKGV4dCksMTkyKihzY2FsZSksbG04NV9zY2FsaW5nW25dKQorCisjZGVmaW5lIElOU19GUk9NX1JFRyhuLHZhbCkgICBJTlNFWFRfRlJPTV9SRUcobix2YWwsMCwxKQorCisvKiBGQU4gc3BlZWQgaXMgbWVhc3VyZWQgdXNpbmcgOTBrSHogY2xvY2sgKi8KKyNkZWZpbmUgRkFOX1RPX1JFRyh2YWwpCQkoU0VOU09SU19MSU1JVCggKHZhbCk8PTA/MDogNTQwMDAwMC8odmFsKSwwLDY1NTM0KSkKKyNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCkJKCh2YWwpPT0wPy0xOih2YWwpPT0weGZmZmY/MDo1NDAwMDAwLyh2YWwpKQorCisvKiBUZW1wZXJhdHVyZSBpcyByZXBvcnRlZCBpbiAuMDAxIGRlZ0MgaW5jcmVtZW50cyAqLworI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpCVwKKwkJU0VOU09SU19MSU1JVChTQ0FMRSh2YWwsMTAwMCwxKSwtMTI3LDEyNykKKyNkZWZpbmUgVEVNUEVYVF9GUk9NX1JFRyh2YWwsZXh0LHNjYWxlKQlcCisJCVNDQUxFKCh2YWwpKnNjYWxlICsgKGV4dCksc2NhbGUsMTAwMCkKKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCVwKKwkJVEVNUEVYVF9GUk9NX1JFRyh2YWwsMCwxKQorCisjZGVmaW5lIFBXTV9UT19SRUcodmFsKQkJCShTRU5TT1JTX0xJTUlUKHZhbCwwLDI1NSkpCisjZGVmaW5lIFBXTV9GUk9NX1JFRyh2YWwpCQkodmFsKQorCisKKy8qIFpPTkVzIGhhdmUgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICogICAgTGltaXQgKGxvdykgdGVtcCwgICAgICAgICAgIDEuIGRlZ0MKKyAqICAgIEh5c3RlcmVzaXMgKGJlbG93IGxpbWl0KSwgICAxLiBkZWdDICgwLTE1KQorICogICAgUmFuZ2Ugb2Ygc3BlZWQgY29udHJvbCwgICAgIC4xIGRlZ0MgKDItODApCisgKiAgICBDcml0aWNhbCAoaGlnaCkgdGVtcCwgICAgICAgMS4gZGVnQworICoKKyAqIEZBTiBQV01zIGhhdmUgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICogICAgUmVmZXJlbmNlIFpvbmUsICAgICAgICAgICAgICAgICAxLCAyLCAzLCBldGMuCisgKiAgICBTcGludXAgdGltZSwgICAgICAgICAgICAgICAgICAgIC4wNSBzZWMKKyAqICAgIFBXTSB2YWx1ZSBhdCBsaW1pdC9sb3cgdGVtcCwgICAgMSBjb3VudAorICogICAgUFdNIEZyZXF1ZW5jeSwgICAgICAgICAgICAgICAgICAxLiBIegorICogICAgUFdNIGlzIE1pbiBvciBPRkYgYmVsb3cgbGltaXQsICBmbGFnCisgKiAgICBJbnZlcnQgUFdNIG91dHB1dCwgICAgICAgICAgICAgIGZsYWcKKyAqCisgKiBTb21lIGNoaXBzIGZpbHRlciB0aGUgdGVtcCwgb3RoZXJzIHRoZSBmYW4uCisgKiAgICBGaWx0ZXIgY29uc3RhbnQgKG9yIGRpc2FibGVkKSAgIC4xIHNlY29uZHMKKyAqLworCisvKiBUaGVzZSBhcmUgdGhlIHpvbmUgdGVtcGVyYXR1cmUgcmFuZ2UgZW5jb2RpbmdzIGluIC4wMDEgZGVncmVlIEMgKi8KK3N0YXRpYyBpbnQgbG04NV9yYW5nZV9tYXBbXSA9IHsgICAKKwkJMjAwMCwgIDI1MDAsICAzMzAwLCAgNDAwMCwgIDUwMDAsICA2NjAwLAorCQk4MDAwLCAxMDAwMCwgMTMzMDAsIDE2MDAwLCAyMDAwMCwgMjY2MDAsCisJCTMyMDAwLCA0MDAwMCwgNTMzMDAsIDgwMDAwCisJfTsKK3N0YXRpYyBpbnQgUkFOR0VfVE9fUkVHKCBpbnQgcmFuZ2UgKQoreworCWludCBpOworCisJaWYgKCByYW5nZSA8IGxtODVfcmFuZ2VfbWFwWzBdICkgeyAKKwkJcmV0dXJuIDAgOworCX0gZWxzZSBpZiAoIHJhbmdlID4gbG04NV9yYW5nZV9tYXBbMTVdICkgeworCQlyZXR1cm4gMTUgOworCX0gZWxzZSB7ICAvKiBmaW5kIGNsb3Nlc3QgbWF0Y2ggKi8KKwkJZm9yICggaSA9IDE0IDsgaSA+PSAwIDsgLS1pICkgeworCQkJaWYgKCByYW5nZSA+IGxtODVfcmFuZ2VfbWFwW2ldICkgeyAvKiByYW5nZSBicmFja2V0ZWQgKi8KKwkJCQlpZiAoKGxtODVfcmFuZ2VfbWFwW2krMV0gLSByYW5nZSkgPCAKKwkJCQkJKHJhbmdlIC0gbG04NV9yYW5nZV9tYXBbaV0pKSB7CisJCQkJCWkrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiggaSAmIDB4MGYgKTsKK30KKyNkZWZpbmUgUkFOR0VfRlJPTV9SRUcodmFsKSAobG04NV9yYW5nZV9tYXBbKHZhbCkmMHgwZl0pCisKKy8qIFRoZXNlIGFyZSB0aGUgQWNvdXN0aWMgRW5oYW5jZW1lbnQsIG9yIFRlbXBlcmF0dXJlIHNtb290aGluZyBlbmNvZGluZ3MKKyAqIE5PVEU6IFRoZSBlbmFibGUvZGlzYWJsZSBiaXQgaXMgSU5DTFVERUQgaW4gdGhlc2UgZW5jb2RpbmdzIGFzIHRoZQorICogICAgICAgTVNCIChiaXQgMywgdmFsdWUgOCkuICBJZiB0aGUgZW5hYmxlIGJpdCBpcyAwLCB0aGUgZW5jb2RlZCB2YWx1ZQorICogICAgICAgaXMgaWdub3JlZCwgb3Igc2V0IHRvIDAuCisgKi8KKy8qIFRoZXNlIGFyZSB0aGUgUFdNIGZyZXF1ZW5jeSBlbmNvZGluZ3MgKi8KK3N0YXRpYyBpbnQgbG04NV9mcmVxX21hcFtdID0geyAvKiAuMSBIeiAqLworCQkxMDAsIDE1MCwgMjMwLCAzMDAsIDM4MCwgNDcwLCA2MjAsIDk0MAorCX07CitzdGF0aWMgaW50IEZSRVFfVE9fUkVHKCBpbnQgZnJlcSApCit7CisJaW50IGk7CisKKwlpZiggZnJlcSA+PSBsbTg1X2ZyZXFfbWFwWzddICkgeyByZXR1cm4gNyA7IH0KKwlmb3IoIGkgPSAwIDsgaSA8IDcgOyArK2kgKQorCQlpZiggZnJlcSA8PSBsbTg1X2ZyZXFfbWFwW2ldICkKKwkJCWJyZWFrIDsKKwlyZXR1cm4oIGkgJiAweDA3ICk7Cit9CisjZGVmaW5lIEZSRVFfRlJPTV9SRUcodmFsKSAobG04NV9mcmVxX21hcFsodmFsKSYweDA3XSkKKworLyogU2luY2Ugd2UgY2FuJ3QgdXNlIHN0cmluZ3MsIEknbSBhYnVzaW5nIHRoZXNlIG51bWJlcnMKKyAqICAgdG8gc3RhbmQgaW4gZm9yIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisgKiAgICAgIDEgLS0gUFdNIHJlc3BvbmRzIHRvIFpvbmUgMQorICogICAgICAyIC0tIFBXTSByZXNwb25kcyB0byBab25lIDIKKyAqICAgICAgMyAtLSBQV00gcmVzcG9uZHMgdG8gWm9uZSAzCisgKiAgICAgMjMgLS0gUFdNIHJlc3BvbmRzIHRvIHRoZSBoaWdoZXIgdGVtcCBvZiBab25lIDIgb3IgMworICogICAgMTIzIC0tIFBXTSByZXNwb25kcyB0byBoaWdoZXN0IG9mIFpvbmUgMSwgMiwgb3IgMworICogICAgICAwIC0tIFBXTSBpcyBhbHdheXMgYXQgMCUgKGllLCBvZmYpCisgKiAgICAgLTEgLS0gUFdNIGlzIGFsd2F5cyBhdCAxMDAlCisgKiAgICAgLTIgLS0gUFdNIHJlc3BvbmRzIHRvIG1hbnVhbCBjb250cm9sCisgKi8KKworc3RhdGljIGludCBsbTg1X3pvbmVfbWFwW10gPSB7IDEsIDIsIDMsIC0xLCAwLCAyMywgMTIzLCAtMiB9OworI2RlZmluZSBaT05FX0ZST01fUkVHKHZhbCkgKGxtODVfem9uZV9tYXBbKCh2YWwpPj41KSYweDA3XSkKKworc3RhdGljIGludCBaT05FX1RPX1JFRyggaW50IHpvbmUgKQoreworCWludCBpOworCisJZm9yKCBpID0gMCA7IGkgPD0gNyA7ICsraSApCisJCWlmKCB6b25lID09IGxtODVfem9uZV9tYXBbaV0gKQorCQkJYnJlYWsgOworCWlmKCBpID4gNyApICAgLyogTm90IGZvdW5kLiAqLworCQlpID0gMzsgIC8qIEFsd2F5cyAxMDAlICovCisJcmV0dXJuKCAoaSAmIDB4MDcpPDw1ICk7Cit9CisKKyNkZWZpbmUgSFlTVF9UT19SRUcodmFsKSAoU0VOU09SU19MSU1JVCgoKHZhbCkrNTAwKS8xMDAwLDAsMTUpKQorI2RlZmluZSBIWVNUX0ZST01fUkVHKHZhbCkgKCh2YWwpKjEwMDApCisKKyNkZWZpbmUgT0ZGU0VUX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCh2YWwpLzI1LC0xMjcsMTI3KSkKKyNkZWZpbmUgT0ZGU0VUX0ZST01fUkVHKHZhbCkgKCh2YWwpKjI1KQorCisjZGVmaW5lIFBQUl9NQVNLKGZhbikgKDB4MDM8PChmYW4gKjIpKQorI2RlZmluZSBQUFJfVE9fUkVHKHZhbCxmYW4pIChTRU5TT1JTX0xJTUlUKCh2YWwpLTEsMCwzKTw8KGZhbiAqMikpCisjZGVmaW5lIFBQUl9GUk9NX1JFRyh2YWwsZmFuKSAoKCgodmFsKT4+KGZhbiAqIDIpKSYweDAzKSsxKQorCisvKiBpMmMtdmlkLmggZGVmaW5lcyB2aWRfZnJvbV9yZWcoKSAqLworI2RlZmluZSBWSURfRlJPTV9SRUcodmFsLHZybSkgKHZpZF9mcm9tX3JlZygodmFsKSwodnJtKSkpCisKKyNkZWZpbmUgQUxBUk1TX0ZST01fUkVHKHZhbCkgKHZhbCkKKworLyogVW5saWtlIHNvbWUgb3RoZXIgZHJpdmVycyB3ZSBETyBOT1Qgc2V0IGluaXRpYWwgbGltaXRzLiAgVXNlCisgKiB0aGUgY29uZmlnIGZpbGUgdG8gc2V0IGxpbWl0cy4gIFNvbWUgdXNlcnMgaGF2ZSByZXBvcnRlZAorICogbW90aGVyYm9hcmRzIHNodXR0aW5nIGRvd24gd2hlbiB3ZSBzZXQgbGltaXRzIGluIGEgcHJldmlvdXMKKyAqIHZlcnNpb24gb2YgdGhlIGRyaXZlci4KKyAqLworCisvKiBDaGlwIHNhbXBsaW5nIHJhdGVzCisgKgorICogU29tZSBzZW5zb3JzIGFyZSBub3QgdXBkYXRlZCBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlIHBlciBzZWNvbmQKKyAqICAgIHNvIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZWFkIHRoZW0gbW9yZSBvZnRlbiB0aGFuIHRoYXQuCisgKiAgICBXZSBjYWNoZSB0aGUgcmVzdWx0cyBhbmQgcmV0dXJuIHRoZSBzYXZlZCBkYXRhIGlmIHRoZSBkcml2ZXIKKyAqICAgIGlzIGNhbGxlZCBhZ2FpbiBiZWZvcmUgYSBzZWNvbmQgaGFzIGVsYXBzZWQuCisgKgorICogQWxzbywgdGhlcmUgaXMgc2lnbmlmaWNhbnQgY29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGlzIGNoaXAKKyAqICAgIGdpdmVuIHRoZSBhdXRvbWF0aWMgUFdNIGZhbiBjb250cm9sIHRoYXQgaXMgcG9zc2libGUuICBUaGVyZQorICogICAgYXJlIGFib3V0IDQ3IGJ5dGVzIG9mIGNvbmZpZyBkYXRhIHRvIG9ubHkgMjIgYnl0ZXMgb2YgYWN0dWFsCisgKiAgICByZWFkaW5ncy4gIFNvLCB3ZSBrZWVwIHRoZSBjb25maWcgZGF0YSB1cCB0byBkYXRlIGluIHRoZSBjYWNoZQorICogICAgd2hlbiBpdCBpcyB3cml0dGVuIGFuZCBvbmx5IHNhbXBsZSBpdCBvbmNlIGV2ZXJ5IDEgKm1pbnV0ZSoKKyAqLworI2RlZmluZSBMTTg1X0RBVEFfSU5URVJWQUwgIChIWiArIEhaIC8gMikKKyNkZWZpbmUgTE04NV9DT05GSUdfSU5URVJWQUwgICgxICogNjAgKiBIWikKKworLyogRm9yIGVhY2ggcmVnaXN0ZXJlZCBMTTg1LCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBkYXRhIGluIG1lbW9yeS4gVGhhdAorICAgZGF0YSBpcyBwb2ludGVkIHRvIGJ5IGxtODVfbGlzdFtOUl0tPmRhdGEuIFRoZSBzdHJ1Y3R1cmUgaXRzZWxmIGlzCisgICBkeW5hbWljYWxseSBhbGxvY2F0ZWQsIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBhIG5ldyBsbTg1IGNsaWVudCBpcworICAgYWxsb2NhdGVkLiAqLworCisvKiBMTTg1IGNhbiBhdXRvbWF0aWNhbGx5IGFkanVzdCBmYW4gc3BlZWRzIGJhc2VkIG9uIHRlbXBlcmF0dXJlCisgKiBUaGlzIHN0cnVjdHVyZSBlbmNhcHN1bGF0ZXMgYW4gZW50aXJlIFpvbmUgY29uZmlnLiAgVGhlcmUgYXJlCisgKiB0aHJlZSB6b25lcyAob25lIGZvciBlYWNoIHRlbXBlcmF0dXJlIGlucHV0KSBvbiB0aGUgbG04NQorICovCitzdHJ1Y3QgbG04NV96b25lIHsKKwlzOCBsaW1pdDsJLyogTG93IHRlbXAgbGltaXQgKi8KKwl1OCBoeXN0OwkvKiBMb3cgbGltaXQgaHlzdGVyZXNpcy4gKDAtMTUpICovCisJdTggcmFuZ2U7CS8qIFRlbXAgcmFuZ2UsIGVuY29kZWQgKi8KKwlzOCBjcml0aWNhbDsJLyogIkFsbCBmYW5zIE9OIiB0ZW1wIGxpbWl0ICovCisJdTggb2ZmX2Rlc2lyZWQ7IC8qIEFjdHVhbCAib2ZmIiB0ZW1wZXJhdHVyZSBzcGVjaWZpZWQuICBQcmVzZXJ2ZWQgCisJCQkgKiB0byBwcmV2ZW50ICJkcmlmdCIgYXMgb3RoZXIgYXV0b2ZhbiBjb250cm9sCisJCQkgKiB2YWx1ZXMgY2hhbmdlLgorCQkJICovCisJdTggbWF4X2Rlc2lyZWQ7IC8qIEFjdHVhbCAibWF4IiB0ZW1wZXJhdHVyZSBzcGVjaWZpZWQuICBQcmVzZXJ2ZWQgCisJCQkgKiB0byBwcmV2ZW50ICJkcmlmdCIgYXMgb3RoZXIgYXV0b2ZhbiBjb250cm9sCisJCQkgKiB2YWx1ZXMgY2hhbmdlLgorCQkJICovCit9OworCitzdHJ1Y3QgbG04NV9hdXRvZmFuIHsKKwl1OCBjb25maWc7CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZnJlcTsJLyogUFdNIGZyZXF1ZW5jeSwgZW5jb2RlZCAqLworCXU4IG1pbl9wd207CS8qIE1pbmltdW0gUFdNIHZhbHVlLCBlbmNvZGVkICovCisJdTggbWluX29mZjsJLyogTWluIFBXTSBvciBPRkYgYmVsb3cgImxpbWl0IiwgZmxhZyAqLworfTsKKworc3RydWN0IGxtODVfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwllbnVtIGNoaXBzIHR5cGU7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWludCB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9yZWFkaW5nOwkvKiBJbiBqaWZmaWVzICovCisJdW5zaWduZWQgbG9uZyBsYXN0X2NvbmZpZzsJLyogSW4gamlmZmllcyAqLworCisJdTggaW5bOF07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21heFs4XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluWzhdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX21pblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9tYXhbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfb2Zmc2V0WzNdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiBmYW5bNF07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiBmYW5fbWluWzRdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBwd21bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHNwaW51cF9jdGw7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1OCB0YWNoX21vZGU7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1OCB0ZW1wX2V4dFszXTsJCS8qIERlY29kZWQgdmFsdWVzICovCisJdTggaW5fZXh0WzhdOwkJLyogRGVjb2RlZCB2YWx1ZXMgKi8KKwl1OCBhZGNfc2NhbGU7CQkvKiBBREMgRXh0ZW5kZWQgYml0cyBzY2FsaW5nIGZhY3RvciAqLworCXU4IGZhbl9wcHI7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHNtb290aFszXTsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nICovCisJdTggdmlkOwkJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdnJtOwkJCS8qIFZSTSB2ZXJzaW9uICovCisJdTggc3luY3B3bTM7CQkvKiBTYXZlZCBQV00zIGZvciBUQUNIIDIsMyw0IGNvbmZpZyAqLworCXU4IG9wcG9pbnRbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiB0bWluX2N0bDsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdW5zaWduZWQgbG9uZyB0aGVybV90b3RhbDsgLyogQ3VtbXVsYXRpdmUgdGhlcm0gY291bnQgKi8KKwl1OCB0aGVybV9saW1pdDsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTMyIGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCXN0cnVjdCBsbTg1X2F1dG9mYW4gYXV0b2ZhblszXTsKKwlzdHJ1Y3QgbG04NV96b25lIHpvbmVbM107Cit9OworCitzdGF0aWMgaW50IGxtODVfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgbG04NV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwkJCWludCBraW5kKTsKK3N0YXRpYyBpbnQgbG04NV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgaW50IGxtODVfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3Rlcik7CitzdGF0aWMgaW50IGxtODVfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnaXN0ZXIsIGludCB2YWx1ZSk7CitzdGF0aWMgc3RydWN0IGxtODVfZGF0YSAqbG04NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBsbTg1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTg1X2RyaXZlciA9IHsKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkubmFtZSAgICAgICAgICAgPSAibG04NSIsCisJLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX0xNODUsCisJLmZsYWdzICAgICAgICAgID0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBsbTg1X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50ICA9IGxtODVfZGV0YWNoX2NsaWVudCwKK307CisKKworLyogNCBGYW5zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSkgKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0pICk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fbWluW25yXSA9IEZBTl9UT19SRUcodmFsKTsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfRkFOX01JTihuciksIGRhdGEtPmZhbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzaG93X2Zhbl9vZmZzZXQob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIAkJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9mYW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuXyMjb2Zmc2V0LAlcCisJCU5VTEwpOwkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOworCitzaG93X2Zhbl9vZmZzZXQoMSk7CitzaG93X2Zhbl9vZmZzZXQoMik7CitzaG93X2Zhbl9vZmZzZXQoMyk7CitzaG93X2Zhbl9vZmZzZXQoNCk7CisKKy8qIHZpZCwgdnJtLCBhbGFybXMgKi8KKworc3RhdGljIHNzaXplX3Qgc2hvd192aWRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNwdTBfdmlkLCBTX0lSVUdPLCBzaG93X3ZpZF9yZWcsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3ZybV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgKGxvbmcpIGRhdGEtPnZybSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3ZybV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJZGF0YS0+dnJtID0gdmFsOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHZybSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdnJtX3JlZywgc3RvcmVfdnJtX3JlZyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgQUxBUk1TX0ZST01fUkVHKGRhdGEtPmFsYXJtcykpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtc19yZWcsIE5VTEwpOworCisvKiBwd20gKi8KKworc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgUFdNX0ZST01fUkVHKGRhdGEtPnB3bVtucl0pICk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bVtucl0gPSBQV01fVE9fUkVHKHZhbCk7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX1BXTShuciksIGRhdGEtPnB3bVtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2hvd19wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCWludAlwd21fem9uZTsKKworCXB3bV96b25lID0gWk9ORV9GUk9NX1JFRyhkYXRhLT5hdXRvZmFuW25yXS5jb25maWcpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIChwd21fem9uZSAhPSAwICYmIHB3bV96b25lICE9IC0xKSApOworfQorCisjZGVmaW5lIHNob3dfcHdtX3JlZyhvZmZzZXQpCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19wd21fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3B3bShkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9wd20oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19wd21fZW5hYmxlIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3B3bV9lbmFibGUoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIocHdtIyNvZmZzZXQsIFNfSVJVR08gfCBTX0lXVVNSLCAJCQlcCisJCXNob3dfcHdtXyMjb2Zmc2V0LCBzZXRfcHdtXyMjb2Zmc2V0KTsJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIocHdtIyNvZmZzZXQjI19lbmFibGUsIFNfSVJVR08sIAkJCVwKKwkJc2hvd19wd21fZW5hYmxlIyNvZmZzZXQsIE5VTEwpOworCitzaG93X3B3bV9yZWcoMSk7CitzaG93X3B3bV9yZWcoMik7CitzaG93X3B3bV9yZWcoMyk7CisKKy8qIFZvbHRhZ2VzICovCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoCWJ1ZiwgIiVkXG4iLCBJTlNFWFRfRlJPTV9SRUcobnIsCisJCQkJCQkgICAgIGRhdGEtPmluW25yXSwKKwkJCQkJCSAgICAgZGF0YS0+aW5fZXh0W25yXSwKKwkJCQkJCSAgICAgZGF0YS0+YWRjX3NjYWxlKSApOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgSU5TX0ZST01fUkVHKG5yLCBkYXRhLT5pbl9taW5bbnJdKSApOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9taW5bbnJdID0gSU5TX1RPX1JFRyhuciwgdmFsKTsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfSU5fTUlOKG5yKSwgZGF0YS0+aW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBJTlNfRlJPTV9SRUcobnIsIGRhdGEtPmluX21heFtucl0pICk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21heFtucl0gPSBJTlNfVE9fUkVHKG5yLCB2YWwpOworCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19JTl9NQVgobnIpLCBkYXRhLT5pbl9tYXhbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKyNkZWZpbmUgc2hvd19pbl9yZWcob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2luX21pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2luX21heChkZXYsIGJ1Ziwgb2Zmc2V0KTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfaW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2luXyMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIAkJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9pbl9tYXgoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2luXyMjb2Zmc2V0LCAJXAorCQlOVUxMKTsJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd19pbl8jI29mZnNldCMjX21pbiwgc2V0X2luXyMjb2Zmc2V0IyNfbWluKTsJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfaW5fIyNvZmZzZXQjI19tYXgsIHNldF9pbl8jI29mZnNldCMjX21heCk7CisKK3Nob3dfaW5fcmVnKDApOworc2hvd19pbl9yZWcoMSk7CitzaG93X2luX3JlZygyKTsKK3Nob3dfaW5fcmVnKDMpOworc2hvd19pbl9yZWcoNCk7CisKKy8qIFRlbXBzICovCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QRVhUX0ZST01fUkVHKGRhdGEtPnRlbXBbbnJdLAorCQkJCQkJICAgIGRhdGEtPnRlbXBfZXh0W25yXSwKKwkJCQkJCSAgICBkYXRhLT5hZGNfc2NhbGUpICk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9taW5bbnJdKSApOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWluW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX1RFTVBfTUlOKG5yKSwgZGF0YS0+dGVtcF9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heFtucl0pICk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CQorCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWF4W25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX1RFTVBfTUFYKG5yKSwgZGF0YS0+dGVtcF9tYXhbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKyNkZWZpbmUgc2hvd190ZW1wX3JlZyhvZmZzZXQpCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfdGVtcF9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXBfbWF4KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3RlbXBfbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3RlbXBfbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfIyNvZmZzZXQsCVwKKwkJTlVMTCk7CQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWluLCBzZXRfdGVtcF8jI29mZnNldCMjX21pbik7CVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWF4LCBzZXRfdGVtcF8jI29mZnNldCMjX21heCk7CisKK3Nob3dfdGVtcF9yZWcoMSk7CitzaG93X3RlbXBfcmVnKDIpOworc2hvd190ZW1wX3JlZygzKTsKKworCisvKiBBdXRvbWF0aWMgUFdNIGNvbnRyb2wgKi8KKworc3RhdGljIHNzaXplX3Qgc2hvd19wd21fYXV0b19jaGFubmVscyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBaT05FX0ZST01fUkVHKGRhdGEtPmF1dG9mYW5bbnJdLmNvbmZpZykpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3B3bV9hdXRvX2NoYW5uZWxzKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgICAKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5hdXRvZmFuW25yXS5jb25maWcgPSAoZGF0YS0+YXV0b2Zhbltucl0uY29uZmlnICYgKH4weGUwKSkKKwkJfCBaT05FX1RPX1JFRyh2YWwpIDsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9DT05GSUcobnIpLAorCQlkYXRhLT5hdXRvZmFuW25yXS5jb25maWcpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2hvd19wd21fYXV0b19wd21fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFBXTV9GUk9NX1JFRyhkYXRhLT5hdXRvZmFuW25yXS5taW5fcHdtKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2F1dG9fcHdtX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+YXV0b2Zhbltucl0ubWluX3B3bSA9IFBXTV9UT19SRUcodmFsKTsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9NSU5QV00obnIpLAorCQlkYXRhLT5hdXRvZmFuW25yXS5taW5fcHdtKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcHdtX21pbmN0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBkYXRhLT5hdXRvZmFuW25yXS5taW5fb2ZmKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9wd21fYXV0b19wd21fbWluY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5hdXRvZmFuW25yXS5taW5fb2ZmID0gdmFsOworCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19BRkFOX1NQSUtFMSwgZGF0YS0+c21vb3RoWzBdCisJCXwgZGF0YS0+c3luY3B3bTMKKwkJfCAoZGF0YS0+YXV0b2ZhblswXS5taW5fb2ZmID8gMHgyMCA6IDApCisJCXwgKGRhdGEtPmF1dG9mYW5bMV0ubWluX29mZiA/IDB4NDAgOiAwKQorCQl8IChkYXRhLT5hdXRvZmFuWzJdLm1pbl9vZmYgPyAweDgwIDogMCkKKwkpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2hvd19wd21fYXV0b19wd21fZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBGUkVRX0ZST01fUkVHKGRhdGEtPmF1dG9mYW5bbnJdLmZyZXEpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9wd21fYXV0b19wd21fZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmF1dG9mYW5bbnJdLmZyZXEgPSBGUkVRX1RPX1JFRyh2YWwpOworCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19BRkFOX1JBTkdFKG5yKSwKKwkJKGRhdGEtPnpvbmVbbnJdLnJhbmdlIDw8IDQpCisJCXwgZGF0YS0+YXV0b2Zhbltucl0uZnJlcQorCSk7IAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorI2RlZmluZSBwd21fYXV0byhvZmZzZXQpCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19wd20jI29mZnNldCMjX2F1dG9fY2hhbm5lbHMgKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNoYXIgKmJ1ZikJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19wd21fYXV0b19jaGFubmVscyhkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3B3bSMjb2Zmc2V0IyNfYXV0b19jaGFubmVscyAoc3RydWN0IGRldmljZSAqZGV2LAlcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfcHdtX2F1dG9fY2hhbm5lbHMoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtIyNvZmZzZXQjI19hdXRvX3B3bV9taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNoYXIgKmJ1ZikJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19wd21fYXV0b19wd21fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtIyNvZmZzZXQjI19hdXRvX3B3bV9taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3B3bV9hdXRvX3B3bV9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtIyNvZmZzZXQjI19hdXRvX3B3bV9taW5jdGwgKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNoYXIgKmJ1ZikJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19wd21fYXV0b19wd21fbWluY3RsKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtIyNvZmZzZXQjI19hdXRvX3B3bV9taW5jdGwgKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3B3bV9hdXRvX3B3bV9taW5jdGwoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtIyNvZmZzZXQjI19hdXRvX3B3bV9mcmVxIChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljaGFyICpidWYpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfcHdtX2F1dG9fcHdtX2ZyZXEoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20jI29mZnNldCMjX2F1dG9fcHdtX2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LAlcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfcHdtX2F1dG9fcHdtX2ZyZXEoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20jI29mZnNldCMjX2F1dG9fY2hhbm5lbHMsIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfcHdtIyNvZmZzZXQjI19hdXRvX2NoYW5uZWxzLAkJCVwKKwkJc2V0X3B3bSMjb2Zmc2V0IyNfYXV0b19jaGFubmVscyk7CQkJXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0IyNfYXV0b19wd21fbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fbWluLAkJCVwKKwkJc2V0X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fbWluKTsJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIocHdtIyNvZmZzZXQjI19hdXRvX3B3bV9taW5jdGwsIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfcHdtIyNvZmZzZXQjI19hdXRvX3B3bV9taW5jdGwsCQkJXAorCQlzZXRfcHdtIyNvZmZzZXQjI19hdXRvX3B3bV9taW5jdGwpOwkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20jI29mZnNldCMjX2F1dG9fcHdtX2ZyZXEsIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfcHdtIyNvZmZzZXQjI19hdXRvX3B3bV9mcmVxLAkJCVwKKwkJc2V0X3B3bSMjb2Zmc2V0IyNfYXV0b19wd21fZnJlcSk7ICAgICAgICAgICAgICAKK3B3bV9hdXRvKDEpOworcHdtX2F1dG8oMik7Citwd21fYXV0bygzKTsKKworLyogVGVtcGVyYXR1cmUgc2V0dGluZ3MgZm9yIGF1dG9tYXRpYyBQV00gY29udHJvbCAqLworCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfYXV0b190ZW1wX29mZihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnpvbmVbbnJdLmxpbWl0KSAtCisJCUhZU1RfRlJPTV9SRUcoZGF0YS0+em9uZVtucl0uaHlzdCkpOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfYXV0b190ZW1wX29mZihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgbWluOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwltaW4gPSBURU1QX0ZST01fUkVHKGRhdGEtPnpvbmVbbnJdLmxpbWl0KTsKKwlkYXRhLT56b25lW25yXS5vZmZfZGVzaXJlZCA9IFRFTVBfVE9fUkVHKHZhbCk7CisJZGF0YS0+em9uZVtucl0uaHlzdCA9IEhZU1RfVE9fUkVHKG1pbiAtIHZhbCk7CisJaWYgKCBuciA9PSAwIHx8IG5yID09IDEgKSB7CisJCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19BRkFOX0hZU1QxLAorCQkJKGRhdGEtPnpvbmVbMF0uaHlzdCA8PCA0KQorCQkJfCBkYXRhLT56b25lWzFdLmh5c3QKKwkJCSk7CisJfSBlbHNlIHsKKwkJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fSFlTVDIsCisJCQkoZGF0YS0+em9uZVsyXS5oeXN0IDw8IDQpCisJCSk7CisJfQorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2F1dG9fdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT56b25lW25yXS5saW1pdCkgKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2F1dG9fdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnpvbmVbbnJdLmxpbWl0ID0gVEVNUF9UT19SRUcodmFsKTsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9MSU1JVChuciksCisJCWRhdGEtPnpvbmVbbnJdLmxpbWl0KTsKKworLyogVXBkYXRlIHRlbXBfYXV0b19tYXggYW5kIHRlbXBfYXV0b19yYW5nZSAqLworCWRhdGEtPnpvbmVbbnJdLnJhbmdlID0gUkFOR0VfVE9fUkVHKAorCQlURU1QX0ZST01fUkVHKGRhdGEtPnpvbmVbbnJdLm1heF9kZXNpcmVkKSAtCisJCVRFTVBfRlJPTV9SRUcoZGF0YS0+em9uZVtucl0ubGltaXQpKTsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9SQU5HRShuciksCisJCSgoZGF0YS0+em9uZVtucl0ucmFuZ2UgJiAweDBmKSA8PCA0KQorCQl8IChkYXRhLT5hdXRvZmFuW25yXS5mcmVxICYgMHgwNykpOworCisvKiBVcGRhdGUgdGVtcF9hdXRvX2h5c3QgYW5kIHRlbXBfYXV0b19vZmYgKi8KKwlkYXRhLT56b25lW25yXS5oeXN0ID0gSFlTVF9UT19SRUcoVEVNUF9GUk9NX1JFRygKKwkJZGF0YS0+em9uZVtucl0ubGltaXQpIC0gVEVNUF9GUk9NX1JFRygKKwkJZGF0YS0+em9uZVtucl0ub2ZmX2Rlc2lyZWQpKTsKKwlpZiAoIG5yID09IDAgfHwgbnIgPT0gMSApIHsKKwkJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fSFlTVDEsCisJCQkoZGF0YS0+em9uZVswXS5oeXN0IDw8IDQpCisJCQl8IGRhdGEtPnpvbmVbMV0uaHlzdAorCQkJKTsKKwl9IGVsc2UgeworCQlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9IWVNUMiwKKwkJCShkYXRhLT56b25lWzJdLmh5c3QgPDwgNCkKKwkJKTsKKwl9CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfYXV0b190ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBsbTg1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnpvbmVbbnJdLmxpbWl0KSArCisJCVJBTkdFX0ZST01fUkVHKGRhdGEtPnpvbmVbbnJdLnJhbmdlKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9hdXRvX3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBtaW47CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCW1pbiA9IFRFTVBfRlJPTV9SRUcoZGF0YS0+em9uZVtucl0ubGltaXQpOworCWRhdGEtPnpvbmVbbnJdLm1heF9kZXNpcmVkID0gVEVNUF9UT19SRUcodmFsKTsKKwlkYXRhLT56b25lW25yXS5yYW5nZSA9IFJBTkdFX1RPX1JFRygKKwkJdmFsIC0gbWluKTsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9SQU5HRShuciksCisJCSgoZGF0YS0+em9uZVtucl0ucmFuZ2UgJiAweDBmKSA8PCA0KQorCQl8IChkYXRhLT5hdXRvZmFuW25yXS5mcmVxICYgMHgwNykpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2F1dG9fdGVtcF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGxtODVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+em9uZVtucl0uY3JpdGljYWwpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2F1dG9fdGVtcF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+em9uZVtucl0uY3JpdGljYWwgPSBURU1QX1RPX1JFRyh2YWwpOworCWxtODVfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19BRkFOX0NSSVRJQ0FMKG5yKSwKKwkJZGF0YS0+em9uZVtucl0uY3JpdGljYWwpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorI2RlZmluZSB0ZW1wX2F1dG8ob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX29mZiAoc3RydWN0IGRldmljZSAqZGV2LAlcCisJY2hhciAqYnVmKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXBfYXV0b190ZW1wX29mZihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9vZmYgKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3RlbXBfYXV0b190ZW1wX29mZihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljaGFyICpidWYpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfdGVtcF9hdXRvX3RlbXBfbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX21pbiAoc3RydWN0IGRldmljZSAqZGV2LAlcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfdGVtcF9hdXRvX3RlbXBfbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNoYXIgKmJ1ZikJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wX2F1dG9fdGVtcF9tYXgoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF90ZW1wX2F1dG9fdGVtcF9tYXgoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX2NyaXQgKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNoYXIgKmJ1ZikJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wX2F1dG9fdGVtcF9jcml0KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX2NyaXQgKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X3RlbXBfYXV0b190ZW1wX2NyaXQoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfb2ZmLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X3RlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9vZmYsCQkJXAorCQlzZXRfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX29mZik7CQkJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9taW4sIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfdGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX21pbiwJCQlcCisJCXNldF90ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfbWluKTsJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfYXV0b190ZW1wX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCVwKKwkJc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfbWF4LAkJCVwKKwkJc2V0X3RlbXAjI29mZnNldCMjX2F1dG9fdGVtcF9tYXgpOwkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfY3JpdCwgU19JUlVHTyB8IFNfSVdVU1IsCVwKKwkJc2hvd190ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfY3JpdCwJCQlcCisJCXNldF90ZW1wIyNvZmZzZXQjI19hdXRvX3RlbXBfY3JpdCk7Cit0ZW1wX2F1dG8oMSk7Cit0ZW1wX2F1dG8oMik7Cit0ZW1wX2F1dG8oMyk7CisKK2ludCBsbTg1X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtODVfZGV0ZWN0KTsKK30KKworaW50IGxtODVfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsCisJCWludCBraW5kKQoreworCWludCBjb21wYW55LCB2ZXJzdGVwIDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCA9IE5VTEw7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICp0eXBlX25hbWUgPSAiIjsKKworCWlmIChpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKKwkJLyogVGhpcyBjaGlwIGhhcyBubyBJU0EgaW50ZXJmYWNlICovCisJCWdvdG8gRVJST1IwIDsKKwl9OworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLAorCQkJCQlJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CisJCS8qIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBkbyBieXRlIEkvTyAqLworCQlnb3RvIEVSUk9SMCA7CisJfTsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgbG04NV97cmVhZCx3cml0ZX1fdmFsdWUuICovCisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxtODVfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SMDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbG04NV9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmxtODVfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCisKKwljb21wYW55ID0gbG04NV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODVfUkVHX0NPTVBBTlkpOworCXZlcnN0ZXAgPSBsbTg1X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgTE04NV9SRUdfVkVSU1RFUCk7CisKKwlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJEZXRlY3RpbmcgZGV2aWNlIGF0ICVkLDB4JTAyeCB3aXRoIgorCQkiIENPTVBBTlk6IDB4JTAyeCBhbmQgVkVSU1RFUDogMHglMDJ4XG4iLAorCQlpMmNfYWRhcHRlcl9pZChuZXdfY2xpZW50LT5hZGFwdGVyKSwgbmV3X2NsaWVudC0+YWRkciwKKwkJY29tcGFueSwgdmVyc3RlcCk7CisKKwkvKiBJZiBhdXRvLWRldGVjdGluZywgRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCisJaWYgKGtpbmQgPD0gMCkgeworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJBdXRvZGV0ZWN0aW5nIGRldmljZSBhdCAlZCwweCUwMnggLi4uXG4iLAorCQkJaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGFkZHJlc3MgKTsKKwkJaWYoIGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX05BVElPTkFMCisJCSAgICAmJiB2ZXJzdGVwID09IExNODVfVkVSU1RFUF9MTTg1QyApIHsKKwkJCWtpbmQgPSBsbTg1YyA7CisJCX0gZWxzZSBpZiggY29tcGFueSA9PSBMTTg1X0NPTVBBTllfTkFUSU9OQUwKKwkJICAgICYmIHZlcnN0ZXAgPT0gTE04NV9WRVJTVEVQX0xNODVCICkgeworCQkJa2luZCA9IGxtODViIDsKKwkJfSBlbHNlIGlmKCBjb21wYW55ID09IExNODVfQ09NUEFOWV9OQVRJT05BTAorCQkgICAgJiYgKHZlcnN0ZXAgJiBMTTg1X1ZFUlNURVBfVk1BU0spID09IExNODVfVkVSU1RFUF9HRU5FUklDICkgeworCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiVW5yZWNvZ25pemVkIHZlcnNpb24vc3RlcHBpbmcgMHglMDJ4IgorCQkJCSIgRGVmYXVsdGluZyB0byBMTTg1LlxuIiwgdmVyc3RlcCk7CisJCQlraW5kID0gYW55X2NoaXAgOworCQl9IGVsc2UgaWYoIGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX0FOQUxPR19ERVYKKwkJICAgICYmIHZlcnN0ZXAgPT0gTE04NV9WRVJTVEVQX0FETTEwMjcgKSB7CisJCQlraW5kID0gYWRtMTAyNyA7CisJCX0gZWxzZSBpZiggY29tcGFueSA9PSBMTTg1X0NPTVBBTllfQU5BTE9HX0RFVgorCQkgICAgJiYgKHZlcnN0ZXAgPT0gTE04NV9WRVJTVEVQX0FEVDc0NjMKKwkJCSB8fCB2ZXJzdGVwID09IExNODVfVkVSU1RFUF9BRFQ3NDYzQykgKSB7CisJCQlraW5kID0gYWR0NzQ2MyA7CisJCX0gZWxzZSBpZiggY29tcGFueSA9PSBMTTg1X0NPTVBBTllfQU5BTE9HX0RFVgorCQkgICAgJiYgKHZlcnN0ZXAgJiBMTTg1X1ZFUlNURVBfVk1BU0spID09IExNODVfVkVSU1RFUF9HRU5FUklDICkgeworCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiVW5yZWNvZ25pemVkIHZlcnNpb24vc3RlcHBpbmcgMHglMDJ4IgorCQkJCSIgRGVmYXVsdGluZyB0byBHZW5lcmljIExNODUuXG4iLCB2ZXJzdGVwICk7CisJCQlraW5kID0gYW55X2NoaXAgOworCQl9IGVsc2UgaWYoIGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX1NNU0MKKwkJICAgICYmICh2ZXJzdGVwID09IExNODVfVkVSU1RFUF9FTUM2RDEwMF9BMAorCQkJIHx8IHZlcnN0ZXAgPT0gTE04NV9WRVJTVEVQX0VNQzZEMTAwX0ExKSApIHsKKwkJCS8qIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IHRlbGwgYSAnMTAwIGZyb20gYSAnMTAxCisJCQkgKiBmcm9tIHRoZSByZWdpc3RlcnMuICBTaW5jZSBhICcxMDEgaXMgYSAnMTAwCisJCQkgKiBpbiBhIHBhY2thZ2Ugd2l0aCBmZXdlciBwaW5zIGFuZCB0aGVyZWZvcmUgbm8KKwkJCSAqIDMuM1YsIDEuNVYgb3IgMS44ViBpbnB1dHMsIHBlcmhhcHMgaWYgdGhvc2UKKwkJCSAqIGlucHV0cyByZWFkIDAsIHRoZW4gaXQncyBhICcxMDEuCisJCQkgKi8KKwkJCWtpbmQgPSBlbWM2ZDEwMCA7CisJCX0gZWxzZSBpZiggY29tcGFueSA9PSBMTTg1X0NPTVBBTllfU01TQworCQkgICAgJiYgdmVyc3RlcCA9PSBMTTg1X1ZFUlNURVBfRU1DNkQxMDIpIHsKKwkJCWtpbmQgPSBlbWM2ZDEwMiA7CisJCX0gZWxzZSBpZiggY29tcGFueSA9PSBMTTg1X0NPTVBBTllfU01TQworCQkgICAgJiYgKHZlcnN0ZXAgJiBMTTg1X1ZFUlNURVBfVk1BU0spID09IExNODVfVkVSU1RFUF9HRU5FUklDKSB7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJsbTg1OiBEZXRlY3RlZCBTTVNDIGNoaXBcbiIpOworCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAibG04NTogVW5yZWNvZ25pemVkIHZlcnNpb24vc3RlcHBpbmcgMHglMDJ4IgorCQkJICAgICIgRGVmYXVsdGluZyB0byBHZW5lcmljIExNODUuXG4iLCB2ZXJzdGVwICk7CisJCQlraW5kID0gYW55X2NoaXAgOworCQl9IGVsc2UgaWYoIGtpbmQgPT0gYW55X2NoaXAKKwkJICAgICYmICh2ZXJzdGVwICYgTE04NV9WRVJTVEVQX1ZNQVNLKSA9PSBMTTg1X1ZFUlNURVBfR0VORVJJQykgeworCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiR2VuZXJpYyBMTTg1IFZlcnNpb24gNiBkZXRlY3RlZFxuIik7CisJCQkvKiBMZWF2ZSBraW5kIGFzICJhbnlfY2hpcCIgKi8KKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIkF1dG9kZXRlY3Rpb24gZmFpbGVkXG4iKTsKKwkJCS8qIE5vdCBhbiBMTTg1IC4uLiAqLworCQkJaWYoIGtpbmQgPT0gYW55X2NoaXAgKSB7ICAvKiBVc2VyIHVzZWQgZm9yY2U9eCx5ICovCisJCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiR2VuZXJpYyBMTTg1IFZlcnNpb24gNiBub3QiCisJCQkJCSIgZm91bmQgYXQgJWQsMHglMDJ4LiBUcnkgZm9yY2VfbG04NWMuXG4iLAorCQkJCQlpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgYWRkcmVzcyApOworCQkJfQorCQkJZXJyID0gMCA7CisJCQlnb3RvIEVSUk9SMTsKKwkJfQorCX0KKworCS8qIEZpbGwgaW4gdGhlIGNoaXAgc3BlY2lmaWMgZHJpdmVyIHZhbHVlcyAqLworCWlmICgga2luZCA9PSBhbnlfY2hpcCApIHsKKwkJdHlwZV9uYW1lID0gImxtODUiOworCX0gZWxzZSBpZiAoIGtpbmQgPT0gbG04NWIgKSB7CisJCXR5cGVfbmFtZSA9ICJsbTg1YiI7CisJfSBlbHNlIGlmICgga2luZCA9PSBsbTg1YyApIHsKKwkJdHlwZV9uYW1lID0gImxtODVjIjsKKwl9IGVsc2UgaWYgKCBraW5kID09IGFkbTEwMjcgKSB7CisJCXR5cGVfbmFtZSA9ICJhZG0xMDI3IjsKKwl9IGVsc2UgaWYgKCBraW5kID09IGFkdDc0NjMgKSB7CisJCXR5cGVfbmFtZSA9ICJhZHQ3NDYzIjsKKwl9IGVsc2UgaWYgKCBraW5kID09IGVtYzZkMTAwKXsKKwkJdHlwZV9uYW1lID0gImVtYzZkMTAwIjsKKwl9IGVsc2UgaWYgKCBraW5kID09IGVtYzZkMTAyICkgeworCQl0eXBlX25hbWUgPSAiZW1jNmQxMDIiOworCX0KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIHR5cGVfbmFtZSwgSTJDX05BTUVfU0laRSk7CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyAqLworCWRhdGEtPnR5cGUgPSBraW5kOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gRVJST1IxOworCisJLyogU2V0IHRoZSBWUk0gdmVyc2lvbiAqLworCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKworCS8qIEluaXRpYWxpemUgdGhlIExNODUgY2hpcCAqLworCWxtODVfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuNF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4zX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW40X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xX2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20yX2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20zX2VuYWJsZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdnJtKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2NwdTBfdmlkKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xX2F1dG9fY2hhbm5lbHMpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMl9hdXRvX2NoYW5uZWxzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTNfYXV0b19jaGFubmVscyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xX2F1dG9fcHdtX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20yX2F1dG9fcHdtX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20zX2F1dG9fcHdtX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xX2F1dG9fcHdtX21pbmN0bCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20yX2F1dG9fcHdtX21pbmN0bCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20zX2F1dG9fcHdtX21pbmN0bCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xX2F1dG9fcHdtX2ZyZXEpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMl9hdXRvX3B3bV9mcmVxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTNfYXV0b19wd21fZnJlcSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9hdXRvX3RlbXBfb2ZmKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2F1dG9fdGVtcF9vZmYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfYXV0b190ZW1wX29mZik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9hdXRvX3RlbXBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2F1dG9fdGVtcF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfYXV0b190ZW1wX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9hdXRvX3RlbXBfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2F1dG9fdGVtcF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfYXV0b190ZW1wX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9hdXRvX3RlbXBfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9hdXRvX3RlbXBfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19hdXRvX3RlbXBfY3JpdCk7CisKKwlyZXR1cm4gMDsKKworCS8qIEVycm9yIG91dCBhbmQgY2xlYW51cCBjb2RlICovCisgICAgRVJST1IxOgorCWtmcmVlKGRhdGEpOworICAgIEVSUk9SMDoKKwlyZXR1cm4gZXJyOworfQorCitpbnQgbG04NV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKKworaW50IGxtODVfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJaW50IHJlczsKKworCS8qIFdoYXQgc2l6ZSBsb2NhdGlvbiBpcyBpdD8gKi8KKwlzd2l0Y2goIHJlZyApIHsKKwljYXNlIExNODVfUkVHX0ZBTigwKSA6ICAvKiBSZWFkIFdPUkQgZGF0YSAqLworCWNhc2UgTE04NV9SRUdfRkFOKDEpIDoKKwljYXNlIExNODVfUkVHX0ZBTigyKSA6CisJY2FzZSBMTTg1X1JFR19GQU4oMykgOgorCWNhc2UgTE04NV9SRUdfRkFOX01JTigwKSA6CisJY2FzZSBMTTg1X1JFR19GQU5fTUlOKDEpIDoKKwljYXNlIExNODVfUkVHX0ZBTl9NSU4oMikgOgorCWNhc2UgTE04NV9SRUdfRkFOX01JTigzKSA6CisJY2FzZSBMTTg1X1JFR19BTEFSTTEgOgkvKiBSZWFkIGJvdGggYnl0ZXMgYXQgb25jZSAqLworCQlyZXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpICYgMHhmZiA7CisJCXJlcyB8PSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcrMSkgPDwgOCA7CisJCWJyZWFrIDsKKwljYXNlIEFEVDc0NjNfUkVHX1RNSU5fQ1RMMSA6ICAvKiBSZWFkIFdPUkQgTVNCLCBMU0IgKi8KKwkJcmVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKSA8PCA4IDsKKwkJcmVzIHw9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZysxKSAmIDB4ZmYgOworCQlicmVhayA7CisJZGVmYXVsdDoJLyogUmVhZCBCWVRFIGRhdGEgKi8KKwkJcmVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwkJYnJlYWsgOworCX0KKworCXJldHVybiByZXMgOworfQorCitpbnQgbG04NV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIGludCB2YWx1ZSkKK3sKKwlpbnQgcmVzIDsKKworCXN3aXRjaCggcmVnICkgeworCWNhc2UgTE04NV9SRUdfRkFOKDApIDogIC8qIFdyaXRlIFdPUkQgZGF0YSAqLworCWNhc2UgTE04NV9SRUdfRkFOKDEpIDoKKwljYXNlIExNODVfUkVHX0ZBTigyKSA6CisJY2FzZSBMTTg1X1JFR19GQU4oMykgOgorCWNhc2UgTE04NV9SRUdfRkFOX01JTigwKSA6CisJY2FzZSBMTTg1X1JFR19GQU5fTUlOKDEpIDoKKwljYXNlIExNODVfUkVHX0ZBTl9NSU4oMikgOgorCWNhc2UgTE04NV9SRUdfRkFOX01JTigzKSA6CisJLyogTk9URTogQUxBUk0gaXMgcmVhZCBvbmx5LCBzbyBub3QgaW5jbHVkZWQgaGVyZSAqLworCQlyZXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSAmIDB4ZmYpIDsKKwkJcmVzIHw9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcrMSwgKHZhbHVlPj44KSAmIDB4ZmYpIDsKKwkJYnJlYWsgOworCWNhc2UgQURUNzQ2M19SRUdfVE1JTl9DVEwxIDogIC8qIFdyaXRlIFdPUkQgTVNCLCBMU0IgKi8KKwkJcmVzID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgKHZhbHVlPj44KSAmIDB4ZmYpOworCQlyZXMgfD0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZysxLCB2YWx1ZSAmIDB4ZmYpIDsKKwkJYnJlYWsgOworCWRlZmF1bHQ6CS8qIFdyaXRlIEJZVEUgZGF0YSAqLworCQlyZXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CisJCWJyZWFrIDsKKwl9CisKKwlyZXR1cm4gcmVzIDsKK30KKwordm9pZCBsbTg1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHZhbHVlOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiSW5pdGlhbGl6aW5nIGRldmljZVxuIik7CisKKwkvKiBXYXJuIGlmIHBhcnQgd2FzIG5vdCAiUkVBRFkiICovCisJdmFsdWUgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19DT05GSUcpOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiTE04NV9SRUdfQ09ORklHIGlzOiAweCUwMnhcbiIsIHZhbHVlKTsKKwlpZiggdmFsdWUgJiAweDAyICkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCAoJWQsMHglMDJ4KSBjb25maWcgaXMgbG9ja2VkLlxuIiwKKwkJCSAgICBpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgKTsKKwl9OworCWlmKCAhICh2YWx1ZSAmIDB4MDQpICkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCAoJWQsMHglMDJ4KSBpcyBub3QgcmVhZHkuXG4iLAorCQkJICAgIGkyY19hZGFwdGVyX2lkKGNsaWVudC0+YWRhcHRlciksIGNsaWVudC0+YWRkciApOworCX07CisJaWYoIHZhbHVlICYgMHgxMAorCSAgICAmJiAoIGRhdGEtPnR5cGUgPT0gYWRtMTAyNworCQl8fCBkYXRhLT50eXBlID09IGFkdDc0NjMgKSApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgKCVkLDB4JTAyeCkgVnhJIG1vZGUgaXMgc2V0LiAgIgorCQkJIlBsZWFzZSByZXBvcnQgdGhpcyB0byB0aGUgbG04NSBtYWludGFpbmVyLlxuIiwKKwkJCSAgICBpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgKTsKKwl9OworCisJLyogV0UgSU5URU5USU9OQUxMWSBtYWtlIG5vIGNoYW5nZXMgdG8gdGhlIGxpbWl0cywKKwkgKiAgIG9mZnNldHMsIHB3bXMsIGZhbnMgYW5kIHpvbmVzLiAgSWYgdGhleSB3ZXJlCisJICogICBjb25maWd1cmVkLCB3ZSBkb24ndCB3YW50IHRvIG1lc3Mgd2l0aCB0aGVtLgorCSAqICAgSWYgdGhleSB3ZXJlbid0LCB0aGUgZGVmYXVsdCBpcyAxMDAlIFBXTSwgbm8KKwkgKiAgIGNvbnRyb2wgYW5kIHdpbGwgc3VmZmljZSB1bnRpbCAnc2Vuc29ycyAtcycKKwkgKiAgIGNhbiBiZSBydW4gYnkgdGhlIHVzZXIuCisJICovCisKKwkvKiBTdGFydCBtb25pdG9yaW5nICovCisJdmFsdWUgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19DT05GSUcpOworCS8qIFRyeSB0byBjbGVhciBMT0NLLCBTZXQgU1RBUlQsIHNhdmUgZXZlcnl0aGluZyBlbHNlICovCisJdmFsdWUgPSAodmFsdWUgJiB+IDB4MDIpIHwgMHgwMSA7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTZXR0aW5nIENPTkZJRyB0bzogMHglMDJ4XG4iLCB2YWx1ZSk7CisJbG04NV93cml0ZV92YWx1ZShjbGllbnQsIExNODVfUkVHX0NPTkZJRywgdmFsdWUpOworfQorCitzdGF0aWMgc3RydWN0IGxtODVfZGF0YSAqbG04NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICggIWRhdGEtPnZhbGlkIHx8CisJICAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfcmVhZGluZyArIExNODVfREFUQV9JTlRFUlZBTCkgKSB7CisJCS8qIFRoaW5ncyB0aGF0IGNoYW5nZSBxdWlja2x5ICovCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUmVhZGluZyBzZW5zb3IgdmFsdWVzXG4iKTsKKwkJCisJCS8qIEhhdmUgdG8gcmVhZCBleHRlbmRlZCBiaXRzIGZpcnN0IHRvICJmcmVlemUiIHRoZQorCQkgKiBtb3JlIHNpZ25pZmljYW50IGJpdHMgdGhhdCBhcmUgcmVhZCBsYXRlci4KKwkJICovCisJCWlmICggKGRhdGEtPnR5cGUgPT0gYWRtMTAyNykgfHwgKGRhdGEtPnR5cGUgPT0gYWR0NzQ2MykgKSB7CisJCQlpbnQgZXh0MSA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICBBRE0xMDI3X1JFR19FWFRFTkRfQURDMSk7CisJCQlpbnQgZXh0MiA9ICBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJICAgIEFETTEwMjdfUkVHX0VYVEVORF9BREMyKTsKKwkJCWludCB2YWwgPSAoZXh0MSA8PCA4KSArIGV4dDI7CisKKwkJCWZvcihpID0gMDsgaSA8PSA0OyBpKyspCisJCQkJZGF0YS0+aW5fZXh0W2ldID0gKHZhbD4+KGkgKiAyKSkmMHgwMzsKKworCQkJZm9yKGkgPSAwOyBpIDw9IDI7IGkrKykKKwkJCQlkYXRhLT50ZW1wX2V4dFtpXSA9ICh2YWw+PigoaSArIDUpICogMikpJjB4MDM7CisJCX0KKworCQkvKiBhZGNfc2NhbGUgaXMgMl4obnVtYmVyIG9mIExTQnMpLiBUaGVyZSBhcmUgNCBleHRyYSBiaXRzIGluCisJCSAgIHRoZSBlbWM2ZDEwMiBhbmQgMiBpbiB0aGUgYWR0NzQ2MyBhbmQgYWRtMTAyNy4gSW4gYWxsCisJCSAgIG90aGVyIGNoaXBzIGV4dCBpcyBhbHdheXMgMCBhbmQgdGhlIHZhbHVlIG9mIHNjYWxlIGlzCisJCSAgIGlycmVsZXZhbnQuIFNvIGl0IGlzIGxlZnQgaW4gNCovCisJCWRhdGEtPmFkY19zY2FsZSA9IChkYXRhLT50eXBlID09IGVtYzZkMTAyICkgPyAxNiA6IDQ7CisKKwkJZm9yIChpID0gMDsgaSA8PSA0OyArK2kpIHsKKwkJCWRhdGEtPmluW2ldID0KKwkJCSAgICBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19JTihpKSk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDw9IDM7ICsraSkgeworCQkJZGF0YS0+ZmFuW2ldID0KKwkJCSAgICBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19GQU4oaSkpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8PSAyOyArK2kpIHsKKwkJCWRhdGEtPnRlbXBbaV0gPQorCQkJICAgIGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX1RFTVAoaSkpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8PSAyOyArK2kpIHsKKwkJCWRhdGEtPnB3bVtpXSA9CisJCQkgICAgbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfUFdNKGkpKTsKKwkJfQorCisJCWRhdGEtPmFsYXJtcyA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0FMQVJNMSk7CisKKwkJaWYgKCBkYXRhLT50eXBlID09IGFkdDc0NjMgKSB7CisJCQlpZiggZGF0YS0+dGhlcm1fdG90YWwgPCBVTE9OR19NQVggLSAyNTYgKSB7CisJCQkgICAgZGF0YS0+dGhlcm1fdG90YWwgKz0KKwkJCQlsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBBRFQ3NDYzX1JFR19USEVSTSApOworCQkJfQorCQl9IGVsc2UgaWYgKCBkYXRhLT50eXBlID09IGVtYzZkMTAwICkgeworCQkJLyogVGhyZWUgbW9yZSB2b2x0YWdlIHNlbnNvcnMgKi8KKwkJCWZvciAoaSA9IDU7IGkgPD0gNzsgKytpKSB7CisJCQkJZGF0YS0+aW5baV0gPQorCQkJCQlsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBFTUM2RDEwMF9SRUdfSU4oaSkpOworCQkJfQorCQkJLyogTW9yZSBhbGFybSBiaXRzICovCisJCQlkYXRhLT5hbGFybXMgfD0KKwkJCQlsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBFTUM2RDEwMF9SRUdfQUxBUk0zKSA8PCAxNjsKKwkJfSBlbHNlIGlmIChkYXRhLT50eXBlID09IGVtYzZkMTAyICkgeworCQkJLyogSGF2ZSB0byByZWFkIExTQiBiaXRzIGFmdGVyIHRoZSBNU0Igb25lcyBiZWNhdXNlCisJCQkgICB0aGUgcmVhZGluZyBvZiB0aGUgTVNCIGJpdHMgaGFzIGZyb3plbiB0aGUKKwkJCSAgIExTQnMgKGJhY2t3YXJkIGZyb20gdGhlIEFETTEwMjcpLgorCQkJICovCisJCQlpbnQgZXh0MSA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICBFTUM2RDEwMl9SRUdfRVhURU5EX0FEQzEpOworCQkJaW50IGV4dDIgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJICAgRU1DNkQxMDJfUkVHX0VYVEVORF9BREMyKTsKKwkJCWludCBleHQzID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgIEVNQzZEMTAyX1JFR19FWFRFTkRfQURDMyk7CisJCQlpbnQgZXh0NCA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICBFTUM2RDEwMl9SRUdfRVhURU5EX0FEQzQpOworCQkJZGF0YS0+aW5fZXh0WzBdID0gZXh0MyAmIDB4MGY7CisJCQlkYXRhLT5pbl9leHRbMV0gPSBleHQ0ICYgMHgwZjsKKwkJCWRhdGEtPmluX2V4dFsyXSA9IChleHQ0ID4+IDQpICYgMHgwZjsKKwkJCWRhdGEtPmluX2V4dFszXSA9IChleHQzID4+IDQpICYgMHgwZjsKKwkJCWRhdGEtPmluX2V4dFs0XSA9IChleHQyID4+IDQpICYgMHgwZjsKKworCQkJZGF0YS0+dGVtcF9leHRbMF0gPSBleHQxICYgMHgwZjsKKwkJCWRhdGEtPnRlbXBfZXh0WzFdID0gZXh0MiAmIDB4MGY7CisJCQlkYXRhLT50ZW1wX2V4dFsyXSA9IChleHQxID4+IDQpICYgMHgwZjsKKwkJfQorCisJCWRhdGEtPmxhc3RfcmVhZGluZyA9IGppZmZpZXMgOworCX07ICAvKiBsYXN0X3JlYWRpbmcgKi8KKworCWlmICggIWRhdGEtPnZhbGlkIHx8CisJICAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfY29uZmlnICsgTE04NV9DT05GSUdfSU5URVJWQUwpICkgeworCQkvKiBUaGluZ3MgdGhhdCBkb24ndCBjaGFuZ2Ugb2Z0ZW4gKi8KKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJSZWFkaW5nIGNvbmZpZyB2YWx1ZXNcbiIpOworCisJCWZvciAoaSA9IDA7IGkgPD0gNDsgKytpKSB7CisJCQlkYXRhLT5pbl9taW5baV0gPQorCQkJICAgIGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0lOX01JTihpKSk7CisJCQlkYXRhLT5pbl9tYXhbaV0gPQorCQkJICAgIGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0lOX01BWChpKSk7CisJCX0KKworCQlpZiAoIGRhdGEtPnR5cGUgPT0gZW1jNmQxMDAgKSB7CisJCQlmb3IgKGkgPSA1OyBpIDw9IDc7ICsraSkgeworCQkJCWRhdGEtPmluX21pbltpXSA9CisJCQkJCWxtODVfcmVhZF92YWx1ZShjbGllbnQsIEVNQzZEMTAwX1JFR19JTl9NSU4oaSkpOworCQkJCWRhdGEtPmluX21heFtpXSA9CisJCQkJCWxtODVfcmVhZF92YWx1ZShjbGllbnQsIEVNQzZEMTAwX1JFR19JTl9NQVgoaSkpOworCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8PSAzOyArK2kpIHsKKwkJCWRhdGEtPmZhbl9taW5baV0gPQorCQkJICAgIGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0ZBTl9NSU4oaSkpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8PSAyOyArK2kpIHsKKwkJCWRhdGEtPnRlbXBfbWluW2ldID0KKwkJCSAgICBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19URU1QX01JTihpKSk7CisJCQlkYXRhLT50ZW1wX21heFtpXSA9CisJCQkgICAgbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfVEVNUF9NQVgoaSkpOworCQl9CisKKwkJZGF0YS0+dmlkID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfVklEKTsKKworCQlmb3IgKGkgPSAwOyBpIDw9IDI7ICsraSkgeworCQkJaW50IHZhbCA7CisJCQlkYXRhLT5hdXRvZmFuW2ldLmNvbmZpZyA9CisJCQkgICAgbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9DT05GSUcoaSkpOworCQkJdmFsID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9SQU5HRShpKSk7CisJCQlkYXRhLT5hdXRvZmFuW2ldLmZyZXEgPSB2YWwgJiAweDA3IDsKKwkJCWRhdGEtPnpvbmVbaV0ucmFuZ2UgPSAodmFsID4+IDQpICYgMHgwZiA7CisJCQlkYXRhLT5hdXRvZmFuW2ldLm1pbl9wd20gPQorCQkJICAgIGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fTUlOUFdNKGkpKTsKKwkJCWRhdGEtPnpvbmVbaV0ubGltaXQgPQorCQkJICAgIGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX0FGQU5fTElNSVQoaSkpOworCQkJZGF0YS0+em9uZVtpXS5jcml0aWNhbCA9CisJCQkgICAgbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9DUklUSUNBTChpKSk7CisJCX0KKworCQlpID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9TUElLRTEpOworCQlkYXRhLT5zbW9vdGhbMF0gPSBpICYgMHgwZiA7CisJCWRhdGEtPnN5bmNwd20zID0gaSAmIDB4MTAgOyAgLyogU2F2ZSBQV00zIGNvbmZpZyAqLworCQlkYXRhLT5hdXRvZmFuWzBdLm1pbl9vZmYgPSAoaSAmIDB4MjApICE9IDAgOworCQlkYXRhLT5hdXRvZmFuWzFdLm1pbl9vZmYgPSAoaSAmIDB4NDApICE9IDAgOworCQlkYXRhLT5hdXRvZmFuWzJdLm1pbl9vZmYgPSAoaSAmIDB4ODApICE9IDAgOworCQlpID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9TUElLRTIpOworCQlkYXRhLT5zbW9vdGhbMV0gPSAoaT4+NCkgJiAweDBmIDsKKwkJZGF0YS0+c21vb3RoWzJdID0gaSAmIDB4MGYgOworCisJCWkgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg1X1JFR19BRkFOX0hZU1QxKTsKKwkJZGF0YS0+em9uZVswXS5oeXN0ID0gKGk+PjQpICYgMHgwZiA7CisJCWRhdGEtPnpvbmVbMV0uaHlzdCA9IGkgJiAweDBmIDsKKworCQlpID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9IWVNUMik7CisJCWRhdGEtPnpvbmVbMl0uaHlzdCA9IChpPj40KSAmIDB4MGYgOworCisJCWlmICggKGRhdGEtPnR5cGUgPT0gbG04NWIpIHx8IChkYXRhLT50eXBlID09IGxtODVjKSApIHsKKwkJCWRhdGEtPnRhY2hfbW9kZSA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJTE04NV9SRUdfVEFDSF9NT0RFICk7CisJCQlkYXRhLT5zcGludXBfY3RsID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlMTTg1X1JFR19TUElOVVBfQ1RMICk7CisJCX0gZWxzZSBpZiAoIChkYXRhLT50eXBlID09IGFkdDc0NjMpIHx8IChkYXRhLT50eXBlID09IGFkbTEwMjcpICkgeworCQkJaWYgKCBkYXRhLT50eXBlID09IGFkdDc0NjMgKSB7CisJCQkJZm9yIChpID0gMDsgaSA8PSAyOyArK2kpIHsKKwkJCQkgICAgZGF0YS0+b3Bwb2ludFtpXSA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCUFEVDc0NjNfUkVHX09QUE9JTlQoaSkgKTsKKwkJCQl9CisJCQkJZGF0YS0+dG1pbl9jdGwgPSBsbTg1X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQlBRFQ3NDYzX1JFR19UTUlOX0NUTDEgKTsKKwkJCQlkYXRhLT50aGVybV9saW1pdCA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCUFEVDc0NjNfUkVHX1RIRVJNX0xJTUlUICk7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDw9IDI7ICsraSkgeworCQkJICAgIGRhdGEtPnRlbXBfb2Zmc2V0W2ldID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlBRE0xMDI3X1JFR19URU1QX09GRlNFVChpKSApOworCQkJfQorCQkJZGF0YS0+dGFjaF9tb2RlID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlBRE0xMDI3X1JFR19DT05GSUczICk7CisJCQlkYXRhLT5mYW5fcHByID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlBRE0xMDI3X1JFR19GQU5fUFBSICk7CisJCX0KKwkKKwkJZGF0YS0+bGFzdF9jb25maWcgPSBqaWZmaWVzOworCX07ICAvKiBsYXN0X2NvbmZpZyAqLworCisJZGF0YS0+dmFsaWQgPSAxOworCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHNtX2xtODVfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbG04NV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCAgX19leGl0IHNtX2xtODVfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsbTg1X2RyaXZlcik7Cit9CisKKy8qIFRoYW5rcyB0byBSaWNoYXJkIEJhcnJpbmd0b24gZm9yIGFkZGluZyB0aGUgTE04NSB0byBzZW5zb3JzLWRldGVjdC4KKyAqIFRoYW5rcyB0byBNYXJnaXQgU2NodWJlcnQtV2hpbGUgPG1hcmdpdHN3QHQtb25saW5lLmRlPiBmb3IgaGVscCB3aXRoCisgKiAgICAgcG9zdCAyLjcuMCBDVlMgY2hhbmdlcy4KKyAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGhpbGlwIFBva29ybnkgPHBwb2tvcm55QHBlbmd1aW5jb21wdXRpbmcuY29tPiwgTWFyZ2l0IFNjaHViZXJ0LVdoaWxlIDxtYXJnaXRzd0B0LW9ubGluZS5kZT4sIEp1c3RpbiBUaGllc3NlbiA8anRoaWVzc2VuQHBlbmd1aW5jb21wdXRpbmcuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxNODUtQiwgTE04NS1DIGRyaXZlciIpOworCittb2R1bGVfaW5pdChzbV9sbTg1X2luaXQpOworbW9kdWxlX2V4aXQoc21fbG04NV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtODcuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtODcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGNhYmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbG04Ny5jCkBAIC0wLDAgKzEsODI5IEBACisvKgorICogbG04Ny5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICAgICAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RlcGhlbiBSb3Vzc2V0IDxzdGVwaGVuLnJvdXNzZXRAcm9ja2V0bG9naXguY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgIERhbiBFYXRvbiA8ZGFuLmVhdG9uQHJvY2tldGxvZ2l4LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNCAgICAgICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqCisgKiBPcmlnaW5hbCBwb3J0IHRvIExpbnV4IDIuNiBieSBKZWZmIE9saXZlci4KKyAqCisgKiBUaGUgTE04NyBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTmF0aW9uYWwgU2VtaWNvbmR1Y3Rvci4gSXQgbW9uaXRvcnMgdXAKKyAqIHRvIDggdm9sdGFnZXMgKGluY2x1ZGluZyBpdHMgb3duIHBvd2VyIHNvdXJjZSksIHVwIHRvIHRocmVlIHRlbXBlcmF0dXJlcworICogKGl0cyBvd24gcGx1cyB1cCB0byB0d28gZXh0ZXJuYWwgb25lcykgYW5kIHVwIHRvIHR3byBmYW5zLiBUaGUgZGVmYXVsdAorICogY29uZmlndXJhdGlvbiBpcyA2IHZvbHRhZ2VzLCB0d28gdGVtcGVyYXR1cmVzIGFuZCB0d28gZmFucyAoc2VlIGJlbG93KS4KKyAqIFZvbHRhZ2VzIGFyZSBzY2FsZWQgaW50ZXJuYWxseSB3aXRoIHJhdGlvcyBzdWNoIHRoYXQgdGhlIG5vbWluYWwgdmFsdWUgb2YKKyAqIGVhY2ggdm9sdGFnZSBjb3JyZXNwb25kIHRvIGEgcmVnaXN0ZXIgdmFsdWUgb2YgMTkyICh3aGljaCBtZWFucyBhCisgKiByZXNvbHV0aW9uIG9mIGFib3V0IDAuNSUgb2YgdGhlIG5vbWluYWwgdmFsdWUpLiBUZW1wZXJhdHVyZSB2YWx1ZXMgYXJlCisgKiByZXBvcnRlZCB3aXRoIGEgMSBkZWcgcmVzb2x1dGlvbiBhbmQgYSAzLTQgZGVnIGFjY3VyYWN5LiBDb21wbGV0ZQorICogZGF0YXNoZWV0IGNhbiBiZSBvYnRhaW5lZCBmcm9tIE5hdGlvbmFsJ3Mgd2Vic2l0ZSBhdDoKKyAqICAgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE04Ny5odG1sCisgKgorICogU29tZSBmdW5jdGlvbnMgc2hhcmUgcGlucywgc28gbm90IGFsbCBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBhdCB0aGUgc2FtZQorICogdGltZS4gV2hpY2ggYXJlIGRlcGVuZHMgb24gdGhlIGhhcmR3YXJlIHNldHVwLiBUaGlzIGRyaXZlciBhc3N1bWVzIHRoYXQKKyAqIHRoZSBCSU9TIGNvbmZpZ3VyZWQgdGhlIGNoaXAgY29ycmVjdGx5LiBJbiB0aGF0IHJlc3BlY3QsIGl0ICBkaWZmZXJzIGZyb20KKyAqIHRoZSBvcmlnaW5hbCBkcml2ZXIgKGZyb20gbG1fc2Vuc29ycyBmb3IgTGludXggMi40KSwgd2hpY2ggd291bGQgZm9yY2UgdGhlCisgKiBMTTg3IHRvIGFuIGFyYml0cmFyeSwgY29tcGlsZS10aW1lIGNob3NlbiBtb2RlLCByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwKKyAqIGNoaXBzZXQgd2lyaW5nLgorICogRm9yIHJlZmVyZW5jZSwgaGVyZSBpcyB0aGUgbGlzdCBvZiBleGNsdXNpdmUgZnVuY3Rpb25zOgorICogIC0gaW4wK2luNSAoZGVmYXVsdCkgb3IgdGVtcDMKKyAqICAtIGZhbjEgKGRlZmF1bHQpIG9yIGluNgorICogIC0gZmFuMiAoZGVmYXVsdCkgb3IgaW43CisgKiAgLSBWSUQgbGluZXMgKGRlZmF1bHQpIG9yIElSUSBsaW5lcyAobm90IGhhbmRsZWQgYnkgdGhpcyBkcml2ZXIpCisgKgorICogVGhlIExNODcgYWRkaXRpb25hbGx5IGZlYXR1cmVzIGFuIGFuYWxvZyBvdXRwdXQsIHN1cHBvc2VkbHkgdXNhYmxlIHRvCisgKiBjb250cm9sIHRoZSBzcGVlZCBvZiBhIGZhbi4gQWxsIG5ldyBjaGlwcyB1c2UgcHVsc2Ugd2lkdGggbW9kdWxhdGlvbgorICogaW5zdGVhZC4gVGhlIExNODcgaXMgdGhlIG9ubHkgaGFyZHdhcmUgbW9uaXRvcmluZyBjaGlwc2V0IEkga25vdyBvZgorICogd2hpY2ggdXNlcyBhbXBsaXR1ZGUgbW9kdWxhdGlvbi4gQmUgY2FyZWZ1bCB3aGVuIHVzaW5nIHRoaXMgZmVhdHVyZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKworLyoKKyAqIEFkZHJlc3NlcyB0byBzY2FuCisgKiBMTTg3IGhhcyB0aHJlZSBwb3NzaWJsZSBhZGRyZXNzZXM6IDB4MmMsIDB4MmQgYW5kIDB4MmUuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyYywgMHgyZCwgMHgyZSwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyoKKyAqIEluc21vZCBwYXJhbWV0ZXJzCisgKi8KKworU0VOU09SU19JTlNNT0RfMShsbTg3KTsKKworLyoKKyAqIFRoZSBMTTg3IHJlZ2lzdGVycworICovCisKKy8qIG5yIGluIDAuLjUgKi8KKyNkZWZpbmUgTE04N19SRUdfSU4obnIpCQkJKDB4MjAgKyAobnIpKQorI2RlZmluZSBMTTg3X1JFR19JTl9NQVgobnIpCQkoMHgyQiArIChucikgKiAyKQorI2RlZmluZSBMTTg3X1JFR19JTl9NSU4obnIpCQkoMHgyQyArIChucikgKiAyKQorLyogbnIgaW4gMC4uMSAqLworI2RlZmluZSBMTTg3X1JFR19BSU4obnIpCQkoMHgyOCArIChucikpCisjZGVmaW5lIExNODdfUkVHX0FJTl9NSU4obnIpCQkoMHgxQSArIChucikpCisjZGVmaW5lIExNODdfUkVHX0FJTl9NQVgobnIpCQkoMHgzQiArIChucikpCisKK3N0YXRpYyB1OCBMTTg3X1JFR19URU1QWzNdID0geyAweDI3LCAweDI2LCAweDIwIH07CitzdGF0aWMgdTggTE04N19SRUdfVEVNUF9ISUdIWzNdID0geyAweDM5LCAweDM3LCAweDJCIH07CitzdGF0aWMgdTggTE04N19SRUdfVEVNUF9MT1dbM10gPSB7IDB4M0EsIDB4MzgsIDB4MkMgfTsKKworI2RlZmluZSBMTTg3X1JFR19URU1QX0hXX0lOVF9MT0NLCTB4MTMKKyNkZWZpbmUgTE04N19SRUdfVEVNUF9IV19FWFRfTE9DSwkweDE0CisjZGVmaW5lIExNODdfUkVHX1RFTVBfSFdfSU5UCQkweDE3CisjZGVmaW5lIExNODdfUkVHX1RFTVBfSFdfRVhUCQkweDE4CisKKy8qIG5yIGluIDAuLjEgKi8KKyNkZWZpbmUgTE04N19SRUdfRkFOKG5yKQkJKDB4MjggKyAobnIpKQorI2RlZmluZSBMTTg3X1JFR19GQU5fTUlOKG5yKQkJKDB4M0IgKyAobnIpKQorI2RlZmluZSBMTTg3X1JFR19BT1VUCQkJMHgxOQorCisjZGVmaW5lIExNODdfUkVHX0NPTkZJRwkJCTB4NDAKKyNkZWZpbmUgTE04N19SRUdfQ0hBTk5FTF9NT0RFCQkweDE2CisjZGVmaW5lIExNODdfUkVHX1ZJRF9GQU5fRElWCQkweDQ3CisjZGVmaW5lIExNODdfUkVHX1ZJRDQJCQkweDQ5CisKKyNkZWZpbmUgTE04N19SRUdfQUxBUk1TMQkJMHg0MQorI2RlZmluZSBMTTg3X1JFR19BTEFSTVMyCQkweDQyCisKKyNkZWZpbmUgTE04N19SRUdfQ09NUEFOWV9JRAkJMHgzRQorI2RlZmluZSBMTTg3X1JFR19SRVZJU0lPTgkJMHgzRgorCisvKgorICogQ29udmVyc2lvbnMgYW5kIHZhcmlvdXMgbWFjcm9zCisgKiBUaGUgTE04NyB1c2VzIHNpZ25lZCA4LWJpdCB2YWx1ZXMgZm9yIHRlbXBlcmF0dXJlcy4KKyAqLworCisjZGVmaW5lIElOX0ZST01fUkVHKHJlZyxzY2FsZSkJKCgocmVnKSAqIChzY2FsZSkgKyA5NikgLyAxOTIpCisjZGVmaW5lIElOX1RPX1JFRyh2YWwsc2NhbGUpCSgodmFsKSA8PSAwID8gMCA6IFwKKwkJCQkgKHZhbCkgKiAxOTIgPj0gKHNjYWxlKSAqIDI1NSA/IDI1NSA6IFwKKwkJCQkgKCh2YWwpICogMTkyICsgKHNjYWxlKS8yKSAvIChzY2FsZSkpCisKKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyhyZWcpCSgocmVnKSAqIDEwMDApCisjZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkJKCh2YWwpIDw9IC0xMjc1MDAgPyAtMTI4IDogXAorCQkJCSAodmFsKSA+PSAxMjY1MDAgPyAxMjcgOiBcCisJCQkJICgoKHZhbCkgPCAwID8gKHZhbCktNTAwIDogKHZhbCkrNTAwKSAvIDEwMDApKQorCisjZGVmaW5lIEZBTl9GUk9NX1JFRyhyZWcsZGl2KQkoKHJlZykgPT0gMjU1IHx8IChyZWcpID09IDAgPyAwIDogXAorCQkJCSAxMzUwMDAwICsgKHJlZykqKGRpdikgLyAyKSAvICgocmVnKSooZGl2KSkKKyNkZWZpbmUgRkFOX1RPX1JFRyh2YWwsZGl2KQkoKHZhbCkqKGRpdikgKiAyNTUgPD0gMTM1MDAwMCA/IDI1NSA6IFwKKwkJCQkgKDEzNTAwMDAgKyAodmFsKSooZGl2KSAvIDIpIC8gKCh2YWwpKihkaXYpKSkKKworI2RlZmluZSBGQU5fRElWX0ZST01fUkVHKHJlZykJKDEgPDwgKHJlZykpCisKKy8qIGFuYWxvZyBvdXQgaXMgOS44MG1WL0xTQiAqLworI2RlZmluZSBBT1VUX0ZST01fUkVHKHJlZykJKCgocmVnKSAqIDk4ICsgNSkgLyAxMCkKKyNkZWZpbmUgQU9VVF9UT19SRUcodmFsKQkoKHZhbCkgPD0gMCA/IDAgOiBcCisJCQkJICh2YWwpID49IDI1MDAgPyAyNTUgOiBcCisJCQkJICgodmFsKSAqIDEwICsgNDkpIC8gOTgpCisKKy8qIG5yIGluIDAuLjEgKi8KKyNkZWZpbmUgQ0hBTl9OT19GQU4obnIpCQkoMSA8PCAobnIpKQorI2RlZmluZSBDSEFOX1RFTVAzCQkoMSA8PCAyKQorI2RlZmluZSBDSEFOX1ZDQ181VgkJKDEgPDwgMykKKyNkZWZpbmUgQ0hBTl9OT19WSUQJCSgxIDw8IDgpCisKKy8qCisgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworCitzdGF0aWMgaW50IGxtODdfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgbG04N19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIHZvaWQgbG04N19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgbG04N19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHN0cnVjdCBsbTg3X2RhdGEgKmxtODdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisvKgorICogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykKKyAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG04N19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJsbTg3IiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX0xNODcsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gbG04N19hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGxtODdfZGV0YWNoX2NsaWVudCwKK307CisKKy8qCisgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQorICovCisKK3N0cnVjdCBsbTg3X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogSW4gamlmZmllcyAqLworCisJdTggY2hhbm5lbDsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisKKwl1OCBpbls4XTsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzhdOwkJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bOF07CQkvKiByZWdpc3RlciB2YWx1ZSAqLworCXUxNiBpbl9zY2FsZVs4XTsKKworCXM4IHRlbXBbM107CQkvKiByZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfaGlnaFszXTsJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX2xvd1szXTsJCS8qIHJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9jcml0X2ludDsJLyogbWluIG9mIHR3byByZWdpc3RlciB2YWx1ZXMgKi8KKwlzOCB0ZW1wX2NyaXRfZXh0OwkvKiBtaW4gb2YgdHdvIHJlZ2lzdGVyIHZhbHVlcyAqLworCisJdTggZmFuWzJdOwkJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fbWluWzJdOwkJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2WzJdOwkJLyogcmVnaXN0ZXIgdmFsdWUsIHNoaWZ0ZWQgcmlnaHQgKi8KKwl1OCBhb3V0OwkJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKworCXUxNiBhbGFybXM7CQkvKiByZWdpc3RlciB2YWx1ZXMsIGNvbWJpbmVkICovCisJdTggdmlkOwkJCS8qIHJlZ2lzdGVyIHZhbHVlcywgY29tYmluZWQgKi8KKwl1OCB2cm07Cit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBsbTg3X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbTg3X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworI2RlZmluZSBzaG93X2luKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IyNfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbltvZmZzZXRdLCBcCisJCSAgICAgICBkYXRhLT5pbl9zY2FsZVtvZmZzZXRdKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWluW29mZnNldF0sIFwKKwkJICAgICAgIGRhdGEtPmluX3NjYWxlW29mZnNldF0pKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2luIyNvZmZzZXQjI19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9tYXhbb2Zmc2V0XSwgXAorCQkgICAgICAgZGF0YS0+aW5fc2NhbGVbb2Zmc2V0XSkpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwkJc2hvd19pbiMjb2Zmc2V0IyNfaW5wdXQsIE5VTEwpOworc2hvd19pbigwKTsKK3Nob3dfaW4oMSk7CitzaG93X2luKDIpOworc2hvd19pbigzKTsKK3Nob3dfaW4oNCk7CitzaG93X2luKDUpOworc2hvd19pbig2KTsKK3Nob3dfaW4oNyk7CisKK3N0YXRpYyB2b2lkIHNldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fbWluW25yXSA9IElOX1RPX1JFRyh2YWwsIGRhdGEtPmluX3NjYWxlW25yXSk7CisJbG04N193cml0ZV92YWx1ZShjbGllbnQsIG5yPDYgPyBMTTg3X1JFR19JTl9NSU4obnIpIDoKKwkJCSBMTTg3X1JFR19BSU5fTUlOKG5yLTYpLCBkYXRhLT5pbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21heFtucl0gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl9zY2FsZVtucl0pOworCWxtODdfd3JpdGVfdmFsdWUoY2xpZW50LCBucjw2ID8gTE04N19SRUdfSU5fTUFYKG5yKSA6CisJCQkgTE04N19SRUdfQUlOX01BWChuci02KSwgZGF0YS0+aW5fbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKK30KKworI2RlZmluZSBzZXRfaW4ob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXNldF9pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzZXRfaW5fbWF4KGRldiwgYnVmLCBvZmZzZXQpOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X2luIyNvZmZzZXQjI19taW4sIHNldF9pbiMjb2Zmc2V0IyNfbWluKTsgXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfaW4jI29mZnNldCMjX21heCwgc2V0X2luIyNvZmZzZXQjI19tYXgpOworc2V0X2luKDApOworc2V0X2luKDEpOworc2V0X2luKDIpOworc2V0X2luKDMpOworc2V0X2luKDQpOworc2V0X2luKDUpOworc2V0X2luKDYpOworc2V0X2luKDcpOworCisjZGVmaW5lIHNob3dfdGVtcChvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBbb2Zmc2V0LTFdKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19sb3coc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbG93W29mZnNldC0xXSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGxtODdfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9oaWdoW29mZnNldC0xXSkpOyBcCit9XAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCisJCXNob3dfdGVtcCMjb2Zmc2V0IyNfaW5wdXQsIE5VTEwpOworc2hvd190ZW1wKDEpOworc2hvd190ZW1wKDIpOworc2hvd190ZW1wKDMpOworCitzdGF0aWMgdm9pZCBzZXRfdGVtcF9sb3coc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9sb3dbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVEVNUF9MT1dbbnJdLCBkYXRhLT50ZW1wX2xvd1tucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF90ZW1wX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9oaWdoW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX1RFTVBfSElHSFtucl0sIGRhdGEtPnRlbXBfaGlnaFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7Cit9CisKKyNkZWZpbmUgc2V0X3RlbXAob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwgXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJc2V0X3RlbXBfbG93KGRldiwgYnVmLCBvZmZzZXQtMSk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LCBcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzZXRfdGVtcF9oaWdoKGRldiwgYnVmLCBvZmZzZXQtMSk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd190ZW1wIyNvZmZzZXQjI19oaWdoLCBzZXRfdGVtcCMjb2Zmc2V0IyNfaGlnaCk7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfdGVtcCMjb2Zmc2V0IyNfbG93LCBzZXRfdGVtcCMjb2Zmc2V0IyNfbG93KTsKK3NldF90ZW1wKDEpOworc2V0X3RlbXAoMik7CitzZXRfdGVtcCgzKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2NyaXRfaW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2NyaXRfaW50KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9jcml0X2V4dChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9jcml0X2V4dCkpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaW50LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9jcml0LCBTX0lSVUdPLCBzaG93X3RlbXBfY3JpdF9leHQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX2NyaXQsIFNfSVJVR08sIHNob3dfdGVtcF9jcml0X2V4dCwgTlVMTCk7CisKKyNkZWZpbmUgc2hvd19mYW4ob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbiMjb2Zmc2V0IyNfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW29mZnNldC0xXSwgXAorCQkgICAgICAgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W29mZnNldC0xXSkpKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbiMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bb2Zmc2V0LTFdLCBcCisJCSAgICAgICBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbb2Zmc2V0LTFdKSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQjI19kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbb2Zmc2V0LTFdKSk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwkJc2hvd19mYW4jI29mZnNldCMjX2lucHV0LCBOVUxMKTsKK3Nob3dfZmFuKDEpOworc2hvd19mYW4oMik7CisKK3N0YXRpYyB2b2lkIHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsCisJCQkgICAgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCWxtODdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19GQU5fTUlOKG5yKSwgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7Cit9CisKKy8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCisgICBkZXRlcm1pbmVkIGluIHBhcnQgYnkgdGhlIGZhbiBjbG9jayBkaXZpZGVyLiAgVGhpcyBmb2xsb3dzIHRoZSBwcmluY2lwbGUKKyAgIG9mIGxlYXN0IHN1cHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAorICAgYmVjYXVzZSB0aGUgZGl2aWRlciBjaGFuZ2VkLiAqLworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIG1pbjsKKwl1OCByZWc7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJbWluID0gRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLAorCQkJICAgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6IGRhdGEtPmZhbl9kaXZbbnJdID0gMDsgYnJlYWs7CisJY2FzZSAyOiBkYXRhLT5mYW5fZGl2W25yXSA9IDE7IGJyZWFrOworCWNhc2UgNDogZGF0YS0+ZmFuX2Rpdltucl0gPSAyOyBicmVhazsKKwljYXNlIDg6IGRhdGEtPmZhbl9kaXZbbnJdID0gMzsgYnJlYWs7CisJZGVmYXVsdDoKKwkJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVnID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVklEX0ZBTl9ESVYpOworCXN3aXRjaCAobnIpIHsKKwljYXNlIDA6CisJICAgIHJlZyA9IChyZWcgJiAweENGKSB8IChkYXRhLT5mYW5fZGl2WzBdIDw8IDQpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIHJlZyA9IChyZWcgJiAweDNGKSB8IChkYXRhLT5mYW5fZGl2WzFdIDw8IDYpOworCSAgICBicmVhazsKKwl9CisJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX1ZJRF9GQU5fRElWLCByZWcpOworCisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKG1pbiwgdmFsKTsKKwlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfRkFOX01JTihuciksCisJCQkgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc2V0X2ZhbihvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCQlzaXplX3QgY291bnQpIFwKK3sgXAorCXNldF9mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQtMSk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X2ZhbiMjb2Zmc2V0IyNfZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJCXNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHNldF9mYW5fZGl2KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0LTEpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19mYW4jI29mZnNldCMjX21pbiwgc2V0X2ZhbiMjb2Zmc2V0IyNfbWluKTsgXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X2ZhbiMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuIyNvZmZzZXQjI19kaXYpOworc2V0X2ZhbigxKTsKK3NldF9mYW4oMik7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YWxhcm1zKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd192aWQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGxtODdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihjcHUwX3ZpZCwgU19JUlVHTywgc2hvd192aWQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gbG04N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnZybSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJZGF0YS0+dnJtID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKHZybSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdnJtLCBzZXRfdnJtKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19hb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBsbTg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgQU9VVF9GUk9NX1JFRyhkYXRhLT5hb3V0KSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfYW91dChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5hb3V0ID0gQU9VVF9UT19SRUcodmFsKTsKKwlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfQU9VVCwgZGF0YS0+YW91dCk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYW91dF9vdXRwdXQsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2FvdXQsIHNldF9hb3V0KTsKKworLyoKKyAqIFJlYWwgY29kZQorICovCisKK3N0YXRpYyBpbnQgbG04N19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTg3X2RldGVjdCk7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRvZXMgbW9yZSB0aGFuIGp1c3QgZGV0ZWN0aW9uLiBJZiBkZXRlY3Rpb24KKyAqIHN1Y2NlZWRzLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbmV3IGNoaXAuCisgKi8KK3N0YXRpYyBpbnQgbG04N19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJZ290byBleGl0OworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbTg3X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBsbTg3X2RhdGEpKTsKKworCS8qIFRoZSBjb21tb24gSTJDIGNsaWVudCBkYXRhIGlzIHBsYWNlZCByaWdodCBiZWZvcmUgdGhlCisJICAgTE04Ny1zcGVjaWZpYyBkYXRhLiAqLworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmbG04N19kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogRGVmYXVsdCB0byBhbiBMTTg3IGlmIGZvcmNlZCAqLworCWlmIChraW5kID09IDApCisJCWtpbmQgPSBsbTg3OworCisJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJdTggcmV2ID0gbG04N19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODdfUkVHX1JFVklTSU9OKTsKKworCQlpZiAocmV2IDwgMHgwMSB8fCByZXYgPiAweDA4CisJCSB8fCAobG04N19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODdfUkVHX0NPTkZJRykgJiAweDgwKQorCQkgfHwgbG04N19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODdfUkVHX0NPTVBBTllfSUQpICE9IDB4MDIpIHsKKwkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKKwkJCQkiTE04NyBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeC5cbiIsCisJCQkJYWRkcmVzcyk7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCX0KKworCS8qIFdlIGNhbiBmaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImxtODciLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCS8qIEluaXRpYWxpemUgdGhlIExNODcgY2hpcCAqLworCWxtODdfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwlkYXRhLT5pbl9zY2FsZVswXSA9IDI1MDA7CisJZGF0YS0+aW5fc2NhbGVbMV0gPSAyNzAwOworCWRhdGEtPmluX3NjYWxlWzJdID0gKGRhdGEtPmNoYW5uZWwgJiBDSEFOX1ZDQ181VikgPyA1MDAwIDogMzMwMDsKKwlkYXRhLT5pbl9zY2FsZVszXSA9IDUwMDA7CisJZGF0YS0+aW5fc2NhbGVbNF0gPSAxMjAwMDsKKwlkYXRhLT5pbl9zY2FsZVs1XSA9IDI3MDA7CisJZGF0YS0+aW5fc2NhbGVbNl0gPSAxODc1OworCWRhdGEtPmluX3NjYWxlWzddID0gMTg3NTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKKworCWlmIChkYXRhLT5jaGFubmVsICYgQ0hBTl9OT19GQU4oMCkpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9tYXgpOworCX0gZWxzZSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfZGl2KTsKKwl9CisJaWYgKGRhdGEtPmNoYW5uZWwgJiBDSEFOX05PX0ZBTigxKSkgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luN19pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW43X21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW43X21heCk7CisJfSBlbHNlIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9kaXYpOworCX0KKworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfY3JpdCk7CisKKwlpZiAoZGF0YS0+Y2hhbm5lbCAmIENIQU5fVEVNUDMpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2NyaXQpOworCX0gZWxzZSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9tYXgpOworCX0KKworCWlmICghKGRhdGEtPmNoYW5uZWwgJiBDSEFOX05PX1ZJRCkpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdnJtKTsKKwl9CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hb3V0X291dHB1dCk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBsbTg3X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXU4IGNvbmZpZzsKKworCWRhdGEtPmNoYW5uZWwgPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19DSEFOTkVMX01PREUpOworCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKworCWNvbmZpZyA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsIExNODdfUkVHX0NPTkZJRyk7CisJaWYgKCEoY29uZmlnICYgMHgwMSkpIHsKKwkJaW50IGk7CisKKwkJLyogTGltaXRzIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQgYWZ0ZXIgcG93ZXItdXAgKi8KKwkJZm9yIChpID0gMTsgaSA8IDY7IGkrKykgeworCQkJbG04N193cml0ZV92YWx1ZShjbGllbnQsIExNODdfUkVHX0lOX01JTihpKSwgMHgwMCk7CisJCQlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfSU5fTUFYKGkpLCAweEZGKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVEVNUF9ISUdIW2ldLCAweDdGKTsKKwkJCWxtODdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19URU1QX0xPV1tpXSwgMHgwMCk7CisJCQlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfQUlOX01JTihpKSwgMHgwMCk7CisJCQlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfQUlOX01BWChpKSwgMHhGRik7CisJCX0KKwkJaWYgKGRhdGEtPmNoYW5uZWwgJiBDSEFOX1RFTVAzKSB7CisJCQlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVEVNUF9ISUdIWzJdLCAweDdGKTsKKwkJCWxtODdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19URU1QX0xPV1syXSwgMHgwMCk7CisJCX0gZWxzZSB7CisJCQlsbTg3X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfSU5fTUlOKDApLCAweDAwKTsKKwkJCWxtODdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19JTl9NQVgoMCksIDB4RkYpOworCQl9CisJfQorCWlmICgoY29uZmlnICYgMHg4MSkgIT0gMHgwMSkgeworCQkvKiBTdGFydCBtb25pdG9yaW5nICovCisJCWxtODdfd3JpdGVfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19DT05GSUcsCisJCQkJIChjb25maWcgJiAweEY3KSB8IDB4MDEpOworCX0KK30KKworc3RhdGljIGludCBsbTg3X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxtODdfZGF0YSAqbG04N191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJaW50IGksIGo7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBkYXRhLlxuIik7CisKKwkJaSA9IChkYXRhLT5jaGFubmVsICYgQ0hBTl9URU1QMykgPyAxIDogMDsKKwkJaiA9IChkYXRhLT5jaGFubmVsICYgQ0hBTl9URU1QMykgPyA1IDogNjsKKwkJZm9yICg7IGkgPCBqOyBpKyspIHsKKwkJCWRhdGEtPmluW2ldID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkgICAgICBMTTg3X1JFR19JTihpKSk7CisJCQlkYXRhLT5pbl9taW5baV0gPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgIExNODdfUkVHX0lOX01JTihpKSk7CisJCQlkYXRhLT5pbl9tYXhbaV0gPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgIExNODdfUkVHX0lOX01BWChpKSk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlpZiAoZGF0YS0+Y2hhbm5lbCAmIENIQU5fTk9fRkFOKGkpKSB7CisJCQkJZGF0YS0+aW5bNitpXSA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlMTTg3X1JFR19BSU4oaSkpOworCQkJCWRhdGEtPmluX21heFs2K2ldID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgICBMTTg3X1JFR19BSU5fTUFYKGkpKTsKKwkJCQlkYXRhLT5pbl9taW5bNitpXSA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICAgTE04N19SRUdfQUlOX01JTihpKSk7CisKKwkJCX0gZWxzZSB7CisJCQkJZGF0YS0+ZmFuW2ldID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIExNODdfUkVHX0ZBTihpKSk7CisJCQkJZGF0YS0+ZmFuX21pbltpXSA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICBMTTg3X1JFR19GQU5fTUlOKGkpKTsKKwkJCX0KKwkJfQorCisJCWogPSAoZGF0YS0+Y2hhbm5lbCAmIENIQU5fVEVNUDMpID8gMyA6IDI7CisJCWZvciAoaSA9IDAgOyBpIDwgajsgaSsrKSB7CisJCQlkYXRhLT50ZW1wW2ldID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJTE04N19SRUdfVEVNUFtpXSk7CisJCQlkYXRhLT50ZW1wX2hpZ2hbaV0gPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgIExNODdfUkVHX1RFTVBfSElHSFtpXSk7CisJCQlkYXRhLT50ZW1wX2xvd1tpXSA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICBMTTg3X1JFR19URU1QX0xPV1tpXSk7CisJCX0KKworCQlpID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVEVNUF9IV19JTlRfTE9DSyk7CisJCWogPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19URU1QX0hXX0lOVCk7CisJCWRhdGEtPnRlbXBfY3JpdF9pbnQgPSBtaW4oaSwgaik7CisKKwkJaSA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsIExNODdfUkVHX1RFTVBfSFdfRVhUX0xPQ0spOworCQlqID0gbG04N19yZWFkX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVEVNUF9IV19FWFQpOworCQlkYXRhLT50ZW1wX2NyaXRfZXh0ID0gbWluKGksIGopOworCisJCWkgPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19WSURfRkFOX0RJVik7CisJCWRhdGEtPmZhbl9kaXZbMF0gPSAoaSA+PiA0KSAmIDB4MDM7CisJCWRhdGEtPmZhbl9kaXZbMV0gPSAoaSA+PiA2KSAmIDB4MDM7CisJCWRhdGEtPnZpZCA9IChpICYgMHgwRikKKwkJCSAgfCAobG04N19yZWFkX3ZhbHVlKGNsaWVudCwgTE04N19SRUdfVklENCkgJiAweDAxKQorCQkJICAgICA8PCA0OworCisJCWRhdGEtPmFsYXJtcyA9IGxtODdfcmVhZF92YWx1ZShjbGllbnQsIExNODdfUkVHX0FMQVJNUzEpCisJCQkgICAgIHwgKGxtODdfcmVhZF92YWx1ZShjbGllbnQsIExNODdfUkVHX0FMQVJNUzIpCisJCQkJPDwgOCk7CisJCWRhdGEtPmFvdXQgPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19BT1VUKTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2xtODdfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbG04N19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19sbTg3X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG04N19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4gYW5kIG90aGVycyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTg3IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2xtODdfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2xtODdfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTkwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTkwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMwMGZmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2xtOTAuYwpAQCAtMCwwICsxLDYyNiBAQAorLyoKKyAqIGxtOTAuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgKiAgICAgICAgICBtb25pdG9yaW5nCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogQmFzZWQgb24gdGhlIGxtODMgZHJpdmVyLiBUaGUgTE05MCBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTmF0aW9uYWwKKyAqIFNlbWljb25kdWN0b3IuIEl0IHJlcG9ydHMgdXAgdG8gdHdvIHRlbXBlcmF0dXJlcyAoaXRzIG93biBwbHVzIHVwIHRvCisgKiBvbmUgZXh0ZXJuYWwgb25lKSB3aXRoIGEgMC4xMjUgZGVnIHJlc29sdXRpb24gKDEgZGVnIGZvciBsb2NhbAorICogdGVtcGVyYXR1cmUpIGFuZCBhIDMtNCBkZWcgYWNjdXJhY3kuIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUKKyAqIG9idGFpbmVkIGZyb20gTmF0aW9uYWwncyB3ZWJzaXRlIGF0OgorICogICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTkwLmh0bWwKKyAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBMTTg5IGFuZCBMTTk5LCB0d28gb3RoZXIgc2Vuc29yIGNoaXBzCisgKiBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3IuIEJvdGggaGF2ZSBhbiBpbmNyZWFzZWQgcmVtb3RlCisgKiB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCBhY2N1cmFjeSAoMSBkZWdyZWUpLCBhbmQgdGhlIExNOTkKKyAqIGFkZGl0aW9uYWxseSBzaGlmdHMgcmVtb3RlIHRlbXBlcmF0dXJlcyAobWVhc3VyZWQgYW5kIGxpbWl0cykgYnkgMTYKKyAqIGRlZ3JlZXMsIHdoaWNoIGFsbG93cyBmb3IgaGlnaGVyIHRlbXBlcmF0dXJlcyBtZWFzdXJlbWVudC4gVGhlCisgKiBkcml2ZXIgZG9lc24ndCBoYW5kbGUgaXQgc2luY2UgaXQgY2FuIGJlIGRvbmUgZWFzaWx5IGluIHVzZXItc3BhY2UuCisgKiBDb21wbGV0ZSBkYXRhc2hlZXRzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIE5hdGlvbmFsJ3Mgd2Vic2l0ZSBhdDoKKyAqICAgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE04OS5odG1sCisgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNOTkuaHRtbAorICogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHdheSB0byBkaWZmZXJlbmNpYXRlIGJldHdlZW4gYm90aCBjaGlwcy4KKyAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBMTTg2LCBhbm90aGVyIHNlbnNvciBjaGlwIG1hZGUgYnkKKyAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IuIEl0IGlzIGV4YWN0bHkgc2ltaWxhciB0byB0aGUgTE05MCBleGNlcHQgaXQKKyAqIGhhcyBhIGhpZ2hlciBhY2N1cmFjeS4KKyAqIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNODYuaHRtbAorICoKKyAqIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIEFETTEwMzIsIGEgc2Vuc29yIGNoaXAgbWFkZSBieSBBbmFsb2cKKyAqIERldmljZXMuIFRoYXQgY2hpcCBpcyBzaW1pbGFyIHRvIHRoZSBMTTkwLCB3aXRoIGEgZmV3IGRpZmZlcmVuY2VzCisgKiB0aGF0IGFyZSBub3QgaGFuZGxlZCBieSB0aGlzIGRyaXZlci4gQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZQorICogb2J0YWluZWQgZnJvbSBBbmFsb2cncyB3ZWJzaXRlIGF0OgorICogICBodHRwOi8vcHJvZHVjdHMuYW5hbG9nLmNvbS9wcm9kdWN0cy9pbmZvLmFzcD9wcm9kdWN0PUFETTEwMzIKKyAqIEFtb25nIG90aGVycywgaXQgaGFzIGEgaGlnaGVyIGFjY3VyYWN5IHRoYW4gdGhlIExNOTAsIG11Y2ggbGlrZSB0aGUKKyAqIExNODYgZG9lcy4KKyAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBNQVg2NjU3LCBNQVg2NjU4IGFuZCBNQVg2NjU5IHNlbnNvcgorICogY2hpcHMgbWFkZSBieSBNYXhpbS4gVGhlc2UgY2hpcHMgYXJlIHNpbWlsYXIgdG8gdGhlIExNODYuIENvbXBsZXRlCisgKiBkYXRhc2hlZXQgY2FuIGJlIG9idGFpbmVkIGF0IE1heGltJ3Mgd2Vic2l0ZSBhdDoKKyAqICAgaHR0cDovL3d3dy5tYXhpbS1pYy5jb20vcXVpY2tfdmlldzIuY2ZtL3F2X3BrLzI1NzgKKyAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBkaWZmZXJlbmNpYXRlIGJldHdlZW4gdGhlIHRocmVlCisgKiB2YXJpYW50cy4gVGhlIGV4dHJhIGFkZHJlc3MgYW5kIGZlYXR1cmVzIG9mIHRoZSBNQVg2NjU5IGFyZSBub3QKKyAqIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKyAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBBRFQ3NDYxIGNoaXAgZnJvbSBBbmFsb2cgRGV2aWNlcyBidXQKKyAqIG9ubHkgaW4gaXRzICJjb21wYXRhYmlsaXR5IG1vZGUiLiBJZiBhbiBBRFQ3NDYxIGNoaXAgaXMgZm91bmQgYnV0CisgKiBpcyBjb25maWd1cmVkIGluIG5vbi1jb21wYXRpYmxlIG1vZGUgKHdoZXJlIGl0cyB0ZW1wZXJhdHVyZQorICogcmVnaXN0ZXIgdmFsdWVzIGFyZSBkZWNvZGVkIGRpZmZlcmVudGx5KSBpdCBpcyBpZ25vcmVkIGJ5IHRoaXMKKyAqIGRyaXZlci4gQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZSBvYnRhaW5lZCBmcm9tIEFuYWxvZydzIHdlYnNpdGUKKyAqIGF0OgorICogICBodHRwOi8vcHJvZHVjdHMuYW5hbG9nLmNvbS9wcm9kdWN0cy9pbmZvLmFzcD9wcm9kdWN0PUFEVDc0NjEKKyAqCisgKiBTaW5jZSB0aGUgTE05MCB3YXMgdGhlIGZpcnN0IGNoaXBzZXQgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLCBtb3N0CisgKiBjb21tZW50cyB3aWxsIHJlZmVyIHRvIHRoaXMgY2hpcHNldCwgYnV0IGFyZSBhY3R1YWxseSBnZW5lcmFsIGFuZAorICogY29uY2VybiBhbGwgc3VwcG9ydGVkIGNoaXBzZXRzLCB1bmxlc3MgbWVudGlvbmVkIG90aGVyd2lzZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorCisvKgorICogQWRkcmVzc2VzIHRvIHNjYW4KKyAqIEFkZHJlc3MgaXMgZnVsbHkgZGVmaW5lZCBpbnRlcm5hbGx5IGFuZCBjYW5ub3QgYmUgY2hhbmdlZCBleGNlcHQgZm9yCisgKiBNQVg2NjU5LgorICogTE04NiwgTE04OSwgTE05MCwgTE05OSwgQURNMTAzMiwgTUFYNjY1NyBhbmQgTUFYNjY1OCBoYXZlIGFkZHJlc3MgMHg0Yy4KKyAqIExNODktMSwgYW5kIExNOTktMSBoYXZlIGFkZHJlc3MgMHg0ZC4KKyAqIE1BWDY2NTkgY2FuIGhhdmUgYWRkcmVzcyAweDRjLCAweDRkIG9yIDB4NGUgKHVuc3VwcG9ydGVkKS4KKyAqIEFEVDc0NjEgYWx3YXlzIGhhcyBhZGRyZXNzIDB4NGMuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg0YywgMHg0ZCwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyoKKyAqIEluc21vZCBwYXJhbWV0ZXJzCisgKi8KKworU0VOU09SU19JTlNNT0RfNihsbTkwLCBhZG0xMDMyLCBsbTk5LCBsbTg2LCBtYXg2NjU3LCBhZHQ3NDYxKTsKKworLyoKKyAqIFRoZSBMTTkwIHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgTE05MF9SRUdfUl9NQU5fSUQJCTB4RkUKKyNkZWZpbmUgTE05MF9SRUdfUl9DSElQX0lECQkweEZGCisjZGVmaW5lIExNOTBfUkVHX1JfQ09ORklHMQkJMHgwMworI2RlZmluZSBMTTkwX1JFR19XX0NPTkZJRzEJCTB4MDkKKyNkZWZpbmUgTE05MF9SRUdfUl9DT05GSUcyCQkweEJGCisjZGVmaW5lIExNOTBfUkVHX1dfQ09ORklHMgkJMHhCRgorI2RlZmluZSBMTTkwX1JFR19SX0NPTlZSQVRFCQkweDA0CisjZGVmaW5lIExNOTBfUkVHX1dfQ09OVlJBVEUJCTB4MEEKKyNkZWZpbmUgTE05MF9SRUdfUl9TVEFUVVMJCTB4MDIKKyNkZWZpbmUgTE05MF9SRUdfUl9MT0NBTF9URU1QCQkweDAwCisjZGVmaW5lIExNOTBfUkVHX1JfTE9DQUxfSElHSAkJMHgwNQorI2RlZmluZSBMTTkwX1JFR19XX0xPQ0FMX0hJR0gJCTB4MEIKKyNkZWZpbmUgTE05MF9SRUdfUl9MT0NBTF9MT1cJCTB4MDYKKyNkZWZpbmUgTE05MF9SRUdfV19MT0NBTF9MT1cJCTB4MEMKKyNkZWZpbmUgTE05MF9SRUdfUl9MT0NBTF9DUklUCQkweDIwCisjZGVmaW5lIExNOTBfUkVHX1dfTE9DQUxfQ1JJVAkJMHgyMAorI2RlZmluZSBMTTkwX1JFR19SX1JFTU9URV9URU1QSAkJMHgwMQorI2RlZmluZSBMTTkwX1JFR19SX1JFTU9URV9URU1QTAkJMHgxMAorI2RlZmluZSBMTTkwX1JFR19SX1JFTU9URV9PRkZTSAkJMHgxMQorI2RlZmluZSBMTTkwX1JFR19XX1JFTU9URV9PRkZTSAkJMHgxMQorI2RlZmluZSBMTTkwX1JFR19SX1JFTU9URV9PRkZTTAkJMHgxMgorI2RlZmluZSBMTTkwX1JFR19XX1JFTU9URV9PRkZTTAkJMHgxMgorI2RlZmluZSBMTTkwX1JFR19SX1JFTU9URV9ISUdISAkJMHgwNworI2RlZmluZSBMTTkwX1JFR19XX1JFTU9URV9ISUdISAkJMHgwRAorI2RlZmluZSBMTTkwX1JFR19SX1JFTU9URV9ISUdITAkJMHgxMworI2RlZmluZSBMTTkwX1JFR19XX1JFTU9URV9ISUdITAkJMHgxMworI2RlZmluZSBMTTkwX1JFR19SX1JFTU9URV9MT1dICQkweDA4CisjZGVmaW5lIExNOTBfUkVHX1dfUkVNT1RFX0xPV0gJCTB4MEUKKyNkZWZpbmUgTE05MF9SRUdfUl9SRU1PVEVfTE9XTAkJMHgxNAorI2RlZmluZSBMTTkwX1JFR19XX1JFTU9URV9MT1dMCQkweDE0CisjZGVmaW5lIExNOTBfUkVHX1JfUkVNT1RFX0NSSVQJCTB4MTkKKyNkZWZpbmUgTE05MF9SRUdfV19SRU1PVEVfQ1JJVAkJMHgxOQorI2RlZmluZSBMTTkwX1JFR19SX1RDUklUX0hZU1QJCTB4MjEKKyNkZWZpbmUgTE05MF9SRUdfV19UQ1JJVF9IWVNUCQkweDIxCisKKy8qCisgKiBDb252ZXJzaW9ucyBhbmQgdmFyaW91cyBtYWNyb3MKKyAqIEZvciBsb2NhbCB0ZW1wZXJhdHVyZXMgYW5kIGxpbWl0cywgY3JpdGljYWwgbGltaXRzIGFuZCB0aGUgaHlzdGVyZXNpcworICogdmFsdWUsIHRoZSBMTTkwIHVzZXMgc2lnbmVkIDgtYml0IHZhbHVlcyB3aXRoIExTQiA9IDEgZGVncmVlIENlbGNpdXMuCisgKiBGb3IgcmVtb3RlIHRlbXBlcmF0dXJlcyBhbmQgbGltaXRzLCBpdCB1c2VzIHNpZ25lZCAxMS1iaXQgdmFsdWVzIHdpdGgKKyAqIExTQiA9IDAuMTI1IGRlZ3JlZSBDZWxjaXVzLCBsZWZ0LWp1c3RpZmllZCBpbiAxNi1iaXQgcmVnaXN0ZXJzLgorICovCisKKyNkZWZpbmUgVEVNUDFfRlJPTV9SRUcodmFsKQkoKHZhbCkgKiAxMDAwKQorI2RlZmluZSBURU1QMV9UT19SRUcodmFsKQkoKHZhbCkgPD0gLTEyODAwMCA/IC0xMjggOiBcCisJCQkJICh2YWwpID49IDEyNzAwMCA/IDEyNyA6IFwKKwkJCQkgKHZhbCkgPCAwID8gKCh2YWwpIC0gNTAwKSAvIDEwMDAgOiBcCisJCQkJICgodmFsKSArIDUwMCkgLyAxMDAwKQorI2RlZmluZSBURU1QMl9GUk9NX1JFRyh2YWwpCSgodmFsKSAvIDMyICogMTI1KQorI2RlZmluZSBURU1QMl9UT19SRUcodmFsKQkoKHZhbCkgPD0gLTEyODAwMCA/IDB4ODAwMCA6IFwKKwkJCQkgKHZhbCkgPj0gMTI3ODc1ID8gMHg3RkUwIDogXAorCQkJCSAodmFsKSA8IDAgPyAoKHZhbCkgLSA2MikgLyAxMjUgKiAzMiA6IFwKKwkJCQkgKCh2YWwpICsgNjIpIC8gMTI1ICogMzIpCisjZGVmaW5lIEhZU1RfVE9fUkVHKHZhbCkJKCh2YWwpIDw9IDAgPyAwIDogKHZhbCkgPj0gMzA1MDAgPyAzMSA6IFwKKwkJCQkgKCh2YWwpICsgNTAwKSAvIDEwMDApCisKKy8qIAorICogQURUNzQ2MSBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIExNOTAgZXhjZXB0IHRoYXQgYXR0ZW1wdHMgdG8gd3JpdGUKKyAqIHZhbHVlcyB0aGF0IGFyZSBvdXRzaWRlIHRoZSByYW5nZSAwIDwgdGVtcCA8IDEyNyBhcmUgdHJlYXRlZCBhcworICogdGhlIGJvdW5kYXJ5IHZhbHVlLiAKKyAqLworCisjZGVmaW5lIFRFTVAxX1RPX1JFR19BRFQ3NDYxKHZhbCkgKCh2YWwpIDw9IDAgPyAwIDogXAorCQkJCSAodmFsKSA+PSAxMjcwMDAgPyAxMjcgOiBcCisJCQkJICgodmFsKSArIDUwMCkgLyAxMDAwKQorI2RlZmluZSBURU1QMl9UT19SRUdfQURUNzQ2MSh2YWwpICgodmFsKSA8PSAwID8gMCA6IFwKKwkJCQkgKHZhbCkgPj0gMTI3NzUwID8gMHg3RkMwIDogXAorCQkJCSAoKHZhbCkgKyAxMjUpIC8gMjUwICogNjQpCisKKy8qCisgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworCitzdGF0aWMgaW50IGxtOTBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgbG05MF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwlpbnQga2luZCk7CitzdGF0aWMgdm9pZCBsbTkwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBsbTkwX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgc3RydWN0IGxtOTBfZGF0YSAqbG05MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qCisgKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKQorICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTkwX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImxtOTAiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfTE05MCwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBsbTkwX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gbG05MF9kZXRhY2hfY2xpZW50LAorfTsKKworLyoKKyAqIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pCisgKi8KKworc3RydWN0IGxtOTBfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCisJaW50IGtpbmQ7CisKKwkvKiByZWdpc3RlcnMgdmFsdWVzICovCisJczggdGVtcF9pbnB1dDEsIHRlbXBfbG93MSwgdGVtcF9oaWdoMTsgLyogbG9jYWwgKi8KKwlzMTYgdGVtcF9pbnB1dDIsIHRlbXBfbG93MiwgdGVtcF9oaWdoMjsgLyogcmVtb3RlLCBjb21iaW5lZCAqLworCXM4IHRlbXBfY3JpdDEsIHRlbXBfY3JpdDI7CisJdTggdGVtcF9oeXN0OworCXU4IGFsYXJtczsgLyogYml0dmVjdG9yICovCit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCisjZGVmaW5lIHNob3dfdGVtcCh2YWx1ZSwgY29udmVydGVyKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjb252ZXJ0ZXIoZGF0YS0+dmFsdWUpKTsgXAorfQorc2hvd190ZW1wKHRlbXBfaW5wdXQxLCBURU1QMV9GUk9NX1JFRyk7CitzaG93X3RlbXAodGVtcF9pbnB1dDIsIFRFTVAyX0ZST01fUkVHKTsKK3Nob3dfdGVtcCh0ZW1wX2xvdzEsIFRFTVAxX0ZST01fUkVHKTsKK3Nob3dfdGVtcCh0ZW1wX2xvdzIsIFRFTVAyX0ZST01fUkVHKTsKK3Nob3dfdGVtcCh0ZW1wX2hpZ2gxLCBURU1QMV9GUk9NX1JFRyk7CitzaG93X3RlbXAodGVtcF9oaWdoMiwgVEVNUDJfRlJPTV9SRUcpOworc2hvd190ZW1wKHRlbXBfY3JpdDEsIFRFTVAxX0ZST01fUkVHKTsKK3Nob3dfdGVtcCh0ZW1wX2NyaXQyLCBURU1QMV9GUk9NX1JFRyk7CisKKyNkZWZpbmUgc2V0X3RlbXAxKHZhbHVlLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEpIFwKKwkJZGF0YS0+dmFsdWUgPSBURU1QMV9UT19SRUdfQURUNzQ2MSh2YWwpOyBcCisJZWxzZSBcCisJCWRhdGEtPnZhbHVlID0gVEVNUDFfVE9fUkVHKHZhbCk7IFwKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCBkYXRhLT52YWx1ZSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CisjZGVmaW5lIHNldF90ZW1wMih2YWx1ZSwgcmVnaCwgcmVnbCkgXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwlzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSkgXAorCQlkYXRhLT52YWx1ZSA9IFRFTVAyX1RPX1JFR19BRFQ3NDYxKHZhbCk7IFwKKwllbHNlIFwKKwkJZGF0YS0+dmFsdWUgPSBURU1QMl9UT19SRUcodmFsKTsgXAorCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdoLCBkYXRhLT52YWx1ZSA+PiA4KTsgXAorCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdsLCBkYXRhLT52YWx1ZSAmIDB4ZmYpOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfQorc2V0X3RlbXAxKHRlbXBfbG93MSwgTE05MF9SRUdfV19MT0NBTF9MT1cpOworc2V0X3RlbXAyKHRlbXBfbG93MiwgTE05MF9SRUdfV19SRU1PVEVfTE9XSCwgTE05MF9SRUdfV19SRU1PVEVfTE9XTCk7CitzZXRfdGVtcDEodGVtcF9oaWdoMSwgTE05MF9SRUdfV19MT0NBTF9ISUdIKTsKK3NldF90ZW1wMih0ZW1wX2hpZ2gyLCBMTTkwX1JFR19XX1JFTU9URV9ISUdISCwgTE05MF9SRUdfV19SRU1PVEVfSElHSEwpOworc2V0X3RlbXAxKHRlbXBfY3JpdDEsIExNOTBfUkVHX1dfTE9DQUxfQ1JJVCk7CitzZXRfdGVtcDEodGVtcF9jcml0MiwgTE05MF9SRUdfV19SRU1PVEVfQ1JJVCk7CisKKyNkZWZpbmUgc2hvd190ZW1wX2h5c3QodmFsdWUsIGJhc2VyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVAxX0ZST01fUkVHKGRhdGEtPmJhc2VyZWcpIFwKKwkJICAgICAgIC0gVEVNUDFfRlJPTV9SRUcoZGF0YS0+dGVtcF9oeXN0KSk7IFwKK30KK3Nob3dfdGVtcF9oeXN0KHRlbXBfaHlzdDEsIHRlbXBfY3JpdDEpOworc2hvd190ZW1wX2h5c3QodGVtcF9oeXN0MiwgdGVtcF9jcml0Mik7CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2h5c3QxKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJbG9uZyBoeXN0OworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWh5c3QgPSBURU1QMV9GUk9NX1JFRyhkYXRhLT50ZW1wX2NyaXQxKSAtIHZhbDsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfV19UQ1JJVF9IWVNULAorCQkJCSAgSFlTVF9UT19SRUcoaHlzdCkpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX2lucHV0MSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dDIsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9sb3cxLAorCXNldF90ZW1wX2xvdzEpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9sb3cyLAorCXNldF90ZW1wX2xvdzIpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9oaWdoMSwKKwlzZXRfdGVtcF9oaWdoMSk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2hpZ2gyLAorCXNldF90ZW1wX2hpZ2gyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2NyaXQxLAorCXNldF90ZW1wX2NyaXQxKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMl9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2NyaXQyLAorCXNldF90ZW1wX2NyaXQyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfaHlzdDEsCisJc2V0X3RlbXBfaHlzdDEpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2h5c3QyLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKKworLyoKKyAqIFJlYWwgY29kZQorICovCisKK3N0YXRpYyBpbnQgbG05MF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTkwX2RldGVjdCk7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRvZXMgbW9yZSB0aGFuIGp1c3QgZGV0ZWN0aW9uLiBJZiBkZXRlY3Rpb24KKyAqIHN1Y2NlZWRzLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbmV3IGNoaXAuCisgKi8KK3N0YXRpYyBpbnQgbG05MF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpuYW1lID0gIiI7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG05MF9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbG05MF9kYXRhKSk7CisKKwkvKiBUaGUgY29tbW9uIEkyQyBjbGllbnQgZGF0YSBpcyBwbGFjZWQgcmlnaHQgYmVmb3JlIHRoZQorCSAgIExNOTAtc3BlY2lmaWMgZGF0YS4gKi8KKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmxtOTBfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qCisJICogTm93IHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiBBIG5lZ2F0aXZlIGtpbmQgbWVhbnMgdGhhdAorCSAqIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIG5vIGZvcmNlIHBhcmFtZXRlciAoZGVmYXVsdCksIHNvIHdlCisJICogbXVzdCBib3RoIGRldGVjdCBhbmQgaWRlbnRpZnkgdGhlIGNoaXAuIEEgemVybyBraW5kIG1lYW5zIHRoYXQKKwkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyLCB0aGUgZGV0ZWN0aW9uCisJICogc3RlcCBzaGFsbCBiZSBza2lwcGVkLiBBIHBvc2l0aXZlIGtpbmQgbWVhbnMgdGhhdCB0aGUgZHJpdmVyCisJICogd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIgYW5kIGEgZ2l2ZW4ga2luZCBvZiBjaGlwIGlzCisJICogcmVxdWVzdGVkLCBzbyBib3RoIHRoZSBkZXRlY3Rpb24gYW5kIHRoZSBpZGVudGlmaWNhdGlvbiBzdGVwcworCSAqIGFyZSBza2lwcGVkLgorCSAqLworCisJLyogRGVmYXVsdCB0byBhbiBMTTkwIGlmIGZvcmNlZCAqLworCWlmIChraW5kID09IDApCisJCWtpbmQgPSBsbTkwOworCisJaWYgKGtpbmQgPCAwKSB7IC8qIGRldGVjdGlvbiBhbmQgaWRlbnRpZmljYXRpb24gKi8KKwkJdTggbWFuX2lkLCBjaGlwX2lkLCByZWdfY29uZmlnMSwgcmVnX2NvbnZyYXRlOworCisJCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJIExNOTBfUkVHX1JfTUFOX0lEKTsKKwkJY2hpcF9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJICBMTTkwX1JFR19SX0NISVBfSUQpOworCQlyZWdfY29uZmlnMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJICAgICAgTE05MF9SRUdfUl9DT05GSUcxKTsKKwkJcmVnX2NvbnZyYXRlID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkgICAgICAgTE05MF9SRUdfUl9DT05WUkFURSk7CisJCQorCQlpZiAobWFuX2lkID09IDB4MDEpIHsgLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAqLworCQkJdTggcmVnX2NvbmZpZzI7CisKKwkJCXJlZ19jb25maWcyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkJICAgICAgTE05MF9SRUdfUl9DT05GSUcyKTsKKworCQkJaWYgKChyZWdfY29uZmlnMSAmIDB4MkEpID09IDB4MDAKKwkJCSAmJiAocmVnX2NvbmZpZzIgJiAweEY4KSA9PSAweDAwCisJCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MDkpIHsKKwkJCQlpZiAoYWRkcmVzcyA9PSAweDRDCisJCQkJICYmIChjaGlwX2lkICYgMHhGMCkgPT0gMHgyMCkgeyAvKiBMTTkwICovCisJCQkJCWtpbmQgPSBsbTkwOworCQkJCX0gZWxzZQorCQkJCWlmICgoY2hpcF9pZCAmIDB4RjApID09IDB4MzApIHsgLyogTE04OS9MTTk5ICovCisJCQkJCWtpbmQgPSBsbTk5OworCQkJCX0gZWxzZQorCQkJCWlmIChhZGRyZXNzID09IDB4NEMKKwkJCQkgJiYgKGNoaXBfaWQgJiAweEYwKSA9PSAweDEwKSB7IC8qIExNODYgKi8KKwkJCQkJa2luZCA9IGxtODY7CisJCQkJfQorCQkJfQorCQl9IGVsc2UKKwkJaWYgKG1hbl9pZCA9PSAweDQxKSB7IC8qIEFuYWxvZyBEZXZpY2VzICovCisJCQlpZiAoYWRkcmVzcyA9PSAweDRDCisJCQkgJiYgKGNoaXBfaWQgJiAweEYwKSA9PSAweDQwIC8qIEFETTEwMzIgKi8KKwkJCSAmJiAocmVnX2NvbmZpZzEgJiAweDNGKSA9PSAweDAwCisJCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MEEpIHsKKwkJCQlraW5kID0gYWRtMTAzMjsKKwkJCX0gZWxzZQorCQkJaWYgKGFkZHJlc3MgPT0gMHg0YworCQkJICYmIGNoaXBfaWQgPT0gMHg1MSAvKiBBRFQ3NDYxICovCisJCQkgJiYgKHJlZ19jb25maWcxICYgMHgxRikgPT0gMHgwMCAvKiBjaGVjayBjb21wYXQgbW9kZSAqLworCQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDBBKSB7CisJCQkJa2luZCA9IGFkdDc0NjE7CisJCQl9CisJCX0gZWxzZQorCQlpZiAobWFuX2lkID09IDB4NEQpIHsgLyogTWF4aW0gKi8KKwkJCS8qCisJCQkgKiBUaGUgTWF4aW0gdmFyaWFudHMgZG8gTk9UIGhhdmUgYSBjaGlwX2lkIHJlZ2lzdGVyLgorCQkJICogUmVhZGluZyBmcm9tIHRoYXQgYWRkcmVzcyB3aWxsIHJldHVybiB0aGUgbGFzdCByZWFkCisJCQkgKiB2YWx1ZSwgd2hpY2ggaW4gb3VyIGNhc2UgaXMgdGhvc2Ugb2YgdGhlIG1hbl9pZAorCQkJICogcmVnaXN0ZXIuIExpa2V3aXNlLCB0aGUgY29uZmlnMSByZWdpc3RlciBzZWVtcyB0bworCQkJICogbGFjayBhIGxvdyBuaWJibGUsIHNvIHRoZSB2YWx1ZSB3aWxsIGJlIHRob3NlIG9mIHRoZQorCQkJICogcHJldmlvdXMgcmVhZCwgc28gaW4gb3VyIGNhc2UgdGhvc2Ugb2YgdGhlIG1hbl9pZAorCQkJICogcmVnaXN0ZXIuCisJCQkgKi8KKwkJCWlmIChjaGlwX2lkID09IG1hbl9pZAorCQkJICYmIChyZWdfY29uZmlnMSAmIDB4MUYpID09IChtYW5faWQgJiAweDBGKQorCQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA5KSB7CisJCQkgCWtpbmQgPSBtYXg2NjU3OworCQkJfQorCQl9CisKKwkJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCisJCQkgICAgIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwMlgsICIKKwkJCSAgICAiY2hpcF9pZD0weCUwMlgpLlxuIiwgbWFuX2lkLCBjaGlwX2lkKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJaWYgKGtpbmQgPT0gbG05MCkgeworCQluYW1lID0gImxtOTAiOworCX0gZWxzZSBpZiAoa2luZCA9PSBhZG0xMDMyKSB7CisJCW5hbWUgPSAiYWRtMTAzMiI7CisJfSBlbHNlIGlmIChraW5kID09IGxtOTkpIHsKKwkJbmFtZSA9ICJsbTk5IjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gbG04NikgeworCQluYW1lID0gImxtODYiOworCX0gZWxzZSBpZiAoa2luZCA9PSBtYXg2NjU3KSB7CisJCW5hbWUgPSAibWF4NjY1NyI7CisJfSBlbHNlIGlmIChraW5kID09IGFkdDc0NjEpIHsKKwkJbmFtZSA9ICJhZHQ3NDYxIjsKKwl9CisKKwkvKiBXZSBjYW4gZmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlkYXRhLT5raW5kID0ga2luZDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgTE05MCBjaGlwICovCisJbG05MF9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9jcml0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2NyaXRfaHlzdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9jcml0X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKworCXJldHVybiAwOworCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGxtOTBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl1OCBjb25maWc7CisKKwkvKgorCSAqIFN0YXJ0IHRoZSBjb252ZXJzaW9ucy4KKwkgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfV19DT05WUkFURSwKKwkJCQkgIDUpOyAvKiAyIEh6ICovCisJY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfUl9DT05GSUcxKTsKKwlpZiAoY29uZmlnICYgMHg0MCkKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1dfQ09ORklHMSwKKwkJCQkJICBjb25maWcgJiAweEJGKTsgLyogcnVuICovCit9CisKK3N0YXRpYyBpbnQgbG05MF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBsbTkwX2RhdGEgKmxtOTBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiAqIDIpIHx8ICFkYXRhLT52YWxpZCkgeworCQl1OCBvbGRoLCBuZXdoOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgbG05MCBkYXRhLlxuIik7CisJCWRhdGEtPnRlbXBfaW5wdXQxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgICAgTE05MF9SRUdfUl9MT0NBTF9URU1QKTsKKwkJZGF0YS0+dGVtcF9oaWdoMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgTE05MF9SRUdfUl9MT0NBTF9ISUdIKTsKKwkJZGF0YS0+dGVtcF9sb3cxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgIExNOTBfUkVHX1JfTE9DQUxfTE9XKTsKKwkJZGF0YS0+dGVtcF9jcml0MSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgTE05MF9SRUdfUl9MT0NBTF9DUklUKTsKKwkJZGF0YS0+dGVtcF9jcml0MiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgTE05MF9SRUdfUl9SRU1PVEVfQ1JJVCk7CisJCWRhdGEtPnRlbXBfaHlzdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICBMTTkwX1JFR19SX1RDUklUX0hZU1QpOworCisJCS8qCisJCSAqIFRoZXJlIGlzIGEgdHJpY2sgaGVyZS4gV2UgaGF2ZSB0byByZWFkIHR3byByZWdpc3RlcnMgdG8KKwkJICogaGF2ZSB0aGUgcmVtb3RlIHNlbnNvciB0ZW1wZXJhdHVyZSwgYnV0IHdlIGhhdmUgdG8gYmV3YXJlCisJCSAqIGEgY29udmVyc2lvbiBjb3VsZCBvY2N1ciBpbmJldHdlZW4gdGhlIHJlYWRpbmdzLiBUaGUKKwkJICogZGF0YXNoZWV0IHNheXMgd2Ugc2hvdWxkIGVpdGhlciB1c2UgdGhlIG9uZS1zaG90CisJCSAqIGNvbnZlcnNpb24gcmVnaXN0ZXIsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gZG8gKGRpc2FibGVzCisJCSAqIGhhcmR3YXJlIG1vbml0b3JpbmcpIG9yIG1vbml0b3IgdGhlIGJ1c3kgYml0LCB3aGljaCBpcworCQkgKiBpbXBvc3NpYmxlICh3ZSBjYW4ndCByZWFkIHRoZSB2YWx1ZXMgYW5kIG1vbml0b3IgdGhhdCBiaXQKKwkJICogYXQgdGhlIGV4YWN0IHNhbWUgdGltZSkuIFNvIHRoZSBzb2x1dGlvbiB1c2VkIGhlcmUgaXMgdG8KKwkJICogcmVhZCB0aGUgaGlnaCBieXRlIG9uY2UsIHRoZW4gdGhlIGxvdyBieXRlLCB0aGVuIHRoZSBoaWdoCisJCSAqIGJ5dGUgYWdhaW4uIElmIHRoZSBuZXcgaGlnaCBieXRlIG1hdGNoZXMgdGhlIG9sZCBvbmUsCisJCSAqIHRoZW4gd2UgaGF2ZSBhIHZhbGlkIHJlYWRpbmcuIEVsc2Ugd2UgaGF2ZSB0byByZWFkIHRoZSBsb3cKKwkJICogYnl0ZSBhZ2FpbiwgYW5kIG5vdyB3ZSBiZWxpZXZlIHdlIGhhdmUgYSBjb3JyZWN0IHJlYWRpbmcuCisJCSAqLworCQlvbGRoID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJICAgICAgIExNOTBfUkVHX1JfUkVNT1RFX1RFTVBIKTsKKwkJZGF0YS0+dGVtcF9pbnB1dDIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCSAgICBMTTkwX1JFR19SX1JFTU9URV9URU1QTCk7CisJCW5ld2ggPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkgICAgICAgTE05MF9SRUdfUl9SRU1PVEVfVEVNUEgpOworCQlpZiAobmV3aCAhPSBvbGRoKSB7CisJCQlkYXRhLT50ZW1wX2lucHV0MiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCSAgICBMTTkwX1JFR19SX1JFTU9URV9URU1QTCk7CisjaWZkZWYgREVCVUcKKwkJCW9sZGggPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJICAgICAgIExNOTBfUkVHX1JfUkVNT1RFX1RFTVBIKTsKKwkJCS8qIG9sZGggaXMgYWN0dWFsbHkgbmV3ZXIgKi8KKwkJCWlmIChuZXdoICE9IG9sZGgpCisJCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiUmVtb3RlIHRlbXBlcmF0dXJlIG1heSBiZSAiCisJCQkJCSAid3JvbmcuXG4iKTsKKyNlbmRpZgorCQl9CisJCWRhdGEtPnRlbXBfaW5wdXQyIHw9IChuZXdoIDw8IDgpOworCisJCWRhdGEtPnRlbXBfaGlnaDIgPSAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgICBMTTkwX1JFR19SX1JFTU9URV9ISUdISCkgPDwgOCkgKworCQkJCSAgIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICAgTE05MF9SRUdfUl9SRU1PVEVfSElHSEwpOworCQlkYXRhLT50ZW1wX2xvdzIgPSAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkgIExNOTBfUkVHX1JfUkVNT1RFX0xPV0gpIDw8IDgpICsKKwkJCQkgIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJICBMTTkwX1JFR19SX1JFTU9URV9MT1dMKTsKKwkJZGF0YS0+YWxhcm1zID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCSAgICAgICBMTTkwX1JFR19SX1NUQVRVUyk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19sbTkwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmxtOTBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfbG05MF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmxtOTBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxNOTAvQURNMTAzMiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19sbTkwX2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc19sbTkwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG05Mi5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbG05Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmU4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9sbTkyLmMKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBsbTkyIC0gSGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogQmFzZWQgb24gdGhlIGxtOTAgZHJpdmVyLCB3aXRoIHNvbWUgaWRlYXMgdGFrZW4gZnJvbSB0aGUgbG1fc2Vuc29ycworICogbG05MiBkcml2ZXIgYXMgd2VsbC4KKyAqCisgKiBUaGUgTE05MiBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTmF0aW9uYWwgU2VtaWNvbmR1Y3Rvci4gSXQgcmVwb3J0cworICogaXRzIG93biB0ZW1wZXJhdHVyZSB3aXRoIGEgMC4wNjI1IGRlZyByZXNvbHV0aW9uIGFuZCBhIDAuMzMgZGVnCisgKiBhY2N1cmFjeS4gQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZSBvYnRhaW5lZCBmcm9tIE5hdGlvbmFsJ3Mgd2Vic2l0ZQorICogYXQ6CisgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNOTIuaHRtbAorICoKKyAqIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIE1BWDY2MzUgc2Vuc29yIGNoaXAgbWFkZSBieSBNYXhpbS4KKyAqIFRoaXMgY2hpcCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIExNOTIsIGJ1dCBoYXMgYSBsZXNzZXIgYWNjdXJhY3kKKyAqICgxLjAgZGVnKS4gQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZSBvYnRhaW5lZCBmcm9tIE1heGltJ3Mgd2Vic2l0ZQorICogYXQ6CisgKiAgIGh0dHA6Ly93d3cubWF4aW0taWMuY29tL3F1aWNrX3ZpZXcyLmNmbS9xdl9way8zMDc0CisgKgorICogU2luY2UgdGhlIExNOTIgd2FzIHRoZSBmaXJzdCBjaGlwc2V0IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciwgbW9zdAorICogY29tbWVudHMgd2lsbCByZWZlciB0byB0aGlzIGNoaXBzZXQsIGJ1dCBhcmUgYWN0dWFsbHkgZ2VuZXJhbCBhbmQKKyAqIGNvbmNlcm4gYWxsIHN1cHBvcnRlZCBjaGlwc2V0cywgdW5sZXNzIG1lbnRpb25lZCBvdGhlcndpc2UuCisgKgorICogU3VwcG9ydCBjb3VsZCBlYXNpbHkgYmUgYWRkZWQgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzYKKyAqIGFuZCBNYXhpbSBNQVg2NjMzIGFuZCBNQVg2NjM0IGNoaXBzLCB3aGljaCBhcmUgbW9zdGx5IGNvbXBhdGlibGUKKyAqIHdpdGggdGhlIExNOTIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorCisKKy8qIFRoZSBMTTkyIGFuZCBNQVg2NjM1IGhhdmUgMiB0d28tc3RhdGUgcGlucyBmb3IgYWRkcmVzcyBzZWxlY3Rpb24sCisgICByZXN1bHRpbmcgaW4gNCBwb3NzaWJsZSBhZGRyZXNzZXMuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDQ4LCAweDQ5LCAweDRhLCAweDRiLAorCQkJCSAgICAgICBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMShsbTkyKTsKKworLyogVGhlIExNOTIgcmVnaXN0ZXJzICovCisjZGVmaW5lIExNOTJfUkVHX0NPTkZJRwkJCTB4MDEgLyogOC1iaXQsIFJXICovCisjZGVmaW5lIExNOTJfUkVHX1RFTVAJCQkweDAwIC8qIDE2LWJpdCwgUk8gKi8KKyNkZWZpbmUgTE05Ml9SRUdfVEVNUF9IWVNUCQkweDAyIC8qIDE2LWJpdCwgUlcgKi8KKyNkZWZpbmUgTE05Ml9SRUdfVEVNUF9DUklUCQkweDAzIC8qIDE2LWJpdCwgUlcgKi8KKyNkZWZpbmUgTE05Ml9SRUdfVEVNUF9MT1cJCTB4MDQgLyogMTYtYml0LCBSVyAqLworI2RlZmluZSBMTTkyX1JFR19URU1QX0hJR0gJCTB4MDUgLyogMTYtYml0LCBSVyAqLworI2RlZmluZSBMTTkyX1JFR19NQU5fSUQJCQkweDA3IC8qIDE2LWJpdCwgUk8sIExNOTIgb25seSAqLworCisvKiBUaGUgTE05MiB1c2VzIHNpZ25lZCAxMy1iaXQgdmFsdWVzIHdpdGggTFNCID0gMC4wNjI1IGRlZ3JlZSBDZWxzaXVzLAorICAgbGVmdC1qdXN0aWZpZWQgaW4gMTYtYml0IHJlZ2lzdGVycy4gTm8gcm91bmRpbmcgaXMgZG9uZSwgd2l0aCBzdWNoCisgICBhIHJlc29sdXRpb24gaXQncyBqdXN0IG5vdCB3b3J0aCBpdC4gTm90ZSB0aGF0IHRoZSBNQVg2NjM1IGRvZXNuJ3QKKyAgIG1ha2UgdXNlIG9mIHRoZSA0IGxvd2VyIGJpdHMgZm9yIGxpbWl0cyAoaS5lLiBlZmZlY3RpdmUgcmVzb2x1dGlvbgorICAgZm9yIGxpbWl0cyBpcyAxIGRlZ3JlZSBDZWxzaXVzKS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IFRFTVBfRlJPTV9SRUcoczE2IHJlZykKK3sKKwlyZXR1cm4gcmVnIC8gOCAqIDYyNSAvIDEwOworfQorCitzdGF0aWMgaW5saW5lIHMxNiBURU1QX1RPX1JFRyhpbnQgdmFsKQoreworCWlmICh2YWwgPD0gLTYwMDAwKQorCQlyZXR1cm4gLTYwMDAwICogMTAgLyA2MjUgKiA4OworCWlmICh2YWwgPj0gMTYwMDAwKQorCQlyZXR1cm4gMTYwMDAwICogMTAgLyA2MjUgKiA4OworCXJldHVybiB2YWwgKiAxMCAvIDYyNSAqIDg7Cit9CisKKy8qIEFsYXJtIGZsYWdzIGFyZSBzdG9yZWQgaW4gdGhlIDMgTFNCIG9mIHRoZSB0ZW1wZXJhdHVyZSByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB1OCBBTEFSTVNfRlJPTV9SRUcoczE2IHJlZykKK3sKKwlyZXR1cm4gcmVnICYgMHgwMDA3OworfQorCisvKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKSAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtOTJfZHJpdmVyOworCisvKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKSAqLworc3RydWN0IGxtOTJfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCisKKwkvKiByZWdpc3RlcnMgdmFsdWVzICovCisJczE2IHRlbXAxX2lucHV0LCB0ZW1wMV9jcml0LCB0ZW1wMV9taW4sIHRlbXAxX21heCwgdGVtcDFfaHlzdDsKK307CisKKworLyoKKyAqIFN5c2ZzIGF0dHJpYnV0ZXMgYW5kIGNhbGxiYWNrIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBzdHJ1Y3QgbG05Ml9kYXRhICpsbTkyX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTJfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopCisJIHx8ICFkYXRhLT52YWxpZCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlVwZGF0aW5nIGxtOTIgZGF0YVxuIik7CisJCWRhdGEtPnRlbXAxX2lucHV0ID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsCisJCQkJICAgIExNOTJfUkVHX1RFTVApKTsKKwkJZGF0YS0+dGVtcDFfaHlzdCA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQkJCSAgICBMTTkyX1JFR19URU1QX0hZU1QpKTsKKwkJZGF0YS0+dGVtcDFfY3JpdCA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQkJCSAgICBMTTkyX1JFR19URU1QX0NSSVQpKTsKKwkJZGF0YS0+dGVtcDFfbWluID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsCisJCQkJICAgIExNOTJfUkVHX1RFTVBfTE9XKSk7CisJCWRhdGEtPnRlbXAxX21heCA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQkJCSAgICBMTTkyX1JFR19URU1QX0hJR0gpKTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCisjZGVmaW5lIHNob3dfdGVtcCh2YWx1ZSkgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG05Ml9kYXRhICpkYXRhID0gbG05Ml91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT52YWx1ZSkpOyBcCit9CitzaG93X3RlbXAodGVtcDFfaW5wdXQpOworc2hvd190ZW1wKHRlbXAxX2NyaXQpOworc2hvd190ZW1wKHRlbXAxX21pbik7CitzaG93X3RlbXAodGVtcDFfbWF4KTsKKworI2RlZmluZSBzZXRfdGVtcCh2YWx1ZSwgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBsbTkyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT52YWx1ZSA9IFRFTVBfVE9fUkVHKHZhbCk7IFwKKwlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYoZGF0YS0+dmFsdWUpKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30KK3NldF90ZW1wKHRlbXAxX2NyaXQsIExNOTJfUkVHX1RFTVBfQ1JJVCk7CitzZXRfdGVtcCh0ZW1wMV9taW4sIExNOTJfUkVHX1RFTVBfTE9XKTsKK3NldF90ZW1wKHRlbXAxX21heCwgTE05Ml9SRUdfVEVNUF9ISUdIKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wMV9jcml0X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtOTJfZGF0YSAqZGF0YSA9IGxtOTJfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXAxX2NyaXQpCisJCSAgICAgICAtIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcDFfaHlzdCkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wMV9tYXhfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG05Ml9kYXRhICpkYXRhID0gbG05Ml91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcDFfbWF4KQorCQkgICAgICAgLSBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXAxX2h5c3QpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcDFfbWluX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxtOTJfZGF0YSAqZGF0YSA9IGxtOTJfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXAxX21pbikKKwkJICAgICAgICsgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wMV9oeXN0KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wMV9jcml0X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTJfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wMV9oeXN0ID0gVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wMV9jcml0KSAtIHZhbDsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgTE05Ml9SRUdfVEVNUF9IWVNULAorCQkJCSAgc3dhYjE2KFRFTVBfVE9fUkVHKGRhdGEtPnRlbXAxX2h5c3QpKSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTkyX2RhdGEgKmRhdGEgPSBsbTkyX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgQUxBUk1TX0ZST01fUkVHKGRhdGEtPnRlbXAxX2lucHV0KSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wMV9pbnB1dCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDFfY3JpdCwKKwlzZXRfdGVtcDFfY3JpdCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMV9jcml0X2h5c3QsCisJc2V0X3RlbXAxX2NyaXRfaHlzdCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMV9taW4sCisJc2V0X3RlbXAxX21pbik7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWluX2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcDFfbWluX2h5c3QsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDFfbWF4LAorCXNldF90ZW1wMV9tYXgpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXAxX21heF9oeXN0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKKworCisvKgorICogRGV0ZWN0aW9uIGFuZCByZWdpc3RyYXRpb24KKyAqLworCitzdGF0aWMgdm9pZCBsbTkyX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTggY29uZmlnOworCisJLyogU3RhcnQgdGhlIGNvbnZlcnNpb25zIGlmIG5lZWRlZCAqLworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNOTJfUkVHX0NPTkZJRyk7CisJaWYgKGNvbmZpZyAmIDB4MDEpCisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTkyX1JFR19DT05GSUcsCisJCQkJCSAgY29uZmlnICYgMHhGRSk7Cit9CisKKy8qIFRoZSBNQVg2NjM1IGhhcyBubyBpZGVudGlmaWNhdGlvbiByZWdpc3Rlciwgc28gd2UgaGF2ZSB0byB1c2UgdHJpY2tzCisgICB0byBpZGVudGlmeSBpdCByZWxpYWJseS4gVGhpcyBpcyBzb21ld2hhdCBzbG93LgorICAgTm90ZSB0aGF0IHdlIGRvIE5PVCByZWx5IG9uIHRoZSAyIE1TQiBvZiB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcgorICAgYWx3YXlzIHJlYWRpbmcgMCwgYXMgc3VnZ2VzdGVkIGJ5IHRoZSBkYXRhc2hlZXQsIGJlY2F1c2UgaXQgd2FzIG9uY2UKKyAgIHJlcG9ydGVkIG5vdCB0byBiZSB0cnVlLiAqLworc3RhdGljIGludCBtYXg2NjM1X2NoZWNrKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTE2IHRlbXBfbG93LCB0ZW1wX2hpZ2gsIHRlbXBfaHlzdCwgdGVtcF9jcml0OworCXU4IGNvbmY7CisJaW50IGk7CisKKwkvKiBObyBtYW51ZmFjdHVyZXIgSUQgcmVnaXN0ZXIsIHNvIGEgcmVhZCBmcm9tIHRoaXMgYWRkcmVzcyB3aWxsCisJICAgYWx3YXlzIHJldHVybiB0aGUgbGFzdCByZWFkIHZhbHVlLiAqLworCXRlbXBfbG93ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgTE05Ml9SRUdfVEVNUF9MT1cpOworCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBMTTkyX1JFR19NQU5fSUQpICE9IHRlbXBfbG93KQorCQlyZXR1cm4gMDsKKwl0ZW1wX2hpZ2ggPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBMTTkyX1JFR19URU1QX0hJR0gpOworCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBMTTkyX1JFR19NQU5fSUQpICE9IHRlbXBfaGlnaCkKKwkJcmV0dXJuIDA7CisJCisJLyogTGltaXRzIGFyZSBzdG9yZWQgYXMgaW50ZWdlciB2YWx1ZXMgKHNpZ25lZCwgOS1iaXQpLiAqLworCWlmICgodGVtcF9sb3cgJiAweDdmMDApIHx8ICh0ZW1wX2hpZ2ggJiAweDdmMDApKQorCQlyZXR1cm4gMDsKKwl0ZW1wX2h5c3QgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBMTTkyX1JFR19URU1QX0hZU1QpOworCXRlbXBfY3JpdCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIExNOTJfUkVHX1RFTVBfQ1JJVCk7CisJaWYgKCh0ZW1wX2h5c3QgJiAweDdmMDApIHx8ICh0ZW1wX2NyaXQgJiAweDdmMDApKQorCQlyZXR1cm4gMDsKKworCS8qIFJlZ2lzdGVycyBhZGRyZXNzZXMgd2VyZSBmb3VuZCB0byBjeWNsZSBvdmVyIDE2LWJ5dGUgYm91bmRhcmllcy4KKwkgICBXZSBkb24ndCB0ZXN0IGFsbCByZWdpc3RlcnMgd2l0aCBhbGwgb2Zmc2V0cyBzbyBhcyB0byBzYXZlIHNvbWUKKwkgICByZWFkcyBhbmQgdGltZSwgYnV0IHRoaXMgc2hvdWxkIHN0aWxsIGJlIHN1ZmZpY2llbnQgdG8gZGlzbWlzcworCSAgIG5vbi1NQVg2NjM1IGNoaXBzLiAqLworCWNvbmYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTkyX1JFR19DT05GSUcpOworCWZvciAoaT0xNjsgaTw5NjsgaSo9MikgeworCQlpZiAodGVtcF9oeXN0ICE9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsCisJCSAJCSBMTTkyX1JFR19URU1QX0hZU1QgKyBpIC0gMTYpCisJCSB8fCB0ZW1wX2NyaXQgIT0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKKwkJIAkJIExNOTJfUkVHX1RFTVBfQ1JJVCArIGkpCisJCSB8fCB0ZW1wX2xvdyAhPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQkJCUxNOTJfUkVHX1RFTVBfTE9XICsgaSArIDE2KQorCQkgfHwgdGVtcF9oaWdoICE9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsCisJCSAJCSBMTTkyX1JFR19URU1QX0hJR0ggKyBpICsgMzIpCisJCSB8fCBjb25mICE9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCSAJICAgIExNOTJfUkVHX0NPTkZJRyArIGkpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gZG9lcyBtb3JlIHRoYW4ganVzdCBkZXRlY3Rpb24uIElmIGRldGVjdGlvbgorICAgc3VjY2VlZHMsIGl0IGFsc28gcmVnaXN0ZXJzIHRoZSBuZXcgY2hpcC4gKi8KK3N0YXRpYyBpbnQgbG05Ml9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGxtOTJfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljaGFyICpuYW1lOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEKKwkJCQkJICAgIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKKwkJZ290byBleGl0OworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbTkyX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBsbTkyX2RhdGEpKTsKKworCS8qIEZpbGwgaW4gZW5vdWdoIGNsaWVudCBmaWVsZHMgc28gdGhhdCB3ZSBjYW4gcmVhZCBmcm9tIHRoZSBjaGlwLAorCSAgIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBpZGVudGljYXRpb24gKi8KKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJmxtOTJfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIEEgbmVnYXRpdmUga2luZCBtZWFucyB0aGF0IHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIG5vIGZvcmNlCisJICAgcGFyYW1ldGVyIChkZWZhdWx0KSwgc28gd2UgbXVzdCBpZGVudGlmeSB0aGUgY2hpcC4gKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJdTggY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkgICAgIExNOTJfUkVHX0NPTkZJRyk7CisJCXUxNiBtYW5faWQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwKKwkJCSAgICAgTE05Ml9SRUdfTUFOX0lEKTsKKworCQlpZiAoKGNvbmZpZyAmIDB4ZTApID09IDB4MDAKKwkJICYmIG1hbl9pZCA9PSAweDAxODApIHsKKwkJCXByX2luZm8oImxtOTI6IEZvdW5kIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MiBjaGlwXG4iKTsKKwkgCQlraW5kID0gbG05MjsKKwkJfSBlbHNlCisJCWlmIChtYXg2NjM1X2NoZWNrKG5ld19jbGllbnQpKSB7CisJCQlwcl9pbmZvKCJsbTkyOiBGb3VuZCBNYXhpbSBNQVg2NjM1IGNoaXBcbiIpOworCQkJa2luZCA9IGxtOTI7IC8qIE5vIHNlcGFyYXRlIHByZWZpeCAqLworCQl9CisJCWVsc2UKKwkJCWdvdG8gZXhpdF9mcmVlOworCX0gZWxzZQorCWlmIChraW5kID09IDApIC8qIERlZmF1bHQgdG8gYW4gTE05MiBpZiBmb3JjZWQgKi8KKwkJa2luZCA9IGxtOTI7CisKKwkvKiBHaXZlIGl0IHRoZSBwcm9wZXIgbmFtZSAqLworCWlmIChraW5kID09IGxtOTIpIHsKKwkJbmFtZSA9ICJsbTkyIjsKKwl9IGVsc2UgeyAvKiBTdXBwb3NlZGx5IGNhbm5vdCBoYXBwZW4gKi8KKwkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiS2luZCBvdXQgb2YgcmFuZ2U/XG4iKTsKKwkJZ290byBleGl0X2ZyZWU7CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBpMmMgc3Vic3lzdGVtIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNoaXBzZXQgKi8KKwlsbTkyX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2NyaXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9taW5faHlzdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKworCXJldHVybiAwOworCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbG05Ml9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTkyX2RldGVjdCk7Cit9CisKK3N0YXRpYyBpbnQgbG05Ml9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogTW9kdWxlIGFuZCBkcml2ZXIgc3R1ZmYKKyAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG05Ml9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJsbTkyIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX0xNOTIsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gbG05Ml9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGxtOTJfZGV0YWNoX2NsaWVudCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfbG05Ml9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZsbTkyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2xtOTJfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsbTkyX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTkyL01BWDY2MzUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfbG05Ml9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfbG05Ml9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL200MXQwMC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3MTU2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL200MXQwMC5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMKKyAqCisgKiBJMkMgY2xpZW50L2RyaXZlciBmb3IgdGhlIFNUIE00MVQwMCBSZWFsLVRpbWUgQ2xvY2sgY2hpcC4KKyAqCisgKiBBdXRob3I6IE1hcmsgQS4gR3JlZXIgPG1ncmVlckBtdmlzdGEuY29tPgorICoKKyAqIDIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKy8qCisgKiBUaGlzIGkyYyBjbGllbnQvZHJpdmVyIHdlZGdlcyBiZXR3ZWVuIHRoZSBkcml2ZXJzL2NoYXIvZ2VucnRjLmMgUlRDCisgKiBpbnRlcmZhY2UgYW5kIHRoZSBTTUJ1cyBpbnRlcmZhY2Ugb2YgdGhlIGkyYyBzdWJzeXN0ZW0uCisgKiBJdCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCB0byB1c2UgaTJjIG1zZ3MvaTJjX3RyYW5zZmVyIGRpcmVjdGx5IGJ1dCwgYXMKKyAqIHJlY29tbWVuZWQgaW4gLi4uL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cyBzZWN0aW9uCisgKiAiU2VuZGluZyBhbmQgcmVjZWl2aW5nIiwgdXNpbmcgU01CdXMgbGV2ZWwgY29tbXVuaWNhdGlvbiBpcyBwcmVmZXJyZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisKKyNkZWZpbmUJTTQxVDAwX0RSVl9OQU1FCQkibTQxdDAwIgorCitzdGF0aWMgREVDTEFSRV9NVVRFWChtNDF0MDBfbXV0ZXgpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbTQxdDAwX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqc2F2ZV9jbGllbnQ7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmVbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfYWRkcltdID0geyAweDY4LCBJMkNfQ0xJRU5UX0VORCB9OworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKKwkubm9ybWFsX2kyYwkJPSBub3JtYWxfYWRkciwKKwkubm9ybWFsX2kyY19yYW5nZQk9IGlnbm9yZSwKKwkucHJvYmUJCQk9IGlnbm9yZSwKKwkucHJvYmVfcmFuZ2UJCT0gaWdub3JlLAorCS5pZ25vcmUJCQk9IGlnbm9yZSwKKwkuaWdub3JlX3JhbmdlCQk9IGlnbm9yZSwKKwkuZm9yY2UJCQk9IGlnbm9yZSwKK307CisKK3Vsb25nCittNDF0MDBfZ2V0X3J0Y190aW1lKHZvaWQpCit7CisJczMyCXNlYywgbWluLCBob3VyLCBkYXksIG1vbiwgeWVhcjsKKwlzMzIJc2VjMSwgbWluMSwgaG91cjEsIGRheTEsIG1vbjEsIHllYXIxOworCXVsb25nCWxpbWl0ID0gMTA7CisKKwlzZWMgPSBtaW4gPSBob3VyID0gZGF5ID0gbW9uID0geWVhciA9IDA7CisJc2VjMSA9IG1pbjEgPSBob3VyMSA9IGRheTEgPSBtb24xID0geWVhcjEgPSAwOworCisJZG93bigmbTQxdDAwX211dGV4KTsKKwlkbyB7CisJCWlmICgoKHNlYyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzYXZlX2NsaWVudCwgMCkpID49IDApCisJCQkmJiAoKG1pbiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzYXZlX2NsaWVudCwgMSkpCisJCQkJPj0gMCkKKwkJCSYmICgoaG91ciA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzYXZlX2NsaWVudCwgMikpCisJCQkJPj0gMCkKKwkJCSYmICgoZGF5ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCA0KSkKKwkJCQk+PSAwKQorCQkJJiYgKChtb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDUpKQorCQkJCT49IDApCisJCQkmJiAoKHllYXIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDYpKQorCQkJCT49IDApCisJCQkmJiAoKHNlYyA9PSBzZWMxKSAmJiAobWluID09IG1pbjEpICYmIChob3VyID09IGhvdXIxKQorCQkJCSYmIChkYXkgPT0gZGF5MSkgJiYgKG1vbiA9PSBtb24xKQorCQkJCSYmICh5ZWFyID09IHllYXIxKSkpCisKKwkJCQlicmVhazsKKworCQlzZWMxID0gc2VjOworCQltaW4xID0gbWluOworCQlob3VyMSA9IGhvdXI7CisJCWRheTEgPSBkYXk7CisJCW1vbjEgPSBtb247CisJCXllYXIxID0geWVhcjsKKwl9IHdoaWxlICgtLWxpbWl0ID4gMCk7CisJdXAoJm00MXQwMF9tdXRleCk7CisKKwlpZiAobGltaXQgPT0gMCkgeworCQlkZXZfd2Fybigmc2F2ZV9jbGllbnQtPmRldiwKKwkJCSJtNDF0MDA6IGNhbid0IHJlYWQgcnRjIGNoaXBcbiIpOworCQlzZWMgPSBtaW4gPSBob3VyID0gZGF5ID0gbW9uID0geWVhciA9IDA7CisJfQorCisJc2VjICY9IDB4N2Y7CisJbWluICY9IDB4N2Y7CisJaG91ciAmPSAweDNmOworCWRheSAmPSAweDNmOworCW1vbiAmPSAweDFmOworCXllYXIgJj0gMHhmZjsKKworCUJDRF9UT19CSU4oc2VjKTsKKwlCQ0RfVE9fQklOKG1pbik7CisJQkNEX1RPX0JJTihob3VyKTsKKwlCQ0RfVE9fQklOKGRheSk7CisJQkNEX1RPX0JJTihtb24pOworCUJDRF9UT19CSU4oeWVhcik7CisKKwl5ZWFyICs9IDE5MDA7CisJaWYgKHllYXIgPCAxOTcwKQorCQl5ZWFyICs9IDEwMDsKKworCXJldHVybiBta3RpbWUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKK30KKworc3RhdGljIHZvaWQKK200MXQwMF9zZXRfdGxldCh1bG9uZyBhcmcpCit7CisJc3RydWN0IHJ0Y190aW1lCXRtOworCXVsb25nCW5vd3RpbWUgPSAqKHVsb25nICopYXJnOworCisJdG9fdG0obm93dGltZSwgJnRtKTsKKwl0bS50bV95ZWFyID0gKHRtLnRtX3llYXIgLSAxOTAwKSAlIDEwMDsKKworCUJJTl9UT19CQ0QodG0udG1fc2VjKTsKKwlCSU5fVE9fQkNEKHRtLnRtX21pbik7CisJQklOX1RPX0JDRCh0bS50bV9ob3VyKTsKKwlCSU5fVE9fQkNEKHRtLnRtX21vbik7CisJQklOX1RPX0JDRCh0bS50bV9tZGF5KTsKKwlCSU5fVE9fQkNEKHRtLnRtX3llYXIpOworCisJZG93bigmbTQxdDAwX211dGV4KTsKKwlpZiAoKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDAsIHRtLnRtX3NlYyAmIDB4N2YpIDwgMCkKKwkJfHwgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDEsIHRtLnRtX21pbiAmIDB4N2YpCisJCQk8IDApCisJCXx8IChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCAyLCB0bS50bV9ob3VyICYgMHg3ZikKKwkJCTwgMCkKKwkJfHwgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDQsIHRtLnRtX21kYXkgJiAweDdmKQorCQkJPCAwKQorCQl8fCAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShzYXZlX2NsaWVudCwgNSwgdG0udG1fbW9uICYgMHg3ZikKKwkJCTwgMCkKKwkJfHwgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDYsIHRtLnRtX3llYXIgJiAweDdmKQorCQkJPCAwKSkKKworCQlkZXZfd2Fybigmc2F2ZV9jbGllbnQtPmRldiwibTQxdDAwOiBjYW4ndCB3cml0ZSB0byBydGMgY2hpcFxuIik7CisKKwl1cCgmbTQxdDAwX211dGV4KTsKKwlyZXR1cm47Cit9CisKK3Vsb25nCW5ld190aW1lOworCitERUNMQVJFX1RBU0tMRVRfRElTQUJMRUQobTQxdDAwX3Rhc2tsZXQsIG00MXQwMF9zZXRfdGxldCwgKHVsb25nKSZuZXdfdGltZSk7CisKK2ludAorbTQxdDAwX3NldF9ydGNfdGltZSh1bG9uZyBub3d0aW1lKQoreworCW5ld190aW1lID0gbm93dGltZTsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJdGFza2xldF9zY2hlZHVsZSgmbTQxdDAwX3Rhc2tsZXQpOworCWVsc2UKKwkJbTQxdDAwX3NldF90bGV0KCh1bG9uZykmbmV3X3RpbWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglEcml2ZXIgSW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbnQKK200MXQwMF9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWludCByYzsKKworCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbGllbnQpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGNsaWVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJc3RybmNweShjbGllbnQtPm5hbWUsIE00MVQwMF9EUlZfTkFNRSwgSTJDX05BTUVfU0laRSk7CisJY2xpZW50LT5mbGFncyA9IEkyQ19ERl9OT1RJRlk7CisJY2xpZW50LT5hZGRyID0gYWRkcjsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwOworCWNsaWVudC0+ZHJpdmVyID0gJm00MXQwMF9kcml2ZXI7CisKKwlpZiAoKHJjID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkgIT0gMCkgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gcmM7CisJfQorCisJc2F2ZV9jbGllbnQgPSBjbGllbnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK200MXQwMF9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgbTQxdDAwX3Byb2JlKTsKK30KKworc3RhdGljIGludAorbTQxdDAwX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludAlyYzsKKworCWlmICgocmMgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSA9PSAwKSB7CisJCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwkJdGFza2xldF9raWxsKCZtNDF0MDBfdGFza2xldCk7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG00MXQwMF9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9IE00MVQwMF9EUlZfTkFNRSwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX1NUTTQxVDAwLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IG00MXQwMF9hdHRhY2gsCisJLmRldGFjaF9jbGllbnQJPSBtNDF0MDBfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK200MXQwMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtNDF0MDBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CittNDF0MDBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtNDF0MDBfZHJpdmVyKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KG00MXQwMF9pbml0KTsKK21vZHVsZV9leGl0KG00MXQwMF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyayBBLiBHcmVlciA8bWdyZWVyQG12aXN0YS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNUIE1pY3JvZWxlY3Ryb25pY3MgTTQxVDAwIFJUQyBJMkMgQ2xpZW50IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbWF4MTYxOS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbWF4MTYxOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZmE5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9tYXgxNjE5LmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qCisgKiBtYXgxNjE5LmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICogICAgICAgICAgICAgbW9uaXRvcmluZworICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgQWxleGV5IEZpc2hlciA8ZmlzaG9yQG1haWwucnU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqCisgKiBCYXNlZCBvbiB0aGUgbG05MCBkcml2ZXIuIFRoZSBNQVgxNjE5IGlzIGEgc2Vuc29yIGNoaXAgbWFkZSBieSBNYXhpbS4KKyAqIEl0IHJlcG9ydHMgdXAgdG8gdHdvIHRlbXBlcmF0dXJlcyAoaXRzIG93biBwbHVzIHVwIHRvCisgKiBvbmUgZXh0ZXJuYWwgb25lKS4gQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZQorICogb2J0YWluZWQgZnJvbSBNYXhpbSdzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly9wZGZzZXJ2Lm1heGltLWljLmNvbS9lbi9kcy9NQVgxNjE5LnBkZgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDE4LCAweDE5LCAweDFhLAorCQkJCQkweDI5LCAweDJhLCAweDJiLAorCQkJCQkweDRjLCAweDRkLCAweDRlLAorCQkJCQlJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKgorICogSW5zbW9kIHBhcmFtZXRlcnMKKyAqLworCitTRU5TT1JTX0lOU01PRF8xKG1heDE2MTkpOworCisvKgorICogVGhlIE1BWDE2MTkgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBNQVgxNjE5X1JFR19SX01BTl9JRAkJMHhGRQorI2RlZmluZSBNQVgxNjE5X1JFR19SX0NISVBfSUQJCTB4RkYKKyNkZWZpbmUgTUFYMTYxOV9SRUdfUl9DT05GSUcJCTB4MDMKKyNkZWZpbmUgTUFYMTYxOV9SRUdfV19DT05GSUcJCTB4MDkKKyNkZWZpbmUgTUFYMTYxOV9SRUdfUl9DT05WUkFURQkJMHgwNAorI2RlZmluZSBNQVgxNjE5X1JFR19XX0NPTlZSQVRFCQkweDBBCisjZGVmaW5lIE1BWDE2MTlfUkVHX1JfU1RBVFVTCQkweDAyCisjZGVmaW5lIE1BWDE2MTlfUkVHX1JfTE9DQUxfVEVNUAkweDAwCisjZGVmaW5lIE1BWDE2MTlfUkVHX1JfUkVNT1RFX1RFTVAJMHgwMQorI2RlZmluZSBNQVgxNjE5X1JFR19SX1JFTU9URV9ISUdICTB4MDcKKyNkZWZpbmUgTUFYMTYxOV9SRUdfV19SRU1PVEVfSElHSAkweDBECisjZGVmaW5lIE1BWDE2MTlfUkVHX1JfUkVNT1RFX0xPVwkweDA4CisjZGVmaW5lIE1BWDE2MTlfUkVHX1dfUkVNT1RFX0xPVwkweDBFCisjZGVmaW5lIE1BWDE2MTlfUkVHX1JfUkVNT1RFX0NSSVQJMHgxMAorI2RlZmluZSBNQVgxNjE5X1JFR19XX1JFTU9URV9DUklUCTB4MTIKKyNkZWZpbmUgTUFYMTYxOV9SRUdfUl9UQ1JJVF9IWVNUCTB4MTEKKyNkZWZpbmUgTUFYMTYxOV9SRUdfV19UQ1JJVF9IWVNUCTB4MTMKKworLyoKKyAqIENvbnZlcnNpb25zIGFuZCB2YXJpb3VzIG1hY3JvcworICovCisKKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCSgodmFsICYgMHg4MCA/IHZhbC0weDEwMCA6IHZhbCkgKiAxMDAwKQorI2RlZmluZSBURU1QX1RPX1JFRyh2YWwpCSgodmFsIDwgMCA/IHZhbCsweDEwMCoxMDAwIDogdmFsKSAvIDEwMDApCisKKy8qCisgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworCitzdGF0aWMgaW50IG1heDE2MTlfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgbWF4MTYxOV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwlpbnQga2luZCk7CitzdGF0aWMgdm9pZCBtYXgxNjE5X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBtYXgxNjE5X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgc3RydWN0IG1heDE2MTlfZGF0YSAqbWF4MTYxOV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qCisgKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKQorICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXgxNjE5X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm1heDE2MTkiLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IG1heDE2MTlfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBtYXgxNjE5X2RldGFjaF9jbGllbnQsCit9OworCisvKgorICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKKyAqLworCitzdHJ1Y3QgbWF4MTYxOV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KKworCS8qIHJlZ2lzdGVycyB2YWx1ZXMgKi8KKwl1OCB0ZW1wX2lucHV0MTsgLyogbG9jYWwgKi8KKwl1OCB0ZW1wX2lucHV0MiwgdGVtcF9sb3cyLCB0ZW1wX2hpZ2gyOyAvKiByZW1vdGUgKi8KKwl1OCB0ZW1wX2NyaXQyOworCXU4IHRlbXBfaHlzdDI7CisJdTggYWxhcm1zOyAKK307CisKKy8qCisgKiBTeXNmcyBzdHVmZgorICovCisKKyNkZWZpbmUgc2hvd190ZW1wKHZhbHVlKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBtYXgxNjE5X2RhdGEgKmRhdGEgPSBtYXgxNjE5X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7IFwKK30KK3Nob3dfdGVtcCh0ZW1wX2lucHV0MSk7CitzaG93X3RlbXAodGVtcF9pbnB1dDIpOworc2hvd190ZW1wKHRlbXBfbG93Mik7CitzaG93X3RlbXAodGVtcF9oaWdoMik7CitzaG93X3RlbXAodGVtcF9jcml0Mik7CitzaG93X3RlbXAodGVtcF9oeXN0Mik7CisKKyNkZWZpbmUgc2V0X3RlbXAyKHZhbHVlLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IG1heDE2MTlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPnZhbHVlID0gVEVNUF9UT19SRUcodmFsKTsgXAorCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIGRhdGEtPnZhbHVlKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30KKworc2V0X3RlbXAyKHRlbXBfbG93MiwgTUFYMTYxOV9SRUdfV19SRU1PVEVfTE9XKTsKK3NldF90ZW1wMih0ZW1wX2hpZ2gyLCBNQVgxNjE5X1JFR19XX1JFTU9URV9ISUdIKTsKK3NldF90ZW1wMih0ZW1wX2NyaXQyLCBNQVgxNjE5X1JFR19XX1JFTU9URV9DUklUKTsKK3NldF90ZW1wMih0ZW1wX2h5c3QyLCBNQVgxNjE5X1JFR19XX1RDUklUX0hZU1QpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbWF4MTYxOV9kYXRhICpkYXRhID0gbWF4MTYxOV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX2lucHV0MSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF9pbnB1dDIsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9sb3cyLAorCXNldF90ZW1wX2xvdzIpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9oaWdoMiwKKwlzZXRfdGVtcF9oaWdoMik7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9jcml0MiwKKwlzZXRfdGVtcF9jcml0Mik7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2h5c3QyLAorCXNldF90ZW1wX2h5c3QyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKKworLyoKKyAqIFJlYWwgY29kZQorICovCisKK3N0YXRpYyBpbnQgbWF4MTYxOV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBtYXgxNjE5X2RldGVjdCk7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRvZXMgbW9yZSB0aGFuIGp1c3QgZGV0ZWN0aW9uLiBJZiBkZXRlY3Rpb24KKyAqIHN1Y2NlZWRzLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbmV3IGNoaXAuCisgKi8KK3N0YXRpYyBpbnQgbWF4MTYxOV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IG1heDE2MTlfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpuYW1lID0gIiI7CQorCXU4IHJlZ19jb25maWc9MCwgcmVnX2NvbnZyYXRlPTAsIHJlZ19zdGF0dXM9MDsKKwl1OCBtYW5faWQsIGNoaXBfaWQ7CisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1heDE2MTlfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IG1heDE2MTlfZGF0YSkpOworCisJLyogVGhlIGNvbW1vbiBJMkMgY2xpZW50IGRhdGEgaXMgcGxhY2VkIHJpZ2h0IGJlZm9yZSB0aGUKKwkgICBNQVgxNjE5LXNwZWNpZmljIGRhdGEuICovCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZtYXgxNjE5X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKgorCSAqIE5vdyB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gQSBuZWdhdGl2ZSBraW5kIG1lYW5zIHRoYXQKKwkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCBubyBmb3JjZSBwYXJhbWV0ZXIgKGRlZmF1bHQpLCBzbyB3ZQorCSAqIG11c3QgYm90aCBkZXRlY3QgYW5kIGlkZW50aWZ5IHRoZSBjaGlwLiBBIHplcm8ga2luZCBtZWFucyB0aGF0CisJICogdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciwgdGhlIGRldGVjdGlvbgorCSAqIHN0ZXAgc2hhbGwgYmUgc2tpcHBlZC4gQSBwb3NpdGl2ZSBraW5kIG1lYW5zIHRoYXQgdGhlIGRyaXZlcgorCSAqIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyIGFuZCBhIGdpdmVuIGtpbmQgb2YgY2hpcCBpcworCSAqIHJlcXVlc3RlZCwgc28gYm90aCB0aGUgZGV0ZWN0aW9uIGFuZCB0aGUgaWRlbnRpZmljYXRpb24gc3RlcHMKKwkgKiBhcmUgc2tpcHBlZC4KKwkgKi8KKwlpZiAoa2luZCA8IDApIHsgLyogZGV0ZWN0aW9uICovCisJCXJlZ19jb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCSAgICAgIE1BWDE2MTlfUkVHX1JfQ09ORklHKTsKKwkJcmVnX2NvbnZyYXRlID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkgICAgICAgTUFYMTYxOV9SRUdfUl9DT05WUkFURSk7CisJCXJlZ19zdGF0dXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCQlNQVgxNjE5X1JFR19SX1NUQVRVUyk7CisJCWlmICgocmVnX2NvbmZpZyAmIDB4MDMpICE9IDB4MDAKKwkJIHx8IHJlZ19jb252cmF0ZSA+IDB4MDcgfHwgKHJlZ19zdGF0dXMgJiAweDYxICkgIT0weDAwKSB7CisJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkJIk1BWDE2MTkgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnguXG4iLAorCQkJCWFkZHJlc3MpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwl9CisKKwlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uICovCisJCisJCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJIE1BWDE2MTlfUkVHX1JfTUFOX0lEKTsKKwkJY2hpcF9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkJICBNQVgxNjE5X1JFR19SX0NISVBfSUQpOworCQkKKwkJaWYgKChtYW5faWQgPT0gMHg0RCkgJiYgKGNoaXBfaWQgPT0gMHgwNCkpeyAgCisJCQkJa2luZCA9IG1heDE2MTk7CisJCQl9CisJCX0KKworCQlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uIGZhaWxlZCAqLworCQkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKKwkJCSAgICAiVW5zdXBwb3J0ZWQgY2hpcCAobWFuX2lkPTB4JTAyWCwgIgorCQkJICAgICJjaGlwX2lkPTB4JTAyWCkuXG4iLCBtYW5faWQsIGNoaXBfaWQpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwkKKworCWlmIChraW5kID09IG1heDE2MTkpeworCQluYW1lID0gIm1heDE2MTkiOworCX0KKworCS8qIFdlIGNhbiBmaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBNQVgxNjE5IGNoaXAgKi8KKwltYXgxNjE5X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfY3JpdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9jcml0X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKKworCXJldHVybiAwOworCitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIG1heDE2MTlfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl1OCBjb25maWc7CisKKwkvKgorCSAqIFN0YXJ0IHRoZSBjb252ZXJzaW9ucy4KKwkgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTYxOV9SRUdfV19DT05WUkFURSwKKwkJCQkgIDUpOyAvKiAyIEh6ICovCisJY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTYxOV9SRUdfUl9DT05GSUcpOworCWlmIChjb25maWcgJiAweDQwKQorCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTYxOV9SRUdfV19DT05GSUcsCisJCQkJCSAgY29uZmlnICYgMHhCRik7IC8qIHJ1biAqLworfQorCitzdGF0aWMgaW50IG1heDE2MTlfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWF4MTYxOV9kYXRhICptYXgxNjE5X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IG1heDE2MTlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKiAyKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBtYXgxNjE5IGRhdGEuXG4iKTsKKwkJZGF0YS0+dGVtcF9pbnB1dDEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgxNjE5X1JFR19SX0xPQ0FMX1RFTVApOworCQlkYXRhLT50ZW1wX2lucHV0MiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCU1BWDE2MTlfUkVHX1JfUkVNT1RFX1RFTVApOworCQlkYXRhLT50ZW1wX2hpZ2gyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJTUFYMTYxOV9SRUdfUl9SRU1PVEVfSElHSCk7CisJCWRhdGEtPnRlbXBfbG93MiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCU1BWDE2MTlfUkVHX1JfUkVNT1RFX0xPVyk7CisJCWRhdGEtPnRlbXBfY3JpdDIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgxNjE5X1JFR19SX1JFTU9URV9DUklUKTsKKwkJZGF0YS0+dGVtcF9oeXN0MiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCU1BWDE2MTlfUkVHX1JfVENSSVRfSFlTVCk7CisJCWRhdGEtPmFsYXJtcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCU1BWDE2MTlfUkVHX1JfU1RBVFVTKTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX21heDE2MTlfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbWF4MTYxOV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19tYXgxNjE5X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbWF4MTYxOV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJBbGV4ZXkgRmlzaGVyIDxmaXNob3JAbWFpbC5ydT4gYW5kIgorCSJKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUFYMTYxOSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfbWF4MTYxOV9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfbWF4MTYxOV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjODczNjAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL3BjODczNjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk0YzM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvcGM4NzM2MC5jCkBAIC0wLDAgKzEsMTM0OSBAQAorLyoKKyAqICBwYzg3MzYwLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzCisgKiAgICAgICAgICAgICAgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogIENvcGllZCBmcm9tIHNtc2M0N20xLmM6CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBTdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNoaXBzOgorICoKKyAqICBDaGlwICAgICAgICAjdmluICAgICNmYW4gICAgI3B3bSAgICAjdGVtcCAgIGRldmlkCisgKiAgUEM4NzM2MCAgICAgLSAgICAgICAyICAgICAgIDIgICAgICAgLSAgICAgICAweEUxCisgKiAgUEM4NzM2MyAgICAgLSAgICAgICAyICAgICAgIDIgICAgICAgLSAgICAgICAweEU4CisgKiAgUEM4NzM2NCAgICAgLSAgICAgICAzICAgICAgIDMgICAgICAgLSAgICAgICAweEU0CisgKiAgUEM4NzM2NSAgICAgMTEgICAgICAzICAgICAgIDMgICAgICAgMiAgICAgICAweEU1CisgKiAgUEM4NzM2NiAgICAgMTEgICAgICAzICAgICAgIDMgICAgICAgMy00ICAgICAweEU5CisgKgorICogIFRoaXMgZHJpdmVyIGFzc3VtZXMgdGhhdCBubyBtb3JlIHRoYW4gb25lIGNoaXAgaXMgcHJlc2VudCwgYW5kIG9uZSBvZgorICogIHRoZSBzdGFuZGFyZCBTdXBlci1JL08gYWRkcmVzc2VzIGlzIHVzZWQgKDB4MkUvMHgyRiBvciAweDRFLzB4NEYpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXZpZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDAsIEkyQ19DTElFTlRfSVNBX0VORCB9Oworc3RhdGljIHN0cnVjdCBpMmNfZm9yY2VfZGF0YSBmb3JjZXNbXSA9IHt7IE5VTEwgfX07CitzdGF0aWMgdTggZGV2aWQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGV4dHJhX2lzYVszXTsKK3N0YXRpYyB1OCBjb25mcmVnWzRdOworCitlbnVtIGNoaXBzIHsgYW55X2NoaXAsIHBjODczNjAsIHBjODczNjMsIHBjODczNjQsIHBjODczNjUsIHBjODczNjYgfTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKKwkubm9ybWFsX2lzYQkJPSBub3JtYWxfaXNhLAorCS5mb3JjZXMJCQk9IGZvcmNlcywKK307CisKK3N0YXRpYyBpbnQgaW5pdCA9IDE7Cittb2R1bGVfcGFyYW0oaW5pdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW5pdCwKKyAiQ2hpcCBpbml0aWFsaXphdGlvbiBsZXZlbDpcbiIKKyAiIDA6IE5vbmVcbiIKKyAiKjE6IEZvcmNpYmx5IGVuYWJsZSBpbnRlcm5hbCB2b2x0YWdlIGFuZCB0ZW1wZXJhdHVyZSBjaGFubmVscywgZXhjZXB0IGluOVxuIgorICIgMjogRm9yY2libHkgZW5hYmxlIGFsbCB2b2x0YWdlIGFuZCB0ZW1wZXJhdHVyZSBjaGFubmVscywgZXhjZXB0IGluOVxuIgorICIgMzogRm9yY2libHkgZW5hYmxlIGFsbCB2b2x0YWdlIGFuZCB0ZW1wZXJhdHVyZSBjaGFubmVscywgaW5jbHVkaW5nIGluOSIpOworCisvKgorICogU3VwZXItSS9PIHJlZ2lzdGVycyBhbmQgb3BlcmF0aW9ucworICovCisKKyNkZWZpbmUgREVWCTB4MDcJLyogUmVnaXN0ZXI6IExvZ2ljYWwgZGV2aWNlIHNlbGVjdCAqLworI2RlZmluZSBERVZJRAkweDIwCS8qIFJlZ2lzdGVyOiBEZXZpY2UgSUQgKi8KKyNkZWZpbmUgQUNUCTB4MzAJLyogUmVnaXN0ZXI6IERldmljZSBhY3RpdmF0aW9uICovCisjZGVmaW5lIEJBU0UJMHg2MAkvKiBSZWdpc3RlcjogQmFzZSBhZGRyZXNzICovCisKKyNkZWZpbmUgRlNDTQkweDA5CS8qIExvZ2ljYWwgZGV2aWNlOiBmYW5zICovCisjZGVmaW5lIFZMTQkweDBkCS8qIExvZ2ljYWwgZGV2aWNlOiB2b2x0YWdlcyAqLworI2RlZmluZSBUTVMJMHgwZQkvKiBMb2dpY2FsIGRldmljZTogdGVtcGVyYXR1cmVzICovCitzdGF0aWMgY29uc3QgdTggbG9nZGV2WzNdID0geyBGU0NNLCBWTE0sIFRNUyB9OworCisjZGVmaW5lIExEX0ZBTgkJMAorI2RlZmluZSBMRF9JTgkJMQorI2RlZmluZSBMRF9URU1QCQkyCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdXBlcmlvX291dGIoaW50IHNpb2FkZHIsIGludCByZWcsIGludCB2YWwpCit7CisJb3V0YihyZWcsIHNpb2FkZHIpOworCW91dGIodmFsLCBzaW9hZGRyKzEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdXBlcmlvX2luYihpbnQgc2lvYWRkciwgaW50IHJlZykKK3sKKwlvdXRiKHJlZywgc2lvYWRkcik7CisJcmV0dXJuIGluYihzaW9hZGRyKzEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19leGl0KGludCBzaW9hZGRyKQoreworCW91dGIoMHgwMiwgc2lvYWRkcik7CisJb3V0YigweDAyLCBzaW9hZGRyKzEpOworfQorCisvKgorICogTG9naWNhbCBkZXZpY2VzCisgKi8KKworI2RlZmluZSBQQzg3MzYwX0VYVEVOVAkJMHgxMAorI2RlZmluZSBQQzg3MzY1X1JFR19CQU5LCTB4MDkKKyNkZWZpbmUgTk9fQkFOSwkJCTB4ZmYKKworLyoKKyAqIEZhbiByZWdpc3RlcnMgYW5kIGNvbnZlcnNpb25zCisgKi8KKworLyogbnIgaGFzIHRvIGJlIDAgb3IgMSAoUEM4NzM2MC84NzM2Mykgb3IgMiAoUEM4NzM2NC84NzM2NS84NzM2NikgKi8KKyNkZWZpbmUgUEM4NzM2MF9SRUdfUFJFU0NBTEUobnIpCSgweDAwICsgMiAqIChucikpCisjZGVmaW5lIFBDODczNjBfUkVHX1BXTShucikJCSgweDAxICsgMiAqIChucikpCisjZGVmaW5lIFBDODczNjBfUkVHX0ZBTl9NSU4obnIpCQkoMHgwNiArIDMgKiAobnIpKQorI2RlZmluZSBQQzg3MzYwX1JFR19GQU4obnIpCQkoMHgwNyArIDMgKiAobnIpKQorI2RlZmluZSBQQzg3MzYwX1JFR19GQU5fU1RBVFVTKG5yKQkoMHgwOCArIDMgKiAobnIpKQorCisjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsZGl2KQkJKCh2YWwpID09IDAgPyAwOiBcCisJCQkJCSA0ODAwMDAgLyAoKHZhbCkqKGRpdikpKQorI2RlZmluZSBGQU5fVE9fUkVHKHZhbCxkaXYpCQkoKHZhbCkgPD0gMTAwID8gMCA6IFwKKwkJCQkJIDQ4MDAwMCAvICgodmFsKSooZGl2KSkpCisjZGVmaW5lIEZBTl9ESVZfRlJPTV9SRUcodmFsKQkJKDEgPDwgKCh2YWwgPj4gNSkgJiAweDAzKSkKKyNkZWZpbmUgRkFOX1NUQVRVU19GUk9NX1JFRyh2YWwpCSgodmFsKSAmIDB4MDcpCisKKyNkZWZpbmUgRkFOX0NPTkZJR19NT05JVE9SKHZhbCxucikJKCgodmFsKSA+PiAoMiArIG5yICogMykpICYgMSkKKyNkZWZpbmUgRkFOX0NPTkZJR19DT05UUk9MKHZhbCxucikJKCgodmFsKSA+PiAoMyArIG5yICogMykpICYgMSkKKyNkZWZpbmUgRkFOX0NPTkZJR19JTlZFUlQodmFsLG5yKQkoKCh2YWwpID4+ICg0ICsgbnIgKiAzKSkgJiAxKQorCisjZGVmaW5lIFBXTV9GUk9NX1JFRyh2YWwsaW52KQkJKChpbnYpID8gMjU1IC0gKHZhbCkgOiAodmFsKSkKK3N0YXRpYyBpbmxpbmUgdTggUFdNX1RPX1JFRyhpbnQgdmFsLCBpbnQgaW52KQoreworCWlmIChpbnYpCisJCXZhbCA9IDI1NSAtIHZhbDsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKHZhbCA+IDI1NSkKKwkJcmV0dXJuIDI1NTsKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogVm9sdGFnZSByZWdpc3RlcnMgYW5kIGNvbnZlcnNpb25zCisgKi8KKworI2RlZmluZSBQQzg3MzY1X1JFR19JTl9DT05WUkFURQkJMHgwNworI2RlZmluZSBQQzg3MzY1X1JFR19JTl9DT05GSUcJCTB4MDgKKyNkZWZpbmUgUEM4NzM2NV9SRUdfSU4JCQkweDBCCisjZGVmaW5lIFBDODczNjVfUkVHX0lOX01JTgkJMHgwRAorI2RlZmluZSBQQzg3MzY1X1JFR19JTl9NQVgJCTB4MEMKKyNkZWZpbmUgUEM4NzM2NV9SRUdfSU5fU1RBVFVTCQkweDBBCisjZGVmaW5lIFBDODczNjVfUkVHX0lOX0FMQVJNUzEJCTB4MDAKKyNkZWZpbmUgUEM4NzM2NV9SRUdfSU5fQUxBUk1TMgkJMHgwMQorI2RlZmluZSBQQzg3MzY1X1JFR19WSUQJCQkweDA2CisKKyNkZWZpbmUgSU5fRlJPTV9SRUcodmFsLHJlZikJCSgoKHZhbCkgKiAocmVmKSArIDEyOCkgLyAyNTYpCisjZGVmaW5lIElOX1RPX1JFRyh2YWwscmVmKQkJKCh2YWwpIDwgMCA/IDAgOiBcCisJCQkJCSAodmFsKSoyNTYgPj0gKHJlZikqMjU1ID8gMjU1OiBcCisJCQkJCSAoKHZhbCkgKiAyNTYgKyAocmVmKS8yKSAvIChyZWYpKQorCisvKgorICogVGVtcGVyYXR1cmUgcmVnaXN0ZXJzIGFuZCBjb252ZXJzaW9ucworICovCisKKyNkZWZpbmUgUEM4NzM2NV9SRUdfVEVNUF9DT05GSUcJCTB4MDgKKyNkZWZpbmUgUEM4NzM2NV9SRUdfVEVNUAkJMHgwQgorI2RlZmluZSBQQzg3MzY1X1JFR19URU1QX01JTgkJMHgwRAorI2RlZmluZSBQQzg3MzY1X1JFR19URU1QX01BWAkJMHgwQworI2RlZmluZSBQQzg3MzY1X1JFR19URU1QX0NSSVQJCTB4MEUKKyNkZWZpbmUgUEM4NzM2NV9SRUdfVEVNUF9TVEFUVVMJCTB4MEEKKyNkZWZpbmUgUEM4NzM2NV9SRUdfVEVNUF9BTEFSTVMJCTB4MDAKKworI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkJCSgodmFsKSAqIDEwMDApCisjZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkJCSgodmFsKSA8IC01NTAwMCA/IC01NSA6IFwKKwkJCQkJICh2YWwpID4gMTI3MDAwID8gMTI3IDogXAorCQkJCQkgKHZhbCkgPCAwID8gKCh2YWwpIC0gNTAwKSAvIDEwMDAgOiBcCisJCQkJCSAoKHZhbCkgKyA1MDApIC8gMTAwMCkKKworLyoKKyAqIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pCisgKi8KKworc3RydWN0IHBjODczNjBfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJaW50IGFkZHJlc3NbM107CisKKwl1OCBmYW5uciwgaW5uciwgdGVtcG5yOworCisJdTggZmFuWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fbWluWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fc3RhdHVzWzNdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHB3bVszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZhbl9jb25mOwkJLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciB2YWx1ZXMsIGNvbWJpbmVkICovCisKKwl1MTYgaW5fdnJlZjsJCS8qIDEgbVYvYml0ICovCisJdTggaW5bMTRdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bMTRdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9tYXhbMTRdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9jcml0WzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9zdGF0dXNbMTRdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiBpbl9hbGFybXM7CQkvKiBSZWdpc3RlciB2YWx1ZXMsIGNvbWJpbmVkLCBtYXNrZWQgKi8KKwl1OCB2aWRfY29uZjsJCS8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB2cm07CisJdTggdmlkOwkJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisKKwlzOCB0ZW1wWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX21pblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9tYXhbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfY3JpdFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wX3N0YXR1c1szXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wX2FsYXJtczsJCS8qIFJlZ2lzdGVyIHZhbHVlLCBtYXNrZWQgKi8KK307CisKKy8qCisgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KKyAqLworCitzdGF0aWMgaW50IHBjODczNjBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgcGM4NzM2MF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCBwYzg3MzYwX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBpbnQgcGM4NzM2MF9yZWFkX3ZhbHVlKHN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEsIHU4IGxkaSwgdTggYmFuaywKKwkJCSAgICAgIHU4IHJlZyk7CitzdGF0aWMgdm9pZCBwYzg3MzYwX3dyaXRlX3ZhbHVlKHN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEsIHU4IGxkaSwgdTggYmFuaywKKwkJCQl1OCByZWcsIHU4IHZhbHVlKTsKK3N0YXRpYyB2b2lkIHBjODczNjBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHVzZV90aGVybWlzdG9ycyk7CitzdGF0aWMgc3RydWN0IHBjODczNjBfZGF0YSAqcGM4NzM2MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qCisgKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKQorICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwYzg3MzYwX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInBjODczNjAiLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IHBjODczNjBfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBwYzg3MzYwX2RldGFjaF9jbGllbnQsCit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIGZhbl9taW4gPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWZhbl9taW4gPSBGQU5fVE9fUkVHKGZhbl9taW4sIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX3N0YXR1c1tucl0pKTsKKworCS8qIElmIGl0IHdvdWxkbid0IGZpdCwgY2hhbmdlIGNsb2NrIGRpdmlzb3IgKi8KKwl3aGlsZSAoZmFuX21pbiA+IDI1NQorCSAgICAmJiAoZGF0YS0+ZmFuX3N0YXR1c1tucl0gJiAweDYwKSAhPSAweDYwKSB7CisJCWZhbl9taW4gPj49IDE7CisJCWRhdGEtPmZhbltucl0gPj49IDE7CisJCWRhdGEtPmZhbl9zdGF0dXNbbnJdICs9IDB4MjA7CisJfQorCWRhdGEtPmZhbl9taW5bbnJdID0gZmFuX21pbiA+IDI1NSA/IDI1NSA6IGZhbl9taW47CisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9GQU4sIE5PX0JBTkssIFBDODczNjBfUkVHX0ZBTl9NSU4obnIpLAorCQkJICAgIGRhdGEtPmZhbl9taW5bbnJdKTsKKworCS8qIFdyaXRlIG5ldyBkaXZpZGVyLCBwcmVzZXJ2ZSBhbGFybSBiaXRzICovCisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9GQU4sIE5PX0JBTkssIFBDODczNjBfUkVHX0ZBTl9TVEFUVVMobnIpLAorCQkJICAgIGRhdGEtPmZhbl9zdGF0dXNbbnJdICYgMHhGOSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzaG93X2FuZF9zZXRfZmFuKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW4jI29mZnNldCMjX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbltvZmZzZXQtMV0sIFwKKwkJICAgICAgIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX3N0YXR1c1tvZmZzZXQtMV0pKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW29mZnNldC0xXSwgXAorCQkgICAgICAgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fc3RhdHVzW29mZnNldC0xXSkpKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbiMjb2Zmc2V0IyNfZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgXAorCQkgICAgICAgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fc3RhdHVzW29mZnNldC0xXSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQjI19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBcCisJCSAgICAgICBGQU5fU1RBVFVTX0ZST01fUkVHKGRhdGEtPmZhbl9zdGF0dXNbb2Zmc2V0LTFdKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2V0X2ZhbiMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc2V0X2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQtMSk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwlzaG93X2ZhbiMjb2Zmc2V0IyNfaW5wdXQsIE5VTEwpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd19mYW4jI29mZnNldCMjX21pbiwgc2V0X2ZhbiMjb2Zmc2V0IyNfbWluKTsgXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfZGl2LCBTX0lSVUdPLCBcCisJc2hvd19mYW4jI29mZnNldCMjX2RpdiwgTlVMTCk7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX3N0YXR1cywgU19JUlVHTywgXAorCXNob3dfZmFuIyNvZmZzZXQjI19zdGF0dXMsIE5VTEwpOworc2hvd19hbmRfc2V0X2ZhbigxKQorc2hvd19hbmRfc2V0X2ZhbigyKQorc2hvd19hbmRfc2V0X2ZhbigzKQorCisjZGVmaW5lIHNob3dfYW5kX3NldF9wd20ob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bSMjb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgXAorCQkgICAgICAgUFdNX0ZST01fUkVHKGRhdGEtPnB3bVtvZmZzZXQtMV0sIFwKKwkJCQkgICAgRkFOX0NPTkZJR19JTlZFUlQoZGF0YS0+ZmFuX2NvbmYsIFwKKwkJCQkJCSAgICAgIG9mZnNldC0xKSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20jI29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT5wd21bb2Zmc2V0LTFdID0gUFdNX1RPX1JFRyh2YWwsIFwKKwkJCSAgICAgIEZBTl9DT05GSUdfSU5WRVJUKGRhdGEtPmZhbl9jb25mLCBvZmZzZXQtMSkpOyBcCisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9GQU4sIE5PX0JBTkssIFBDODczNjBfUkVHX1BXTShvZmZzZXQtMSksIFwKKwkJCSAgICBkYXRhLT5wd21bb2Zmc2V0LTFdKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0LCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfcHdtIyNvZmZzZXQsIHNldF9wd20jI29mZnNldCk7CitzaG93X2FuZF9zZXRfcHdtKDEpCitzaG93X2FuZF9zZXRfcHdtKDIpCitzaG93X2FuZF9zZXRfcHdtKDMpCisKKyNkZWZpbmUgc2hvd19hbmRfc2V0X2luKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IyNfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbltvZmZzZXRdLCBcCisJCSAgICAgICBkYXRhLT5pbl92cmVmKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWluW29mZnNldF0sIFwKKwkJICAgICAgIGRhdGEtPmluX3ZyZWYpKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzaG93X2luIyNvZmZzZXQjI19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9tYXhbb2Zmc2V0XSwgXAorCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmluX3N0YXR1c1tvZmZzZXRdKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT5pbl9taW5bb2Zmc2V0XSA9IElOX1RPX1JFRyh2YWwsIGRhdGEtPmluX3ZyZWYpOyBcCisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9JTiwgb2Zmc2V0LCBQQzg3MzY1X1JFR19JTl9NSU4sIFwKKwkJCSAgICBkYXRhLT5pbl9taW5bb2Zmc2V0XSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPmluX21heFtvZmZzZXRdID0gSU5fVE9fUkVHKHZhbCwgXAorCQkJICAgICAgIGRhdGEtPmluX3ZyZWYpOyBcCisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9JTiwgb2Zmc2V0LCBQQzg3MzY1X1JFR19JTl9NQVgsIFwKKwkJCSAgICBkYXRhLT5pbl9tYXhbb2Zmc2V0XSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwlzaG93X2luIyNvZmZzZXQjI19pbnB1dCwgTlVMTCk7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOyBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsgXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19zdGF0dXMsIFNfSVJVR08sIFwKKwlzaG93X2luIyNvZmZzZXQjI19zdGF0dXMsIE5VTEwpOworc2hvd19hbmRfc2V0X2luKDApCitzaG93X2FuZF9zZXRfaW4oMSkKK3Nob3dfYW5kX3NldF9pbigyKQorc2hvd19hbmRfc2V0X2luKDMpCitzaG93X2FuZF9zZXRfaW4oNCkKK3Nob3dfYW5kX3NldF9pbig1KQorc2hvd19hbmRfc2V0X2luKDYpCitzaG93X2FuZF9zZXRfaW4oNykKK3Nob3dfYW5kX3NldF9pbig4KQorc2hvd19hbmRfc2V0X2luKDkpCitzaG93X2FuZF9zZXRfaW4oMTApCisKKyNkZWZpbmUgc2hvd19hbmRfc2V0X3RoZXJtKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluW29mZnNldCs3XSwgXAorCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWluW29mZnNldCs3XSwgXAorCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W29mZnNldCs3XSwgXAorCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX2NyaXRbb2Zmc2V0LTRdLCBcCisJCSAgICAgICBkYXRhLT5pbl92cmVmKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5pbl9zdGF0dXNbb2Zmc2V0KzddKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPmluX21pbltvZmZzZXQrN10gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl92cmVmKTsgXAorCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIG9mZnNldCs3LCBQQzg3MzY1X1JFR19URU1QX01JTiwgXAorCQkJICAgIGRhdGEtPmluX21pbltvZmZzZXQrN10pOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPmluX21heFtvZmZzZXQrN10gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl92cmVmKTsgXAorCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIG9mZnNldCs3LCBQQzg3MzY1X1JFR19URU1QX01BWCwgXAorCQkJICAgIGRhdGEtPmluX21heFtvZmZzZXQrN10pOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT5pbl9jcml0W29mZnNldC00XSA9IElOX1RPX1JFRyh2YWwsIGRhdGEtPmluX3ZyZWYpOyBcCisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9JTiwgb2Zmc2V0KzcsIFBDODczNjVfUkVHX1RFTVBfQ1JJVCwgXAorCQkJICAgIGRhdGEtPmluX2NyaXRbb2Zmc2V0LTRdKTsgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCisJc2hvd190ZW1wIyNvZmZzZXQjI19pbnB1dCwgTlVMTCk7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd190ZW1wIyNvZmZzZXQjI19taW4sIHNldF90ZW1wIyNvZmZzZXQjI19taW4pOyBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfdGVtcCMjb2Zmc2V0IyNfbWF4LCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWF4KTsgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd190ZW1wIyNvZmZzZXQjI19jcml0LCBzZXRfdGVtcCMjb2Zmc2V0IyNfY3JpdCk7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19zdGF0dXMsIFNfSVJVR08sIFwKKwlzaG93X3RlbXAjI29mZnNldCMjX3N0YXR1cywgTlVMTCk7CitzaG93X2FuZF9zZXRfdGhlcm0oNCkKK3Nob3dfYW5kX3NldF90aGVybSg1KQorc2hvd19hbmRfc2V0X3RoZXJtKDYpCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCwgZGF0YS0+dnJtKSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfdmlkLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd192cm0oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT52cm0pOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWRhdGEtPnZybSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih2cm0sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZybSwgc2V0X3ZybSk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+aW5fYWxhcm1zKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihhbGFybXNfaW4sIFNfSVJVR08sIHNob3dfaW5fYWxhcm1zLCBOVUxMKTsKKworI2RlZmluZSBzaG93X2FuZF9zZXRfdGVtcChvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBbb2Zmc2V0LTFdKSk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWluW29mZnNldC0xXSkpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heFtvZmZzZXQtMV0pKTsgXAorfVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9jcml0W29mZnNldC0xXSkpOyBcCit9XAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT50ZW1wX3N0YXR1c1tvZmZzZXQtMV0pOyBcCit9XAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAorCXNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAorIFwKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT50ZW1wX21pbltvZmZzZXQtMV0gPSBURU1QX1RPX1JFRyh2YWwpOyBcCisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBvZmZzZXQtMSwgUEM4NzM2NV9SRUdfVEVNUF9NSU4sIFwKKwkJCSAgICBkYXRhLT50ZW1wX21pbltvZmZzZXQtMV0pOyBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPnRlbXBfbWF4W29mZnNldC0xXSA9IFRFTVBfVE9fUkVHKHZhbCk7IFwKKwlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX1RFTVAsIG9mZnNldC0xLCBQQzg3MzY1X1JFR19URU1QX01BWCwgXAorCQkJICAgIGRhdGEtPnRlbXBfbWF4W29mZnNldC0xXSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCisJc2l6ZV90IGNvdW50KSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCisgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCWRhdGEtPnRlbXBfY3JpdFtvZmZzZXQtMV0gPSBURU1QX1RPX1JFRyh2YWwpOyBcCisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBvZmZzZXQtMSwgUEM4NzM2NV9SRUdfVEVNUF9DUklULCBcCisJCQkgICAgZGF0YS0+dGVtcF9jcml0W29mZnNldC0xXSk7IFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgXAorCXNob3dfdGVtcCMjb2Zmc2V0IyNfaW5wdXQsIE5VTEwpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfdGVtcCMjb2Zmc2V0IyNfbWluLCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWluKTsgXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X3RlbXAjI29mZnNldCMjX21heCwgc2V0X3RlbXAjI29mZnNldCMjX21heCk7IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfdGVtcCMjb2Zmc2V0IyNfY3JpdCwgc2V0X3RlbXAjI29mZnNldCMjX2NyaXQpOyBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfc3RhdHVzLCBTX0lSVUdPLCBcCisJc2hvd190ZW1wIyNvZmZzZXQjI19zdGF0dXMsIE5VTEwpOworc2hvd19hbmRfc2V0X3RlbXAoMSkKK3Nob3dfYW5kX3NldF90ZW1wKDIpCitzaG93X2FuZF9zZXRfdGVtcCgzKQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+dGVtcF9hbGFybXMpOworfQorc3RhdGljIERFVklDRV9BVFRSKGFsYXJtc190ZW1wLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm1zLCBOVUxMKTsKKworLyoKKyAqIERldmljZSBkZXRlY3Rpb24sIHJlZ2lzdHJhdGlvbiBhbmQgdXBkYXRlCisgKi8KKworc3RhdGljIGludCBwYzg3MzYwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBwYzg3MzYwX2RldGVjdCk7Cit9CisKK3N0YXRpYyBpbnQgcGM4NzM2MF9maW5kKGludCBzaW9hZGRyLCB1OCAqZGV2aWQsIGludCAqYWRkcmVzcykKK3sKKwl1MTYgdmFsOworCWludCBpOworCWludCBucmRldjsgLyogbG9naWNhbCBkZXZpY2UgY291bnQgKi8KKworCS8qIE5vIHN1cGVyaW9fZW50ZXIgKi8KKworCS8qIElkZW50aWZ5IGRldmljZSAqLworCXZhbCA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIERFVklEKTsKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMHhFMTogLyogUEM4NzM2MCAqLworCWNhc2UgMHhFODogLyogUEM4NzM2MyAqLworCWNhc2UgMHhFNDogLyogUEM4NzM2NCAqLworCQlucmRldiA9IDE7CisJCWJyZWFrOworCWNhc2UgMHhFNTogLyogUEM4NzM2NSAqLworCWNhc2UgMHhFOTogLyogUEM4NzM2NiAqLworCQlucmRldiA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN1cGVyaW9fZXhpdChzaW9hZGRyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIFJlbWVtYmVyIHRoZSBkZXZpY2UgaWQgKi8KKwkqZGV2aWQgPSB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJkZXY7IGkrKykgeworCQkvKiBzZWxlY3QgbG9naWNhbCBkZXZpY2UgKi8KKwkJc3VwZXJpb19vdXRiKHNpb2FkZHIsIERFViwgbG9nZGV2W2ldKTsKKworCQl2YWwgPSBzdXBlcmlvX2luYihzaW9hZGRyLCBBQ1QpOworCQlpZiAoISh2YWwgJiAweDAxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAicGM4NzM2MDogRGV2aWNlIDB4JTAyeCBub3QgIgorCQkJICAgICAgICJhY3RpdmF0ZWRcbiIsIGxvZ2RldltpXSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXZhbCA9IChzdXBlcmlvX2luYihzaW9hZGRyLCBCQVNFKSA8PCA4KQorCQkgICAgfCBzdXBlcmlvX2luYihzaW9hZGRyLCBCQVNFICsgMSk7CisJCWlmICghdmFsKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJwYzg3MzYwOiBCYXNlIGFkZHJlc3Mgbm90IHNldCBmb3IgIgorCQkJICAgICAgICJkZXZpY2UgMHglMDJ4XG4iLCBsb2dkZXZbaV0pOworCQkJY29udGludWU7CisJCX0KKworCQlhZGRyZXNzW2ldID0gdmFsOworCisJCWlmIChpPT0wKSB7IC8qIEZhbnMgKi8KKwkJCWNvbmZyZWdbMF0gPSBzdXBlcmlvX2luYihzaW9hZGRyLCAweEYwKTsKKwkJCWNvbmZyZWdbMV0gPSBzdXBlcmlvX2luYihzaW9hZGRyLCAweEYxKTsKKworI2lmZGVmIERFQlVHCisJCQlwcmludGsoS0VSTl9ERUJVRyAicGM4NzM2MDogRmFuIDE6IG1vbj0lZCAiCisJCQkgICAgICAgImN0cmw9JWQgaW52PSVkXG4iLCAoY29uZnJlZ1swXT4+MikmMSwKKwkJCSAgICAgICAoY29uZnJlZ1swXT4+MykmMSwgKGNvbmZyZWdbMF0+PjQpJjEpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjODczNjA6IEZhbiAyOiBtb249JWQgIgorCQkJICAgICAgICJjdHJsPSVkIGludj0lZFxuIiwgKGNvbmZyZWdbMF0+PjUpJjEsCisJCQkgICAgICAgKGNvbmZyZWdbMF0+PjYpJjEsIChjb25mcmVnWzBdPj43KSYxKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJwYzg3MzYwOiBGYW4gMzogbW9uPSVkICIKKwkJCSAgICAgICAiY3RybD0lZCBpbnY9JWRcbiIsIGNvbmZyZWdbMV0mMSwKKwkJCSAgICAgICAoY29uZnJlZ1sxXT4+MSkmMSwgKGNvbmZyZWdbMV0+PjIpJjEpOworI2VuZGlmCisJCX0gZWxzZSBpZiAoaT09MSkgeyAvKiBWb2x0YWdlcyAqLworCQkJLyogQXJlIHdlIHVzaW5nIHRoZXJtaXN0b3JzPyAqLworCQkJaWYgKCpkZXZpZCA9PSAweEU5KSB7IC8qIFBDODczNjYgKi8KKwkJCQkvKiBUaGVzZSByZWdpc3RlcnMgYXJlIG5vdCBsb2dpY2FsLWRldmljZQorCQkJCSAgIHNwZWNpZmljLCBqdXN0IHRoYXQgd2Ugd29uJ3QgbmVlZCB0aGVtIGlmCisJCQkJICAgd2UgZG9uJ3QgdXNlIHRoZSBWTE0gZGV2aWNlICovCisJCQkJY29uZnJlZ1syXSA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIDB4MkIpOworCQkJCWNvbmZyZWdbM10gPSBzdXBlcmlvX2luYihzaW9hZGRyLCAweDI1KTsKKworCQkJCWlmIChjb25mcmVnWzJdICYgMHg0MCkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICJwYzg3MzYwOiBVc2luZyAiCisJCQkJCSAgICAgICAidGhlcm1pc3RvcnMgZm9yIHRlbXBlcmF0dXJlICIKKwkJCQkJICAgICAgICJtb25pdG9yaW5nXG4iKTsKKwkJCQl9CisJCQkJaWYgKGNvbmZyZWdbM10gJiAweEUwKSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8gInBjODczNjA6IFZJRCAiCisJCQkJCSAgICAgICAiaW5wdXRzIHJvdXRlZCAobW9kZSAldSlcbiIsCisJCQkJCSAgICAgICBjb25mcmVnWzNdID4+IDUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXN1cGVyaW9fZXhpdChzaW9hZGRyKTsKKwlyZXR1cm4gMDsKK30KKworLyogV2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGFkZHJlc3MuCisgICBSZWFkIGZyb20gZXh0cmFfaXNhIGluc3RlYWQuICovCitpbnQgcGM4NzM2MF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJaW50IGk7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpuYW1lID0gInBjODczNjAiOworCWludCB1c2VfdGhlcm1pc3RvcnMgPSAwOworCisJaWYgKCFpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYzg3MzYwX2RhdGEpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChkYXRhLCAweDAwLCBzaXplb2Yoc3RydWN0IHBjODczNjBfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCWluaXRfTVVURVgoJmRhdGEtPmxvY2spOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZwYzg3MzYwX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwlkYXRhLT5mYW5uciA9IDI7CisJZGF0YS0+aW5uciA9IDA7CisJZGF0YS0+dGVtcG5yID0gMDsKKworCXN3aXRjaCAoZGV2aWQpIHsKKwljYXNlIDB4ZTg6CisJCW5hbWUgPSAicGM4NzM2MyI7CisJCWJyZWFrOworCWNhc2UgMHhlNDoKKwkJbmFtZSA9ICJwYzg3MzY0IjsKKwkJZGF0YS0+ZmFubnIgPSAzOworCQlicmVhazsKKwljYXNlIDB4ZTU6CisJCW5hbWUgPSAicGM4NzM2NSI7CisJCWRhdGEtPmZhbm5yID0gZXh0cmFfaXNhWzBdID8gMyA6IDA7CisJCWRhdGEtPmlubnIgPSBleHRyYV9pc2FbMV0gPyAxMSA6IDA7CisJCWRhdGEtPnRlbXBuciA9IGV4dHJhX2lzYVsyXSA/IDIgOiAwOworCQlicmVhazsKKwljYXNlIDB4ZTk6CisJCW5hbWUgPSAicGM4NzM2NiI7CisJCWRhdGEtPmZhbm5yID0gZXh0cmFfaXNhWzBdID8gMyA6IDA7CisJCWRhdGEtPmlubnIgPSBleHRyYV9pc2FbMV0gPyAxNCA6IDA7CisJCWRhdGEtPnRlbXBuciA9IGV4dHJhX2lzYVsyXSA/IDMgOiAwOworCQlicmVhazsKKwl9CisKKwlzdHJjcHkobmV3X2NsaWVudC0+bmFtZSwgbmFtZSk7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJaWYgKCgoZGF0YS0+YWRkcmVzc1tpXSA9IGV4dHJhX2lzYVtpXSkpCisJCSAmJiAhcmVxdWVzdF9yZWdpb24oZXh0cmFfaXNhW2ldLCBQQzg3MzYwX0VYVEVOVCwKKwkJIAkJICAgIHBjODczNjBfZHJpdmVyLm5hbWUpKSB7CisJCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsICJSZWdpb24gMHgleC0weCV4IGFscmVhZHkgIgorCQkJCSJpbiB1c2UhXG4iLCBleHRyYV9pc2FbaV0sCisJCQkJZXh0cmFfaXNhW2ldK1BDODczNjBfRVhURU5ULTEpOworCQkJZm9yIChpLS07IGkgPj0gMDsgaS0tKQorCQkJCXJlbGVhc2VfcmVnaW9uKGV4dHJhX2lzYVtpXSwgUEM4NzM2MF9FWFRFTlQpOworCQkJZXJyID0gLUVCVVNZOworCQkJZ290byBFUlJPUjE7CisJCX0KKwl9CisKKwkvKiBSZXRyaWV2ZSB0aGUgZmFucyBjb25maWd1cmF0aW9uIGZyb20gU3VwZXItSS9PIHNwYWNlICovCisJaWYgKGRhdGEtPmZhbm5yKQorCQlkYXRhLT5mYW5fY29uZiA9IGNvbmZyZWdbMF0gfCAoY29uZnJlZ1sxXSA8PCA4KTsKKworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIEVSUk9SMjsKKworCS8qIFVzZSB0aGUgY29ycmVjdCByZWZlcmVuY2Ugdm9sdGFnZQorCSAgIFVubGVzcyBib3RoIHRoZSBWTE0gYW5kIHRoZSBUTVMgbG9naWNhbCBkZXZpY2VzIGFncmVlIHRvCisJICAgdXNlIGFuIGV4dGVybmFsIFZyZWYsIHRoZSBpbnRlcm5hbCBvbmUgaXMgdXNlZC4gKi8KKwlpZiAoZGF0YS0+aW5ucikgeworCQlpID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLCBOT19CQU5LLAorCQkJCSAgICAgICBQQzg3MzY1X1JFR19JTl9DT05GSUcpOworCQlpZiAoZGF0YS0+dGVtcG5yKSB7CisJCQlpICY9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9URU1QLCBOT19CQU5LLAorCQkJCQkJUEM4NzM2NV9SRUdfVEVNUF9DT05GSUcpOworCQl9CisJCWRhdGEtPmluX3ZyZWYgPSAoaSYweDAyKSA/IDMwMjUgOiAyOTY2OworCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJVc2luZyAlcyByZWZlcmVuY2Ugdm9sdGFnZVxuIiwKKwkJCShpJjB4MDIpID8gImV4dGVybmFsIiA6ICJpbnRlcm5hbCIpOworCisJCWRhdGEtPnZpZF9jb25mID0gY29uZnJlZ1szXTsKKwkJZGF0YS0+dnJtID0gOTA7CisJfQorCisJLyogRmFuIGNsb2NrIGRpdmlkZXJzIG1heSBiZSBuZWVkZWQgYmVmb3JlIGFueSBkYXRhIGlzIHJlYWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+ZmFubnI7IGkrKykgeworCQlpZiAoRkFOX0NPTkZJR19NT05JVE9SKGRhdGEtPmZhbl9jb25mLCBpKSkKKwkJCWRhdGEtPmZhbl9zdGF0dXNbaV0gPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwKKwkJCQkJICAgICAgTERfRkFOLCBOT19CQU5LLAorCQkJCQkgICAgICBQQzg3MzYwX1JFR19GQU5fU1RBVFVTKGkpKTsKKwl9CisKKwlpZiAoaW5pdCA+IDApIHsKKwkJaWYgKGRldmlkID09IDB4ZTkgJiYgZGF0YS0+YWRkcmVzc1sxXSkgLyogUEM4NzM2NiAqLworCQkJdXNlX3RoZXJtaXN0b3JzID0gY29uZnJlZ1syXSAmIDB4NDA7CisKKwkJcGM4NzM2MF9pbml0X2NsaWVudChuZXdfY2xpZW50LCB1c2VfdGhlcm1pc3RvcnMpOworCX0KKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJaWYgKGRhdGEtPmlubnIpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luN19pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW44X2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjlfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTBfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luN19taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOF9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOV9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTBfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjdfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjhfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjlfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEwX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW43X3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW44X3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW45X3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xMF9zdGF0dXMpOworCisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3ZybSk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zX2luKTsKKwl9CisKKwlpZiAoZGF0YS0+dGVtcG5yKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2NyaXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2NyaXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfc3RhdHVzKTsKKworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtc190ZW1wKTsKKwl9CisJaWYgKGRhdGEtPnRlbXBuciA9PSAzKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19jcml0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19zdGF0dXMpOworCX0KKwlpZiAoZGF0YS0+aW5uciA9PSAxNCkgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA0X2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNV9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDZfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA0X21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDVfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNl9taW4pOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA0X21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDVfbWF4KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNl9tYXgpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA0X2NyaXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA1X2NyaXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA2X2NyaXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA0X3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDVfc3RhdHVzKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNl9zdGF0dXMpOworCX0KKworCWlmIChkYXRhLT5mYW5ucikgeworCQlpZiAoRkFOX0NPTkZJR19NT05JVE9SKGRhdGEtPmZhbl9jb25mLCAwKSkgeworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSAgICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKKwkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfZmFuMV9taW4pOworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSAgICZkZXZfYXR0cl9mYW4xX2Rpdik7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJCQkJICAgJmRldl9hdHRyX2ZhbjFfc3RhdHVzKTsKKwkJfQorCisJCWlmIChGQU5fQ09ORklHX01PTklUT1IoZGF0YS0+ZmFuX2NvbmYsIDEpKSB7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJCQkJICAgJmRldl9hdHRyX2ZhbjJfaW5wdXQpOworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSAgICZkZXZfYXR0cl9mYW4yX21pbik7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJCQkJICAgJmRldl9hdHRyX2ZhbjJfZGl2KTsKKwkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfZmFuMl9zdGF0dXMpOworCQl9CisKKwkJaWYgKEZBTl9DT05GSUdfQ09OVFJPTChkYXRhLT5mYW5fY29uZiwgMCkpCisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTEpOworCQlpZiAoRkFOX0NPTkZJR19DT05UUk9MKGRhdGEtPmZhbl9jb25mLCAxKSkKKwkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMik7CisJfQorCWlmIChkYXRhLT5mYW5uciA9PSAzKSB7CisJCWlmIChGQU5fQ09ORklHX01PTklUT1IoZGF0YS0+ZmFuX2NvbmYsIDIpKSB7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJCQkJICAgJmRldl9hdHRyX2ZhbjNfaW5wdXQpOworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSAgICZkZXZfYXR0cl9mYW4zX21pbik7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJCQkJICAgJmRldl9hdHRyX2ZhbjNfZGl2KTsKKwkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfZmFuM19zdGF0dXMpOworCQl9CisKKwkJaWYgKEZBTl9DT05GSUdfQ09OVFJPTChkYXRhLT5mYW5fY29uZiwgMikpCisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTMpOworCX0KKworCXJldHVybiAwOworCitFUlJPUjI6CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoZGF0YS0+YWRkcmVzc1tpXSkgeworCQkJcmVsZWFzZV9yZWdpb24oZGF0YS0+YWRkcmVzc1tpXSwgUEM4NzM2MF9FWFRFTlQpOworCQl9CisJfQorRVJST1IxOgorCWtmcmVlKGRhdGEpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcGM4NzM2MF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJaWYgKChpID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gaTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlmIChkYXRhLT5hZGRyZXNzW2ldKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihkYXRhLT5hZGRyZXNzW2ldLCBQQzg3MzYwX0VYVEVOVCk7CisJCX0KKwl9CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogbGRpIGlzIHRoZSBsb2dpY2FsIGRldmljZSBpbmRleAorICAgYmFuayBpcyBmb3Igdm9sdGFnZXMgYW5kIHRlbXBlcmF0dXJlcyBvbmx5ICovCitzdGF0aWMgaW50IHBjODczNjBfcmVhZF92YWx1ZShzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhLCB1OCBsZGksIHU4IGJhbmssCisJCQkgICAgICB1OCByZWcpCit7CisJaW50IHJlczsKKworCWRvd24oJihkYXRhLT5sb2NrKSk7CisJaWYgKGJhbmsgIT0gTk9fQkFOSykKKwkJb3V0Yl9wKGJhbmssIGRhdGEtPmFkZHJlc3NbbGRpXSArIFBDODczNjVfUkVHX0JBTkspOworCXJlcyA9IGluYl9wKGRhdGEtPmFkZHJlc3NbbGRpXSArIHJlZyk7CisJdXAoJihkYXRhLT5sb2NrKSk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBwYzg3MzYwX3dyaXRlX3ZhbHVlKHN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEsIHU4IGxkaSwgdTggYmFuaywKKwkJCQl1OCByZWcsIHU4IHZhbHVlKQoreworCWRvd24oJihkYXRhLT5sb2NrKSk7CisJaWYgKGJhbmsgIT0gTk9fQkFOSykKKwkJb3V0Yl9wKGJhbmssIGRhdGEtPmFkZHJlc3NbbGRpXSArIFBDODczNjVfUkVHX0JBTkspOworCW91dGJfcCh2YWx1ZSwgZGF0YS0+YWRkcmVzc1tsZGldICsgcmVnKTsKKwl1cCgmKGRhdGEtPmxvY2spKTsKK30KKworc3RhdGljIHZvaWQgcGM4NzM2MF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgdXNlX3RoZXJtaXN0b3JzKQoreworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaSwgbnI7CisJY29uc3QgdTggaW5pdF9pblsxNF0gPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDEsIDEsIDMsIDEsIDIsIDIsIDIgfTsKKwljb25zdCB1OCBpbml0X3RlbXBbM10gPSB7IDIsIDIsIDEgfTsKKwl1OCByZWc7CisKKwlpZiAoaW5pdCA+PSAyICYmIGRhdGEtPmlubnIpIHsKKwkJcmVnID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLCBOT19CQU5LLAorCQkJCQkgUEM4NzM2NV9SRUdfSU5fQ09OVlJBVEUpOworCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJWTE0gY29udmVyc2lvbiBzZXQgdG8iCisJCQkgIjFzIHBlcmlvZCwgMTYwdXMgZGVsYXlcbiIpOworCQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0lOLCBOT19CQU5LLAorCQkJCSAgICBQQzg3MzY1X1JFR19JTl9DT05WUkFURSwKKwkJCQkgICAgKHJlZyAmIDB4QzApIHwgMHgxMSk7CisJfQorCisJbnIgPSBkYXRhLT5pbm5yIDwgMTEgPyBkYXRhLT5pbm5yIDogMTE7CisJZm9yIChpPTA7IGk8bnI7IGkrKykgeworCQlpZiAoaW5pdCA+PSBpbml0X2luW2ldKSB7CisJCQkvKiBGb3JjaWJseSBlbmFibGUgdm9sdGFnZSBjaGFubmVsICovCisJCQlyZWcgPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfSU4sIGksCisJCQkJCQkgUEM4NzM2NV9SRUdfSU5fU1RBVFVTKTsKKwkJCWlmICghKHJlZyAmIDB4MDEpKSB7CisJCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJGb3JjaWJseSAiCisJCQkJCSJlbmFibGluZyBpbiVkXG4iLCBpKTsKKwkJCQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0lOLCBpLAorCQkJCQkJICAgIFBDODczNjVfUkVHX0lOX1NUQVRVUywKKwkJCQkJCSAgICAocmVnICYgMHg2OCkgfCAweDg3KTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFdlIGNhbid0IGJsaW5kbHkgdHJ1c3QgdGhlIFN1cGVyLUkvTyBzcGFjZSBjb25maWd1cmF0aW9uIGJpdCwKKwkgICBtb3N0IEJJT1Mgd29uJ3Qgc2V0IGl0IHByb3Blcmx5ICovCisJZm9yIChpPTExOyBpPGRhdGEtPmlubnI7IGkrKykgeworCQlyZWcgPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfSU4sIGksCisJCQkJCSBQQzg3MzY1X1JFR19URU1QX1NUQVRVUyk7CisJCXVzZV90aGVybWlzdG9ycyA9IHVzZV90aGVybWlzdG9ycyB8fCAocmVnICYgMHgwMSk7CisJfQorCisJaSA9IHVzZV90aGVybWlzdG9ycyA/IDIgOiAwOworCWZvciAoOyBpPGRhdGEtPnRlbXBucjsgaSsrKSB7CisJCWlmIChpbml0ID49IGluaXRfdGVtcFtpXSkgeworCQkJLyogRm9yY2libHkgZW5hYmxlIHRlbXBlcmF0dXJlIGNoYW5uZWwgKi8KKwkJCXJlZyA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9URU1QLCBpLAorCQkJCQkJIFBDODczNjVfUkVHX1RFTVBfU1RBVFVTKTsKKwkJCWlmICghKHJlZyAmIDB4MDEpKSB7CisJCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJGb3JjaWJseSAiCisJCQkJCSJlbmFibGluZyB0ZW1wJWRcbiIsIGkrMSk7CisJCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBpLAorCQkJCQkJICAgIFBDODczNjVfUkVHX1RFTVBfU1RBVFVTLAorCQkJCQkJICAgIDB4Q0YpOworCQkJfQorCQl9CisJfQorCisJaWYgKHVzZV90aGVybWlzdG9ycykgeworCQlmb3IgKGk9MTE7IGk8ZGF0YS0+aW5ucjsgaSsrKSB7CisJCQlpZiAoaW5pdCA+PSBpbml0X2luW2ldKSB7CisJCQkJLyogVGhlIHBpbiBtYXkgYWxyZWFkeSBiZSB1c2VkIGJ5IHRoZXJtYWwKKwkJCQkgICBkaW9kZXMgKi8KKwkJCQlyZWcgPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfVEVNUCwKKwkJCQkgICAgICAoaS0xMSkvMiwgUEM4NzM2NV9SRUdfVEVNUF9TVEFUVVMpOworCQkJCWlmIChyZWcgJiAweDAxKSB7CisJCQkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU2tpcHBpbmcgIgorCQkJCQkJInRlbXAlZCwgcGluIGFscmVhZHkgaW4gdXNlICIKKwkJCQkJCSJieSB0ZW1wJWRcbiIsIGktNywgKGktMTEpLzIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvKiBGb3JjaWJseSBlbmFibGUgdGhlcm1pc3RvciBjaGFubmVsICovCisJCQkJcmVnID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLCBpLAorCQkJCQkJCSBQQzg3MzY1X1JFR19JTl9TVEFUVVMpOworCQkJCWlmICghKHJlZyAmIDB4MDEpKSB7CisJCQkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRm9yY2libHkgIgorCQkJCQkJImVuYWJsaW5nIHRlbXAlZFxuIiwgaS03KTsKKwkJCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9JTiwgaSwKKwkJCQkJCVBDODczNjVfUkVHX1RFTVBfU1RBVFVTLAorCQkJCQkJKHJlZyAmIDB4NjApIHwgMHg4Rik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKGRhdGEtPmlubnIpIHsKKwkJcmVnID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0lOLCBOT19CQU5LLAorCQkJCQkgUEM4NzM2NV9SRUdfSU5fQ09ORklHKTsKKwkJaWYgKHJlZyAmIDB4MDEpIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRm9yY2libHkgIgorCQkJCSJlbmFibGluZyBtb25pdG9yaW5nIChWTE0pXG4iKTsKKwkJCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIE5PX0JBTkssCisJCQkJCSAgICBQQzg3MzY1X1JFR19JTl9DT05GSUcsCisJCQkJCSAgICByZWcgJiAweEZFKTsKKwkJfQorCX0KKworCWlmIChkYXRhLT50ZW1wbnIpIHsKKwkJcmVnID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX1RFTVAsIE5PX0JBTkssCisJCQkJCSBQQzg3MzY1X1JFR19URU1QX0NPTkZJRyk7CisJCWlmIChyZWcgJiAweDAxKSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkZvcmNpYmx5IGVuYWJsaW5nICIKKwkJCQkibW9uaXRvcmluZyAoVE1TKVxuIik7CisJCQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX1RFTVAsIE5PX0JBTkssCisJCQkJCSAgICBQQzg3MzY1X1JFR19URU1QX0NPTkZJRywKKwkJCQkJICAgIHJlZyAmIDB4RkUpOworCQl9CisKKwkJaWYgKGluaXQgPj0gMikgeworCQkJLyogQ2hpcCBjb25maWcgYXMgZG9jdW1lbnRlZCBieSBOYXRpb25hbCBTZW1pLiAqLworCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCAweEYsIDB4QSwgMHgwOCk7CisJCQkvKiBXZSB2b2x1bnRhcmlseSBvbWl0IHRoZSBiYW5rIGhlcmUsIGluIGNhc2UgdGhlCisJCQkgICBzZXF1ZW5jZSBpdHNlbGYgbWF0dGVycy4gSXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSwKKwkJCSAgIHNpbmNlIG5vYm9keSBlbHNlIGlzIHN1cHBvc2VkIHRvIGFjY2VzcyB0aGUKKwkJCSAgIGRldmljZSBhdCB0aGF0IHBvaW50LiAqLworCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBOT19CQU5LLCAweEIsIDB4MDQpOworCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBOT19CQU5LLCAweEMsIDB4MzUpOworCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBOT19CQU5LLCAweEQsIDB4MDUpOworCQkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBOT19CQU5LLCAweEUsIDB4MDUpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwYzg3MzYwX2F1dG9kaXYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG5yKQoreworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCBvbGRfbWluID0gZGF0YS0+ZmFuX21pbltucl07CisKKwkvKiBJbmNyZWFzZSBjbG9jayBkaXZpZGVyIGlmIG5lZWRlZCBhbmQgcG9zc2libGUgKi8KKwlpZiAoKGRhdGEtPmZhbl9zdGF0dXNbbnJdICYgMHgwNCkgLyogb3ZlcmZsb3cgZmxhZyAqLworCSB8fCAoZGF0YS0+ZmFuW25yXSA+PSAyMjQpKSB7IC8qIG5leHQgdG8gb3ZlcmZsb3cgKi8KKwkJaWYgKChkYXRhLT5mYW5fc3RhdHVzW25yXSAmIDB4NjApICE9IDB4NjApIHsKKwkJCWRhdGEtPmZhbl9zdGF0dXNbbnJdICs9IDB4MjA7CisJCQlkYXRhLT5mYW5fbWluW25yXSA+Pj0gMTsKKwkJCWRhdGEtPmZhbltucl0gPj49IDE7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkluY3JlYXNpbmcgIgorCQkJCSJjbG9jayBkaXZpZGVyIHRvICVkIGZvciBmYW4gJWRcbiIsCisJCQkJRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fc3RhdHVzW25yXSksIG5yKzEpOworCQl9CisJfSBlbHNlIHsKKwkJLyogRGVjcmVhc2UgY2xvY2sgZGl2aWRlciBpZiBwb3NzaWJsZSAqLworCQl3aGlsZSAoIShkYXRhLT5mYW5fbWluW25yXSAmIDB4ODApIC8qIG1pbiAibmFpbHMiIGRpdmlkZXIgKi8KKwkJICYmIGRhdGEtPmZhbltucl0gPCA4NSAvKiBiYWQgYWNjdXJhY3kgKi8KKwkJICYmIChkYXRhLT5mYW5fc3RhdHVzW25yXSAmIDB4NjApICE9IDB4MDApIHsKKwkJCWRhdGEtPmZhbl9zdGF0dXNbbnJdIC09IDB4MjA7CisJCQlkYXRhLT5mYW5fbWluW25yXSA8PD0gMTsKKwkJCWRhdGEtPmZhbltucl0gPDw9IDE7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkRlY3JlYXNpbmcgIgorCQkJCSJjbG9jayBkaXZpZGVyIHRvICVkIGZvciBmYW4gJWRcbiIsCisJCQkJRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fc3RhdHVzW25yXSksCisJCQkJbnIrMSk7CisJCX0KKwl9CisKKwkvKiBXcml0ZSBuZXcgZmFuIG1pbiBpZiBpdCBjaGFuZ2VkICovCisJaWYgKG9sZF9taW4gIT0gZGF0YS0+ZmFuX21pbltucl0pIHsKKwkJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9GQU4sIE5PX0JBTkssCisJCQkJICAgIFBDODczNjBfUkVHX0ZBTl9NSU4obnIpLAorCQkJCSAgICBkYXRhLT5mYW5fbWluW25yXSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjODczNjBfZGF0YSAqcGM4NzM2MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCBpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKiAyKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJEYXRhIHVwZGF0ZVxuIik7CisKKwkJLyogRmFucyAqLworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+ZmFubnI7IGkrKykgeworCQkJaWYgKEZBTl9DT05GSUdfTU9OSVRPUihkYXRhLT5mYW5fY29uZiwgaSkpIHsKKwkJCQlkYXRhLT5mYW5fc3RhdHVzW2ldID0KKwkJCQkJcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0ZBTiwKKwkJCQkJTk9fQkFOSywgUEM4NzM2MF9SRUdfRkFOX1NUQVRVUyhpKSk7CisJCQkJZGF0YS0+ZmFuW2ldID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0ZBTiwKKwkJCQkJICAgICAgIE5PX0JBTkssIFBDODczNjBfUkVHX0ZBTihpKSk7CisJCQkJZGF0YS0+ZmFuX21pbltpXSA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLAorCQkJCQkJICAgTERfRkFOLCBOT19CQU5LLAorCQkJCQkJICAgUEM4NzM2MF9SRUdfRkFOX01JTihpKSk7CisJCQkJLyogQ2hhbmdlIGNsb2NrIGRpdmlkZXIgaWYgbmVlZGVkICovCisJCQkJcGM4NzM2MF9hdXRvZGl2KGNsaWVudCwgaSk7CisJCQkJLyogQ2xlYXIgYml0cyBhbmQgd3JpdGUgbmV3IGRpdmlkZXIgKi8KKwkJCQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0ZBTiwgTk9fQkFOSywKKwkJCQkJCSAgICBQQzg3MzYwX1JFR19GQU5fU1RBVFVTKGkpLAorCQkJCQkJICAgIGRhdGEtPmZhbl9zdGF0dXNbaV0pOworCQkJfQorCQkJaWYgKEZBTl9DT05GSUdfQ09OVFJPTChkYXRhLT5mYW5fY29uZiwgaSkpCisJCQkJZGF0YS0+cHdtW2ldID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsIExEX0ZBTiwKKwkJCQkJICAgICAgIE5PX0JBTkssIFBDODczNjBfUkVHX1BXTShpKSk7CisJCX0KKworCQkvKiBWb2x0YWdlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+aW5ucjsgaSsrKSB7CisJCQlkYXRhLT5pbl9zdGF0dXNbaV0gPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfSU4sIGksCisJCQkJCSAgICAgUEM4NzM2NV9SRUdfSU5fU1RBVFVTKTsKKwkJCS8qIENsZWFyIGJpdHMgKi8KKwkJCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIGksCisJCQkJCSAgICBQQzg3MzY1X1JFR19JTl9TVEFUVVMsCisJCQkJCSAgICBkYXRhLT5pbl9zdGF0dXNbaV0pOworCQkJaWYgKChkYXRhLT5pbl9zdGF0dXNbaV0gJiAweDgxKSA9PSAweDgxKSB7CisJCQkJZGF0YS0+aW5baV0gPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfSU4sCisJCQkJCSAgICAgIGksIFBDODczNjVfUkVHX0lOKTsKKwkJCX0KKwkJCWlmIChkYXRhLT5pbl9zdGF0dXNbaV0gJiAweDAxKSB7CisJCQkJZGF0YS0+aW5fbWluW2ldID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsCisJCQkJCQkgIExEX0lOLCBpLAorCQkJCQkJICBQQzg3MzY1X1JFR19JTl9NSU4pOworCQkJCWRhdGEtPmluX21heFtpXSA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLAorCQkJCQkJICBMRF9JTiwgaSwKKwkJCQkJCSAgUEM4NzM2NV9SRUdfSU5fTUFYKTsKKwkJCQlpZiAoaSA+PSAxMSkKKwkJCQkJZGF0YS0+aW5fY3JpdFtpLTExXSA9CisJCQkJCQlwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfSU4sCisJCQkJCQlpLCBQQzg3MzY1X1JFR19URU1QX0NSSVQpOworCQkJfQorCQl9CisJCWlmIChkYXRhLT5pbm5yKSB7CisJCQlkYXRhLT5pbl9hbGFybXMgPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfSU4sCisJCQkJCSAgTk9fQkFOSywgUEM4NzM2NV9SRUdfSU5fQUxBUk1TMSkKKwkJCQkJfCAoKHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9JTiwKKwkJCQkJICAgIE5PX0JBTkssIFBDODczNjVfUkVHX0lOX0FMQVJNUzIpCisJCQkJCSAgICAmIDB4MDcpIDw8IDgpOworCQkJZGF0YS0+dmlkID0gKGRhdGEtPnZpZF9jb25mICYgMHhFMCkgPworCQkJCSAgICBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwgTERfSU4sCisJCQkJICAgIE5PX0JBTkssIFBDODczNjVfUkVHX1ZJRCkgOiAweDFGOworCQl9CisKKwkJLyogVGVtcGVyYXR1cmVzICovCisJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT50ZW1wbnI7IGkrKykgeworCQkJZGF0YS0+dGVtcF9zdGF0dXNbaV0gPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwKKwkJCQkJICAgICAgIExEX1RFTVAsIGksCisJCQkJCSAgICAgICBQQzg3MzY1X1JFR19URU1QX1NUQVRVUyk7CisJCQkvKiBDbGVhciBiaXRzICovCisJCQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX1RFTVAsIGksCisJCQkJCSAgICBQQzg3MzY1X1JFR19URU1QX1NUQVRVUywKKwkJCQkJICAgIGRhdGEtPnRlbXBfc3RhdHVzW2ldKTsKKwkJCWlmICgoZGF0YS0+dGVtcF9zdGF0dXNbaV0gJiAweDgxKSA9PSAweDgxKSB7CisJCQkJZGF0YS0+dGVtcFtpXSA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLAorCQkJCQkJTERfVEVNUCwgaSwKKwkJCQkJCVBDODczNjVfUkVHX1RFTVApOworCQkJfQorCQkJaWYgKGRhdGEtPnRlbXBfc3RhdHVzW2ldICYgMHgwMSkgeworCQkJCWRhdGEtPnRlbXBfbWluW2ldID0gcGM4NzM2MF9yZWFkX3ZhbHVlKGRhdGEsCisJCQkJCQkgICAgTERfVEVNUCwgaSwKKwkJCQkJCSAgICBQQzg3MzY1X1JFR19URU1QX01JTik7CisJCQkJZGF0YS0+dGVtcF9tYXhbaV0gPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwKKwkJCQkJCSAgICBMRF9URU1QLCBpLAorCQkJCQkJICAgIFBDODczNjVfUkVHX1RFTVBfTUFYKTsKKwkJCQlkYXRhLT50ZW1wX2NyaXRbaV0gPSBwYzg3MzYwX3JlYWRfdmFsdWUoZGF0YSwKKwkJCQkJCSAgICAgTERfVEVNUCwgaSwKKwkJCQkJCSAgICAgUEM4NzM2NV9SRUdfVEVNUF9DUklUKTsKKwkJCX0KKwkJfQorCQlpZiAoZGF0YS0+dGVtcG5yKSB7CisJCQlkYXRhLT50ZW1wX2FsYXJtcyA9IHBjODczNjBfcmVhZF92YWx1ZShkYXRhLCBMRF9URU1QLAorCQkJCQkgICAgTk9fQkFOSywgUEM4NzM2NV9SRUdfVEVNUF9BTEFSTVMpCisJCQkJCSAgICAmIDB4M0Y7CisJCX0KKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwYzg3MzYwX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChwYzg3MzYwX2ZpbmQoMHgyZSwgJmRldmlkLCBleHRyYV9pc2EpCisJICYmIHBjODczNjBfZmluZCgweDRlLCAmZGV2aWQsIGV4dHJhX2lzYSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGM4NzM2MDogUEM4NzM2eCBub3QgZGV0ZWN0ZWQsICIKKwkJICAgICAgICJtb2R1bGUgbm90IGluc2VydGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEFyYml0cmFyaWx5IHBpY2sgb25lIG9mIHRoZSBhZGRyZXNzZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlmIChleHRyYV9pc2FbaV0gIT0gMHgwMDAwKSB7CisJCQlub3JtYWxfaXNhWzBdID0gZXh0cmFfaXNhW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobm9ybWFsX2lzYVswXSA9PSAweDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGM4NzM2MDogTm8gYWN0aXZlIGxvZ2ljYWwgZGV2aWNlLCAiCisJCSAgICAgICAibW9kdWxlIG5vdCBpbnNlcnRlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnBjODczNjBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBjODczNjBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZwYzg3MzYwX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDODczNnggaGFyZHdhcmUgbW9uaXRvciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChwYzg3MzYwX2luaXQpOworbW9kdWxlX2V4aXQocGM4NzM2MF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1NzQuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1NzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGI0ZTIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU3NC5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICAgIHBjZjg1NzQuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgICAgICAgICAgICAgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoYykgMjAwMCAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgCisgICAgICAgICAgICAgICAgICAgICAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LAorICAgICAgICAgICAgICAgICAgICAgICAgRGFuIEVhdG9uIDxkYW4uZWF0b25Acm9ja2V0bG9naXguY29tPgorICAgIFBvcnRlZCB0byBMaW51eCAyLjYgYnkgQXVyZWxpZW4gSmFybm8gPGF1cmVsMzJAZGViaWFuLm9yZz4gd2l0aCAKKyAgICB0aGUgaGVscCBvZiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qIEEgZmV3IG5vdGVzIGFib3V0IHRoZSBQQ0Y4NTc0OgorCisqIFRoZSBQQ0Y4NTc0IGlzIGFuIDgtYml0IEkvTyBleHBhbmRlciBmb3IgdGhlIEkyQyBidXMgcHJvZHVjZWQgYnkKKyAgUGhpbGlwcyBTZW1pY29uZHVjdG9ycy4gIEl0IGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgYSBieXRlIEkyQworICBpbnRlcmZhY2UgdG8gdXAgdG8gOCBzZXBhcmF0ZSBkZXZpY2VzLgorICAKKyogVGhlIFBDRjg1NzQgYXBwZWFycyBhcyBhIHZlcnkgc2ltcGxlIFNNQnVzIGRldmljZSB3aGljaCBjYW4gYmUKKyAgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gd2l0aCBTTUJVUyBieXRlIHJlYWQvd3JpdGUgYWNjZXNzZXMuCisKKyAgLS1EYW4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywKKwkJCQkJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwKKwkJCQkJSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzIocGNmODU3NCwgcGNmODU3NGEpOworCisvKiBJbml0aWFsIHZhbHVlcyAqLworI2RlZmluZSBQQ0Y4NTc0X0lOSVQgMjU1CS8qIEFsbCBvdXRwdXRzIG9uIChpbnB1dCBtb2RlKSAqLworCisvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KK3N0cnVjdCBwY2Y4NTc0X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKworCXU4IHJlYWQsIHdyaXRlOwkJCS8qIFJlZ2lzdGVyIHZhbHVlcyAqLworfTsKKworc3RhdGljIGludCBwY2Y4NTc0X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IHBjZjg1NzRfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgcGNmODU3NF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHZvaWQgcGNmODU3NF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBjZjg1NzRfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAicGNmODU3NCIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9QQ0Y4NTc0LAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IHBjZjg1NzRfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBwY2Y4NTc0X2RldGFjaF9jbGllbnQsCit9OworCisvKiBmb2xsb3dpbmcgYXJlIHRoZSBzeXNmcyBjYWxsYmFjayBmdW5jdGlvbnMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwY2Y4NTc0X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlkYXRhLT5yZWFkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZShjbGllbnQpOyAKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+cmVhZCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihyZWFkLCBTX0lSVUdPLCBzaG93X3JlYWQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwY2Y4NTc0X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+d3JpdGUpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHBjZjg1NzRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlpZiAodmFsID4gMHhmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhLT53cml0ZSA9IHZhbDsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIGRhdGEtPndyaXRlKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih3cml0ZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfd3JpdGUsIHNldF93cml0ZSk7CisKKy8qCisgKiBSZWFsIGNvZGUKKyAqLworCitzdGF0aWMgaW50IHBjZjg1NzRfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHBjZjg1NzRfZGV0ZWN0KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworaW50IHBjZjg1NzRfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBwY2Y4NTc0X2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqY2xpZW50X25hbWUgPSAiIjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURSkpCisJCWdvdG8gZXhpdDsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuICovCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2Y4NTc0X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwY2Y4NTc0X2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmcGNmODU3NF9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogTm93LCB3ZSB3b3VsZCBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gQnV0IHRoZSBQQ0Y4NTc0IGlzIHBsYWlubHkKKwkgICBpbXBvc3NpYmxlIHRvIGRldGVjdCEgU3R1cGlkIGNoaXAuICovCisKKwkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZSAqLworCWlmIChraW5kIDw9IDApIHsKKwkJaWYgKGFkZHJlc3MgPj0gMHgzOCAmJiBhZGRyZXNzIDw9IDB4M2YpCisJCQlraW5kID0gcGNmODU3NGE7CisJCWVsc2UKKwkJCWtpbmQgPSBwY2Y4NTc0OworCX0KKworCWlmIChraW5kID09IHBjZjg1NzRhKQorCQljbGllbnRfbmFtZSA9ICJwY2Y4NTc0YSI7CisJZWxzZQorCQljbGllbnRfbmFtZSA9ICJwY2Y4NTc0IjsKKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIGNsaWVudF9uYW1lLCBJMkNfTkFNRV9TSVpFKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgUENGODU3NCBjaGlwICovCisJcGNmODU3NF9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9yZWFkKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3dyaXRlKTsKKwlyZXR1cm4gMDsKKworLyogT0ssIHRoaXMgaXMgbm90IGV4YWN0bHkgZ29vZCBwcm9ncmFtbWluZyBwcmFjdGljZSwgdXN1YWxseS4gQnV0IGl0IGlzCisgICB2ZXJ5IGNvZGUtZWZmaWNpZW50IGluIHRoaXMgY2FzZS4gKi8KKworICAgICAgZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworICAgICAgZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBjZjg1NzRfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHdlIGhhdmUgZm91bmQgYSBuZXcgUENGODU3NC4gKi8KK3N0YXRpYyB2b2lkIHBjZjg1NzRfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcGNmODU3NF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJZGF0YS0+d3JpdGUgPSBQQ0Y4NTc0X0lOSVQ7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBkYXRhLT53cml0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjZjg1NzRfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmcGNmODU3NF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGNmODU3NF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnBjZjg1NzRfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SCisgICAgKCJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LCAiCisgICAgICJQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LCAiCisgICAgICJEYW4gRWF0b24gPGRhbi5lYXRvbkByb2NrZXRsb2dpeC5jb20+ICIKKyAgICAgImFuZCBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDRjg1NzQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHBjZjg1NzRfaW5pdCk7Cittb2R1bGVfZXhpdChwY2Y4NTc0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU5MS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU5MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjkyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTkxLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgICAgcGNmODU5MS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICAgICBtb25pdG9yaW5nCisgICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgQXVyZWxpZW4gSmFybm8gPGF1cmVsaWVuQGF1cmVsMzIubmV0PgorICAgIFBvcnRlZCB0byBMaW51eCAyLjYgYnkgQXVyZWxpZW4gSmFybm8gPGF1cmVsaWVuQGF1cmVsMzIubmV0PiB3aXRoIAorICAgIHRoZSBoZWxwIG9mIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLAorCQkJCQkweDRkLCAweDRlLCAweDRmLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMShwY2Y4NTkxKTsKKworc3RhdGljIGludCBpbnB1dF9tb2RlOworbW9kdWxlX3BhcmFtKGlucHV0X21vZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlucHV0X21vZGUsCisJIkFuYWxvZyBpbnB1dCBtb2RlOlxuIgorCSIgMCA9IGZvdXIgc2luZ2xlIGVuZGVkIGlucHV0c1xuIgorCSIgMSA9IHRocmVlIGRpZmZlcmVudGlhbCBpbnB1dHNcbiIKKwkiIDIgPSBzaW5nbGUgZW5kZWQgYW5kIGRpZmZlcmVudGlhbCBtaXhlZFxuIgorCSIgMyA9IHR3byBkaWZmZXJlbnRpYWwgaW5wdXRzXG4iKTsKKworLyogVGhlIFBDRjg1OTEgY29udHJvbCBieXRlCisgICAgICA3ICAgIDYgICAgNSAgICA0ICAgIDMgICAgMiAgICAxICAgIDAgIAorICAgfCAgMCB8QU9FRnwgICBBSVAgICB8ICAwIHxBSU5DfCAgQUlDSCAgIHwgKi8KKworLyogQW5hbG9nIE91dHB1dCBFbmFibGUgRmxhZyAoYW5hbG9nIG91dHB1dCBhY3RpdmUgaWYgMSkgKi8KKyNkZWZpbmUgUENGODU5MV9DT05UUk9MX0FPRUYJCTB4NDAKKwkJCQkJCisvKiBBbmFsb2cgSW5wdXQgUHJvZ3JhbW1pbmcgCisgICAweDAwID0gZm91ciBzaW5nbGUgZW5kZWQgaW5wdXRzCisgICAweDEwID0gdGhyZWUgZGlmZmVyZW50aWFsIGlucHV0cworICAgMHgyMCA9IHNpbmdsZSBlbmRlZCBhbmQgZGlmZmVyZW50aWFsIG1peGVkCisgICAweDMwID0gdHdvIGRpZmZlcmVudGlhbCBpbnB1dHMgKi8KKyNkZWZpbmUgUENGODU5MV9DT05UUk9MX0FJUF9NQVNLCTB4MzAKKworLyogQXV0b2luY3JlbWVudCBGbGFnIChzd2l0Y2ggb24gaWYgMSkgKi8KKyNkZWZpbmUgUENGODU5MV9DT05UUk9MX0FJTkMJCTB4MDQKKworLyogQ2hhbm5lbCBzZWxlY3Rpb24KKyAgIDB4MDAgPSBjaGFubmVsIDAgCisgICAweDAxID0gY2hhbm5lbCAxCisgICAweDAyID0gY2hhbm5lbCAyCisgICAweDAzID0gY2hhbm5lbCAzICovCisjZGVmaW5lIFBDRjg1OTFfQ09OVFJPTF9BSUNIX01BU0sJMHgwMworCisvKiBJbml0aWFsIHZhbHVlcyAqLworI2RlZmluZSBQQ0Y4NTkxX0lOSVRfQ09OVFJPTAkoKGlucHV0X21vZGUgPDwgNCkgfCBQQ0Y4NTkxX0NPTlRST0xfQU9FRikKKyNkZWZpbmUgUENGODU5MV9JTklUX0FPVVQJMAkvKiBEQUMgb3V0ID0gMCAqLworCisvKiBDb252ZXJzaW9ucyAqLworI2RlZmluZSBSRUdfVE9fU0lHTkVEKHJlZykJKCgocmVnKSAmIDB4ODApPygocmVnKSAtIDI1Nik6KHJlZykpCisKK3N0cnVjdCBwY2Y4NTkxX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCisJdTggY29udHJvbDsKKwl1OCBhb3V0OworfTsKKworc3RhdGljIGludCBwY2Y4NTkxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IHBjZjg1OTFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgcGNmODU5MV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHZvaWQgcGNmODU5MV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgcGNmODU5MV9yZWFkX2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgY2hhbm5lbCk7CisKKy8qIFRoaXMgaXMgdGhlIGRyaXZlciB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwY2Y4NTkxX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInBjZjg1OTEiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfUENGODU5MSwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBwY2Y4NTkxX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gcGNmODU5MV9kZXRhY2hfY2xpZW50LAorfTsKKworLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCisjZGVmaW5lIHNob3dfaW5fY2hhbm5lbChjaGFubmVsKQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjY2hhbm5lbCMjX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwY2Y4NTkxX3JlYWRfY2hhbm5lbChkZXYsIGNoYW5uZWwpKTtcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNjaGFubmVsIyNfaW5wdXQsIFNfSVJVR08sCQkJXAorCQkgICBzaG93X2luIyNjaGFubmVsIyNfaW5wdXQsIE5VTEwpOworCitzaG93X2luX2NoYW5uZWwoMCk7CitzaG93X2luX2NoYW5uZWwoMSk7CitzaG93X2luX2NoYW5uZWwoMik7CitzaG93X2luX2NoYW5uZWwoMyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfb3V0MF9vdXB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNmODU5MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmFvdXQgKiAxMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9vdXQwX291dHB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwY2Y4NTkxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpZiAoKHZhbHVlID0gKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApICsgNSkgLyAxMCkgPD0gMjU1KSB7CisJCWRhdGEtPmFvdXQgPSB2YWx1ZTsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIGRhdGEtPmNvbnRyb2wsIGRhdGEtPmFvdXQpOworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIob3V0MF9vdXRwdXQsIFNfSVdVU1IgfCBTX0lSVUdPLCAKKwkJICAgc2hvd19vdXQwX291cHV0LCBzZXRfb3V0MF9vdXRwdXQpOworCitzdGF0aWMgc3NpemVfdCBzaG93X291dDBfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwY2Y4NTkxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgISghKGRhdGEtPmNvbnRyb2wgJiBQQ0Y4NTkxX0NPTlRST0xfQU9FRikpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X291dDBfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcGNmODU5MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAodmFsKQorCQlkYXRhLT5jb250cm9sIHw9IFBDRjg1OTFfQ09OVFJPTF9BT0VGOworCWVsc2UKKwkJZGF0YS0+Y29udHJvbCAmPSB+UENGODU5MV9DT05UUk9MX0FPRUY7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBkYXRhLT5jb250cm9sKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG91dDBfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywgCisJCSAgIHNob3dfb3V0MF9lbmFibGUsIHNldF9vdXQwX2VuYWJsZSk7CisKKy8qCisgKiBSZWFsIGNvZGUKKyAqLworc3RhdGljIGludCBwY2Y4NTkxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBwY2Y4NTkxX2RldGVjdCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19kZXRlY3QgKi8KK2ludCBwY2Y4NTkxX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgcGNmODU5MV9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFCisJCQkJICAgICB8IEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuICovCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2Y4NTkxX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwY2Y4NTkxX2RhdGEpKTsKKwkKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnBjZjg1OTFfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIE5vdywgd2Ugd291bGQgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIEJ1dCB0aGUgUENGODU5MSBpcyBwbGFpbmx5CisJICAgaW1wb3NzaWJsZSB0byBkZXRlY3QhIFN0dXBpZCBjaGlwLiAqLworCisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUgLSBvbmx5IG9uZSBraW5kIHN1cHBvcnRlZCEgKi8KKwlpZiAoa2luZCA8PSAwKQorCQlraW5kID0gcGNmODU5MTsKKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIAorCSAgIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJwY2Y4NTkxIiwgSTJDX05BTUVfU0laRSk7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfa2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBQQ0Y4NTkxIGNoaXAgKi8KKwlwY2Y4NTkxX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX291dDBfZW5hYmxlKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX291dDBfb3V0cHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOworCisJLyogUmVnaXN0ZXIgaW5wdXQyIGlmIG5vdCBpbiAidHdvIGRpZmZlcmVudGlhbCBpbnB1dHMiIG1vZGUgKi8KKwlpZiAoaW5wdXRfbW9kZSAhPSAzICkKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCQkKKwkvKiBSZWdpc3RlciBpbnB1dDMgb25seSBpbiAiZm91ciBzaW5nbGUgZW5kZWQgaW5wdXRzIiBtb2RlICovCisJaWYgKGlucHV0X21vZGUgPT0gMCkKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfaW5wdXQpOworCQorCXJldHVybiAwOworCQorCS8qIE9LLCB0aGlzIGlzIG5vdCBleGFjdGx5IGdvb2QgcHJvZ3JhbW1pbmcgcHJhY3RpY2UsIHVzdWFsbHkuIEJ1dCBpdCBpcworCSAgIHZlcnkgY29kZS1lZmZpY2llbnQgaW4gdGhpcyBjYXNlLiAqLworCitleGl0X2tmcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBjZjg1OTFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHdlIGhhdmUgZm91bmQgYSBuZXcgUENGODU5MS4gKi8KK3N0YXRpYyB2b2lkIHBjZjg1OTFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcGNmODU5MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJZGF0YS0+Y29udHJvbCA9IFBDRjg1OTFfSU5JVF9DT05UUk9MOworCWRhdGEtPmFvdXQgPSBQQ0Y4NTkxX0lOSVRfQU9VVDsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBkYXRhLT5jb250cm9sLCBkYXRhLT5hb3V0KTsKKwkKKwkvKiBUaGUgZmlyc3QgYnl0ZSB0cmFuc21pdHRlZCBjb250YWlucyB0aGUgY29udmVyc2lvbiBjb2RlIG9mIHRoZSAKKwkgICBwcmV2aW91cyByZWFkIGN5Y2xlLiBGTFVTSCBJVCEgKi8KKwlpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7Cit9CisKK3N0YXRpYyBpbnQgcGNmODU5MV9yZWFkX2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgY2hhbm5lbCkKK3sKKwl1OCB2YWx1ZTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwY2Y4NTkxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICgoZGF0YS0+Y29udHJvbCAmIFBDRjg1OTFfQ09OVFJPTF9BSUNIX01BU0spICE9IGNoYW5uZWwpIHsKKwkJZGF0YS0+Y29udHJvbCA9IChkYXRhLT5jb250cm9sICYgflBDRjg1OTFfQ09OVFJPTF9BSUNIX01BU0spCisJCQkgICAgICB8IGNoYW5uZWw7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgZGF0YS0+Y29udHJvbCk7CisJCisJCS8qIFRoZSBmaXJzdCBieXRlIHRyYW5zbWl0dGVkIGNvbnRhaW5zIHRoZSBjb252ZXJzaW9uIGNvZGUgb2YgCisJCSAgIHRoZSBwcmV2aW91cyByZWFkIGN5Y2xlLiBGTFVTSCBJVCEgKi8KKwkJaTJjX3NtYnVzX3JlYWRfYnl0ZShjbGllbnQpOworCX0KKwl2YWx1ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoKGNoYW5uZWwgPT0gMiAmJiBpbnB1dF9tb2RlID09IDIpIHx8CisJICAgIChjaGFubmVsICE9IDMgJiYgKGlucHV0X21vZGUgPT0gMSB8fCBpbnB1dF9tb2RlID09IDMpKSkKKwkJcmV0dXJuICgxMCAqIFJFR19UT19TSUdORUQodmFsdWUpKTsKKwllbHNlCisJCXJldHVybiAoMTAgKiB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjZjg1OTFfaW5pdCh2b2lkKQoreworCWlmIChpbnB1dF9tb2RlIDwgMCB8fCBpbnB1dF9tb2RlID4gMykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2Y4NTkxOiBpbnZhbGlkIGlucHV0X21vZGUgKCVkKVxuIiwKKwkJICAgICAgIGlucHV0X21vZGUpOworCQlpbnB1dF9tb2RlID0gMDsKKwl9CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwY2Y4NTkxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY2Y4NTkxX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmcGNmODU5MV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDRjg1OTEgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHBjZjg1OTFfaW5pdCk7Cittb2R1bGVfZXhpdChwY2Y4NTkxX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvcnRjODU2NC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvcnRjODU2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWRlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9ydGM4NTY0LmMKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9pMmMvY2hpcHMvcnRjODU2NC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFN0ZWZhbiBFbGV0emhvZmVyCisgKgorICoJYmFzZWQgb24gbGludXgvZHJpdmVycy9hY3Jvbi9jaGFyL3BjZjg1ODMuYworICogIENvcHlyaWdodCAoQykgMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERyaXZlciBmb3Igc3lzdGVtMydzIEVQU09OIFJUQyA4NTY0IGNoaXAKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4JCS8qIGdldCB0aGUgdXNlci1sZXZlbCBBUEkgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAicnRjODU2NC5oIgorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIF9EQkcoeCwgZm10LCBhcmdzLi4uKSBkb3sgaWYgKGRlYnVnPj14KSBwcmludGsoS0VSTl9ERUJVRyIlczogIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCAjI2FyZ3MpOyB9IHdoaWxlKDApOworI2Vsc2UKKyMgZGVmaW5lIF9EQkcoeCwgZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUoMCk7CisjZW5kaWYKKworI2RlZmluZSBfREJHUlRDVE0oeCwgcnRjdG0pIGlmIChkZWJ1Zz49eCkgcHJpbnRrKCIlczogc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQsIG1kYXk9JWQsICIgXAorCQkJIm1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZCBWTD0lZFxuIiwgX19GVU5DVElPTl9fLCBcCisJCQkocnRjdG0pLnNlY3MsIChydGN0bSkubWlucywgKHJ0Y3RtKS5ob3VycywgKHJ0Y3RtKS5tZGF5LCBcCisJCQkocnRjdG0pLm1vbiwgKHJ0Y3RtKS55ZWFyLCAocnRjdG0pLndkYXksIChydGN0bSkudmwpOworCitzdHJ1Y3QgcnRjODU2NF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJdTE2IGN0cmw7Cit9OworCitzdGF0aWMgaW5saW5lIHU4IF9ydGM4NTY0X2N0cmwxKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHJ0Yzg1NjRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXJldHVybiBkYXRhLT5jdHJsICYgMHhmZjsKK30KK3N0YXRpYyBpbmxpbmUgdTggX3J0Yzg1NjRfY3RybDIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcnRjODU2NF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJcmV0dXJuIChkYXRhLT5jdHJsICYgMHhmZjAwKSA+PiA4OworfQorCisjZGVmaW5lIENUUkwxKGMpIF9ydGM4NTY0X2N0cmwxKGMpCisjZGVmaW5lIENUUkwyKGMpIF9ydGM4NTY0X2N0cmwyKGMpCisKKyNkZWZpbmUgQkNEX1RPX0JJTih2YWwpICgoKHZhbCkmMTUpICsgKCh2YWwpPj40KSoxMCkKKyNkZWZpbmUgQklOX1RPX0JDRCh2YWwpICgoKCh2YWwpLzEwKTw8NCkgKyAodmFsKSUxMCkKKworc3RhdGljIGludCBkZWJ1Zzs7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcnRjODU2NF9kcml2ZXI7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmVbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfYWRkcltdID0geyAweDUxLCBJMkNfQ0xJRU5UX0VORCB9OworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKKwkubm9ybWFsX2kyYwkJPSBub3JtYWxfYWRkciwKKwkubm9ybWFsX2kyY19yYW5nZQk9IGlnbm9yZSwKKwkucHJvYmUJCQk9IGlnbm9yZSwKKwkucHJvYmVfcmFuZ2UJCT0gaWdub3JlLAorCS5pZ25vcmUJCQk9IGlnbm9yZSwKKwkuaWdub3JlX3JhbmdlCQk9IGlnbm9yZSwKKwkuZm9yY2UJCQk9IGlnbm9yZSwKK307CisKK3N0YXRpYyBpbnQgcnRjODU2NF9yZWFkX21lbShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgbWVtICptZW0pOworc3RhdGljIGludCBydGM4NTY0X3dyaXRlX21lbShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgbWVtICptZW0pOworCitzdGF0aWMgaW50IHJ0Yzg1NjRfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjaGFyIGFkciwKKwkJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgY2hhciBsZW4pCit7CisJaW50IHJldCA9IC1FSU87CisJdW5zaWduZWQgY2hhciBhZGRyWzFdID0geyBhZHIgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0geworCQl7Y2xpZW50LT5hZGRyLCAwLCAxLCBhZGRyfSwKKwkJe2NsaWVudC0+YWRkciwgSTJDX01fUkQsIGxlbiwgYnVmfQorCX07CisKKwlfREJHKDEsICJjbGllbnQ9JXAsIGFkcj0lZCwgYnVmPSVwLCBsZW49JWQiLCBjbGllbnQsIGFkciwgYnVmLCBsZW4pOworCisJaWYgKCFidWYpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpOworCWlmIChyZXQgPT0gMikgeworCQlyZXQgPSAwOworCX0KKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0Yzg1NjRfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY2hhciBhZHIsCisJCQkgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgY2hhciBsZW4pCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgY2hhciBfZGF0YVsxNl07CisJc3RydWN0IGkyY19tc2cgd3I7CisJaW50IGk7CisKKwlpZiAoIWRhdGEgfHwgbGVuID4gMTUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCV9EQkcoMSwgImNsaWVudD0lcCwgYWRyPSVkLCBidWY9JXAsIGxlbj0lZCIsIGNsaWVudCwgYWRyLCBkYXRhLCBsZW4pOworCisJX2RhdGFbMF0gPSBhZHI7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCV9kYXRhW2kgKyAxXSA9IGRhdGFbaV07CisJCV9EQkcoNSwgImRhdGFbJWRdID0gMHglMDJ4ICglZCkiLCBpLCBkYXRhW2ldLCBkYXRhW2ldKTsKKwl9CisKKwl3ci5hZGRyID0gY2xpZW50LT5hZGRyOworCXdyLmZsYWdzID0gMDsKKwl3ci5sZW4gPSBsZW4gKyAxOworCXdyLmJ1ZiA9IF9kYXRhOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgJndyLCAxKTsKKwlpZiAocmV0ID09IDEpIHsKKwkJcmV0ID0gMDsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydGM4NTY0X2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBydGM4NTY0X2RhdGEgKmQ7CisJdW5zaWduZWQgY2hhciBkYXRhWzEwXTsKKwl1bnNpZ25lZCBjaGFyIGFkWzFdID0geyAwIH07CisJc3RydWN0IGkyY19tc2cgY3RybF93clsxXSA9IHsKKwkJe2FkZHIsIDAsIDIsIGRhdGF9CisJfTsKKwlzdHJ1Y3QgaTJjX21zZyBjdHJsX3JkWzJdID0geworCQl7YWRkciwgMCwgMSwgYWR9LAorCQl7YWRkciwgSTJDX01fUkQsIDIsIGRhdGF9CisJfTsKKworCWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRjODU2NF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisJbWVtc2V0KGQsIDAsIHNpemVvZihzdHJ1Y3QgcnRjODU2NF9kYXRhKSk7CisJbmV3X2NsaWVudCA9ICZkLT5jbGllbnQ7CisKKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJSVEM4NTY0IiwgSTJDX05BTUVfU0laRSk7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGQpOworCW5ld19jbGllbnQtPmZsYWdzID0gSTJDX0NMSUVOVF9BTExPV19VU0UgfCBJMkNfREZfTk9USUZZOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZydGM4NTY0X2RyaXZlcjsKKworCV9EQkcoMSwgImNsaWVudD0lcCIsIG5ld19jbGllbnQpOworCisJLyogaW5pdCBjdHJsMSByZWcgKi8KKwlkYXRhWzBdID0gMDsKKwlkYXRhWzFdID0gMDsKKwlyZXQgPSBpMmNfdHJhbnNmZXIobmV3X2NsaWVudC0+YWRhcHRlciwgY3RybF93ciwgMSk7CisJaWYgKHJldCAhPSAxKSB7CisJCXByaW50ayhLRVJOX0lORk8gInJ0Yzg1NjQ6IGNhbnQgaW5pdCBjdHJsMVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiByZWFkIGJhY2sgY3RybDEgYW5kIGN0cmwyICovCisJcmV0ID0gaTJjX3RyYW5zZmVyKG5ld19jbGllbnQtPmFkYXB0ZXIsIGN0cmxfcmQsIDIpOworCWlmIChyZXQgIT0gMikgeworCQlwcmludGsoS0VSTl9JTkZPICJydGM4NTY0OiBjYW50IHJlYWQgY3RybFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkLT5jdHJsID0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpOworCisJX0RCRygxLCAiUlRDODU2NF9SRUdfQ1RSTDE9JTAyeCwgUlRDODU2NF9SRUdfQ1RSTDI9JTAyeCIsCisJICAgICBkYXRhWzBdLCBkYXRhWzFdKTsKKworCXJldCA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpOworZG9uZToKKwlpZiAocmV0KSB7CisJCWtmcmVlKGQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0Yzg1NjRfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgcnRjODU2NF9hdHRhY2gpOworfQorCitzdGF0aWMgaW50IHJ0Yzg1NjRfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRjODU2NF9nZXRfZGF0ZXRpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190bSAqZHQpCit7CisJaW50IHJldCA9IC1FSU87CisJdW5zaWduZWQgY2hhciBidWZbMTVdOworCisJX0RCRygxLCAiY2xpZW50PSVwLCBkdD0lcCIsIGNsaWVudCwgZHQpOworCisJaWYgKCFkdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisKKwlyZXQgPSBydGM4NTY0X3JlYWQoY2xpZW50LCAwLCBidWYsIDE1KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogY2VudHVyeSBzdG9yZWQgaW4gbWludXRlIGFsYXJtIHJlZyAqLworCWR0LT55ZWFyID0gQkNEX1RPX0JJTihidWZbUlRDODU2NF9SRUdfWUVBUl0pOworCWR0LT55ZWFyICs9IDEwMCAqIEJDRF9UT19CSU4oYnVmW1JUQzg1NjRfUkVHX0FMX01JTl0gJiAweDNmKTsKKwlkdC0+bWRheSA9IEJDRF9UT19CSU4oYnVmW1JUQzg1NjRfUkVHX0RBWV0gJiAweDNmKTsKKwlkdC0+d2RheSA9IEJDRF9UT19CSU4oYnVmW1JUQzg1NjRfUkVHX1dEQVldICYgNyk7CisJZHQtPm1vbiA9IEJDRF9UT19CSU4oYnVmW1JUQzg1NjRfUkVHX01PTl9DRU5UXSAmIDB4MWYpOworCisJZHQtPnNlY3MgPSBCQ0RfVE9fQklOKGJ1ZltSVEM4NTY0X1JFR19TRUNdICYgMHg3Zik7CisJZHQtPnZsID0gKGJ1ZltSVEM4NTY0X1JFR19TRUNdICYgMHg4MCkgPT0gMHg4MDsKKwlkdC0+bWlucyA9IEJDRF9UT19CSU4oYnVmW1JUQzg1NjRfUkVHX01JTl0gJiAweDdmKTsKKwlkdC0+aG91cnMgPSBCQ0RfVE9fQklOKGJ1ZltSVEM4NTY0X1JFR19IUl0gJiAweDNmKTsKKworCV9EQkdSVENUTSgyLCAqZHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3J0Yzg1NjRfc2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdG0gKmR0LCBpbnQgZGF0ZXRvbykKK3sKKwlpbnQgcmV0LCBsZW4gPSA1OworCXVuc2lnbmVkIGNoYXIgYnVmWzE1XTsKKworCV9EQkcoMSwgImNsaWVudD0lcCwgZHQ9JXAiLCBjbGllbnQsIGR0KTsKKworCWlmICghZHQpCisJCXJldHVybiAtRUlOVkFMOworCisJX0RCR1JUQ1RNKDIsICpkdCk7CisKKwlidWZbUlRDODU2NF9SRUdfQ1RSTDFdID0gQ1RSTDEoY2xpZW50KSB8IFJUQzg1NjRfQ1RSTDFfU1RPUDsKKwlidWZbUlRDODU2NF9SRUdfQ1RSTDJdID0gQ1RSTDIoY2xpZW50KTsKKwlidWZbUlRDODU2NF9SRUdfU0VDXSA9IEJJTl9UT19CQ0QoZHQtPnNlY3MpOworCWJ1ZltSVEM4NTY0X1JFR19NSU5dID0gQklOX1RPX0JDRChkdC0+bWlucyk7CisJYnVmW1JUQzg1NjRfUkVHX0hSXSA9IEJJTl9UT19CQ0QoZHQtPmhvdXJzKTsKKworCWlmIChkYXRldG9vKSB7CisJCWxlbiArPSA1OworCQlidWZbUlRDODU2NF9SRUdfREFZXSA9IEJJTl9UT19CQ0QoZHQtPm1kYXkpOworCQlidWZbUlRDODU2NF9SRUdfV0RBWV0gPSBCSU5fVE9fQkNEKGR0LT53ZGF5KTsKKwkJYnVmW1JUQzg1NjRfUkVHX01PTl9DRU5UXSA9IEJJTl9UT19CQ0QoZHQtPm1vbikgJiAweDFmOworCQkvKiBjZW50dXJ5IHN0b3JlZCBpbiBtaW51dGUgYWxhcm0gcmVnICovCisJCWJ1ZltSVEM4NTY0X1JFR19ZRUFSXSA9IEJJTl9UT19CQ0QoZHQtPnllYXIgJSAxMDApOworCQlidWZbUlRDODU2NF9SRUdfQUxfTUlOXSA9IEJJTl9UT19CQ0QoZHQtPnllYXIgLyAxMDApOworCX0KKworCXJldCA9IHJ0Yzg1NjRfd3JpdGUoY2xpZW50LCAwLCBidWYsIGxlbik7CisJaWYgKHJldCkgeworCQlfREJHKDEsICJlcnJvciB3cml0aW5nIGRhdGEhICVkIiwgcmV0KTsKKwl9CisKKwlidWZbUlRDODU2NF9SRUdfQ1RSTDFdID0gQ1RSTDEoY2xpZW50KTsKKwlyZXQgPSBydGM4NTY0X3dyaXRlKGNsaWVudCwgMCwgYnVmLCAxKTsKKwlpZiAocmV0KSB7CisJCV9EQkcoMSwgImVycm9yIHdyaXRpbmcgZGF0YSEgJWQiLCByZXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnRjODU2NF9nZXRfY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgKmN0cmwpCit7CisJc3RydWN0IHJ0Yzg1NjRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWYgKCFjdHJsKQorCQlyZXR1cm4gLTE7CisKKwkqY3RybCA9IGRhdGEtPmN0cmw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRjODU2NF9zZXRfY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgKmN0cmwpCit7CisJc3RydWN0IHJ0Yzg1NjRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGNoYXIgYnVmWzJdOworCisJaWYgKCFjdHJsKQorCQlyZXR1cm4gLTE7CisKKwlidWZbMF0gPSAqY3RybCAmIDB4ZmY7CisJYnVmWzFdID0gKCpjdHJsICYgMHhmZjAwKSA+PiA4OworCWRhdGEtPmN0cmwgPSAqY3RybDsKKworCXJldHVybiBydGM4NTY0X3dyaXRlKGNsaWVudCwgMCwgYnVmLCAyKTsKK30KKworc3RhdGljIGludCBydGM4NTY0X3JlYWRfbWVtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBtZW0gKm1lbSkKK3sKKworCWlmICghbWVtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBydGM4NTY0X3JlYWQoY2xpZW50LCBtZW0tPmxvYywgbWVtLT5kYXRhLCBtZW0tPm5yKTsKK30KKworc3RhdGljIGludCBydGM4NTY0X3dyaXRlX21lbShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgbWVtICptZW0pCit7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gcnRjODU2NF93cml0ZShjbGllbnQsIG1lbS0+bG9jLCBtZW0tPmRhdGEsIG1lbS0+bnIpOworfQorCitzdGF0aWMgaW50CitydGM4NTY0X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCisJX0RCRygxLCAiY21kPSVkIiwgY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfR0VUREFURVRJTUU6CisJCXJldHVybiBydGM4NTY0X2dldF9kYXRldGltZShjbGllbnQsIGFyZyk7CisKKwljYXNlIFJUQ19TRVRUSU1FOgorCQlyZXR1cm4gcnRjODU2NF9zZXRfZGF0ZXRpbWUoY2xpZW50LCBhcmcsIDApOworCisJY2FzZSBSVENfU0VUREFURVRJTUU6CisJCXJldHVybiBydGM4NTY0X3NldF9kYXRldGltZShjbGllbnQsIGFyZywgMSk7CisKKwljYXNlIFJUQ19HRVRDVFJMOgorCQlyZXR1cm4gcnRjODU2NF9nZXRfY3RybChjbGllbnQsIGFyZyk7CisKKwljYXNlIFJUQ19TRVRDVFJMOgorCQlyZXR1cm4gcnRjODU2NF9zZXRfY3RybChjbGllbnQsIGFyZyk7CisKKwljYXNlIE1FTV9SRUFEOgorCQlyZXR1cm4gcnRjODU2NF9yZWFkX21lbShjbGllbnQsIGFyZyk7CisKKwljYXNlIE1FTV9XUklURToKKwkJcmV0dXJuIHJ0Yzg1NjRfd3JpdGVfbWVtKGNsaWVudCwgYXJnKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHJ0Yzg1NjRfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiUlRDODU2NCIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9SVEM4NTY0LAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9IHJ0Yzg1NjRfcHJvYmUsCisJLmRldGFjaF9jbGllbnQJPSBydGM4NTY0X2RldGFjaCwKKwkuY29tbWFuZAk9IHJ0Yzg1NjRfY29tbWFuZAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgcnRjODU2NF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZydGM4NTY0X2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBydGM4NTY0X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmcnRjODU2NF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTdGVmYW4gRWxldHpob2ZlciA8U3RlZmFuLkVsZXR6aG9mZXJAZWxldHp0cmljay5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRVBTT04gUlRDODU2NCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQocnRjODU2NF9pbml0KTsKK21vZHVsZV9leGl0KHJ0Yzg1NjRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9ydGM4NTY0LmggYi9kcml2ZXJzL2kyYy9jaGlwcy9ydGM4NTY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzNDJkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3J0Yzg1NjQuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaTJjL2NoaXBzL3J0Yzg1NjQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTdGVmYW4gRWxldHpob2ZlcgorICoKKyAqCWJhc2VkIG9uIGxpbnV4L2RyaXZlcnMvYWNyb24vY2hhci9wY2Y4NTgzLmgKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworc3RydWN0IHJ0Y190bSB7CisJdW5zaWduZWQgY2hhcglzZWNzOworCXVuc2lnbmVkIGNoYXIJbWluczsKKwl1bnNpZ25lZCBjaGFyCWhvdXJzOworCXVuc2lnbmVkIGNoYXIJbWRheTsKKwl1bnNpZ25lZCBjaGFyCW1vbjsKKwl1bnNpZ25lZCBzaG9ydAl5ZWFyOyAvKiB4eHh4IDQgZGlnaXRzIDopICovCisJdW5zaWduZWQgY2hhcgl3ZGF5OworCXVuc2lnbmVkIGNoYXIJdmw7Cit9OworCitzdHJ1Y3QgbWVtIHsKKwl1bnNpZ25lZCBpbnQJbG9jOworCXVuc2lnbmVkIGludAlucjsKKwl1bnNpZ25lZCBjaGFyCSpkYXRhOworfTsKKworI2RlZmluZSBSVENfR0VUREFURVRJTUUJMAorI2RlZmluZSBSVENfU0VUVElNRQkxCisjZGVmaW5lIFJUQ19TRVREQVRFVElNRQkyCisjZGVmaW5lIFJUQ19HRVRDVFJMCTMKKyNkZWZpbmUgUlRDX1NFVENUUkwJNAorI2RlZmluZSBNRU1fUkVBRAk1CisjZGVmaW5lIE1FTV9XUklURQk2CisKKyNkZWZpbmUgUlRDODU2NF9SRUdfQ1RSTDEJCTB4MCAvKiBUICAwIFMgMCB8IFQgMCAwIDAgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfQ1RSTDIJCTB4MSAvKiAwICAwIDAgVEkvVFAgfCBBRiBURiBBSUUgVElFICovCisjZGVmaW5lIFJUQzg1NjRfUkVHX1NFQwkJCTB4MiAvKiBWTCA0IDIgMSB8IDggNCAyIDEgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfTUlOCQkJMHgzIC8qIHggIDQgMiAxIHwgOCA0IDIgMSAqLworI2RlZmluZSBSVEM4NTY0X1JFR19IUgkJCTB4NCAvKiB4ICB4IDIgMSB8IDggNCAyIDEgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfREFZCQkJMHg1IC8qIHggIHggMiAxIHwgOCA0IDIgMSAqLworI2RlZmluZSBSVEM4NTY0X1JFR19XREFZCQkweDYgLyogeCAgeCB4IHggfCB4IDQgMiAxICovCisjZGVmaW5lIFJUQzg1NjRfUkVHX01PTl9DRU5UCTB4NyAvKiBDICB4IHggMSB8IDggNCAyIDEgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfWUVBUgkJMHg4IC8qIDggIDQgMiAxIHwgOCA0IDIgMSAqLworI2RlZmluZSBSVEM4NTY0X1JFR19BTF9NSU4JCTB4OSAvKiBBRSA0IDIgMSB8IDggNCAyIDEgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfQUxfSFIJCTB4YSAvKiBBRSA0IDIgMSB8IDggNCAyIDEgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfQUxfREFZCQkweGIgLyogQUUgeCAyIDEgfCA4IDQgMiAxICovCisjZGVmaW5lIFJUQzg1NjRfUkVHX0FMX1dEQVkJCTB4YyAvKiBBRSB4IHggeCB8IHggNCAyIDEgKi8KKyNkZWZpbmUgUlRDODU2NF9SRUdfQ0xLT1VUCQkweGQgLyogRkUgeCB4IHggfCB4IHggRkQxIEZEMCAqLworI2RlZmluZSBSVEM4NTY0X1JFR19UQ1RMCQkweGUgLyogVEUgeCB4IHggfCB4IHggRkQxIEZEMCAqLworI2RlZmluZSBSVEM4NTY0X1JFR19USU1FUgkJMHhmIC8qIDggYml0IGJpbmFyeSAqLworCisvKiBDb250cm9sIHJlZyAqLworI2RlZmluZSBSVEM4NTY0X0NUUkwxX1RFU1QxCQkoMTw8MykKKyNkZWZpbmUgUlRDODU2NF9DVFJMMV9TVE9QCQkoMTw8NSkKKyNkZWZpbmUgUlRDODU2NF9DVFJMMV9URVNUMgkJKDE8PDcpCisKKyNkZWZpbmUgUlRDODU2NF9DVFJMMl9USUUJCSgxPDwwKQorI2RlZmluZSBSVEM4NTY0X0NUUkwyX0FJRQkJKDE8PDEpCisjZGVmaW5lIFJUQzg1NjRfQ1RSTDJfVEYJCSgxPDwyKQorI2RlZmluZSBSVEM4NTY0X0NUUkwyX0FGCQkoMTw8MykKKyNkZWZpbmUgUlRDODU2NF9DVFJMMl9USV9UUAkJKDE8PDQpCisKKy8qIENMS09VVCBmcmVxdWVuY2llcyAqLworI2RlZmluZSBSVEM4NTY0X0ZEXzMyNzY4SFoJCSgweDApCisjZGVmaW5lIFJUQzg1NjRfRkRfMTAyNEhaCQkoMHgxKQorI2RlZmluZSBSVEM4NTY0X0ZEXzMyCQkJKDB4MikKKyNkZWZpbmUgUlRDODU2NF9GRF8xSFoJCQkoMHgzKQorCisvKiBUaW1lciBDVFJMICovCisjZGVmaW5lIFJUQzg1NjRfVERfNDA5NkhaCQkoMHgwKQorI2RlZmluZSBSVEM4NTY0X1REXzY0SFoJCQkoMHgxKQorI2RlZmluZSBSVEM4NTY0X1REXzFIWgkJCSgweDIpCisjZGVmaW5lIFJUQzg1NjRfVERfMV82MEhaCQkoMHgzKQorCisjZGVmaW5lIEkyQ19EUklWRVJJRF9SVEM4NTY0IDB4ZjAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvc2lzNTU5NS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvc2lzNTU5NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTg0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9zaXM1NTk1LmMKQEAgLTAsMCArMSw4MTYgQEAKKy8qCisgICAgc2lzNTU5NS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcworCQlmb3IgaGFyZHdhcmUgbW9uaXRvcmluZworCisgICAgQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAwMSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LAorCQkJS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LCBhbmQKKwkJCU1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KKyAgICBQb3J0ZWQgdG8gTGludXggMi42IGJ5IEF1cmVsaWVuIEphcm5vIDxhdXJlbGllbkBhdXJlbDMyLm5ldD4gd2l0aAorICAgIHRoZSBoZWxwIG9mIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgU2lTIHNvdXRoYnJpZGdlIGhhcyBhIExNNzgtbGlrZSBjaGlwIGludGVncmF0ZWQgb24gdGhlIHNhbWUgSUMuCisgICBUaGlzIGRyaXZlciBpcyBhIGN1c3RvbWl6ZWQgY29weSBvZiBsbTc4LmMKKyAgIAorICAgU3VwcG9ydHMgZm9sbG93aW5nIHJldmlzaW9uczoKKwlWZXJzaW9uCQlQQ0kgSUQJCVBDSSBSZXZpc2lvbgorCTEJCTEwMzkvMDAwOAlBRiBvciBsZXNzCisJMgkJMTAzOS8wMDA4CUIwIG9yIGdyZWF0ZXIKKworICAgTm90ZTogdGhlc2UgY2hpcHMgY29udGFpbiBhIDAwMDggZGV2aWNlIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQorCSA1NTk1LiBXZSByZWNvZ25pemUgdGhlc2UgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBsaXN0ZWQKKwkgImJsYWNrbGlzdCIgUENJIElEIGFuZCByZWZ1c2UgdG8gbG9hZC4KKworICAgTk9UIFNVUFBPUlRFRAlQQ0kgSUQJCUJMQUNLTElTVCBQQ0kgSUQJCisJIDU0MAkJMDAwOAkJMDU0MAorCSA1NTAJCTAwMDgJCTA1NTAKKwk1NTEzCQkwMDA4CQk1NTExCisJNTU4MQkJMDAwOAkJNTU5NworCTU1ODIJCTAwMDgJCTU1OTcKKwk1NTk3CQkwMDA4CQk1NTk3CisJNTU5OAkJMDAwOAkJNTU5Ny81NTk4CisJIDYzMAkJMDAwOAkJMDYzMAorCSA2NDUJCTAwMDgJCTA2NDUKKwkgNzMwCQkwMDA4CQkwNzMwCisJIDczNQkJMDAwOAkJMDczNQorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisKKy8qIElmIGZvcmNlX2FkZHIgaXMgc2V0IHRvIGFueXRoaW5nIGRpZmZlcmVudCBmcm9tIDAsIHdlIGZvcmNpYmx5IGVuYWJsZQorICAgdGhlIGRldmljZSBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gKi8KK3N0YXRpYyB1MTYgZm9yY2VfYWRkcjsKK21vZHVsZV9wYXJhbShmb3JjZV9hZGRyLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9hZGRyLAorCQkgIkluaXRpYWxpemUgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2Vuc29ycyIpOworCisvKiBBZGRyZXNzZXMgdG8gc2Nhbi4KKyAgIE5vdGUgdGhhdCB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhlIElTQSBhZGRyZXNzIHVudGlsIHdlIGhhdmUgaW5pdGlhbGl6ZWQKKyAgIG91ciBtb2R1bGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMDAwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK1NFTlNPUlNfSU5TTU9EXzEoc2lzNTU5NSk7CisKKy8qIE1hbnkgU0lTNTU5NSBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCisKKy8qIExlbmd0aCBvZiBJU0EgYWRkcmVzcyBzZWdtZW50ICovCisjZGVmaW5lIFNJUzU1OTVfRVhURU5UIDgKKy8qIFBDSSBDb25maWcgUmVnaXN0ZXJzICovCisjZGVmaW5lIFNJUzU1OTVfUkVWSVNJT05fUkVHIDB4MDgKKyNkZWZpbmUgU0lTNTU5NV9CQVNFX1JFRyAweDY4CisjZGVmaW5lIFNJUzU1OTVfUElOX1JFRyAweDdBCisjZGVmaW5lIFNJUzU1OTVfRU5BQkxFX1JFRyAweDdCCisKKy8qIFdoZXJlIGFyZSB0aGUgSVNBIGFkZHJlc3MvZGF0YSByZWdpc3RlcnMgcmVsYXRpdmUgdG8gdGhlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBTSVM1NTk1X0FERFJfUkVHX09GRlNFVCA1CisjZGVmaW5lIFNJUzU1OTVfREFUQV9SRUdfT0ZGU0VUIDYKKworLyogVGhlIFNJUzU1OTUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNJUzU1OTVfUkVHX0lOX01BWChucikgKDB4MmIgKyAobnIpICogMikKKyNkZWZpbmUgU0lTNTU5NV9SRUdfSU5fTUlOKG5yKSAoMHgyYyArIChucikgKiAyKQorI2RlZmluZSBTSVM1NTk1X1JFR19JTihucikgKDB4MjAgKyAobnIpKQorCisjZGVmaW5lIFNJUzU1OTVfUkVHX0ZBTl9NSU4obnIpICgweDNiICsgKG5yKSkKKyNkZWZpbmUgU0lTNTU5NV9SRUdfRkFOKG5yKSAoMHgyOCArIChucikpCisKKy8qIE9uIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBjaGlwLCB0aGUgdGVtcCByZWdpc3RlcnMgYXJlIHNlcGFyYXRlLgorICAgT24gdGhlIHNlY29uZCB2ZXJzaW9uLAorICAgVEVNUCBwaW4gaXMgc2hhcmVkIHdpdGggSU40LCBjb25maWd1cmVkIGluIFBDSSByZWdpc3RlciAweDdBLgorICAgVGhlIHJlZ2lzdGVycyBhcmUgdGhlIHNhbWUgYXMgd2VsbC4KKyAgIE9WRVIgYW5kIEhZU1QgYXJlIHJlYWxseSBNQVggYW5kIE1JTi4gKi8KKworI2RlZmluZSBSRVYyTUlOCTB4YjAKKyNkZWZpbmUgU0lTNTU5NV9SRUdfVEVNUCAJKCggZGF0YS0+cmV2aXNpb24pID49IFJFVjJNSU4pID8gXAorCQkJCQlTSVM1NTk1X1JFR19JTig0KSA6IDB4MjcKKyNkZWZpbmUgU0lTNTU5NV9SRUdfVEVNUF9PVkVSCSgoIGRhdGEtPnJldmlzaW9uKSA+PSBSRVYyTUlOKSA/IFwKKwkJCQkJU0lTNTU5NV9SRUdfSU5fTUFYKDQpIDogMHgzOQorI2RlZmluZSBTSVM1NTk1X1JFR19URU1QX0hZU1QJKCggZGF0YS0+cmV2aXNpb24pID49IFJFVjJNSU4pID8gXAorCQkJCQlTSVM1NTk1X1JFR19JTl9NSU4oNCkgOiAweDNhCisKKyNkZWZpbmUgU0lTNTU5NV9SRUdfQ09ORklHIDB4NDAKKyNkZWZpbmUgU0lTNTU5NV9SRUdfQUxBUk0xIDB4NDEKKyNkZWZpbmUgU0lTNTU5NV9SRUdfQUxBUk0yIDB4NDIKKyNkZWZpbmUgU0lTNTU5NV9SRUdfRkFORElWIDB4NDcKKworLyogQ29udmVyc2lvbnMuIExpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHCisgICB2YXJpYW50cy4gKi8KKworLyogSU46IG1WLCAoMFYgdG8gNC4wOFYpCisgICBSRUc6IDE2bVYvYml0ICovCitzdGF0aWMgaW5saW5lIHU4IElOX1RPX1JFRyh1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIG52YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgNDA4MCk7CisJcmV0dXJuIChudmFsICsgOCkgLyAxNjsKK30KKyNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKSAoKHZhbCkgKiAgMTYpCisKK3N0YXRpYyBpbmxpbmUgdTggRkFOX1RPX1JFRyhsb25nIHJwbSwgaW50IGRpdikKK3sKKwlpZiAocnBtIDw9IDApCisJCXJldHVybiAyNTU7CisJcmV0dXJuIFNFTlNPUlNfTElNSVQoKDEzNTAwMDAgKyBycG0gKiBkaXYgLyAyKSAvIChycG0gKiBkaXYpLCAxLCAyNTQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBGQU5fRlJPTV9SRUcodTggdmFsLCBpbnQgZGl2KQoreworCXJldHVybiB2YWw9PTAgPyAtMSA6IHZhbD09MjU1ID8gMCA6IDEzNTAwMDAvKHZhbCpkaXYpOworfQorCisvKiBURU1QOiBtQyAoLTU0LjEyQyB0byArMTU3LjUzQykKKyAgIFJFRzogMC44M0MvYml0ICsgNTIuMTIsIHR3bydzIGNvbXBsZW1lbnQgICovCitzdGF0aWMgaW5saW5lIGludCBURU1QX0ZST01fUkVHKHM4IHZhbCkKK3sKKwlyZXR1cm4gdmFsICogODMwICsgNTIxMjA7Cit9CitzdGF0aWMgaW5saW5lIHM4IFRFTVBfVE9fUkVHKGludCB2YWwpCit7CisJaW50IG52YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgLTU0MTIwLCAxNTc1MzApIDsKKwlyZXR1cm4gbnZhbDwwID8gKG52YWwtNTIxMi00MTUpLzgzMCA6IChudmFsLTUyMTIrNDE1KS84MzA7Cit9CisKKy8qIEZBTiBESVY6IDEsIDIsIDQsIG9yIDggKGRlZmF1bHRzIHRvIDIpCisgICBSRUc6IDAsIDEsIDIsIG9yIDMgKHJlc3BlY3RpdmVseSkgKGRlZmF1bHRzIHRvIDEpICovCitzdGF0aWMgaW5saW5lIHU4IERJVl9UT19SRUcoaW50IHZhbCkKK3sKKwlyZXR1cm4gdmFsPT04ID8gMyA6IHZhbD09NCA/IDIgOiB2YWw9PTEgPyAwIDogMTsKK30KKyNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkgKDEgPDwgKHZhbCkpCisKKy8qIEZvciB0aGUgU0lTNTU5NSwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuIFRoYXQKKyAgIGRhdGEgaXMgcG9pbnRlZCB0byBieSBzaXM1NTk1X2xpc3RbTlJdLT5kYXRhLiBUaGUgc3RydWN0dXJlIGl0c2VsZiBpcworICAgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgdGltZSB3aGVuIHRoZSBuZXcgc2lzNTU5NSBjbGllbnQgaXMKKyAgIGFsbG9jYXRlZC4gKi8KK3N0cnVjdCBzaXM1NTk1X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCWNoYXIgbWF4aW5zOwkJLyogPT0gMyBpZiB0ZW1wIGVuYWJsZWQsIG90aGVyd2lzZSA9PSA0ICovCisJdTggcmV2aXNpb247CQkvKiBSZWcuIHZhbHVlICovCisKKwl1OCBpbls1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhblsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX21pblsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcDsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9vdmVyOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX2h5c3Q7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLworCXUxNiBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqc19icmlkZ2U7CS8qIHBvaW50ZXIgdG8gdGhlIChvbmx5KSBzaXM1NTk1ICovCisKK3N0YXRpYyBpbnQgc2lzNTU5NV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBzaXM1NTk1X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IHNpczU1OTVfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIGludCBzaXM1NTk1X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnaXN0ZXIpOworc3RhdGljIGludCBzaXM1NTk1X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZ2lzdGVyLCB1OCB2YWx1ZSk7CitzdGF0aWMgc3RydWN0IHNpczU1OTVfZGF0YSAqc2lzNTU5NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzaXM1NTk1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc2lzNTU5NV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJzaXM1NTk1IiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX1NJUzU1OTUsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gc2lzNTU5NV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IHNpczU1OTVfZGV0YWNoX2NsaWVudCwKK307CisKKy8qIDQgVm9sdGFnZXMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluW25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBzaXM1NTk1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWluW25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBzaXM1NTk1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCSAgICAgICBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21pbltucl0gPSBJTl9UT19SRUcodmFsKTsKKwlzaXM1NTk1X3dyaXRlX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfSU5fTUlOKG5yKSwgZGF0YS0+aW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJICAgICAgIHNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fbWF4W25yXSA9IElOX1RPX1JFRyh2YWwpOworCXNpczU1OTVfd3JpdGVfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19JTl9NQVgobnIpLCBkYXRhLT5pbl9tYXhbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzaG93X2luX29mZnNldChvZmZzZXQpCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQlcCisJc2hvd19pbiMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsJCQlcCit9CQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCAJCVwKKwkJc2hvd19pbiMjb2Zmc2V0LCBOVUxMKTsJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJXAorCXNob3dfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJXAorCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9tYXgoZGV2LCBidWYsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNldF9pbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNldF9pbl9tYXgoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQlzaG93X2luIyNvZmZzZXQjI19taW4sIHNldF9pbiMjb2Zmc2V0IyNfbWluKTsJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKKworc2hvd19pbl9vZmZzZXQoMCk7CitzaG93X2luX29mZnNldCgxKTsKK3Nob3dfaW5fb2Zmc2V0KDIpOworc2hvd19pbl9vZmZzZXQoMyk7CitzaG93X2luX29mZnNldCg0KTsKKworLyogVGVtcGVyYXR1cmUgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcCkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfb3ZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9vdmVyKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX292ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9vdmVyID0gVEVNUF9UT19SRUcodmFsKTsKKwlzaXM1NTk1X3dyaXRlX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfVEVNUF9PVkVSLCBkYXRhLT50ZW1wX292ZXIpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9oeXN0KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9oeXN0ID0gVEVNUF9UT19SRUcodmFsKTsKKwlzaXM1NTk1X3dyaXRlX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfVEVNUF9IWVNULCBkYXRhLT50ZW1wX2h5c3QpOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJc2hvd190ZW1wX292ZXIsIHNldF90ZW1wX292ZXIpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJc2hvd190ZW1wX2h5c3QsIHNldF90ZW1wX2h5c3QpOworCisvKiAyIEZhbnMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IHNpczU1OTVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwKKwkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IHNpczU1OTVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKKwkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKHZhbCwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJc2lzNTU5NV93cml0ZV92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0ZBTl9NSU4obnIpLCBkYXRhLT5mYW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBzaXM1NTk1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSApOworfQorCisvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcworICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCisgICBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKKyAgIGJlY2F1c2UgdGhlIGRpdmlzb3IgY2hhbmdlZC4gKi8KK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgbWluOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJaW50IHJlZzsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwltaW4gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCQlESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwlyZWcgPSBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19GQU5ESVYpOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6IGRhdGEtPmZhbl9kaXZbbnJdID0gMDsgYnJlYWs7CisJY2FzZSAyOiBkYXRhLT5mYW5fZGl2W25yXSA9IDE7IGJyZWFrOworCWNhc2UgNDogZGF0YS0+ZmFuX2Rpdltucl0gPSAyOyBicmVhazsKKwljYXNlIDg6IGRhdGEtPmZhbl9kaXZbbnJdID0gMzsgYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYW5fZGl2IHZhbHVlICVsZCBub3QgIgorCQkJInN1cHBvcnRlZC4gQ2hvb3NlIG9uZSBvZiAxLCAyLCA0IG9yIDghXG4iLCB2YWwpOworCQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCisJc3dpdGNoIChucikgeworCWNhc2UgMDoKKwkJcmVnID0gKHJlZyAmIDB4Y2YpIHwgKGRhdGEtPmZhbl9kaXZbbnJdIDw8IDQpOworCQlicmVhazsKKwljYXNlIDE6CisJCXJlZyA9IChyZWcgJiAweDNmKSB8IChkYXRhLT5mYW5fZGl2W25yXSA8PCA2KTsKKwkJYnJlYWs7CisJfQorCXNpczU1OTVfd3JpdGVfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19GQU5ESVYsIHJlZyk7CisJZGF0YS0+ZmFuX21pbltucl0gPQorCQlGQU5fVE9fUkVHKG1pbiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJc2lzNTU5NV93cml0ZV92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0ZBTl9NSU4obnIpLCBkYXRhLT5mYW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc2hvd19mYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9mYW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuXyMjb2Zmc2V0LCBOVUxMKTtcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQlzaG93X2Zhbl8jI29mZnNldCMjX21pbiwgc2V0X2Zhbl8jI29mZnNldCMjX21pbik7CisKK3Nob3dfZmFuX29mZnNldCgxKTsKK3Nob3dfZmFuX29mZnNldCgyKTsKKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8xX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIDApIDsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8yX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIDEpIDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4xX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfZmFuXzFfZGl2LCBzZXRfZmFuXzFfZGl2KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4yX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfZmFuXzJfZGl2LCBzZXRfZmFuXzJfZGl2KTsKKworLyogQWxhcm1zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CisgCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCitzdGF0aWMgaW50IHNpczU1OTVfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgc2lzNTU5NV9kZXRlY3QpOworfQorCitpbnQgc2lzNTU5NV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YTsKKwljaGFyIHZhbDsKKwl1MTYgYTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgcHJvYmluZyB0aGUgSVNBIGJ1cyEhICAqLworCWlmICghaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoZm9yY2VfYWRkcikKKwkJYWRkcmVzcyA9IGZvcmNlX2FkZHIgJiB+KFNJUzU1OTVfRVhURU5UIC0gMSk7CisJLyogUmVzZXJ2ZSB0aGUgSVNBIHJlZ2lvbiAqLworCWlmICghcmVxdWVzdF9yZWdpb24oYWRkcmVzcywgU0lTNTU5NV9FWFRFTlQsIHNpczU1OTVfZHJpdmVyLm5hbWUpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBleGl0OworCX0KKwlpZiAoZm9yY2VfYWRkcikgeworCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAiZm9yY2luZyBJU0EgYWRkcmVzcyAweCUwNFhcbiIsIGFkZHJlc3MpOworCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CisJCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoc19icmlkZ2UsIFNJUzU1OTVfQkFTRV9SRUcsIGFkZHJlc3MpKQorCQkJZ290byBleGl0X3JlbGVhc2U7CisJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KKwkJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBTSVM1NTk1X0JBU0VfUkVHLCAmYSkpCisJCQlnb3RvIGV4aXRfcmVsZWFzZTsKKwkJaWYgKChhICYgfihTSVM1NTk1X0VYVEVOVCAtIDEpKSAhPSBhZGRyZXNzKQorCQkJLyogZG9lc24ndCB3b3JrIGZvciBzb21lIGNoaXBzPyAqLworCQkJZ290byBleGl0X3JlbGVhc2U7CisJfQorCisJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQorCSAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShzX2JyaWRnZSwgU0lTNTU5NV9FTkFCTEVfUkVHLCAmdmFsKSkgeworCQlnb3RvIGV4aXRfcmVsZWFzZTsKKwl9CisJaWYgKCh2YWwgJiAweDgwKSA9PSAwKSB7CisJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KKwkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShzX2JyaWRnZSwgU0lTNTU5NV9FTkFCTEVfUkVHLAorCQkJCQkgIHZhbCB8IDB4ODApKQorCQkJZ290byBleGl0X3JlbGVhc2U7CisJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KKwkJICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKHNfYnJpZGdlLCBTSVM1NTk1X0VOQUJMRV9SRUcsICZ2YWwpKQorCQkJZ290byBleGl0X3JlbGVhc2U7CisJCWlmICgodmFsICYgMHg4MCkgPT0gMCkgCisJCQkvKiBkb2Vzbid0IHdvcmsgZm9yIHNvbWUgY2hpcHMhICovCisJCQlnb3RvIGV4aXRfcmVsZWFzZTsKKwl9CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNpczU1OTVfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfcmVsZWFzZTsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3Qgc2lzNTU5NV9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwlpbml0X01VVEVYKCZkYXRhLT5sb2NrKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnNpczU1OTVfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIENoZWNrIHJldmlzaW9uIGFuZCBwaW4gcmVnaXN0ZXJzIHRvIGRldGVybWluZSB3aGV0aGVyIDQgb3IgNSB2b2x0YWdlcyAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNfYnJpZGdlLCBTSVM1NTk1X1JFVklTSU9OX1JFRywgJihkYXRhLT5yZXZpc2lvbikpOworCS8qIDQgdm9sdGFnZXMsIDEgdGVtcCAqLworCWRhdGEtPm1heGlucyA9IDM7CisJaWYgKGRhdGEtPnJldmlzaW9uID49IFJFVjJNSU4pIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoc19icmlkZ2UsIFNJUzU1OTVfUElOX1JFRywgJnZhbCk7CisJCWlmICghKHZhbCAmIDB4ODApKQorCQkJLyogNSB2b2x0YWdlcywgbm8gdGVtcHMgKi8KKwkJCWRhdGEtPm1heGlucyA9IDQ7CisJfQorCQorCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJzaXM1NTk1IiwgSTJDX05BTUVfU0laRSk7CisKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIGV4aXRfZnJlZTsKKwkKKwkvKiBJbml0aWFsaXplIHRoZSBTSVM1NTk1IGNoaXAgKi8KKwlzaXM1NTk1X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogQSBmZXcgdmFycyBuZWVkIHRvIGJlIGZpbGxlZCB1cG9uIHN0YXJ0dXAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWRhdGEtPmZhbl9taW5baV0gPSBzaXM1NTk1X3JlYWRfdmFsdWUobmV3X2NsaWVudCwKKwkJCQkJU0lTNTU5NV9SRUdfRkFOX01JTihpKSk7CisJfQorCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOworCWlmIChkYXRhLT5tYXhpbnMgPT0gNCkgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9pbnB1dCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7CisJfQorCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisJaWYgKGRhdGEtPm1heGlucyA9PSAzKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QpOworCX0KKwlyZXR1cm4gMDsKKwkKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXRfcmVsZWFzZToKKwlyZWxlYXNlX3JlZ2lvbihhZGRyZXNzLCBTSVM1NTk1X0VYVEVOVCk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2lzNTU5NV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCSAgICAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChpMmNfaXNfaXNhX2NsaWVudChjbGllbnQpKQorCQlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIFNJUzU1OTVfRVhURU5UKTsKKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKworCXJldHVybiAwOworfQorCisKKy8qIElTQSBhY2Nlc3MgbXVzdCBiZSBsb2NrZWQgZXhwbGljaXRseS4gKi8KK3N0YXRpYyBpbnQgc2lzNTU5NV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgcmVzOworCisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWRvd24oJmRhdGEtPmxvY2spOworCW91dGJfcChyZWcsIGNsaWVudC0+YWRkciArIFNJUzU1OTVfQUREUl9SRUdfT0ZGU0VUKTsKKwlyZXMgPSBpbmJfcChjbGllbnQtPmFkZHIgKyBTSVM1NTk1X0RBVEFfUkVHX09GRlNFVCk7CisJdXAoJmRhdGEtPmxvY2spOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgc2lzNTU5NV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKQoreworCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlkb3duKCZkYXRhLT5sb2NrKTsKKwlvdXRiX3AocmVnLCBjbGllbnQtPmFkZHIgKyBTSVM1NTk1X0FERFJfUkVHX09GRlNFVCk7CisJb3V0Yl9wKHZhbHVlLCBjbGllbnQtPmFkZHIgKyBTSVM1NTk1X0RBVEFfUkVHX09GRlNFVCk7CisJdXAoJmRhdGEtPmxvY2spOworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IFNJUzU1OTUuICovCitzdGF0aWMgdm9pZCBzaXM1NTk1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTggY29uZmlnID0gc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfQ09ORklHKTsKKwlpZiAoIShjb25maWcgJiAweDAxKSkKKwkJc2lzNTU5NV93cml0ZV92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0NPTkZJRywKKwkJCQkoY29uZmlnICYgMHhmNykgfCAweDAxKTsKK30KKworc3RhdGljIHN0cnVjdCBzaXM1NTk1X2RhdGEgKnNpczU1OTVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CisKKwkJZm9yIChpID0gMDsgaSA8PSBkYXRhLT5tYXhpbnM7IGkrKykgeworCQkJZGF0YS0+aW5baV0gPQorCQkJICAgIHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0lOKGkpKTsKKwkJCWRhdGEtPmluX21pbltpXSA9CisJCQkgICAgc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIFNJUzU1OTVfUkVHX0lOX01JTihpKSk7CisJCQlkYXRhLT5pbl9tYXhbaV0gPQorCQkJICAgIHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBTSVM1NTk1X1JFR19JTl9NQVgoaSkpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCWRhdGEtPmZhbltpXSA9CisJCQkgICAgc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfRkFOKGkpKTsKKwkJCWRhdGEtPmZhbl9taW5baV0gPQorCQkJICAgIHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBTSVM1NTk1X1JFR19GQU5fTUlOKGkpKTsKKwkJfQorCQlpZiAoZGF0YS0+bWF4aW5zID09IDMpIHsKKwkJCWRhdGEtPnRlbXAgPQorCQkJICAgIHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX1RFTVApOworCQkJZGF0YS0+dGVtcF9vdmVyID0KKwkJCSAgICBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19URU1QX09WRVIpOworCQkJZGF0YS0+dGVtcF9oeXN0ID0KKwkJCSAgICBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19URU1QX0hZU1QpOworCQl9CisJCWkgPSBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19GQU5ESVYpOworCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzFdID0gaSA+PiA2OworCQlkYXRhLT5hbGFybXMgPQorCQkgICAgc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfQUxBUk0xKSB8CisJCSAgICAoc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfQUxBUk0yKSA8PCA4KTsKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNpczU1OTVfcGNpX2lkc1tdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzUwMykgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzaXM1NTk1X3BjaV9pZHMpOworCitzdGF0aWMgaW50IGJsYWNrbGlzdFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJUENJX0RFVklDRV9JRF9TSV81NDAsCisJUENJX0RFVklDRV9JRF9TSV81NTAsCisJUENJX0RFVklDRV9JRF9TSV82MzAsCisJUENJX0RFVklDRV9JRF9TSV82NDUsCisJUENJX0RFVklDRV9JRF9TSV83MzAsCisJUENJX0RFVklDRV9JRF9TSV83MzUsCisJUENJX0RFVklDRV9JRF9TSV81NTExLCAvKiA1NTEzIGNoaXAgaGFzIHRoZSAwMDA4IGRldmljZSBidXQKKwkJCQkgIHRoYXQgSUQgc2hvd3MgdXAgaW4gb3RoZXIgY2hpcHMgc28gd2UKKwkJCQkgIHVzZSB0aGUgNTUxMSBJRCBmb3IgcmVjb2duaXRpb24gKi8KKwlQQ0lfREVWSUNFX0lEX1NJXzU1OTcsCisJUENJX0RFVklDRV9JRF9TSV81NTk4LAorCTAgfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc2lzNTU5NV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXUxNiB2YWw7CisJaW50ICppOworCWludCBhZGRyID0gMDsKKworCWZvciAoaSA9IGJsYWNrbGlzdDsgKmkgIT0gMDsgaSsrKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0ksICppLCBOVUxMKTsKKwkJaWYgKGRldikgeworCQkJZGV2X2VycigmZGV2LT5kZXYsICJMb29rZWQgZm9yIFNJUzU1OTUgYnV0IGZvdW5kIHVuc3VwcG9ydGVkIGRldmljZSAlLjR4XG4iLCAqaSk7CisJCQlwY2lfZGV2X3B1dChkZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisJCisJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQorCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFNJUzU1OTVfQkFTRV9SRUcsICZ2YWwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlhZGRyID0gdmFsICYgfihTSVM1NTk1X0VYVEVOVCAtIDEpOworCWlmIChhZGRyID09IDAgJiYgZm9yY2VfYWRkciA9PSAwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiQmFzZSBhZGRyZXNzIG5vdCBzZXQgLSB1cGdyYWRlIEJJT1Mgb3IgdXNlIGZvcmNlX2FkZHI9MHhhZGRyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChmb3JjZV9hZGRyKQorCQlhZGRyID0gZm9yY2VfYWRkcjsJLyogc28gZGV0ZWN0IHdpbGwgZ2V0IGNhbGxlZCAqLworCisJaWYgKCFhZGRyKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCJObyBTaVMgNTU5NSBzZW5zb3JzIGZvdW5kLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlub3JtYWxfaXNhWzBdID0gYWRkcjsKKworCXNfYnJpZGdlID0gcGNpX2Rldl9nZXQoZGV2KTsKKwlpZiAoaTJjX2FkZF9kcml2ZXIoJnNpczU1OTVfZHJpdmVyKSkgeworCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CisJCXNfYnJpZGdlID0gTlVMTDsKKwl9CisKKwkvKiBBbHdheXMgcmV0dXJuIGZhaWx1cmUgaGVyZS4gIFRoaXMgaXMgdG8gYWxsb3cgb3RoZXIgZHJpdmVycyB0byBiaW5kCisJICogdG8gdGhpcyBwY2kgZGV2aWNlLiAgV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gaGF2ZSBjb250cm9sIG92ZXIgdGhlCisJICogcGNpIGRldmljZSwgd2Ugb25seSB3YW50ZWQgdG8gcmVhZCBhcyBmZXcgcmVnaXN0ZXIgdmFsdWVzIGZyb20gaXQuCisJICovCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzaXM1NTk1X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICAgICA9ICJzaXM1NTk1IiwKKwkuaWRfdGFibGUgICAgICAgID0gc2lzNTU5NV9wY2lfaWRzLAorCS5wcm9iZSAgICAgICAgICAgPSBzaXM1NTk1X3BjaV9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNtX3NpczU1OTVfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzaXM1NTk1X3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc21fc2lzNTU5NV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzaXM1NTk1X3BjaV9kcml2ZXIpOworCWlmIChzX2JyaWRnZSAhPSBOVUxMKSB7CisJCWkyY19kZWxfZHJpdmVyKCZzaXM1NTk1X2RyaXZlcik7CisJCXBjaV9kZXZfcHV0KHNfYnJpZGdlKTsKKwkJc19icmlkZ2UgPSBOVUxMOworCX0KK30KKworTU9EVUxFX0FVVEhPUigiQXVyZWxpZW4gSmFybm8gPGF1cmVsaWVuQGF1cmVsMzIubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaVMgNTU5NSBTZW5zb3IgZGV2aWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNtX3NpczU1OTVfaW5pdCk7Cittb2R1bGVfZXhpdChzbV9zaXM1NTk1X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvc21zYzQ3YjM5Ny5jIGIvZHJpdmVycy9pMmMvY2hpcHMvc21zYzQ3YjM5Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTljNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9zbXNjNDdiMzk3LmMKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgICAgc21zYzQ3YjM5Ny5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcworCQkJZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKKworICAgIFN1cHBvcnRzIHRoZSBTTVNDIExQQzQ3QjM5Ny1OQyBTdXBlci1JL08gY2hpcC4KKworICAgIEF1dGhvci9NYWludGFpbmVyOiBNYXJrIE0uIEhvZmZtYW4gPG1ob2ZmbWFuQGxpZ2h0bGluay5jb20+CisJQ29weXJpZ2h0IChDKSAyMDA0IFV0aWxpdGVrIFN5c3RlbXMsIEluYy4KKworICAgIGRlcml2ZWQgaW4gcGFydCBmcm9tIHNtc2M0N20xLmM6CisJQ29weXJpZ2h0IChDKSAyMDAyIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KKwlDb3B5cmlnaHQgKEMpIDIwMDQgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19DTElFTlRfRU5EIH07CisvKiBBZGRyZXNzIGlzIGF1dG9kZXRlY3RlZCwgdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDB4MDAwMCwgSTJDX0NMSUVOVF9JU0FfRU5EIH07CitzdGF0aWMgc3RydWN0IGkyY19mb3JjZV9kYXRhIGZvcmNlc1tdID0ge3tOVUxMfX07CisKK2VudW0gY2hpcHMgeyBhbnlfY2hpcCwgc21zYzQ3YjM5NyB9Oworc3RhdGljIHN0cnVjdCBpMmNfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKKwkubm9ybWFsX2kyYwkJPSBub3JtYWxfaTJjLAorCS5ub3JtYWxfaXNhCQk9IG5vcm1hbF9pc2EsCisJLnByb2JlCQkJPSBub3JtYWxfaTJjLAkJLyogY2hlYXQgKi8KKwkuaWdub3JlCQkJPSBub3JtYWxfaTJjLAkJLyogY2hlYXQgKi8KKwkuZm9yY2VzCQkJPSBmb3JjZXMsCit9OworCisvKiBTdXBlci1JLzAgcmVnaXN0ZXJzIGFuZCBjb21tYW5kcyAqLworCisjZGVmaW5lCVJFRwkweDJlCS8qIFRoZSByZWdpc3RlciB0byByZWFkL3dyaXRlICovCisjZGVmaW5lCVZBTAkweDJmCS8qIFRoZSB2YWx1ZSB0byByZWFkL3dyaXRlICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdXBlcmlvX291dGIoaW50IHJlZywgaW50IHZhbCkKK3sKKwlvdXRiKHJlZywgUkVHKTsKKwlvdXRiKHZhbCwgVkFMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3VwZXJpb19pbmIoaW50IHJlZykKK3sKKwlvdXRiKHJlZywgUkVHKTsKKwlyZXR1cm4gaW5iKFZBTCk7Cit9CisKKy8qIHNlbGVjdCBzdXBlcmlvIGxvZ2ljYWwgZGV2aWNlICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19zZWxlY3QoaW50IGxkKQoreworCXN1cGVyaW9fb3V0YigweDA3LCBsZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdXBlcmlvX2VudGVyKHZvaWQpCit7CisJb3V0YigweDU1LCBSRUcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19leGl0KHZvaWQpCit7CisJb3V0YigweEFBLCBSRUcpOworfQorCisjZGVmaW5lIFNVUEVSSU9fUkVHX0RFVklECTB4MjAKKyNkZWZpbmUgU1VQRVJJT19SRUdfREVWUkVWCTB4MjEKKyNkZWZpbmUgU1VQRVJJT19SRUdfQkFTRV9NU0IJMHg2MAorI2RlZmluZSBTVVBFUklPX1JFR19CQVNFX0xTQgkweDYxCisjZGVmaW5lIFNVUEVSSU9fUkVHX0xEOAkJMHgwOAorCisjZGVmaW5lIFNNU0NfRVhURU5UCQkweDAyCisKKy8qIDAgPD0gbnIgPD0gMyAqLworc3RhdGljIHU4IHNtc2M0N2IzOTdfcmVnX3RlbXBbXSA9IHsweDI1LCAweDI2LCAweDI3LCAweDgwfTsKKyNkZWZpbmUgU01TQzQ3QjM5N19SRUdfVEVNUChucikJKHNtc2M0N2IzOTdfcmVnX3RlbXBbKG5yKV0pCisKKy8qIDAgPD0gbnIgPD0gMyAqLworI2RlZmluZSBTTVNDNDdCMzk3X1JFR19GQU5fTFNCKG5yKSAoMHgyOCArIDIgKiAobnIpKQorI2RlZmluZSBTTVNDNDdCMzk3X1JFR19GQU5fTVNCKG5yKSAoMHgyOSArIDIgKiAobnIpKQorCitzdHJ1Y3Qgc21zYzQ3YjM5N19kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLworCWludCB2YWxpZDsKKworCS8qIHJlZ2lzdGVyIHZhbHVlcyAqLworCXUxNiBmYW5bNF07CisJdTggdGVtcFs0XTsKK307CisKK3N0YXRpYyBpbnQgc21zYzQ3YjM5N19yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlzdHJ1Y3Qgc21zYzQ3YjM5N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJlczsKKworCWRvd24oJmRhdGEtPmxvY2spOworCW91dGIocmVnLCBjbGllbnQtPmFkZHIpOworCXJlcyA9IGluYl9wKGNsaWVudC0+YWRkciArIDEpOworCXVwKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IHNtc2M0N2IzOTdfZGF0YSAqc21zYzQ3YjM5N191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKyAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc21zYzQ3YjM5N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAic3RhcnRpbmcgZGV2aWNlIHVwZGF0ZS4uLlxuIik7CisKKwkJLyogNCB0ZW1wZXJhdHVyZSBpbnB1dHMsIDQgZmFuIGlucHV0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlkYXRhLT50ZW1wW2ldID0gc21zYzQ3YjM5N19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJU01TQzQ3QjM5N19SRUdfVEVNUChpKSk7CisKKwkJCS8qIG11c3QgcmVhZCBMU0IgZmlyc3QgKi8KKwkJCWRhdGEtPmZhbltpXSAgPSBzbXNjNDdiMzk3X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQlTTVNDNDdCMzk3X1JFR19GQU5fTFNCKGkpKTsKKwkJCWRhdGEtPmZhbltpXSB8PSBzbXNjNDdiMzk3X3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQlTTVNDNDdCMzk3X1JFR19GQU5fTVNCKGkpKSA8PCA4OworCQl9CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiLi4uIGRldmljZSB1cGRhdGUgY29tcGxldGVcbiIpOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyogVEVNUDogMC4wMDFDL2JpdCAoLTEyOEMgdG8gKzEyN0MpCisgICBSRUc6IDFDL2JpdCwgdHdvJ3MgY29tcGxlbWVudCAqLworc3RhdGljIGludCB0ZW1wX2Zyb21fcmVnKHU4IHJlZykKK3sKKwlyZXR1cm4gKHM4KXJlZyAqIDEwMDA7Cit9CisKKy8qIDAgPD0gbnIgPD0gMyAqLworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHNtc2M0N2IzOTdfZGF0YSAqZGF0YSA9IHNtc2M0N2IzOTdfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wX2Zyb21fcmVnKGRhdGEtPnRlbXBbbnJdKSk7Cit9CisKKyNkZWZpbmUgc3lzZnNfdGVtcChudW0pIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBudW0tMSk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI251bSMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAjI251bSwgTlVMTCkKKworc3lzZnNfdGVtcCgxKTsKK3N5c2ZzX3RlbXAoMik7CitzeXNmc190ZW1wKDMpOworc3lzZnNfdGVtcCg0KTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChjbGllbnQsIG51bSkgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNudW0jI19pbnB1dCkKKworLyogRkFOOiAxIFJQTS9iaXQKKyAgIFJFRzogY291bnQgb2YgOTBrSHogcHVsc2VzIC8gcmV2b2x1dGlvbiAqLworc3RhdGljIGludCBmYW5fZnJvbV9yZWcodTE2IHJlZykKK3sKKwlyZXR1cm4gOTAwMDAgKiA2MCAvIHJlZzsKK30KKworLyogMCA8PSBuciA8PSAzICovCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworICAgICAgICBzdHJ1Y3Qgc21zYzQ3YjM5N19kYXRhICpkYXRhID0gc21zYzQ3YjM5N191cGRhdGVfZGV2aWNlKGRldik7CisgICAgICAgIHJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBmYW5fZnJvbV9yZWcoZGF0YS0+ZmFuW25yXSkpOworfQorCisjZGVmaW5lIHN5c2ZzX2ZhbihudW0pIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNudW0oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1ZiwgbnVtLTEpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI251bSMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiMjbnVtLCBOVUxMKQorCitzeXNmc19mYW4oMSk7CitzeXNmc19mYW4oMik7CitzeXNmc19mYW4oMyk7CitzeXNmc19mYW4oNCk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihjbGllbnQsIG51bSkgXAorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI251bSMjX2lucHV0KQorCitzdGF0aWMgaW50IHNtc2M0N2IzOTdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsIGludCBraW5kKTsKKworc3RhdGljIGludCBzbXNjNDdiMzk3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHNtc2M0N2IzOTdfZGV0ZWN0KTsKK30KKworc3RhdGljIGludCBzbXNjNDdiMzk3X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKKwkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBTTVNDX0VYVEVOVCk7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzbXNjNDdiMzk3X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInNtc2M0N2IzOTciLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfU01TQzQ3QjM5NywKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBzbXNjNDdiMzk3X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gc21zYzQ3YjM5N19kZXRhY2hfY2xpZW50LAorfTsKKworc3RhdGljIGludCBzbXNjNDdiMzk3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3Qgc21zYzQ3YjM5N19kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCisJaWYgKCFpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZGRyLCBTTVNDX0VYVEVOVCwgc21zYzQ3YjM5N19kcml2ZXIubmFtZSkpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiUmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLCBhZGRyKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNtc2M0N2IzOTdfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JlbGVhc2U7CisJfQorCW1lbXNldChkYXRhLCAweDAwLCBzaXplb2Yoc3RydWN0IHNtc2M0N2IzOTdfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyOworCWluaXRfTVVURVgoJmRhdGEtPmxvY2spOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZzbXNjNDdiMzk3X2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJzbXNjNDdiMzk3IiwgSTJDX05BTUVfU0laRSk7CisKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBlcnJvcl9mcmVlOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgNCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDQpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWU6CisJa2ZyZWUobmV3X2NsaWVudCk7CitlcnJvcl9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uKGFkZHIsIFNNU0NfRVhURU5UKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbXNjNDdiMzk3X2ZpbmQodW5zaWduZWQgaW50ICphZGRyKQoreworCXU4IGlkLCByZXY7CisKKwlzdXBlcmlvX2VudGVyKCk7CisJaWQgPSBzdXBlcmlvX2luYihTVVBFUklPX1JFR19ERVZJRCk7CisKKwlpZiAoaWQgIT0gMHg2ZikgeworCQlzdXBlcmlvX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV2ID0gc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfREVWUkVWKTsKKworCXN1cGVyaW9fc2VsZWN0KFNVUEVSSU9fUkVHX0xEOCk7CisJKmFkZHIgPSAoc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQkFTRV9NU0IpIDw8IDgpCisJCSB8ICBzdXBlcmlvX2luYihTVVBFUklPX1JFR19CQVNFX0xTQik7CisKKwlwcmludGsoS0VSTl9JTkZPICJzbXNjNDdiMzk3OiBmb3VuZCBTTVNDIExQQzQ3QjM5Ny1OQyAiCisJCSIoYmFzZSBhZGRyZXNzIDB4JTA0eCwgcmV2aXNpb24gJXUpXG4iLCAqYWRkciwgcmV2KTsKKworCXN1cGVyaW9fZXhpdCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbXNjNDdiMzk3X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBzbXNjNDdiMzk3X2ZpbmQobm9ybWFsX2lzYSkpKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZzbXNjNDdiMzk3X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbXNjNDdiMzk3X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmc21zYzQ3YjM5N19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJNYXJrIE0uIEhvZmZtYW4gPG1ob2ZmbWFuQGxpZ2h0bGluay5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNNU0MgTFBDNDdCMzk3IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzbXNjNDdiMzk3X2luaXQpOworbW9kdWxlX2V4aXQoc21zYzQ3YjM5N19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N20xLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9zbXNjNDdtMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMTJjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9zbXNjNDdtMS5jCkBAIC0wLDAgKzEsNTkxIEBACisvKgorICAgIHNtc2M0N20xLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzCisgICAgICAgICAgICAgICAgIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCisKKyAgICBTdXBwb3J0cyB0aGUgU01TQyBMUEM0N0IyN3gsIExQQzQ3TTEweCwgTFBDNDdNMTN4IGFuZCBMUEM0N00xNHgKKyAgICBTdXBlci1JL08gY2hpcHMuCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAgICBQb3J0ZWQgdG8gTGludXggMi42IGJ5IEdhYnJpZWxlIEdvcmxhIDxnb3JsaWtAeWFob28uY29tPgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEplYW4gRGVsdmFyZQorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9OworLyogQWRkcmVzcyBpcyBhdXRvZGV0ZWN0ZWQsIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyAweDAwMDAsIEkyQ19DTElFTlRfSVNBX0VORCB9Oworc3RhdGljIHN0cnVjdCBpMmNfZm9yY2VfZGF0YSBmb3JjZXNbXSA9IHt7TlVMTH19OworCitlbnVtIGNoaXBzIHsgYW55X2NoaXAsIHNtc2M0N20xIH07CitzdGF0aWMgc3RydWN0IGkyY19hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0geworCS5ub3JtYWxfaTJjCQk9IG5vcm1hbF9pMmMsCisJLm5vcm1hbF9pc2EJCT0gbm9ybWFsX2lzYSwKKwkuZm9yY2VzCQkJPSBmb3JjZXMsCit9OworCisvKiBTdXBlci1JLzAgcmVnaXN0ZXJzIGFuZCBjb21tYW5kcyAqLworCisjZGVmaW5lCVJFRwkweDJlCS8qIFRoZSByZWdpc3RlciB0byByZWFkL3dyaXRlICovCisjZGVmaW5lCVZBTAkweDJmCS8qIFRoZSB2YWx1ZSB0byByZWFkL3dyaXRlICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3VwZXJpb19vdXRiKGludCByZWcsIGludCB2YWwpCit7CisJb3V0YihyZWcsIFJFRyk7CisJb3V0Yih2YWwsIFZBTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzdXBlcmlvX2luYihpbnQgcmVnKQoreworCW91dGIocmVnLCBSRUcpOworCXJldHVybiBpbmIoVkFMKTsKK30KKworLyogbG9naWNhbCBkZXZpY2UgZm9yIGZhbnMgaXMgMHgwQSAqLworI2RlZmluZSBzdXBlcmlvX3NlbGVjdCgpIHN1cGVyaW9fb3V0YigweDA3LCAweDBBKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3N1cGVyaW9fZW50ZXIodm9pZCkKK3sKKwlvdXRiKDB4NTUsIFJFRyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3VwZXJpb19leGl0KHZvaWQpCit7CisJb3V0YigweEFBLCBSRUcpOworfQorCisjZGVmaW5lIFNVUEVSSU9fUkVHX0FDVAkJMHgzMAorI2RlZmluZSBTVVBFUklPX1JFR19CQVNFCTB4NjAKKyNkZWZpbmUgU1VQRVJJT19SRUdfREVWSUQJMHgyMAorCisvKiBMb2dpY2FsIGRldmljZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBTTVNDX0VYVEVOVAkJMHg4MAorCisvKiBuciBpcyAwIG9yIDEgaW4gdGhlIG1hY3JvcyBiZWxvdyAqLworI2RlZmluZSBTTVNDNDdNMV9SRUdfQUxBUk0JCTB4MDQKKyNkZWZpbmUgU01TQzQ3TTFfUkVHX1RQSU4obnIpCQkoMHgzNCAtIChucikpCisjZGVmaW5lIFNNU0M0N00xX1JFR19QUElOKG5yKQkJKDB4MzYgLSAobnIpKQorI2RlZmluZSBTTVNDNDdNMV9SRUdfUFdNKG5yKQkJKDB4NTYgKyAobnIpKQorI2RlZmluZSBTTVNDNDdNMV9SRUdfRkFORElWCQkweDU4CisjZGVmaW5lIFNNU0M0N00xX1JFR19GQU4obnIpCQkoMHg1OSArIChucikpCisjZGVmaW5lIFNNU0M0N00xX1JFR19GQU5fUFJFTE9BRChucikJKDB4NUIgKyAobnIpKQorCisjZGVmaW5lIE1JTl9GUk9NX1JFRyhyZWcsZGl2KQkJKChyZWcpPj0xOTIgPyAwIDogXAorCQkJCQkgOTgzMDQwLygoMTkyLShyZWcpKSooZGl2KSkpCisjZGVmaW5lIEZBTl9GUk9NX1JFRyhyZWcsZGl2LHByZWxvYWQpCSgocmVnKTw9KHByZWxvYWQpIHx8IChyZWcpPT0yNTUgPyAwIDogXAorCQkJCQkgOTgzMDQwLygoKHJlZyktKHByZWxvYWQpKSooZGl2KSkpCisjZGVmaW5lIERJVl9GUk9NX1JFRyhyZWcpCQkoMSA8PCAocmVnKSkKKyNkZWZpbmUgUFdNX0ZST01fUkVHKHJlZykJCSgoKHJlZykgJiAweDdFKSA8PCAxKQorI2RlZmluZSBQV01fRU5fRlJPTV9SRUcocmVnKQkJKCh+KHJlZykpICYgMHgwMSkKKyNkZWZpbmUgUFdNX1RPX1JFRyhyZWcpCQkJKCgocmVnKSA+PiAxKSAmIDB4N0UpCisKK3N0cnVjdCBzbXNjNDdtMV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJdTggZmFuWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fcHJlbG9hZFsyXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2WzJdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KKwl1OCBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZyAqLworCXU4IHB3bVsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlIChiaXQgNyBpcyBlbmFibGUpICovCit9OworCisKK3N0YXRpYyBpbnQgc21zYzQ3bTFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgc21zYzQ3bTFfZmluZChpbnQgKmFkZHJlc3MpOworc3RhdGljIGludCBzbXNjNDdtMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCBzbXNjNDdtMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgaW50IHNtc2M0N20xX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKTsKK3N0YXRpYyB2b2lkIHNtc2M0N20xX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpOworCitzdGF0aWMgc3RydWN0IHNtc2M0N20xX2RhdGEgKnNtc2M0N20xX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQlpbnQgaW5pdCk7CisKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNtc2M0N20xX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInNtc2M0N20xIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX1NNU0M0N00xLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IHNtc2M0N20xX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gc21zYzQ3bTFfZGV0YWNoX2NsaWVudCwKK307CisKKy8qIG5yIGlzIDAgb3IgMSBpbiB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGJlbG93ICovCisKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSAqZGF0YSA9IHNtc2M0N20xX3VwZGF0ZV9kZXZpY2UoZGV2LCAwKTsKKwkvKiBUaGlzIGNoaXAgKHN0dXBpZGx5KSBzdG9wcyBtb25pdG9yaW5nIGZhbiBzcGVlZCBpZiBQV00gaXMKKwkgICBlbmFibGVkIGFuZCBkdXR5IGN5Y2xlIGlzIDAlLiBUaGlzIGlzIGZpbmUgaWYgdGhlIG1vbml0b3JpbmcKKwkgICBhbmQgY29udHJvbCBjb25jZXJuIHRoZSBzYW1lIGZhbiwgYnV0IHRyb3VibGVzb21lIGlmIHRoZXkgYXJlCisJICAgbm90ICh3aGljaCBjb3VsZCBhcyB3ZWxsIGhhcHBlbikuICovCisJaW50IHJwbSA9IChkYXRhLT5wd21bbnJdICYgMHg3RikgPT0gMHgwMCA/IDAgOgorCQkgIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bbnJdLAorCQkJICAgICAgIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSksCisJCQkgICAgICAgZGF0YS0+ZmFuX3ByZWxvYWRbbnJdKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcnBtKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSAqZGF0YSA9IHNtc2M0N20xX3VwZGF0ZV9kZXZpY2UoZGV2LCAwKTsKKwlpbnQgcnBtID0gTUlOX0ZST01fUkVHKGRhdGEtPmZhbl9wcmVsb2FkW25yXSwKKwkJCSAgICAgICBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcnBtKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSAqZGF0YSA9IHNtc2M0N20xX3VwZGF0ZV9kZXZpY2UoZGV2LCAwKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9wd20oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSAqZGF0YSA9IHNtc2M0N20xX3VwZGF0ZV9kZXZpY2UoZGV2LCAwKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgUFdNX0ZST01fUkVHKGRhdGEtPnB3bVtucl0pKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X3B3bV9lbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCBzbXNjNDdtMV9kYXRhICpkYXRhID0gc21zYzQ3bTFfdXBkYXRlX2RldmljZShkZXYsIDApOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBQV01fRU5fRlJPTV9SRUcoZGF0YS0+cHdtW25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzbXNjNDdtMV9kYXRhICpkYXRhID0gc21zYzQ3bTFfdXBkYXRlX2RldmljZShkZXYsIDApOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybXMpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgcnBtZGl2LCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCXJwbWRpdiA9IHZhbCAqIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSk7CisKKwlpZiAoOTgzMDQwID4gMTkyICogcnBtZGl2IHx8IDIgKiBycG1kaXYgPiA5ODMwNDApIHsKKwkJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YS0+ZmFuX3ByZWxvYWRbbnJdID0gMTkyIC0gKCg5ODMwNDAgKyBycG1kaXYgLyAyKSAvIHJwbWRpdik7CisJc21zYzQ3bTFfd3JpdGVfdmFsdWUoY2xpZW50LCBTTVNDNDdNMV9SRUdfRkFOX1BSRUxPQUQobnIpLAorCQkJICAgICBkYXRhLT5mYW5fcHJlbG9hZFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCisgICBkZXRlcm1pbmVkIGluIHBhcnQgYnkgdGhlIGZhbiBjbG9jayBkaXZpZGVyLiAgVGhpcyBmb2xsb3dzIHRoZSBwcmluY2lwbGUKKyAgIG9mIGxlYXN0IHN1cHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAorICAgYmVjYXVzZSB0aGUgZGl2aWRlciBjaGFuZ2VkLiAqLworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNtc2M0N20xX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWxvbmcgbmV3X2RpdiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCksIHRtcDsKKwl1OCBvbGRfZGl2ID0gRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKTsKKworCWlmIChuZXdfZGl2ID09IG9sZF9kaXYpIC8qIE5vIGNoYW5nZSAqLworCQlyZXR1cm4gY291bnQ7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJc3dpdGNoIChuZXdfZGl2KSB7CisJY2FzZSAxOiBkYXRhLT5mYW5fZGl2W25yXSA9IDA7IGJyZWFrOworCWNhc2UgMjogZGF0YS0+ZmFuX2Rpdltucl0gPSAxOyBicmVhazsKKwljYXNlIDQ6IGRhdGEtPmZhbl9kaXZbbnJdID0gMjsgYnJlYWs7CisJY2FzZSA4OiBkYXRhLT5mYW5fZGl2W25yXSA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRtcCA9IHNtc2M0N20xX3JlYWRfdmFsdWUoY2xpZW50LCBTTVNDNDdNMV9SRUdfRkFORElWKSAmIDB4MEY7CisJdG1wIHw9IChkYXRhLT5mYW5fZGl2WzBdIDw8IDQpIHwgKGRhdGEtPmZhbl9kaXZbMV0gPDwgNik7CisJc21zYzQ3bTFfd3JpdGVfdmFsdWUoY2xpZW50LCBTTVNDNDdNMV9SRUdfRkFORElWLCB0bXApOworCisJLyogUHJlc2VydmUgZmFuIG1pbiAqLworCXRtcCA9IDE5MiAtIChvbGRfZGl2ICogKDE5MiAtIGRhdGEtPmZhbl9wcmVsb2FkW25yXSkKKwkJICAgICArIG5ld19kaXYgLyAyKSAvIG5ld19kaXY7CisJZGF0YS0+ZmFuX3ByZWxvYWRbbnJdID0gU0VOU09SU19MSU1JVCh0bXAsIDAsIDE5MSk7CisJc21zYzQ3bTFfd3JpdGVfdmFsdWUoY2xpZW50LCBTTVNDNDdNMV9SRUdfRkFOX1BSRUxPQUQobnIpLAorCQkJICAgICBkYXRhLT5mYW5fcHJlbG9hZFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNtc2M0N20xX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWlmICh2YWwgPCAwIHx8IHZhbCA+IDI1NSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtW25yXSAmPSAweDgxOyAvKiBQcmVzZXJ2ZSBhZGRpdGlvbmFsIGJpdHMgKi8KKwlkYXRhLT5wd21bbnJdIHw9IFBXTV9UT19SRUcodmFsKTsKKwlzbXNjNDdtMV93cml0ZV92YWx1ZShjbGllbnQsIFNNU0M0N00xX1JFR19QV00obnIpLAorCQkJICAgICBkYXRhLT5wd21bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2VuKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzbXNjNDdtMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJCisJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd21bbnJdICY9IDB4RkU7IC8qIHByZXNlcnZlIHRoZSBvdGhlciBiaXRzICovCisJZGF0YS0+cHdtW25yXSB8PSAhdmFsOworCXNtc2M0N20xX3dyaXRlX3ZhbHVlKGNsaWVudCwgU01TQzQ3TTFfUkVHX1BXTShuciksCisJCQkgICAgIGRhdGEtPnB3bVtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgZmFuX3ByZXNlbnQob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBnZXRfZmFuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIGdldF9mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2ZhbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW4jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIGdldF9mYW5fZGl2KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2ZhbiMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGdldF9wd20jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBnZXRfcHdtKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9wd20oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QgZ2V0X3B3bSMjb2Zmc2V0IyNfZW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBnZXRfcHdtX2VuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3B3bSMjb2Zmc2V0IyNfZW4gKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9wd21fZW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4jI29mZnNldCwJXAorCQlOVUxMKTsJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKKwkJZ2V0X2ZhbiMjb2Zmc2V0IyNfbWluLCBzZXRfZmFuIyNvZmZzZXQjI19taW4pOwkJXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKKwkJZ2V0X2ZhbiMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuIyNvZmZzZXQjI19kaXYpOwkJXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwJCQlcCisJCWdldF9wd20jI29mZnNldCwgc2V0X3B3bSMjb2Zmc2V0KTsJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIocHdtIyNvZmZzZXQjI19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQlnZXRfcHdtIyNvZmZzZXQjI19lbiwgc2V0X3B3bSMjb2Zmc2V0IyNfZW4pOworCitmYW5fcHJlc2VudCgxKTsKK2Zhbl9wcmVzZW50KDIpOworCitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBnZXRfYWxhcm1zLCBOVUxMKTsKKworc3RhdGljIGludCBzbXNjNDdtMV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBzbXNjNDdtMV9kZXRlY3QpOworfQorCitzdGF0aWMgaW50IHNtc2M0N20xX2ZpbmQoaW50ICphZGRyZXNzKQoreworCXU4IHZhbDsKKworCXN1cGVyaW9fZW50ZXIoKTsKKwl2YWwgPSBzdXBlcmlvX2luYihTVVBFUklPX1JFR19ERVZJRCk7CisKKwkvKgorCSAqIFNNU0MgTFBDNDdNMTB4L0xQQzQ3TTEzeCAoZGV2aWNlIGlkIDB4NTkpLCBMUEM0N00xNHggKGRldmljZSBpZAorCSAqIDB4NUYpIGFuZCBMUEM0N0IyN3ggKGRldmljZSBpZCAweDUxKSBoYXZlIGZhbiBjb250cm9sLgorCSAqIFRoZSBMUEM0N00xNXggYW5kIExQQzQ3TTE5MiBjaGlwcyAid2l0aCBoYXJkd2FyZSBtb25pdG9yaW5nIGJsb2NrIgorCSAqIGNhbiBkbyBtdWNoIG1vcmUgYmVzaWRlcyAoZGV2aWNlIGlkIDB4NjAsIHVuc3VwcG9ydGVkKS4KKwkgKi8KKwlpZiAodmFsID09IDB4NTEpCisJCXByaW50ayhLRVJOX0lORk8gInNtc2M0N20xOiBGb3VuZCBTTVNDNDdCMjd4XG4iKTsKKwllbHNlIGlmICh2YWwgPT0gMHg1OSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAic21zYzQ3bTE6IEZvdW5kIFNNU0M0N00xMHgvU01TQzQ3TTEzeFxuIik7CisJZWxzZSBpZiAodmFsID09IDB4NUYpCisJCXByaW50ayhLRVJOX0lORk8gInNtc2M0N20xOiBGb3VuZCBTTVNDNDdNMTR4XG4iKTsKKwllbHNlIHsKKwkJc3VwZXJpb19leGl0KCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXN1cGVyaW9fc2VsZWN0KCk7CisJKmFkZHJlc3MgPSAoc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQkFTRSkgPDwgOCkKKwkJIHwgIHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0JBU0UgKyAxKTsKKwl2YWwgPSBzdXBlcmlvX2luYihTVVBFUklPX1JFR19BQ1QpOworCWlmICgqYWRkcmVzcyA9PSAwIHx8ICh2YWwgJiAweDAxKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNtc2M0N20xOiBEZXZpY2UgaXMgZGlzYWJsZWQsIHdpbGwgbm90IHVzZVxuIik7CisJCXN1cGVyaW9fZXhpdCgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzdXBlcmlvX2V4aXQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbXNjNDdtMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IHNtc2M0N20xX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJaW50IGZhbjEsIGZhbjIsIHB3bTEsIHB3bTI7CisKKwlpZiAoIWkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFNNU0NfRVhURU5ULCBzbXNjNDdtMV9kcml2ZXIubmFtZSkpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiUmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLCBhZGRyZXNzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNtc2M0N20xX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZWxlYXNlOworCX0KKwltZW1zZXQoZGF0YSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzbXNjNDdtMV9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJaW5pdF9NVVRFWCgmZGF0YS0+bG9jayk7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnNtc2M0N20xX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJzbXNjNDdtMSIsIEkyQ19OQU1FX1NJWkUpOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIElmIG5vIGZ1bmN0aW9uIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4KKwkgICBhY3R1YWxseSByZWdpc3RlcmluZyB0aGUgY2hpcC4gKi8KKwlmYW4xID0gKHNtc2M0N20xX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgU01TQzQ3TTFfUkVHX1RQSU4oMCkpICYgMHgwNSkKKwkgICAgICAgPT0gMHgwNTsKKwlmYW4yID0gKHNtc2M0N20xX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgU01TQzQ3TTFfUkVHX1RQSU4oMSkpICYgMHgwNSkKKwkgICAgICAgPT0gMHgwNTsKKwlwd20xID0gKHNtc2M0N20xX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgU01TQzQ3TTFfUkVHX1BQSU4oMCkpICYgMHgwNSkKKwkgICAgICAgPT0gMHgwNDsKKwlwd20yID0gKHNtc2M0N20xX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgU01TQzQ3TTFfUkVHX1BQSU4oMSkpICYgMHgwNSkKKwkgICAgICAgPT0gMHgwNDsKKwlpZiAoIShmYW4xIHx8IGZhbjIgfHwgcHdtMSB8fCBwd20yKSkgeworCQlkZXZfd2FybigmbmV3X2NsaWVudC0+ZGV2LCAiRGV2aWNlIGlzIG5vdCBjb25maWd1cmVkLCB3aWxsIG5vdCB1c2VcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycm9yX2ZyZWU7CisJfQorCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJCWdvdG8gZXJyb3JfZnJlZTsKKworCS8qIFNvbWUgdmFsdWVzIChmYW4gbWluLCBjbG9jayBkaXZpZGVycywgcHdtIHJlZ2lzdGVycykgbWF5IGJlCisJICAgbmVlZGVkIGJlZm9yZSBhbnkgdXBkYXRlIGlzIHRyaWdnZXJlZCwgc28gd2UgYmV0dGVyIHJlYWQgdGhlbQorCSAgIGF0IGxlYXN0IG9uY2UgaGVyZS4gV2UgZG9uJ3QgdXN1YWxseSBkbyBpdCB0aGF0IHdheSwgYnV0IGluCisJICAgdGhpcyBwYXJ0aWN1bGFyIGNhc2UsIG1hbnVhbGx5IHJlYWRpbmcgNSByZWdpc3RlcnMgb3V0IG9mIDgKKwkgICBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSBhbmQgd2UncmUgYmV0dGVyIHVzaW5nIHRoZSBleGlzdGluZworCSAgIGZ1bmN0aW9uLiAqLworCXNtc2M0N20xX3VwZGF0ZV9kZXZpY2UoJm5ld19jbGllbnQtPmRldiwgMSk7CisKKwlpZiAoZmFuMSkgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2Rpdik7CisJfSBlbHNlCisJCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIkZhbiAxIG5vdCBlbmFibGVkIGJ5IGhhcmR3YXJlLCAiCisJCQkic2tpcHBpbmdcbiIpOworCisJaWYgKGZhbjIpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9kaXYpOworCX0gZWxzZQorCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJGYW4gMiBub3QgZW5hYmxlZCBieSBoYXJkd2FyZSwgIgorCQkJInNraXBwaW5nXG4iKTsKKworCWlmIChwd20xKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMSk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMV9lbmFibGUpOworCX0gZWxzZQorCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJQV00gMSBub3QgZW5hYmxlZCBieSBoYXJkd2FyZSwgIgorCQkJInNraXBwaW5nXG4iKTsKKwlpZiAocHdtMikgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bTJfZW5hYmxlKTsKKwl9IGVsc2UKKwkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiUFdNIDIgbm90IGVuYWJsZWQgYnkgaGFyZHdhcmUsICIKKwkJCSJza2lwcGluZ1xuIik7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZToKKwlrZnJlZShuZXdfY2xpZW50KTsKK2Vycm9yX3JlbGVhc2U6CisJcmVsZWFzZV9yZWdpb24oYWRkcmVzcywgU01TQ19FWFRFTlQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc21zYzQ3bTFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgorCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIFNNU0NfRVhURU5UKTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbXNjNDdtMV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgcmVzOworCisJZG93bigmKChzdHJ1Y3Qgc21zYzQ3bTFfZGF0YSAqKSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSktPmxvY2spOworCXJlcyA9IGluYl9wKGNsaWVudC0+YWRkciArIHJlZyk7CisJdXAoJigoc3RydWN0IHNtc2M0N20xX2RhdGEgKikgaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBzbXNjNDdtMV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKQoreworCWRvd24oJigoc3RydWN0IHNtc2M0N20xX2RhdGEgKikgaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpLT5sb2NrKTsKKwlvdXRiX3AodmFsdWUsIGNsaWVudC0+YWRkciArIHJlZyk7CisJdXAoJigoc3RydWN0IHNtc2M0N20xX2RhdGEgKikgaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpLT5sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBzbXNjNDdtMV9kYXRhICpzbXNjNDdtMV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJaW50IGluaXQpCit7CisgCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNtc2M0N20xX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKSB8fCBpbml0KSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCWRhdGEtPmZhbltpXSA9IHNtc2M0N20xX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCSAgICAgICBTTVNDNDdNMV9SRUdfRkFOKGkpKTsKKwkJCWRhdGEtPmZhbl9wcmVsb2FkW2ldID0gc21zYzQ3bTFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBTTVNDNDdNMV9SRUdfRkFOX1BSRUxPQUQoaSkpOworCQkJZGF0YS0+cHdtW2ldID0gc21zYzQ3bTFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJICAgICAgIFNNU0M0N00xX1JFR19QV00oaSkpOworCQl9CisKKwkJaSA9IHNtc2M0N20xX3JlYWRfdmFsdWUoY2xpZW50LCBTTVNDNDdNMV9SRUdfRkFORElWKTsKKwkJZGF0YS0+ZmFuX2RpdlswXSA9IChpID4+IDQpICYgMHgwMzsKKwkJZGF0YS0+ZmFuX2RpdlsxXSA9IGkgPj4gNjsKKworCQlkYXRhLT5hbGFybXMgPSBzbXNjNDdtMV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCSAgICAgICBTTVNDNDdNMV9SRUdfQUxBUk0pID4+IDY7CisJCS8qIENsZWFyIGFsYXJtcyBpZiBuZWVkZWQgKi8KKwkJaWYgKGRhdGEtPmFsYXJtcykKKwkJCXNtc2M0N20xX3dyaXRlX3ZhbHVlKGNsaWVudCwgU01TQzQ3TTFfUkVHX0FMQVJNLCAweEMwKTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtX3Ntc2M0N20xX2luaXQodm9pZCkKK3sKKwlpZiAoc21zYzQ3bTFfZmluZChub3JtYWxfaXNhKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnNtc2M0N20xX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbV9zbXNjNDdtMV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnNtc2M0N20xX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIk1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU01TQyBMUEM0N00xeHggZmFuIHNlbnNvcnMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNtX3Ntc2M0N20xX2luaXQpOworbW9kdWxlX2V4aXQoc21fc21zYzQ3bTFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy92aWE2ODZhLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy92aWE2ODZhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5NDhmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3ZpYTY4NmEuYwpAQCAtMCwwICsxLDg3OSBAQAorLyoKKyAgICB2aWE2ODZhLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzCisgICAgICAgICAgICAgICAgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKKyAgICAgICAgICAgICAgICAKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTggLSAyMDAyICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LAorICAgICAgICAgICAgICAgICAgICAgICAgS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LAorCQkJTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiwKKwkJCWFuZCBCb2IgRG91Z2hlcnR5IDxib2JkQHN0YW5mb3JkLmVkdT4KKyAgICAoU29tZSBjb252ZXJzaW9uLWZhY3RvciBkYXRhIHdlcmUgY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gVGVoIFNvb24gWWV3IAorICAgIDxqLnRlaEBpbmFtZS5jb20+IGFuZCBBbGV4IHZhbiBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+LikKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgICBTdXBwb3J0cyB0aGUgVmlhIFZUODJDNjg2QSwgVlQ4MkM2ODZCIHNvdXRoIGJyaWRnZXMuCisgICAgUmVwb3J0cyBhbGwgYXMgYSA2ODZBLgorICAgIFdhcm5pbmcgLSBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGRldmljZS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCisvKiBJZiBmb3JjZV9hZGRyIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUKKyAgIHRoZSBkZXZpY2UgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfYWRkciA9IDA7Cittb2R1bGVfcGFyYW0oZm9yY2VfYWRkciwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYWRkciwKKwkJICJJbml0aWFsaXplIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHNlbnNvcnMiKTsKKworLyogQWRkcmVzc2VzIHRvIHNjYW4uCisgICBOb3RlIHRoYXQgd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZSBJU0EgYWRkcmVzcyB1bnRpbCB3ZSBoYXZlIGluaXRpYWxpemVkCisgICBvdXIgbW9kdWxlICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDB4MDAwMCwgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF8xKHZpYTY4NmEpOworCisvKgorICAgVGhlIFZpYSA2ODZhIHNvdXRoYnJpZGdlIGhhcyBhIExNNzgtbGlrZSBjaGlwIGludGVncmF0ZWQgb24gdGhlIHNhbWUgSUMuCisgICBUaGlzIGRyaXZlciBpcyBhIGN1c3RvbWl6ZWQgY29weSBvZiBsbTc4LmMKKyovCisKKy8qIE1hbnkgVklBNjg2QSBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCisKKy8qIExlbmd0aCBvZiBJU0EgYWRkcmVzcyBzZWdtZW50ICovCisjZGVmaW5lIFZJQTY4NkFfRVhURU5UIDB4ODAKKyNkZWZpbmUgVklBNjg2QV9CQVNFX1JFRyAweDcwCisjZGVmaW5lIFZJQTY4NkFfRU5BQkxFX1JFRyAweDc0CisKKy8qIFRoZSBWSUE2ODZBIHJlZ2lzdGVycyAqLworLyogaW5zIG51bWJlcmVkIDAtNCAqLworI2RlZmluZSBWSUE2ODZBX1JFR19JTl9NQVgobnIpICgweDJiICsgKChucikgKiAyKSkKKyNkZWZpbmUgVklBNjg2QV9SRUdfSU5fTUlOKG5yKSAoMHgyYyArICgobnIpICogMikpCisjZGVmaW5lIFZJQTY4NkFfUkVHX0lOKG5yKSAgICAgKDB4MjIgKyAobnIpKQorCisvKiBmYW5zIG51bWJlcmVkIDEtMiAqLworI2RlZmluZSBWSUE2ODZBX1JFR19GQU5fTUlOKG5yKSAoMHgzYSArIChucikpCisjZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTihucikgICAgICgweDI4ICsgKG5yKSkKKworLyogdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGFzIHNwZWNlZCBieSBWSUE6ICovCitzdGF0aWMgY29uc3QgdTggcmVndGVtcFtdID0geyAweDIwLCAweDIxLCAweDFmIH07CitzdGF0aWMgY29uc3QgdTggcmVnb3ZlcltdID0geyAweDM5LCAweDNkLCAweDFkIH07CitzdGF0aWMgY29uc3QgdTggcmVnaHlzdFtdID0geyAweDNhLCAweDNlLCAweDFlIH07CisKKy8qIHRlbXBzIG51bWJlcmVkIDEtMyAqLworI2RlZmluZSBWSUE2ODZBX1JFR19URU1QKG5yKQkJKHJlZ3RlbXBbbnJdKQorI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX09WRVIobnIpCShyZWdvdmVyW25yXSkKKyNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9IWVNUKG5yKQkocmVnaHlzdFtucl0pCisjZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVBfTE9XMQkweDRiCS8vIGJpdHMgNy02CisjZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMJMHg0OQkvLyAyID0gYml0cyA1LTQsIDMgPSBiaXRzIDctNgorCisjZGVmaW5lIFZJQTY4NkFfUkVHX0FMQVJNMSAweDQxCisjZGVmaW5lIFZJQTY4NkFfUkVHX0FMQVJNMiAweDQyCisjZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTkRJViAweDQ3CisjZGVmaW5lIFZJQTY4NkFfUkVHX0NPTkZJRyAweDQwCisvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVyIHNldHMgdGVtcCBpbnRlcnJ1cHQgbW9kZSAoYml0cyAxLTAgZm9yIHRlbXAxLCAKKyAzLTIgZm9yIHRlbXAyLCA1LTQgZm9yIHRlbXAzKS4gIE1vZGVzIGFyZToKKyAgICAwMCBpbnRlcnJ1cHQgc3RheXMgYXMgbG9uZyBhcyB2YWx1ZSBpcyBvdXQtb2YtcmFuZ2UKKyAgICAwMSBpbnRlcnJ1cHQgaXMgY2xlYXJlZCBvbmNlIHJlZ2lzdGVyIGlzIHJlYWQgKGRlZmF1bHQpCisgICAgMTAgY29tcGFyYXRvciBtb2RlLSBsaWtlIDAwLCBidXQgaWdub3JlcyBoeXN0ZXJlc2lzCisgICAgMTEgc2FtZSBhcyAwMCAqLworI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX01PREUgMHg0YgorLyogV2UnbGwganVzdCBhc3N1bWUgdGhhdCB5b3Ugd2FudCB0byBzZXQgYWxsIDMgc2ltdWx0YW5lb3VzbHk6ICovCisjZGVmaW5lIFZJQTY4NkFfVEVNUF9NT0RFX01BU0sgMHgzRgorI2RlZmluZSBWSUE2ODZBX1RFTVBfTU9ERV9DT05USU5VT1VTICgweDAwKQorCisvKiBDb252ZXJzaW9ucy4gTGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcKKyAgIHZhcmlhbnRzLiAKKworKioqKioqKioqIFZPTFRBR0UgQ09OVkVSU0lPTlMgKEJvYiBEb3VnaGVydHkpICoqKioqKioqCisgRnJvbSBIV01vbi5jcHAgKENvcHlyaWdodCAxOTk4LTIwMDAgSm9uYXRoYW4gVGVoIFNvb24gWWV3KToKKyB2b2x0YWdlZmFjdG9yWzBdPTEuMjUvMjYyODsgKDI2MjgvMS4yNT0yMTAyLjQpICAgLy8gVmNjcAorIHZvbHRhZ2VmYWN0b3JbMV09MS4yNS8yNjI4OyAoMjYyOC8xLjI1PTIxMDIuNCkgICAvLyArMi41VgorIHZvbHRhZ2VmYWN0b3JbMl09MS42Ny8yNjI4OyAoMjYyOC8xLjY3PTE1NzMuNykgICAvLyArMy4zVgorIHZvbHRhZ2VmYWN0b3JbM109Mi42LzI2Mjg7ICAoMjYyOC8yLjYwPTEwMTAuOCkgICAvLyArNVYKKyB2b2x0YWdlZmFjdG9yWzRdPTYuMy8yNjI4OyAgKDI2MjgvNi4zMD00MTcuMTQpICAgLy8gKzEyVgorIGluW2ldPShkYXRhW2krMl0qMjUuMCsxMzMpKnZvbHRhZ2VmYWN0b3JbaV07CisgVGhhdCBpczoKKyB2b2x0cyA9ICgyNSpyZWdWYWwrMTMzKSpmYWN0b3IKKyByZWdWYWwgPSAodm9sdHMvZmFjdG9yLTEzMykvMjUKKyAoVGhlc2UgY29udmVyc2lvbnMgd2VyZSBjb250cmlidXRlZCBieSBKb25hdGhhbiBUZWggU29vbiBZZXcgCisgPGoudGVoQGluYW1lLmNvbT4pICovCitzdGF0aWMgaW5saW5lIHU4IElOX1RPX1JFRyhsb25nIHZhbCwgaW50IGluTnVtKQoreworCS8qIFRvIGF2b2lkIGZsb2F0aW5nIHBvaW50LCB3ZSBtdWx0aXBseSBjb25zdGFudHMgYnkgMTAgKDEwMCBmb3IgKzEyVikuCisJICAgUm91bmRpbmcgaXMgZG9uZSAoMTIwNTAwIGlzIGFjdHVhbGx5IDEzMzAwMCAtIDEyNTAwKS4KKwkgICBSZW1lbWJlciB0aGF0IHZhbCBpcyBleHByZXNzZWQgaW4gMC4wMDFWL2JpdCwgd2hpY2ggaXMgd2h5IHdlIGRpdmlkZQorCSAgIGJ5IGFuIGFkZGl0aW9uYWwgMTAwMDAgKDEwMDAwMCBmb3IgKzEyVik6IDEwMDAgZm9yIHZhbCBhbmQgMTAgKDEwMCkKKwkgICBmb3IgdGhlIGNvbnN0YW50cy4gKi8KKwlpZiAoaW5OdW0gPD0gMSkKKwkJcmV0dXJuICh1OCkKKwkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDIxMDI0IC0gMTIwNTAwMCkgLyAyNTAwMDAsIDAsIDI1NSk7CisJZWxzZSBpZiAoaW5OdW0gPT0gMikKKwkJcmV0dXJuICh1OCkKKwkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDE1NzM3IC0gMTIwNTAwMCkgLyAyNTAwMDAsIDAsIDI1NSk7CisJZWxzZSBpZiAoaW5OdW0gPT0gMykKKwkJcmV0dXJuICh1OCkKKwkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDEwMTA4IC0gMTIwNTAwMCkgLyAyNTAwMDAsIDAsIDI1NSk7CisJZWxzZQorCQlyZXR1cm4gKHU4KQorCQkgICAgU0VOU09SU19MSU1JVCgodmFsICogNDE3MTQgLSAxMjA1MDAwMCkgLyAyNTAwMDAwLCAwLCAyNTUpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgSU5fRlJPTV9SRUcodTggdmFsLCBpbnQgaW5OdW0pCit7CisJLyogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQsIHdlIG11bHRpcGx5IGNvbnN0YW50cyBieSAxMCAoMTAwIGZvciArMTJWKS4KKwkgICBXZSBhbHNvIG11bHRpcGx5IHRoZW0gYnkgMTAwMCBiZWNhdXNlIHdlIHdhbnQgMC4wMDFWL2JpdCBmb3IgdGhlCisJICAgb3V0cHV0IHZhbHVlLiBSb3VuZGluZyBpcyBkb25lLiAqLworCWlmIChpbk51bSA8PSAxKQorCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDIxMDI0IC8gMikgLyAyMTAyNCk7CisJZWxzZSBpZiAoaW5OdW0gPT0gMikKKwkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAxNTczNyAvIDIpIC8gMTU3MzcpOworCWVsc2UgaWYgKGluTnVtID09IDMpCisJCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMTAxMDggLyAyKSAvIDEwMTA4KTsKKwllbHNlCisJCXJldHVybiAobG9uZykgKCgyNTAwMDAwICogdmFsICsgMTMzMDAwMDAgKyA0MTcxNCAvIDIpIC8gNDE3MTQpOworfQorCisvKioqKioqKioqIEZBTiBSUE0gQ09OVkVSU0lPTlMgKioqKioqKiovCisvKiBIaWdoZXIgcmVnaXN0ZXIgdmFsdWVzID0gc2xvd2VyIGZhbnMgKHRoZSBmYW4ncyBzdHJvYmUgZ2F0ZXMgYSBjb3VudGVyKS4KKyBCdXQgdGhpcyBjaGlwIHNhdHVyYXRlcyBiYWNrIGF0IDAsIG5vdCBhdCAyNTUgbGlrZSBhbGwgdGhlIG90aGVyIGNoaXBzLgorIFNvLCAwIG1lYW5zIDAgUlBNICovCitzdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCit7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gMDsKKwlycG0gPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTAwMDAwMCk7CisJcmV0dXJuIFNFTlNPUlNfTElNSVQoKDEzNTAwMDAgKyBycG0gKiBkaXYgLyAyKSAvIChycG0gKiBkaXYpLCAxLCAyNTUpOworfQorCisjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsZGl2KSAoKHZhbCk9PTA/MDoodmFsKT09MjU1PzA6MTM1MDAwMC8oKHZhbCkqKGRpdikpKQorCisvKioqKioqKiogVEVNUCBDT05WRVJTSU9OUyAoQm9iIERvdWdoZXJ0eSkgKioqKioqKioqLworLyogbGluZWFyIGZpdHMgZnJvbSBIV01vbi5jcHAgKENvcHlyaWdodCAxOTk4LTIwMDAgSm9uYXRoYW4gVGVoIFNvb24gWWV3KQorICAgICAgaWYodGVtcDwxNjkpCisgICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC40MjctMzIuMDg7CisgICAgICBlbHNlIGlmKHRlbXA+PTE2OSAmJiB0ZW1wPD0yMDIpCisgICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC41ODItNTguMTY7CisgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC45MjQtMTI3LjMzOworCisgQSBmaWZ0aC1vcmRlciBwb2x5bm9taWFsIGZpdHMgdGhlIHVub2ZmaWNpYWwgZGF0YSAocHJvdmlkZWQgYnkgQWxleCB2YW4gCisgS2FhbSA8ZGFya3NpZGVAY2hlbGxvLm5sPikgYSBiaXQgYmV0dGVyLiAgSXQgYWxzbyBnaXZlIG1vcmUgcmVhc29uYWJsZSAKKyBudW1iZXJzIG9uIG15IG1hY2hpbmUgKGllLiB0aGV5IGFncmVlIHdpdGggd2hhdCBteSBCSU9TIHRlbGxzIG1lKS4gIAorIEhlcmUncyB0aGUgZmlmdGgtb3JkZXIgZml0IHRvIHRoZSA4LWJpdCBkYXRhOgorIHRlbXAgPSAxLjYyNTA5M2UtMTAqdmFsXjUgLSAxLjAwMTYzMmUtMDcqdmFsXjQgKyAyLjQ1NzY1M2UtMDUqdmFsXjMgLSAKKyAgICAgICAgMi45Njc2MTllLTAzKnZhbF4yICsgMi4xNzUxNDRlLTAxKnZhbCAtIDcuMDkwMDY3ZSswLgorCisgKDIwMDAtMTAtMjUtIFJGRDogdGhhbmtzIHRvIFV3ZSBBbmRlcnNlbiA8dWFuZGVyc2VuQG1heWFoLmNvbT4gZm9yIAorIGZpbmRpbmcgbXkgdHlwb3MgaW4gdGhpcyBmb3JtdWxhISkKKworIEFsYXMsIG5vbmUgb2YgdGhlIGVsZWdhbnQgZnVuY3Rpb24tZml0IHNvbHV0aW9ucyB3aWxsIHdvcmsgYmVjYXVzZSB3ZSAKKyBhcmVuJ3QgYWxsb3dlZCB0byB1c2UgZmxvYXRpbmcgcG9pbnQgaW4gdGhlIGtlcm5lbCBhbmQgZG9pbmcgaXQgd2l0aCAKKyBpbnRlZ2VycyBkb2Vzbid0IHJwb3ZpZGUgZW5vdWdoIHByZWNpc2lvbi4gIFNvIHdlJ2xsIGRvIGJvcmluZyBvbGQgCisgbG9vay11cCB0YWJsZSBzdHVmZi4gIFRoZSB1bm9mZmljaWFsIGRhdGEgKHNlZSBiZWxvdykgaGF2ZSBlZmZlY3RpdmVseSAKKyA3LWJpdCByZXNvbHV0aW9uICh0aGV5IGFyZSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGRlZ3JlZSkuICBJJ20gYXNzdW1pbmcgCisgdGhhdCB0aGUgdHJhbnNmZXIgZnVuY3Rpb24gb2YgdGhlIGRldmljZSBpcyBtb25vdG9uaWMgYW5kIHNtb290aCwgc28gYSAKKyBzbW9vdGggZnVuY3Rpb24gZml0IHRvIHRoZSBkYXRhIHdpbGwgYWxsb3cgdXMgdG8gZ2V0IGJldHRlciBwcmVjaXNpb24uICAKKyBJIHVzZWQgdGhlIDV0aC1vcmRlciBwb2x5IGZpdCBkZXNjcmliZWQgYWJvdmUgYW5kIHNvbHZlZCBmb3IKKyBWSUEgcmVnaXN0ZXIgdmFsdWVzIDAtMjU1LiAgSSAqMTAgYmVmb3JlIHJvdW5kaW5nLCBzbyB3ZSBnZXQgdGVudGgtZGVncmVlIAorIHByZWNpc2lvbi4gIChJIGNvdWxkIGhhdmUgZG9uZSBhbGwgMTAyNCB2YWx1ZXMgZm9yIG91ciAxMC1iaXQgcmVhZGluZ3MsIAorIGJ1dCB0aGUgZnVuY3Rpb24gaXMgdmVyeSBsaW5lYXIgaW4gdGhlIHVzZWZ1bCByYW5nZSAoMC04MCBkZWcgQyksIHNvIAorIHdlJ2xsIGp1c3QgdXNlIGxpbmVhciBpbnRlcnBvbGF0aW9uIGZvciAxMC1iaXQgcmVhZGluZ3MuKSAgU28sIHRlbXBMVVQgCisgaXMgdGhlIHRlbXAgYXQgdmlhIHJlZ2lzdGVyIHZhbHVlcyAwLTI1NTogKi8KK3N0YXRpYyBjb25zdCBsb25nIHRlbXBMVVRbXSA9CisgICAgeyAtNzA5LCAtNjg4LCAtNjY3LCAtNjQ2LCAtNjI3LCAtNjA3LCAtNTg5LCAtNTcwLCAtNTUzLCAtNTM2LCAtNTE5LAorCSAgICAtNTAzLCAtNDg3LCAtNDcxLCAtNDU2LCAtNDQyLCAtNDI4LCAtNDE0LCAtNDAwLCAtMzg3LCAtMzc1LAorCSAgICAtMzYyLCAtMzUwLCAtMzM5LCAtMzI3LCAtMzE2LCAtMzA1LCAtMjk1LCAtMjg1LCAtMjc1LCAtMjY1LAorCSAgICAtMjU1LCAtMjQ2LCAtMjM3LCAtMjI5LCAtMjIwLCAtMjEyLCAtMjA0LCAtMTk2LCAtMTg4LCAtMTgwLAorCSAgICAtMTczLCAtMTY2LCAtMTU5LCAtMTUyLCAtMTQ1LCAtMTM5LCAtMTMyLCAtMTI2LCAtMTIwLCAtMTE0LAorCSAgICAtMTA4LCAtMTAyLCAtOTYsIC05MSwgLTg1LCAtODAsIC03NCwgLTY5LCAtNjQsIC01OSwgLTU0LCAtNDksCisJICAgIC00NCwgLTM5LCAtMzQsIC0yOSwgLTI1LCAtMjAsIC0xNSwgLTExLCAtNiwgLTIsIDMsIDcsIDEyLCAxNiwKKwkgICAgMjAsIDI1LCAyOSwgMzMsIDM3LCA0MiwgNDYsIDUwLCA1NCwgNTksIDYzLCA2NywgNzEsIDc1LCA3OSwgODQsCisJICAgIDg4LCA5MiwgOTYsIDEwMCwgMTA0LCAxMDksIDExMywgMTE3LCAxMjEsIDEyNSwgMTMwLCAxMzQsIDEzOCwKKwkgICAgMTQyLCAxNDYsIDE1MSwgMTU1LCAxNTksIDE2MywgMTY4LCAxNzIsIDE3NiwgMTgxLCAxODUsIDE4OSwKKwkgICAgMTkzLCAxOTgsIDIwMiwgMjA2LCAyMTEsIDIxNSwgMjE5LCAyMjQsIDIyOCwgMjMyLCAyMzcsIDI0MSwKKwkgICAgMjQ1LCAyNTAsIDI1NCwgMjU5LCAyNjMsIDI2NywgMjcyLCAyNzYsIDI4MSwgMjg1LCAyOTAsIDI5NCwKKwkgICAgMjk5LCAzMDMsIDMwNywgMzEyLCAzMTYsIDMyMSwgMzI1LCAzMzAsIDMzNCwgMzM5LCAzNDQsIDM0OCwKKwkgICAgMzUzLCAzNTcsIDM2MiwgMzY2LCAzNzEsIDM3NiwgMzgwLCAzODUsIDM5MCwgMzk1LCAzOTksIDQwNCwKKwkgICAgNDA5LCA0MTQsIDQxOSwgNDIzLCA0MjgsIDQzMywgNDM4LCA0NDMsIDQ0OSwgNDU0LCA0NTksIDQ2NCwKKwkgICAgNDY5LCA0NzUsIDQ4MCwgNDg2LCA0OTEsIDQ5NywgNTAyLCA1MDgsIDUxNCwgNTIwLCA1MjYsIDUzMiwKKwkgICAgNTM4LCA1NDQsIDU1MSwgNTU3LCA1NjQsIDU3MSwgNTc4LCA1ODQsIDU5MiwgNTk5LCA2MDYsIDYxNCwKKwkgICAgNjIxLCA2MjksIDYzNywgNjQ1LCA2NTQsIDY2MiwgNjcxLCA2ODAsIDY4OSwgNjk4LCA3MDgsIDcxOCwKKwkgICAgNzI4LCA3MzgsIDc0OSwgNzU5LCA3NzAsIDc4MiwgNzkzLCA4MDUsIDgxOCwgODMwLCA4NDMsIDg1NiwKKwkgICAgODcwLCA4ODMsIDg5OCwgOTEyLCA5MjcsIDk0MywgOTU4LCA5NzUsIDk5MSwgMTAwOCwgMTAyNiwgMTA0NCwKKwkgICAgMTA2MiwgMTA4MSwgMTEwMSwgMTEyMSwgMTE0MSwgMTE2MiwgMTE4NCwgMTIwNiwgMTIyOSwgMTI1MiwKKwkgICAgMTI3NiwgMTMwMSwgMTMyNiwgMTM1MiwgMTM3OCwgMTQwNiwgMTQzNCwgMTQ2MgorfTsKKworLyogdGhlIG9yaWdpbmFsIExVVCB2YWx1ZXMgZnJvbSBBbGV4IHZhbiBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+IAorICAgKGZvciB2aWEgcmVnaXN0ZXIgdmFsdWVzIDEyLTI0MCk6Cit7LTUwLC00OSwtNDcsLTQ1LC00MywtNDEsLTM5LC0zOCwtMzcsLTM1LC0zNCwtMzMsLTMyLC0zMSwKKy0zMCwtMjksLTI4LC0yNywtMjYsLTI1LC0yNCwtMjQsLTIzLC0yMiwtMjEsLTIwLC0yMCwtMTksLTE4LC0xNywtMTcsLTE2LC0xNSwKKy0xNSwtMTQsLTE0LC0xMywtMTIsLTEyLC0xMSwtMTEsLTEwLC05LC05LC04LC04LC03LC03LC02LC02LC01LC01LC00LC00LC0zLAorLTMsLTIsLTIsLTEsLTEsMCwwLDEsMSwxLDMsMywzLDQsNCw0LDUsNSw1LDYsNiw3LDcsOCw4LDksOSw5LDEwLDEwLDExLDExLDEyLAorMTIsMTIsMTMsMTMsMTMsMTQsMTQsMTUsMTUsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjEsMjIsMjIsCisyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNiwyNywyNywyNywyOCwyOCwyOSwyOSwzMCwzMCwzMCwzMSwzMSwzMiwzMiwzMywKKzMzLDM0LDM0LDM1LDM1LDM1LDM2LDM2LDM3LDM3LDM4LDM4LDM5LDM5LDQwLDQwLDQxLDQxLDQyLDQyLDQzLDQzLDQ0LDQ0LDQ1LAorNDUsNDYsNDYsNDcsNDgsNDgsNDksNDksNTAsNTEsNTEsNTIsNTIsNTMsNTMsNTQsNTUsNTUsNTYsNTcsNTcsNTgsNTksNTksNjAsCis2MSw2Miw2Miw2Myw2NCw2NSw2Niw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Myw4NCwKKzg1LDg2LDg4LDg5LDkxLDkyLDk0LDk2LDk3LDk5LDEwMSwxMDMsMTA1LDEwNywxMDksMTEwfTsKKworCisgSGVyZSdzIHRoZSByZXZlcnNlIExVVC4gIEkgZ290IGl0IGJ5IGRvaW5nIGEgNi10aCBvcmRlciBwb2x5IGZpdCAobmVlZGVkCisgYW4gZXh0cmEgdGVybSBmb3IgYSBnb29kIGZpdCB0byB0aGVzZSBpbnZlcnNlIGRhdGEhKSBhbmQgdGhlbiAKKyBzb2x2aW5nIGZvciBlYWNoIHRlbXAgdmFsdWUgZnJvbSAtNTAgdG8gMTEwICh0aGUgdXNlYWJsZSByYW5nZSBmb3IgCisgdGhpcyBjaGlwKS4gIEhlcmUncyB0aGUgZml0OiAKKyB2aWFSZWdWYWwgPSAtMS4xNjAzNzBlLTEwKnZhbF42ICszLjE5MzY5M2UtMDgqdmFsXjUgLSAxLjQ2NDQ0N2UtMDYqdmFsXjQgCisgLSAyLjUyNTQ1M2UtMDQqdmFsXjMgKyAxLjQyNDU5M2UtMDIqdmFsXjIgKyAyLjE0ODk0MWUrMDAqdmFsICs3LjI3NTgwOGUrMDEpCisgTm90ZSB0aGF0IG49MTYxOiAqLworc3RhdGljIGNvbnN0IHU4IHZpYUxVVFtdID0KKyAgICB7IDEyLCAxMiwgMTMsIDE0LCAxNCwgMTUsIDE2LCAxNiwgMTcsIDE4LCAxOCwgMTksIDIwLCAyMCwgMjEsIDIyLCAyMywKKwkgICAgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNSwgMzYsIDM3LCAzOSwgNDAsCisJICAgIDQxLCA0MywgNDUsIDQ2LCA0OCwgNDksIDUxLCA1MywgNTUsIDU3LCA1OSwgNjAsIDYyLCA2NCwgNjYsCisJICAgIDY5LCA3MSwgNzMsIDc1LCA3NywgNzksIDgyLCA4NCwgODYsIDg4LCA5MSwgOTMsIDk1LCA5OCwgMTAwLAorCSAgICAxMDMsIDEwNSwgMTA3LCAxMTAsIDExMiwgMTE1LCAxMTcsIDExOSwgMTIyLCAxMjQsIDEyNiwgMTI5LAorCSAgICAxMzEsIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQzLCAxNDUsIDE0NywgMTUwLCAxNTIsIDE1NCwgMTU2LAorCSAgICAxNTgsIDE2MCwgMTYyLCAxNjQsIDE2NiwgMTY4LCAxNzAsIDE3MiwgMTc0LCAxNzYsIDE3OCwgMTgwLAorCSAgICAxODIsIDE4MywgMTg1LCAxODcsIDE4OCwgMTkwLCAxOTIsIDE5MywgMTk1LCAxOTYsIDE5OCwgMTk5LAorCSAgICAyMDAsIDIwMiwgMjAzLCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLAorCSAgICAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjIsIDIyMywgMjI0LAorCSAgICAyMjUsIDIyNiwgMjI2LCAyMjcsIDIyOCwgMjI4LCAyMjksIDIzMCwgMjMwLCAyMzEsIDIzMiwgMjMyLAorCSAgICAyMzMsIDIzMywgMjM0LCAyMzUsIDIzNSwgMjM2LCAyMzYsIDIzNywgMjM3LCAyMzgsIDIzOCwgMjM5LAorCSAgICAyMzksIDI0MAorfTsKKworLyogQ29udmVydGluZyB0ZW1wcyB0byAoOC1iaXQpIGh5c3QgYW5kIG92ZXIgcmVnaXN0ZXJzCisgICBObyBpbnRlcnBvbGF0aW9uIGhlcmUuCisgICBUaGUgKzUwIGlzIGJlY2F1c2UgdGhlIHRlbXBzIHN0YXJ0IGF0IC01MCAqLworc3RhdGljIGlubGluZSB1OCBURU1QX1RPX1JFRyhsb25nIHZhbCkKK3sKKwlyZXR1cm4gdmlhTFVUW3ZhbCA8PSAtNTAwMDAgPyAwIDogdmFsID49IDExMDAwMCA/IDE2MCA6IAorCQkgICAgICAodmFsIDwgMCA/IHZhbCAtIDUwMCA6IHZhbCArIDUwMCkgLyAxMDAwICsgNTBdOworfQorCisvKiBmb3IgOC1iaXQgdGVtcGVyYXR1cmUgaHlzdCBhbmQgb3ZlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpICh0ZW1wTFVUWyh2YWwpXSAqIDEwMCkKKworLyogZm9yIDEwLWJpdCB0ZW1wZXJhdHVyZSByZWFkaW5ncyAqLworc3RhdGljIGlubGluZSBsb25nIFRFTVBfRlJPTV9SRUcxMCh1MTYgdmFsKQoreworCXUxNiBlaWdodEJpdHMgPSB2YWwgPj4gMjsKKwl1MTYgdHdvQml0cyA9IHZhbCAmIDM7CisKKwkvKiBubyBpbnRlcnBvbGF0aW9uIGZvciB0aGVzZSAqLworCWlmICh0d29CaXRzID09IDAgfHwgZWlnaHRCaXRzID09IDI1NSkKKwkJcmV0dXJuIFRFTVBfRlJPTV9SRUcoZWlnaHRCaXRzKTsKKworCS8qIGRvIHNvbWUgbGluZWFyIGludGVycG9sYXRpb24gKi8KKwlyZXR1cm4gKHRlbXBMVVRbZWlnaHRCaXRzXSAqICg0IC0gdHdvQml0cykgKworCSAgICAgICAgdGVtcExVVFtlaWdodEJpdHMgKyAxXSAqIHR3b0JpdHMpICogMjU7Cit9CisKKyNkZWZpbmUgQUxBUk1TX0ZST01fUkVHKHZhbCkgKHZhbCkKKworI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMSA8PCAodmFsKSkKKyNkZWZpbmUgRElWX1RPX1JFRyh2YWwpICgodmFsKT09OD8zOih2YWwpPT00PzI6KHZhbCk9PTE/MDoxKQorCisvKiBGb3IgdGhlIFZJQTY4NkEsIHdlIG5lZWQgdG8ga2VlcCBzb21lIGRhdGEgaW4gbWVtb3J5LgorICAgVGhlIHN0cnVjdHVyZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQsIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBhIG5ldworICAgdmlhNjg2YSBjbGllbnQgaXMgYWxsb2NhdGVkLiAqLworc3RydWN0IHZpYTY4NmFfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisKKwl1OCBpbls1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhblsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX21pblsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTE2IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAxMCBiaXQgKi8KKwl1OCB0ZW1wX292ZXJbM107CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdGVtcF9oeXN0WzNdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLworCXUxNiBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqc19icmlkZ2U7CS8qIHBvaW50ZXIgdG8gdGhlIChvbmx5KSB2aWE2ODZhICovCisKK3N0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCB2aWE2ODZhX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IHZpYTY4NmFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIGlubGluZSBpbnQgdmlhNjg2YV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlyZXR1cm4gKGluYl9wKGNsaWVudC0+YWRkciArIHJlZykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmlhNjg2YV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsCisJCQkJICAgICAgIHU4IHZhbHVlKQoreworCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgcmVnKTsKK30KKworc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdmlhNjg2YV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCisKKy8qIDcgdm9sdGFnZSBzZW5zb3JzICovCitzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbltucl0sIG5yKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bbnJdLCBucikpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W25yXSwgbnIpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9taW5bbnJdID0gSU5fVE9fUkVHKHZhbCxucik7CisJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOX01JTihuciksIAorCQkJZGF0YS0+aW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21heFtucl0gPSBJTl9UT19SRUcodmFsLG5yKTsKKwl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU5fTUFYKG5yKSwgCisJCQlkYXRhLT5pbl9tYXhbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKyNkZWZpbmUgc2hvd19pbl9vZmZzZXQob2Zmc2V0KQkJCQkJXAorc3RhdGljIHNzaXplX3QgCQkJCQkJCVwKKwlzaG93X2luIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJXAorCXJldHVybiBzaG93X2luKGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCisJc2hvd19pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJXAorCXJldHVybiBzaG93X2luX21pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCisJc2hvd19pbiMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJXAorCXJldHVybiBzaG93X2luX21heChkZXYsIGJ1Ziwgb2Zmc2V0KTsJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIAlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNldF9pbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwJXAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNldF9pbl9tYXgoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19pbiMjb2Zmc2V0LCBOVUxMKTtcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIAlcCisJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOwlcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIAlcCisJCXNob3dfaW4jI29mZnNldCMjX21heCwgc2V0X2luIyNvZmZzZXQjI19tYXgpOworCitzaG93X2luX29mZnNldCgwKTsKK3Nob3dfaW5fb2Zmc2V0KDEpOworc2hvd19pbl9vZmZzZXQoMik7CitzaG93X2luX29mZnNldCgzKTsKK3Nob3dfaW5fb2Zmc2V0KDQpOworCisvKiAzIHRlbXBlcmF0dXJlcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHMTAoZGF0YS0+dGVtcFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfb3Zlcltucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX292ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfb3Zlcltucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX09WRVIobnIpLCBkYXRhLT50ZW1wX292ZXJbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfaHlzdFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX0hZU1QobnIpLCBkYXRhLT50ZW1wX2h5c3RbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKyNkZWZpbmUgc2hvd190ZW1wX29mZnNldChvZmZzZXQpCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXAoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfdGVtcF8jI29mZnNldCMjX292ZXIgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd190ZW1wX292ZXIoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd190ZW1wXyMjb2Zmc2V0IyNfaHlzdCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXBfaHlzdChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfb3ZlciAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfdGVtcF9vdmVyKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19oeXN0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIAkJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF90ZW1wX2h5c3QoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF8jI29mZnNldCwgTlVMTCk7XAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAorCQlzaG93X3RlbXBfIyNvZmZzZXQjI19vdmVyLCBzZXRfdGVtcF8jI29mZnNldCMjX292ZXIpOwlcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4X2h5c3QsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfaHlzdCwgc2V0X3RlbXBfIyNvZmZzZXQjI19oeXN0KTsJCisKK3Nob3dfdGVtcF9vZmZzZXQoMSk7CitzaG93X3RlbXBfb2Zmc2V0KDIpOworc2hvd190ZW1wX29mZnNldCgzKTsKKworLyogMiBGYW5zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bbnJdLCAKKwkJCQlESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSApOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwKKwkJRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSApOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSApOworfQorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAorCQlzaXplX3QgY291bnQsIGludCBucikgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5fTUlOKG5yKzEpLCBkYXRhLT5mYW5fbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJaW50IG9sZDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlvbGQgPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYpOworCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX1RPX1JFRyh2YWwpOworCW9sZCA9IChvbGQgJiAweDBmKSB8IChkYXRhLT5mYW5fZGl2WzFdIDw8IDYpIHwgKGRhdGEtPmZhbl9kaXZbMF0gPDwgNCk7CisJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTkRJViwgb2xkKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzaG93X2Zhbl9vZmZzZXQob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIAkJXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9mYW5fZGl2KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuXyMjb2Zmc2V0LCBOVUxMKTtcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOwlcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd19mYW5fIyNvZmZzZXQjI19kaXYsIHNldF9mYW5fIyNvZmZzZXQjI19kaXYpOworCitzaG93X2Zhbl9vZmZzZXQoMSk7CitzaG93X2Zhbl9vZmZzZXQoMik7CisKKy8qIEFsYXJtcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgQUxBUk1TX0ZST01fUkVHKGRhdGEtPmFsYXJtcykpOworfQorc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfYWxhcm1zLCBOVUxMKTsKKworLyogVGhlIGRyaXZlci4gSSBjaG9vc2UgdG8gdXNlIHR5cGUgaTJjX2RyaXZlciwgYXMgYXQgaXMgaWRlbnRpY2FsIHRvIGJvdGgKKyAgIHNtYnVzX2RyaXZlciBhbmQgaXNhX2RyaXZlciwgYW5kIGNsaWVudHMgY291bGQgYmUgb2YgZWl0aGVyIGtpbmQgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB2aWE2ODZhX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInZpYTY4NmEiLAorCS5pZAkJPSBJMkNfRFJJVkVSSURfVklBNjg2QSwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSB2aWE2ODZhX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gdmlhNjg2YV9kZXRhY2hfY2xpZW50LAorfTsKKworCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCitzdGF0aWMgaW50IHZpYTY4NmFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgdmlhNjg2YV9kZXRlY3QpOworfQorCitzdGF0aWMgaW50IHZpYTY4NmFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciBjbGllbnRfbmFtZVtdID0gInZpYTY4NmEiOworCXUxNiB2YWw7CisKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIHByb2JpbmcgdGhlIElTQSBidXMhISAgKi8KKwlpZiAoIWkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsCisJCSJ2aWE2ODZhX2RldGVjdCBjYWxsZWQgZm9yIGFuIEkyQyBidXMgYWRhcHRlcj8hP1xuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIDgyMzEgcmVxdWlyZXMgbXVsdGlwbGUgb2YgMjU2LCB3ZSBlbmZvcmNlIHRoYXQgb24gNjg2IGFzIHdlbGwgKi8KKwlpZihmb3JjZV9hZGRyKQorCQlhZGRyZXNzID0gZm9yY2VfYWRkciAmIDB4RkYwMDsKKworCWlmKGZvcmNlX2FkZHIpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwiZm9yY2luZyBJU0EgYWRkcmVzcyAweCUwNFhcbiIsIGFkZHJlc3MpOworCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CisJCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfQkFTRV9SRUcsIGFkZHJlc3MpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KKwkgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfRU5BQkxFX1JFRywgJnZhbCkpCisJCXJldHVybiAtRU5PREVWOworCWlmICghKHZhbCAmIDB4MDAwMSkpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwiZW5hYmxpbmcgc2Vuc29yc1xuIik7CisJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KKwkJICAgIHBjaV93cml0ZV9jb25maWdfd29yZChzX2JyaWRnZSwgVklBNjg2QV9FTkFCTEVfUkVHLAorCQkgICAgICAgICAgICAgICAgICAgICAgdmFsIHwgMHgwMDAxKSkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFJlc2VydmUgdGhlIElTQSByZWdpb24gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFZJQTY4NkFfRVhURU5ULCB2aWE2ODZhX2RyaXZlci5uYW1lKSkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsInJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwKKwkJICAgICAgIGFkZHJlc3MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpYTY4NmFfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SMDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgdmlhNjg2YV9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnZpYTY4NmFfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKwluZXdfY2xpZW50LT5kZXYucGFyZW50ID0gJmFkYXB0ZXItPmRldjsKKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzbnByaW50ZihuZXdfY2xpZW50LT5uYW1lLCBJMkNfTkFNRV9TSVpFLCBjbGllbnRfbmFtZSk7CisKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBFUlJPUjM7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgVklBNjg2QSBjaGlwICovCisJdmlhNjg2YV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4X2h5c3QpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfZGl2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKwlyZXR1cm4gMDsKKworICAgICAgRVJST1IzOgorCWtmcmVlKGRhdGEpOworICAgICAgRVJST1IwOgorCXJlbGVhc2VfcmVnaW9uKGFkZHJlc3MsIFZJQTY4NkFfRVhURU5UKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZpYTY4NmFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgVklBNjg2QV9FWFRFTlQpOworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IFZJQTY4NkEuIFNldCBsaW1pdHMsIGV0Yy4gKi8KK3N0YXRpYyB2b2lkIHZpYTY4NmFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl1OCByZWc7CisKKwkvKiBTdGFydCBtb25pdG9yaW5nICovCisJcmVnID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfQ09ORklHKTsKKwl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfQ09ORklHLCAocmVnfDB4MDEpJjB4N0YpOworCisJLyogQ29uZmlndXJlIHRlbXAgaW50ZXJydXB0IG1vZGUgZm9yIGNvbnRpbnVvdXMtaW50ZXJydXB0IG9wZXJhdGlvbiAqLworCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX01PREUsIAorCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTU9ERSkgJgorCQkJICAgICEoVklBNjg2QV9URU1QX01PREVfTUFTSyB8IFZJQTY4NkFfVEVNUF9NT0RFX0NPTlRJTlVPVVMpKTsKK30KKworc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gNDsgaSsrKSB7CisJCQlkYXRhLT5pbltpXSA9CisJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU4oaSkpOworCQkJZGF0YS0+aW5fbWluW2ldID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQkgICAgIFZJQTY4NkFfUkVHX0lOX01JTgorCQkJCQkJCSAgICAgKGkpKTsKKwkJCWRhdGEtPmluX21heFtpXSA9CisJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU5fTUFYKGkpKTsKKwkJfQorCQlmb3IgKGkgPSAxOyBpIDw9IDI7IGkrKykgeworCQkJZGF0YS0+ZmFuW2kgLSAxXSA9CisJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFOKGkpKTsKKwkJCWRhdGEtPmZhbl9taW5baSAtIDFdID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgICAgVklBNjg2QV9SRUdfRkFOX01JTihpKSk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8PSAyOyBpKyspIHsKKwkJCWRhdGEtPnRlbXBbaV0gPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJIFZJQTY4NkFfUkVHX1RFTVAoaSkpIDw8IDI7CisJCQlkYXRhLT50ZW1wX292ZXJbaV0gPQorCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBWSUE2ODZBX1JFR19URU1QX09WRVIoaSkpOworCQkJZGF0YS0+dGVtcF9oeXN0W2ldID0KKwkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgVklBNjg2QV9SRUdfVEVNUF9IWVNUKGkpKTsKKwkJfQorCQkvKiBhZGQgaW4gbG93ZXIgMiBiaXRzIAorCQkgICB0ZW1wMSB1c2VzIGJpdHMgNy02IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMQorCQkgICB0ZW1wMiB1c2VzIGJpdHMgNS00IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMKKwkJICAgdGVtcDMgdXNlcyBiaXRzIDctNiBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzIzCisJCSAqLworCQlkYXRhLT50ZW1wWzBdIHw9ICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJICAgICBWSUE2ODZBX1JFR19URU1QX0xPVzEpCisJCQkJICAmIDB4YzApID4+IDY7CisJCWRhdGEtPnRlbXBbMV0gfD0KKwkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX0xPVzIzKSAmCisJCSAgICAgMHgzMCkgPj4gNDsKKwkJZGF0YS0+dGVtcFsyXSB8PQorCQkgICAgKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMpICYKKwkJICAgICAweGMwKSA+PiA2OworCisJCWkgPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYpOworCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzFdID0gaSA+PiA2OworCQlkYXRhLT5hbGFybXMgPQorCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkgICAgICAgVklBNjg2QV9SRUdfQUxBUk0xKSB8CisJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfQUxBUk0yKSA8PCA4KTsKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpYTY4NmFfcGNpX2lkc1tdID0geworICAgICAgIHsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzQpIH0sCisgICAgICAgeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdmlhNjg2YV9wY2lfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgdmlhNjg2YV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworICAgICAgIHUxNiB2YWw7CisgICAgICAgaW50IGFkZHIgPSAwOworCisgICAgICAgaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQorICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFZJQTY4NkFfQkFTRV9SRUcsICZ2YWwpKQorICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICAgICBhZGRyID0gdmFsICYgfihWSUE2ODZBX0VYVEVOVCAtIDEpOworICAgICAgIGlmIChhZGRyID09IDAgJiYgZm9yY2VfYWRkciA9PSAwKSB7CisgICAgICAgICAgICAgICBkZXZfZXJyKCZkZXYtPmRldiwiYmFzZSBhZGRyZXNzIG5vdCBzZXQgLSB1cGdyYWRlIEJJT1Mgb3IgdXNlIGZvcmNlX2FkZHI9MHhhZGRyXG4iKTsKKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgIH0KKyAgICAgICBpZiAoZm9yY2VfYWRkcikKKyAgICAgICAgICAgICAgIGFkZHIgPSBmb3JjZV9hZGRyOyAgICAgIC8qIHNvIGRldGVjdCB3aWxsIGdldCBjYWxsZWQgKi8KKworICAgICAgIGlmICghYWRkcikgeworICAgICAgICAgICAgICAgZGV2X2VycigmZGV2LT5kZXYsIk5vIFZpYSA2ODZBIHNlbnNvcnMgZm91bmQuXG4iKTsKKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgIH0KKyAgICAgICBub3JtYWxfaXNhWzBdID0gYWRkcjsKKworCXNfYnJpZGdlID0gcGNpX2Rldl9nZXQoZGV2KTsKKwlpZiAoaTJjX2FkZF9kcml2ZXIoJnZpYTY4NmFfZHJpdmVyKSkgeworCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CisJCXNfYnJpZGdlID0gTlVMTDsKKwl9CisKKwkvKiBBbHdheXMgcmV0dXJuIGZhaWx1cmUgaGVyZS4gIFRoaXMgaXMgdG8gYWxsb3cgb3RoZXIgZHJpdmVycyB0byBiaW5kCisJICogdG8gdGhpcyBwY2kgZGV2aWNlLiAgV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gaGF2ZSBjb250cm9sIG92ZXIgdGhlCisJICogcGNpIGRldmljZSwgd2Ugb25seSB3YW50ZWQgdG8gcmVhZCBhcyBmZXcgcmVnaXN0ZXIgdmFsdWVzIGZyb20gaXQuCisJICovCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2aWE2ODZhX3BjaV9kcml2ZXIgPSB7CisgICAgICAgLm5hbWUJCT0gInZpYTY4NmEiLAorICAgICAgIC5pZF90YWJsZQk9IHZpYTY4NmFfcGNpX2lkcywKKyAgICAgICAucHJvYmUJCT0gdmlhNjg2YV9wY2lfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzbV92aWE2ODZhX2luaXQodm9pZCkKK3sKKyAgICAgICByZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdmlhNjg2YV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNtX3ZpYTY4NmFfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmlhNjg2YV9wY2lfZHJpdmVyKTsKKwlpZiAoc19icmlkZ2UgIT0gTlVMTCkgeworCQlpMmNfZGVsX2RyaXZlcigmdmlhNjg2YV9kcml2ZXIpOworCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CisJCXNfYnJpZGdlID0gTlVMTDsKKwl9Cit9CisKK01PRFVMRV9BVVRIT1IoIkt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwgIgorICAgICAgICAgICAgICAiTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiAiCisgICAgICAgICAgICAgImFuZCBCb2IgRG91Z2hlcnR5IDxib2JkQHN0YW5mb3JkLmVkdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVklBIDY4NkEgU2Vuc29yIGRldmljZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzbV92aWE2ODZhX2luaXQpOworbW9kdWxlX2V4aXQoc21fdmlhNjg2YV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3c4MzYyN2hmLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy93ODM2MjdoZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGE1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy93ODM2MjdoZi5jCkBAIC0wLDAgKzEsMTUxMSBAQAorLyoKKyAgICB3ODM2MjdoZi5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICAgICBtb25pdG9yaW5nCisgICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMyAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKKyAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LAorICAgIGFuZCBNYXJrIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CisgICAgUG9ydGVkIHRvIDIuNiBieSBCZXJuaGFyZCBDLiBTY2hyZW5rIDxjbGVteUBjbGVteS5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qCisgICAgU3VwcG9ydHMgZm9sbG93aW5nIGNoaXBzOgorCisgICAgQ2hpcAkjdmluCSNmYW5pbgkjcHdtCSN0ZW1wCXdjaGlwaWQJdmVuZGlkCWkyYwlJU0EKKyAgICB3ODM2MjdoZgk5CTMJMgkzCTB4MjAJMHg1Y2EzCW5vCXllcyhMUEMpCisgICAgdzgzNjI3dGhmCTcJMwkzCTMJMHg5MAkweDVjYTMJbm8JeWVzKExQQykKKyAgICB3ODM2MzdoZgk3CTMJMwkzCTB4ODAJMHg1Y2EzCW5vCXllcyhMUEMpCisgICAgdzgzNjk3aGYJOAkyCTIJMgkweDYwCTB4NWNhMwlubwl5ZXMoTFBDKQorCisgICAgRm9yIG90aGVyIHdpbmJvbmQgY2hpcHMsIGFuZCBmb3IgaTJjIHN1cHBvcnQgaW4gdGhlIGFib3ZlIGNoaXBzLAorICAgIHVzZSB3ODM3ODFkLmMuCisKKyAgICBOb3RlOiBhdXRvbWF0aWMgKCJjcnVpc2UiKSBmYW4gY29udHJvbCBmb3IgNjk3LCA2MzcgJiA2Mjd0aGYgbm90CisgICAgc3VwcG9ydGVkIHlldC4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXZpZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgImxtNzUuaCIKKworc3RhdGljIHUxNiBmb3JjZV9hZGRyOworbW9kdWxlX3BhcmFtKGZvcmNlX2FkZHIsIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCisJCSAiSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzIik7CitzdGF0aWMgdTggZm9yY2VfaTJjID0gMHgxZjsKK21vZHVsZV9wYXJhbShmb3JjZV9pMmMsIGJ5dGUsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pMmMsCisJCSAiSW5pdGlhbGl6ZSB0aGUgaTJjIGFkZHJlc3Mgb2YgdGhlIHNlbnNvcnMiKTsKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMCwgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitTRU5TT1JTX0lOU01PRF80KHc4MzYyN2hmLCB3ODM2Mjd0aGYsIHc4MzY5N2hmLCB3ODM2MzdoZik7CisKK3N0YXRpYyBpbnQgaW5pdCA9IDE7Cittb2R1bGVfcGFyYW0oaW5pdCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGluaXQsICJTZXQgdG8gemVybyB0byBieXBhc3MgY2hpcCBpbml0aWFsaXphdGlvbiIpOworCisvKiBtb2RpZmllZCBmcm9tIGtlcm5lbC9pbmNsdWRlL3RyYXBzLmMgKi8KK3N0YXRpYyBpbnQgUkVHOwkJLyogVGhlIHJlZ2lzdGVyIHRvIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUJREVWCTB4MDcJLyogUmVnaXN0ZXI6IExvZ2ljYWwgZGV2aWNlIHNlbGVjdCAqLworc3RhdGljIGludCBWQUw7CQkvKiBUaGUgdmFsdWUgdG8gcmVhZC93cml0ZSAqLworCisvKiBsb2dpY2FsIGRldmljZSBudW1iZXJzIGZvciBzdXBlcmlvX3NlbGVjdCAoYmVsb3cpICovCisjZGVmaW5lIFc4MzYyN0hGX0xEX0ZEQwkJMHgwMAorI2RlZmluZSBXODM2MjdIRl9MRF9QUlQJCTB4MDEKKyNkZWZpbmUgVzgzNjI3SEZfTERfVUFSVDEJMHgwMgorI2RlZmluZSBXODM2MjdIRl9MRF9VQVJUMgkweDAzCisjZGVmaW5lIFc4MzYyN0hGX0xEX0tCQwkJMHgwNQorI2RlZmluZSBXODM2MjdIRl9MRF9DSVIJCTB4MDYgLyogdzgzNjI3aGYgb25seSAqLworI2RlZmluZSBXODM2MjdIRl9MRF9HQU1FCTB4MDcKKyNkZWZpbmUgVzgzNjI3SEZfTERfTUlESQkweDA3CisjZGVmaW5lIFc4MzYyN0hGX0xEX0dQSU8xCTB4MDcKKyNkZWZpbmUgVzgzNjI3SEZfTERfR1BJTzUJMHgwNyAvKiB3ODM2Mjd0aGYgb25seSAqLworI2RlZmluZSBXODM2MjdIRl9MRF9HUElPMgkweDA4CisjZGVmaW5lIFc4MzYyN0hGX0xEX0dQSU8zCTB4MDkKKyNkZWZpbmUgVzgzNjI3SEZfTERfR1BJTzQJMHgwOSAvKiB3ODM2Mjd0aGYgb25seSAqLworI2RlZmluZSBXODM2MjdIRl9MRF9BQ1BJCTB4MGEKKyNkZWZpbmUgVzgzNjI3SEZfTERfSFdNCQkweDBiCisKKyNkZWZpbmUJREVWSUQJMHgyMAkvKiBSZWdpc3RlcjogRGV2aWNlIElEICovCisKKyNkZWZpbmUgVzgzNjI3VEhGX0dQSU81X0VOCTB4MzAgLyogdzgzNjI3dGhmIG9ubHkgKi8KKyNkZWZpbmUgVzgzNjI3VEhGX0dQSU81X0lPU1IJMHhmMyAvKiB3ODM2Mjd0aGYgb25seSAqLworI2RlZmluZSBXODM2MjdUSEZfR1BJTzVfRFIJMHhmNCAvKiB3ODM2Mjd0aGYgb25seSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK3N1cGVyaW9fb3V0YihpbnQgcmVnLCBpbnQgdmFsKQoreworCW91dGIocmVnLCBSRUcpOworCW91dGIodmFsLCBWQUwpOworfQorCitzdGF0aWMgaW5saW5lIGludAorc3VwZXJpb19pbmIoaW50IHJlZykKK3sKKwlvdXRiKHJlZywgUkVHKTsKKwlyZXR1cm4gaW5iKFZBTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3VwZXJpb19zZWxlY3QoaW50IGxkKQoreworCW91dGIoREVWLCBSRUcpOworCW91dGIobGQsIFZBTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3VwZXJpb19lbnRlcih2b2lkKQoreworCW91dGIoMHg4NywgUkVHKTsKKwlvdXRiKDB4ODcsIFJFRyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3VwZXJpb19leGl0KHZvaWQpCit7CisJb3V0YigweEFBLCBSRUcpOworfQorCisjZGVmaW5lIFc2MjdfREVWSUQgMHg1MgorI2RlZmluZSBXNjI3VEhGX0RFVklEIDB4ODIKKyNkZWZpbmUgVzY5N19ERVZJRCAweDYwCisjZGVmaW5lIFc2MzdfREVWSUQgMHg3MAorI2RlZmluZSBXSU5CX0FDVF9SRUcgMHgzMAorI2RlZmluZSBXSU5CX0JBU0VfUkVHIDB4NjAKKy8qIENvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KKworLyogTGVuZ3RoIG9mIElTQSBhZGRyZXNzIHNlZ21lbnQgKi8KKyNkZWZpbmUgV0lOQl9FWFRFTlQgOAorCisvKiBXaGVyZSBhcmUgdGhlIElTQSBhZGRyZXNzL2RhdGEgcmVnaXN0ZXJzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQgNQorI2RlZmluZSBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCA2CisKKy8qIFRoZSBXODM3ODFEIHJlZ2lzdGVycyAqLworLyogVGhlIFc4Mzc4MkQgcmVnaXN0ZXJzIGZvciBucj03LDggYXJlIGluIGJhbmsgNSAqLworI2RlZmluZSBXODM3ODFEX1JFR19JTl9NQVgobnIpICgobnIgPCA3KSA/ICgweDJiICsgKG5yKSAqIDIpIDogXAorCQkJCQkgICAoMHg1NTQgKyAoKChucikgLSA3KSAqIDIpKSkKKyNkZWZpbmUgVzgzNzgxRF9SRUdfSU5fTUlOKG5yKSAoKG5yIDwgNykgPyAoMHgyYyArIChucikgKiAyKSA6IFwKKwkJCQkJICAgKDB4NTU1ICsgKCgobnIpIC0gNykgKiAyKSkpCisjZGVmaW5lIFc4Mzc4MURfUkVHX0lOKG5yKSAgICAgKChuciA8IDcpID8gKDB4MjAgKyAobnIpKSA6IFwKKwkJCQkJICAgKDB4NTUwICsgKG5yKSAtIDcpKQorCisjZGVmaW5lIFc4Mzc4MURfUkVHX0ZBTl9NSU4obnIpICgweDNhICsgKG5yKSkKKyNkZWZpbmUgVzgzNzgxRF9SRUdfRkFOKG5yKSAoMHgyNyArIChucikpCisKKyNkZWZpbmUgVzgzNzgxRF9SRUdfVEVNUDJfQ09ORklHIDB4MTUyCisjZGVmaW5lIFc4Mzc4MURfUkVHX1RFTVAzX0NPTkZJRyAweDI1MgorI2RlZmluZSBXODM3ODFEX1JFR19URU1QKG5yKQkJKChuciA9PSAzKSA/ICgweDAyNTApIDogXAorCQkJCQkoKG5yID09IDIpID8gKDB4MDE1MCkgOiBcCisJCQkJCSAgICAgICAgICAgICAoMHgyNykpKQorI2RlZmluZSBXODM3ODFEX1JFR19URU1QX0hZU1QobnIpCSgobnIgPT0gMykgPyAoMHgyNTMpIDogXAorCQkJCQkoKG5yID09IDIpID8gKDB4MTUzKSA6IFwKKwkJCQkJICAgICAgICAgICAgICgweDNBKSkpCisjZGVmaW5lIFc4Mzc4MURfUkVHX1RFTVBfT1ZFUihucikJKChuciA9PSAzKSA/ICgweDI1NSkgOiBcCisJCQkJCSgobnIgPT0gMikgPyAoMHgxNTUpIDogXAorCQkJCQkgICAgICAgICAgICAgKDB4MzkpKSkKKworI2RlZmluZSBXODM3ODFEX1JFR19CQU5LIDB4NEUKKworI2RlZmluZSBXODM3ODFEX1JFR19DT05GSUcgMHg0MAorI2RlZmluZSBXODM3ODFEX1JFR19BTEFSTTEgMHg0MQorI2RlZmluZSBXODM3ODFEX1JFR19BTEFSTTIgMHg0MgorI2RlZmluZSBXODM3ODFEX1JFR19BTEFSTTMgMHg0NTAKKworI2RlZmluZSBXODM3ODFEX1JFR19JUlEgMHg0QworI2RlZmluZSBXODM3ODFEX1JFR19CRUVQX0NPTkZJRyAweDRECisjZGVmaW5lIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzEgMHg1NgorI2RlZmluZSBXODM3ODFEX1JFR19CRUVQX0lOVFMyIDB4NTcKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMyAweDQ1MworCisjZGVmaW5lIFc4Mzc4MURfUkVHX1ZJRF9GQU5ESVYgMHg0NworCisjZGVmaW5lIFc4Mzc4MURfUkVHX0NISVBJRCAweDQ5CisjZGVmaW5lIFc4Mzc4MURfUkVHX1dDSElQSUQgMHg1OAorI2RlZmluZSBXODM3ODFEX1JFR19DSElQTUFOIDB4NEYKKyNkZWZpbmUgVzgzNzgxRF9SRUdfUElOIDB4NEIKKworI2RlZmluZSBXODM3ODFEX1JFR19WQkFUIDB4NUQKKworI2RlZmluZSBXODM2MjdIRl9SRUdfUFdNMSAweDVBCisjZGVmaW5lIFc4MzYyN0hGX1JFR19QV00yIDB4NUIKKyNkZWZpbmUgVzgzNjI3SEZfUkVHX1BXTUNMSzEyIDB4NUMKKworI2RlZmluZSBXODM2MjdUSEZfUkVHX1BXTTEJCTB4MDEJLyogNjk3SEYgYW5kIDYzN0hGIHRvbyAqLworI2RlZmluZSBXODM2MjdUSEZfUkVHX1BXTTIJCTB4MDMJLyogNjk3SEYgYW5kIDYzN0hGIHRvbyAqLworI2RlZmluZSBXODM2MjdUSEZfUkVHX1BXTTMJCTB4MTEJLyogNjM3SEYgdG9vICovCisKKyNkZWZpbmUgVzgzNjI3VEhGX1JFR19WUk1fT1ZUX0NGRyAJMHgxOAkvKiA2MzdIRiB0b28gKi8KKworc3RhdGljIGNvbnN0IHU4IHJlZ3B3bV82MjdoZltdID0geyBXODM2MjdIRl9SRUdfUFdNMSwgVzgzNjI3SEZfUkVHX1BXTTIgfTsKK3N0YXRpYyBjb25zdCB1OCByZWdwd21bXSA9IHsgVzgzNjI3VEhGX1JFR19QV00xLCBXODM2MjdUSEZfUkVHX1BXTTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFc4MzYyN1RIRl9SRUdfUFdNMyB9OworI2RlZmluZSBXODM2WDdIRl9SRUdfUFdNKHR5cGUsIG5yKSAoKCh0eXBlKSA9PSB3ODM2MjdoZikgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVncHdtXzYyN2hmWyhucikgLSAxXSA6IHJlZ3B3bVsobnIpIC0gMV0pCisKKyNkZWZpbmUgVzgzNzgxRF9SRUdfSTJDX0FERFIgMHg0OAorI2RlZmluZSBXODM3ODFEX1JFR19JMkNfU1VCQUREUiAweDRBCisKKy8qIFNlbnNvciBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgVzgzNzgxRF9SRUdfU0NGRzEgMHg1RAorc3RhdGljIGNvbnN0IHU4IEJJVF9TQ0ZHMVtdID0geyAweDAyLCAweDA0LCAweDA4IH07CisjZGVmaW5lIFc4Mzc4MURfUkVHX1NDRkcyIDB4NTkKK3N0YXRpYyBjb25zdCB1OCBCSVRfU0NGRzJbXSA9IHsgMHgxMCwgMHgyMCwgMHg0MCB9OworI2RlZmluZSBXODM3ODFEX0RFRkFVTFRfQkVUQSAzNDM1CisKKy8qIENvbnZlcnNpb25zLiBMaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRworICAgdmFyaWFudHMuIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGJlIGEgYml0IGNhcmVmdWwgd2l0aCB3aGljaCBhcmd1bWVudHMKKyAgIHRoZXNlIG1hY3JvcyBhcmUgY2FsbGVkOiBhcmd1bWVudHMgbWF5IGJlIGV2YWx1YXRlZCBtb3JlIHRoYW4gb25jZS4KKyAgIEZpeGluZyB0aGlzIGlzIGp1c3Qgbm90IHdvcnRoIGl0LiAqLworI2RlZmluZSBJTl9UT19SRUcodmFsKSAgKFNFTlNPUlNfTElNSVQoKCgodmFsKSArIDgpLzE2KSwwLDI1NSkpCisjZGVmaW5lIElOX0ZST01fUkVHKHZhbCkgKCh2YWwpICogMTYpCisKK3N0YXRpYyBpbmxpbmUgdTggRkFOX1RPX1JFRyhsb25nIHJwbSwgaW50IGRpdikKK3sKKwlpZiAocnBtID09IDApCisJCXJldHVybiAyNTU7CisJcnBtID0gU0VOU09SU19MSU1JVChycG0sIDEsIDEwMDAwMDApOworCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwKKwkJCSAgICAgMjU0KTsKK30KKworI2RlZmluZSBURU1QX01JTiAoLTEyODAwMCkKKyNkZWZpbmUgVEVNUF9NQVggKCAxMjcwMDApCisKKy8qIFRFTVA6IDAuMDAxQy9iaXQgKC0xMjhDIHRvICsxMjdDKQorICAgUkVHOiAxQy9iaXQsIHR3bydzIGNvbXBsZW1lbnQgKi8KK3N0YXRpYyB1OCBURU1QX1RPX1JFRyhpbnQgdGVtcCkKK3sKKyAgICAgICAgaW50IG50ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCBURU1QX01JTiwgVEVNUF9NQVgpOworICAgICAgICBudGVtcCArPSAobnRlbXA8MCA/IC01MDAgOiA1MDApOworICAgICAgICByZXR1cm4gKHU4KShudGVtcCAvIDEwMDApOworfQorCitzdGF0aWMgaW50IFRFTVBfRlJPTV9SRUcodTggcmVnKQoreworICAgICAgICByZXR1cm4gKHM4KXJlZyAqIDEwMDA7Cit9CisKKyNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCxkaXYpICgodmFsKT09MD8tMToodmFsKT09MjU1PzA6MTM1MDAwMC8oKHZhbCkqKGRpdikpKQorCisjZGVmaW5lIFBXTV9UT19SRUcodmFsKSAoU0VOU09SU19MSU1JVCgodmFsKSwwLDI1NSkpCisKKyNkZWZpbmUgQkVFUF9NQVNLX0ZST01fUkVHKHZhbCkJCSAodmFsKQorI2RlZmluZSBCRUVQX01BU0tfVE9fUkVHKHZhbCkJCSgodmFsKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBCRUVQX0VOQUJMRV9UT19SRUcodmFsKQkJKCh2YWwpPzE6MCkKKyNkZWZpbmUgQkVFUF9FTkFCTEVfRlJPTV9SRUcodmFsKQkoKHZhbCk/MTowKQorCisjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQorCitzdGF0aWMgaW5saW5lIHU4IERJVl9UT19SRUcobG9uZyB2YWwpCit7CisJaW50IGk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDEsIDEyOCkgPj4gMTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmICh2YWwgPT0gMCkKKwkJCWJyZWFrOworCQl2YWwgPj49IDE7CisJfQorCXJldHVybiAoKHU4KSBpKTsKK30KKworLyogRm9yIGVhY2ggcmVnaXN0ZXJlZCBjaGlwLCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBkYXRhIGluIG1lbW9yeS4gVGhhdAorICAgZGF0YSBpcyBwb2ludGVkIHRvIGJ5IHc4MzYyN2hmX2xpc3RbTlJdLT5kYXRhLiBUaGUgc3RydWN0dXJlIGl0c2VsZiBpcworICAgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcgY2xpZW50IGlzIGFsbG9jYXRlZC4gKi8KK3N0cnVjdCB3ODM2MjdoZl9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCWVudW0gY2hpcHMgdHlwZTsKKworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbG03NTsJLyogZm9yIHNlY29uZGFyeSBJMkMgYWRkcmVzc2VzICovCisJLyogcG9pbnRlciB0byBhcnJheSBvZiAyIHN1YmNsaWVudHMgKi8KKworCXU4IGluWzldOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9tYXhbOV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21pbls5XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fbWluWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wOworCXU4IHRlbXBfbWF4OwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wX21heF9oeXN0OwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiB0ZW1wX2FkZFsyXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgdGVtcF9tYXhfYWRkWzJdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiB0ZW1wX21heF9oeXN0X2FkZFsyXTsgLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2WzNdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KKwl1OCB2aWQ7CQkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJdTMyIGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCXUzMiBiZWVwX21hc2s7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1OCBiZWVwX2VuYWJsZTsJCS8qIEJvb2xlYW4gKi8KKwl1OCBwd21bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiBzZW5zWzNdOwkJLyogNzgyRC83ODNTIG9ubHkuCisJCQkJICAgMSA9IHBlbnRpdW0gZGlvZGU7IDIgPSAzOTA0IGRpb2RlOworCQkJCSAgIDMwMDAtNTAwMCA9IHRoZXJtaXN0b3IgYmV0YS4KKwkJCQkgICBEZWZhdWx0ID0gMzQzNS4KKwkJCQkgICBPdGhlciBCZXRhcyB1bmltcGxlbWVudGVkICovCisJdTggdnJtOworCXU4IHZybV9vdnQ7CQkvKiBSZWdpc3RlciB2YWx1ZSwgNjI3dGhmICYgNjM3aGYgb25seSAqLworfTsKKworCitzdGF0aWMgaW50IHc4MzYyN2hmX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IHc4MzYyN2hmX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAorCQkJICBpbnQga2luZCk7CitzdGF0aWMgaW50IHc4MzYyN2hmX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBpbnQgdzgzNjI3aGZfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnaXN0ZXIpOworc3RhdGljIGludCB3ODM2MjdoZl93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnaXN0ZXIsCisJCQkgICAgICAgdTE2IHZhbHVlKTsKK3N0YXRpYyBzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqdzgzNjI3aGZfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdzgzNjI3aGZfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3ODM2MjdoZl9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ3ODM2MjdoZiIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9XODM2MjdIRiwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSB3ODM2MjdoZl9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IHc4MzYyN2hmX2RldGFjaF9jbGllbnQsCit9OworCisvKiBmb2xsb3dpbmcgYXJlIHRoZSBzeXNmcyBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgc2hvd19pbl9yZWcocmVnKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSBcCit7IFwKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWxkXG4iLCAobG9uZylJTl9GUk9NX1JFRyhkYXRhLT5yZWdbbnJdKSk7IFwKK30KK3Nob3dfaW5fcmVnKGluKQorc2hvd19pbl9yZWcoaW5fbWluKQorc2hvd19pbl9yZWcoaW5fbWF4KQorCisjZGVmaW5lIHN0b3JlX2luX3JlZyhSRUcsIHJlZykgXAorc3RhdGljIHNzaXplX3QgXAorc3RvcmVfaW5fIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwl1MzIgdmFsOyBcCisJIFwKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsgXAorCSBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+aW5fIyNyZWdbbnJdID0gSU5fVE9fUkVHKHZhbCk7IFwKKwl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lOXyMjUkVHKG5yKSwgXAorCQkJICAgIGRhdGEtPmluXyMjcmVnW25yXSk7IFwKKwkgXAorCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30KK3N0b3JlX2luX3JlZyhNSU4sIG1pbikKK3N0b3JlX2luX3JlZyhNQVgsIG1heCkKKworI2RlZmluZSBzeXNmc19pbl9vZmZzZXQob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBcCitzaG93X3JlZ3NfaW5fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKyAgICAgICAgcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19yZWdzX2luXyMjb2Zmc2V0LCBOVUxMKTsKKworI2RlZmluZSBzeXNmc19pbl9yZWdfb2Zmc2V0KHJlZywgb2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfaW5fIyNyZWcjI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2luXyMjcmVnIChkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBcCitzdG9yZV9yZWdzX2luXyMjcmVnIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgXAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfaW5fIyNyZWcgKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjXyMjcmVnLCBTX0lSVUdPfCBTX0lXVVNSLCBcCisJCSAgc2hvd19yZWdzX2luXyMjcmVnIyNvZmZzZXQsIHN0b3JlX3JlZ3NfaW5fIyNyZWcjI29mZnNldCk7CisKKyNkZWZpbmUgc3lzZnNfaW5fb2Zmc2V0cyhvZmZzZXQpIFwKK3N5c2ZzX2luX29mZnNldChvZmZzZXQpIFwKK3N5c2ZzX2luX3JlZ19vZmZzZXQobWluLCBvZmZzZXQpIFwKK3N5c2ZzX2luX3JlZ19vZmZzZXQobWF4LCBvZmZzZXQpCisKK3N5c2ZzX2luX29mZnNldHMoMSk7CitzeXNmc19pbl9vZmZzZXRzKDIpOworc3lzZnNfaW5fb2Zmc2V0cygzKTsKK3N5c2ZzX2luX29mZnNldHMoNCk7CitzeXNmc19pbl9vZmZzZXRzKDUpOworc3lzZnNfaW5fb2Zmc2V0cyg2KTsKK3N5c2ZzX2luX29mZnNldHMoNyk7CitzeXNmc19pbl9vZmZzZXRzKDgpOworCisvKiB1c2UgYSBkaWZmZXJlbnQgc2V0IG9mIGZ1bmN0aW9ucyBmb3IgaW4wICovCitzdGF0aWMgc3NpemVfdCBzaG93X2luXzAoc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgdTggcmVnKQoreworCWxvbmcgaW4wOworCisJaWYgKChkYXRhLT52cm1fb3Z0ICYgMHgwMSkgJiYKKwkJKHc4MzYyN3RoZiA9PSBkYXRhLT50eXBlIHx8IHc4MzYzN2hmID09IGRhdGEtPnR5cGUpKQorCisJCS8qIHVzZSBWUk05IGNhbGN1bGF0aW9uICovCisJCWluMCA9IChsb25nKSgocmVnICogNDg4ICsgNzAwMDAgKyA1MCkgLyAxMDApOworCWVsc2UKKwkJLyogdXNlIFZSTTggKHN0YW5kYXJkKSBjYWxjdWxhdGlvbiAqLworCQlpbjAgPSAobG9uZylJTl9GUk9NX1JFRyhyZWcpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIGluMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19pbl8wKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gdzgzNjI3aGZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzaG93X2luXzAoZGF0YSwgYnVmLCBkYXRhLT5pblswXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19pbl9taW4wKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gdzgzNjI3aGZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzaG93X2luXzAoZGF0YSwgYnVmLCBkYXRhLT5pbl9taW5bMF0pOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfaW5fbWF4MChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc2hvd19pbl8wKGRhdGEsIGJ1ZiwgZGF0YS0+aW5fbWF4WzBdKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVnc19pbl9taW4wKHN0cnVjdCBkZXZpY2UgKmRldiwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCQorCWlmICgoZGF0YS0+dnJtX292dCAmIDB4MDEpICYmCisJCSh3ODM2Mjd0aGYgPT0gZGF0YS0+dHlwZSB8fCB3ODM2MzdoZiA9PSBkYXRhLT50eXBlKSkKKworCQkvKiB1c2UgVlJNOSBjYWxjdWxhdGlvbiAqLworCQlkYXRhLT5pbl9taW5bMF0gPSAodTgpKCgodmFsICogMTAwKSAtIDcwMDAwICsgMjQ0KSAvIDQ4OCk7CisJZWxzZQorCQkvKiB1c2UgVlJNOCAoc3RhbmRhcmQpIGNhbGN1bGF0aW9uICovCisJCWRhdGEtPmluX21pblswXSA9IElOX1RPX1JFRyh2YWwpOworCisJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19JTl9NSU4oMCksIGRhdGEtPmluX21pblswXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JlZ3NfaW5fbWF4MChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICgoZGF0YS0+dnJtX292dCAmIDB4MDEpICYmCisJCSh3ODM2Mjd0aGYgPT0gZGF0YS0+dHlwZSB8fCB3ODM2MzdoZiA9PSBkYXRhLT50eXBlKSkKKwkJCisJCS8qIHVzZSBWUk05IGNhbGN1bGF0aW9uICovCisJCWRhdGEtPmluX21heFswXSA9ICh1OCkoKCh2YWwgKiAxMDApIC0gNzAwMDAgKyAyNDQpIC8gNDg4KTsKKwllbHNlCisJCS8qIHVzZSBWUk04IChzdGFuZGFyZCkgY2FsY3VsYXRpb24gKi8KKwkJZGF0YS0+aW5fbWF4WzBdID0gSU5fVE9fUkVHKHZhbCk7CisKKwl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lOX01BWCgwKSwgZGF0YS0+aW5fbWF4WzBdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19yZWdzX2luXzAsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluMF9taW4sIFNfSVJVR08gfCBTX0lXVVNSLAorCXNob3dfcmVnc19pbl9taW4wLCBzdG9yZV9yZWdzX2luX21pbjApOworc3RhdGljIERFVklDRV9BVFRSKGluMF9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAorCXNob3dfcmVnc19pbl9tYXgwLCBzdG9yZV9yZWdzX2luX21heDApOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9pbihjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI29mZnNldCMjX2lucHV0KTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2luIyNvZmZzZXQjI19taW4pOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI29mZnNldCMjX21heCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgc2hvd19mYW5fcmVnKHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgXAoreyBcCisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgXAorCQlGQU5fRlJPTV9SRUcoZGF0YS0+cmVnW25yLTFdLCBcCisJCQkgICAgKGxvbmcpRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnItMV0pKSk7IFwKK30KK3Nob3dfZmFuX3JlZyhmYW4pOworc2hvd19mYW5fcmVnKGZhbl9taW4pOworCitzdGF0aWMgc3NpemVfdAorc3RvcmVfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fbWluW25yIC0gMV0gPQorCSAgICBGQU5fVE9fUkVHKHZhbCwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnIgLSAxXSkpOworCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfRkFOX01JTihuciksCisJCQkgICAgZGF0YS0+ZmFuX21pbltuciAtIDFdKTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX2Zhbl9vZmZzZXQob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3JlZ3NfZmFuXyMjb2Zmc2V0LCBOVUxMKTsKKworI2RlZmluZSBzeXNmc19mYW5fbWluX29mZnNldChvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19mYW5fbWluIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IFwKK3N0b3JlX3JlZ3NfZmFuX21pbiMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQkgIHNob3dfcmVnc19mYW5fbWluIyNvZmZzZXQsIHN0b3JlX3JlZ3NfZmFuX21pbiMjb2Zmc2V0KTsKKworc3lzZnNfZmFuX29mZnNldCgxKTsKK3N5c2ZzX2Zhbl9taW5fb2Zmc2V0KDEpOworc3lzZnNfZmFuX29mZnNldCgyKTsKK3N5c2ZzX2Zhbl9taW5fb2Zmc2V0KDIpOworc3lzZnNfZmFuX29mZnNldCgzKTsKK3N5c2ZzX2Zhbl9taW5fb2Zmc2V0KDMpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9mYW4oY2xpZW50LCBvZmZzZXQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfaW5wdXQpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19taW4pOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIHNob3dfdGVtcF9yZWcocmVnKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSBcCit7IFwKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCWlmIChuciA+PSAyKSB7CS8qIFRFTVAyIGFuZCBURU1QMyAqLyBcCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWxkXG4iLCBcCisJCQkobG9uZylMTTc1X1RFTVBfRlJPTV9SRUcoZGF0YS0+cmVnIyNfYWRkW25yLTJdKSk7IFwKKwl9IGVsc2UgewkvKiBURU1QMSAqLyBcCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWxkXG4iLCAobG9uZylURU1QX0ZST01fUkVHKGRhdGEtPnJlZykpOyBcCisJfSBcCit9CitzaG93X3RlbXBfcmVnKHRlbXApOworc2hvd190ZW1wX3JlZyh0ZW1wX21heCk7CitzaG93X3RlbXBfcmVnKHRlbXBfbWF4X2h5c3QpOworCisjZGVmaW5lIHN0b3JlX3RlbXBfcmVnKFJFRywgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBcCitzdG9yZV90ZW1wXyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJdTMyIHZhbDsgXAorCSBcCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7IFwKKwkgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCSBcCisJaWYgKG5yID49IDIpIHsJLyogVEVNUDIgYW5kIFRFTVAzICovIFwKKwkJZGF0YS0+dGVtcF8jI3JlZyMjX2FkZFtuci0yXSA9IExNNzVfVEVNUF9UT19SRUcodmFsKTsgXAorCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVBfIyNSRUcobnIpLCBcCisJCQkJZGF0YS0+dGVtcF8jI3JlZyMjX2FkZFtuci0yXSk7IFwKKwl9IGVsc2UgewkvKiBURU1QMSAqLyBcCisJCWRhdGEtPnRlbXBfIyNyZWcgPSBURU1QX1RPX1JFRyh2YWwpOyBcCisJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUF8jI1JFRyhuciksIFwKKwkJCWRhdGEtPnRlbXBfIyNyZWcpOyBcCisJfSBcCisJIFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CitzdG9yZV90ZW1wX3JlZyhPVkVSLCBtYXgpOworc3RvcmVfdGVtcF9yZWcoSFlTVCwgbWF4X2h5c3QpOworCisjZGVmaW5lIHN5c2ZzX3RlbXBfb2Zmc2V0KG9mZnNldCkgXAorc3RhdGljIHNzaXplX3QgXAorc2hvd19yZWdzX3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19yZWdzX3RlbXBfIyNvZmZzZXQsIE5VTEwpOworCisjZGVmaW5lIHN5c2ZzX3RlbXBfcmVnX29mZnNldChyZWcsIG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX3RlbXBfIyNyZWcjI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X3RlbXBfIyNyZWcgKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IFwKK3N0b3JlX3JlZ3NfdGVtcF8jI3JlZyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfdGVtcF8jI3JlZyAoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI18jI3JlZywgU19JUlVHT3wgU19JV1VTUiwgXAorCQkgIHNob3dfcmVnc190ZW1wXyMjcmVnIyNvZmZzZXQsIHN0b3JlX3JlZ3NfdGVtcF8jI3JlZyMjb2Zmc2V0KTsKKworI2RlZmluZSBzeXNmc190ZW1wX29mZnNldHMob2Zmc2V0KSBcCitzeXNmc190ZW1wX29mZnNldChvZmZzZXQpIFwKK3N5c2ZzX3RlbXBfcmVnX29mZnNldChtYXgsIG9mZnNldCkgXAorc3lzZnNfdGVtcF9yZWdfb2Zmc2V0KG1heF9oeXN0LCBvZmZzZXQpCisKK3N5c2ZzX3RlbXBfb2Zmc2V0cygxKTsKK3N5c2ZzX3RlbXBfb2Zmc2V0cygyKTsKK3N5c2ZzX3RlbXBfb2Zmc2V0cygzKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjb2Zmc2V0IyNfaW5wdXQpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjb2Zmc2V0IyNfbWF4KTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI29mZnNldCMjX21heF9oeXN0KTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHNzaXplX3QKK3Nob3dfdmlkX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihjcHUwX3ZpZCwgU19JUlVHTywgc2hvd192aWRfcmVnLCBOVUxMKTsKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChjbGllbnQpIFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCkKKworc3RhdGljIHNzaXplX3QKK3Nob3dfdnJtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSBkYXRhLT52cm0pOworfQorc3RhdGljIHNzaXplX3QKK3N0b3JlX3ZybV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWRhdGEtPnZybSA9IHZhbDsKKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih2cm0sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZybV9yZWcsIHN0b3JlX3ZybV9yZWcpOworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdnJtKGNsaWVudCkgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3ZybSkKKworc3RhdGljIHNzaXplX3QKK3Nob3dfYWxhcm1zX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSBkYXRhLT5hbGFybXMpOworfQorc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXNfcmVnLCBOVUxMKTsKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2FsYXJtcyhjbGllbnQpIFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpCisKKyNkZWZpbmUgc2hvd19iZWVwX3JlZyhSRUcsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2hvd19iZWVwXyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgXAorCQkgICAgICAobG9uZylCRUVQXyMjUkVHIyNfRlJPTV9SRUcoZGF0YS0+YmVlcF8jI3JlZykpOyBcCit9CitzaG93X2JlZXBfcmVnKEVOQUJMRSwgZW5hYmxlKQorc2hvd19iZWVwX3JlZyhNQVNLLCBtYXNrKQorCisjZGVmaW5lIEJFRVBfRU5BQkxFCQkJMAkvKiBTdG9yZSBiZWVwX2VuYWJsZSAqLworI2RlZmluZSBCRUVQX01BU0sJCQkxCS8qIFN0b3JlIGJlZXBfbWFzayAqLworCitzdGF0aWMgc3NpemVfdAorc3RvcmVfYmVlcF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkgICAgICAgaW50IHVwZGF0ZV9tYXNrKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsLCB2YWwyOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodXBkYXRlX21hc2sgPT0gQkVFUF9NQVNLKSB7CS8qIFdlIGFyZSBzdG9yaW5nIGJlZXBfbWFzayAqLworCQlkYXRhLT5iZWVwX21hc2sgPSBCRUVQX01BU0tfVE9fUkVHKHZhbCk7CisJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMSwKKwkJCQkgICAgZGF0YS0+YmVlcF9tYXNrICYgMHhmZik7CisJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMywKKwkJCQkgICAgKChkYXRhLT5iZWVwX21hc2spID4+IDE2KSAmIDB4ZmYpOworCQl2YWwyID0gKGRhdGEtPmJlZXBfbWFzayA+PiA4KSAmIDB4N2Y7CisJfSBlbHNlIHsJCS8qIFdlIGFyZSBzdG9yaW5nIGJlZXBfZW5hYmxlICovCisJCXZhbDIgPQorCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzIpICYgMHg3ZjsKKwkJZGF0YS0+YmVlcF9lbmFibGUgPSBCRUVQX0VOQUJMRV9UT19SRUcodmFsKTsKKwl9CisKKwl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzIsCisJCQkgICAgdmFsMiB8IGRhdGEtPmJlZXBfZW5hYmxlIDw8IDcpOworCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc3lzZnNfYmVlcChSRUcsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX2JlZXBfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19iZWVwXyMjcmVnKGRldiwgYnVmKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBcCitzdG9yZV9yZWdzX2JlZXBfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzdG9yZV9iZWVwX3JlZyhkZXYsIGJ1ZiwgY291bnQsIEJFRVBfIyNSRUcpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihiZWVwXyMjcmVnLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQkgIHNob3dfcmVnc19iZWVwXyMjcmVnLCBzdG9yZV9yZWdzX2JlZXBfIyNyZWcpOworCitzeXNmc19iZWVwKEVOQUJMRSwgZW5hYmxlKTsKK3N5c2ZzX2JlZXAoTUFTSywgbWFzayk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2JlZXAoY2xpZW50KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9iZWVwX2VuYWJsZSk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9iZWVwX21hc2spOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgc3NpemVfdAorc2hvd19mYW5fZGl2X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gdzgzNjI3aGZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwKKwkJICAgICAgIChsb25nKSBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2RpdltuciAtIDFdKSk7Cit9CisKKy8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCisgICBkZXRlcm1pbmVkIGluIHBhcnQgYnkgdGhlIGZhbiBkaXZpc29yLiAgVGhpcyBmb2xsb3dzIHRoZSBwcmluY2lwbGUgb2YKKyAgIGxlYXN0IHN1cHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAorICAgYmVjYXVzZSB0aGUgZGl2aXNvciBjaGFuZ2VkLiAqLworc3RhdGljIHNzaXplX3QKK3N0b3JlX2Zhbl9kaXZfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyBtaW47CisJdTggcmVnOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBTYXZlIGZhbl9taW4gKi8KKwltaW4gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCQkgICBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKworCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX1RPX1JFRyh2YWwpOworCisJcmVnID0gKHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBucj09MiA/IFc4Mzc4MURfUkVHX1BJTiA6IFc4Mzc4MURfUkVHX1ZJRF9GQU5ESVYpCisJICAgICAgICYgKG5yPT0wID8gMHhjZiA6IDB4M2YpKQorCSAgICB8ICgoZGF0YS0+ZmFuX2Rpdltucl0gJiAweDAzKSA8PCAobnI9PTAgPyA0IDogNikpOworCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgbnI9PTIgPyBXODM3ODFEX1JFR19QSU4gOiBXODM3ODFEX1JFR19WSURfRkFORElWLCByZWcpOworCisJcmVnID0gKHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19WQkFUKQorCSAgICAgICAmIH4oMSA8PCAoNSArIG5yKSkpCisJICAgIHwgKChkYXRhLT5mYW5fZGl2W25yXSAmIDB4MDQpIDw8ICgzICsgbnIpKTsKKwl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1ZCQVQsIHJlZyk7CisKKwkvKiBSZXN0b3JlIGZhbl9taW4gKi8KKwlkYXRhLT5mYW5fbWluW25yXSA9IEZBTl9UT19SRUcobWluLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0ZBTl9NSU4obnIrMSksIGRhdGEtPmZhbl9taW5bbnJdKTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX2Zhbl9kaXYob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfZmFuX2Rpdl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2Zhbl9kaXZfcmVnKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IFwKK3N0b3JlX3JlZ3NfZmFuX2Rpdl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBcCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzdG9yZV9mYW5fZGl2X3JlZyhkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJICBzaG93X3JlZ3NfZmFuX2Rpdl8jI29mZnNldCwgc3RvcmVfcmVnc19mYW5fZGl2XyMjb2Zmc2V0KTsKKworc3lzZnNfZmFuX2RpdigxKTsKK3N5c2ZzX2Zhbl9kaXYoMik7CitzeXNmc19mYW5fZGl2KDMpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9mYW5fZGl2KGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI29mZnNldCMjX2Rpdik7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3B3bV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSBkYXRhLT5wd21bbnIgLSAxXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9wd21fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKGRhdGEtPnR5cGUgPT0gdzgzNjI3dGhmKSB7CisJCS8qIGJpdHMgMC0zIGFyZSByZXNlcnZlZCAgaW4gNjI3VEhGICovCisJCWRhdGEtPnB3bVtuciAtIDFdID0gUFdNX1RPX1JFRyh2YWwpICYgMHhmMDsKKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LAorCQkJCSAgICAgVzgzNlg3SEZfUkVHX1BXTShkYXRhLT50eXBlLCBuciksCisJCQkJICAgICBkYXRhLT5wd21bbnIgLSAxXSB8CisJCQkJICAgICAodzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJICAgICBXODM2WDdIRl9SRUdfUFdNKGRhdGEtPnR5cGUsIG5yKSkgJiAweDBmKSk7CisJfSBlbHNlIHsKKwkJZGF0YS0+cHdtW25yIC0gMV0gPSBQV01fVE9fUkVHKHZhbCk7CisJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwKKwkJCQkgICAgIFc4MzZYN0hGX1JFR19QV00oZGF0YS0+dHlwZSwgbnIpLAorCQkJCSAgICAgZGF0YS0+cHdtW25yIC0gMV0pOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX3B3bShvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19wd21fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19wd21fcmVnKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IFwKK3N0b3JlX3JlZ3NfcHdtXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfcHdtX3JlZyhkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQkgIHNob3dfcmVnc19wd21fIyNvZmZzZXQsIHN0b3JlX3JlZ3NfcHdtXyMjb2Zmc2V0KTsKKworc3lzZnNfcHdtKDEpOworc3lzZnNfcHdtKDIpOworc3lzZnNfcHdtKDMpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9wd20oY2xpZW50LCBvZmZzZXQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bSMjb2Zmc2V0KTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHNzaXplX3QKK3Nob3dfc2Vuc29yX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gdzgzNjI3aGZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgKGxvbmcpIGRhdGEtPnNlbnNbbnIgLSAxXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9zZW5zb3JfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbCwgdG1wOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMToJCS8qIFBJSS9DZWxlcm9uIGRpb2RlICovCisJCXRtcCA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSk7CisJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzEsCisJCQkJICAgIHRtcCB8IEJJVF9TQ0ZHMVtuciAtIDFdKTsKKwkJdG1wID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcyKTsKKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMiwKKwkJCQkgICAgdG1wIHwgQklUX1NDRkcyW25yIC0gMV0pOworCQlkYXRhLT5zZW5zW25yIC0gMV0gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMjoJCS8qIDM5MDQgKi8KKwkJdG1wID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcxKTsKKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSwKKwkJCQkgICAgdG1wIHwgQklUX1NDRkcxW25yIC0gMV0pOworCQl0bXAgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzIpOworCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcyLAorCQkJCSAgICB0bXAgJiB+QklUX1NDRkcyW25yIC0gMV0pOworCQlkYXRhLT5zZW5zW25yIC0gMV0gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgVzgzNzgxRF9ERUZBVUxUX0JFVEE6CS8qIHRoZXJtaXN0b3IgKi8KKwkJdG1wID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcxKTsKKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSwKKwkJCQkgICAgdG1wICYgfkJJVF9TQ0ZHMVtuciAtIDFdKTsKKwkJZGF0YS0+c2Vuc1tuciAtIDFdID0gdmFsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJICAgICAgICJJbnZhbGlkIHNlbnNvciB0eXBlICVsZDsgbXVzdCBiZSAxLCAyLCBvciAlZFxuIiwKKwkJICAgICAgIChsb25nKSB2YWwsIFc4Mzc4MURfREVGQVVMVF9CRVRBKTsKKwkJYnJlYWs7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc3lzZnNfc2Vuc29yKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX3NlbnNvcl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorICAgIHJldHVybiBzaG93X3NlbnNvcl9yZWcoZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIHNzaXplX3QgXAorc3RvcmVfcmVnc19zZW5zb3JfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorICAgIHJldHVybiBzdG9yZV9zZW5zb3JfcmVnKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfdHlwZSwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJICBzaG93X3JlZ3Nfc2Vuc29yXyMjb2Zmc2V0LCBzdG9yZV9yZWdzX3NlbnNvcl8jI29mZnNldCk7CisKK3N5c2ZzX3NlbnNvcigxKTsKK3N5c2ZzX3NlbnNvcigyKTsKK3N5c2ZzX3NlbnNvcigzKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfc2Vuc29yKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNvZmZzZXQjI190eXBlKTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuOgorICAgICAqIHc4MzYyN2hmX2RyaXZlciBpcyBpbnNlcnRlZCAod2hlbiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQpLCBmb3IgZWFjaAorICAgICAgIGF2YWlsYWJsZSBhZGFwdGVyCisgICAgICogd2hlbiBhIG5ldyBhZGFwdGVyIGlzIGluc2VydGVkIChhbmQgdzgzNjI3aGZfZHJpdmVyIGlzIHN0aWxsIHByZXNlbnQpICovCitzdGF0aWMgaW50IHc4MzYyN2hmX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCB3ODM2MjdoZl9kZXRlY3QpOworfQorCitzdGF0aWMgaW50IHc4MzYyN2hmX2ZpbmQoaW50IHNpb2FkZHIsIGludCAqYWRkcmVzcykKK3sKKwl1MTYgdmFsOworCisJUkVHID0gc2lvYWRkcjsKKwlWQUwgPSBzaW9hZGRyICsgMTsKKworCXN1cGVyaW9fZW50ZXIoKTsKKwl2YWw9IHN1cGVyaW9faW5iKERFVklEKTsKKwlpZih2YWwgIT0gVzYyN19ERVZJRCAmJgorCSAgIHZhbCAhPSBXNjI3VEhGX0RFVklEICYmCisJICAgdmFsICE9IFc2OTdfREVWSUQgJiYKKwkgICB2YWwgIT0gVzYzN19ERVZJRCkgeworCQlzdXBlcmlvX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc3VwZXJpb19zZWxlY3QoVzgzNjI3SEZfTERfSFdNKTsKKwl2YWwgPSAoc3VwZXJpb19pbmIoV0lOQl9CQVNFX1JFRykgPDwgOCkgfAorCSAgICAgICBzdXBlcmlvX2luYihXSU5CX0JBU0VfUkVHICsgMSk7CisJKmFkZHJlc3MgPSB2YWwgJiB+KFdJTkJfRVhURU5UIC0gMSk7CisJaWYgKCphZGRyZXNzID09IDAgJiYgZm9yY2VfYWRkciA9PSAwKSB7CisJCXN1cGVyaW9fZXhpdCgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKGZvcmNlX2FkZHIpCisJCSphZGRyZXNzID0gZm9yY2VfYWRkcjsJLyogc28gZGV0ZWN0IHdpbGwgZ2V0IGNhbGxlZCAqLworCisJc3VwZXJpb19leGl0KCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB3ODM2MjdoZl9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwkJICAgaW50IGtpbmQpCit7CisJaW50IHZhbDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpjbGllbnRfbmFtZSA9ICIiOworCisJaWYgKCFpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBFUlJPUjA7CisJfQorCisJaWYoZm9yY2VfYWRkcikKKwkJYWRkcmVzcyA9IGZvcmNlX2FkZHIgJiB+KFdJTkJfRVhURU5UIC0gMSk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFdJTkJfRVhURU5ULCB3ODM2MjdoZl9kcml2ZXIubmFtZSkpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIEVSUk9SMDsKKwl9CisKKwlpZihmb3JjZV9hZGRyKSB7CisJCXByaW50aygidzgzNjI3aGYubzogZm9yY2luZyBJU0EgYWRkcmVzcyAweCUwNFhcbiIsIGFkZHJlc3MpOworCQlzdXBlcmlvX2VudGVyKCk7CisJCXN1cGVyaW9fc2VsZWN0KFc4MzYyN0hGX0xEX0hXTSk7CisJCXN1cGVyaW9fb3V0YihXSU5CX0JBU0VfUkVHLCBhZGRyZXNzID4+IDgpOworCQlzdXBlcmlvX291dGIoV0lOQl9CQVNFX1JFRysxLCBhZGRyZXNzICYgMHhmZik7CisJCXN1cGVyaW9fZXhpdCgpOworCX0KKworCXN1cGVyaW9fZW50ZXIoKTsKKwl2YWw9IHN1cGVyaW9faW5iKERFVklEKTsKKwlpZih2YWwgPT0gVzYyN19ERVZJRCkKKwkJa2luZCA9IHc4MzYyN2hmOworCWVsc2UgaWYodmFsID09IFc2OTdfREVWSUQpCisJCWtpbmQgPSB3ODM2OTdoZjsKKwllbHNlIGlmKHZhbCA9PSBXNjI3VEhGX0RFVklEKQorCQlraW5kID0gdzgzNjI3dGhmOworCWVsc2UgaWYodmFsID09IFc2MzdfREVWSUQpCisJCWtpbmQgPSB3ODM2MzdoZjsKKwllbHNlIHsKKwkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKKwkJCSAiVW5zdXBwb3J0ZWQgY2hpcCAoZGV2X2lkPTB4JTAyWCkuXG4iLCB2YWwpOworCQlnb3RvIEVSUk9SMTsKKwl9CisKKwlzdXBlcmlvX3NlbGVjdChXODM2MjdIRl9MRF9IV00pOworCWlmKCh2YWwgPSAweDAxICYgc3VwZXJpb19pbmIoV0lOQl9BQ1RfUkVHKSkgPT0gMCkKKwkJc3VwZXJpb19vdXRiKFdJTkJfQUNUX1JFRywgMSk7CisJc3VwZXJpb19leGl0KCk7CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIHc4MzYyN2hmX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdzgzNjI3aGZfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SMTsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgdzgzNjI3aGZfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCWluaXRfTVVURVgoJmRhdGEtPmxvY2spOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZ3ODM2MjdoZl9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisKKwlpZiAoa2luZCA9PSB3ODM2MjdoZikgeworCQljbGllbnRfbmFtZSA9ICJ3ODM2MjdoZiI7CisJfSBlbHNlIGlmIChraW5kID09IHc4MzYyN3RoZikgeworCQljbGllbnRfbmFtZSA9ICJ3ODM2Mjd0aGYiOworCX0gZWxzZSBpZiAoa2luZCA9PSB3ODM2OTdoZikgeworCQljbGllbnRfbmFtZSA9ICJ3ODM2OTdoZiI7CisJfSBlbHNlIGlmIChraW5kID09IHc4MzYzN2hmKSB7CisJCWNsaWVudF9uYW1lID0gInc4MzYzN2hmIjsKKwl9CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCisJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBjbGllbnRfbmFtZSwgSTJDX05BTUVfU0laRSk7CisJZGF0YS0+dHlwZSA9IGtpbmQ7CisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBFUlJPUjI7CisKKwlkYXRhLT5sbTc1ID0gTlVMTDsKKworCS8qIEluaXRpYWxpemUgdGhlIGNoaXAgKi8KKwl3ODM2MjdoZl9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIEEgZmV3IHZhcnMgbmVlZCB0byBiZSBmaWxsZWQgdXBvbiBzdGFydHVwICovCisJZGF0YS0+ZmFuX21pblswXSA9IHc4MzYyN2hmX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzgxRF9SRUdfRkFOX01JTigxKSk7CisJZGF0YS0+ZmFuX21pblsxXSA9IHc4MzYyN2hmX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzgxRF9SRUdfRkFOX01JTigyKSk7CisJZGF0YS0+ZmFuX21pblsyXSA9IHc4MzYyN2hmX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzgxRF9SRUdfRkFOX01JTigzKSk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKKwlpZiAoa2luZCAhPSB3ODM2OTdoZikKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDQpOworCWlmIChraW5kICE9IHc4MzYyN3RoZiAmJiBraW5kICE9IHc4MzYzN2hmKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA1KTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDYpOworCX0KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgNyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDgpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDIpOworCWlmIChraW5kICE9IHc4MzY5N2hmKQorCQlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDMpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMik7CisJaWYgKGtpbmQgIT0gdzgzNjk3aGYpCisJCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDMpOworCisJaWYgKGtpbmQgIT0gdzgzNjk3aGYpCisJCWRldmljZV9jcmVhdGVfZmlsZV92aWQobmV3X2NsaWVudCk7CisKKwlpZiAoa2luZCAhPSB3ODM2OTdoZikKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3ZybShuZXdfY2xpZW50KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9mYW5fZGl2KG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9mYW5fZGl2KG5ld19jbGllbnQsIDIpOworCWlmIChraW5kICE9IHc4MzY5N2hmKQorCQlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX2RpdihuZXdfY2xpZW50LCAzKTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9hbGFybXMobmV3X2NsaWVudCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfYmVlcChuZXdfY2xpZW50KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9wd20obmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3B3bShuZXdfY2xpZW50LCAyKTsKKwlpZiAoa2luZCA9PSB3ODM2Mjd0aGYgfHwga2luZCA9PSB3ODM2MzdoZikKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3B3bShuZXdfY2xpZW50LCAzKTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9zZW5zb3IobmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3NlbnNvcihuZXdfY2xpZW50LCAyKTsKKwlpZiAoa2luZCAhPSB3ODM2OTdoZikKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3NlbnNvcihuZXdfY2xpZW50LCAzKTsKKworCXJldHVybiAwOworCisgICAgICBFUlJPUjI6CisJa2ZyZWUoZGF0YSk7CisgICAgICBFUlJPUjE6CisJcmVsZWFzZV9yZWdpb24oYWRkcmVzcywgV0lOQl9FWFRFTlQpOworICAgICAgRVJST1IwOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdzgzNjI3aGZfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkgICAgICAgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIFdJTkJfRVhURU5UKTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICAgSVNBIGFjY2VzcyBtdXN0IGFsd2F5cyBiZSBsb2NrZWQgZXhwbGljaXRseSEKKyAgIFdlIGlnbm9yZSB0aGUgVzgzNzgxRCBCVVNZIGZsYWcgYXQgdGhpcyBtb21lbnQgLSBpdCBjb3VsZCBsZWFkIHRvIGRlYWRsb2NrcywKKyAgIHdvdWxkIHNsb3cgZG93biB0aGUgVzgzNzgxRCBhY2Nlc3MgYW5kIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LgorICAgVGhlcmUgYXJlIHNvbWUgdWdseSB0eXBlY2FzdHMgaGVyZSwgYnV0IHRoZSBnb29kIG5ld3MgaXMgLSB0aGV5IHNob3VsZAorICAgbm93aGVyZSBlbHNlIGJlIG5lY2Vzc2FyeSEgKi8KK3N0YXRpYyBpbnQgdzgzNjI3aGZfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnKQoreworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJlcywgd29yZF9zaXplZDsKKworCWRvd24oJmRhdGEtPmxvY2spOworCXdvcmRfc2l6ZWQgPSAoKChyZWcgJiAweGZmMDApID09IDB4MTAwKQorCQkgICB8fCAoKHJlZyAmIDB4ZmYwMCkgPT0gMHgyMDApKQorCQkgICYmICgoKHJlZyAmIDB4MDBmZikgPT0gMHg1MCkKKwkJICAgfHwgKChyZWcgJiAweDAwZmYpID09IDB4NTMpCisJCSAgIHx8ICgocmVnICYgMHgwMGZmKSA9PSAweDU1KSk7CisJaWYgKHJlZyAmIDB4ZmYwMCkgeworCQlvdXRiX3AoVzgzNzgxRF9SRUdfQkFOSywKKwkJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKTsKKwkJb3V0Yl9wKHJlZyA+PiA4LAorCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCX0KKwlvdXRiX3AocmVnICYgMHhmZiwgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCXJlcyA9IGluYl9wKGNsaWVudC0+YWRkciArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwlpZiAod29yZF9zaXplZCkgeworCQlvdXRiX3AoKHJlZyAmIDB4ZmYpICsgMSwKKwkJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKTsKKwkJcmVzID0KKwkJICAgIChyZXMgPDwgOCkgKyBpbmJfcChjbGllbnQtPmFkZHIgKworCQkJCSAgICAgICBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CisJfQorCWlmIChyZWcgJiAweGZmMDApIHsKKwkJb3V0Yl9wKFc4Mzc4MURfUkVHX0JBTkssCisJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJCW91dGJfcCgwLCBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CisJfQorCXVwKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHc4MzYyN3RoZl9yZWFkX2dwaW81KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJlcyA9IDB4ZmYsIHNlbDsKKworCXN1cGVyaW9fZW50ZXIoKTsKKwlzdXBlcmlvX3NlbGVjdChXODM2MjdIRl9MRF9HUElPNSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlc2UgR1BJTyBwaW5zIGFyZSBlbmFibGVkICovCisJaWYgKCEoc3VwZXJpb19pbmIoVzgzNjI3VEhGX0dQSU81X0VOKSAmICgxPDwzKSkpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJHUElPNSBkaXNhYmxlZCwgbm8gVklEIGZ1bmN0aW9uXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgcGlucyBhcmUgY29uZmlndXJlZCBmb3IgaW5wdXQKKwkgICBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IGZpdmUgKFZSTSA5KSwgYW5kIHBvc3NpYmx5IDYgKFZSTSAxMCkgKi8KKwlzZWwgPSBzdXBlcmlvX2luYihXODM2MjdUSEZfR1BJTzVfSU9TUik7CisJaWYgKChzZWwgJiAweDFmKSAhPSAweDFmKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiR1BJTzUgbm90IGNvbmZpZ3VyZWQgZm9yIFZJRCAiCisJCQkiZnVuY3Rpb25cbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiUmVhZGluZyBWSUQgZnJvbSBHUElPNVxuIik7CisJcmVzID0gc3VwZXJpb19pbmIoVzgzNjI3VEhGX0dQSU81X0RSKSAmIHNlbDsKKworZXhpdDoKKwlzdXBlcmlvX2V4aXQoKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHc4MzYyN2hmX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiByZWcsIHUxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB3b3JkX3NpemVkOworCisJZG93bigmZGF0YS0+bG9jayk7CisJd29yZF9zaXplZCA9ICgoKHJlZyAmIDB4ZmYwMCkgPT0gMHgxMDApCisJCSAgIHx8ICgocmVnICYgMHhmZjAwKSA9PSAweDIwMCkpCisJCSAgJiYgKCgocmVnICYgMHgwMGZmKSA9PSAweDUzKQorCQkgICB8fCAoKHJlZyAmIDB4MDBmZikgPT0gMHg1NSkpOworCWlmIChyZWcgJiAweGZmMDApIHsKKwkJb3V0Yl9wKFc4Mzc4MURfUkVHX0JBTkssCisJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJCW91dGJfcChyZWcgPj4gOCwKKwkJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwl9CisJb3V0Yl9wKHJlZyAmIDB4ZmYsIGNsaWVudC0+YWRkciArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKTsKKwlpZiAod29yZF9zaXplZCkgeworCQlvdXRiX3AodmFsdWUgPj4gOCwKKwkJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwkJb3V0Yl9wKChyZWcgJiAweGZmKSArIDEsCisJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJfQorCW91dGJfcCh2YWx1ZSAmIDB4ZmYsCisJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwlpZiAocmVnICYgMHhmZjAwKSB7CisJCW91dGJfcChXODM3ODFEX1JFR19CQU5LLAorCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCQlvdXRiX3AoMCwgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCX0KKwl1cCgmZGF0YS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHdlIGhhdmUgZm91bmQgYSBuZXcgVzgzNzgxRC4gSXQgc2hvdWxkIHNldCBsaW1pdHMsIGV0Yy4gKi8KK3N0YXRpYyB2b2lkIHc4MzYyN2hmX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaTsKKwlpbnQgdHlwZSA9IGRhdGEtPnR5cGU7CisJdTggdG1wOworCisJaWYoaW5pdCkgeworCQkvKiBzYXZlIHRoaXMgcmVnaXN0ZXIgKi8KKwkJaSA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0NPTkZJRyk7CisJCS8qIFJlc2V0IGFsbCBleGNlcHQgV2F0Y2hkb2cgdmFsdWVzIGFuZCBsYXN0IGNvbnZlcnNpb24gdmFsdWVzCisJCSAgIFRoaXMgc2V0cyBmYW4tZGl2cyB0byAyLCBhbW9uZyBvdGhlcnMgKi8KKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19DT05GSUcsIDB4ODApOworCQkvKiBSZXN0b3JlIHRoZSByZWdpc3RlciBhbmQgZGlzYWJsZSBwb3dlci1vbiBhYm5vcm1hbCBiZWVwLgorCQkgICBUaGlzIHNhdmVzIEZBTiAxLzIvMyBpbnB1dC9vdXRwdXQgdmFsdWVzIHNldCBieSBCSU9TLiAqLworCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfQ09ORklHLCBpIHwgMHg4MCk7CisJCS8qIERpc2FibGUgbWFzdGVyIGJlZXAtZW5hYmxlIChyZXNldCB0dXJucyBpdCBvbikuCisJCSAgIEluZGl2aWR1YWwgYmVlcHMgc2hvdWxkIGJlIHJlc2V0IHRvIG9mZiBidXQgZm9yIHNvbWUgcmVhc29uCisJCSAgIGRpc2FibGluZyB0aGlzIGJpdCBoZWxwcyBzb21lIHBlb3BsZSBub3QgZ2V0IGJlZXBlZCAqLworCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzIsIDApOworCX0KKworCS8qIE1pbmltaXplIGNvbmZsaWN0cyB3aXRoIG90aGVyIHdpbmJvbmQgaTJjLW9ubHkgY2xpZW50cy4uLiAgKi8KKwkvKiBkaXNhYmxlIGkyYyBzdWJjbGllbnRzLi4uIGhvdyB0byBkaXNhYmxlIG1haW4gaTJjIGNsaWVudD8/ICovCisJLyogZm9yY2UgaTJjIGFkZHJlc3MgdG8gcmVsYXRpdmVseSB1bmNvbW1vbiBhZGRyZXNzICovCisJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19JMkNfU1VCQUREUiwgMHg4OSk7CisJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19JMkNfQUREUiwgZm9yY2VfaTJjKTsKKworCS8qIFJlYWQgVklEIG9ubHkgb25jZSAqLworCWlmICh3ODM2MjdoZiA9PSBkYXRhLT50eXBlIHx8IHc4MzYzN2hmID09IGRhdGEtPnR5cGUpIHsKKwkJaW50IGxvID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1ZJRF9GQU5ESVYpOworCQlpbnQgaGkgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQ0hJUElEKTsKKwkJZGF0YS0+dmlkID0gKGxvICYgMHgwZikgfCAoKGhpICYgMHgwMSkgPDwgNCk7CisJfSBlbHNlIGlmICh3ODM2Mjd0aGYgPT0gZGF0YS0+dHlwZSkgeworCQlkYXRhLT52aWQgPSB3ODM2Mjd0aGZfcmVhZF9ncGlvNShjbGllbnQpICYgMHgzZjsKKwl9CisKKwkvKiBSZWFkIFZSTSAmIE9WVCBDb25maWcgb25seSBvbmNlICovCisJaWYgKHc4MzYyN3RoZiA9PSBkYXRhLT50eXBlIHx8IHc4MzYzN2hmID09IGRhdGEtPnR5cGUpIHsKKwkJZGF0YS0+dnJtX292dCA9IAorCQkJdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4MzYyN1RIRl9SRUdfVlJNX09WVF9DRkcpOworCQlkYXRhLT52cm0gPSAoZGF0YS0+dnJtX292dCAmIDB4MDEpID8gOTAgOiA4MjsKKwl9IGVsc2UgeworCQkvKiBDb252ZXJ0IFZJRCB0byB2b2x0YWdlIGJhc2VkIG9uIGRlZmF1bHQgVlJNICovCisJCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKwl9CisKKwl0bXAgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzEpOworCWZvciAoaSA9IDE7IGkgPD0gMzsgaSsrKSB7CisJCWlmICghKHRtcCAmIEJJVF9TQ0ZHMVtpIC0gMV0pKSB7CisJCQlkYXRhLT5zZW5zW2kgLSAxXSA9IFc4Mzc4MURfREVGQVVMVF9CRVRBOworCQl9IGVsc2UgeworCQkJaWYgKHc4MzYyN2hmX3JlYWRfdmFsdWUKKwkJCSAgICAoY2xpZW50LAorCQkJICAgICBXODM3ODFEX1JFR19TQ0ZHMikgJiBCSVRfU0NGRzJbaSAtIDFdKQorCQkJCWRhdGEtPnNlbnNbaSAtIDFdID0gMTsKKwkJCWVsc2UKKwkJCQlkYXRhLT5zZW5zW2kgLSAxXSA9IDI7CisJCX0KKwkJaWYgKCh0eXBlID09IHc4MzY5N2hmKSAmJiAoaSA9PSAyKSkKKwkJCWJyZWFrOworCX0KKworCWlmKGluaXQpIHsKKwkJLyogRW5hYmxlIHRlbXAyICovCisJCXRtcCA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QMl9DT05GSUcpOworCQlpZiAodG1wICYgMHgwMSkgeworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiRW5hYmxpbmcgdGVtcDIsIHJlYWRpbmdzICIKKwkJCQkgIm1pZ2h0IG5vdCBtYWtlIHNlbnNlXG4iKTsKKwkJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUDJfQ09ORklHLAorCQkJCXRtcCAmIDB4ZmUpOworCQl9CisKKwkJLyogRW5hYmxlIHRlbXAzICovCisJCWlmICh0eXBlICE9IHc4MzY5N2hmKSB7CisJCQl0bXAgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlXODM3ODFEX1JFR19URU1QM19DT05GSUcpOworCQkJaWYgKHRtcCAmIDB4MDEpIHsKKwkJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJFbmFibGluZyB0ZW1wMywgIgorCQkJCQkgInJlYWRpbmdzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlXG4iKTsKKwkJCQl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsCisJCQkJCVc4Mzc4MURfUkVHX1RFTVAzX0NPTkZJRywgdG1wICYgMHhmZSk7CisJCQl9CisJCX0KKworCQlpZiAodHlwZSA9PSB3ODM2MjdoZikgeworCQkJLyogZW5hYmxlIFBXTTIgY29udHJvbCAoY2FuJ3QgaHVydCBzaW5jZSBQV00gcmVnCisJCSAgICAgICAgICAgc2hvdWxkIGhhdmUgYmVlbiByZXNldCB0byAweGZmKSAqLworCQkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM2MjdIRl9SRUdfUFdNQ0xLMTIsCisJCQkJCSAgICAweDE5KTsKKwkJfQorCQkvKiBlbmFibGUgY29tcGFyYXRvciBtb2RlIGZvciB0ZW1wMiBhbmQgdGVtcDMgc28KKwkgICAgICAgICAgIGFsYXJtIGluZGljYXRpb24gd2lsbCB3b3JrIGNvcnJlY3RseSAqLworCQlpID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lSUSk7CisJCWlmICghKGkgJiAweDQwKSkKKwkJCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfSVJRLAorCQkJCQkgICAgaSB8IDB4NDApOworCX0KKworCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KKwl3ODM2MjdoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0NPTkZJRywKKwkJCSAgICAodzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlXODM3ODFEX1JFR19DT05GSUcpICYgMHhmNykKKwkJCSAgICB8IDB4MDEpOworfQorCitzdGF0aWMgc3RydWN0IHc4MzYyN2hmX2RhdGEgKnc4MzYyN2hmX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQorCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJZm9yIChpID0gMDsgaSA8PSA4OyBpKyspIHsKKwkJCS8qIHNraXAgbWlzc2luZyBzZW5zb3JzICovCisJCQlpZiAoKChkYXRhLT50eXBlID09IHc4MzY5N2hmKSAmJiAoaSA9PSAxKSkgfHwKKwkJCSAgICAoKGRhdGEtPnR5cGUgPT0gdzgzNjI3dGhmIHx8IGRhdGEtPnR5cGUgPT0gdzgzNjM3aGYpCisJCQkgICAgJiYgKGkgPT0gNCB8fCBpID09IDUpKSkKKwkJCQljb250aW51ZTsKKwkJCWRhdGEtPmluW2ldID0KKwkJCSAgICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfSU4oaSkpOworCQkJZGF0YS0+aW5fbWluW2ldID0KKwkJCSAgICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgIFc4Mzc4MURfUkVHX0lOX01JTihpKSk7CisJCQlkYXRhLT5pbl9tYXhbaV0gPQorCQkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgVzgzNzgxRF9SRUdfSU5fTUFYKGkpKTsKKwkJfQorCQlmb3IgKGkgPSAxOyBpIDw9IDM7IGkrKykgeworCQkJZGF0YS0+ZmFuW2kgLSAxXSA9CisJCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0ZBTihpKSk7CisJCQlkYXRhLT5mYW5fbWluW2kgLSAxXSA9CisJCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBXODM3ODFEX1JFR19GQU5fTUlOKGkpKTsKKwkJfQorCQlmb3IgKGkgPSAxOyBpIDw9IDM7IGkrKykgeworCQkJdTggdG1wID0gdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJVzgzNlg3SEZfUkVHX1BXTShkYXRhLT50eXBlLCBpKSk7CisgCQkJLyogYml0cyAwLTMgYXJlIHJlc2VydmVkICBpbiA2MjdUSEYgKi8KKyAJCQlpZiAoZGF0YS0+dHlwZSA9PSB3ODM2Mjd0aGYpCisJCQkJdG1wICY9IDB4ZjA7CisJCQlkYXRhLT5wd21baSAtIDFdID0gdG1wOworCQkJaWYoaSA9PSAyICYmCisJCQkgICAoZGF0YS0+dHlwZSA9PSB3ODM2MjdoZiB8fCBkYXRhLT50eXBlID09IHc4MzY5N2hmKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWRhdGEtPnRlbXAgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUCgxKSk7CisJCWRhdGEtPnRlbXBfbWF4ID0KKwkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QX09WRVIoMSkpOworCQlkYXRhLT50ZW1wX21heF9oeXN0ID0KKwkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QX0hZU1QoMSkpOworCQlkYXRhLT50ZW1wX2FkZFswXSA9CisJCSAgICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUCgyKSk7CisJCWRhdGEtPnRlbXBfbWF4X2FkZFswXSA9CisJCSAgICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUF9PVkVSKDIpKTsKKwkJZGF0YS0+dGVtcF9tYXhfaHlzdF9hZGRbMF0gPQorCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVBfSFlTVCgyKSk7CisJCWlmIChkYXRhLT50eXBlICE9IHc4MzY5N2hmKSB7CisJCQlkYXRhLT50ZW1wX2FkZFsxXSA9CisJCQkgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QKDMpKTsKKwkJCWRhdGEtPnRlbXBfbWF4X2FkZFsxXSA9CisJCQkgIHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QX09WRVIoMykpOworCQkJZGF0YS0+dGVtcF9tYXhfaHlzdF9hZGRbMV0gPQorCQkJICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUF9IWVNUKDMpKTsKKwkJfQorCisJCWkgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVklEX0ZBTkRJVik7CisJCWRhdGEtPmZhbl9kaXZbMF0gPSAoaSA+PiA0KSAmIDB4MDM7CisJCWRhdGEtPmZhbl9kaXZbMV0gPSAoaSA+PiA2KSAmIDB4MDM7CisJCWlmIChkYXRhLT50eXBlICE9IHc4MzY5N2hmKSB7CisJCQlkYXRhLT5mYW5fZGl2WzJdID0gKHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgVzgzNzgxRF9SRUdfUElOKSA+PiA2KSAmIDB4MDM7CisJCX0KKwkJaSA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19WQkFUKTsKKwkJZGF0YS0+ZmFuX2RpdlswXSB8PSAoaSA+PiAzKSAmIDB4MDQ7CisJCWRhdGEtPmZhbl9kaXZbMV0gfD0gKGkgPj4gNCkgJiAweDA0OworCQlpZiAoZGF0YS0+dHlwZSAhPSB3ODM2OTdoZikKKwkJCWRhdGEtPmZhbl9kaXZbMl0gfD0gKGkgPj4gNSkgJiAweDA0OworCQlkYXRhLT5hbGFybXMgPQorCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0FMQVJNMSkgfAorCQkgICAgKHc4MzYyN2hmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19BTEFSTTIpIDw8IDgpIHwKKwkJICAgICh3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQUxBUk0zKSA8PCAxNik7CisJCWkgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMik7CisJCWRhdGEtPmJlZXBfZW5hYmxlID0gaSA+PiA3OworCQlkYXRhLT5iZWVwX21hc2sgPSAoKGkgJiAweDdmKSA8PCA4KSB8CisJCSAgICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMSkgfAorCQkgICAgdzgzNjI3aGZfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzMpIDw8IDE2OworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX3c4MzYyN2hmX2luaXQodm9pZCkKK3sKKwlpbnQgYWRkcjsKKworCWlmICh3ODM2MjdoZl9maW5kKDB4MmUsICZhZGRyKQorCSAmJiB3ODM2MjdoZl9maW5kKDB4NGUsICZhZGRyKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbm9ybWFsX2lzYVswXSA9IGFkZHI7CisKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnc4MzYyN2hmX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX3c4MzYyN2hmX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdzgzNjI3aGZfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgIgorCSAgICAgICJQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LCAiCisJICAgICAgImFuZCBNYXJrIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlc4MzYyN0hGIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX3c4MzYyN2hmX2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc193ODM2MjdoZl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL3c4Mzc4MWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTU0ZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvdzgzNzgxZC5jCkBAIC0wLDAgKzEsMTY2NCBAQAorLyoKKyAgICB3ODM3ODFkLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTggLSAyMDAxICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LAorICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sCisgICAgYW5kIE1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgICBTdXBwb3J0cyBmb2xsb3dpbmcgY2hpcHM6CisKKyAgICBDaGlwCSN2aW4JI2ZhbmluCSNwd20JI3RlbXAJd2NoaXBpZAl2ZW5kaWQJaTJjCUlTQQorICAgIGFzOTkxMjdmCTcJMwkwCTMJMHgzMQkweDEyYzMJeWVzCW5vCisgICAgYXM5OTEyN2YgcmV2LjIgKHR5cGVfbmFtZSA9IGFzOTkxMjdmKQkweDMxCTB4NWNhMwl5ZXMJbm8KKyAgICB3ODM3ODFkCTcJMwkwCTMJMHgxMC0xCTB4NWNhMwl5ZXMJeWVzCisgICAgdzgzNjI3aGYJOQkzCTIJMwkweDIxCTB4NWNhMwl5ZXMJeWVzKExQQykKKyAgICB3ODM2Mjd0aGYJOQkzCTIJMwkweDkwCTB4NWNhMwlubwl5ZXMoTFBDKQorICAgIHc4Mzc4MmQJOQkzCTItNAkzCTB4MzAJMHg1Y2EzCXllcwl5ZXMKKyAgICB3ODM3ODNzCTUtNgkzCTIJMS0yCTB4NDAJMHg1Y2EzCXllcwlubworICAgIHc4MzY5N2hmCTgJMgkyCTIJMHg2MAkweDVjYTMJbm8JeWVzKExQQykKKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAibG03NS5oIgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwKKwkJCQkJMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwKKwkJCQkJMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyAweDAyOTAsIEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfNih3ODM3ODFkLCB3ODM3ODJkLCB3ODM3ODNzLCB3ODM2MjdoZiwgYXM5OTEyN2YsIHc4MzY5N2hmKTsKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCQkgICAgIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKKworc3RhdGljIGludCBpbml0ID0gMTsKK21vZHVsZV9wYXJhbShpbml0LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW5pdCwgIlNldCB0byB6ZXJvIHRvIGJ5cGFzcyBjaGlwIGluaXRpYWxpemF0aW9uIik7CisKKy8qIENvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KKworLyogTGVuZ3RoIG9mIElTQSBhZGRyZXNzIHNlZ21lbnQgKi8KKyNkZWZpbmUgVzgzNzgxRF9FWFRFTlQJCQk4CisKKy8qIFdoZXJlIGFyZSB0aGUgSVNBIGFkZHJlc3MvZGF0YSByZWdpc3RlcnMgcmVsYXRpdmUgdG8gdGhlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBXODM3ODFEX0FERFJfUkVHX09GRlNFVAkJNQorI2RlZmluZSBXODM3ODFEX0RBVEFfUkVHX09GRlNFVAkJNgorCisvKiBUaGUgVzgzNzgxRCByZWdpc3RlcnMgKi8KKy8qIFRoZSBXODM3ODJEIHJlZ2lzdGVycyBmb3IgbnI9Nyw4IGFyZSBpbiBiYW5rIDUgKi8KKyNkZWZpbmUgVzgzNzgxRF9SRUdfSU5fTUFYKG5yKQkJKChuciA8IDcpID8gKDB4MmIgKyAobnIpICogMikgOiBcCisJCQkJCQkgICAgKDB4NTU0ICsgKCgobnIpIC0gNykgKiAyKSkpCisjZGVmaW5lIFc4Mzc4MURfUkVHX0lOX01JTihucikJCSgobnIgPCA3KSA/ICgweDJjICsgKG5yKSAqIDIpIDogXAorCQkJCQkJICAgICgweDU1NSArICgoKG5yKSAtIDcpICogMikpKQorI2RlZmluZSBXODM3ODFEX1JFR19JTihucikJCSgobnIgPCA3KSA/ICgweDIwICsgKG5yKSkgOiBcCisJCQkJCQkgICAgKDB4NTUwICsgKG5yKSAtIDcpKQorCisjZGVmaW5lIFc4Mzc4MURfUkVHX0ZBTl9NSU4obnIpCQkoMHgzYSArIChucikpCisjZGVmaW5lIFc4Mzc4MURfUkVHX0ZBTihucikJCSgweDI3ICsgKG5yKSkKKworI2RlZmluZSBXODM3ODFEX1JFR19CQU5LCQkweDRFCisjZGVmaW5lIFc4Mzc4MURfUkVHX1RFTVAyX0NPTkZJRwkweDE1MgorI2RlZmluZSBXODM3ODFEX1JFR19URU1QM19DT05GSUcJMHgyNTIKKyNkZWZpbmUgVzgzNzgxRF9SRUdfVEVNUChucikJCSgobnIgPT0gMykgPyAoMHgwMjUwKSA6IFwKKwkJCQkJKChuciA9PSAyKSA/ICgweDAxNTApIDogXAorCQkJCQkJICAgICAoMHgyNykpKQorI2RlZmluZSBXODM3ODFEX1JFR19URU1QX0hZU1QobnIpCSgobnIgPT0gMykgPyAoMHgyNTMpIDogXAorCQkJCQkoKG5yID09IDIpID8gKDB4MTUzKSA6IFwKKwkJCQkJCSAgICAgKDB4M0EpKSkKKyNkZWZpbmUgVzgzNzgxRF9SRUdfVEVNUF9PVkVSKG5yKQkoKG5yID09IDMpID8gKDB4MjU1KSA6IFwKKwkJCQkJKChuciA9PSAyKSA/ICgweDE1NSkgOiBcCisJCQkJCQkgICAgICgweDM5KSkpCisKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQ09ORklHCQkweDQwCisjZGVmaW5lIFc4Mzc4MURfUkVHX0FMQVJNMQkJMHg0MQorI2RlZmluZSBXODM3ODFEX1JFR19BTEFSTTIJCTB4NDIKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQUxBUk0zCQkweDQ1MAkvKiBub3Qgb24gVzgzNzgxRCAqLworCisjZGVmaW5lIFc4Mzc4MURfUkVHX0lSUQkJCTB4NEMKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQkVFUF9DT05GSUcJCTB4NEQKKyNkZWZpbmUgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMQkJMHg1NgorI2RlZmluZSBXODM3ODFEX1JFR19CRUVQX0lOVFMyCQkweDU3CisjZGVmaW5lIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzMJCTB4NDUzCS8qIG5vdCBvbiBXODM3ODFEICovCisKKyNkZWZpbmUgVzgzNzgxRF9SRUdfVklEX0ZBTkRJVgkJMHg0NworCisjZGVmaW5lIFc4Mzc4MURfUkVHX0NISVBJRAkJMHg0OQorI2RlZmluZSBXODM3ODFEX1JFR19XQ0hJUElECQkweDU4CisjZGVmaW5lIFc4Mzc4MURfUkVHX0NISVBNQU4JCTB4NEYKKyNkZWZpbmUgVzgzNzgxRF9SRUdfUElOCQkJMHg0QgorCisvKiA3ODJELzc4M1Mgb25seSAqLworI2RlZmluZSBXODM3ODFEX1JFR19WQkFUCQkweDVECisKKy8qIFBXTSA3ODJEICgxLTQpIGFuZCA3ODNTICgxLTIpIG9ubHkgKi8KKyNkZWZpbmUgVzgzNzgxRF9SRUdfUFdNMQkJMHg1QgkvKiA3ODJkIGFuZCA3ODNzLzYyN2hmIGRhdGFzaGVldHMgZGlzYWdyZWUgKi8KKwkJCQkJCS8qIG9uIHdoaWNoIGlzIHdoaWNoOyAqLworI2RlZmluZSBXODM3ODFEX1JFR19QV00yCQkweDVBCS8qIFdlIGZvbGxvdyB0aGUgNzgyZCBjb252ZW50aW9uIGhlcmUsICovCisJCQkJCQkvKiBIb3dldmVyIDc4MmQgaXMgcHJvYmFibHkgd3JvbmcuICovCisjZGVmaW5lIFc4Mzc4MURfUkVHX1BXTTMJCTB4NUUKKyNkZWZpbmUgVzgzNzgxRF9SRUdfUFdNNAkJMHg1RgorI2RlZmluZSBXODM3ODFEX1JFR19QV01DTEsxMgkJMHg1QworI2RlZmluZSBXODM3ODFEX1JFR19QV01DTEszNAkJMHg0NUMKK3N0YXRpYyBjb25zdCB1OCByZWdwd21bXSA9IHsgVzgzNzgxRF9SRUdfUFdNMSwgVzgzNzgxRF9SRUdfUFdNMiwKKwlXODM3ODFEX1JFR19QV00zLCBXODM3ODFEX1JFR19QV000Cit9OworCisjZGVmaW5lIFc4Mzc4MURfUkVHX1BXTShucikJCShyZWdwd21bKG5yKSAtIDFdKQorCisjZGVmaW5lIFc4Mzc4MURfUkVHX0kyQ19BRERSCQkweDQ4CisjZGVmaW5lIFc4Mzc4MURfUkVHX0kyQ19TVUJBRERSCQkweDRBCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHVuZG9jdW1lbnRlZCBpbiB0aGUgZGF0YSBzaGVldHMgaG93ZXZlciB3ZQorICAgcmVjZWl2ZWQgdGhlIGluZm9ybWF0aW9uIGluIGFuIGVtYWlsIGZyb20gV2luYm9uZCB0ZWNoIHN1cHBvcnQgKi8KKy8qIFNlbnNvciBzZWxlY3Rpb24gLSBub3Qgb24gNzgxZCAqLworI2RlZmluZSBXODM3ODFEX1JFR19TQ0ZHMQkJMHg1RAorc3RhdGljIGNvbnN0IHU4IEJJVF9TQ0ZHMVtdID0geyAweDAyLCAweDA0LCAweDA4IH07CisKKyNkZWZpbmUgVzgzNzgxRF9SRUdfU0NGRzIJCTB4NTkKK3N0YXRpYyBjb25zdCB1OCBCSVRfU0NGRzJbXSA9IHsgMHgxMCwgMHgyMCwgMHg0MCB9OworCisjZGVmaW5lIFc4Mzc4MURfREVGQVVMVF9CRVRBCQkzNDM1CisKKy8qIFJUIFRhYmxlIHJlZ2lzdGVycyAqLworI2RlZmluZSBXODM3ODFEX1JFR19SVF9JRFgJCTB4NTAKKyNkZWZpbmUgVzgzNzgxRF9SRUdfUlRfVkFMCQkweDUxCisKKy8qIENvbnZlcnNpb25zLiBSb3VuZGluZyBhbmQgbGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcKKyAgIHZhcmlhbnRzLiBOb3RlIHRoYXQgeW91IHNob3VsZCBiZSBhIGJpdCBjYXJlZnVsIHdpdGggd2hpY2ggYXJndW1lbnRzCisgICB0aGVzZSBtYWNyb3MgYXJlIGNhbGxlZDogYXJndW1lbnRzIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCisgICBGaXhpbmcgdGhpcyBpcyBqdXN0IG5vdCB3b3J0aCBpdC4gKi8KKyNkZWZpbmUgSU5fVE9fUkVHKHZhbCkJCQkoU0VOU09SU19MSU1JVCgoKCh2YWwpICogMTAgKyA4KS8xNiksMCwyNTUpKQorI2RlZmluZSBJTl9GUk9NX1JFRyh2YWwpCQkoKCh2YWwpICogMTYpIC8gMTApCisKK3N0YXRpYyBpbmxpbmUgdTgKK0ZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCit7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gMjU1OworCXJwbSA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCAxMDAwMDAwKTsKKwlyZXR1cm4gU0VOU09SU19MSU1JVCgoMTM1MDAwMCArIHJwbSAqIGRpdiAvIDIpIC8gKHJwbSAqIGRpdiksIDEsIDI1NCk7Cit9CisKKyNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCxkaXYpCQkoKHZhbCkgPT0gMCAgID8gLTEgOiBcCisJCQkJCSgodmFsKSA9PSAyNTUgPyAwIDogXAorCQkJCQkJCTEzNTAwMDAgLyAoKHZhbCkgKiAoZGl2KSkpKQorCisjZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkJCShTRU5TT1JTX0xJTUlUKCgodmFsKSA8IDAgPyAodmFsKSsweDEwMCoxMDAwIFwKKwkJCQkJCTogKHZhbCkpIC8gMTAwMCwgMCwgMHhmZikpCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKQkJKCgodmFsKSAmIDB4ODAgPyAodmFsKS0weDEwMCA6ICh2YWwpKSAqIDEwMDApCisKKyNkZWZpbmUgQUxBUk1TX0ZST01fUkVHKHZhbCkJCSh2YWwpCisjZGVmaW5lIFBXTV9GUk9NX1JFRyh2YWwpCQkodmFsKQorI2RlZmluZSBQV01fVE9fUkVHKHZhbCkJCQkoU0VOU09SU19MSU1JVCgodmFsKSwwLDI1NSkpCisjZGVmaW5lIEJFRVBfTUFTS19GUk9NX1JFRyh2YWwsdHlwZSkJKCh0eXBlKSA9PSBhczk5MTI3ZiA/IFwKKwkJCQkJICh2YWwpIF4gMHg3ZmZmIDogKHZhbCkpCisjZGVmaW5lIEJFRVBfTUFTS19UT19SRUcodmFsLHR5cGUpCSgodHlwZSkgPT0gYXM5OTEyN2YgPyBcCisJCQkJCSAofih2YWwpKSAmIDB4N2ZmZiA6ICh2YWwpICYgMHhmZmZmZmYpCisKKyNkZWZpbmUgQkVFUF9FTkFCTEVfVE9fUkVHKHZhbCkJCSgodmFsKSA/IDEgOiAwKQorI2RlZmluZSBCRUVQX0VOQUJMRV9GUk9NX1JFRyh2YWwpCSgodmFsKSA/IDEgOiAwKQorCisjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpCQkoMSA8PCAodmFsKSkKKworc3RhdGljIGlubGluZSB1OAorRElWX1RPX1JFRyhsb25nIHZhbCwgZW51bSBjaGlwcyB0eXBlKQoreworCWludCBpOworCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAxLAorCQkJICAgICgodHlwZSA9PSB3ODM3ODFkCisJCQkgICAgICB8fCB0eXBlID09IGFzOTkxMjdmKSA/IDggOiAxMjgpKSA+PiAxOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKHZhbCA9PSAwKQorCQkJYnJlYWs7CisJCXZhbCA+Pj0gMTsKKwl9CisJcmV0dXJuICgodTgpIGkpOworfQorCisvKiBUaGVyZSBhcmUgc29tZSBjb21wbGljYXRpb25zIGluIGEgbW9kdWxlIGxpa2UgdGhpcy4gRmlyc3Qgb2ZmLCBXODM3ODFEIGNoaXBzCisgICBtYXkgYmUgYm90aCBwcmVzZW50IG9uIHRoZSBTTUJ1cyBhbmQgdGhlIElTQSBidXMsIGFuZCB3ZSBoYXZlIHRvIGhhbmRsZQorICAgdGhvc2UgY2FzZXMgc2VwYXJhdGVseSBhdCBzb21lIHBsYWNlcy4gU2Vjb25kLCB0aGVyZSBtaWdodCBiZSBzZXZlcmFsCisgICBXODM3ODFEIGNoaXBzIGF2YWlsYWJsZSAod2VsbCwgYWN0dWFsbHksIHRoYXQgaXMgcHJvYmFibHkgbmV2ZXIgZG9uZTsgYnV0CisgICBpdCBpcyBhIGNsZWFuIGlsbHVzdHJhdGlvbiBvZiBob3cgdG8gaGFuZGxlIGEgY2FzZSBsaWtlIHRoYXQpLiBGaW5hbGx5LAorICAgYSBzcGVjaWZpYyBjaGlwIG1heSBiZSBhdHRhY2hlZCB0byAqYm90aCogSVNBIGFuZCBTTUJ1cywgYW5kIHdlIHdvdWxkCisgICBub3QgbGlrZSB0byBkZXRlY3QgaXQgZG91YmxlLiBGb3J0dW5hdGVseSwgaW4gdGhlIGNhc2Ugb2YgdGhlIFc4Mzc4MUQgYXQKKyAgIGxlYXN0LCBhIHJlZ2lzdGVyIHRlbGxzIHVzIHdoYXQgU01CdXMgYWRkcmVzcyB3ZSBhcmUgb24sIHNvIHRoYXQgaGVscHMKKyAgIGEgYml0IC0gZXhjZXB0IGlmIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgU01CdXMuIEdyb2FuLiBObyBzb2x1dGlvbgorICAgZm9yIHRoaXMgeWV0LiAqLworCisvKiBUaGlzIG1vZHVsZSBtYXkgc2VlbSBvdmVybHkgbG9uZyBhbmQgY29tcGxpY2F0ZWQuIEluIGZhY3QsIGl0IGlzIG5vdCBzbworICAgYmFkLiBRdWl0ZSBhIGxvdCBvZiBib29ra2VlcGluZyBpcyBkb25lLiBBIHJlYWwgZHJpdmVyIGNhbiBvZnRlbiBjdXQKKyAgIHNvbWUgY29ybmVycy4gKi8KKworLyogRm9yIGVhY2ggcmVnaXN0ZXJlZCBXODM3ODFELCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBkYXRhIGluIG1lbW9yeS4gVGhhdAorICAgZGF0YSBpcyBwb2ludGVkIHRvIGJ5IHc4Mzc4MWRfbGlzdFtOUl0tPmRhdGEuIFRoZSBzdHJ1Y3R1cmUgaXRzZWxmIGlzCisgICBkeW5hbWljYWxseSBhbGxvY2F0ZWQsIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBhIG5ldyB3ODM3ODFkIGNsaWVudCBpcworICAgYWxsb2NhdGVkLiAqLworc3RydWN0IHc4Mzc4MWRfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwllbnVtIGNoaXBzIHR5cGU7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJc3RydWN0IGkyY19jbGllbnQgKmxtNzVbMl07CS8qIGZvciBzZWNvbmRhcnkgSTJDIGFkZHJlc3NlcyAqLworCS8qIGFycmF5IG9mIDIgcG9pbnRlcnMgdG8gc3ViY2xpZW50cyAqLworCisJdTggaW5bOV07CQkvKiBSZWdpc3RlciB2YWx1ZSAtIDggJiA5IGZvciA3ODJEIG9ubHkgKi8KKwl1OCBpbl9tYXhbOV07CQkvKiBSZWdpc3RlciB2YWx1ZSAtIDggJiA5IGZvciA3ODJEIG9ubHkgKi8KKwl1OCBpbl9taW5bOV07CQkvKiBSZWdpc3RlciB2YWx1ZSAtIDggJiA5IGZvciA3ODJEIG9ubHkgKi8KKwl1OCBmYW5bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9taW5bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHRlbXA7CisJdTggdGVtcF9tYXg7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHRlbXBfbWF4X2h5c3Q7CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTE2IHRlbXBfYWRkWzJdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXUxNiB0ZW1wX21heF9hZGRbMl07CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTE2IHRlbXBfbWF4X2h5c3RfYWRkWzJdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9kaXZbM107CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLworCXU4IHZpZDsJCQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1MzIgYWxhcm1zOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJdTMyIGJlZXBfbWFzazsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCXU4IGJlZXBfZW5hYmxlOwkJLyogQm9vbGVhbiAqLworCXU4IHB3bVs0XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggcHdtZW5hYmxlWzRdOwkvKiBCb29sZWFuICovCisJdTE2IHNlbnNbM107CQkvKiA3ODJELzc4M1Mgb25seS4KKwkJCQkgICAxID0gcGVudGl1bSBkaW9kZTsgMiA9IDM5MDQgZGlvZGU7CisJCQkJICAgMzAwMC01MDAwID0gdGhlcm1pc3RvciBiZXRhLgorCQkJCSAgIERlZmF1bHQgPSAzNDM1LiAKKwkJCQkgICBPdGhlciBCZXRhcyB1bmltcGxlbWVudGVkICovCisJdTggdnJtOworfTsKKworc3RhdGljIGludCB3ODM3ODFkX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IHc4Mzc4MWRfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgdzgzNzgxZF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgaW50IHc4Mzc4MWRfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnaXN0ZXIpOworc3RhdGljIGludCB3ODM3ODFkX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiByZWdpc3RlciwKKwkJCSAgICAgICB1MTYgdmFsdWUpOworc3RhdGljIHN0cnVjdCB3ODM3ODFkX2RhdGEgKnc4Mzc4MWRfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdzgzNzgxZF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHc4Mzc4MWRfZHJpdmVyID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gInc4Mzc4MWQiLAorCS5pZCA9IEkyQ19EUklWRVJJRF9XODM3ODFELAorCS5mbGFncyA9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyID0gdzgzNzgxZF9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCA9IHc4Mzc4MWRfZGV0YWNoX2NsaWVudCwKK307CisKKy8qIGZvbGxvd2luZyBhcmUgdGhlIHN5c2ZzIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworI2RlZmluZSBzaG93X2luX3JlZyhyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIFwKK3sgXAorCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSB3ODM3ODFkX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWxkXG4iLCAobG9uZylJTl9GUk9NX1JFRyhkYXRhLT5yZWdbbnJdICogMTApKTsgXAorfQorc2hvd19pbl9yZWcoaW4pOworc2hvd19pbl9yZWcoaW5fbWluKTsKK3Nob3dfaW5fcmVnKGluX21heCk7CisKKyNkZWZpbmUgc3RvcmVfaW5fcmVnKFJFRywgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV9pbl8jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKSBcCit7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCisJdTMyIHZhbDsgXAorCSBcCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgLyAxMDsgXAorCSBcCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+aW5fIyNyZWdbbnJdID0gSU5fVE9fUkVHKHZhbCk7IFwKKwl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfSU5fIyNSRUcobnIpLCBkYXRhLT5pbl8jI3JlZ1tucl0pOyBcCisJIFwKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CitzdG9yZV9pbl9yZWcoTUlOLCBtaW4pOworc3RvcmVfaW5fcmVnKE1BWCwgbWF4KTsKKworI2RlZmluZSBzeXNmc19pbl9vZmZzZXQob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBcCitzaG93X3JlZ3NfaW5fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKyAgICAgICAgcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19yZWdzX2luXyMjb2Zmc2V0LCBOVUxMKTsKKworI2RlZmluZSBzeXNmc19pbl9yZWdfb2Zmc2V0KHJlZywgb2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfaW5fIyNyZWcjI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X2luXyMjcmVnIChkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yZWdzX2luXyMjcmVnIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzdG9yZV9pbl8jI3JlZyAoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfIyNyZWcsIFNfSVJVR098IFNfSVdVU1IsIHNob3dfcmVnc19pbl8jI3JlZyMjb2Zmc2V0LCBzdG9yZV9yZWdzX2luXyMjcmVnIyNvZmZzZXQpOworCisjZGVmaW5lIHN5c2ZzX2luX29mZnNldHMob2Zmc2V0KSBcCitzeXNmc19pbl9vZmZzZXQob2Zmc2V0KTsgXAorc3lzZnNfaW5fcmVnX29mZnNldChtaW4sIG9mZnNldCk7IFwKK3N5c2ZzX2luX3JlZ19vZmZzZXQobWF4LCBvZmZzZXQpOworCitzeXNmc19pbl9vZmZzZXRzKDApOworc3lzZnNfaW5fb2Zmc2V0cygxKTsKK3N5c2ZzX2luX29mZnNldHMoMik7CitzeXNmc19pbl9vZmZzZXRzKDMpOworc3lzZnNfaW5fb2Zmc2V0cyg0KTsKK3N5c2ZzX2luX29mZnNldHMoNSk7CitzeXNmc19pbl9vZmZzZXRzKDYpOworc3lzZnNfaW5fb2Zmc2V0cyg3KTsKK3N5c2ZzX2luX29mZnNldHMoOCk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2luKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjb2Zmc2V0IyNfaW5wdXQpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI29mZnNldCMjX21pbik7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjb2Zmc2V0IyNfbWF4KTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBzaG93X2Zhbl9yZWcocmVnKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSBcCit7IFwKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gdzgzNzgxZF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgXAorCQlGQU5fRlJPTV9SRUcoZGF0YS0+cmVnW25yLTFdLCAobG9uZylESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltuci0xXSkpKTsgXAorfQorc2hvd19mYW5fcmVnKGZhbik7CitzaG93X2Zhbl9yZWcoZmFuX21pbik7CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+ZmFuX21pbltuciAtIDFdID0KKwkgICAgRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yIC0gMV0pKTsKKwl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfRkFOX01JTihuciksCisJCQkgICAgZGF0YS0+ZmFuX21pbltuciAtIDFdKTsKKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX2Zhbl9vZmZzZXQob2Zmc2V0KSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3JlZ3NfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3JlZ3NfZmFuXyMjb2Zmc2V0LCBOVUxMKTsKKworI2RlZmluZSBzeXNmc19mYW5fbWluX29mZnNldChvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19mYW5fbWluIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JlZ3NfZmFuX21pbiMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19yZWdzX2Zhbl9taW4jI29mZnNldCwgc3RvcmVfcmVnc19mYW5fbWluIyNvZmZzZXQpOworCitzeXNmc19mYW5fb2Zmc2V0KDEpOworc3lzZnNfZmFuX21pbl9vZmZzZXQoMSk7CitzeXNmc19mYW5fb2Zmc2V0KDIpOworc3lzZnNfZmFuX21pbl9vZmZzZXQoMik7CitzeXNmc19mYW5fb2Zmc2V0KDMpOworc3lzZnNfZmFuX21pbl9vZmZzZXQoMyk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19pbnB1dCk7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI29mZnNldCMjX21pbik7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgc2hvd190ZW1wX3JlZyhyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIFwKK3sgXAorCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSB3ODM3ODFkX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCWlmIChuciA+PSAyKSB7CS8qIFRFTVAyIGFuZCBURU1QMyAqLyBcCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFwKKwkJCUxNNzVfVEVNUF9GUk9NX1JFRyhkYXRhLT5yZWcjI19hZGRbbnItMl0pKTsgXAorCX0gZWxzZSB7CS8qIFRFTVAxICovIFwKKwkJcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIChsb25nKVRFTVBfRlJPTV9SRUcoZGF0YS0+cmVnKSk7IFwKKwl9IFwKK30KK3Nob3dfdGVtcF9yZWcodGVtcCk7CitzaG93X3RlbXBfcmVnKHRlbXBfbWF4KTsKK3Nob3dfdGVtcF9yZWcodGVtcF9tYXhfaHlzdCk7CisKKyNkZWZpbmUgc3RvcmVfdGVtcF9yZWcoUkVHLCByZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3RlbXBfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikgXAoreyBcCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAorCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCXMzMiB2YWw7IFwKKwkgXAorCXZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKKwkgXAorCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCSBcCisJaWYgKG5yID49IDIpIHsJLyogVEVNUDIgYW5kIFRFTVAzICovIFwKKwkJZGF0YS0+dGVtcF8jI3JlZyMjX2FkZFtuci0yXSA9IExNNzVfVEVNUF9UT19SRUcodmFsKTsgXAorCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUF8jI1JFRyhuciksIFwKKwkJCQlkYXRhLT50ZW1wXyMjcmVnIyNfYWRkW25yLTJdKTsgXAorCX0gZWxzZSB7CS8qIFRFTVAxICovIFwKKwkJZGF0YS0+dGVtcF8jI3JlZyA9IFRFTVBfVE9fUkVHKHZhbCk7IFwKKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVBfIyNSRUcobnIpLCBcCisJCQlkYXRhLT50ZW1wXyMjcmVnKTsgXAorCX0gXAorCSBcCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfQorc3RvcmVfdGVtcF9yZWcoT1ZFUiwgbWF4KTsKK3N0b3JlX3RlbXBfcmVnKEhZU1QsIG1heF9oeXN0KTsKKworI2RlZmluZSBzeXNmc190ZW1wX29mZnNldChvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IFwKK3Nob3dfcmVnc190ZW1wXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfdGVtcChkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfcmVnc190ZW1wXyMjb2Zmc2V0LCBOVUxMKTsKKworI2RlZmluZSBzeXNmc190ZW1wX3JlZ19vZmZzZXQocmVnLCBvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc190ZW1wXyMjcmVnIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd190ZW1wXyMjcmVnIChkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yZWdzX3RlbXBfIyNyZWcjI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHN0b3JlX3RlbXBfIyNyZWcgKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfIyNyZWcsIFNfSVJVR098IFNfSVdVU1IsIHNob3dfcmVnc190ZW1wXyMjcmVnIyNvZmZzZXQsIHN0b3JlX3JlZ3NfdGVtcF8jI3JlZyMjb2Zmc2V0KTsKKworI2RlZmluZSBzeXNmc190ZW1wX29mZnNldHMob2Zmc2V0KSBcCitzeXNmc190ZW1wX29mZnNldChvZmZzZXQpOyBcCitzeXNmc190ZW1wX3JlZ19vZmZzZXQobWF4LCBvZmZzZXQpOyBcCitzeXNmc190ZW1wX3JlZ19vZmZzZXQobWF4X2h5c3QsIG9mZnNldCk7CisKK3N5c2ZzX3RlbXBfb2Zmc2V0cygxKTsKK3N5c2ZzX3RlbXBfb2Zmc2V0cygyKTsKK3N5c2ZzX3RlbXBfb2Zmc2V0cygzKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjb2Zmc2V0IyNfaW5wdXQpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjb2Zmc2V0IyNfbWF4KTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI29mZnNldCMjX21heF9oeXN0KTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHNzaXplX3QKK3Nob3dfdmlkX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gdzgzNzgxZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCwgZGF0YS0+dnJtKSk7Cit9CisKK3N0YXRpYworREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfdmlkX3JlZywgTlVMTCk7CisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV92aWQoY2xpZW50KSBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpOworc3RhdGljIHNzaXplX3QKK3Nob3dfdnJtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gdzgzNzgxZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgZGF0YS0+dnJtKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3ZybV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJZGF0YS0+dnJtID0gdmFsOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMKK0RFVklDRV9BVFRSKHZybSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdnJtX3JlZywgc3RvcmVfdnJtX3JlZyk7CisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV92cm0oY2xpZW50KSBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdnJtKTsKK3N0YXRpYyBzc2l6ZV90CitzaG93X2FsYXJtc19yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IHc4Mzc4MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgKGxvbmcpIEFMQVJNU19GUk9NX1JFRyhkYXRhLT5hbGFybXMpKTsKK30KKworc3RhdGljCitERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zX3JlZywgTlVMTCk7CisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9hbGFybXMoY2xpZW50KSBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKK3N0YXRpYyBzc2l6ZV90IHNob3dfYmVlcF9tYXNrIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gdzgzNzgxZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLAorCQkgICAgICAgKGxvbmcpQkVFUF9NQVNLX0ZST01fUkVHKGRhdGEtPmJlZXBfbWFzaywgZGF0YS0+dHlwZSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19iZWVwX2VuYWJsZSAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IHc4Mzc4MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwKKwkJICAgICAgIChsb25nKUJFRVBfRU5BQkxFX0ZST01fUkVHKGRhdGEtPmJlZXBfZW5hYmxlKSk7Cit9CisKKyNkZWZpbmUgQkVFUF9FTkFCTEUJCQkwCS8qIFN0b3JlIGJlZXBfZW5hYmxlICovCisjZGVmaW5lIEJFRVBfTUFTSwkJCTEJLyogU3RvcmUgYmVlcF9tYXNrICovCisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9iZWVwX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCSAgICAgICBpbnQgdXBkYXRlX21hc2spCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbCwgdmFsMjsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHVwZGF0ZV9tYXNrID09IEJFRVBfTUFTSykgewkvKiBXZSBhcmUgc3RvcmluZyBiZWVwX21hc2sgKi8KKwkJZGF0YS0+YmVlcF9tYXNrID0gQkVFUF9NQVNLX1RPX1JFRyh2YWwsIGRhdGEtPnR5cGUpOworCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMSwKKwkJCQkgICAgZGF0YS0+YmVlcF9tYXNrICYgMHhmZik7CisKKwkJaWYgKChkYXRhLT50eXBlICE9IHc4Mzc4MWQpICYmIChkYXRhLT50eXBlICE9IGFzOTkxMjdmKSkgeworCQkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzMsCisJCQkJCSAgICAoKGRhdGEtPmJlZXBfbWFzaykgPj4gMTYpICYgMHhmZik7CisJCX0KKworCQl2YWwyID0gKGRhdGEtPmJlZXBfbWFzayA+PiA4KSAmIDB4N2Y7CisJfSBlbHNlIHsJCS8qIFdlIGFyZSBzdG9yaW5nIGJlZXBfZW5hYmxlICovCisJCXZhbDIgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0lOVFMyKSAmIDB4N2Y7CisJCWRhdGEtPmJlZXBfZW5hYmxlID0gQkVFUF9FTkFCTEVfVE9fUkVHKHZhbCk7CisJfQorCisJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzIsCisJCQkgICAgdmFsMiB8IGRhdGEtPmJlZXBfZW5hYmxlIDw8IDcpOworCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc3lzZnNfYmVlcChSRUcsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX2JlZXBfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19iZWVwXyMjcmVnKGRldiwgYnVmKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yZWdzX2JlZXBfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzdG9yZV9iZWVwX3JlZyhkZXYsIGJ1ZiwgY291bnQsIEJFRVBfIyNSRUcpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihiZWVwXyMjcmVnLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19yZWdzX2JlZXBfIyNyZWcsIHN0b3JlX3JlZ3NfYmVlcF8jI3JlZyk7CisKK3N5c2ZzX2JlZXAoRU5BQkxFLCBlbmFibGUpOworc3lzZnNfYmVlcChNQVNLLCBtYXNrKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfYmVlcChjbGllbnQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2JlZXBfZW5hYmxlKTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2JlZXBfbWFzayk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2Zhbl9kaXZfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCit7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IHc4Mzc4MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwKKwkJICAgICAgIChsb25nKSBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2RpdltuciAtIDFdKSk7Cit9CisKKy8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCisgICBkZXRlcm1pbmVkIGluIHBhcnQgYnkgdGhlIGZhbiBkaXZpc29yLiAgVGhpcyBmb2xsb3dzIHRoZSBwcmluY2lwbGUgb2YKKyAgIGxlYXN0IHN1cHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAorICAgYmVjYXVzZSB0aGUgZGl2aXNvciBjaGFuZ2VkLiAqLworc3RhdGljIHNzaXplX3QKK3N0b3JlX2Zhbl9kaXZfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIG1pbjsKKwl1OCByZWc7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkKKwkvKiBTYXZlIGZhbl9taW4gKi8KKwltaW4gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCQkgICBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKworCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX1RPX1JFRyh2YWwsIGRhdGEtPnR5cGUpOworCisJcmVnID0gKHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIG5yPT0yID8gVzgzNzgxRF9SRUdfUElOIDogVzgzNzgxRF9SRUdfVklEX0ZBTkRJVikKKwkgICAgICAgJiAobnI9PTAgPyAweGNmIDogMHgzZikpCisJICAgIHwgKChkYXRhLT5mYW5fZGl2W25yXSAmIDB4MDMpIDw8IChucj09MCA/IDQgOiA2KSk7CisJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIG5yPT0yID8gVzgzNzgxRF9SRUdfUElOIDogVzgzNzgxRF9SRUdfVklEX0ZBTkRJViwgcmVnKTsKKworCS8qIHc4Mzc4MWQgYW5kIGFzOTkxMjdmIGRvbid0IGhhdmUgZXh0ZW5kZWQgZGl2aXNvciBiaXRzICovCisJaWYgKGRhdGEtPnR5cGUgIT0gdzgzNzgxZCAmJiBkYXRhLT50eXBlICE9IGFzOTkxMjdmKSB7CisJCXJlZyA9ICh3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19WQkFUKQorCQkgICAgICAgJiB+KDEgPDwgKDUgKyBucikpKQorCQkgICAgfCAoKGRhdGEtPmZhbl9kaXZbbnJdICYgMHgwNCkgPDwgKDMgKyBucikpOworCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVkJBVCwgcmVnKTsKKwl9CisKKwkvKiBSZXN0b3JlIGZhbl9taW4gKi8KKwlkYXRhLT5mYW5fbWluW25yXSA9IEZBTl9UT19SRUcobWluLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfRkFOX01JTihucisxKSwgZGF0YS0+ZmFuX21pbltucl0pOworCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc3lzZnNfZmFuX2RpdihvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19mYW5fZGl2XyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAoreyBcCisJcmV0dXJuIHNob3dfZmFuX2Rpdl9yZWcoZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVnc19mYW5fZGl2XyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlyZXR1cm4gc3RvcmVfZmFuX2Rpdl9yZWcoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3JlZ3NfZmFuX2Rpdl8jI29mZnNldCwgc3RvcmVfcmVnc19mYW5fZGl2XyMjb2Zmc2V0KTsKKworc3lzZnNfZmFuX2RpdigxKTsKK3N5c2ZzX2Zhbl9kaXYoMik7CitzeXNmc19mYW5fZGl2KDMpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9mYW5fZGl2KGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI29mZnNldCMjX2Rpdik7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3B3bV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gdzgzNzgxZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgUFdNX0ZST01fUkVHKGRhdGEtPnB3bVtuciAtIDFdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3B3bWVuYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3sKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gdzgzNzgxZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgZGF0YS0+cHdtZW5hYmxlW25yIC0gMV0pOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfcHdtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bVtuciAtIDFdID0gUFdNX1RPX1JFRyh2YWwpOworCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19QV00obnIpLCBkYXRhLT5wd21bbnIgLSAxXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9wd21lbmFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsLCByZWc7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkJcmVnID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfUFdNQ0xLMTIpOworCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfUFdNQ0xLMTIsCisJCQkJICAgIChyZWcgJiAweGY3KSB8ICh2YWwgPDwgMykpOworCisJCXJlZyA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfQ09ORklHKTsKKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfQ09ORklHLAorCQkJCSAgICAocmVnICYgMHhlZikgfCAoIXZhbCA8PCA0KSk7CisKKwkJZGF0YS0+cHdtZW5hYmxlW25yIC0gMV0gPSB2YWw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc3lzZnNfcHdtKG9mZnNldCkgXAorc3RhdGljIHNzaXplX3Qgc2hvd19yZWdzX3B3bV8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBzaG93X3B3bV9yZWcoZGV2LCBidWYsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVnc19wd21fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJcmV0dXJuIHN0b3JlX3B3bV9yZWcoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20jI29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19yZWdzX3B3bV8jI29mZnNldCwgc3RvcmVfcmVnc19wd21fIyNvZmZzZXQpOworCisjZGVmaW5lIHN5c2ZzX3B3bWVuYWJsZShvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19wd21lbmFibGVfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc2hvd19wd21lbmFibGVfcmVnKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JlZ3NfcHdtZW5hYmxlXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXJldHVybiBzdG9yZV9wd21lbmFibGVfcmVnKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIocHdtIyNvZmZzZXQjI19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfcmVnc19wd21lbmFibGVfIyNvZmZzZXQsIHN0b3JlX3JlZ3NfcHdtZW5hYmxlXyMjb2Zmc2V0KTsKKworc3lzZnNfcHdtKDEpOworc3lzZnNfcHdtKDIpOworc3lzZnNfcHdtZW5hYmxlKDIpOwkJLyogb25seSBQV00yIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkICovCitzeXNmc19wd20oMyk7CitzeXNmc19wd20oNCk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3B3bShjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtIyNvZmZzZXQpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9wd21lbmFibGUoY2xpZW50LCBvZmZzZXQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3B3bSMjb2Zmc2V0IyNfZW5hYmxlKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHNzaXplX3QKK3Nob3dfc2Vuc29yX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQoreworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSB3ODM3ODFkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSBkYXRhLT5zZW5zW25yIC0gMV0pOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfc2Vuc29yX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbCwgdG1wOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMToJCS8qIFBJSS9DZWxlcm9uIGRpb2RlICovCisJCXRtcCA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcxKTsKKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcxLAorCQkJCSAgICB0bXAgfCBCSVRfU0NGRzFbbnIgLSAxXSk7CisJCXRtcCA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcyKTsKKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcyLAorCQkJCSAgICB0bXAgfCBCSVRfU0NGRzJbbnIgLSAxXSk7CisJCWRhdGEtPnNlbnNbbnIgLSAxXSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAyOgkJLyogMzkwNCAqLworCQl0bXAgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSk7CisJCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSwKKwkJCQkgICAgdG1wIHwgQklUX1NDRkcxW25yIC0gMV0pOworCQl0bXAgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMik7CisJCXc4Mzc4MWRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMiwKKwkJCQkgICAgdG1wICYgfkJJVF9TQ0ZHMltuciAtIDFdKTsKKwkJZGF0YS0+c2Vuc1tuciAtIDFdID0gdmFsOworCQlicmVhazsKKwljYXNlIFc4Mzc4MURfREVGQVVMVF9CRVRBOgkvKiB0aGVybWlzdG9yICovCisJCXRtcCA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcxKTsKKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcxLAorCQkJCSAgICB0bXAgJiB+QklUX1NDRkcxW25yIC0gMV0pOworCQlkYXRhLT5zZW5zW25yIC0gMV0gPSB2YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBzZW5zb3IgdHlwZSAlbGQ7IG11c3QgYmUgMSwgMiwgb3IgJWRcbiIsCisJCSAgICAgICAobG9uZykgdmFsLCBXODM3ODFEX0RFRkFVTFRfQkVUQSk7CisJCWJyZWFrOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX3NlbnNvcihvZmZzZXQpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19zZW5zb3JfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSBcCit7IFwKKyAgICByZXR1cm4gc2hvd19zZW5zb3JfcmVnKGRldiwgYnVmLCBvZmZzZXQpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JlZ3Nfc2Vuc29yXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKyAgICByZXR1cm4gc3RvcmVfc2Vuc29yX3JlZyhkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX3R5cGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3JlZ3Nfc2Vuc29yXyMjb2Zmc2V0LCBzdG9yZV9yZWdzX3NlbnNvcl8jI29mZnNldCk7CisKK3N5c2ZzX3NlbnNvcigxKTsKK3N5c2ZzX3NlbnNvcigyKTsKK3N5c2ZzX3NlbnNvcigzKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfc2Vuc29yKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNvZmZzZXQjI190eXBlKTsgXAorfSB3aGlsZSAoMCkKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbjoKKyAgICAgKiB3ODM3ODFkX2RyaXZlciBpcyBpbnNlcnRlZCAod2hlbiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQpLCBmb3IgZWFjaAorICAgICAgIGF2YWlsYWJsZSBhZGFwdGVyCisgICAgICogd2hlbiBhIG5ldyBhZGFwdGVyIGlzIGluc2VydGVkIChhbmQgdzgzNzgxZF9kcml2ZXIgaXMgc3RpbGwgcHJlc2VudCkgKi8KK3N0YXRpYyBpbnQKK3c4Mzc4MWRfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgdzgzNzgxZF9kZXRlY3QpOworfQorCisvKiBBc3N1bWVzIHRoYXQgYWRhcHRlciBpcyBvZiBJMkMsIG5vdCBJU0EgdmFyaWV0eS4KKyAqIE9USEVSV0lTRSBET04nVCBDQUxMIFRISVMKKyAqLworc3RhdGljIGludAordzgzNzgxZF9kZXRlY3Rfc3ViY2xpZW50cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCwKKwkJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQpCit7CisJaW50IGksIHZhbDEgPSAwLCBpZDsKKwlpbnQgZXJyOworCWNvbnN0IGNoYXIgKmNsaWVudF9uYW1lID0gIiI7CisJc3RydWN0IHc4Mzc4MWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50KTsKKworCWRhdGEtPmxtNzVbMF0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmICghKGRhdGEtPmxtNzVbMF0pKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gRVJST1JfU0NfMDsKKwl9CisJbWVtc2V0KGRhdGEtPmxtNzVbMF0sIDB4MDAsIHNpemVvZiAoc3RydWN0IGkyY19jbGllbnQpKTsKKworCWlkID0gaTJjX2FkYXB0ZXJfaWQoYWRhcHRlcik7CisKKwlpZiAoZm9yY2Vfc3ViY2xpZW50c1swXSA9PSBpZCAmJiBmb3JjZV9zdWJjbGllbnRzWzFdID09IGFkZHJlc3MpIHsKKwkJZm9yIChpID0gMjsgaSA8PSAzOyBpKyspIHsKKwkJCWlmIChmb3JjZV9zdWJjbGllbnRzW2ldIDwgMHg0OCB8fAorCQkJICAgIGZvcmNlX3N1YmNsaWVudHNbaV0gPiAweDRmKSB7CisJCQkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAiSW52YWxpZCBzdWJjbGllbnQgIgorCQkJCQkiYWRkcmVzcyAlZDsgbXVzdCBiZSAweDQ4LTB4NGZcbiIsCisJCQkJCWZvcmNlX3N1YmNsaWVudHNbaV0pOworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBFUlJPUl9TQ18xOworCQkJfQorCQl9CisJCXc4Mzc4MWRfd3JpdGVfdmFsdWUobmV3X2NsaWVudCwgVzgzNzgxRF9SRUdfSTJDX1NVQkFERFIsCisJCQkJKGZvcmNlX3N1YmNsaWVudHNbMl0gJiAweDA3KSB8CisJCQkJKChmb3JjZV9zdWJjbGllbnRzWzNdICYgMHgwNykgPDwgNCkpOworCQlkYXRhLT5sbTc1WzBdLT5hZGRyID0gZm9yY2Vfc3ViY2xpZW50c1syXTsKKwl9IGVsc2UgeworCQl2YWwxID0gdzgzNzgxZF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIFc4Mzc4MURfUkVHX0kyQ19TVUJBRERSKTsKKwkJZGF0YS0+bG03NVswXS0+YWRkciA9IDB4NDggKyAodmFsMSAmIDB4MDcpOworCX0KKworCWlmIChraW5kICE9IHc4Mzc4M3MpIHsKKworCQlkYXRhLT5sbTc1WzFdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEoZGF0YS0+bG03NVsxXSkpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIEVSUk9SX1NDXzE7CisJCX0KKwkJbWVtc2V0KGRhdGEtPmxtNzVbMV0sIDB4MCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisKKwkJaWYgKGZvcmNlX3N1YmNsaWVudHNbMF0gPT0gaWQgJiYKKwkJICAgIGZvcmNlX3N1YmNsaWVudHNbMV0gPT0gYWRkcmVzcykgeworCQkJZGF0YS0+bG03NVsxXS0+YWRkciA9IGZvcmNlX3N1YmNsaWVudHNbM107CisJCX0gZWxzZSB7CisJCQlkYXRhLT5sbTc1WzFdLT5hZGRyID0gMHg0OCArICgodmFsMSA+PiA0KSAmIDB4MDcpOworCQl9CisJCWlmIChkYXRhLT5sbTc1WzBdLT5hZGRyID09IGRhdGEtPmxtNzVbMV0tPmFkZHIpIHsKKwkJCWRldl9lcnIoJm5ld19jbGllbnQtPmRldiwKKwkJCSAgICAgICAiRHVwbGljYXRlIGFkZHJlc3NlcyAweCV4IGZvciBzdWJjbGllbnRzLlxuIiwKKwkJCSAgICAgICBkYXRhLT5sbTc1WzBdLT5hZGRyKTsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWdvdG8gRVJST1JfU0NfMjsKKwkJfQorCX0KKworCWlmIChraW5kID09IHc4Mzc4MWQpCisJCWNsaWVudF9uYW1lID0gInc4Mzc4MWQgc3ViY2xpZW50IjsKKwllbHNlIGlmIChraW5kID09IHc4Mzc4MmQpCisJCWNsaWVudF9uYW1lID0gInc4Mzc4MmQgc3ViY2xpZW50IjsKKwllbHNlIGlmIChraW5kID09IHc4Mzc4M3MpCisJCWNsaWVudF9uYW1lID0gInc4Mzc4M3Mgc3ViY2xpZW50IjsKKwllbHNlIGlmIChraW5kID09IHc4MzYyN2hmKQorCQljbGllbnRfbmFtZSA9ICJ3ODM2MjdoZiBzdWJjbGllbnQiOworCWVsc2UgaWYgKGtpbmQgPT0gYXM5OTEyN2YpCisJCWNsaWVudF9uYW1lID0gImFzOTkxMjdmIHN1YmNsaWVudCI7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDE7IGkrKykgeworCQkvKiBzdG9yZSBhbGwgZGF0YSBpbiB3ODM3ODFkICovCisJCWkyY19zZXRfY2xpZW50ZGF0YShkYXRhLT5sbTc1W2ldLCBOVUxMKTsKKwkJZGF0YS0+bG03NVtpXS0+YWRhcHRlciA9IGFkYXB0ZXI7CisJCWRhdGEtPmxtNzVbaV0tPmRyaXZlciA9ICZ3ODM3ODFkX2RyaXZlcjsKKwkJZGF0YS0+bG03NVtpXS0+ZmxhZ3MgPSAwOworCQlzdHJsY3B5KGRhdGEtPmxtNzVbaV0tPm5hbWUsIGNsaWVudF9uYW1lLAorCQkJSTJDX05BTUVfU0laRSk7CisJCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoZGF0YS0+bG03NVtpXSkpKSB7CisJCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsICJTdWJjbGllbnQgJWQgIgorCQkJCSJyZWdpc3RyYXRpb24gYXQgYWRkcmVzcyAweCV4ICIKKwkJCQkiZmFpbGVkLlxuIiwgaSwgZGF0YS0+bG03NVtpXS0+YWRkcik7CisJCQlpZiAoaSA9PSAxKQorCQkJCWdvdG8gRVJST1JfU0NfMzsKKwkJCWdvdG8gRVJST1JfU0NfMjsKKwkJfQorCQlpZiAoa2luZCA9PSB3ODM3ODNzKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7CisKKy8qIFVuZG8gaW5pdHMgaW4gY2FzZSBvZiBlcnJvcnMgKi8KK0VSUk9SX1NDXzM6CisJaTJjX2RldGFjaF9jbGllbnQoZGF0YS0+bG03NVswXSk7CitFUlJPUl9TQ18yOgorCWlmIChOVUxMICE9IGRhdGEtPmxtNzVbMV0pCisJCWtmcmVlKGRhdGEtPmxtNzVbMV0pOworRVJST1JfU0NfMToKKwlpZiAoTlVMTCAhPSBkYXRhLT5sbTc1WzBdKQorCQlrZnJlZShkYXRhLT5sbTc1WzBdKTsKK0VSUk9SX1NDXzA6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAordzgzNzgxZF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJaW50IGkgPSAwLCB2YWwxID0gMCwgdmFsMjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhOworCWludCBlcnI7CisJY29uc3QgY2hhciAqY2xpZW50X25hbWUgPSAiIjsKKwlpbnQgaXNfaXNhID0gaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpOworCWVudW0gdmVuZG9yIHsgd2luYm9uZCwgYXN1cyB9IHZlbmRpZDsKKworCWlmICghaXNfaXNhCisJICAgICYmICFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gRVJST1IwOworCX0KKworCS8qIFByZXZlbnQgdXNlcnMgZnJvbSBmb3JjaW5nIGEga2luZCBmb3IgYSBidXMgaXQgaXNuJ3Qgc3VwcG9zZWQKKwkgICB0byBwb3NzaWJseSBiZSBvbiAqLworCWlmIChpc19pc2EgJiYgKGtpbmQgPT0gYXM5OTEyN2YgfHwga2luZCA9PSB3ODM3ODNzKSkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsCisJCQkiQ2Fubm90IGZvcmNlIEkyQy1vbmx5IGNoaXAgZm9yIElTQSBhZGRyZXNzIDB4JTAyeC5cbiIsCisJCQlhZGRyZXNzKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBFUlJPUjA7CisJfQorCWlmICghaXNfaXNhICYmIGtpbmQgPT0gdzgzNjk3aGYpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+ZGV2LAorCQkJIkNhbm5vdCBmb3JjZSBJU0Etb25seSBjaGlwIGZvciBJMkMgYWRkcmVzcyAweCUwMnguXG4iLAorCQkJYWRkcmVzcyk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gRVJST1IwOworCX0KKwkKKwlpZiAoaXNfaXNhKQorCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFc4Mzc4MURfRVhURU5ULAorCQkJCSAgICB3ODM3ODFkX2RyaXZlci5uYW1lKSkgeworCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiUmVxdWVzdCBvZiByZWdpb24gIgorCQkJCSIweCV4LTB4JXggZm9yIHc4Mzc4MWQgZmFpbGVkXG4iLCBhZGRyZXNzLAorCQkJCWFkZHJlc3MgKyBXODM3ODFEX0VYVEVOVCAtIDEpOworCQkJZXJyID0gLUVCVVNZOworCQkJZ290byBFUlJPUjA7CisJCX0KKworCS8qIFByb2JlIHdoZXRoZXIgdGhlcmUgaXMgYW55dGhpbmcgYXZhaWxhYmxlIG9uIHRoaXMgYWRkcmVzcy4gQWxyZWFkeQorCSAgIGRvbmUgZm9yIFNNQnVzIGNsaWVudHMgKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJaWYgKGlzX2lzYSkgeworCisjZGVmaW5lIFJFQUxMWV9TTE9XX0lPCisJCQkvKiBXZSBuZWVkIHRoZSB0aW1lb3V0cyBmb3IgYXQgbGVhc3Qgc29tZSBMTTc4LWxpa2UKKwkJCSAgIGNoaXBzLiBCdXQgb25seSBpZiB3ZSByZWFkICd1bmRlZmluZWQnIHJlZ2lzdGVycy4gKi8KKwkJCWkgPSBpbmJfcChhZGRyZXNzICsgMSk7CisJCQlpZiAoaW5iX3AoYWRkcmVzcyArIDIpICE9IGkKKwkJCSB8fCBpbmJfcChhZGRyZXNzICsgMykgIT0gaQorCQkJIHx8IGluYl9wKGFkZHJlc3MgKyA3KSAhPSBpKSB7CisJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiRGV0ZWN0aW9uIG9mIHc4Mzc4MWQgIgorCQkJCQkiY2hpcCBmYWlsZWQgYXQgc3RlcCAxXG4iKTsKKwkJCQllcnIgPSAtRU5PREVWOworCQkJCWdvdG8gRVJST1IxOworCQkJfQorI3VuZGVmIFJFQUxMWV9TTE9XX0lPCisKKwkJCS8qIExldCdzIGp1c3QgaG9wZSBub3RoaW5nIGJyZWFrcyBoZXJlICovCisJCQlpID0gaW5iX3AoYWRkcmVzcyArIDUpICYgMHg3ZjsKKwkJCW91dGJfcCh+aSAmIDB4N2YsIGFkZHJlc3MgKyA1KTsKKwkJCXZhbDIgPSBpbmJfcChhZGRyZXNzICsgNSkgJiAweDdmOworCQkJaWYgKHZhbDIgIT0gKH5pICYgMHg3ZikpIHsKKwkJCQlvdXRiX3AoaSwgYWRkcmVzcyArIDUpOworCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIkRldGVjdGlvbiBvZiB3ODM3ODFkICIKKwkJCQkJImNoaXAgZmFpbGVkIGF0IHN0ZXAgMiAoMHgleCAhPSAiCisJCQkJCSIweCV4IGF0IDB4JXgpXG4iLCB2YWwyLCB+aSAmIDB4N2YsCisJCQkJCWFkZHJlc3MgKyA1KTsKKwkJCQllcnIgPSAtRU5PREVWOworCQkJCWdvdG8gRVJST1IxOworCQkJfQorCQl9CisJfQorCisJLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKKwkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KKwkgICBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyB3ODM3ODFkX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KKworCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdzgzNzgxZF9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gRVJST1IxOworCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCB3ODM3ODFkX2RhdGEpKTsKKworCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwlpbml0X01VVEVYKCZkYXRhLT5sb2NrKTsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmdzgzNzgxZF9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCisJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KKworCS8qIFRoZSB3ODM3OD9kIG1heSBiZSBzdHVjayBpbiBzb21lIG90aGVyIGJhbmsgdGhhbiBiYW5rIDAuIFRoaXMgbWF5CisJICAgbWFrZSByZWFkaW5nIG90aGVyIGluZm9ybWF0aW9uIGltcG9zc2libGUuIFNwZWNpZnkgYSBmb3JjZT0uLi4gb3IKKwkgICBmb3JjZV8qPS4uLiBwYXJhbWV0ZXIsIGFuZCB0aGUgV2luYm9uZCB3aWxsIGJlIHJlc2V0IHRvIHRoZSByaWdodAorCSAgIGJhbmsuICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmICh3ODM3ODFkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzgxRF9SRUdfQ09ORklHKSAmIDB4ODApIHsKKwkJCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIkRldGVjdGlvbiBmYWlsZWQgYXQgc3RlcCAiCisJCQkJIjNcbiIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gRVJST1IyOworCQl9CisJCXZhbDEgPSB3ODM3ODFkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzgxRF9SRUdfQkFOSyk7CisJCXZhbDIgPSB3ODM3ODFkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzgxRF9SRUdfQ0hJUE1BTik7CisJCS8qIENoZWNrIGZvciBXaW5ib25kIG9yIEFzdXMgSUQgaWYgaW4gYmFuayAwICovCisJCWlmICgoISh2YWwxICYgMHgwNykpICYmCisJCSAgICAoKCghKHZhbDEgJiAweDgwKSkgJiYgKHZhbDIgIT0gMHhhMykgJiYgKHZhbDIgIT0gMHhjMykpCisJCSAgICAgfHwgKCh2YWwxICYgMHg4MCkgJiYgKHZhbDIgIT0gMHg1YykgJiYgKHZhbDIgIT0gMHgxMikpKSkgeworCQkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiRGV0ZWN0aW9uIGZhaWxlZCBhdCBzdGVwICIKKwkJCQkiNFxuIik7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBFUlJPUjI7CisJCX0KKwkJLyogSWYgV2luYm9uZCBTTUJ1cywgY2hlY2sgYWRkcmVzcyBhdCAweDQ4LgorCQkgICBBc3VzIGRvZXNuJ3Qgc3VwcG9ydCwgZXhjZXB0IGZvciBhczk5MTI3ZiByZXYuMiAqLworCQlpZiAoKCFpc19pc2EpICYmICgoKCEodmFsMSAmIDB4ODApKSAmJiAodmFsMiA9PSAweGEzKSkgfHwKKwkJCQkgICgodmFsMSAmIDB4ODApICYmICh2YWwyID09IDB4NWMpKSkpIHsKKwkJCWlmICh3ODM3ODFkX3JlYWRfdmFsdWUKKwkJCSAgICAobmV3X2NsaWVudCwgVzgzNzgxRF9SRUdfSTJDX0FERFIpICE9IGFkZHJlc3MpIHsKKwkJCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJEZXRlY3Rpb24gZmFpbGVkICIKKwkJCQkJImF0IHN0ZXAgNVxuIik7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIEVSUk9SMjsKKwkJCX0KKwkJfQorCX0KKworCS8qIFdlIGhhdmUgZWl0aGVyIGhhZCBhIGZvcmNlIHBhcmFtZXRlciwgb3Igd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkIHRoZQorCSAgIFdpbmJvbmQuIFB1dCBpdCBub3cgaW50byBiYW5rIDAgYW5kIFZlbmRvciBJRCBIaWdoIEJ5dGUgKi8KKwl3ODM3ODFkX3dyaXRlX3ZhbHVlKG5ld19jbGllbnQsIFc4Mzc4MURfUkVHX0JBTkssCisJCQkgICAgKHc4Mzc4MWRfcmVhZF92YWx1ZShuZXdfY2xpZW50LAorCQkJCQkJVzgzNzgxRF9SRUdfQkFOSykgJiAweDc4KSB8CisJCQkgICAgMHg4MCk7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KKwlpZiAoa2luZCA8PSAwKSB7CisJCS8qIGdldCB2ZW5kb3IgSUQgKi8KKwkJdmFsMiA9IHc4Mzc4MWRfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBXODM3ODFEX1JFR19DSElQTUFOKTsKKwkJaWYgKHZhbDIgPT0gMHg1YykKKwkJCXZlbmRpZCA9IHdpbmJvbmQ7CisJCWVsc2UgaWYgKHZhbDIgPT0gMHgxMikKKwkJCXZlbmRpZCA9IGFzdXM7CisJCWVsc2UgeworCQkJZGV2X2RiZygmbmV3X2NsaWVudC0+ZGV2LCAiQ2hpcCB3YXMgbWFkZSBieSBuZWl0aGVyICIKKwkJCQkiV2luYm9uZCBub3IgQXN1cz9cbiIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gRVJST1IyOworCQl9CisKKwkJdmFsMSA9IHc4Mzc4MWRfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBXODM3ODFEX1JFR19XQ0hJUElEKTsKKwkJaWYgKCh2YWwxID09IDB4MTAgfHwgdmFsMSA9PSAweDExKSAmJiB2ZW5kaWQgPT0gd2luYm9uZCkKKwkJCWtpbmQgPSB3ODM3ODFkOworCQllbHNlIGlmICh2YWwxID09IDB4MzAgJiYgdmVuZGlkID09IHdpbmJvbmQpCisJCQlraW5kID0gdzgzNzgyZDsKKwkJZWxzZSBpZiAodmFsMSA9PSAweDQwICYmIHZlbmRpZCA9PSB3aW5ib25kICYmICFpc19pc2EKKwkJCQkmJiBhZGRyZXNzID09IDB4MmQpCisJCQlraW5kID0gdzgzNzgzczsKKwkJZWxzZSBpZiAoKHZhbDEgPT0gMHgyMSB8fCB2YWwxID09IDB4OTApICYmIHZlbmRpZCA9PSB3aW5ib25kKQorCQkJa2luZCA9IHc4MzYyN2hmOworCQllbHNlIGlmICh2YWwxID09IDB4MzEgJiYgIWlzX2lzYSAmJiBhZGRyZXNzID49IDB4MjgpCisJCQlraW5kID0gYXM5OTEyN2Y7CisJCWVsc2UgaWYgKHZhbDEgPT0gMHg2MCAmJiB2ZW5kaWQgPT0gd2luYm9uZCAmJiBpc19pc2EpCisJCQlraW5kID0gdzgzNjk3aGY7CisJCWVsc2UgeworCQkJaWYgKGtpbmQgPT0gMCkKKwkJCQlkZXZfd2FybigmbmV3X2NsaWVudC0+ZGV2LCAiSWdub3JpbmcgJ2ZvcmNlJyAiCisJCQkJCSAicGFyYW1ldGVyIGZvciB1bmtub3duIGNoaXAgYXQgIgorCQkJCQkgImFkYXB0ZXIgJWQsIGFkZHJlc3MgMHglMDJ4XG4iLAorCQkJCQkgaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGFkZHJlc3MpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gRVJST1IyOworCQl9CisJfQorCisJaWYgKGtpbmQgPT0gdzgzNzgxZCkgeworCQljbGllbnRfbmFtZSA9ICJ3ODM3ODFkIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gdzgzNzgyZCkgeworCQljbGllbnRfbmFtZSA9ICJ3ODM3ODJkIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gdzgzNzgzcykgeworCQljbGllbnRfbmFtZSA9ICJ3ODM3ODNzIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gdzgzNjI3aGYpIHsKKwkJaWYgKHZhbDEgPT0gMHg5MCkKKwkJCWNsaWVudF9uYW1lID0gInc4MzYyN3RoZiI7CisJCWVsc2UKKwkJCWNsaWVudF9uYW1lID0gInc4MzYyN2hmIjsKKwl9IGVsc2UgaWYgKGtpbmQgPT0gYXM5OTEyN2YpIHsKKwkJY2xpZW50X25hbWUgPSAiYXM5OTEyN2YiOworCX0gZWxzZSBpZiAoa2luZCA9PSB3ODM2OTdoZikgeworCQljbGllbnRfbmFtZSA9ICJ3ODM2OTdoZiI7CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgY2xpZW50X25hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnR5cGUgPSBraW5kOworCisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBFUlJPUjI7CisKKwkvKiBhdHRhY2ggc2Vjb25kYXJ5IGkyYyBsbTc1LWxpa2UgY2xpZW50cyAqLworCWlmICghaXNfaXNhKSB7CisJCWlmICgoZXJyID0gdzgzNzgxZF9kZXRlY3Rfc3ViY2xpZW50cyhhZGFwdGVyLCBhZGRyZXNzLAorCQkJCWtpbmQsIG5ld19jbGllbnQpKSkKKwkJCWdvdG8gRVJST1IzOworCX0gZWxzZSB7CisJCWRhdGEtPmxtNzVbMF0gPSBOVUxMOworCQlkYXRhLT5sbTc1WzFdID0gTlVMTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBjaGlwICovCisJdzgzNzgxZF9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIEEgZmV3IHZhcnMgbmVlZCB0byBiZSBmaWxsZWQgdXBvbiBzdGFydHVwICovCisJZm9yIChpID0gMTsgaSA8PSAzOyBpKyspIHsKKwkJZGF0YS0+ZmFuX21pbltpIC0gMV0gPSB3ODM3ODFkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKKwkJCQkJVzgzNzgxRF9SRUdfRkFOX01JTihpKSk7CisJfQorCWlmIChraW5kICE9IHc4Mzc4MWQgJiYga2luZCAhPSBhczk5MTI3ZikKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWRhdGEtPnB3bWVuYWJsZVtpXSA9IDE7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKKwlpZiAoa2luZCAhPSB3ODM3ODNzICYmIGtpbmQgIT0gdzgzNjk3aGYpCisJCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDMpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgNSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDYpOworCWlmIChraW5kICE9IGFzOTkxMjdmICYmIGtpbmQgIT0gdzgzNzgxZCAmJiBraW5kICE9IHc4Mzc4M3MpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDcpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgOCk7CisJfQorCisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDIpOworCWlmIChraW5kICE9IHc4MzY5N2hmKQorCQlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDMpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMik7CisJaWYgKGtpbmQgIT0gdzgzNzgzcyAmJiBraW5kICE9IHc4MzY5N2hmKQorCQlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAzKTsKKworCWlmIChraW5kICE9IHc4MzY5N2hmKQorCQlkZXZpY2VfY3JlYXRlX2ZpbGVfdmlkKG5ld19jbGllbnQpOworCisJaWYgKGtpbmQgIT0gdzgzNjk3aGYpCisJCWRldmljZV9jcmVhdGVfZmlsZV92cm0obmV3X2NsaWVudCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX2RpdihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX2RpdihuZXdfY2xpZW50LCAyKTsKKwlpZiAoa2luZCAhPSB3ODM2OTdoZikKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX2Zhbl9kaXYobmV3X2NsaWVudCwgMyk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKG5ld19jbGllbnQpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2JlZXAobmV3X2NsaWVudCk7CisKKwlpZiAoa2luZCAhPSB3ODM3ODFkICYmIGtpbmQgIT0gYXM5OTEyN2YpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3B3bShuZXdfY2xpZW50LCAxKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3B3bShuZXdfY2xpZW50LCAyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX3B3bWVuYWJsZShuZXdfY2xpZW50LCAyKTsKKwl9CisJaWYgKGtpbmQgPT0gdzgzNzgyZCAmJiAhaXNfaXNhKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZV9wd20obmV3X2NsaWVudCwgMyk7CisJCWRldmljZV9jcmVhdGVfZmlsZV9wd20obmV3X2NsaWVudCwgNCk7CisJfQorCisJaWYgKGtpbmQgIT0gYXM5OTEyN2YgJiYga2luZCAhPSB3ODM3ODFkKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZV9zZW5zb3IobmV3X2NsaWVudCwgMSk7CisJCWRldmljZV9jcmVhdGVfZmlsZV9zZW5zb3IobmV3X2NsaWVudCwgMik7CisJCWlmIChraW5kICE9IHc4Mzc4M3MgJiYga2luZCAhPSB3ODM2OTdoZikKKwkJCWRldmljZV9jcmVhdGVfZmlsZV9zZW5zb3IobmV3X2NsaWVudCwgMyk7CisJfQorCisJcmV0dXJuIDA7CisKK0VSUk9SMzoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKK0VSUk9SMjoKKwlrZnJlZShkYXRhKTsKK0VSUk9SMToKKwlpZiAoaXNfaXNhKQorCQlyZWxlYXNlX3JlZ2lvbihhZGRyZXNzLCBXODM3ODFEX0VYVEVOVCk7CitFUlJPUjA6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAordzgzNzgxZF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmIChpMmNfaXNfaXNhX2NsaWVudChjbGllbnQpKQorCQlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIFc4Mzc4MURfRVhURU5UKTsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCSAgICAgICAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KT09TlVMTCkgeworCQkvKiBzdWJjbGllbnRzICovCisJCWtmcmVlKGNsaWVudCk7CisJfSBlbHNlIHsKKwkJLyogbWFpbiBjbGllbnQgKi8KKwkJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBUaGUgU01CdXMgbG9ja3MgaXRzZWxmLCB1c3VhbGx5LCBidXQgbm90aGluZyBtYXkgYWNjZXNzIHRoZSBXaW5ib25kIGJldHdlZW4KKyAgIGJhbmsgc3dpdGNoZXMuIElTQSBhY2Nlc3MgbXVzdCBhbHdheXMgYmUgbG9ja2VkIGV4cGxpY2l0bHkhIAorICAgV2UgaWdub3JlIHRoZSBXODM3ODFEIEJVU1kgZmxhZyBhdCB0aGlzIG1vbWVudCAtIGl0IGNvdWxkIGxlYWQgdG8gZGVhZGxvY2tzLAorICAgd291bGQgc2xvdyBkb3duIHRoZSBXODM3ODFEIGFjY2VzcyBhbmQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkuIAorICAgVGhlcmUgYXJlIHNvbWUgdWdseSB0eXBlY2FzdHMgaGVyZSwgYnV0IHRoZSBnb29kIG5ld3MgaXMgLSB0aGV5IHNob3VsZAorICAgbm93aGVyZSBlbHNlIGJlIG5lY2Vzc2FyeSEgKi8KK3N0YXRpYyBpbnQKK3c4Mzc4MWRfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnKQoreworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcmVzLCB3b3JkX3NpemVkLCBiYW5rOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbDsKKworCWRvd24oJmRhdGEtPmxvY2spOworCWlmIChpMmNfaXNfaXNhX2NsaWVudChjbGllbnQpKSB7CisJCXdvcmRfc2l6ZWQgPSAoKChyZWcgJiAweGZmMDApID09IDB4MTAwKQorCQkJICAgICAgfHwgKChyZWcgJiAweGZmMDApID09IDB4MjAwKSkKKwkJICAgICYmICgoKHJlZyAmIDB4MDBmZikgPT0gMHg1MCkKKwkJCXx8ICgocmVnICYgMHgwMGZmKSA9PSAweDUzKQorCQkJfHwgKChyZWcgJiAweDAwZmYpID09IDB4NTUpKTsKKwkJaWYgKHJlZyAmIDB4ZmYwMCkgeworCQkJb3V0Yl9wKFc4Mzc4MURfUkVHX0JBTkssCisJCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCQkJb3V0Yl9wKHJlZyA+PiA4LAorCQkJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKKwkJfQorCQlvdXRiX3AocmVnICYgMHhmZiwgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOworCQlyZXMgPSBpbmJfcChjbGllbnQtPmFkZHIgKyBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CisJCWlmICh3b3JkX3NpemVkKSB7CisJCQlvdXRiX3AoKHJlZyAmIDB4ZmYpICsgMSwKKwkJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJCQlyZXMgPQorCQkJICAgIChyZXMgPDwgOCkgKyBpbmJfcChjbGllbnQtPmFkZHIgKworCQkJCQkgICAgICAgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCQl9CisJCWlmIChyZWcgJiAweGZmMDApIHsKKwkJCW91dGJfcChXODM3ODFEX1JFR19CQU5LLAorCQkJICAgICAgIGNsaWVudC0+YWRkciArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKTsKKwkJCW91dGJfcCgwLCBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CisJCX0KKwl9IGVsc2UgeworCQliYW5rID0gKHJlZyA+PiA4KSAmIDB4MGY7CisJCWlmIChiYW5rID4gMikKKwkJCS8qIHN3aXRjaCBiYW5rcyAqLworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFc4Mzc4MURfUkVHX0JBTkssCisJCQkJCQkgIGJhbmspOworCQlpZiAoYmFuayA9PSAwIHx8IGJhbmsgPiAyKSB7CisJCQlyZXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcgJiAweGZmKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHN3aXRjaCB0byBzdWJjbGllbnQgKi8KKwkJCWNsID0gZGF0YS0+bG03NVtiYW5rIC0gMV07CisJCQkvKiBjb252ZXJ0IGZyb20gSVNBIHRvIExNNzUgSTJDIGFkZHJlc3NlcyAqLworCQkJc3dpdGNoIChyZWcgJiAweGZmKSB7CisJCQljYXNlIDB4NTA6CS8qIFRFTVAgKi8KKwkJCQlyZXMgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsLCAwKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NTI6CS8qIENPTkZJRyAqLworCQkJCXJlcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbCwgMSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NTM6CS8qIEhZU1QgKi8KKwkJCQlyZXMgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsLCAyKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NTU6CS8qIE9WRVIgKi8KKwkJCWRlZmF1bHQ6CisJCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbCwgMykpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChiYW5rID4gMikKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBXODM3ODFEX1JFR19CQU5LLCAwKTsKKwl9CisJdXAoJmRhdGEtPmxvY2spOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK3c4Mzc4MWRfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZywgdTE2IHZhbHVlKQoreworCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgd29yZF9zaXplZCwgYmFuazsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2w7CisKKwlkb3duKCZkYXRhLT5sb2NrKTsKKwlpZiAoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkgeworCQl3b3JkX3NpemVkID0gKCgocmVnICYgMHhmZjAwKSA9PSAweDEwMCkKKwkJCSAgICAgIHx8ICgocmVnICYgMHhmZjAwKSA9PSAweDIwMCkpCisJCSAgICAmJiAoKChyZWcgJiAweDAwZmYpID09IDB4NTMpCisJCQl8fCAoKHJlZyAmIDB4MDBmZikgPT0gMHg1NSkpOworCQlpZiAocmVnICYgMHhmZjAwKSB7CisJCQlvdXRiX3AoVzgzNzgxRF9SRUdfQkFOSywKKwkJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJCQlvdXRiX3AocmVnID4+IDgsCisJCQkgICAgICAgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCQl9CisJCW91dGJfcChyZWcgJiAweGZmLCBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJCWlmICh3b3JkX3NpemVkKSB7CisJCQlvdXRiX3AodmFsdWUgPj4gOCwKKwkJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CisJCQlvdXRiX3AoKHJlZyAmIDB4ZmYpICsgMSwKKwkJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJCX0KKwkJb3V0Yl9wKHZhbHVlICYgMHhmZiwgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCQlpZiAocmVnICYgMHhmZjAwKSB7CisJCQlvdXRiX3AoVzgzNzgxRF9SRUdfQkFOSywKKwkJCSAgICAgICBjbGllbnQtPmFkZHIgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CisJCQlvdXRiX3AoMCwgY2xpZW50LT5hZGRyICsgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOworCQl9CisJfSBlbHNlIHsKKwkJYmFuayA9IChyZWcgPj4gOCkgJiAweDBmOworCQlpZiAoYmFuayA+IDIpCisJCQkvKiBzd2l0Y2ggYmFua3MgKi8KKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBXODM3ODFEX1JFR19CQU5LLAorCQkJCQkJICBiYW5rKTsKKwkJaWYgKGJhbmsgPT0gMCB8fCBiYW5rID4gMikgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZyAmIDB4ZmYsCisJCQkJCQkgIHZhbHVlICYgMHhmZik7CisJCX0gZWxzZSB7CisJCQkvKiBzd2l0Y2ggdG8gc3ViY2xpZW50ICovCisJCQljbCA9IGRhdGEtPmxtNzVbYmFuayAtIDFdOworCQkJLyogY29udmVydCBmcm9tIElTQSB0byBMTTc1IEkyQyBhZGRyZXNzZXMgKi8KKwkJCXN3aXRjaCAocmVnICYgMHhmZikgeworCQkJY2FzZSAweDUyOgkvKiBDT05GSUcgKi8KKwkJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsLCAxLCB2YWx1ZSAmIDB4ZmYpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDUzOgkvKiBIWVNUICovCisJCQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbCwgMiwgc3dhYjE2KHZhbHVlKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NTU6CS8qIE9WRVIgKi8KKwkJCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsLCAzLCBzd2FiMTYodmFsdWUpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoYmFuayA+IDIpCisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgVzgzNzgxRF9SRUdfQkFOSywgMCk7CisJfQorCXVwKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBXODM3ODFELiBJdCBzaG91bGQgc2V0IGxpbWl0cywgZXRjLiAqLworc3RhdGljIHZvaWQKK3c4Mzc4MWRfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGksIHA7CisJaW50IHR5cGUgPSBkYXRhLT50eXBlOworCXU4IHRtcDsKKworCWlmIChpbml0ICYmIHR5cGUgIT0gYXM5OTEyN2YpIHsJLyogdGhpcyByZXNldHMgcmVnaXN0ZXJzIHdlIGRvbid0IGhhdmUKKwkJCQkJICAgZG9jdW1lbnRhdGlvbiBmb3Igb24gdGhlIGFzOTkxMjdmICovCisJCS8qIHNhdmUgdGhlc2UgcmVnaXN0ZXJzICovCisJCWkgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0NPTkZJRyk7CisJCXAgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19QV01DTEsxMik7CisJCS8qIFJlc2V0IGFsbCBleGNlcHQgV2F0Y2hkb2cgdmFsdWVzIGFuZCBsYXN0IGNvbnZlcnNpb24gdmFsdWVzCisJCSAgIFRoaXMgc2V0cyBmYW4tZGl2cyB0byAyLCBhbW9uZyBvdGhlcnMgKi8KKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0NPTkZJRywgMHg4MCk7CisJCS8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVycyBhbmQgZGlzYWJsZSBwb3dlci1vbiBhYm5vcm1hbCBiZWVwLgorCQkgICBUaGlzIHNhdmVzIEZBTiAxLzIvMyBpbnB1dC9vdXRwdXQgdmFsdWVzIHNldCBieSBCSU9TLiAqLworCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9DT05GSUcsIGkgfCAweDgwKTsKKwkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1BXTUNMSzEyLCBwKTsKKwkJLyogRGlzYWJsZSBtYXN0ZXIgYmVlcC1lbmFibGUgKHJlc2V0IHR1cm5zIGl0IG9uKS4KKwkJICAgSW5kaXZpZHVhbCBiZWVwX21hc2sgc2hvdWxkIGJlIHJlc2V0IHRvIG9mZiBidXQgZm9yIHNvbWUgcmVhc29uCisJCSAgIGRpc2FibGluZyB0aGlzIGJpdCBoZWxwcyBzb21lIHBlb3BsZSBub3QgZ2V0IGJlZXBlZCAqLworCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMiwgMCk7CisJfQorCisJZGF0YS0+dnJtID0gaTJjX3doaWNoX3ZybSgpOworCisJaWYgKCh0eXBlICE9IHc4Mzc4MWQpICYmICh0eXBlICE9IGFzOTkxMjdmKSkgeworCQl0bXAgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19TQ0ZHMSk7CisJCWZvciAoaSA9IDE7IGkgPD0gMzsgaSsrKSB7CisJCQlpZiAoISh0bXAgJiBCSVRfU0NGRzFbaSAtIDFdKSkgeworCQkJCWRhdGEtPnNlbnNbaSAtIDFdID0gVzgzNzgxRF9ERUZBVUxUX0JFVEE7CisJCQl9IGVsc2UgeworCQkJCWlmICh3ODM3ODFkX3JlYWRfdmFsdWUKKwkJCQkgICAgKGNsaWVudCwKKwkJCQkgICAgIFc4Mzc4MURfUkVHX1NDRkcyKSAmIEJJVF9TQ0ZHMltpIC0gMV0pCisJCQkJCWRhdGEtPnNlbnNbaSAtIDFdID0gMTsKKwkJCQllbHNlCisJCQkJCWRhdGEtPnNlbnNbaSAtIDFdID0gMjsKKwkJCX0KKwkJCWlmICgodHlwZSA9PSB3ODM3ODNzIHx8IHR5cGUgPT0gdzgzNjk3aGYpICYmIChpID09IDIpKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGluaXQgJiYgdHlwZSAhPSBhczk5MTI3ZikgeworCQkvKiBFbmFibGUgdGVtcDIgKi8KKwkJdG1wID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUDJfQ09ORklHKTsKKwkJaWYgKHRtcCAmIDB4MDEpIHsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIkVuYWJsaW5nIHRlbXAyLCByZWFkaW5ncyAiCisJCQkJICJtaWdodCBub3QgbWFrZSBzZW5zZVxuIik7CisJCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUDJfQ09ORklHLAorCQkJCXRtcCAmIDB4ZmUpOworCQl9CisKKwkJLyogRW5hYmxlIHRlbXAzICovCisJCWlmICh0eXBlICE9IHc4Mzc4M3MgJiYgdHlwZSAhPSB3ODM2OTdoZikgeworCQkJdG1wID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQlXODM3ODFEX1JFR19URU1QM19DT05GSUcpOworCQkJaWYgKHRtcCAmIDB4MDEpIHsKKwkJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJFbmFibGluZyB0ZW1wMywgIgorCQkJCQkgInJlYWRpbmdzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlXG4iKTsKKwkJCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwKKwkJCQkJVzgzNzgxRF9SRUdfVEVNUDNfQ09ORklHLCB0bXAgJiAweGZlKTsKKwkJCX0KKwkJfQorCisJCWlmICh0eXBlICE9IHc4Mzc4MWQpIHsKKwkJCS8qIGVuYWJsZSBjb21wYXJhdG9yIG1vZGUgZm9yIHRlbXAyIGFuZCB0ZW1wMyBzbworCQkJICAgYWxhcm0gaW5kaWNhdGlvbiB3aWxsIHdvcmsgY29ycmVjdGx5ICovCisJCQlpID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfSVJRKTsKKwkJCWlmICghKGkgJiAweDQwKSkKKwkJCQl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfSVJRLAorCQkJCQkJICAgIGkgfCAweDQwKTsKKwkJfQorCX0KKworCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KKwl3ODM3ODFkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQ09ORklHLAorCQkJICAgICh3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJVzgzNzgxRF9SRUdfQ09ORklHKSAmIDB4ZjcpCisJCQkgICAgfCAweDAxKTsKK30KKworc3RhdGljIHN0cnVjdCB3ODM3ODFkX2RhdGEgKnc4Mzc4MWRfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWRldl9kYmcoZGV2LCAiU3RhcnRpbmcgZGV2aWNlIHVwZGF0ZVxuIik7CisKKwkJZm9yIChpID0gMDsgaSA8PSA4OyBpKyspIHsKKwkJCWlmICgoZGF0YS0+dHlwZSA9PSB3ODM3ODNzIHx8IGRhdGEtPnR5cGUgPT0gdzgzNjk3aGYpCisJCQkgICAgJiYgKGkgPT0gMSkpCisJCQkJY29udGludWU7CS8qIDc4M1MgaGFzIG5vIGluMSAqLworCQkJZGF0YS0+aW5baV0gPQorCQkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0lOKGkpKTsKKwkJCWRhdGEtPmluX21pbltpXSA9CisJCQkgICAgdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfSU5fTUlOKGkpKTsKKwkJCWRhdGEtPmluX21heFtpXSA9CisJCQkgICAgdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfSU5fTUFYKGkpKTsKKwkJCWlmICgoZGF0YS0+dHlwZSAhPSB3ODM3ODJkKSAmJiAoZGF0YS0+dHlwZSAhPSB3ODM2OTdoZikKKwkJCSAgICAmJiAoZGF0YS0+dHlwZSAhPSB3ODM2MjdoZikgJiYgKGkgPT0gNikpCisJCQkJYnJlYWs7CisJCX0KKwkJZm9yIChpID0gMTsgaSA8PSAzOyBpKyspIHsKKwkJCWRhdGEtPmZhbltpIC0gMV0gPQorCQkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0ZBTihpKSk7CisJCQlkYXRhLT5mYW5fbWluW2kgLSAxXSA9CisJCQkgICAgdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfRkFOX01JTihpKSk7CisJCX0KKwkJaWYgKGRhdGEtPnR5cGUgIT0gdzgzNzgxZCAmJiBkYXRhLT50eXBlICE9IGFzOTkxMjdmKSB7CisJCQlmb3IgKGkgPSAxOyBpIDw9IDQ7IGkrKykgeworCQkJCWRhdGEtPnB3bVtpIC0gMV0gPQorCQkJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJICAgICAgIFc4Mzc4MURfUkVHX1BXTShpKSk7CisJCQkJaWYgKChkYXRhLT50eXBlICE9IHc4Mzc4MmQKKwkJCQkgICAgIHx8IGkyY19pc19pc2FfY2xpZW50KGNsaWVudCkpCisJCQkJICAgICYmIGkgPT0gMikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBPbmx5IFBXTTIgY2FuIGJlIGRpc2FibGVkICovCisJCQlkYXRhLT5wd21lbmFibGVbMV0gPSAodzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICAgICAgVzgzNzgxRF9SRUdfUFdNQ0xLMTIpICYgMHgwOCkgPj4gMzsKKwkJfQorCisJCWRhdGEtPnRlbXAgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QKDEpKTsKKwkJZGF0YS0+dGVtcF9tYXggPQorCQkgICAgdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVEVNUF9PVkVSKDEpKTsKKwkJZGF0YS0+dGVtcF9tYXhfaHlzdCA9CisJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QX0hZU1QoMSkpOworCQlkYXRhLT50ZW1wX2FkZFswXSA9CisJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19URU1QKDIpKTsKKwkJZGF0YS0+dGVtcF9tYXhfYWRkWzBdID0KKwkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVBfT1ZFUigyKSk7CisJCWRhdGEtPnRlbXBfbWF4X2h5c3RfYWRkWzBdID0KKwkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVBfSFlTVCgyKSk7CisJCWlmIChkYXRhLT50eXBlICE9IHc4Mzc4M3MgJiYgZGF0YS0+dHlwZSAhPSB3ODM2OTdoZikgeworCQkJZGF0YS0+dGVtcF9hZGRbMV0gPQorCQkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1RFTVAoMykpOworCQkJZGF0YS0+dGVtcF9tYXhfYWRkWzFdID0KKwkJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgVzgzNzgxRF9SRUdfVEVNUF9PVkVSKDMpKTsKKwkJCWRhdGEtPnRlbXBfbWF4X2h5c3RfYWRkWzFdID0KKwkJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgVzgzNzgxRF9SRUdfVEVNUF9IWVNUKDMpKTsKKwkJfQorCQlpID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVklEX0ZBTkRJVik7CisJCWlmIChkYXRhLT50eXBlICE9IHc4MzY5N2hmKSB7CisJCQlkYXRhLT52aWQgPSBpICYgMHgwZjsKKwkJCWRhdGEtPnZpZCB8PQorCQkJICAgICh3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19DSElQSUQpICYKKwkJCSAgICAgMHgwMSkKKwkJCSAgICA8PCA0OworCQl9CisJCWRhdGEtPmZhbl9kaXZbMF0gPSAoaSA+PiA0KSAmIDB4MDM7CisJCWRhdGEtPmZhbl9kaXZbMV0gPSAoaSA+PiA2KSAmIDB4MDM7CisJCWlmIChkYXRhLT50eXBlICE9IHc4MzY5N2hmKSB7CisJCQlkYXRhLT5mYW5fZGl2WzJdID0gKHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkJICAgICAgIFc4Mzc4MURfUkVHX1BJTikKKwkJCQkJICAgID4+IDYpICYgMHgwMzsKKwkJfQorCQlpZiAoKGRhdGEtPnR5cGUgIT0gdzgzNzgxZCkgJiYgKGRhdGEtPnR5cGUgIT0gYXM5OTEyN2YpKSB7CisJCQlpID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfVkJBVCk7CisJCQlkYXRhLT5mYW5fZGl2WzBdIHw9IChpID4+IDMpICYgMHgwNDsKKwkJCWRhdGEtPmZhbl9kaXZbMV0gfD0gKGkgPj4gNCkgJiAweDA0OworCQkJaWYgKGRhdGEtPnR5cGUgIT0gdzgzNjk3aGYpCisJCQkJZGF0YS0+ZmFuX2RpdlsyXSB8PSAoaSA+PiA1KSAmIDB4MDQ7CisJCX0KKwkJZGF0YS0+YWxhcm1zID0KKwkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJICAgICAgIFc4Mzc4MURfUkVHX0FMQVJNMSkgKworCQkgICAgKHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0FMQVJNMikgPDwgOCk7CisJCWlmICgoZGF0YS0+dHlwZSA9PSB3ODM3ODJkKSB8fCAoZGF0YS0+dHlwZSA9PSB3ODM2MjdoZikpIHsKKwkJCWRhdGEtPmFsYXJtcyB8PQorCQkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBXODM3ODFEX1JFR19BTEFSTTMpIDw8IDE2OworCQl9CisJCWkgPSB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19CRUVQX0lOVFMyKTsKKwkJZGF0YS0+YmVlcF9lbmFibGUgPSBpID4+IDc7CisJCWRhdGEtPmJlZXBfbWFzayA9ICgoaSAmIDB4N2YpIDw8IDgpICsKKwkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzEpOworCQlpZiAoKGRhdGEtPnR5cGUgIT0gdzgzNzgxZCkgJiYgKGRhdGEtPnR5cGUgIT0gYXM5OTEyN2YpKSB7CisJCQlkYXRhLT5iZWVwX21hc2sgfD0KKwkJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMykgPDwgMTY7CisJCX0KKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQKK3NlbnNvcnNfdzgzNzgxZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ3ODM3ODFkX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorc2Vuc29yc193ODM3ODFkX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdzgzNzgxZF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LCAiCisJICAgICAgIlBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sICIKKwkgICAgICAiYW5kIE1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVzgzNzgxRCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc193ODM3ODFkX2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc193ODM3ODFkX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdzgzbDc4NXRzLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy93ODNsNzg1dHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWJiYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvdzgzbDc4NXRzLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiB3ODNsNzg1dHMuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCisgKiAgICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqCisgKiBJbnNwaXJlZCBmcm9tIHRoZSBsbTgzIGRyaXZlci4gVGhlIFc4M0w3ODVUUy1TIGlzIGEgc2Vuc29yIGNoaXAgbWFkZQorICogYnkgV2luYm9uZC4gSXQgcmVwb3J0cyBhIHNpbmdsZSBleHRlcm5hbCB0ZW1wZXJhdHVyZSB3aXRoIGEgMSBkZWcKKyAqIHJlc29sdXRpb24gYW5kIGEgMyBkZWcgYWNjdXJhY3kuIERhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbQorICogV2luYm9uZCdzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly93d3cud2luYm9uZC11c2EuY29tL3Byb2R1Y3RzL3dpbmJvbmRfcHJvZHVjdHMvcGRmcy9QQ0lDL1c4M0w3ODVUUy1TLnBkZgorICoKKyAqIFBvcnRlZCB0byBMaW51eCAyLjYgYnkgV29sZmdhbmcgWmllZ2xlciA8bnVwcGxhQGdteC5hdD4gYW5kIEplYW4gRGVsdmFyZQorICogPGtoYWxpQGxpbnV4LWZyLm9yZz4uCisgKgorICogVGhhbmtzIHRvIEphbWVzIEJvbHQgPGphbWVzQGV2aWxwZW5ndWluLmNvbT4gZm9yIGJlbmNobWFya2luZyB0aGUgcmVhZAorICogZXJyb3IgaGFuZGxpbmcgbWVjaGFuaXNtLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKworLyogSG93IG1hbnkgcmV0cmllcyBvbiByZWdpc3RlciByZWFkIGVycm9yICovCisjZGVmaW5lIE1BWF9SRVRSSUVTCTUKKworLyoKKyAqIEFkZHJlc3MgdG8gc2NhbgorICogQWRkcmVzcyBpcyBmdWxseSBkZWZpbmVkIGludGVybmFsbHkgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmUsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CisKKy8qCisgKiBJbnNtb2QgcGFyYW1ldGVycworICovCisKK1NFTlNPUlNfSU5TTU9EXzEodzgzbDc4NXRzKTsKKworLyoKKyAqIFRoZSBXODNMNzg1VFMtUyByZWdpc3RlcnMKKyAqIE1hbnVmYWN0dXJlciBJRCBpcyAweDVDQTMgZm9yIFdpbmJvbmQuCisgKi8KKworI2RlZmluZSBXODNMNzg1VFNfUkVHX01BTl9JRDEJCTB4NEQKKyNkZWZpbmUgVzgzTDc4NVRTX1JFR19NQU5fSUQyCQkweDRDCisjZGVmaW5lIFc4M0w3ODVUU19SRUdfQ0hJUF9JRAkJMHg0RQorI2RlZmluZSBXODNMNzg1VFNfUkVHX0NPTkZJRwkJMHg0MAorI2RlZmluZSBXODNMNzg1VFNfUkVHX1RZUEUJCTB4NTIKKyNkZWZpbmUgVzgzTDc4NVRTX1JFR19URU1QCQkweDI3CisjZGVmaW5lIFc4M0w3ODVUU19SRUdfVEVNUF9PVkVSCQkweDUzIC8qIG5vdCBzdXJlIGFib3V0IHRoaXMgb25lICovCisKKy8qCisgKiBDb252ZXJzaW9ucworICogVGhlIFc4M0w3ODVUUy1TIHVzZXMgc2lnbmVkIDgtYml0IHZhbHVlcy4KKyAqLworCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKQkoKHZhbCAmIDB4ODAgPyB2YWwtMHgxMDAgOiB2YWwpICogMTAwMCkKKworLyoKKyAqIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbgorICovCisKK3N0YXRpYyBpbnQgdzgzbDc4NXRzX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IHc4M2w3ODV0c19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwlpbnQga2luZCk7CitzdGF0aWMgaW50IHc4M2w3ODV0c19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHU4IHc4M2w3ODV0c19yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggZGVmdmFsKTsKK3N0YXRpYyBzdHJ1Y3QgdzgzbDc4NXRzX2RhdGEgKnc4M2w3ODV0c191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qCisgKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKQorICovCisgCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdzgzbDc4NXRzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInc4M2w3ODV0cyIsCisJLmlkCQk9IEkyQ19EUklWRVJJRF9XODNMNzg1VFMsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gdzgzbDc4NXRzX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gdzgzbDc4NXRzX2RldGFjaF9jbGllbnQsCit9OworCisvKgorICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKKyAqLworCitzdHJ1Y3QgdzgzbDc4NXRzX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLworCisJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLworCXU4IHRlbXAsIHRlbXBfb3ZlcjsKK307CisKKy8qCisgKiBTeXNmcyBzdHVmZgorICovCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzbDc4NXRzX2RhdGEgKmRhdGEgPSB3ODNsNzg1dHNfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXApKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX292ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4M2w3ODV0c19kYXRhICpkYXRhID0gdzgzbDc4NXRzX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX292ZXIpKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heCwgU19JUlVHTywgc2hvd190ZW1wX292ZXIsIE5VTEwpOworCisvKgorICogUmVhbCBjb2RlCisgKi8KKworc3RhdGljIGludCB3ODNsNzg1dHNfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgdzgzbDc4NXRzX2RldGVjdCk7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRvZXMgbW9yZSB0aGFuIGp1c3QgZGV0ZWN0aW9uLiBJZiBkZXRlY3Rpb24KKyAqIHN1Y2NlZWRzLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbmV3IGNoaXAuCisgKi8KK3N0YXRpYyBpbnQgdzgzbDc4NXRzX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgdzgzbDc4NXRzX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJZ290byBleGl0OworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3ODNsNzg1dHNfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHc4M2w3ODV0c19kYXRhKSk7CisKKworCS8qIFRoZSBjb21tb24gSTJDIGNsaWVudCBkYXRhIGlzIHBsYWNlZCByaWdodCBiZWZvcmUgdGhlCisJICogVzgzTDc4NVRTLXNwZWNpZmljIGRhdGEuICovCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZ3ODNsNzg1dHNfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qCisJICogTm93IHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiBBIG5lZ2F0aXZlIGtpbmQgbWVhbnMgdGhhdAorCSAqIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIG5vIGZvcmNlIHBhcmFtZXRlciAoZGVmYXVsdCksIHNvIHdlCisJICogbXVzdCBib3RoIGRldGVjdCBhbmQgaWRlbnRpZnkgdGhlIGNoaXAgKGFjdHVhbGx5IHRoZXJlIGlzIG9ubHkKKwkgKiBvbmUgcG9zc2libGUga2luZCBvZiBjaGlwIGZvciBub3csIFc4M0w3ODVUUy1TKS4gQSB6ZXJvIGtpbmQgbWVhbnMKKwkgKiB0aGF0IHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIsIHRoZSBkZXRlY3Rpb24KKwkgKiBzdGVwIHNoYWxsIGJlIHNraXBwZWQuIEEgcG9zaXRpdmUga2luZCBtZWFucyB0aGF0IHRoZSBkcml2ZXIKKwkgKiB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciBhbmQgYSBnaXZlbiBraW5kIG9mIGNoaXAgaXMKKwkgKiByZXF1ZXN0ZWQsIHNvIGJvdGggdGhlIGRldGVjdGlvbiBhbmQgdGhlIGlkZW50aWZpY2F0aW9uIHN0ZXBzCisJICogYXJlIHNraXBwZWQuCisJICovCisJaWYgKGtpbmQgPCAwKSB7IC8qIGRldGVjdGlvbiAqLworCQlpZiAoKCh3ODNsNzg1dHNfcmVhZF92YWx1ZShuZXdfY2xpZW50LAorCQkgICAgICBXODNMNzg1VFNfUkVHX0NPTkZJRywgMCkgJiAweDgwKSAhPSAweDAwKQorCQkgfHwgKCh3ODNsNzg1dHNfcmVhZF92YWx1ZShuZXdfY2xpZW50LAorCQkgICAgICBXODNMNzg1VFNfUkVHX1RZUEUsIDApICYgMHhGQykgIT0gMHgwMCkpIHsKKwkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKKwkJCQkiVzgzTDc4NVRTLVMgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnguXG4iLAorCQkJCWFkZHJlc3MpOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKwl9CisKKwlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uICovCisJCXUxNiBtYW5faWQ7CisJCXU4IGNoaXBfaWQ7CisKKwkJbWFuX2lkID0gKHc4M2w3ODV0c19yZWFkX3ZhbHVlKG5ld19jbGllbnQsCisJCQkgVzgzTDc4NVRTX1JFR19NQU5fSUQxLCAwKSA8PCA4KSArCisJCQkgdzgzbDc4NXRzX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKKwkJCSBXODNMNzg1VFNfUkVHX01BTl9JRDIsIDApOworCQljaGlwX2lkID0gdzgzbDc4NXRzX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKKwkJCSAgVzgzTDc4NVRTX1JFR19DSElQX0lELCAwKTsKKworCQlpZiAobWFuX2lkID09IDB4NUNBMykgeyAvKiBXaW5ib25kICovCisJCQlpZiAoY2hpcF9pZCA9PSAweDcwKSB7IC8qIFc4M0w3ODVUUy1TICovCisJCQkJa2luZCA9IHc4M2w3ODV0czsJCQkKKwkJCX0KKwkJfQorCQorCQlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uIGZhaWxlZCAqLworCQkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKKwkJCQkgIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwNFgsICIKKwkJCQkgImNoaXBfaWQ9MHglMDJYKS5cbiIsIG1hbl9pZCwgY2hpcF9pZCk7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCX0KKworCS8qIFdlIGNhbiBmaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcy4gKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJ3ODNsNzg1dHMiLCBJMkNfTkFNRV9TSVpFKTsKKwlkYXRhLT52YWxpZCA9IDA7CisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogRGVmYXVsdCB2YWx1ZXMgaW4gY2FzZSB0aGUgZmlyc3QgcmVhZCBmYWlscyAodW5saWtlbHkpLiAqLworCWRhdGEtPnRlbXBfb3ZlciA9IGRhdGEtPnRlbXAgPSAwOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZC4gKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkgCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBXODNMNzg1VFMgY2hpcAorCSAqIE5vdGhpbmcgeWV0LCBhc3N1bWUgaXQgaXMgYWxyZWFkeSBzdGFydGVkLgorCSAqLworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHc4M2w3ODV0c19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCisJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IHc4M2w3ODV0c19yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggZGVmdmFsKQoreworCWludCB2YWx1ZSwgaTsKKworCS8qIEZyZXF1ZW50IHJlYWQgZXJyb3JzIGhhdmUgYmVlbiByZXBvcnRlZCBvbiBBc3VzIGJvYXJkcywgc28gd2UKKwkgKiByZXRyeSBvbiByZWFkIGVycm9ycy4gSWYgaXQgc3RpbGwgZmFpbHMgKHVubGlrZWx5KSwgcmV0dXJuIHRoZQorCSAqIGRlZmF1bHQgdmFsdWUgcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIuICovCisJZm9yIChpID0gMTsgaSA8PSBNQVhfUkVUUklFUzsgaSsrKSB7CisJCXZhbHVlID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwkJaWYgKHZhbHVlID49IDApIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUmVhZCAweCUwMnggZnJvbSByZWdpc3RlciAiCisJCQkJIjB4JTAyeC5cbiIsIHZhbHVlLCByZWcpOworCQkJcmV0dXJuIHZhbHVlOworCQl9CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUmVhZCBmYWlsZWQsIHdpbGwgcmV0cnkgaW4gJWQuXG4iLCBpKTsKKwkJbXNsZWVwKGkpOworCX0KKworCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ291bGRuJ3QgcmVhZCB2YWx1ZSBmcm9tIHJlZ2lzdGVyIDB4JTAyeC4gIgorCQkiUGxlYXNlIHJlcG9ydC5cbiIsIHJlZyk7CisJcmV0dXJuIGRlZnZhbDsKK30KKworc3RhdGljIHN0cnVjdCB3ODNsNzg1dHNfZGF0YSAqdzgzbDc4NXRzX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4M2w3ODV0c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoIWRhdGEtPnZhbGlkIHx8IHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKiAyKSkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlVwZGF0aW5nIHc4M2w3ODV0cyBkYXRhLlxuIik7CisJCWRhdGEtPnRlbXAgPSB3ODNsNzg1dHNfcmVhZF92YWx1ZShjbGllbnQsCisJCQkgICAgIFc4M0w3ODVUU19SRUdfVEVNUCwgZGF0YS0+dGVtcCk7CisJCWRhdGEtPnRlbXBfb3ZlciA9IHc4M2w3ODV0c19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkgIFc4M0w3ODVUU19SRUdfVEVNUF9PVkVSLCBkYXRhLT50ZW1wX292ZXIpOworCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfdzgzbDc4NXRzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnc4M2w3ODV0c19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc193ODNsNzg1dHNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ3ODNsNzg1dHNfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlc4M0w3ODVUUy1TIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX3c4M2w3ODV0c19pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfdzgzbDc4NXRzX2V4aXQpOwo=